Browse Source

- Started to clean up upnp code

adaptive-webui-19844
Christophe Dumez 18 years ago
parent
commit
fa2815df49
  1. 13
      configure
  2. 5
      qcm/libupnp.qcm
  3. 291
      src/UPnP.cpp
  4. 65
      src/UPnP.h
  5. 3
      src/src.pro

13
configure vendored

@ -25,6 +25,7 @@ Dependency options:
--disable-libupnp Disable use of libupnp --disable-libupnp Disable use of libupnp
--disable-upnp disable UPnP support --disable-upnp disable UPnP support
--with-libupnp-inc=[path] Path to libupnp include files --with-libupnp-inc=[path] Path to libupnp include files
--with-libupnp-lib=[path] Path to libupnp library files
EOT EOT
} }
@ -176,6 +177,11 @@ while [ $# -gt 0 ]; do
shift shift
;; ;;
--with-libupnp-lib=*)
QC_WITH_LIBUPNP_LIB=$optarg
shift
;;
--verbose) --verbose)
QC_DEBUG="Y" QC_DEBUG="Y"
shift shift
@ -204,6 +210,7 @@ echo QC_WITH_LIBCURL_LIB=$QC_WITH_LIBCURL_LIB
echo QC_DISABLE_libupnp=$QC_DISABLE_libupnp echo QC_DISABLE_libupnp=$QC_DISABLE_libupnp
echo QC_DISABLE_UPNP=$QC_DISABLE_UPNP echo QC_DISABLE_UPNP=$QC_DISABLE_UPNP
echo QC_WITH_LIBUPNP_INC=$QC_WITH_LIBUPNP_INC echo QC_WITH_LIBUPNP_INC=$QC_WITH_LIBUPNP_INC
echo QC_WITH_LIBUPNP_LIB=$QC_WITH_LIBUPNP_LIB
echo echo
fi fi
@ -474,6 +481,7 @@ public:
name: libupnp name: libupnp
arg: disable-upnp, disable UPnP support arg: disable-upnp, disable UPnP support
arg: with-libupnp-inc=[path], Path to libupnp include files arg: with-libupnp-inc=[path], Path to libupnp include files
arg: with-libupnp-lib=[path], Path to libupnp library files
-----END QCMOD----- -----END QCMOD-----
*/ */
class qc_libupnp : public ConfObj class qc_libupnp : public ConfObj
@ -509,7 +517,7 @@ public:
conf->addIncludePath(s); conf->addIncludePath(s);
} }
/*s = conf->getenv("QC_WITH_LIBUPNP_LIB"); s = conf->getenv("QC_WITH_LIBUPNP_LIB");
if(!s.isEmpty()) { if(!s.isEmpty()) {
if(!conf->checkLibrary(s, "upnp")) { if(!conf->checkLibrary(s, "upnp")) {
qWarning("libupnp library not found!"); qWarning("libupnp library not found!");
@ -525,7 +533,7 @@ public:
conf->addLib(QString("-L") + s); conf->addLib(QString("-L") + s);
} }
conf->addLib("-lupnp");*/ conf->addLib("-lupnp");
return true; return true;
} }
@ -1484,6 +1492,7 @@ export QC_WITH_LIBCURL_LIB
export QC_DISABLE_libupnp export QC_DISABLE_libupnp
export QC_DISABLE_UPNP export QC_DISABLE_UPNP
export QC_WITH_LIBUPNP_INC export QC_WITH_LIBUPNP_INC
export QC_WITH_LIBUPNP_LIB
export QC_DEBUG export QC_DEBUG
rm -rf .qconftemp rm -rf .qconftemp
( (

5
qcm/libupnp.qcm

@ -3,6 +3,7 @@
name: libupnp name: libupnp
arg: disable-upnp, disable UPnP support arg: disable-upnp, disable UPnP support
arg: with-libupnp-inc=[path], Path to libupnp include files arg: with-libupnp-inc=[path], Path to libupnp include files
arg: with-libupnp-lib=[path], Path to libupnp library files
-----END QCMOD----- -----END QCMOD-----
*/ */
class qc_libupnp : public ConfObj class qc_libupnp : public ConfObj
@ -38,7 +39,7 @@ public:
conf->addIncludePath(s); conf->addIncludePath(s);
} }
/*s = conf->getenv("QC_WITH_LIBUPNP_LIB"); s = conf->getenv("QC_WITH_LIBUPNP_LIB");
if(!s.isEmpty()) { if(!s.isEmpty()) {
if(!conf->checkLibrary(s, "upnp")) { if(!conf->checkLibrary(s, "upnp")) {
qWarning("libupnp library not found!"); qWarning("libupnp library not found!");
@ -54,7 +55,7 @@ public:
conf->addLib(QString("-L") + s); conf->addLib(QString("-L") + s);
} }
conf->addLib("-lupnp");*/ conf->addLib("-lupnp");
return true; return true;
} }

