Support dual sim in QtBearer's networkmanager backend
Task-number: QTBUG-42368 Change-Id: I306733b5de7871fdeaa0accb512a3610753c84a5 Reviewed-by: Alex Blasche <alexander.blasche@digia.com>
This commit is contained in:
parent
13401116cc
commit
999fa63482
@ -112,7 +112,8 @@ QString QOfonoManagerInterface::currentModem()
|
||||
QStringList modems = getModems();
|
||||
foreach (const QString &modem, modems) {
|
||||
QOfonoModemInterface device(modem);
|
||||
if (device.isPowered() && device.isOnline())
|
||||
if (device.isPowered() && device.isOnline()
|
||||
&& device.interfaces().contains(QStringLiteral("org.ofono.NetworkRegistration")))
|
||||
return modem;
|
||||
}
|
||||
return QString();
|
||||
@ -169,6 +170,12 @@ bool QOfonoModemInterface::isOnline()
|
||||
return qdbus_cast<bool>(var);
|
||||
}
|
||||
|
||||
QStringList QOfonoModemInterface::interfaces()
|
||||
{
|
||||
const QVariant var = getProperty(QStringLiteral("Interfaces"));
|
||||
return var.toStringList();
|
||||
}
|
||||
|
||||
QVariantMap QOfonoModemInterface::getProperties()
|
||||
{
|
||||
if (propertiesMap.isEmpty()) {
|
||||
|
@ -115,6 +115,7 @@ public:
|
||||
|
||||
bool isPowered();
|
||||
bool isOnline();
|
||||
QStringList interfaces();
|
||||
private:
|
||||
QVariantMap getProperties();
|
||||
QVariantMap propertiesMap;
|
||||
|
@ -58,9 +58,7 @@ QNetworkManagerEngine::QNetworkManagerEngine(QObject *parent)
|
||||
: QBearerEngineImpl(parent),
|
||||
managerInterface(new QNetworkManagerInterface(this)),
|
||||
systemSettings(new QNetworkManagerSettings(NM_DBUS_SERVICE, this)),
|
||||
ofonoManager(new QOfonoManagerInterface(this)),
|
||||
ofonoNetwork(0),
|
||||
ofonoContextManager(0)
|
||||
ofonoManager(new QOfonoManagerInterface(this))
|
||||
{
|
||||
|
||||
if (!managerInterface->isValid())
|
||||
@ -97,16 +95,22 @@ QNetworkManagerEngine::~QNetworkManagerEngine()
|
||||
interfaceDevices.clear();
|
||||
|
||||
connectionInterfaces.clear();
|
||||
|
||||
qDeleteAll(ofonoContextManagers);
|
||||
ofonoContextManagers.clear();
|
||||
}
|
||||
|
||||
void QNetworkManagerEngine::initialize()
|
||||
{
|
||||
QMutexLocker locker(&mutex);
|
||||
|
||||
connect(ofonoManager,SIGNAL(modemChanged()),this,SLOT(changedModem()));
|
||||
ofonoNetwork = new QOfonoNetworkRegistrationInterface(ofonoManager->currentModem(),this);
|
||||
ofonoContextManager = new QOfonoDataConnectionManagerInterface(ofonoManager->currentModem(),this);
|
||||
|
||||
if (ofonoManager->isValid()) {
|
||||
Q_FOREACH (const QString &modem, ofonoManager->getModems()) {
|
||||
QOfonoDataConnectionManagerInterface *ofonoContextManager
|
||||
= new QOfonoDataConnectionManagerInterface(modem,this);
|
||||
ofonoContextManagers.insert(modem, ofonoContextManager);
|
||||
}
|
||||
}
|
||||
// Get current list of access points.
|
||||
foreach (const QDBusObjectPath &devicePath, managerInterface->getDevices()) {
|
||||
locker.unlock();
|
||||
@ -746,11 +750,14 @@ QNetworkConfigurationPrivate *QNetworkManagerEngine::parseConnection(const QStri
|
||||
}
|
||||
}
|
||||
} else if (connectionType == QLatin1String("gsm")) {
|
||||
cpPriv->bearerType = currentBearerType();
|
||||
|
||||
const QString contextPath = map.value("connection").value("id").toString();
|
||||
cpPriv->name = contextName(contextPath);
|
||||
cpPriv->bearerType = currentBearerType(contextPath);
|
||||
|
||||
if (map.value("connection").contains("timestamp")) {
|
||||
cpPriv->state |= QNetworkConfiguration::Discovered;
|
||||
}
|
||||
cpPriv->name = contextName(map.value("connection").value("id").toString());
|
||||
}
|
||||
|
||||
return cpPriv;
|
||||
@ -889,51 +896,52 @@ QNetworkConfigurationPrivatePointer QNetworkManagerEngine::defaultConfiguration(
|
||||
return QNetworkConfigurationPrivatePointer();
|
||||
}
|
||||
|
||||
void QNetworkManagerEngine::changedModem()
|
||||
QNetworkConfiguration::BearerType QNetworkManagerEngine::currentBearerType(const QString &id)
|
||||
{
|
||||
if (ofonoNetwork)
|
||||
delete ofonoNetwork;
|
||||
if (ofonoManager->isValid()) {
|
||||
QString contextPart = id.section('/', -1);
|
||||
|
||||
ofonoNetwork = new QOfonoNetworkRegistrationInterface(ofonoManager->currentModem(),this);
|
||||
QHashIterator<QString, QOfonoDataConnectionManagerInterface*> i(ofonoContextManagers);
|
||||
while (i.hasNext()) {
|
||||
i.next();
|
||||
QString contextPath = i.key() +"/"+contextPart;
|
||||
if (i.value()->contexts().contains(contextPath)) {
|
||||
|
||||
if (ofonoContextManager)
|
||||
delete ofonoContextManager;
|
||||
ofonoContextManager = new QOfonoDataConnectionManagerInterface(ofonoManager->currentModem(),this);
|
||||
}
|
||||
|
||||
QNetworkConfiguration::BearerType QNetworkManagerEngine::currentBearerType()
|
||||
{
|
||||
if (ofonoContextManager) {
|
||||
QString bearer = ofonoContextManager->bearer();
|
||||
if (bearer == QLatin1String("gsm")) {
|
||||
QString bearer = i.value()->bearer();
|
||||
if (bearer == QStringLiteral("gsm")) {
|
||||
return QNetworkConfiguration::Bearer2G;
|
||||
} else if (bearer == QLatin1String("edge")) {
|
||||
} else if (bearer == QStringLiteral("edge")) {
|
||||
return QNetworkConfiguration::Bearer2G;
|
||||
} else if (bearer == QLatin1String("umts")) {
|
||||
} else if (bearer == QStringLiteral("umts")) {
|
||||
return QNetworkConfiguration::BearerWCDMA;
|
||||
} else if (bearer == QLatin1String("hspa")
|
||||
|| bearer == QLatin1String("hsdpa")
|
||||
|| bearer == QLatin1String("hsupa")) {
|
||||
} else if (bearer == QStringLiteral("hspa")
|
||||
|| bearer == QStringLiteral("hsdpa")
|
||||
|| bearer == QStringLiteral("hsupa")) {
|
||||
return QNetworkConfiguration::BearerHSPA;
|
||||
} else if (bearer == QLatin1String("lte")) {
|
||||
} else if (bearer == QStringLiteral("lte")) {
|
||||
return QNetworkConfiguration::BearerLTE;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return QNetworkConfiguration::BearerUnknown;
|
||||
}
|
||||
|
||||
QString QNetworkManagerEngine::contextName(const QString &path)
|
||||
{
|
||||
if (ofonoContextManager) {
|
||||
if (ofonoManager->isValid()) {
|
||||
QString contextPart = path.section('/', -1);
|
||||
|
||||
Q_FOREACH (const QString &oContext, ofonoContextManager->contexts()) {
|
||||
QHashIterator<QString, QOfonoDataConnectionManagerInterface*> i(ofonoContextManagers);
|
||||
while (i.hasNext()) {
|
||||
i.next();
|
||||
Q_FOREACH (const QString &oContext, i.value()->contexts()) {
|
||||
if (oContext.contains(contextPart)) {
|
||||
QOfonoConnectionContextInterface contextInterface(oContext,this);
|
||||
return contextInterface.name();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return path;
|
||||
}
|
||||
|
||||
|
@ -106,7 +106,6 @@ private Q_SLOTS:
|
||||
void newAccessPoint(const QString &path);
|
||||
void removeAccessPoint(const QString &path);
|
||||
void scanFinished();
|
||||
void changedModem();
|
||||
|
||||
private:
|
||||
QNetworkConfigurationPrivate *parseConnection(const QString &settingsPath,
|
||||
@ -125,9 +124,8 @@ private:
|
||||
QHash<QString,QString> connectionInterfaces; // ac, interface
|
||||
|
||||
QOfonoManagerInterface *ofonoManager;
|
||||
QOfonoNetworkRegistrationInterface *ofonoNetwork;
|
||||
QOfonoDataConnectionManagerInterface *ofonoContextManager;
|
||||
QNetworkConfiguration::BearerType currentBearerType();
|
||||
QHash <QString, QOfonoDataConnectionManagerInterface *> ofonoContextManagers;
|
||||
QNetworkConfiguration::BearerType currentBearerType(const QString &id);
|
||||
QString contextName(const QString &path);
|
||||
|
||||
};
|
||||
|
Loading…
Reference in New Issue
Block a user