|
|
|
@ -2,6 +2,10 @@
|
|
|
|
|
#include <string>
|
|
|
|
|
#include <thread>
|
|
|
|
|
|
|
|
|
|
#ifdef _WIN32
|
|
|
|
|
#include <windows.h>
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
#include <boost/thread/thread.hpp>
|
|
|
|
|
#include <boost/asio.hpp>
|
|
|
|
|
#include <boost/bind.hpp>
|
|
|
|
@ -66,11 +70,21 @@ namespace UPnP
|
|
|
|
|
{
|
|
|
|
|
#ifdef MAC_OSX
|
|
|
|
|
m_Module = dlopen ("libminiupnpc.dylib", RTLD_LAZY);
|
|
|
|
|
#elif WIN32
|
|
|
|
|
m_Module = dlopen ("libminiupnpc.dll", RTLD_LAZY);
|
|
|
|
|
#elif _WIN32
|
|
|
|
|
m_Module = LoadLibrary ("libminiupnpc.dll");
|
|
|
|
|
if (m_Module == NULL)
|
|
|
|
|
{
|
|
|
|
|
LogPrint ("Error loading UPNP library. This often happens if there is version mismatch!");
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
m_IsModuleLoaded = true;
|
|
|
|
|
}
|
|
|
|
|
#else
|
|
|
|
|
m_Module = dlopen ("libminiupnpc.so", RTLD_LAZY);
|
|
|
|
|
#endif
|
|
|
|
|
#ifndef _WIN32
|
|
|
|
|
if (!m_Module)
|
|
|
|
|
{
|
|
|
|
|
LogPrint ("no UPnP module available (", dlerror (), ")");
|
|
|
|
@ -80,6 +94,7 @@ namespace UPnP
|
|
|
|
|
{
|
|
|
|
|
m_IsModuleLoaded = true;
|
|
|
|
|
}
|
|
|
|
|
#endif
|
|
|
|
|
for (auto& address : context.GetRouterInfo ().GetAddresses ())
|
|
|
|
|
{
|
|
|
|
|
if (!address.host.is_v6 ())
|
|
|
|
@ -101,6 +116,9 @@ namespace UPnP
|
|
|
|
|
void UPnP::Discover ()
|
|
|
|
|
{
|
|
|
|
|
const char *error;
|
|
|
|
|
#ifdef _WIN32
|
|
|
|
|
upnp_upnpDiscoverFunc upnpDiscoverFunc = (upnp_upnpDiscoverFunc) GetProcAddress (m_Module, "upnpDiscover");
|
|
|
|
|
#else
|
|
|
|
|
upnp_upnpDiscoverFunc upnpDiscoverFunc = (upnp_upnpDiscoverFunc) dlsym (m_Module, "upnpDiscover");
|
|
|
|
|
// reinterpret_cast<upnp_upnpDiscoverFunc> (dlsym(...));
|
|
|
|
|
if ( (error = dlerror ()))
|
|
|
|
@ -108,6 +126,7 @@ namespace UPnP
|
|
|
|
|
LogPrint ("Error loading UPNP library. This often happens if there is version mismatch!");
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
#endif // _WIN32
|
|
|
|
|
#ifndef UPNPDISCOVER_SUCCESS
|
|
|
|
|
/* miniupnpc 1.5 */
|
|
|
|
|
m_Devlist = upnpDiscoverFunc (2000, m_MulticastIf, m_Minissdpdpath, 0);
|
|
|
|
@ -116,8 +135,13 @@ namespace UPnP
|
|
|
|
|
int nerror = 0;
|
|
|
|
|
m_Devlist = upnpDiscoverFunc (2000, m_MulticastIf, m_Minissdpdpath, 0, 0, &nerror);
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
int r;
|
|
|
|
|
#ifdef _WIN32
|
|
|
|
|
upnp_UPNP_GetValidIGDFunc UPNP_GetValidIGDFunc = (upnp_UPNP_GetValidIGDFunc) GetProcAddress (m_Module, "UPNP_GetValidIGD");
|
|
|
|
|
#else
|
|
|
|
|
upnp_UPNP_GetValidIGDFunc UPNP_GetValidIGDFunc = (upnp_UPNP_GetValidIGDFunc) dlsym (m_Module, "UPNP_GetValidIGD");
|
|
|
|
|
#endif
|
|
|
|
|
r = (*UPNP_GetValidIGDFunc) (m_Devlist, &m_upnpUrls, &m_upnpData, m_NetworkAddr, sizeof (m_NetworkAddr));
|
|
|
|
|
if (r == 1)
|
|
|
|
|
{
|
|
|
|
@ -161,7 +185,11 @@ namespace UPnP
|
|
|
|
|
std::string strDesc = "I2Pd";
|
|
|
|
|
try {
|
|
|
|
|
for (;;) {
|
|
|
|
|
upnp_UPNP_AddPortMappingFunc UPNP_AddPortMappingFunc = (upnp_UPNP_AddPortMappingFunc) dlsym(m_Module, "UPNP_AddPortMapping");
|
|
|
|
|
#ifdef _WIN32
|
|
|
|
|
upnp_UPNP_AddPortMappingFunc UPNP_AddPortMappingFunc = (upnp_UPNP_AddPortMappingFunc) GetProcAddress (m_Module, "UPNP_AddPortMapping");
|
|
|
|
|
#else
|
|
|
|
|
upnp_UPNP_AddPortMappingFunc UPNP_AddPortMappingFunc = (upnp_UPNP_AddPortMappingFunc) dlsym (m_Module, "UPNP_AddPortMapping");
|
|
|
|
|
#endif
|
|
|
|
|
#ifndef UPNPDISCOVER_SUCCESS
|
|
|
|
|
/* miniupnpc 1.5 */
|
|
|
|
|
r = UPNP_AddPortMappingFunc (m_upnpUrls.controlURL, m_upnpData.first.servicetype, m_Port.c_str (), m_Port.c_str (), m_NetworkAddr, strDesc.c_str (), strType.c_str (), 0);
|
|
|
|
@ -203,19 +231,35 @@ namespace UPnP
|
|
|
|
|
strType = "UDP";
|
|
|
|
|
}
|
|
|
|
|
int r = 0;
|
|
|
|
|
#ifdef _WIN32
|
|
|
|
|
upnp_UPNP_DeletePortMappingFunc UPNP_DeletePortMappingFunc = (upnp_UPNP_DeletePortMappingFunc) GetProcAddress (m_Module, "UPNP_DeletePortMapping");
|
|
|
|
|
#else
|
|
|
|
|
upnp_UPNP_DeletePortMappingFunc UPNP_DeletePortMappingFunc = (upnp_UPNP_DeletePortMappingFunc) dlsym (m_Module, "UPNP_DeletePortMapping");
|
|
|
|
|
#endif
|
|
|
|
|
r = UPNP_DeletePortMappingFunc (m_upnpUrls.controlURL, m_upnpData.first.servicetype, m_Port.c_str (), strType.c_str (), 0);
|
|
|
|
|
LogPrint ("UPNP_DeletePortMapping() returned : ", r, "\n");
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void UPnP::Close ()
|
|
|
|
|
{
|
|
|
|
|
#ifdef _WIN32
|
|
|
|
|
upnp_freeUPNPDevlistFunc freeUPNPDevlistFunc = (upnp_freeUPNPDevlistFunc) GetProcAddress (m_Module, "freeUPNPDevlist");
|
|
|
|
|
#else
|
|
|
|
|
upnp_freeUPNPDevlistFunc freeUPNPDevlistFunc = (upnp_freeUPNPDevlistFunc) dlsym (m_Module, "freeUPNPDevlist");
|
|
|
|
|
#endif
|
|
|
|
|
freeUPNPDevlistFunc (m_Devlist);
|
|
|
|
|
m_Devlist = 0;
|
|
|
|
|
#ifdef _WIN32
|
|
|
|
|
upnp_FreeUPNPUrlsFunc FreeUPNPUrlsFunc = (upnp_FreeUPNPUrlsFunc) GetProcAddress (m_Module, "FreeUPNPUrlsFunc");
|
|
|
|
|
#else
|
|
|
|
|
upnp_FreeUPNPUrlsFunc FreeUPNPUrlsFunc = (upnp_FreeUPNPUrlsFunc) dlsym (m_Module, "FreeUPNPUrlsFunc");
|
|
|
|
|
#endif
|
|
|
|
|
FreeUPNPUrlsFunc (&m_upnpUrls);
|
|
|
|
|
#ifndef _WIN32
|
|
|
|
|
dlclose (m_Module);
|
|
|
|
|
#else
|
|
|
|
|
FreeLibrary (m_Module);
|
|
|
|
|
#endif
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|