BlackBerry bearer plugin: check whether device is online several times

This is supposed to workaround a race condition in the underlying
netstatus API: Sometimes we get an event that the Wifi interface
changed, but it is not up, e.g. no gateway (yet). In that case we need
to check back (currently: 300 ms) whether the interface has come
up or not.
This commit can be reverted again once the race condition in the
netstatus API has been resolved.

Task-number: QTBUG-29421
Change-Id: I215ce8aae4848b6e942e77c6425adba90e9cc526
Reviewed-by: Sean Harmer <sean.harmer@kdab.com>
Reviewed-by: Rafael Roquetto <rafael.roquetto@kdab.com>
This commit is contained in:
Peter Hartmann 2013-01-25 09:38:47 +01:00 committed by The Qt Project
parent a9458a1755
commit 3dc47622a4
2 changed files with 25 additions and 0 deletions

View File

@ -59,6 +59,10 @@
#include <QtCore/qmutex.h>
#include <QtCore/qmap.h>
#ifdef Q_OS_BLACKBERRY
#include <bps/netstatus.h>
#endif
QT_BEGIN_NAMESPACE
typedef QExplicitlySharedDataPointer<QNetworkConfigurationPrivate> QNetworkConfigurationPrivatePointer;
@ -70,6 +74,9 @@ public:
type(QNetworkConfiguration::Invalid),
purpose(QNetworkConfiguration::UnknownPurpose),
bearerType(QNetworkConfiguration::BearerUnknown),
#ifdef Q_OS_BLACKBERRY
oldIpStatus(NETSTATUS_IP_STATUS_ERROR_UNKNOWN),
#endif
isValid(false), roamingSupported(false)
{}
virtual ~QNetworkConfigurationPrivate()
@ -90,6 +97,10 @@ public:
QNetworkConfiguration::Purpose purpose;
QNetworkConfiguration::BearerType bearerType;
#ifdef Q_OS_BLACKBERRY
netstatus_ip_status_t oldIpStatus;
#endif
bool isValid;
bool roamingSupported;

View File

@ -45,6 +45,7 @@
#include <QDebug>
#include <QThreadStorage>
#include <QStringList>
#include <QTimer>
#include <bps/netstatus.h>
@ -355,6 +356,9 @@ void QBBEngine::updateConfiguration(const char *interface)
changed = true;
}
const netstatus_ip_status_t oldIpStatus = ptr->oldIpStatus;
ptr->oldIpStatus = ipStatus;
ptrLocker.unlock();
locker.unlock();
@ -364,7 +368,17 @@ void QBBEngine::updateConfiguration(const char *interface)
Q_EMIT configurationChanged(ptr);
} else {
// maybe Wifi has changed but gateway not yet ready etc.
qBearerDebug() << Q_FUNC_INFO << "configuration has not changed.";
if (oldIpStatus != ipStatus) { // if IP status changed
if (ipStatus != NETSTATUS_IP_STATUS_OK
&& ipStatus != NETSTATUS_IP_STATUS_ERROR_NOT_UP
&& ipStatus != NETSTATUS_IP_STATUS_ERROR_NOT_CONFIGURED) {
// work around race condition in netstatus API by just checking
// again in 300 ms
QTimer::singleShot(300, this, SLOT(doRequestUpdate()));
}
}
}
return;