Christophe Dumez
18 years ago
12 changed files with 2602 additions and 4 deletions
@ -0,0 +1,61 @@
@@ -0,0 +1,61 @@
|
||||
/* |
||||
-----BEGIN QCMOD----- |
||||
name: libupnp |
||||
arg: disable-upnp, disable UPnP support |
||||
arg: with-libupnp-inc=[path], Path to libupnp include files |
||||
-----END QCMOD----- |
||||
*/ |
||||
class qc_libupnp : public ConfObj |
||||
{ |
||||
public: |
||||
qc_libupnp(Conf *c) : ConfObj(c) {} |
||||
QString name() const { return "libupnp"; } |
||||
QString shortname() const { return "libupnp"; } |
||||
bool exec(){ |
||||
QString s; |
||||
s = conf->getenv("QC_DISABLE_UPNP"); |
||||
if(!s.isEmpty()){ |
||||
conf->addDefine("NO_UPNP"); |
||||
return false; |
||||
} |
||||
s = conf->getenv("QC_WITH_LIBUPNP_INC"); |
||||
if(!s.isEmpty()) { |
||||
if(!conf->checkHeader(s, "upnp/upnp.h")) { |
||||
//qWarning("libupnp includes not found!"); |
||||
conf->addDefine("NO_UPNP"); |
||||
return false; |
||||
} |
||||
conf->addIncludePath(s); |
||||
}else{ |
||||
QStringList sl; |
||||
sl += "/usr/include"; |
||||
sl += "/usr/local/include"; |
||||
if(!conf->findHeader("upnp/upnp.h", sl, &s)) { |
||||
//qWarning("libupnp includes not found!"); |
||||
conf->addDefine("NO_UPNP"); |
||||
return false; |
||||
} |
||||
conf->addIncludePath(s); |
||||
} |
||||
|
||||
/*s = conf->getenv("QC_WITH_LIBUPNP_LIB"); |
||||
if(!s.isEmpty()) { |
||||
if(!conf->checkLibrary(s, "upnp")) { |
||||
qWarning("libupnp library not found!"); |
||||
return false; |
||||
} |
||||
conf->addLib(QString("-L") + s); |
||||
}else{ |
||||
if(!conf->findLibrary("upnp", &s)) { |
||||
qWarning("libupnp library not found!"); |
||||
return false; |
||||
} |
||||
if (!s.isEmpty()) |
||||
conf->addLib(QString("-L") + s); |
||||
} |
||||
|
||||
conf->addLib("-lupnp");*/ |
||||
|
||||
return true; |
||||
} |
||||
}; |
@ -0,0 +1,694 @@
@@ -0,0 +1,694 @@
|
||||
//
|
||||
// This file is part of the aMule Project.
|
||||
//
|
||||
// Copyright (c) 2006 Marcelo Roberto Jimenez ( phoenix@amule.org )
|
||||
// Copyright (c) 2006 aMule Team ( admin@amule.org / http://www.amule.org )
|
||||
//
|
||||
// Any parts of this program derived from the xMule, lMule or eMule project,
|
||||
// or contributed by third-party developers are copyrighted by their
|
||||
// respective authors.
|
||||
//
|
||||
// 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.
|
||||
//
|
||||
// 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; if not, write to the Free Software
|
||||
// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
|
||||
//
|
||||
|
||||
|
||||
// This define must not conflict with the one in the standard header
|
||||
#ifndef AMULE_UPNP_H |
||||
#define AMULE_UPNP_H |
||||
|
||||
|
||||
#include <map> |
||||
#include <string> |
||||
#include <sstream> |
||||
#include <vector> |
||||
|
||||
#include <upnp/upnp.h> |
||||
|
||||
#include <QMutex> |
||||
|
||||
|
||||
#ifdef UPNP_C |
||||
std::string stdEmptyString; |
||||
#else // UPNP_C
|
||||
extern std::string stdEmptyString; |
||||
#endif // UPNP_C
|
||||
|
||||
|
||||
/**
|
||||
* Case insensitive std::string comparison |
||||
*/ |
||||
bool stdStringIsEqualCI( |
||||
const std::string &s1, |
||||
const std::string &s2); |
||||
|
||||
|
||||
class CUPnPPortMapping |
||||
{ |
||||
private: |
||||
std::string m_port; |
||||
std::string m_protocol; |
||||
std::string m_enabled; |
||||
std::string m_description; |
||||
std::string m_key; |
||||
|
||||
public: |
||||
CUPnPPortMapping( |
||||
int port = 0, |
||||
const std::string &protocol = stdEmptyString, |
||||
bool enabled = false, |
||||
const std::string &description = stdEmptyString); |
||||
~CUPnPPortMapping() {} |
||||
|
||||
const std::string &getPort() const |
||||
{ return m_port; } |
||||
const std::string &getProtocol() const |
||||
{ return m_protocol; } |
||||
const std::string &getEnabled() const |
||||
{ return m_enabled; } |
||||
const std::string &getDescription() const |
||||
{ return m_description; } |
||||
const std::string &getKey() const |
||||
{ return m_key; } |
||||
}; |
||||
|
||||
|
||||
class CDynamicLibHandle |
||||
{ |
||||
private: |
||||
std::string m_libname; |
||||
void *const m_LibraryHandle; |
||||
CDynamicLibHandle(const CDynamicLibHandle &); |
||||
CDynamicLibHandle &operator=(const CDynamicLibHandle &); |
||||
|
||||
public: |
||||
CDynamicLibHandle(const char *libname); |
||||
~CDynamicLibHandle(); |
||||
void *Get() const { return m_LibraryHandle; } |
||||
}; |
||||
|
||||
|
||||
class CUPnPControlPoint; |
||||
|
||||
|
||||
class CUPnPLib |
||||
{ |
||||
public: |
||||
static const std::string &UPNP_ROOT_DEVICE; |
||||
static const std::string &UPNP_DEVICE_IGW; |
||||
static const std::string &UPNP_DEVICE_WAN; |
||||
static const std::string &UPNP_DEVICE_WAN_CONNECTION; |
||||
static const std::string &UPNP_DEVICE_LAN; |
||||
static const std::string &UPNP_SERVICE_LAYER3_FORWARDING; |
||||
static const std::string &UPNP_SERVICE_WAN_COMMON_INTERFACE_CONFIG; |
||||
static const std::string &UPNP_SERVICE_WAN_IP_CONNECTION; |
||||
static const std::string &UPNP_SERVICE_WAN_PPP_CONNECTION; |
||||
CUPnPControlPoint &m_ctrlPoint; |
||||
|
||||
private: |
||||
// dlopen stuff
|
||||
static const int NUM_LIB_IXML_SYMBOLS = 8; |
||||
static const char *s_LibIXMLSymbols[NUM_LIB_IXML_SYMBOLS]; |
||||
static const int NUM_LIB_UPNP_SYMBOLS = 17; |
||||
static const char *s_LibUPnPSymbols[NUM_LIB_UPNP_SYMBOLS]; |
||||
CDynamicLibHandle m_LibIXMLHandle; |
||||
CDynamicLibHandle m_LibUPnPHandle; |
||||
|
||||
public: |
||||
CUPnPLib(CUPnPControlPoint &ctrlPoint); |
||||
~CUPnPLib() {} |
||||
|
||||
// Convenience function so we don't have to write explicit calls
|
||||
// to char2unicode every time
|
||||
std::string GetUPnPErrorMessage(int code) const; |
||||
|
||||
// Convenience function to avoid repetitive processing of error
|
||||
// messages
|
||||
std::string processUPnPErrorMessage( |
||||
const std::string &messsage, |
||||
int code, |
||||
const DOMString errorString, |
||||
IXML_Document *doc) const; |
||||
|
||||
// Processing response to actions
|
||||
void ProcessActionResponse( |
||||
IXML_Document *RespDoc, |
||||
const std::string &actionName) const; |
||||
|
||||
// IXML_Element
|
||||
IXML_Element *Element_GetRootElement( |
||||
IXML_Document *doc) const; |
||||
IXML_Element *Element_GetFirstChild( |
||||
IXML_Element *parent) const; |
||||
IXML_Element *Element_GetNextSibling( |
||||
IXML_Element *child) const; |
||||
const DOMString Element_GetTag( |
||||
IXML_Element *element) const; |
||||
const std::string Element_GetTextValue( |
||||
IXML_Element *element) const; |
||||
const std::string Element_GetChildValueByTag( |
||||
IXML_Element *element, |
||||
const DOMString tag) const; |
||||
IXML_Element *Element_GetFirstChildByTag( |
||||
IXML_Element *element, |
||||
const DOMString tag) const; |
||||
IXML_Element *Element_GetNextSiblingByTag( |
||||
IXML_Element *element, |
||||
const DOMString tag) const; |
||||
const std::string Element_GetAttributeByTag( |
||||
IXML_Element *element, |
||||
const DOMString tag) const; |
||||
|
||||
// ixml api
|
||||
IXML_Node *(*m_ixmlNode_getFirstChild)(IXML_Node *nodeptr); |
||||
IXML_Node *(*m_ixmlNode_getNextSibling)(IXML_Node *nodeptr); |
||||
const DOMString (*m_ixmlNode_getNodeName)(IXML_Node *nodeptr); |
||||
const DOMString (*m_ixmlNode_getNodeValue)(IXML_Node *nodeptr); |
||||
IXML_NamedNodeMap *(*m_ixmlNode_getAttributes)(IXML_Node *nodeptr); |
||||
void (*m_ixmlDocument_free)(IXML_Document *doc); |
||||
IXML_Node *(*m_ixmlNamedNodeMap_getNamedItem)( |
||||
IXML_NamedNodeMap *nnMap, const DOMString name); |
||||
void (*m_ixmlNamedNodeMap_free)(IXML_NamedNodeMap *nnMap); |
||||
|
||||
// upnp api
|
||||
// 1 - Initialization and Registration
|
||||
int (*m_UpnpInit)(const char *IPAddress, int Port); |
||||
void (*m_UpnpFinish)(); |
||||
unsigned short (*m_UpnpGetServerPort)(); |
||||
char *(*m_UpnpGetServerIpAddress)(); |
||||
int (*m_UpnpRegisterClient)(Upnp_FunPtr Callback, |
||||
const void *Cookie, UpnpClient_Handle *Hnd); |
||||
int (*m_UpnpUnRegisterClient)(UpnpClient_Handle Hnd); |
||||
// 2 - Discovery
|
||||
int (*m_UpnpSearchAsync)(UpnpClient_Handle Hnd, int Mx, |
||||
const char *Target, const void *Cookie); |
||||
// 3 - Control
|
||||
int (*m_UpnpGetServiceVarStatus)(UpnpClient_Handle Hnd, const char *ActionURL, |
||||
const char *VarName, DOMString *StVarVal); |
||||
int (*m_UpnpSendAction)(UpnpClient_Handle Hnd, const char *ActionURL, |
||||
const char *ServiceType, const char *DevUDN, IXML_Document *Action, |
||||
IXML_Document **RespNode); |
||||
int (*m_UpnpSendActionAsync)(UpnpClient_Handle Hnd, const char *ActionURL, |
||||
const char *ServiceType, const char *DevUDN, IXML_Document *Action, |
||||
Upnp_FunPtr Callback, const void *Cookie); |
||||
// 4 - Eventing
|
||||
int (*m_UpnpSubscribe)(UpnpClient_Handle Hnd, |
||||
const char *PublisherUrl, int *TimeOut, Upnp_SID SubsId); |
||||
int (*m_UpnpUnSubscribe)(UpnpClient_Handle Hnd, Upnp_SID SubsId); |
||||
// 5 - HTTP
|
||||
int (*m_UpnpDownloadXmlDoc)(const char *url, IXML_Document **xmlDoc); |
||||
// 6 - Optional Tools API
|
||||
int (*m_UpnpResolveURL)(const char *BaseURL, |
||||
const char *RelURL, char *AbsURL); |
||||
IXML_Document *(*m_UpnpMakeAction)( |
||||
const char *ActionName, const char *ServType, int NumArg, |
||||
const char *Arg, ...); |
||||
int (*m_UpnpAddToAction)( |
||||
IXML_Document **ActionDoc, const char *ActionName, |
||||
const char *ServType, const char *ArgName, const char *ArgVal); |
||||
const char *(*m_UpnpGetErrorMessage)(int ErrorCode); |
||||
}; |
||||
|
||||
|
||||
class CUPnPControlPoint; |
||||
|
||||
/*
|
||||
* Even though we can retrieve the upnpLib handler from the upnpControlPoint, |
||||
* we must pass it separetly at this point, because the class CUPnPControlPoint |
||||
* must be declared after. |
||||
* |
||||
* CUPnPLib can only be removed from the constructor once we agree to link to |
||||
* UPnPLib explicitly, making this dlopen() stuff unnecessary. |
||||
*/ |
||||
template <typename T, char const *XML_ELEMENT_NAME, char const *XML_LIST_NAME> |
||||
class CXML_List : public std::map<const std::string, T *> |
||||
{ |
||||
public: |
||||
CXML_List( |
||||
const CUPnPControlPoint &upnpControlPoint, |
||||
CUPnPLib &upnpLib, |
||||
IXML_Element *parent, |
||||
const std::string &url); |
||||
~CXML_List(); |
||||
}; |
||||
|
||||
|
||||
template <typename T, char const *XML_ELEMENT_NAME, char const *XML_LIST_NAME> |
||||
CXML_List<T, XML_ELEMENT_NAME, XML_LIST_NAME>::CXML_List( |
||||
const CUPnPControlPoint &upnpControlPoint, |
||||
CUPnPLib &upnpLib, |
||||
IXML_Element *parent, |
||||
const std::string &url) |
||||
{ |
||||
IXML_Element *elementList = |
||||
upnpLib.Element_GetFirstChildByTag(parent, XML_LIST_NAME); |
||||
unsigned int i = 0; |
||||
for ( IXML_Element *element = upnpLib.Element_GetFirstChildByTag(elementList, XML_ELEMENT_NAME); |
||||
element; |
||||
element = upnpLib.Element_GetNextSiblingByTag(element, XML_ELEMENT_NAME)) { |
||||
// Add a new element to the element list
|
||||
T *upnpElement = new T(upnpControlPoint, upnpLib, element, url); |
||||
(*this)[upnpElement->GetKey()] = upnpElement; |
||||
++i; |
||||
} |
||||
std::ostringstream msg; |
||||
msg << "\n " << XML_LIST_NAME << ": " << |
||||
i << " " << XML_ELEMENT_NAME << "s."; |
||||
//AddDebugLogLineM(false, logUPnP, msg);
|
||||
} |
||||
|
||||
|
||||
template <typename T, char const *XML_ELEMENT_NAME, char const *XML_LIST_NAME> |
||||
CXML_List<T, XML_ELEMENT_NAME, XML_LIST_NAME>::~CXML_List() |
||||
{ |
||||
typename CXML_List<T, XML_ELEMENT_NAME, XML_LIST_NAME>::iterator it; |
||||
for(it = this->begin(); it != this->end(); ++it) { |
||||
delete (*it).second; |
||||
} |
||||
} |
||||
|
||||
#ifdef UPNP_C |
||||
char s_argument[] = "argument"; |
||||
char s_argumentList[] = "argumentList"; |
||||
char s_action[] = "action"; |
||||
char s_actionList[] = "actionList"; |
||||
char s_allowedValue[] = "allowedValue"; |
||||
char s_allowedValueList[] = "allowedValueList"; |
||||
char s_stateVariable[] = "stateVariable"; |
||||
char s_serviceStateTable[] = "serviceStateTable"; |
||||
char s_service[] = "service"; |
||||
char s_serviceList[] = "serviceList"; |
||||
char s_device[] = "device"; |
||||
char s_deviceList[] = "deviceList"; |
||||
#else // UPNP_C
|
||||
extern char s_argument[]; |
||||
extern char s_argumentList[]; |
||||
extern char s_action[]; |
||||
extern char s_actionList[]; |
||||
extern char s_allowedValue[]; |
||||
extern char s_allowedValueList[]; |
||||
extern char s_stateVariable[]; |
||||
extern char s_serviceStateTable[]; |
||||
extern char s_service[]; |
||||
extern char s_serviceList[]; |
||||
extern char s_device[]; |
||||
extern char s_deviceList[]; |
||||
#endif // UPNP_C
|
||||
|
||||
|
||||
class CUPnPArgument; |
||||
typedef CXML_List<CUPnPArgument, s_argument, s_argumentList> ArgumentList; |
||||
class CUPnPAction; |
||||
typedef CXML_List<CUPnPAction, s_action, s_actionList> ActionList; |
||||
class CUPnPStateVariable; |
||||
typedef CXML_List<CUPnPStateVariable, s_stateVariable, s_serviceStateTable> ServiceStateTable; |
||||
class CUPnPAllowedValue; |
||||
typedef CXML_List<CUPnPAllowedValue, s_allowedValue, s_allowedValueList> AllowedValueList; |
||||
class CUPnPService; |
||||
typedef CXML_List<CUPnPService, s_service, s_serviceList> ServiceList; |
||||
class CUPnPDevice; |
||||
typedef CXML_List<CUPnPDevice, s_device, s_deviceList> DeviceList; |
||||
|
||||
|
||||
class CUPnPError |
||||
{ |
||||
private: |
||||
IXML_Element *m_root; |
||||
const std::string m_ErrorCode; |
||||
const std::string m_ErrorDescription; |
||||
public: |
||||
CUPnPError( |
||||
const CUPnPLib &upnpLib, |
||||
IXML_Document *errorDoc); |
||||
~CUPnPError() {} |
||||
const std::string &getErrorCode() const |
||||
{ return m_ErrorCode; } |
||||
const std::string &getErrorDescription() const |
||||
{ return m_ErrorDescription; } |
||||
}; |
||||
|
||||
|
||||
class CUPnPArgument |
||||
{ |
||||
private: |
||||
const CUPnPControlPoint &m_UPnPControlPoint; |
||||
const std::string m_name; |
||||
const std::string m_direction; |
||||
bool m_retval; |
||||
const std::string m_relatedStateVariable; |
||||
|
||||
public: |
||||
CUPnPArgument( |
||||
const CUPnPControlPoint &upnpControlPoint, |
||||
CUPnPLib &upnpLib, |
||||
IXML_Element *argument, |
||||
const std::string &SCPDURL); |
||||
~CUPnPArgument() {} |
||||
const std::string &GetName() const |
||||
{ return m_name; } |
||||
const std::string &GetDirection() const |
||||
{ return m_direction; } |
||||
bool GetRetVal() const |
||||
{ return m_retval; } |
||||
const std::string &GetRelatedStateVariable() const |
||||
{ return m_relatedStateVariable; } |
||||
const std::string &GetKey() const |
||||
{ return m_name; } |
||||
}; |
||||
|
||||
|
||||
|
||||
class CUPnPAction |
||||
{ |
||||
private: |
||||
const CUPnPControlPoint &m_UPnPControlPoint; |
||||
ArgumentList m_ArgumentList; |
||||
const std::string m_name; |
||||
|
||||
public: |
||||
CUPnPAction( |
||||
const CUPnPControlPoint &upnpControlPoint, |
||||
CUPnPLib &upnpLib, |
||||
IXML_Element *action, |
||||
const std::string &SCPDURL); |
||||
~CUPnPAction() {} |
||||
const std::string &GetName() const |
||||
{ return m_name; } |
||||
const std::string &GetKey() const |
||||
{ return m_name; } |
||||
const ArgumentList &GetArgumentList() const |
||||
{ return m_ArgumentList; } |
||||
}; |
||||
|
||||
|
||||
class CUPnPAllowedValue |
||||
{ |
||||
private: |
||||
const CUPnPControlPoint &m_UPnPControlPoint; |
||||
const std::string m_allowedValue; |
||||
|
||||
public: |
||||
CUPnPAllowedValue( |
||||
const CUPnPControlPoint &upnpControlPoint, |
||||
CUPnPLib &upnpLib, |
||||
IXML_Element *allowedValue, |
||||
const std::string &SCPDURL); |
||||
~CUPnPAllowedValue() {} |
||||
const std::string &GetAllowedValue() const |
||||
{ return m_allowedValue; } |
||||
const std::string &GetKey() const |
||||
{ return m_allowedValue; } |
||||
}; |
||||
|
||||
|
||||
class CUPnPStateVariable |
||||
{ |
||||
private: |
||||
const CUPnPControlPoint &m_UPnPControlPoint; |
||||
AllowedValueList m_AllowedValueList; |
||||
const std::string m_name; |
||||
const std::string m_dataType; |
||||
const std::string m_defaultValue; |
||||
const std::string m_sendEvents; |
||||
|
||||
public: |
||||
CUPnPStateVariable( |
||||
const CUPnPControlPoint &upnpControlPoint, |
||||
CUPnPLib &upnpLib, |
||||
IXML_Element *stateVariable, |
||||
const std::string &URLBase); |
||||
~CUPnPStateVariable() {} |
||||
const std::string &GetNname() const |
||||
{ return m_name; } |
||||
const std::string &GetDataType() const |
||||
{ return m_dataType; } |
||||
const std::string &GetDefaultValue() const |
||||
{ return m_defaultValue; } |
||||
const std::string &GetKey() const |
||||
{ return m_name; } |
||||
const AllowedValueList &GetAllowedValueList() const |
||||
{ return m_AllowedValueList; } |
||||
}; |
||||
|
||||
|
||||
class CUPnPSCPD |
||||
{ |
||||
private: |
||||
const CUPnPControlPoint &m_UPnPControlPoint; |
||||
ActionList m_ActionList; |
||||
ServiceStateTable m_ServiceStateTable; |
||||
const std::string m_SCPDURL; |
||||
|
||||
public: |
||||
CUPnPSCPD( |
||||
const CUPnPControlPoint &upnpControlPoint, |
||||
CUPnPLib &upnpLib, |
||||
IXML_Element *scpd, |
||||
const std::string &SCPDURL); |
||||
~CUPnPSCPD() {} |
||||
const ActionList &GetActionList() const |
||||
{ return m_ActionList; } |
||||
const ServiceStateTable &GetServiceStateTable() const |
||||
{ return m_ServiceStateTable; } |
||||
}; |
||||
|
||||
|
||||
class CUPnPArgumentValue |
||||
{ |
||||
private: |
||||
std::string m_argument; |
||||
std::string m_value; |
||||
|
||||
public: |
||||
CUPnPArgumentValue(); |
||||
CUPnPArgumentValue(const std::string &argument, const std::string &value); |
||||
~CUPnPArgumentValue() {} |
||||
|
||||
const std::string &GetArgument() const { return m_argument; } |
||||
const std::string &GetValue() const { return m_value; } |
||||
const std::string &SetArgument(const std::string& argument) { return m_argument = argument; } |
||||
const std::string &SetValue(const std::string &value) { return m_value = value; } |
||||
}; |
||||
|
||||
|
||||
class CUPnPService |
||||
{ |
||||
private: |
||||
const CUPnPControlPoint &m_UPnPControlPoint; |
||||
CUPnPLib &m_upnpLib; |
||||
const std::string m_serviceType; |
||||
const std::string m_serviceId; |
||||
const std::string m_SCPDURL; |
||||
const std::string m_controlURL; |
||||
const std::string m_eventSubURL; |
||||
std::string m_absSCPDURL; |
||||
std::string m_absControlURL; |
||||
std::string m_absEventSubURL; |
||||
int m_timeout; |
||||
Upnp_SID m_SID; |
||||
std::auto_ptr<CUPnPSCPD> m_SCPD; |
||||
|
||||
public: |
||||
CUPnPService( |
||||
const CUPnPControlPoint &upnpControlPoint, |
||||
CUPnPLib &upnpLib, |
||||
IXML_Element *service, |
||||
const std::string &URLBase); |
||||
~CUPnPService(); |
||||
|
||||
const std::string &GetServiceType() const |
||||
{ return m_serviceType; } |
||||
const std::string &GetServiceId() const |
||||
{ return m_serviceId; } |
||||
const std::string &GetSCPDURL() const |
||||
{ return m_SCPDURL; } |
||||
const std::string &GetAbsSCPDURL() const |
||||
{ return m_absSCPDURL; } |
||||
const std::string &GetControlURL() const |
||||
{ return m_controlURL; } |
||||
const std::string &GetEventSubURL() const |
||||
{ return m_eventSubURL; } |
||||
const std::string &GetAbsControlURL() const |
||||
{ return m_absControlURL; } |
||||
const std::string &GetAbsEventSubURL() const |
||||
{ return m_absEventSubURL; } |
||||
int GetTimeout() const |
||||
{ return m_timeout; } |
||||
void SetTimeout(int t) |
||||
{ m_timeout = t; } |
||||
int *GetTimeoutAddr() |
||||
{ return &m_timeout; } |
||||
char *GetSID() |
||||
{ return m_SID; } |
||||
void SetSID(const char *s) |
||||
{ memcpy(m_SID, s, sizeof(Upnp_SID)); } |
||||
const std::string &GetKey() const |
||||
{ return m_serviceId; } |
||||
bool IsSubscribed() const |
||||
{ return m_SCPD.get() != NULL; } |
||||
void SetSCPD(CUPnPSCPD *SCPD) |
||||
{ m_SCPD.reset(SCPD); } |
||||
|
||||
bool Execute( |
||||
const std::string &ActionName, |
||||
const std::vector<CUPnPArgumentValue> &ArgValue) const; |
||||
const std::string GetStateVariable( |
||||
const std::string &stateVariableName) const; |
||||
}; |
||||
|
||||
|
||||
class CUPnPDevice |
||||
{ |
||||
private: |
||||
const CUPnPControlPoint &m_UPnPControlPoint; |
||||
|
||||
// Please, lock these lists before use
|
||||
DeviceList m_DeviceList; |
||||
ServiceList m_ServiceList; |
||||
|
||||
const std::string m_deviceType; |
||||
const std::string m_friendlyName; |
||||
const std::string m_manufacturer; |
||||
const std::string m_manufacturerURL; |
||||
const std::string m_modelDescription; |
||||
const std::string m_modelName; |
||||
const std::string m_modelNumber; |
||||
const std::string m_modelURL; |
||||
const std::string m_serialNumber; |
||||
const std::string m_UDN; |
||||
const std::string m_UPC; |
||||
std::string m_presentationURL; |
||||
|
||||
public: |
||||
CUPnPDevice( |
||||
const CUPnPControlPoint &upnpControlPoint, |
||||
CUPnPLib &upnpLib, |
||||
IXML_Element *device, |
||||
const std::string &URLBase); |
||||
~CUPnPDevice() {} |
||||
|
||||
const std::string &GetUDN() const |
||||
{ return m_UDN; } |
||||
const std::string &GetDeviceType() const |
||||
{ return m_deviceType; } |
||||
const std::string &GetFriendlyName() const |
||||
{ return m_friendlyName; } |
||||
const std::string &GetPresentationURL() const |
||||
{ return m_presentationURL; } |
||||
const std::string &GetKey() const |
||||
{ return m_UDN; } |
||||
}; |
||||
|
||||
|
||||
class CUPnPRootDevice : public CUPnPDevice |
||||
{ |
||||
private: |
||||
const CUPnPControlPoint &m_UPnPControlPoint; |
||||
const std::string m_URLBase; |
||||
const std::string m_location; |
||||
int m_expires; |
||||
|
||||
public: |
||||
CUPnPRootDevice( |
||||
const CUPnPControlPoint &upnpControlPoint, |
||||
CUPnPLib &upnpLib, |
||||
IXML_Element *rootDevice, |
||||
const std::string &OriginalURLBase, |
||||
const std::string &FixedURLBase, |
||||
const char *location, |
||||
int expires); |
||||
~CUPnPRootDevice() {} |
||||
|
||||
const std::string &GetURLBase() const |
||||
{ return m_URLBase; } |
||||
const std::string &GetLocation() const |
||||
{ return m_location; } |
||||
int GetExpires() const |
||||
{ return m_expires; } |
||||
void SetExpires(int expires) |
||||
{ m_expires = expires; } |
||||
}; |
||||
|
||||
|
||||
typedef std::map<const std::string, CUPnPRootDevice *> RootDeviceMap; |
||||
typedef std::map<const std::string, CUPnPService *> ServiceMap; |
||||
typedef std::map<const std::string, CUPnPPortMapping> PortMappingMap; |
||||
|
||||
|
||||
class CUPnPControlPoint |
||||
{ |
||||
private: |
||||
static CUPnPControlPoint *s_CtrlPoint; |
||||
// upnp stuff
|
||||
CUPnPLib m_upnpLib; |
||||
UpnpClient_Handle m_UPnPClientHandle; |
||||
RootDeviceMap m_RootDeviceMap; |
||||
ServiceMap m_ServiceMap; |
||||
PortMappingMap m_ActivePortMappingsMap; |
||||
QMutex m_RootDeviceListMutex; |
||||
bool m_IGWDeviceDetected; |
||||
CUPnPService *m_WanService; |
||||
QMutex m_WaitForSearchTimeout; |
||||
|
||||
public: |
||||
CUPnPControlPoint(unsigned short udpPort); |
||||
~CUPnPControlPoint(); |
||||
void Subscribe(CUPnPService &service); |
||||
void Unsubscribe(CUPnPService &service); |
||||
bool AddPortMappings( |
||||
std::vector<CUPnPPortMapping> &upnpPortMapping); |
||||
bool DeletePortMappings( |
||||
std::vector<CUPnPPortMapping> &upnpPortMapping); |
||||
|
||||
UpnpClient_Handle GetUPnPClientHandle() const |
||||
{ return m_UPnPClientHandle; } |
||||
|
||||
bool GetIGWDeviceDetected() const |
||||
{ return m_IGWDeviceDetected; } |
||||
void SetIGWDeviceDetected(bool b) |
||||
{ m_IGWDeviceDetected = b; } |
||||
bool WanServiceDetected() const |
||||
{ return !m_ServiceMap.empty(); } |
||||
void SetWanService(CUPnPService *service) |
||||
{ m_WanService = service; } |
||||
|
||||
// Callback function
|
||||
static int Callback( |
||||
Upnp_EventType EventType, |
||||
void* Event, |
||||
void* Cookie); |
||||
|
||||
private: |
||||
void OnEventReceived( |
||||
const std::string &Sid, |
||||
int EventKey, |
||||
IXML_Document *ChangedVariables); |
||||
void AddRootDevice( |
||||
IXML_Element *rootDevice, |
||||
const std::string &urlBase, |
||||
const char *location, |
||||
int expires); |
||||
void RemoveRootDevice( |
||||
const char *udn); |
||||
void RefreshPortMappings(); |
||||
bool PrivateAddPortMapping( |
||||
CUPnPPortMapping &upnpPortMapping); |
||||
bool PrivateDeletePortMapping( |
||||
CUPnPPortMapping &upnpPortMapping); |
||||
}; |
||||
|
||||
|
||||
#endif /* AMULE_UPNP_H */ |
||||
|
||||
// File_checked_for_headers
|
Loading…
Reference in new issue