From e2812f722d04ca2f338e00d59d2a649545863b03 Mon Sep 17 00:00:00 2001 From: Max Kellermann Date: Thu, 16 Jan 2014 12:50:59 +0100 Subject: db/upnp/Discovery: move callbacks and data structures into class Eliminate global variables. --- src/db/upnp/Discovery.hxx | 55 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 55 insertions(+) (limited to 'src/db/upnp/Discovery.hxx') diff --git a/src/db/upnp/Discovery.hxx b/src/db/upnp/Discovery.hxx index 412307fd7..c4704dc7e 100644 --- a/src/db/upnp/Discovery.hxx +++ b/src/db/upnp/Discovery.hxx @@ -20,9 +20,16 @@ #ifndef _UPNPPDISC_H_X_INCLUDED_ #define _UPNPPDISC_H_X_INCLUDED_ +#include "Device.hxx" +#include "WorkQueue.hxx" +#include "thread/Mutex.hxx" #include "util/Error.hxx" +#include + +#include #include +#include #include @@ -36,10 +43,46 @@ class ContentDirectoryService; * for now, but this could be made more general, by removing the filtering. */ class UPnPDeviceDirectory { + /** + * Each appropriate discovery event (executing in a libupnp thread + * context) queues the following task object for processing by the + * discovery thread. + */ + struct DiscoveredTask { + bool alive; + std::string url; + std::string deviceId; + int expires; // Seconds valid + + DiscoveredTask(bool _alive, const Upnp_Discovery *disco) + : alive(_alive), url(disco->Location), + deviceId(disco->DeviceId), + expires(disco->Expires) {} + }; + + /** + * Descriptor for one device having a Content Directory + * service found on the network. + */ + class ContentDirectoryDescriptor { + public: + ContentDirectoryDescriptor(const std::string &url, + const std::string &description, + time_t last, int exp) + :device(url, description), last_seen(last), expires(exp+20) {} + UPnPDevice device; + time_t last_seen; + int expires; // seconds valid + }; + LibUPnP *const lib; Error error; + Mutex mutex; + std::map directories; + WorkQueue discoveredQueue; + /** * The UPnP device search timeout, which should actually be * called delay because it's the base of a random delay that @@ -85,6 +128,18 @@ private: * directory. */ void expireDevices(); + + /** + * Worker routine for the discovery queue. Get messages about + * devices appearing and disappearing, and update the + * directory pool accordingly. + */ + static void *discoExplorer(void *); + void discoExplorer(); + + int OnAlive(Upnp_Discovery *disco); + int OnByeBye(Upnp_Discovery *disco); + int cluCallBack(Upnp_EventType et, void *evp); }; -- cgit v1.2.3