Fix DualShockUDP not adding/removing devices correctly

-If adding 2 devices with the same name, they their unique id wouldn't be increased, causing a conflict.
-Removing a device wouldn't actually remove it from the internal devices list because the list of devices had already been updated when going through it.
-It was possible to remove devices belonging to other sources by adding a device with the same name and then removing it.
This commit is contained in:
Filippo Tarpini 2021-01-02 19:32:53 +02:00 committed by Filoppi
parent f06e9c55c8
commit 1e4a1bee43
1 changed files with 10 additions and 5 deletions

View File

@ -28,6 +28,8 @@
namespace ciface::DualShockUDPClient
{
constexpr std::string_view DUALSHOCKUDP_SOURCE_NAME = "DSUClient";
namespace Settings
{
const Config::Info<std::string> SERVER_ADDRESS{
@ -317,7 +319,7 @@ static void Restart()
}
}
PopulateDevices(); // remove devices
PopulateDevices(); // Only removes devices
if (s_servers_enabled && !s_servers.empty())
StartHotplugThread();
@ -386,11 +388,14 @@ void PopulateDevices()
{
INFO_LOG_FMT(SERIALINTERFACE, "DualShockUDPClient PopulateDevices");
// s_servers has already been updated so we can't use it to know which devices we removed,
// also it's good to remove all of them before adding new ones so that their id will be set
// correctly if they have the same name
g_controller_interface.RemoveDevice(
[](const auto* dev) { return dev->GetSource() == DUALSHOCKUDP_SOURCE_NAME; });
for (auto& server : s_servers)
{
g_controller_interface.RemoveDevice(
[&server](const auto* dev) { return dev->GetName() == server.m_description; });
std::lock_guard lock{server.m_port_info_mutex};
for (size_t port_index = 0; port_index < server.m_port_info.size(); port_index++)
{
@ -478,7 +483,7 @@ std::string Device::GetName() const
std::string Device::GetSource() const
{
return "DSUClient";
return std::string(DUALSHOCKUDP_SOURCE_NAME);
}
void Device::UpdateInput()