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/qmutex.h>
|
||||||
#include <QtCore/qmap.h>
|
#include <QtCore/qmap.h>
|
||||||
|
|
||||||
|
#ifdef Q_OS_BLACKBERRY
|
||||||
|
#include <bps/netstatus.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
QT_BEGIN_NAMESPACE
|
QT_BEGIN_NAMESPACE
|
||||||
|
|
||||||
typedef QExplicitlySharedDataPointer<QNetworkConfigurationPrivate> QNetworkConfigurationPrivatePointer;
|
typedef QExplicitlySharedDataPointer<QNetworkConfigurationPrivate> QNetworkConfigurationPrivatePointer;
|
||||||
@ -70,6 +74,9 @@ public:
|
|||||||
type(QNetworkConfiguration::Invalid),
|
type(QNetworkConfiguration::Invalid),
|
||||||
purpose(QNetworkConfiguration::UnknownPurpose),
|
purpose(QNetworkConfiguration::UnknownPurpose),
|
||||||
bearerType(QNetworkConfiguration::BearerUnknown),
|
bearerType(QNetworkConfiguration::BearerUnknown),
|
||||||
|
#ifdef Q_OS_BLACKBERRY
|
||||||
|
oldIpStatus(NETSTATUS_IP_STATUS_ERROR_UNKNOWN),
|
||||||
|
#endif
|
||||||
isValid(false), roamingSupported(false)
|
isValid(false), roamingSupported(false)
|
||||||
{}
|
{}
|
||||||
virtual ~QNetworkConfigurationPrivate()
|
virtual ~QNetworkConfigurationPrivate()
|
||||||
@ -90,6 +97,10 @@ public:
|
|||||||
QNetworkConfiguration::Purpose purpose;
|
QNetworkConfiguration::Purpose purpose;
|
||||||
QNetworkConfiguration::BearerType bearerType;
|
QNetworkConfiguration::BearerType bearerType;
|
||||||
|
|
||||||
|
#ifdef Q_OS_BLACKBERRY
|
||||||
|
netstatus_ip_status_t oldIpStatus;
|
||||||
|
#endif
|
||||||
|
|
||||||
bool isValid;
|
bool isValid;
|
||||||
bool roamingSupported;
|
bool roamingSupported;
|
||||||
|
|
||||||
|
@ -45,6 +45,7 @@
|
|||||||
#include <QDebug>
|
#include <QDebug>
|
||||||
#include <QThreadStorage>
|
#include <QThreadStorage>
|
||||||
#include <QStringList>
|
#include <QStringList>
|
||||||
|
#include <QTimer>
|
||||||
|
|
||||||
#include <bps/netstatus.h>
|
#include <bps/netstatus.h>
|
||||||
|
|
||||||
@ -355,6 +356,9 @@ void QBBEngine::updateConfiguration(const char *interface)
|
|||||||
changed = true;
|
changed = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const netstatus_ip_status_t oldIpStatus = ptr->oldIpStatus;
|
||||||
|
ptr->oldIpStatus = ipStatus;
|
||||||
|
|
||||||
ptrLocker.unlock();
|
ptrLocker.unlock();
|
||||||
|
|
||||||
locker.unlock();
|
locker.unlock();
|
||||||
@ -364,7 +368,17 @@ void QBBEngine::updateConfiguration(const char *interface)
|
|||||||
|
|
||||||
Q_EMIT configurationChanged(ptr);
|
Q_EMIT configurationChanged(ptr);
|
||||||
} else {
|
} else {
|
||||||
|
// maybe Wifi has changed but gateway not yet ready etc.
|
||||||
qBearerDebug() << Q_FUNC_INFO << "configuration has not changed.";
|
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;
|
return;
|
||||||
|
Loading…
Reference in New Issue
Block a user