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