void QBBEngine::doRequestUpdate() { qBearerDebug() << Q_FUNC_INFO << "entered method"; netstatus_interface_list_t interfaceList; if ((netstatus_get_interfaces(&interfaceList)) != BPS_SUCCESS) { qBearerDebug() << Q_FUNC_INFO << "cannot retrieve interface list"; return; } const QScopedPointer<netstatus_interface_list_t, NetstatusInterfaceListCleanupHelper> holder(&interfaceList); QSet<QString> currentConfigurations; for (int i = 0; i < interfaceList.num_interfaces; i++) { const char *interface = interfaceList.interfaces[i]; qBearerDebug() << Q_FUNC_INFO << "discovered interface" << interface; updateConfiguration(interface); currentConfigurations << idForName(QString::fromLatin1(interface)); } QMutexLocker locker(&mutex); const QStringList keys = accessPointConfigurations.uniqueKeys(); locker.unlock(); Q_FOREACH (const QString &id, keys) { if (!currentConfigurations.contains(id)) removeConfiguration(id); } Q_EMIT updateCompleted(); }
QNetworkConfigurationPrivatePointer QBBEngine::defaultConfiguration() { char *interface = 0; if (netstatus_get_default_interface(&interface) != BPS_SUCCESS) return QNetworkConfigurationPrivatePointer(); if (!interface) return QNetworkConfigurationPrivatePointer(); const QScopedPointer<char, NetstatusInterfaceCleanupHelper> holder(interface); const QString id = idForName(QString::fromLatin1(interface)); const QMutexLocker locker(&mutex); if (accessPointConfigurations.contains(id)) { qBearerDebug() << Q_FUNC_INFO << "found default interface:" << id; return accessPointConfigurations.value(id); } return QNetworkConfigurationPrivatePointer(); }
void QBBEngine::updateConfiguration(const char *interface) { netstatus_interface_details_t *details = 0; if (netstatus_get_interface_details(interface, &details) != BPS_SUCCESS) { qBearerDebug() << Q_FUNC_INFO << "cannot retrieve details for interface" << interface; return; } const QString name = QString::fromLatin1(netstatus_interface_get_name(details)); const QString id = idForName(name); const netstatus_interface_type_t type = netstatus_interface_get_type(details); const netstatus_ip_status_t ipStatus = netstatus_interface_get_ip_status(details); netstatus_free_interface_details(&details); QNetworkConfiguration::StateFlags state = QNetworkConfiguration::Defined; if (ipStatus == NETSTATUS_IP_STATUS_OK) state |= QNetworkConfiguration::Active; QMutexLocker locker(&mutex); if (accessPointConfigurations.contains(id)) { QNetworkConfigurationPrivatePointer ptr = accessPointConfigurations.value(id); bool changed = false; QMutexLocker ptrLocker(&ptr->mutex); if (!ptr->isValid) { ptr->isValid = true; changed = true; } if (ptr->name != name) { ptr->name = name; changed = true; } if (ptr->id != id) { ptr->id = id; changed = true; } if (ptr->state != state) { ptr->state = state; changed = true; } const netstatus_ip_status_t oldIpStatus = ptr->oldIpStatus; ptr->oldIpStatus = ipStatus; ptrLocker.unlock(); locker.unlock(); if (changed) { qBearerDebug() << Q_FUNC_INFO << "configuration changed:" << 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; } QNetworkConfigurationPrivatePointer ptr(new QNetworkConfigurationPrivate); ptr->name = name; ptr->isValid = true; ptr->id = id; ptr->state = state; ptr->type = QNetworkConfiguration::InternetAccessPoint; ptr->bearerType = interfaceType(type); accessPointConfigurations.insert(id, ptr); configurationInterface.insert(id, name); locker.unlock(); qBearerDebug() << Q_FUNC_INFO << "configuration added:" << interface; Q_EMIT configurationAdded(ptr); }
void QBBEngine::updateConfiguration(const char *interface) { netstatus_interface_details_t *details = 0; if (netstatus_get_interface_details(interface, &details) != BPS_SUCCESS) { qBearerDebug() << Q_FUNC_INFO << "cannot retrieve details for interface" << interface; return; } const QString name = QString::fromLatin1(netstatus_interface_get_name(details)); const QString id = idForName(name); const int numberOfIpAddresses = netstatus_interface_get_num_ip_addresses(details); const bool isConnected = netstatus_interface_is_connected(details); const netstatus_interface_type_t type = netstatus_interface_get_type(details); netstatus_free_interface_details(&details); QNetworkConfiguration::StateFlags state = QNetworkConfiguration::Defined; if (isConnected && (numberOfIpAddresses > 0)) state |= QNetworkConfiguration::Active; QMutexLocker locker(&mutex); if (accessPointConfigurations.contains(id)) { QNetworkConfigurationPrivatePointer ptr = accessPointConfigurations.value(id); bool changed = false; QMutexLocker ptrLocker(&ptr->mutex); if (!ptr->isValid) { ptr->isValid = true; changed = true; } if (ptr->name != name) { ptr->name = name; changed = true; } if (ptr->id != id) { ptr->id = id; changed = true; } if (ptr->state != state) { ptr->state = state; changed = true; } ptrLocker.unlock(); locker.unlock(); if (changed) { qBearerDebug() << Q_FUNC_INFO << "configuration changed:" << interface; Q_EMIT configurationChanged(ptr); } else { qBearerDebug() << Q_FUNC_INFO << "configuration has not changed."; } return; } QNetworkConfigurationPrivatePointer ptr(new QNetworkConfigurationPrivate); ptr->name = name; ptr->isValid = true; ptr->id = id; ptr->state = state; ptr->type = QNetworkConfiguration::InternetAccessPoint; ptr->bearerType = interfaceType(type); accessPointConfigurations.insert(id, ptr); configurationInterface.insert(id, name); locker.unlock(); qBearerDebug() << Q_FUNC_INFO << "configuration added:" << interface; Q_EMIT configurationAdded(ptr); }