bool CUPnPImplMiniLib::IsReady(){ // the only check we need to do is if we are already busy with some async/threaded function CSingleLock lockTest(&m_mutBusy); if (!m_bAbortDiscovery && lockTest.Lock(0)) return true; else return false; }
void CUPnPImplMiniLib::DeletePorts(bool bSkipLock){ // this function itself blocking, because its called at the end of eMule and we need to wait for it to finish // before going on anyway. It might be caled from the non-blocking StartDiscovery() function too however CSingleLock lockTest(&m_mutBusy); if (bSkipLock || lockTest.Lock(0)){ if (m_nOldTCPPort != 0){ if (m_pURLs == NULL || m_pURLs->controlURL == NULL || m_pIGDData == NULL){ ASSERT( false ); return; } const char achTCP[] = "TCP"; char achPort[10]; sprintf(achPort, "%u", m_nOldTCPPort); int nResult = UPNP_DeletePortMapping(m_pURLs->controlURL, m_pIGDData->servicetype, achPort, achTCP, NULL); if (nResult == UPNPCOMMAND_SUCCESS){ DebugLog(_T("Sucessfully removed mapping for port %u (%s)"), m_nOldTCPPort, _T("TCP")); m_nOldTCPPort = 0; } else DebugLogWarning(_T("Failed to remove mapping for port %u (%s)"), m_nOldTCPPort, _T("TCP")); } else{ DebugLog(_T("No UPnP Mappings to remove, aborting")); return; // UDP port cannot be set if TCP port was empty } if (m_nOldUDPPort != 0){ const char achTCP[] = "UDP"; char achPort[10]; sprintf(achPort, "%u", m_nOldUDPPort); int nResult = UPNP_DeletePortMapping(m_pURLs->controlURL, m_pIGDData->servicetype, achPort, achTCP, NULL); if (nResult == UPNPCOMMAND_SUCCESS){ DebugLog(_T("Sucessfully removed mapping for port %u (%s)"), m_nOldUDPPort, _T("UDP")); m_nOldTCPPort = 0; } else DebugLogWarning(_T("Failed to remove mapping for port %u (%s)"), m_nOldUDPPort, _T("UDP")); } if (m_nOldTCPWebPort != 0){ const char achTCP[] = "TCP"; char achPort[10]; sprintf(achPort, "%u", m_nOldTCPWebPort); int nResult = UPNP_DeletePortMapping(m_pURLs->controlURL, m_pIGDData->servicetype, achPort, achTCP, 0); if (nResult == UPNPCOMMAND_SUCCESS){ DebugLog(_T("Sucessfully removed mapping for webinterface port %u (%s)"), m_nOldTCPPort, _T("TCP")); m_nOldTCPWebPort = 0; } else DebugLogWarning(_T("Failed to remove mapping for webinterface port %u (%s)"), m_nOldTCPPort, _T("TCP")); } } else DebugLogError(_T("Unable to remove port mappings - implementation still busy")); }
void CUPnPImplMiniLib::StopAsyncFind(){ CSingleLock lockTest(&m_mutBusy); m_bAbortDiscovery = true; // if there is a thread, tell him to abort as soon as possible - he won't sent a Resultmessage when aborted if (!lockTest.Lock(7000)) // give the thread 7 seconds to exit gracefully - it should never really take that long { // that quite bad, something seems to be locked up. There isn't a good solution here, we need the thread to quit // or it might try to access a deleted object later, but termianting him is quite bad too. Well.. DebugLogError(_T("Waiting for UPnP StartDiscoveryThread to quit failed, trying to terminate the thread...")); if (m_hThreadHandle != 0){ if (TerminateThread(m_hThreadHandle, 0)) DebugLogError(_T("...OK")); else DebugLogError(_T("...Failed")); } else ASSERT( false ); m_hThreadHandle = 0; } else { DebugLog(_T("Aborted any possible UPnP StartDiscoveryThread")); m_bAbortDiscovery = false; m_hThreadHandle = 0; } }