[Author Prev][Author Next][Thread Prev][Thread Next][Author Index][Thread Index]
[vidalia-svn] r2632: Use UPNPControl::setState() to update the progress of the UP (in vidalia: . branches/upnp/src/vidalia/config)
Author: edmanm
Date: 2008-05-31 20:52:09 -0400 (Sat, 31 May 2008)
New Revision: 2632
Modified:
vidalia/
vidalia/branches/upnp/src/vidalia/config/upnpcontrolthread.cpp
Log:
r398@thebe: edmanm | 2008-05-31 20:46:15 -0400
Use UPNPControl::setState() to update the progress of the UPnP control thread,
and fix a bug that meant failures while forwarding DirPort were always
ignored. Also a few trivial whitespace fixes.
Property changes on: vidalia
___________________________________________________________________
svk:merge ticket from /local/vidalia [r398] on 45a62a8a-8088-484c-baad-c7b3e776dd32
Modified: vidalia/branches/upnp/src/vidalia/config/upnpcontrolthread.cpp
===================================================================
--- vidalia/branches/upnp/src/vidalia/config/upnpcontrolthread.cpp 2008-06-01 00:52:06 UTC (rev 2631)
+++ vidalia/branches/upnp/src/vidalia/config/upnpcontrolthread.cpp 2008-06-01 00:52:09 UTC (rev 2632)
@@ -70,14 +70,16 @@
forever {
/* TODO: Check for switching OR/Dir port */
/* TODO: Check for router losing state */
-
+
configurePorts();
/* Wait for something to happen */
_waitMutex->lock();
if (_keepRunning) {
- /* We should continue */
+ /* We should continue */
+ UPNPControl::Instance()->setState(UPNPControl::IdleState);
_waitCondition->wait(_waitMutex, UPNPCONTROL_MAX_WAIT_MSEC);
+
/* Maybe we were asked to exit while waiting */
shouldExit = !_keepRunning;
_waitMutex->unlock();
@@ -105,8 +107,6 @@
bool force_init = false;
UPNPControl::UPNPError retval = UPNPControl::Success;
- vDebug("configurePorts()");
-
/* Get desired state */
_control->getDesiredState(&desiredDirPort, &desiredOrPort);
@@ -120,36 +120,49 @@
_upnpInitialized = QTime();
force_init = true;
}
-
+
if (!force_init) {
/* Configure DirPort */
if (desiredDirPort != _dirPort) {
+ UPNPControl::Instance()->setState(UPNPControl::UpdatingDirPortState);
retval = updatePort(_dirPort, desiredDirPort);
if (retval == UPNPControl::Success)
_dirPort = desiredDirPort;
+ else
+ goto err;
}
-
+
/* Configure ORPort */
if (desiredOrPort != _orPort) {
+ UPNPControl::Instance()->setState(UPNPControl::UpdatingORPortState);
retval = updatePort(_orPort, desiredOrPort);
if (retval == UPNPControl::Success)
_orPort = desiredOrPort;
+ else
+ goto err;
}
} else {
/* Add the mapping even if they exist already */
+ UPNPControl::Instance()->setState(UPNPControl::UpdatingDirPortState);
retval = updatePort(0, desiredDirPort);
if (retval == UPNPControl::Success)
_dirPort = desiredDirPort;
-
+ else
+ goto err;
+
+ UPNPControl::Instance()->setState(UPNPControl::UpdatingORPortState);
retval = updatePort(0, desiredOrPort);
if (retval == UPNPControl::Success)
_orPort = desiredOrPort;
+ else goto err;
}
- vInfo("configurePorts() result: %1").arg(retval);
+ UPNPControl::Instance()->setState(UPNPControl::ForwardingCompleteState);
+ return;
- if (retval != UPNPControl::Success)
- UPNPControl::Instance()->setError(retval);
+err:
+ UPNPControl::Instance()->setError(retval);
+ UPNPControl::Instance()->setState(UPNPControl::ErrorState);
}
/** Terminates the UPnP control thread's run() loop.
@@ -236,6 +249,8 @@
memset(&urls, 0, sizeof(struct UPNPUrls));
memset(&data, 0, sizeof(struct IGDdatas));
+ UPNPControl::Instance()->setState(UPNPControl::DiscoverState);
+
devlist = upnpDiscover(UPNPCONTROL_DISCOVER_TIMEOUT, NULL, NULL);
if (NULL == devlist) {
vWarn("upnpDiscover returned: NULL");
@@ -260,9 +275,9 @@
UPNPControlThread::forwardPort(quint16 port)
{
int retval;
-
+
char sPort[6];
-
+
char intClient[16];
char intPort[6];
@@ -277,7 +292,7 @@
.arg(sPort).arg(sPort).arg(lanaddr).arg(retval);
return UPNPControl::AddPortMappingFailed;
}
-
+
// Check if the port mapping was accepted
retval = UPNP_GetSpecificPortMappingEntry(urls.controlURL, data.servicetype,
sPort, "TCP", intClient, intPort);
@@ -285,12 +300,12 @@
vWarn("GetSpecificPortMappingEntry() failed with code %1").arg(retval);
return UPNPControl::GetPortMappingFailed;
}
-
+
if(! intClient[0]) {
vWarn("GetSpecificPortMappingEntry failed.");
return UPNPControl::GetPortMappingFailed;
}
-
+
// Output the mapping
vInfo("(external):%1 -> %2:%3").arg(sPort).arg(intClient).arg(intPort);
@@ -303,10 +318,10 @@
UPNPControlThread::disablePort(quint16 port)
{
char sPort[6];
-
+
// Convert the port number to a string
snprintf(sPort, sizeof(sPort), "%d", port);
-
+
// Remove the mapping
int retval = UPNP_DeletePortMapping(urls.controlURL, data.servicetype,
sPort, "TCP");
@@ -314,10 +329,10 @@
vWarn("DeletePortMapping() failed with code %1").arg(retval);
return UPNPControl::DeletePortMappingFailed;
}
-
+
// Output the cancelled mapping
vInfo("(external):%1 -> <>").arg(sPort);
-
+
return UPNPControl::Success;
}