diff options
-rw-r--r-- | src/db/upnp/Discovery.cxx | 22 | ||||
-rw-r--r-- | src/db/upnp/Discovery.hxx | 4 |
2 files changed, 17 insertions, 9 deletions
diff --git a/src/db/upnp/Discovery.cxx b/src/db/upnp/Discovery.cxx index f47741240..371f87244 100644 --- a/src/db/upnp/Discovery.cxx +++ b/src/db/upnp/Discovery.cxx @@ -262,14 +262,24 @@ UPnPDeviceDirectory::getServer(const char *friendlyName, ContentDirectoryService &server, Error &error) { - std::vector<ContentDirectoryService> ds; - if (!getDirServices(ds, error)) + // Has locking, do it before our own lock + if (!expireDevices(error)) return false; - for (const auto &i : ds) { - if (strcmp(friendlyName, i.getFriendlyName()) == 0) { - server = i; - return true; + const ScopeLock protect(mutex); + + for (const auto &i : directories) { + const auto &device = i.second.device; + + if (device.friendlyName != friendlyName) + continue; + + for (const auto &service : device.services) { + if (isCDService(service.serviceType.c_str())) { + server = ContentDirectoryService(device, + service); + return true; + } } } diff --git a/src/db/upnp/Discovery.hxx b/src/db/upnp/Discovery.hxx index 59eed9331..d1df9f666 100644 --- a/src/db/upnp/Discovery.hxx +++ b/src/db/upnp/Discovery.hxx @@ -107,9 +107,7 @@ public: bool getDirServices(std::vector<ContentDirectoryService> &, Error &); /** - * Get server by friendly name. It's a bit wasteful to copy - * all servers for this, we could directly walk the list. Otoh - * there isn't going to be millions... + * Get server by friendly name. */ bool getServer(const char *friendlyName, ContentDirectoryService &server, |