Mercurial > projects > hoofbaby
diff deps/Platinum/Source/Core/PltService.h @ 0:3425707ddbf6
Initial import (hopefully this mercurial stuff works...)
author | fraserofthenight |
---|---|
date | Mon, 06 Jul 2009 08:06:28 -0700 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/deps/Platinum/Source/Core/PltService.h Mon Jul 06 08:06:28 2009 -0700 @@ -0,0 +1,268 @@ +/***************************************************************** +| +| Platinum - Service +| +| Copyright (c) 2004-2008, 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. +| +| 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 +| +****************************************************************/ + +#ifndef _PLT_SERVICE_H_ +#define _PLT_SERVICE_H_ + +/*---------------------------------------------------------------------- +| includes ++---------------------------------------------------------------------*/ +#include "Neptune.h" +#include "PltEvent.h" +#include "PltArgument.h" +#include "PltStateVariable.h" +#include "PltAction.h" + +/*---------------------------------------------------------------------- +| forward declarations ++---------------------------------------------------------------------*/ +class PLT_DeviceData; + +/*---------------------------------------------------------------------- +| PLT_Service class ++---------------------------------------------------------------------*/ +class PLT_Service +{ +public: + // methods + PLT_Service(PLT_DeviceData* device, + const char* type = NULL, + const char* id = NULL, + const char* last_change_namespace = NULL); + ~PLT_Service(); + + // class methods + NPT_Result InitURLs(const char* service_name, const char* device_uuid); + bool IsInitted() { + return (m_ActionDescs.GetItemCount() > 0); + } + NPT_Result PauseEventing(bool paused = true); + + // static methods + static bool IsTrue(NPT_String& value) { + if (value.Compare("1", true) && + value.Compare("true", true) && + value.Compare("yes", true)) { + return false; + } + return true; + } + + // accessor methods + const NPT_String& GetSCPDURL() const { return m_SCPDURL; } + const NPT_String& GetControlURL() const { return m_ControlURL; } + const NPT_String& GetEventSubURL() const { return m_EventSubURL; } + const NPT_String& GetServiceID() const { return m_ServiceID; } + const NPT_String& GetServiceType() const { return m_ServiceType; } + PLT_DeviceData* GetDevice() { return m_Device; } + + // XML + NPT_Result GetSCPDXML(NPT_String& xml); + NPT_Result SetSCPDXML(const char* xml); + NPT_Result GetDescription(NPT_XmlElementNode* parent, NPT_XmlElementNode** service = NULL); + + // State Variables + NPT_Result SetStateVariable(const char* name, const char* value); + NPT_Result SetStateVariableRate(const char* name, NPT_TimeInterval rate); + NPT_Result IncStateVariable(const char* name); + PLT_StateVariable* FindStateVariable(const char* name); + NPT_Result GetStateVariableValue(const char* name, NPT_String& value); + bool IsSubscribable(); + + // Actions + PLT_ActionDesc* FindActionDesc(const char* name); + +private: + void Cleanup(); + NPT_Result AddChanged(PLT_StateVariable* var); + NPT_Result UpdateLastChange(NPT_List<PLT_StateVariable*>& vars); + NPT_Result NotifyChanged(); + + + /*---------------------------------------------------------------------- + | PLT_ServiceEventTask + +---------------------------------------------------------------------*/ + class PLT_ServiceEventTask : public PLT_ThreadTask + { + public: + PLT_ServiceEventTask(PLT_Service* service) : m_Service(service) {} + + void DoRun() { + while (!IsAborting(100)) m_Service->NotifyChanged(); + } + + private: + PLT_Service* m_Service; + }; + + // Events + NPT_Result ProcessNewSubscription( + PLT_TaskManager* task_manager, + const NPT_SocketAddress& addr, + const NPT_String& callback_urls, + int timeout, + NPT_HttpResponse& response); + + NPT_Result ProcessRenewSubscription( + const NPT_SocketAddress& addr, + const NPT_String& sid, + int timeout, + NPT_HttpResponse& response); + + NPT_Result ProcessCancelSubscription( + const NPT_SocketAddress& addr, + const NPT_String& sid, + NPT_HttpResponse& response); + + +protected: + friend class PLT_StateVariable; // so that we can call AddChanged from StateVariable + friend class PLT_DeviceHost; + friend class PLT_DeviceData; + + //members + PLT_DeviceData* m_Device; + NPT_String m_ServiceType; + NPT_String m_ServiceID; + NPT_String m_SCPDURL; + NPT_String m_ControlURL; + NPT_String m_EventSubURL; + + PLT_ServiceEventTask* m_EventTask; + NPT_Array<PLT_ActionDesc*> m_ActionDescs; + NPT_List<PLT_StateVariable*> m_StateVars; + NPT_Mutex m_Lock; + NPT_List<PLT_StateVariable*> m_StateVarsChanged; + NPT_List<PLT_StateVariable*> m_StateVarsToPublish; + NPT_List<PLT_EventSubscriber*> m_Subscribers; + bool m_EventingPaused; + NPT_String m_LastChangeNamespace; +}; + +/*---------------------------------------------------------------------- +| PLT_ServiceDescriptionURLFinder ++---------------------------------------------------------------------*/ +class PLT_ServiceSCPDURLFinder +{ +public: + // methods + PLT_ServiceSCPDURLFinder(const char* url) : m_URL(url) {} + virtual ~PLT_ServiceSCPDURLFinder() {} + bool operator()(PLT_Service* const & service) const; + +private: + // members + NPT_String m_URL; +}; + +/*---------------------------------------------------------------------- +| PLT_ServiceControlURLFinder ++---------------------------------------------------------------------*/ +class PLT_ServiceControlURLFinder +{ +public: + // methods + PLT_ServiceControlURLFinder(const char* url) : m_URL(url) {} + virtual ~PLT_ServiceControlURLFinder() {} + bool operator()(PLT_Service* const & service) const; + +private: + // members + NPT_String m_URL; +}; + +/*---------------------------------------------------------------------- +| PLT_ServiceEventSubURLFinder ++---------------------------------------------------------------------*/ +class PLT_ServiceEventSubURLFinder +{ +public: + // methods + PLT_ServiceEventSubURLFinder(const char* url) : m_URL(url) {} + virtual ~PLT_ServiceEventSubURLFinder() {} + bool operator()(PLT_Service* const & service) const; + +private: + // members + NPT_String m_URL; +}; + +/*---------------------------------------------------------------------- +| PLT_ServiceIDFinder ++---------------------------------------------------------------------*/ +class PLT_ServiceIDFinder +{ +public: + // methods + PLT_ServiceIDFinder(const char* id) : m_Id(id) {} + virtual ~PLT_ServiceIDFinder() {} + bool operator()(PLT_Service* const & service) const; + +private: + // members + NPT_String m_Id; +}; + +/*---------------------------------------------------------------------- +| PLT_ServiceTypeFinder ++---------------------------------------------------------------------*/ +class PLT_ServiceTypeFinder +{ +public: + // methods + PLT_ServiceTypeFinder(const char* type) : m_Type(type) {} + virtual ~PLT_ServiceTypeFinder() {} + bool operator()(PLT_Service* const & service) const; + +private: + // members + NPT_String m_Type; +}; + +/*---------------------------------------------------------------------- +| PLT_LastChangeXMLIterator ++---------------------------------------------------------------------*/ +class PLT_LastChangeXMLIterator +{ +public: + // methods + PLT_LastChangeXMLIterator(NPT_XmlElementNode* node) : m_Node(node) {} + virtual ~PLT_LastChangeXMLIterator() {} + + NPT_Result operator()(PLT_StateVariable* const & var) const; + +private: + NPT_XmlElementNode* m_Node; +}; + +#endif /* _PLT_SERVICE_H_ */