diff options
Diffstat (limited to 'lib/libUPnP/Platinum/Source/Core/PltCtrlPoint.h')
-rw-r--r-- | lib/libUPnP/Platinum/Source/Core/PltCtrlPoint.h | 254 |
1 files changed, 254 insertions, 0 deletions
diff --git a/lib/libUPnP/Platinum/Source/Core/PltCtrlPoint.h b/lib/libUPnP/Platinum/Source/Core/PltCtrlPoint.h new file mode 100644 index 0000000..401c863 --- /dev/null +++ b/lib/libUPnP/Platinum/Source/Core/PltCtrlPoint.h @@ -0,0 +1,254 @@ +/***************************************************************** +| +| Platinum - Control Point +| +| Copyright (c) 2004-2010, Plutinosoft, LLC. +| All rights reserved. +| http://www.plutinosoft.com +| +| This program is free software; you can redistribute it and/or +| modify it under the terms of the GNU General Public License +| as published by the Free Software Foundation; either version 2 +| of the License, or (at your option) any later version. +| +| OEMs, ISVs, VARs and other distributors that combine and +| distribute commercially licensed software with Platinum software +| and do not wish to distribute the source code for the commercially +| licensed software under version 2, or (at your option) any later +| version, of the GNU General Public License (the "GPL") must enter +| into a commercial license agreement with Plutinosoft, LLC. +| licensing@plutinosoft.com +| +| This program is distributed in the hope that it will be useful, +| but WITHOUT ANY WARRANTY; without even the implied warranty of +| MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +| GNU General Public License for more details. +| +| You should have received a copy of the GNU General Public License +| along with this program; see the file LICENSE.txt. If not, write to +| the Free Software Foundation, Inc., +| 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +| http://www.gnu.org/licenses/gpl-2.0.html +| +****************************************************************/ + +/** @file + UPnP ControlPoint + */ + +#ifndef _PLT_CONTROL_POINT_H_ +#define _PLT_CONTROL_POINT_H_ + +/*---------------------------------------------------------------------- +| includes ++---------------------------------------------------------------------*/ +#include "Neptune.h" +#include "PltService.h" +#include "PltSsdp.h" +#include "PltDeviceData.h" +#include "PltHttpServer.h" + +/*---------------------------------------------------------------------- +| forward declarations ++---------------------------------------------------------------------*/ +class PLT_CtrlPointHouseKeepingTask; +class PLT_SsdpSearchTask; +class PLT_SsdpListenTask; +class PLT_CtrlPointGetSCPDsTask; +class PLT_CtrlPointGetSCPDRequest; + +/*---------------------------------------------------------------------- +| PLT_CtrlPointListener class ++---------------------------------------------------------------------*/ +/** + The PLT_CtrlPointListener class is an interface used to receive notifications when + devices are found or removed from the network, actions responses and events + are being received. + */ +class PLT_CtrlPointListener +{ +public: + virtual ~PLT_CtrlPointListener() {} + + virtual NPT_Result OnDeviceAdded(PLT_DeviceDataReference& device) = 0; + virtual NPT_Result OnDeviceRemoved(PLT_DeviceDataReference& device) = 0; + virtual NPT_Result OnActionResponse(NPT_Result res, PLT_ActionReference& action, void* userdata) = 0; + virtual NPT_Result OnEventNotify(PLT_Service* service, NPT_List<PLT_StateVariable*>* vars) = 0; +}; + +typedef NPT_List<PLT_CtrlPointListener*> PLT_CtrlPointListenerList; + +/*---------------------------------------------------------------------- +| PLT_CtrlPoint class ++---------------------------------------------------------------------*/ +/** + The PLT_CtrlPoint class implements the base functionality of a UPnP ControlPoint. + It searches and inpects devices, invoke actions on services and subscribes to + events. + */ +class PLT_CtrlPoint : public PLT_SsdpPacketListener, + public PLT_SsdpSearchResponseListener, + public NPT_HttpRequestHandler +{ +public: + PLT_CtrlPoint(const char* search_criteria = "upnp:rootdevice"); // pass NULL to prevent repeated automatic search + ~PLT_CtrlPoint() override; + + /** + Returns the port used by the internal HTTP server for all incoming event notifications. + @return port + */ + virtual NPT_Result GetPort(NPT_UInt16& port); + + // delegation + virtual NPT_Result AddListener(PLT_CtrlPointListener* listener); + virtual NPT_Result RemoveListener(PLT_CtrlPointListener* listener); + + // discovery + virtual void IgnoreUUID(const char* uuid); + virtual NPT_Result Search(const NPT_HttpUrl& url = NPT_HttpUrl("239.255.255.250", 1900, "*"), + const char* target = "upnp:rootdevice", + NPT_Cardinal mx = 5, + NPT_TimeInterval frequency = NPT_TimeInterval(50.), // pass NPT_TimeInterval(0.) for one time only + NPT_TimeInterval initial_delay = NPT_TimeInterval(0.)); + virtual NPT_Result Discover(const NPT_HttpUrl& url = NPT_HttpUrl("239.255.255.250", 1900, "*"), + const char* target = "ssdp:all", + NPT_Cardinal mx = 5, + NPT_TimeInterval frequency = NPT_TimeInterval(50.), // pass NPT_TimeInterval(0.) for one time only + NPT_TimeInterval initial_delay = NPT_TimeInterval(0.)); + virtual NPT_Result InspectDevice(const NPT_HttpUrl& location, + const char* uuid, + NPT_TimeInterval leasetime = *PLT_Constants::GetInstance().GetDefaultDeviceLease()); + + // actions + virtual NPT_Result FindActionDesc(PLT_DeviceDataReference& device, + const char* service_type, + const char* action_name, + PLT_ActionDesc*& action_desc); + virtual NPT_Result CreateAction(PLT_DeviceDataReference& device, + const char* service_type, + const char* action_name, + PLT_ActionReference& action); + virtual NPT_Result InvokeAction(PLT_ActionReference& action, + void* userdata = NULL); + + // events + virtual NPT_Result Subscribe(PLT_Service* service, + bool cancel = false, + void* userdata = NULL); + + // NPT_HttpRequestHandler methods + NPT_Result SetupResponse(NPT_HttpRequest& request, + const NPT_HttpRequestContext& context, + NPT_HttpResponse& response) override; + + // PLT_SsdpSearchResponseListener methods + NPT_Result ProcessSsdpSearchResponse(NPT_Result res, + const NPT_HttpRequestContext& context, + NPT_HttpResponse* response) override; + // PLT_SsdpPacketListener method + NPT_Result OnSsdpPacket(const NPT_HttpRequest& request, + const NPT_HttpRequestContext& context) override; + +protected: + + // State Variable Handling + virtual NPT_Result DecomposeLastChangeVar(NPT_List<PLT_StateVariable*>& vars); + + // methods + virtual NPT_Result Start(PLT_SsdpListenTask* task); + virtual NPT_Result Stop(PLT_SsdpListenTask* task); + + // SSDP & HTTP Notifications handling + virtual NPT_Result ProcessSsdpNotify(const NPT_HttpRequest& request, + const NPT_HttpRequestContext& context); + virtual NPT_Result ProcessSsdpMessage(const NPT_HttpMessage& message, + const NPT_HttpRequestContext& context, + NPT_String& uuid); + virtual NPT_Result ProcessGetDescriptionResponse(NPT_Result res, + const NPT_HttpRequest& request, + const NPT_HttpRequestContext& context, + NPT_HttpResponse* response, + NPT_TimeInterval leasetime, + NPT_String uuid); + virtual NPT_Result ProcessGetSCPDResponse(NPT_Result res, + const NPT_HttpRequest& request, + const NPT_HttpRequestContext& context, + NPT_HttpResponse* response, + PLT_DeviceDataReference& device); + virtual NPT_Result ProcessActionResponse(NPT_Result res, + const NPT_HttpRequest& request, + const NPT_HttpRequestContext& context, + NPT_HttpResponse* response, + PLT_ActionReference& action, + void* userdata); + virtual NPT_Result ProcessSubscribeResponse(NPT_Result res, + const NPT_HttpRequest& request, + const NPT_HttpRequestContext& context, + NPT_HttpResponse* response, + PLT_Service* service, + void* userdata); + virtual NPT_Result ProcessHttpNotify(const NPT_HttpRequest& request, + const NPT_HttpRequestContext& context, + NPT_HttpResponse& response); + + // Device management + virtual NPT_Result AddDevice(PLT_DeviceDataReference& data); + virtual NPT_Result RemoveDevice(PLT_DeviceDataReference& data); + +private: + // methods + PLT_ThreadTask* RenewSubscriber(PLT_EventSubscriberReference subscriber); + + NPT_Result AddPendingEventNotification(PLT_EventNotification *notification); + NPT_Result ProcessPendingEventNotifications(); + NPT_Result ProcessEventNotification(PLT_EventSubscriberReference subscriber, + PLT_EventNotification* notification, + NPT_List<PLT_StateVariable*> &vars); + + NPT_Result DoHouseKeeping(); + NPT_Result FetchDeviceSCPDs(PLT_CtrlPointGetSCPDsTask* task, + PLT_DeviceDataReference& device, + NPT_Cardinal level); + + // Device management + NPT_Result FindDevice(const char* uuid, PLT_DeviceDataReference& device, bool return_root = false); + NPT_Result NotifyDeviceReady(PLT_DeviceDataReference& data); + NPT_Result NotifyDeviceRemoved(PLT_DeviceDataReference& data); + NPT_Result CleanupDevice(PLT_DeviceDataReference& data); + + NPT_Result ParseFault(PLT_ActionReference& action, NPT_XmlElementNode* fault); + PLT_SsdpSearchTask* CreateSearchTask(const NPT_HttpUrl& url, + const char* target, + NPT_Cardinal mx, + NPT_TimeInterval frequency, + const NPT_IpAddress& address); + +private: + friend class NPT_Reference<PLT_CtrlPoint>; + friend class PLT_UPnP; + friend class PLT_UPnP_CtrlPointStartIterator; + friend class PLT_UPnP_CtrlPointStopIterator; + friend class PLT_EventSubscriberRemoverIterator; + friend class PLT_CtrlPointGetDescriptionTask; + friend class PLT_CtrlPointGetSCPDsTask; + friend class PLT_CtrlPointInvokeActionTask; + friend class PLT_CtrlPointHouseKeepingTask; + friend class PLT_CtrlPointSubscribeEventTask; + + NPT_List<NPT_String> m_UUIDsToIgnore; + PLT_CtrlPointListenerList m_ListenerList; + PLT_HttpServerReference m_EventHttpServer; + PLT_TaskManagerReference m_TaskManager; + NPT_Mutex m_Lock; + NPT_List<PLT_DeviceDataReference> m_RootDevices; + NPT_List<PLT_EventSubscriberReference> m_Subscribers; + NPT_String m_SearchCriteria; + bool m_Started; + NPT_List<PLT_EventNotification *> m_PendingNotifications; + NPT_List<NPT_String> m_PendingInspections; +}; + +typedef NPT_Reference<PLT_CtrlPoint> PLT_CtrlPointReference; + +#endif /* _PLT_CONTROL_POINT_H_ */ |