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:
parent
a9458a1755
commit
3dc47622a4
@ -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;
|
||||
|
||||
|
@ -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;
|
||||
|
Loading…
Reference in New Issue
Block a user