291
src/UPnP.cpp

@ -32,9 +32,6 @@
#include <QMutexLocker> #include <QMutexLocker>
#include <QString> #include <QString>
#include <dlfcn.h> // For dlopen(), dlsym(), dlclose()
#include <algorithm> // For transform()
#ifdef __GNUC__ #ifdef __GNUC__
#if __GNUC__ >= 4 #if __GNUC__ >= 4
@ -65,36 +62,6 @@ m_key()
} }
CDynamicLibHandle::CDynamicLibHandle(const char *libname)
:
m_libname(libname),
m_LibraryHandle(dlopen(libname, RTLD_LAZY))
{
std::ostringstream msg;
if (!m_LibraryHandle) {
qDebug("error(CDynamicLibHandle): Unable to dlopen the lib. Check PATH and LD_LIBRARY_PATH.");
} else {
qDebug("Successfully opened the lib.");
}
}
CDynamicLibHandle::~CDynamicLibHandle()
{
std::ostringstream msg;
int err_code = dlclose(m_LibraryHandle);
if (err_code) {
msg << "error(CDynamicLibHandle): Error closing " <<
m_libname << ": " << dlerror() <<
".";
fprintf(stderr, "%s\n", msg.str().c_str());
} else {
msg << "Successfully closed " << m_libname << ".";
qDebug("UPnP: %s", msg.str().c_str());
}
}
const std::string &CUPnPLib::UPNP_ROOT_DEVICE = const std::string &CUPnPLib::UPNP_ROOT_DEVICE =
"upnp:rootdevice"; "upnp:rootdevice";
@ -116,134 +83,12 @@ const std::string &CUPnPLib::UPNP_SERVICE_WAN_IP_CONNECTION =
const std::string &CUPnPLib::UPNP_SERVICE_WAN_PPP_CONNECTION = const std::string &CUPnPLib::UPNP_SERVICE_WAN_PPP_CONNECTION =
"urn:schemas-upnp-org:service:WANPPPConnection:1"; "urn:schemas-upnp-org:service:WANPPPConnection:1";
CUPnPLib::CUPnPLib(CUPnPControlPoint &ctrlPoint) : m_ctrlPoint(ctrlPoint) {}
const char *CUPnPLib::s_LibIXMLSymbols[] =
{
/* 0*/ "ixmlNode_getFirstChild",
/* 1*/ "ixmlNode_getNextSibling",
/* 2*/ "ixmlNode_getNodeName",
/* 3*/ "ixmlNode_getNodeValue",
/* 4*/ "ixmlNode_getAttributes",
/* 5*/ "ixmlDocument_free",
/* 6*/ "ixmlNamedNodeMap_getNamedItem",
/* 7*/ "ixmlNamedNodeMap_free",
};
const char *CUPnPLib::s_LibUPnPSymbols[] =
{
/* 0*/ "UpnpInit",
/* 1*/ "UpnpFinish",
/* 2*/ "UpnpGetServerPort",
/* 3*/ "UpnpGetServerIpAddress",
/* 4*/ "UpnpRegisterClient",
/* 5*/ "UpnpUnRegisterClient",
/* 6*/ "UpnpSearchAsync",
/* 7*/ "UpnpGetServiceVarStatus",
/* 8*/ "UpnpSendAction",
/* 9*/ "UpnpSendActionAsync",
/*10*/ "UpnpSubscribe",
/*11*/ "UpnpUnSubscribe",
/*12*/ "UpnpDownloadXmlDoc",
/*13*/ "UpnpResolveURL",
/*14*/ "UpnpMakeAction",
/*15*/ "UpnpAddToAction",
/*16*/ "UpnpGetErrorMessage",
};
CUPnPLib::CUPnPLib(CUPnPControlPoint &ctrlPoint)
:
m_ctrlPoint(ctrlPoint),
m_LibIXMLHandle("libixml.so.0"),
m_LibUPnPHandle("libupnp.so.0")
{
// IXML
m_ixmlNode_getFirstChild =
REINTERPRET_CAST(IXML_Node *(*)(IXML_Node *))
(dlsym(m_LibIXMLHandle.Get(), s_LibIXMLSymbols[0]));
m_ixmlNode_getNextSibling =
REINTERPRET_CAST(IXML_Node *(*)(IXML_Node *))
(dlsym(m_LibIXMLHandle.Get(), s_LibIXMLSymbols[1]));
m_ixmlNode_getNodeName =
REINTERPRET_CAST(const DOMString (*)(IXML_Node *))
(dlsym(m_LibIXMLHandle.Get(), s_LibIXMLSymbols[2]));
m_ixmlNode_getNodeValue =
REINTERPRET_CAST(const DOMString (*)(IXML_Node *))
(dlsym(m_LibIXMLHandle.Get(), s_LibIXMLSymbols[3]));
m_ixmlNode_getAttributes =
REINTERPRET_CAST(IXML_NamedNodeMap *(*)(IXML_Node *))
(dlsym(m_LibIXMLHandle.Get(), s_LibIXMLSymbols[4]));
m_ixmlDocument_free =
REINTERPRET_CAST(void (*)(IXML_Document *))
(dlsym(m_LibIXMLHandle.Get(), s_LibIXMLSymbols[5]));
m_ixmlNamedNodeMap_getNamedItem =
REINTERPRET_CAST(IXML_Node *(*)(IXML_NamedNodeMap *, const DOMString))
(dlsym(m_LibIXMLHandle.Get(), s_LibIXMLSymbols[6]));
m_ixmlNamedNodeMap_free =
REINTERPRET_CAST(void (*)(IXML_NamedNodeMap *))
(dlsym(m_LibIXMLHandle.Get(), s_LibIXMLSymbols[7]));
// UPnP
m_UpnpInit =
REINTERPRET_CAST(int (*)(const char *, int))
(dlsym(m_LibUPnPHandle.Get(), s_LibUPnPSymbols[0]));
m_UpnpFinish =
REINTERPRET_CAST(void (*)())
(dlsym(m_LibUPnPHandle.Get(), s_LibUPnPSymbols[1]));
m_UpnpGetServerPort =
REINTERPRET_CAST(unsigned short (*)())
(dlsym(m_LibUPnPHandle.Get(), s_LibUPnPSymbols[2]));
m_UpnpGetServerIpAddress =
REINTERPRET_CAST(char * (*)())
(dlsym(m_LibUPnPHandle.Get(), s_LibUPnPSymbols[3]));
m_UpnpRegisterClient =
REINTERPRET_CAST(int (*)(Upnp_FunPtr, const void *, UpnpClient_Handle *))
(dlsym(m_LibUPnPHandle.Get(), s_LibUPnPSymbols[4]));
m_UpnpUnRegisterClient =
REINTERPRET_CAST(int (*)(UpnpClient_Handle))
(dlsym(m_LibUPnPHandle.Get(), s_LibUPnPSymbols[5]));
m_UpnpSearchAsync =
REINTERPRET_CAST(int (*)(UpnpClient_Handle, int, const char *, const void *))
(dlsym(m_LibUPnPHandle.Get(), s_LibUPnPSymbols[6]));
m_UpnpGetServiceVarStatus =
REINTERPRET_CAST(int (*)(UpnpClient_Handle, const char *, const char *, DOMString *))
(dlsym(m_LibUPnPHandle.Get(), s_LibUPnPSymbols[7]));
m_UpnpSendAction =
REINTERPRET_CAST(int (*)(UpnpClient_Handle, const char *, const char *, const char *,
IXML_Document *, IXML_Document **))
(dlsym(m_LibUPnPHandle.Get(), s_LibUPnPSymbols[8]));
m_UpnpSendActionAsync =
REINTERPRET_CAST(int (*)(UpnpClient_Handle, const char *, const char *, const char *,
IXML_Document *, Upnp_FunPtr, const void *))
(dlsym(m_LibUPnPHandle.Get(), s_LibUPnPSymbols[9]));
m_UpnpSubscribe =
REINTERPRET_CAST(int (*)(UpnpClient_Handle, const char *, int *, Upnp_SID))
(dlsym(m_LibUPnPHandle.Get(), s_LibUPnPSymbols[10]));
m_UpnpUnSubscribe =
REINTERPRET_CAST(int (*)(UpnpClient_Handle, Upnp_SID))
(dlsym(m_LibUPnPHandle.Get(), s_LibUPnPSymbols[11]));
m_UpnpDownloadXmlDoc =
REINTERPRET_CAST(int (*)(const char *, IXML_Document **))
(dlsym(m_LibUPnPHandle.Get(), s_LibUPnPSymbols[12]));
m_UpnpResolveURL =
REINTERPRET_CAST(int (*)(const char *, const char *, char *))
(dlsym(m_LibUPnPHandle.Get(), s_LibUPnPSymbols[13]));
m_UpnpMakeAction =
REINTERPRET_CAST(IXML_Document *(*)(const char *, const char *, int, const char *, ...))
(dlsym(m_LibUPnPHandle.Get(), s_LibUPnPSymbols[14]));
m_UpnpAddToAction =
REINTERPRET_CAST(int (*)(IXML_Document **, const char *, const char *, const char *, const char *))
(dlsym(m_LibUPnPHandle.Get(), s_LibUPnPSymbols[15]));
m_UpnpGetErrorMessage =
REINTERPRET_CAST(const char *(*)(int))
(dlsym(m_LibUPnPHandle.Get(), s_LibUPnPSymbols[16]));
}
std::string CUPnPLib::GetUPnPErrorMessage(int code) const std::string CUPnPLib::GetUPnPErrorMessage(int code) const
{ {
return m_UpnpGetErrorMessage(code); return UpnpGetErrorMessage(code);
} }
@ -319,7 +164,7 @@ IXML_Element *CUPnPLib::Element_GetRootElement(
IXML_Document *doc) const IXML_Document *doc) const
{ {
IXML_Element *root = REINTERPRET_CAST(IXML_Element *)( IXML_Element *root = REINTERPRET_CAST(IXML_Element *)(
m_ixmlNode_getFirstChild( ixmlNode_getFirstChild(
REINTERPRET_CAST(IXML_Node *)(doc))); REINTERPRET_CAST(IXML_Node *)(doc)));
return root; return root;
@ -333,7 +178,7 @@ IXML_Element *CUPnPLib::Element_GetFirstChild(
IXML_Element *parent) const IXML_Element *parent) const
{ {
IXML_Node *node = REINTERPRET_CAST(IXML_Node *)(parent); IXML_Node *node = REINTERPRET_CAST(IXML_Node *)(parent);
IXML_Node *child = m_ixmlNode_getFirstChild(node); IXML_Node *child = ixmlNode_getFirstChild(node);
return REINTERPRET_CAST(IXML_Element *)(child); return REINTERPRET_CAST(IXML_Element *)(child);
} }
@ -346,7 +191,7 @@ IXML_Element *CUPnPLib::Element_GetNextSibling(
IXML_Element *child) const IXML_Element *child) const
{ {
IXML_Node *node = REINTERPRET_CAST(IXML_Node *)(child); IXML_Node *node = REINTERPRET_CAST(IXML_Node *)(child);
IXML_Node *sibling = m_ixmlNode_getNextSibling(node); IXML_Node *sibling = ixmlNode_getNextSibling(node);
return REINTERPRET_CAST(IXML_Element *)(sibling); return REINTERPRET_CAST(IXML_Element *)(sibling);
} }
@ -359,7 +204,7 @@ const DOMString CUPnPLib::Element_GetTag(
IXML_Element *element) const IXML_Element *element) const
{ {
IXML_Node *node = REINTERPRET_CAST(IXML_Node *)(element); IXML_Node *node = REINTERPRET_CAST(IXML_Node *)(element);
const DOMString tag = m_ixmlNode_getNodeName(node); const DOMString tag = ixmlNode_getNodeName(node);
return tag; return tag;
} }
@ -374,9 +219,9 @@ const std::string CUPnPLib::Element_GetTextValue(
if (!element) { if (!element) {
return stdEmptyString; return stdEmptyString;
} }
IXML_Node *text = m_ixmlNode_getFirstChild( IXML_Node *text = ixmlNode_getFirstChild(
REINTERPRET_CAST(IXML_Node *)(element)); REINTERPRET_CAST(IXML_Node *)(element));
const DOMString s = m_ixmlNode_getNodeValue(text); const DOMString s = ixmlNode_getNodeValue(text);
std::string ret; std::string ret;
if (s) { if (s) {
ret = s; ret = s;
@ -413,11 +258,11 @@ IXML_Element *CUPnPLib::Element_GetFirstChildByTag(
} }
IXML_Node *node = REINTERPRET_CAST(IXML_Node *)(element); IXML_Node *node = REINTERPRET_CAST(IXML_Node *)(element);
IXML_Node *child = m_ixmlNode_getFirstChild(node); IXML_Node *child = ixmlNode_getFirstChild(node);
const DOMString childTag = m_ixmlNode_getNodeName(child); const DOMString childTag = ixmlNode_getNodeName(child);
while(child && childTag && strcmp(tag, childTag)) { while(child && childTag && strcmp(tag, childTag)) {
child = m_ixmlNode_getNextSibling(child); child = ixmlNode_getNextSibling(child);
childTag = m_ixmlNode_getNodeName(child); childTag = ixmlNode_getNodeName(child);
} }
return REINTERPRET_CAST(IXML_Element *)(child); return REINTERPRET_CAST(IXML_Element *)(child);
@ -438,8 +283,8 @@ IXML_Element *CUPnPLib::Element_GetNextSiblingByTag(
IXML_Node *child = REINTERPRET_CAST(IXML_Node *)(element); IXML_Node *child = REINTERPRET_CAST(IXML_Node *)(element);
const DOMString childTag = NULL; const DOMString childTag = NULL;
do { do {
child = m_ixmlNode_getNextSibling(child); child = ixmlNode_getNextSibling(child);
childTag = m_ixmlNode_getNodeName(child); childTag = ixmlNode_getNodeName(child);
} while(child && childTag && strcmp(tag, childTag)); } while(child && childTag && strcmp(tag, childTag));
return REINTERPRET_CAST(IXML_Element *)(child); return REINTERPRET_CAST(IXML_Element *)(child);
@ -449,15 +294,15 @@ IXML_Element *CUPnPLib::Element_GetNextSiblingByTag(
const std::string CUPnPLib::Element_GetAttributeByTag( const std::string CUPnPLib::Element_GetAttributeByTag(
IXML_Element *element, const DOMString tag) const IXML_Element *element, const DOMString tag) const
{ {
IXML_NamedNodeMap *NamedNodeMap = m_ixmlNode_getAttributes( IXML_NamedNodeMap *NamedNodeMap = ixmlNode_getAttributes(
REINTERPRET_CAST(IXML_Node *)(element)); REINTERPRET_CAST(IXML_Node *)(element));
IXML_Node *attribute = m_ixmlNamedNodeMap_getNamedItem(NamedNodeMap, tag); IXML_Node *attribute = m_ixmlNamedNodeMap_getNamedItem(NamedNodeMap, tag);
const DOMString s = m_ixmlNode_getNodeValue(attribute); const DOMString s = ixmlNode_getNodeValue(attribute);
std::string ret; std::string ret;
if (s) { if (s) {
ret = s; ret = s;
} }
m_ixmlNamedNodeMap_free(NamedNodeMap); ixmlNamedNodeMap_free(NamedNodeMap);
return ret; return ret;
} }
@ -603,9 +448,9 @@ m_SCPD(NULL)
int errcode; int errcode;
char *scpdURL = new char[URLBase.length() + m_SCPDURL.length() + 1]; char *scpdURL = new char[URLBase.length() + m_SCPDURL.length() + 1];
errcode = upnpLib.m_UpnpResolveURL( errcode = UpnpResolveURL(
URLBase.c_str(), (char*)URLBase.c_str(),
m_SCPDURL.c_str(), (char*)m_SCPDURL.c_str(),
scpdURL); scpdURL);
if( errcode != UPNP_E_SUCCESS ) { if( errcode != UPNP_E_SUCCESS ) {
msg << "Error generating scpdURL from " << msg << "Error generating scpdURL from " <<
@ -618,9 +463,9 @@ m_SCPD(NULL)
char *controlURL = new char[ char *controlURL = new char[
URLBase.length() + m_controlURL.length() + 1]; URLBase.length() + m_controlURL.length() + 1];
errcode = upnpLib.m_UpnpResolveURL( errcode = UpnpResolveURL(
URLBase.c_str(), (char*)URLBase.c_str(),
m_controlURL.c_str(), (char*)m_controlURL.c_str(),
controlURL); controlURL);
if( errcode != UPNP_E_SUCCESS ) { if( errcode != UPNP_E_SUCCESS ) {
msg << "Error generating controlURL from " << msg << "Error generating controlURL from " <<
@ -633,9 +478,9 @@ m_SCPD(NULL)
char *eventURL = new char[ char *eventURL = new char[
URLBase.length() + m_eventSubURL.length() + 1]; URLBase.length() + m_eventSubURL.length() + 1];
errcode = upnpLib.m_UpnpResolveURL( errcode = UpnpResolveURL(
URLBase.c_str(), (char*)URLBase.c_str(),
m_eventSubURL.c_str(), (char*)m_eventSubURL.c_str(),
eventURL); eventURL);
if( errcode != UPNP_E_SUCCESS ) { if( errcode != UPNP_E_SUCCESS ) {
msg << "Error generating eventURL from " << msg << "Error generating eventURL from " <<
@ -777,12 +622,12 @@ bool CUPnPService::Execute(
IXML_Document *ActionDoc = NULL; IXML_Document *ActionDoc = NULL;
if (ArgValue.size()) { if (ArgValue.size()) {
for (unsigned int i = 0; i < ArgValue.size(); ++i) { for (unsigned int i = 0; i < ArgValue.size(); ++i) {
int ret = m_upnpLib.m_UpnpAddToAction( int ret = UpnpAddToAction(
&ActionDoc, &ActionDoc,
action.GetName().c_str(), (char*)action.GetName().c_str(),
GetServiceType().c_str(), (char*)GetServiceType().c_str(),
ArgValue[i].GetArgument().c_str(), (char*)ArgValue[i].GetArgument().c_str(),
ArgValue[i].GetValue().c_str()); (char*)ArgValue[i].GetValue().c_str());
if (ret != UPNP_E_SUCCESS) { if (ret != UPNP_E_SUCCESS) {
m_upnpLib.processUPnPErrorMessage( m_upnpLib.processUPnPErrorMessage(
"m_UpnpAddToAction", ret, NULL, NULL); "m_UpnpAddToAction", ret, NULL, NULL);
@ -790,9 +635,9 @@ bool CUPnPService::Execute(
} }
} }
} else { } else {
ActionDoc = m_upnpLib.m_UpnpMakeAction( ActionDoc = UpnpMakeAction(
action.GetName().c_str(), (char*)action.GetName().c_str(),
GetServiceType().c_str(), (char*)GetServiceType().c_str(),
0, NULL); 0, NULL);
if (!ActionDoc) { if (!ActionDoc) {
msg << "Error: m_UpnpMakeAction returned NULL."; msg << "Error: m_UpnpMakeAction returned NULL.";
@ -800,24 +645,13 @@ bool CUPnPService::Execute(
return false; return false;
} }
} }
#if 0
// Send the action asynchronously
m_upnpLib.m_UpnpSendActionAsync(
m_UPnPControlPoint.GetUPnPClientHandle(),
GetAbsControlURL().c_str(),
GetServiceType().c_str(),
NULL, ActionDoc,
static_cast<Upnp_FunPtr>(&CUPnPControlPoint::Callback),
NULL);
return true;
#endif
// Send the action synchronously // Send the action synchronously
IXML_Document *RespDoc = NULL; IXML_Document *RespDoc = NULL;
int ret = m_upnpLib.m_UpnpSendAction( int ret = UpnpSendAction(
m_UPnPControlPoint.GetUPnPClientHandle(), m_UPnPControlPoint.GetUPnPClientHandle(),
GetAbsControlURL().c_str(), (char*)GetAbsControlURL().c_str(),
GetServiceType().c_str(), (char*)GetServiceType().c_str(),
NULL, ActionDoc, &RespDoc); NULL, ActionDoc, &RespDoc);
if (ret != UPNP_E_SUCCESS) { if (ret != UPNP_E_SUCCESS) {
m_upnpLib.processUPnPErrorMessage( m_upnpLib.processUPnPErrorMessage(
@ -826,14 +660,14 @@ bool CUPnPService::Execute(
m_upnpLib.m_ixmlDocument_free(RespDoc); m_upnpLib.m_ixmlDocument_free(RespDoc);
return false; return false;
} }
m_upnpLib.m_ixmlDocument_free(ActionDoc); ixmlDocument_free(ActionDoc);
// Check the response document // Check the response document
m_upnpLib.ProcessActionResponse( m_upnpLib.ProcessActionResponse(
RespDoc, action.GetName()); RespDoc, action.GetName());
// Free the response document // Free the response document
m_upnpLib.m_ixmlDocument_free(RespDoc); ixmlDocument_free(RespDoc);
return true; return true;
} }
@ -844,10 +678,10 @@ const std::string CUPnPService::GetStateVariable(
{ {
std::ostringstream msg; std::ostringstream msg;
DOMString StVarVal; DOMString StVarVal;
int ret = m_upnpLib.m_UpnpGetServiceVarStatus( int ret = UpnpGetServiceVarStatus(
m_UPnPControlPoint.GetUPnPClientHandle(), m_UPnPControlPoint.GetUPnPClientHandle(),
GetAbsControlURL().c_str(), (char*)GetAbsControlURL().c_str(),
stateVariableName.c_str(), (char*)stateVariableName.c_str(),
&StVarVal); &StVarVal);
if (ret != UPNP_E_SUCCESS) { if (ret != UPNP_E_SUCCESS) {
msg << "GetStateVariable(\"" << msg << "GetStateVariable(\"" <<
@ -893,9 +727,9 @@ m_presentationURL (upnpLib.Element_GetChildValueByTag(device, "presentationURL"
int presURLlen = strlen(URLBase.c_str()) + int presURLlen = strlen(URLBase.c_str()) +
strlen(m_presentationURL.c_str()) + 2; strlen(m_presentationURL.c_str()) + 2;
char presURL[presURLlen]; char presURL[presURLlen];
int errcode = upnpLib.m_UpnpResolveURL( int errcode = UpnpResolveURL(
URLBase.c_str(), (char*)URLBase.c_str(),
m_presentationURL.c_str(), (char*)m_presentationURL.c_str(),
presURL); presURL);
if (errcode != UPNP_E_SUCCESS) { if (errcode != UPNP_E_SUCCESS) {
msg << "Error generating presentationURL from " << msg << "Error generating presentationURL from " <<
@ -973,18 +807,18 @@ m_UPnPPort(udpPort)
int ret; int ret;
char *ipAddress = NULL; char *ipAddress = NULL;
unsigned short port = 0; unsigned short port = 0;
ret = m_upnpLib.m_UpnpInit(ipAddress, udpPort); ret = UpnpInit(ipAddress, udpPort);
if (ret != UPNP_E_SUCCESS) { if (ret != UPNP_E_SUCCESS) {
msg << "error(UpnpInit): Error code "; msg << "error(UpnpInit): Error code ";
goto error; goto error;
} }
port = m_upnpLib.m_UpnpGetServerPort(); port = UpnpGetServerPort();
ipAddress = m_upnpLib.m_UpnpGetServerIpAddress(); ipAddress = UpnpGetServerIpAddress();
msg << "bound to " << ipAddress << ":" << msg << "bound to " << ipAddress << ":" <<
port << "."; port << ".";
qDebug("UPnP: %s", msg.str().c_str()); qDebug("UPnP: %s", msg.str().c_str());
msg.str(""); msg.str("");
ret = m_upnpLib.m_UpnpRegisterClient( ret = UpnpRegisterClient(
static_cast<Upnp_FunPtr>(&CUPnPControlPoint::Callback), static_cast<Upnp_FunPtr>(&CUPnPControlPoint::Callback),
&m_UPnPClientHandle, &m_UPnPClientHandle,
&m_UPnPClientHandle); &m_UPnPClientHandle);
@ -1002,10 +836,10 @@ m_UPnPPort(udpPort)
// We should not search twice, because this will produce two // We should not search twice, because this will produce two
// UPNP_DISCOVERY_SEARCH_TIMEOUT events, and we might end with problems // UPNP_DISCOVERY_SEARCH_TIMEOUT events, and we might end with problems
// on the mutex. // on the mutex.
ret = m_upnpLib.m_UpnpSearchAsync(m_UPnPClientHandle, 3, m_upnpLib.UPNP_ROOT_DEVICE.c_str(), NULL); ret = UpnpSearchAsync(m_UPnPClientHandle, 3, m_upnpLib.UPNP_ROOT_DEVICE.c_str(), NULL);
//ret = m_upnpLib.m_UpnpSearchAsync(m_UPnPClientHandle, 3, m_upnpLib.UPNP_DEVICE_IGW.c_str(), this); //ret = UpnpSearchAsync(m_UPnPClientHandle, 3, m_upnpLib.UPNP_DEVICE_IGW.c_str(), this);
//ret = m_upnpLib.m_UpnpSearchAsync(m_UPnPClientHandle, 3, m_upnpLib.UPNP_DEVICE_LAN.c_str(), this); //ret = UpnpSearchAsync(m_UPnPClientHandle, 3, m_upnpLib.UPNP_DEVICE_LAN.c_str(), this);
//ret = m_upnpLib.m_UpnpSearchAsync(m_UPnPClientHandle, 3, m_upnpLib.UPNP_DEVICE_WAN_CONNECTION.c_str(), this); //ret = UpnpSearchAsync(m_UPnPClientHandle, 3, m_upnpLib.UPNP_DEVICE_WAN_CONNECTION.c_str(), this);
if (ret != UPNP_E_SUCCESS) { if (ret != UPNP_E_SUCCESS) {
msg << "error(UpnpSearchAsync): Error sending search request: "; msg << "error(UpnpSearchAsync): Error sending search request: ";
goto error; goto error;
@ -1027,7 +861,7 @@ m_UPnPPort(udpPort)
// Error processing // Error processing
error: error:
m_upnpLib.m_UpnpFinish(); UpnpFinish();
msg << ret << ": " << m_upnpLib.GetUPnPErrorMessage(ret) << "."; msg << ret << ": " << m_upnpLib.GetUPnPErrorMessage(ret) << ".";
qDebug("UPnP: %s", msg.str().c_str()); qDebug("UPnP: %s", msg.str().c_str());
} }
@ -1042,8 +876,8 @@ CUPnPControlPoint::~CUPnPControlPoint()
} }
// Remove all first // Remove all first
// RemoveAll(); // RemoveAll();
m_upnpLib.m_UpnpUnRegisterClient(m_UPnPClientHandle); UpnpUnRegisterClient(m_UPnPClientHandle);
m_upnpLib.m_UpnpFinish(); UpnpFinish();
} }
@ -1148,7 +982,7 @@ bool CUPnPControlPoint::PrivateAddPortMapping(
CUPnPPortMapping &upnpPortMapping) CUPnPPortMapping &upnpPortMapping)
{ {
// Get an IP address. The UPnP server one must do. // Get an IP address. The UPnP server one must do.
std::string ipAddress(m_upnpLib.m_UpnpGetServerIpAddress()); std::string ipAddress(UpnpGetServerIpAddress());
// Start building the action // Start building the action
std::string actionName("AddPortMapping"); std::string actionName("AddPortMapping");
@ -1301,7 +1135,7 @@ upnpDiscovery:
qDebug("UPnP: %s", msg.str().c_str()); qDebug("UPnP: %s", msg.str().c_str());
} }
// Get the XML tree device description in doc // Get the XML tree device description in doc
ret = upnpCP->m_upnpLib.m_UpnpDownloadXmlDoc(d_event->Location, &doc); ret = UpnpDownloadXmlDoc(d_event->Location, &doc);
if (ret != UPNP_E_SUCCESS) { if (ret != UPNP_E_SUCCESS) {
msg << "Error retrieving device description from " << msg << "Error retrieving device description from " <<
d_event->Location << ": " << d_event->Location << ": " <<
@ -1369,7 +1203,6 @@ upnpDiscovery:
} }
std::string devType = dab_event->DeviceType; std::string devType = dab_event->DeviceType;
// Check for an InternetGatewayDevice and removes it from the list // Check for an InternetGatewayDevice and removes it from the list
transform(devType.begin(), devType.end(), devType.begin(), tolower);
if (QString(devType.c_str()).toUpper() == QString(upnpCP->m_upnpLib.UPNP_DEVICE_IGW.c_str()).toUpper()) { if (QString(devType.c_str()).toUpper() == QString(upnpCP->m_upnpLib.UPNP_DEVICE_IGW.c_str()).toUpper()) {
upnpCP->RemoveRootDevice(dab_event->DeviceId); upnpCP->RemoveRootDevice(dab_event->DeviceId);
} }
@ -1419,7 +1252,7 @@ upnpEventSubscriptionExpired:
(struct Upnp_Event_Subscribe *)Event; (struct Upnp_Event_Subscribe *)Event;
Upnp_SID newSID; Upnp_SID newSID;
int TimeOut = 1801; int TimeOut = 1801;
int ret = upnpCP->m_upnpLib.m_UpnpSubscribe( int ret = UpnpSubscribe(
upnpCP->m_UPnPClientHandle, upnpCP->m_UPnPClientHandle,
es_event->PublisherUrl, es_event->PublisherUrl,
&TimeOut, &TimeOut,
@ -1605,7 +1438,7 @@ void CUPnPControlPoint::RemoveRootDevice(const char *udn)
void CUPnPControlPoint::Subscribe(CUPnPService &service) void CUPnPControlPoint::Subscribe(CUPnPService &service)
{ {
std::ostringstream msg; std::ostringstream msg;
int errcode = m_upnpLib.m_UpnpSubscribe(m_UPnPClientHandle, int errcode = UpnpSubscribe(m_UPnPClientHandle,
service.GetAbsEventSubURL().c_str(), service.GetAbsEventSubURL().c_str(),
service.GetTimeoutAddr(), service.GetTimeoutAddr(),
service.GetSID()); service.GetSID());
@ -1617,7 +1450,7 @@ void CUPnPControlPoint::Subscribe(CUPnPService &service)
qDebug("UPnP: %s", msg.str().c_str()); qDebug("UPnP: %s", msg.str().c_str());
IXML_Document *scpdDoc = NULL; IXML_Document *scpdDoc = NULL;
errcode = m_upnpLib.m_UpnpDownloadXmlDoc( errcode = UpnpDownloadXmlDoc(
service.GetAbsSCPDURL().c_str(), &scpdDoc); service.GetAbsSCPDURL().c_str(), &scpdDoc);
if (errcode == UPNP_E_SUCCESS) { if (errcode == UPNP_E_SUCCESS) {
// Get the root node // Get the root node
@ -1652,7 +1485,7 @@ void CUPnPControlPoint::Unsubscribe(CUPnPService &service)
{ {
ServiceMap::iterator it = m_ServiceMap.find(service.GetAbsEventSubURL()); ServiceMap::iterator it = m_ServiceMap.find(service.GetAbsEventSubURL());
m_ServiceMap.erase(it); m_ServiceMap.erase(it);
m_upnpLib.m_UpnpUnSubscribe(m_UPnPClientHandle, service.GetSID()); UpnpUnSubscribe(m_UPnPClientHandle, service.GetSID());
} }

65
src/UPnP.h

@ -35,6 +35,8 @@
#include <vector> #include <vector>
#include <upnp/upnp.h> #include <upnp/upnp.h>
#include <upnp/upnptools.h>
#include <upnp/ixml.h>
#include <QMutex> #include <QMutex>
@ -84,22 +86,6 @@ public:
{ return m_key; } { 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 CUPnPControlPoint;
@ -117,15 +103,6 @@ public:
static const std::string &UPNP_SERVICE_WAN_PPP_CONNECTION; static const std::string &UPNP_SERVICE_WAN_PPP_CONNECTION;
CUPnPControlPoint &m_ctrlPoint; 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: public:
CUPnPLib(CUPnPControlPoint &ctrlPoint); CUPnPLib(CUPnPControlPoint &ctrlPoint);
~CUPnPLib() {} ~CUPnPLib() {}
@ -181,44 +158,6 @@ public:
IXML_Node *(*m_ixmlNamedNodeMap_getNamedItem)( IXML_Node *(*m_ixmlNamedNodeMap_getNamedItem)(
IXML_NamedNodeMap *nnMap, const DOMString name); IXML_NamedNodeMap *nnMap, const DOMString name);
void (*m_ixmlNamedNodeMap_free)(IXML_NamedNodeMap *nnMap); 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);
}; };

3
src/src.pro

@ -27,8 +27,7 @@ contains(DEBUG_MODE, 0){
QMAKE_CXXFLAGS_RELEASE += -fwrapv QMAKE_CXXFLAGS_RELEASE += -fwrapv
QMAKE_CXXFLAGS_DEBUG += -fwrapv QMAKE_CXXFLAGS_DEBUG += -fwrapv
#LIBS += -lcurl #LIBS += -lcurl -lupnp
LIBS += -lupnp
#CONFIG += link_pkgconfig #CONFIG += link_pkgconfig
#PKGCONFIG += libtorrent #PKGCONFIG += libtorrent
QT += network QT += network

Loading…
Cancel
Save