summaryrefslogtreecommitdiffstats
path: root/src/network/bearer
diff options
context:
space:
mode:
authorAaron McCarthy <aaron.mccarthy@nokia.com>2009-12-01 05:46:59 (GMT)
committerAaron McCarthy <aaron.mccarthy@nokia.com>2009-12-22 04:41:49 (GMT)
commit27b47c630f8b71897ba56c983c24afe1538f33dc (patch)
tree1c9c3695c97fd2e1626e7a5c6ca0d3296d71d887 /src/network/bearer
parentd5b6c723973449914134231c01a381ef9af9f6d4 (diff)
downloadQt-27b47c630f8b71897ba56c983c24afe1538f33dc.zip
Qt-27b47c630f8b71897ba56c983c24afe1538f33dc.tar.gz
Qt-27b47c630f8b71897ba56c983c24afe1538f33dc.tar.bz2
Convert generic engine into a plugin.
Diffstat (limited to 'src/network/bearer')
-rw-r--r--src/network/bearer/bearer.pri12
-rw-r--r--src/network/bearer/qbearerplugin.cpp58
-rw-r--r--src/network/bearer/qbearerplugin.h (renamed from src/network/bearer/qgenericengine_p.h)58
-rw-r--r--src/network/bearer/qgenericengine.cpp234
-rw-r--r--src/network/bearer/qnetworkconfigmanager.cpp7
-rw-r--r--src/network/bearer/qnetworkconfigmanager_p.cpp23
-rw-r--r--src/network/bearer/qnetworkconfigmanager_p.h4
-rw-r--r--src/network/bearer/qnetworkconfiguration_p.h2
-rw-r--r--src/network/bearer/qnetworksession_p.cpp10
-rw-r--r--src/network/bearer/qnetworksessionengine_p.h4
10 files changed, 125 insertions, 287 deletions
diff --git a/src/network/bearer/bearer.pri b/src/network/bearer/bearer.pri
index d8ddce5..4f53621 100644
--- a/src/network/bearer/bearer.pri
+++ b/src/network/bearer/bearer.pri
@@ -4,11 +4,13 @@
HEADERS += bearer/qnetworkconfiguration.h \
bearer/qnetworksession.h \
- bearer/qnetworkconfigmanager.h
+ bearer/qnetworkconfigmanager.h \
+ bearer/qbearerplugin.h
SOURCES += bearer/qnetworksession.cpp \
bearer/qnetworkconfigmanager.cpp \
- bearer/qnetworkconfiguration.cpp
+ bearer/qnetworkconfiguration.cpp \
+ bearer/qbearerplugin.cpp
symbian {
exists($${EPOCROOT}epoc32/release/winscw/udeb/cmmanager.lib)| \
@@ -72,13 +74,11 @@ symbian {
HEADERS += bearer/qnetworkconfigmanager_p.h \
bearer/qnetworkconfiguration_p.h \
bearer/qnetworksession_p.h \
- bearer/qnetworksessionengine_p.h \
- bearer/qgenericengine_p.h
+ bearer/qnetworksessionengine_p.h
SOURCES += bearer/qnetworkconfigmanager_p.cpp \
bearer/qnetworksession_p.cpp \
- bearer/qnetworksessionengine.cpp \
- bearer/qgenericengine.cpp
+ bearer/qnetworksessionengine.cpp
unix:!mac:contains(networkmanager_enabled, yes) {
contains(QT_CONFIG,dbus) {
diff --git a/src/network/bearer/qbearerplugin.cpp b/src/network/bearer/qbearerplugin.cpp
new file mode 100644
index 0000000..252ee71
--- /dev/null
+++ b/src/network/bearer/qbearerplugin.cpp
@@ -0,0 +1,58 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the QtNetwork module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "qbearerplugin.h"
+
+#include <QtCore/qdebug.h>
+
+QT_BEGIN_NAMESPACE
+
+QBearerEnginePlugin::QBearerEnginePlugin(QObject *parent)
+: QObject(parent)
+{
+ qDebug() << Q_FUNC_INFO;
+}
+
+QBearerEnginePlugin::~QBearerEnginePlugin()
+{
+}
+
+QT_END_NAMESPACE
diff --git a/src/network/bearer/qgenericengine_p.h b/src/network/bearer/qbearerplugin.h
index 28d6e90..036d712 100644
--- a/src/network/bearer/qgenericengine_p.h
+++ b/src/network/bearer/qbearerplugin.h
@@ -39,56 +39,44 @@
**
****************************************************************************/
-#ifndef QGENERICENGINE_P_H
-#define QGENERICENGINE_P_H
-
-//
-// W A R N I N G
-// -------------
-//
-// This file is not part of the Qt API. It exists purely as an
-// implementation detail. This header file may change from version to
-// version without notice, or even be removed.
-//
-// We mean it.
-//
+#ifndef QBEARERPLUGIN_H
+#define QBEARERPLUGIN_H
#include "qnetworksessionengine_p.h"
-#include <QMap>
-#include <QTimer>
+#include <QtCore/qplugin.h>
+#include <QtCore/qfactoryinterface.h>
+
+QT_BEGIN_HEADER
QT_BEGIN_NAMESPACE
-class QNetworkConfigurationPrivate;
+QT_MODULE(Network)
-class QGenericEngine : public QNetworkSessionEngine
+struct Q_NETWORK_EXPORT QBearerEngineFactoryInterface : public QFactoryInterface
{
- Q_OBJECT
-
-public:
- QGenericEngine(QObject *parent = 0);
- ~QGenericEngine();
-
- QList<QNetworkConfigurationPrivate *> getConfigurations(bool *ok = 0);
- QString getInterfaceFromId(const QString &id);
- bool hasIdentifier(const QString &id);
-
- QString bearerName(const QString &id);
+ virtual QBearerEngine *create(const QString &key = QString()) const = 0;
+};
- void connectToId(const QString &id);
- void disconnectFromId(const QString &id);
+#define QBearerEngineFactoryInterface_iid "com.trolltech.Qt.QBearerEngineFactoryInterface"
+Q_DECLARE_INTERFACE(QBearerEngineFactoryInterface, QBearerEngineFactoryInterface_iid)
- void requestUpdate();
+class Q_NETWORK_EXPORT QBearerEnginePlugin : public QObject, public QBearerEngineFactoryInterface
+{
+ Q_OBJECT
+ Q_INTERFACES(QBearerEngineFactoryInterface:QFactoryInterface)
- static QGenericEngine *instance();
+public:
+ explicit QBearerEnginePlugin(QObject *parent = 0);
+ virtual ~QBearerEnginePlugin();
-private:
- QMap<uint, QString> configurationInterface;
- QTimer pollTimer;
+ virtual QStringList keys() const = 0;
+ virtual QBearerEngine *create(const QString &key = QString()) const = 0;
};
QT_END_NAMESPACE
+QT_END_HEADER
+
#endif
diff --git a/src/network/bearer/qgenericengine.cpp b/src/network/bearer/qgenericengine.cpp
deleted file mode 100644
index d14f0fa..0000000
--- a/src/network/bearer/qgenericengine.cpp
+++ /dev/null
@@ -1,234 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
-** All rights reserved.
-** Contact: Nokia Corporation (qt-info@nokia.com)
-**
-** This file is part of the QtNetwork module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** No Commercial Usage
-** This file contains pre-release code and may not be distributed.
-** You may use this file in accordance with the terms and conditions
-** contained in the Technology Preview License Agreement accompanying
-** this package.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 2.1 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 2.1 requirements
-** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
-**
-** In addition, as a special exception, Nokia gives you certain additional
-** rights. These rights are described in the Nokia Qt LGPL Exception
-** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
-**
-** If you have questions regarding the use of this file, please contact
-** Nokia at qt-info@nokia.com.
-**
-**
-**
-**
-**
-**
-**
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#include "qgenericengine_p.h"
-#include "qnetworkconfiguration_p.h"
-
-#include <QtCore/qthread.h>
-#include <QtCore/qmutex.h>
-#include <QtCore/qcoreapplication.h>
-#include <QtCore/qstringlist.h>
-
-#include <QtCore/qdebug.h>
-
-#ifdef Q_OS_WIN
-#include "qnetworksessionengine_win_p.h"
-#endif
-
-QT_BEGIN_NAMESPACE
-
-Q_GLOBAL_STATIC(QGenericEngine, genericEngine)
-
-static QString qGetInterfaceType(const QString &interface)
-{
-#ifdef Q_OS_WIN32
- unsigned long oid;
- DWORD bytesWritten;
-
- NDIS_MEDIUM medium;
- NDIS_PHYSICAL_MEDIUM physicalMedium;
-
- HANDLE handle = CreateFile((TCHAR *)QString("\\\\.\\%1").arg(interface).utf16(), 0,
- FILE_SHARE_READ, 0, OPEN_EXISTING, 0, 0);
- if (handle == INVALID_HANDLE_VALUE)
- return QString();
-
- oid = OID_GEN_MEDIA_SUPPORTED;
- bytesWritten = 0;
- bool result = DeviceIoControl(handle, IOCTL_NDIS_QUERY_GLOBAL_STATS, &oid, sizeof(oid),
- &medium, sizeof(medium), &bytesWritten, 0);
- if (!result) {
- CloseHandle(handle);
- return QString();
- }
-
- oid = OID_GEN_PHYSICAL_MEDIUM;
- bytesWritten = 0;
- result = DeviceIoControl(handle, IOCTL_NDIS_QUERY_GLOBAL_STATS, &oid, sizeof(oid),
- &physicalMedium, sizeof(physicalMedium), &bytesWritten, 0);
- if (!result) {
- CloseHandle(handle);
-
- if (medium == NdisMedium802_3)
- return QLatin1String("Ethernet");
- else
- return QString();
- }
-
- CloseHandle(handle);
-
- if (medium == NdisMedium802_3) {
- switch (physicalMedium) {
- case NdisPhysicalMediumWirelessLan:
- return QLatin1String("WLAN");
- case NdisPhysicalMediumBluetooth:
- return QLatin1String("Bluetooth");
- case NdisPhysicalMediumWiMax:
- return QLatin1String("WiMAX");
- default:
-#ifdef BEARER_MANAGEMENT_DEBUG
- qDebug() << "Physical Medium" << physicalMedium;
-#endif
- return QLatin1String("Ethernet");
- }
- }
-
-#ifdef BEARER_MANAGEMENT_DEBUG
- qDebug() << medium << physicalMedium;
-#endif
-#else
- Q_UNUSED(interface);
-#endif
-
- return QString();
-}
-
-QGenericEngine::QGenericEngine(QObject *parent)
-: QNetworkSessionEngine(parent)
-{
- connect(&pollTimer, SIGNAL(timeout()), this, SIGNAL(configurationsChanged()));
- pollTimer.setInterval(10000);
-}
-
-QGenericEngine::~QGenericEngine()
-{
-}
-
-QList<QNetworkConfigurationPrivate *> QGenericEngine::getConfigurations(bool *ok)
-{
- if (ok)
- *ok = true;
-
- QList<QNetworkConfigurationPrivate *> foundConfigurations;
-
- // Immediately after connecting with a wireless access point
- // QNetworkInterface::allInterfaces() will sometimes return an empty list. Calling it again a
- // second time results in a non-empty list. If we loose interfaces we will end up removing
- // network configurations which will break current sessions.
- QList<QNetworkInterface> interfaces = QNetworkInterface::allInterfaces();
- if (interfaces.isEmpty())
- interfaces = QNetworkInterface::allInterfaces();
-
- // create configuration for each interface
- while (!interfaces.isEmpty()) {
- QNetworkInterface interface = interfaces.takeFirst();
-
- if (!interface.isValid())
- continue;
-
- // ignore loopback interface
- if (interface.flags() & QNetworkInterface::IsLoopBack)
- continue;
-
- // ignore WLAN interface handled in seperate engine
- if (qGetInterfaceType(interface.name()) == QLatin1String("WLAN"))
- continue;
-
- QNetworkConfigurationPrivate *cpPriv = new QNetworkConfigurationPrivate;
- const QString humanReadableName = interface.humanReadableName();
- cpPriv->name = humanReadableName.isEmpty() ? interface.name() : humanReadableName;
- cpPriv->isValid = true;
-
- uint identifier;
- if (interface.index())
- identifier = qHash(QLatin1String("NLA:") + QString::number(interface.index()));
- else
- identifier = qHash(QLatin1String("NLA:") + interface.hardwareAddress());
-
- cpPriv->id = QString::number(identifier);
- cpPriv->state = QNetworkConfiguration::Discovered;
- cpPriv->type = QNetworkConfiguration::InternetAccessPoint;
- if (interface.flags() & QNetworkInterface::IsUp)
- cpPriv->state |= QNetworkConfiguration::Active;
-
- configurationInterface[identifier] = interface.name();
-
- foundConfigurations.append(cpPriv);
- }
-
- pollTimer.start();
-
- return foundConfigurations;
-}
-
-QString QGenericEngine::getInterfaceFromId(const QString &id)
-{
- return configurationInterface.value(id.toUInt());
-}
-
-bool QGenericEngine::hasIdentifier(const QString &id)
-{
- return configurationInterface.contains(id.toUInt());
-}
-
-QString QGenericEngine::bearerName(const QString &id)
-{
- QString interface = getInterfaceFromId(id);
-
- if (interface.isEmpty())
- return QString();
-
- return qGetInterfaceType(interface);
-}
-
-void QGenericEngine::connectToId(const QString &id)
-{
- emit connectionError(id, OperationNotSupported);
-}
-
-void QGenericEngine::disconnectFromId(const QString &id)
-{
- emit connectionError(id, OperationNotSupported);
-}
-
-void QGenericEngine::requestUpdate()
-{
- emit configurationsChanged();
-}
-
-QGenericEngine *QGenericEngine::instance()
-{
- return genericEngine();
-}
-
-#include "moc_qgenericengine_p.cpp"
-QT_END_NAMESPACE
-
diff --git a/src/network/bearer/qnetworkconfigmanager.cpp b/src/network/bearer/qnetworkconfigmanager.cpp
index 5031dd4..02cc652 100644
--- a/src/network/bearer/qnetworkconfigmanager.cpp
+++ b/src/network/bearer/qnetworkconfigmanager.cpp
@@ -51,6 +51,13 @@ QT_BEGIN_NAMESPACE
Q_GLOBAL_STATIC(QNetworkConfigurationManagerPrivate, connManager);
+#ifndef Q_OS_SYMBIAN
+QNetworkConfigurationManagerPrivate *qNetworkConfigurationManagerPrivate()
+{
+ return connManager();
+}
+#endif
+
/*!
\class QNetworkConfigurationManager
diff --git a/src/network/bearer/qnetworkconfigmanager_p.cpp b/src/network/bearer/qnetworkconfigmanager_p.cpp
index 47b23d2..3e82ab7 100644
--- a/src/network/bearer/qnetworkconfigmanager_p.cpp
+++ b/src/network/bearer/qnetworkconfigmanager_p.cpp
@@ -40,7 +40,6 @@
****************************************************************************/
#include "qnetworkconfigmanager_p.h"
-#include "qgenericengine_p.h"
#ifdef Q_OS_WIN
#include "qnlaengine_win_p.h"
@@ -55,12 +54,19 @@
#include "qcorewlanengine_mac_p.h"
#endif
+#include "qbearerplugin.h"
+
+#include <QtCore/private/qfactoryloader_p.h>
+
#include <QtCore/qdebug.h>
#include <QtCore/qtimer.h>
#include <QtCore/qstringlist.h>
QT_BEGIN_NAMESPACE
+Q_GLOBAL_STATIC_WITH_ARGS(QFactoryLoader, loader,
+ (QBearerEngineFactoryInterface_iid, QLatin1String("/bearer")))
+
void QNetworkConfigurationManagerPrivate::registerPlatformCapabilities()
{
capFlags = QNetworkConfigurationManager::ForcedRoaming;
@@ -228,6 +234,9 @@ void QNetworkConfigurationManagerPrivate::updateConfigurations()
updateState = NotUpdating;
onlineConfigurations = 0;
+ QFactoryLoader *l = loader();
+ QStringList keys = l->keys();
+
#if defined (Q_OS_DARWIN)
coreWifi = QCoreWlanEngine::instance();
if (coreWifi) {
@@ -242,10 +251,14 @@ void QNetworkConfigurationManagerPrivate::updateConfigurations()
this, SLOT(updateConfigurations()));
} else {
#endif
- generic = QGenericEngine::instance();
- if (generic) {
- connect(generic, SIGNAL(configurationsChanged()),
- this, SLOT(updateConfigurations()));
+ QBearerEnginePlugin *genericPlugin =
+ qobject_cast<QBearerEnginePlugin *>(l->instance(QLatin1String("generic")));
+ if (genericPlugin) {
+ generic = genericPlugin->create(QLatin1String("generic"));
+ if (generic) {
+ connect(generic, SIGNAL(configurationsChanged()),
+ this, SLOT(updateConfigurations()));
+ }
}
#if defined(BACKEND_NM)
}
diff --git a/src/network/bearer/qnetworkconfigmanager_p.h b/src/network/bearer/qnetworkconfigmanager_p.h
index f2e2ee5..2ac6401 100644
--- a/src/network/bearer/qnetworkconfigmanager_p.h
+++ b/src/network/bearer/qnetworkconfigmanager_p.h
@@ -135,7 +135,7 @@ private:
#endif
#ifdef BEARER_ENGINE
- QGenericEngine *generic;
+ QNetworkSessionEngine *generic;
#ifdef Q_OS_WIN
QNlaEngine *nla;
#ifndef Q_OS_WINCE
@@ -173,6 +173,8 @@ private Q_SLOTS:
#endif
};
+QNetworkConfigurationManagerPrivate *qNetworkConfigurationManagerPrivate();
+
QT_END_NAMESPACE
#endif //QNETWORKCONFIGURATIONMANAGERPRIVATE_H
diff --git a/src/network/bearer/qnetworkconfiguration_p.h b/src/network/bearer/qnetworkconfiguration_p.h
index 69d7e18..f00bcfa 100644
--- a/src/network/bearer/qnetworkconfiguration_p.h
+++ b/src/network/bearer/qnetworkconfiguration_p.h
@@ -55,7 +55,7 @@
#include "qnetworkconfiguration.h"
#include <QtCore/qshareddata.h>
-#include <QNetworkInterface>
+#include <QtNetwork/QNetworkInterface>
QT_BEGIN_NAMESPACE
diff --git a/src/network/bearer/qnetworksession_p.cpp b/src/network/bearer/qnetworksession_p.cpp
index 8e39216..c2491ae 100644
--- a/src/network/bearer/qnetworksession_p.cpp
+++ b/src/network/bearer/qnetworksession_p.cpp
@@ -42,7 +42,7 @@
#include "qnetworksession_p.h"
#include "qnetworksession.h"
#include "qnetworksessionengine_p.h"
-#include "qgenericengine_p.h"
+#include "qnetworkconfigmanager_p.h"
#ifdef Q_OS_WIN
#include "qnlaengine_win_p.h"
@@ -81,6 +81,8 @@ static bool NetworkManagerAvailable()
static QNetworkSessionEngine *getEngineFromId(const QString &id)
{
+ QNetworkConfigurationManagerPrivate *priv = qNetworkConfigurationManagerPrivate();
+
#ifdef Q_OS_WIN
QNlaEngine *nla = QNlaEngine::instance();
if (nla && nla->hasIdentifier(id))
@@ -106,9 +108,9 @@ static QNetworkSessionEngine *getEngineFromId(const QString &id)
return coreWifi;
#endif
- QGenericEngine *generic = QGenericEngine::instance();
- if (generic && generic->hasIdentifier(id))
- return generic;
+ QNetworkSessionEngine *engine = priv->configurationEngine.value(id);
+ if (engine && engine->hasIdentifier(id))
+ return engine;
return 0;
}
diff --git a/src/network/bearer/qnetworksessionengine_p.h b/src/network/bearer/qnetworksessionengine_p.h
index 8eb17d4..9fbd4ac 100644
--- a/src/network/bearer/qnetworksessionengine_p.h
+++ b/src/network/bearer/qnetworksessionengine_p.h
@@ -61,7 +61,7 @@
QT_BEGIN_NAMESPACE
class QNetworkConfigurationPrivate;
-class QNetworkSessionEngine : public QObject
+class Q_NETWORK_EXPORT QNetworkSessionEngine : public QObject
{
Q_OBJECT
@@ -92,6 +92,8 @@ Q_SIGNALS:
void connectionError(const QString &id, QNetworkSessionEngine::ConnectionError error);
};
+typedef QNetworkSessionEngine QBearerEngine;
+
QT_END_NAMESPACE
#endif