db/upnp: don't use WorkQueue for _ADVERTISEMENT_BYEBYE
Remove the ContentDirectoryDescriptor right away. Reduces bloat.
This commit is contained in:
@@ -62,40 +62,33 @@ UPnPDeviceDirectory::discoExplorer()
|
|||||||
}
|
}
|
||||||
|
|
||||||
const ScopeLock protect(mutex);
|
const ScopeLock protect(mutex);
|
||||||
if (!tsk->alive) {
|
// Device signals its existence and well-being. Perform the
|
||||||
// Device signals it is going off.
|
// UPnP "description" phase by downloading and decoding the
|
||||||
auto it = directories.find(tsk->deviceId);
|
// description document.
|
||||||
if (it != directories.end()) {
|
char *buf;
|
||||||
directories.erase(it);
|
// LINE_SIZE is defined by libupnp's upnp.h...
|
||||||
}
|
char contentType[LINE_SIZE];
|
||||||
} else {
|
int code = UpnpDownloadUrlItem(tsk->url.c_str(), &buf, contentType);
|
||||||
// Device signals its existence and well-being. Perform the
|
if (code != UPNP_E_SUCCESS) {
|
||||||
// UPnP "description" phase by downloading and decoding the
|
continue;
|
||||||
// description document.
|
}
|
||||||
char *buf;
|
std::string sdesc(buf);
|
||||||
// LINE_SIZE is defined by libupnp's upnp.h...
|
|
||||||
char contentType[LINE_SIZE];
|
|
||||||
int code = UpnpDownloadUrlItem(tsk->url.c_str(), &buf, contentType);
|
|
||||||
if (code != UPNP_E_SUCCESS) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
std::string sdesc(buf);
|
|
||||||
|
|
||||||
// Update or insert the device
|
// Update or insert the device
|
||||||
ContentDirectoryDescriptor d(tsk->url, sdesc,
|
ContentDirectoryDescriptor d(tsk->url, sdesc,
|
||||||
time(0), tsk->expires);
|
time(0), tsk->expires);
|
||||||
if (!d.device.ok) {
|
if (!d.device.ok) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
#if defined(__clang__) || GCC_CHECK_VERSION(4,8)
|
#if defined(__clang__) || GCC_CHECK_VERSION(4,8)
|
||||||
auto e = directories.emplace(tsk->deviceId, d);
|
auto e = directories.emplace(tsk->deviceId, d);
|
||||||
#else
|
#else
|
||||||
auto e = directories.insert(std::make_pair(tsk->deviceId, d));
|
auto e = directories.insert(std::make_pair(tsk->deviceId, d));
|
||||||
#endif
|
#endif
|
||||||
if (!e.second)
|
if (!e.second)
|
||||||
e.first->second = d;
|
e.first->second = d;
|
||||||
}
|
|
||||||
delete tsk;
|
delete tsk;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -113,7 +106,7 @@ UPnPDeviceDirectory::OnAlive(Upnp_Discovery *disco)
|
|||||||
{
|
{
|
||||||
if (isMSDevice(disco->DeviceType) ||
|
if (isMSDevice(disco->DeviceType) ||
|
||||||
isCDService(disco->ServiceType)) {
|
isCDService(disco->ServiceType)) {
|
||||||
DiscoveredTask *tp = new DiscoveredTask(1, disco);
|
DiscoveredTask *tp = new DiscoveredTask(disco);
|
||||||
if (discoveredQueue.put(tp))
|
if (discoveredQueue.put(tp))
|
||||||
return UPNP_E_FINISH;
|
return UPNP_E_FINISH;
|
||||||
}
|
}
|
||||||
@@ -127,9 +120,11 @@ UPnPDeviceDirectory::OnByeBye(Upnp_Discovery *disco)
|
|||||||
|
|
||||||
if (isMSDevice(disco->DeviceType) ||
|
if (isMSDevice(disco->DeviceType) ||
|
||||||
isCDService(disco->ServiceType)) {
|
isCDService(disco->ServiceType)) {
|
||||||
DiscoveredTask *tp = new DiscoveredTask(0, disco);
|
// Device signals it is going off.
|
||||||
if (discoveredQueue.put(tp))
|
const ScopeLock protect(mutex);
|
||||||
return UPNP_E_FINISH;
|
auto it = directories.find(disco->DeviceId);
|
||||||
|
if (it != directories.end())
|
||||||
|
directories.erase(it);
|
||||||
}
|
}
|
||||||
|
|
||||||
return UPNP_E_SUCCESS;
|
return UPNP_E_SUCCESS;
|
||||||
|
@@ -49,13 +49,12 @@ class UPnPDeviceDirectory {
|
|||||||
* discovery thread.
|
* discovery thread.
|
||||||
*/
|
*/
|
||||||
struct DiscoveredTask {
|
struct DiscoveredTask {
|
||||||
bool alive;
|
|
||||||
std::string url;
|
std::string url;
|
||||||
std::string deviceId;
|
std::string deviceId;
|
||||||
int expires; // Seconds valid
|
int expires; // Seconds valid
|
||||||
|
|
||||||
DiscoveredTask(bool _alive, const Upnp_Discovery *disco)
|
DiscoveredTask(const Upnp_Discovery *disco)
|
||||||
: alive(_alive), url(disco->Location),
|
:url(disco->Location),
|
||||||
deviceId(disco->DeviceId),
|
deviceId(disco->DeviceId),
|
||||||
expires(disco->Expires) {}
|
expires(disco->Expires) {}
|
||||||
};
|
};
|
||||||
|
Reference in New Issue
Block a user