--- a/qtmobility/src/bearer/qnetworksession_maemo.cpp Tue Apr 27 17:29:55 2010 +0300
+++ b/qtmobility/src/bearer/qnetworksession_maemo.cpp Tue May 11 16:58:44 2010 +0300
@@ -51,6 +51,61 @@
#include <netinet/in.h>
#include <arpa/inet.h>
+
+QDBusArgument &operator<<(QDBusArgument &argument,
+ const QtMobility::ICd2DetailsDBusStruct &icd2)
+{
+ argument.beginStructure();
+ argument << icd2.serviceType;
+ argument << icd2.serviceAttributes;
+ argument << icd2.setviceId;
+ argument << icd2.networkType;
+ argument << icd2.networkAttributes;
+ argument << icd2.networkId;
+ argument.endStructure();
+ return argument;
+}
+
+const QDBusArgument &operator>>(const QDBusArgument &argument,
+ QtMobility::ICd2DetailsDBusStruct &icd2)
+{
+ argument.beginStructure();
+ argument >> icd2.serviceType;
+ argument >> icd2.serviceAttributes;
+ argument >> icd2.setviceId;
+ argument >> icd2.networkType;
+ argument >> icd2.networkAttributes;
+ argument >> icd2.networkId;
+ argument.endStructure();
+ return argument;
+}
+
+const QDBusArgument &operator>>(const QDBusArgument &argument,
+ QtMobility::ICd2DetailsList &detailsList)
+{
+ argument.beginArray();
+ detailsList.clear();
+
+ while (!argument.atEnd()) {
+ QtMobility::ICd2DetailsDBusStruct element;
+ argument >> element;
+ detailsList.append(element);
+ }
+
+ argument.endArray();
+ return argument;
+}
+
+QDBusArgument &operator<<(QDBusArgument &argument,
+ const QtMobility::ICd2DetailsList &detailsList)
+{
+ argument.beginArray(qMetaTypeId<QtMobility::ICd2DetailsDBusStruct>());
+ for (int i = 0; i < detailsList.count(); ++i)
+ argument << detailsList[i];
+ argument.endArray();
+ return argument;
+}
+
QTM_BEGIN_NAMESPACE
static QHash<QString, QVariant> properties;
@@ -605,208 +660,206 @@
if ((activeConfig.state() & QNetworkConfiguration::Active) != QNetworkConfiguration::Active) {
state = QNetworkSession::Connecting;
emit q->stateChanged(state);
-
- QTimer::singleShot(0, this, SLOT(do_open()));
- return;
+ QTimer::singleShot(0, this, SLOT(do_open()));
+ return;
}
-
isOpen = (activeConfig.state() & QNetworkConfiguration::Active) == QNetworkConfiguration::Active;
if (isOpen)
emit quitPendingWaitsForOpened();
} else {
- /* We seem to be active so inform caller */
- emit quitPendingWaitsForOpened();
+ /* We seem to be active so inform caller */
+ emit quitPendingWaitsForOpened();
}
}
-
void QNetworkSessionPrivate::do_open()
{
icd_connection_flags flags = connectFlags;
- bool st;
- QString result;
QString iap = publicConfig.identifier();
if (state == QNetworkSession::Connected) {
#ifdef BEARER_MANAGEMENT_DEBUG
- qDebug() << "Already connected to" << activeConfig.identifier();
+ qDebug() << "Already connected to" << activeConfig.identifier();
#endif
emit q->stateChanged(QNetworkSession::Connected);
- emit quitPendingWaitsForOpened();
+ emit quitPendingWaitsForOpened();
return;
}
- Maemo::IcdConnectResult connect_result;
- Maemo::Icd icd(ICD_LONG_CONNECT_TIMEOUT);
- QNetworkConfiguration config;
if (publicConfig.type() == QNetworkConfiguration::UserChoice)
- config = activeConfig;
+ config = activeConfig;
else
- config = publicConfig;
+ config = publicConfig;
if (iap == OSSO_IAP_ANY) {
#ifdef BEARER_MANAGEMENT_DEBUG
- qDebug() << "connecting to default IAP" << iap;
+ qDebug() << "connecting to default IAP" << iap;
#endif
- st = icd.connect(flags, connect_result);
-
+ m_connectRequestTimer.start(ICD_LONG_CONNECT_TIMEOUT);
+ m_dbusInterface->asyncCall(ICD_DBUS_API_CONNECT_REQ, (uint)flags); // Return value ignored
+ m_asynchCallActive = true;
} else {
-
- QList<Maemo::ConnectParams> params;
- Maemo::ConnectParams param;
- param.connect.service_type = config.d->service_type;
- param.connect.service_attrs = config.d->service_attrs;
- param.connect.service_id = config.d->service_id;
- param.connect.network_type = config.d->iap_type;
- param.connect.network_attrs = config.d->network_attrs;
- if (config.d->network_attrs & ICD_NW_ATTR_IAPNAME)
- param.connect.network_id = QByteArray(iap.toLatin1());
- else
- param.connect.network_id = config.d->network_id;
- params.append(param);
+ ICd2DetailsDBusStruct icd2;
+ icd2.serviceType = config.d->service_type;
+ icd2.serviceAttributes = config.d->service_attrs;
+ icd2.setviceId = config.d->service_id;
+ icd2.networkType = config.d->iap_type;
+ icd2.networkAttributes = config.d->network_attrs;
+ if (config.d->network_attrs & ICD_NW_ATTR_IAPNAME) {
+ icd2.networkId = QByteArray(iap.toLatin1());
+ } else {
+ icd2.networkId = config.d->network_id;
+ }
#ifdef BEARER_MANAGEMENT_DEBUG
- qDebug("connecting to %s/%s/0x%x/%s/0x%x/%s",
- param.connect.network_id.data(),
- param.connect.network_type.toAscii().constData(),
- param.connect.network_attrs,
- param.connect.service_type.toAscii().constData(),
- param.connect.service_attrs,
- param.connect.service_id.toAscii().constData());
-#endif
- st = icd.connect(flags, params, connect_result);
- }
-
- if (st) {
- result = connect_result.connect.network_id.data();
- QString connected_iap = result;
-
- if (connected_iap.isEmpty()) {
-#ifdef BEARER_MANAGEMENT_DEBUG
- qDebug() << "connect to"<< iap << "failed, result is empty";
-#endif
- updateState(QNetworkSession::Disconnected);
- emit q->error(QNetworkSession::InvalidConfigurationError);
- if (publicConfig.type() == QNetworkConfiguration::UserChoice)
- copyConfig(publicConfig, activeConfig);
- return;
- }
-
- /* If the user tried to connect to some specific connection (foo)
- * and we were already connected to some other connection (bar),
- * then we cannot activate this session although icd has a valid
- * connection to somewhere.
- */
- if ((publicConfig.type() != QNetworkConfiguration::UserChoice) &&
- (connected_iap != config.identifier())) {
- updateState(QNetworkSession::Disconnected);
- emit q->error(QNetworkSession::InvalidConfigurationError);
- return;
- }
-
-
- /* Did we connect to non saved IAP? */
- if (!(config.d->network_attrs & ICD_NW_ATTR_IAPNAME)) {
- /* Because the connection succeeded, the IAP is now known.
- */
- config.d->network_attrs |= ICD_NW_ATTR_IAPNAME;
- config.d->id = connected_iap;
- }
-
- /* User might have changed the IAP name when a new IAP was saved */
- Maemo::IAPConf iap_name(config.d->id);
- QString name = iap_name.value("name").toString();
- if (!name.isEmpty())
- config.d->name = name;
-
- config.d->iap_type = connect_result.connect.network_type;
-
- config.d->isValid = true;
- config.d->state = QNetworkConfiguration::Active;
- config.d->type = QNetworkConfiguration::InternetAccessPoint;
-
- startTime = QDateTime::currentDateTime();
- updateState(QNetworkSession::Connected);
-
- currentNetworkInterface = get_network_interface();
-
-#ifdef BEARER_MANAGEMENT_DEBUG
- qDebug() << "connected to" << result << config.d->name << "at" << currentNetworkInterface;
+ qDebug("connecting to %s/%s/0x%x/%s/0x%x/%s",
+ icd2.networkId.data(),
+ icd2.networkType.toAscii().constData(),
+ icd2.networkAttributes,
+ icd2.serviceType.toAscii().constData(),
+ icd2.serviceAttributes,
+ icd2.setviceId.toAscii().constData());
#endif
- /* We first check if the configuration already exists in the manager
- * and if it is not found there, we then insert it. Note that this
- * is only done for user choice config only because it can be missing
- * from config manager list.
- */
+ ICd2DetailsList paramArray;
+ paramArray.append(icd2);
+ m_connectRequestTimer.start(ICD_LONG_CONNECT_TIMEOUT);
+ m_dbusInterface->asyncCall(ICD_DBUS_API_CONNECT_REQ, (uint)flags, QVariant::fromValue(paramArray)); // Return value ignored
+ m_asynchCallActive = true;
+ }
+}
+
+ void QNetworkSessionPrivate::stateChange(const QDBusMessage& rep)
+{
+ if (m_asynchCallActive == true) {
+ if (m_connectRequestTimer.isActive())
+ m_connectRequestTimer.stop();
+ m_asynchCallActive = false;
+
+ QString result = rep.arguments().at(5).toString(); // network id or empty string
+ QString connected_iap = result;
+ if (connected_iap.isEmpty()) {
+#ifdef BEARER_MANAGEMENT_DEBUG
+ qDebug() << "connect to"<< publicConfig.identifier() << "failed, result is empty";
+#endif
+ updateState(QNetworkSession::Disconnected);
+ emit q->error(QNetworkSession::InvalidConfigurationError);
+ if (publicConfig.type() == QNetworkConfiguration::UserChoice)
+ copyConfig(publicConfig, activeConfig);
+ return;
+ }
- if (publicConfig.d->type == QNetworkConfiguration::UserChoice) {
+ /* If the user tried to connect to some specific connection (foo)
+ * and we were already connected to some other connection (bar),
+ * then we cannot activate this session although icd has a valid
+ * connection to somewhere.
+ */
+ if ((publicConfig.type() != QNetworkConfiguration::UserChoice) &&
+ (connected_iap != config.identifier())) {
+ updateState(QNetworkSession::Disconnected);
+ emit q->error(QNetworkSession::InvalidConfigurationError);
+ return;
+ }
+
+ /* Did we connect to non saved IAP? */
+ if (!(config.d->network_attrs & ICD_NW_ATTR_IAPNAME)) {
+ /* Because the connection succeeded, the IAP is now known.
+ */
+ config.d->network_attrs |= ICD_NW_ATTR_IAPNAME;
+ config.d->id = connected_iap;
+ }
+ /* User might have changed the IAP name when a new IAP was saved */
+ Maemo::IAPConf iap_name(config.d->id);
+ QString name = iap_name.value("name").toString();
+ if (!name.isEmpty())
+ config.d->name = name;
+
+ config.d->iap_type = rep.arguments().at(3).toString(); // connect_result.connect.network_type;
+ config.d->isValid = true;
+ config.d->state = QNetworkConfiguration::Active;
+ config.d->type = QNetworkConfiguration::InternetAccessPoint;
+
+ startTime = QDateTime::currentDateTime();
+ updateState(QNetworkSession::Connected);
+ //currentNetworkInterface = get_network_interface();
+#ifdef BEARER_MANAGEMENT_DEBUG
+ //qDebug() << "connected to" << result << config.d->name << "at" << currentNetworkInterface;
+#endif
+
+ /* We first check if the configuration already exists in the manager
+ * and if it is not found there, we then insert it. Note that this
+ * is only done for user choice config only because it can be missing
+ * from config manager list.
+ */
+ if (publicConfig.d->type == QNetworkConfiguration::UserChoice) {
#ifdef BEARER_MANAGEMENT_DEBUG
#if 0
- QList<QNetworkConfiguration> configs;
- QNetworkConfigurationManagerPrivate *conPriv = (QNetworkConfigurationManagerPrivate*)config.d.data()->manager;
- QList<QString> cpsIdents = conPriv->accessPointConfigurations.keys();
- foreach( QString ii, cpsIdents) {
- QExplicitlySharedDataPointer<QNetworkConfigurationPrivate> p =
- conPriv->accessPointConfigurations.value(ii);
- QNetworkConfiguration pt;
- pt.d = conPriv->accessPointConfigurations.value(ii);
- configs << pt;
- }
+ QList<QNetworkConfiguration> configs;
+ QNetworkConfigurationManagerPrivate *conPriv = (QNetworkConfigurationManagerPrivate*)config.d.data()->manager;
+ QList<QString> cpsIdents = conPriv->accessPointConfigurations.keys();
+ foreach( QString ii, cpsIdents) {
+ QExplicitlySharedDataPointer<QNetworkConfigurationPrivate> p =
+ conPriv->accessPointConfigurations.value(ii);
+ QNetworkConfiguration pt;
+ pt.d = conPriv->accessPointConfigurations.value(ii);
+ configs << pt;
+ }
- int all = configs.count();
- qDebug() << "All configurations:" << all;
- foreach(QNetworkConfiguration p, configs) {
- qDebug() << p.name() <<": isvalid->" <<p.isValid() << " type->"<< p.type() <<
- " roaming->" << p.isRoamingAvailable() << "identifier->" << p.identifier() <<
- " purpose->" << p.purpose() << " state->" << p.state();
- }
+ int all = configs.count();
+ qDebug() << "All configurations:" << all;
+ foreach(QNetworkConfiguration p, configs) {
+ qDebug() << p.name() <<": isvalid->" <<p.isValid() << " type->"<< p.type() <<
+ " roaming->" << p.isRoamingAvailable() << "identifier->" << p.identifier() <<
+ " purpose->" << p.purpose() << " state->" << p.state();
+ }
#endif
#endif
QNetworkConfigurationManagerPrivate *mgr = (QNetworkConfigurationManagerPrivate*)publicConfig.d.data()->manager;
if (!mgr->accessPointConfigurations.contains(result)) {
- QExplicitlySharedDataPointer<QNetworkConfigurationPrivate> ptr = config.d;
- mgr->accessPointConfigurations.insert(result, ptr);
+ QExplicitlySharedDataPointer<QNetworkConfigurationPrivate> ptr = config.d;
+ mgr->accessPointConfigurations.insert(result, ptr);
- QNetworkConfiguration item;
- item.d = ptr;
- emit mgr->configurationAdded(item);
+ QNetworkConfiguration item;
+ item.d = ptr;
+ emit mgr->configurationAdded(item);
#ifdef BEARER_MANAGEMENT_DEBUG
- //qDebug()<<"New configuration"<<result<<"added to manager in open";
+ qDebug()<<"New configuration"<<result<<"added to manager in open";
#endif
- } else {
+ } else {
QExplicitlySharedDataPointer<QNetworkConfigurationPrivate> priv = mgr->accessPointConfigurations.value(result);
- QNetworkConfiguration reference;
- reference.d = priv;
+ QNetworkConfiguration reference;
+ reference.d = priv;
copyConfig(config, reference, false);
reference.d.data()->id = result; // Note: Id was not copied in copyConfig() function
config = reference;
activeConfig = reference;
#ifdef BEARER_MANAGEMENT_DEBUG
- //qDebug()<<"Existing configuration"<<result<<"updated in manager in open";
+ qDebug()<<"Existing configuration"<<result<<"updated in manager in open";
#endif
- }
- }
-
- emit quitPendingWaitsForOpened();
+ }
+ }
- } else {
-#ifdef BEARER_MANAGEMENT_DEBUG
- qDebug() << "connect to"<< iap << "failed, status:" << connect_result.status;
-#endif
- updateState(QNetworkSession::Disconnected);
- if (publicConfig.type() == QNetworkConfiguration::UserChoice)
+ emit quitPendingWaitsForOpened();
+ }
+}
+
+void QNetworkSessionPrivate::connectTimeout()
+{
+ updateState(QNetworkSession::Disconnected);
+ if (publicConfig.type() == QNetworkConfiguration::UserChoice)
copyConfig(publicConfig, activeConfig);
- emit q->error(QNetworkSession::UnknownSessionError);
- }
+ emit q->error(QNetworkSession::UnknownSessionError);
}
void QNetworkSessionPrivate::close()
{
+ if (m_connectRequestTimer.isActive())
+ m_connectRequestTimer.stop();
+
if (serviceConfig.isValid()) {
lastError = QNetworkSession::OperationNotSupportedError;
emit q->error(lastError);
@@ -820,6 +873,9 @@
void QNetworkSessionPrivate::stop()
{
+ if (m_connectRequestTimer.isActive())
+ m_connectRequestTimer.stop();
+
if (serviceConfig.isValid()) {
lastError = QNetworkSession::OperationNotSupportedError;
emit q->error(lastError);