File indexing completed on 2024-04-28 07:48:53

0001 /*
0002     SPDX-FileCopyrightText: 2008, 2011 Will Stephenson <wstephenson@kde.org>
0003     SPDX-FileCopyrightText: 2010 Lamarque Souza <lamarque@kde.org>
0004     SPDX-FileCopyrightText: 2013 Daniel Nicoletti <dantti12@gmail.com>
0005     SPDX-FileCopyrightText: 2013 Lukas Tinkl <ltinkl@redhat.com>
0006     SPDX-FileCopyrightText: 2013-2015 Jan Grulich <jgrulich@redhat.com>
0007 
0008     SPDX-License-Identifier: LGPL-2.1-only OR LGPL-3.0-only OR LicenseRef-KDE-Accepted-LGPL
0009 */
0010 
0011 #include "modem.h"
0012 #include "modem_p.h"
0013 
0014 #ifdef MMQT_STATIC
0015 #include "dbus/fakedbus.h"
0016 #else
0017 #include "dbus/dbus.h"
0018 #endif
0019 #include "generictypes_p.h"
0020 #include "mmdebug_p.h"
0021 
0022 #include <QTimer>
0023 
0024 namespace ModemManager
0025 {
0026 class ModemManager::BearerProperties::Private
0027 {
0028 public:
0029     Private()
0030     {
0031     }
0032     QString apn;
0033     MMBearerIpFamily ipType;
0034     MMBearerAllowedAuth allowedAuth;
0035     QString user;
0036     QString password;
0037     bool allowRoaming;
0038     MMModemCdmaRmProtocol rmProtocol;
0039     QString number;
0040 };
0041 
0042 }
0043 
0044 ModemManager::BearerProperties::BearerProperties()
0045     : d(new Private())
0046 {
0047 }
0048 
0049 ModemManager::BearerProperties::BearerProperties(const ModemManager::BearerProperties &other)
0050     : d(new Private)
0051 {
0052     *this = other;
0053 }
0054 
0055 ModemManager::BearerProperties::~BearerProperties()
0056 {
0057     delete d;
0058 }
0059 
0060 QString ModemManager::BearerProperties::apn() const
0061 {
0062     return d->apn;
0063 }
0064 
0065 void ModemManager::BearerProperties::setApn(const QString &apn)
0066 {
0067     d->apn = apn;
0068 }
0069 
0070 MMBearerIpFamily ModemManager::BearerProperties::ipType() const
0071 {
0072     return d->ipType;
0073 }
0074 
0075 void ModemManager::BearerProperties::setIpType(MMBearerIpFamily ipType)
0076 {
0077     d->ipType = ipType;
0078 }
0079 
0080 MMBearerAllowedAuth ModemManager::BearerProperties::allowedAuthentication() const
0081 {
0082     return d->allowedAuth;
0083 }
0084 
0085 void ModemManager::BearerProperties::setAllowedAuthentication(MMBearerAllowedAuth allowedAuth)
0086 {
0087     d->allowedAuth = allowedAuth;
0088 }
0089 
0090 QString ModemManager::BearerProperties::user() const
0091 {
0092     return d->user;
0093 }
0094 
0095 void ModemManager::BearerProperties::setUser(const QString &user)
0096 {
0097     d->user = user;
0098 }
0099 
0100 QString ModemManager::BearerProperties::password() const
0101 {
0102     return d->password;
0103 }
0104 
0105 void ModemManager::BearerProperties::setPassword(const QString &password)
0106 {
0107     d->password = password;
0108 }
0109 
0110 bool ModemManager::BearerProperties::allowRoaming() const
0111 {
0112     return d->allowRoaming;
0113 }
0114 
0115 void ModemManager::BearerProperties::setAllowRoaming(bool allow)
0116 {
0117     d->allowRoaming = allow;
0118 }
0119 
0120 MMModemCdmaRmProtocol ModemManager::BearerProperties::rmProtocol() const
0121 {
0122     return d->rmProtocol;
0123 }
0124 
0125 void ModemManager::BearerProperties::setRmProtocol(MMModemCdmaRmProtocol rmProtocol)
0126 {
0127     d->rmProtocol = rmProtocol;
0128 }
0129 
0130 QString ModemManager::BearerProperties::number() const
0131 {
0132     return d->number;
0133 }
0134 
0135 void ModemManager::BearerProperties::setNumber(const QString &number)
0136 {
0137     d->number = number;
0138 }
0139 
0140 ModemManager::BearerProperties &ModemManager::BearerProperties::operator=(const ModemManager::BearerProperties &other)
0141 {
0142     if (this == &other) {
0143         return *this;
0144     }
0145 
0146     *d = *other.d;
0147     return *this;
0148 }
0149 
0150 ModemManager::ModemPrivate::ModemPrivate(const QString &path, Modem *q)
0151     : InterfacePrivate(path, q)
0152 #ifdef MMQT_STATIC
0153     , modemIface(QLatin1String(MMQT_DBUS_SERVICE), path, QDBusConnection::sessionBus())
0154 #else
0155     , modemIface(QLatin1String(MMQT_DBUS_SERVICE), path, QDBusConnection::systemBus())
0156 #endif
0157     , q_ptr(q)
0158 {
0159     if (modemIface.isValid()) {
0160         simPath = modemIface.sim().path();
0161         Q_FOREACH (uint cap, modemIface.supportedCapabilities()) {
0162             supportedCapabilities.append((MMModemCapability)cap);
0163         }
0164         currentCapabilities = (QFlags<MMModemCapability>)modemIface.currentCapabilities();
0165         maxBearers = modemIface.maxBearers();
0166         maxActiveBearers = modemIface.maxActiveBearers();
0167         manufacturer = modemIface.manufacturer();
0168         model = modemIface.model();
0169         revision = modemIface.revision();
0170         deviceIdentifier = modemIface.deviceIdentifier();
0171         device = modemIface.device();
0172         drivers = modemIface.drivers();
0173         plugin = modemIface.plugin();
0174         primaryPort = modemIface.primaryPort();
0175         ports = modemIface.ports();
0176         equipmentIdentifier = modemIface.equipmentIdentifier();
0177         unlockRequired = (MMModemLock)modemIface.unlockRequired();
0178         unlockRetries = modemIface.unlockRetries();
0179         state = (MMModemState)modemIface.state();
0180         stateFailedReason = (MMModemStateFailedReason)modemIface.stateFailedReason();
0181         accessTechnologies = (ModemManager::Modem::AccessTechnologies)modemIface.accessTechnologies();
0182         signalQuality = modemIface.signalQuality();
0183         ownNumbers = modemIface.ownNumbers();
0184         powerState = (MMModemPowerState)modemIface.powerState();
0185         supportedModes = modemIface.supportedModes();
0186         currentModes = modemIface.currentModes();
0187         Q_FOREACH (uint band, modemIface.supportedBands()) {
0188             supportedBands.append((MMModemBand)band);
0189         }
0190         Q_FOREACH (uint band, modemIface.currentBands()) {
0191             currentBands.append((MMModemBand)band);
0192         }
0193         supportedIpFamilies = (ModemManager::Modem::IpBearerFamilies)modemIface.supportedIpFamilies();
0194 
0195         QTimer::singleShot(0, this, &ModemManager::ModemPrivate::initializeBearers);
0196     }
0197 }
0198 
0199 void ModemManager::ModemPrivate::initializeBearers()
0200 {
0201     Q_Q(Modem);
0202 
0203 #if MM_CHECK_VERSION(1, 2, 0)
0204     QList<QDBusObjectPath> bearersList = modemIface.bearers();
0205     Q_FOREACH (const QDBusObjectPath &bearer, bearersList) {
0206         if (!bearers.contains(bearer.path())) {
0207             bearers.insert(bearer.path(), Bearer::Ptr());
0208             Q_EMIT q->bearerAdded(bearer.path());
0209         }
0210     }
0211 #else
0212     QDBusPendingReply<QList<QDBusObjectPath>> reply = modemIface.ListBearers();
0213     reply.waitForFinished();
0214     if (reply.isValid()) {
0215         Q_FOREACH (const QDBusObjectPath &bearer, reply.value()) {
0216             if (!bearers.contains(bearer.path())) {
0217                 bearers.insert(bearer.path(), Bearer::Ptr());
0218                 Q_EMIT q->bearerAdded(bearer.path());
0219             }
0220         }
0221     }
0222 #endif
0223 }
0224 
0225 ModemManager::Modem::Modem(const QString &path, QObject *parent)
0226     : Interface(*new ModemPrivate(path, this), parent)
0227 {
0228     Q_D(Modem);
0229 
0230     qRegisterMetaType<AccessTechnologies>();
0231     qRegisterMetaType<Capabilities>();
0232     qRegisterMetaType<ModemModes>();
0233     qRegisterMetaType<IpBearerFamilies>();
0234     qRegisterMetaType<MMModemLock>();
0235     qRegisterMetaType<MMModemPowerState>();
0236     qRegisterMetaType<MMModemState>();
0237     qRegisterMetaType<MMModemStateChangeReason>();
0238     qRegisterMetaType<MMModemStateFailedReason>();
0239 
0240     if (d->modemIface.isValid()) {
0241 #ifdef MMQT_STATIC
0242         QDBusConnection::sessionBus().connect(QLatin1String(MMQT_DBUS_SERVICE),
0243                                               d->uni,
0244                                               QLatin1String(DBUS_INTERFACE_PROPS),
0245                                               QLatin1String("PropertiesChanged"),
0246                                               d,
0247                                               SLOT(onPropertiesChanged(QString, QVariantMap, QStringList)));
0248 #else
0249         QDBusConnection::systemBus().connect(QLatin1String(MMQT_DBUS_SERVICE),
0250                                              d->uni,
0251                                              QLatin1String(DBUS_INTERFACE_PROPS),
0252                                              QLatin1String("PropertiesChanged"),
0253                                              d,
0254                                              SLOT(onPropertiesChanged(QString, QVariantMap, QStringList)));
0255 #endif
0256     }
0257 
0258     connect(&d->modemIface, &OrgFreedesktopModemManager1ModemInterface::StateChanged, d, &ModemPrivate::onStateChanged);
0259 }
0260 
0261 ModemManager::Modem::~Modem()
0262 {
0263 }
0264 
0265 QString ModemManager::Modem::uni() const
0266 {
0267     Q_D(const Modem);
0268     return d->uni;
0269 }
0270 
0271 bool ModemManager::Modem::isEnabled() const
0272 {
0273     Q_D(const Modem);
0274     return (MMModemPowerState)d->powerState == MM_MODEM_POWER_STATE_ON;
0275 }
0276 
0277 bool ModemManager::Modem::isValid() const
0278 {
0279     Q_D(const Modem);
0280     return d->modemIface.isValid();
0281 }
0282 
0283 QDBusPendingReply<void> ModemManager::Modem::setEnabled(bool enable)
0284 {
0285     Q_D(Modem);
0286     return d->modemIface.Enable(enable);
0287 }
0288 
0289 QDBusPendingReply<QDBusObjectPath> ModemManager::Modem::createBearer(const ModemManager::BearerProperties &bearerProperties)
0290 {
0291     Q_D(Modem);
0292     QVariantMap map;
0293     map.insert(QStringLiteral("apn"), bearerProperties.apn());
0294     if (bearerProperties.ipType() != MM_BEARER_IP_FAMILY_NONE) {
0295         map.insert(QStringLiteral("ip-type"), (uint)bearerProperties.ipType());
0296     }
0297     if (bearerProperties.allowedAuthentication() != MM_BEARER_ALLOWED_AUTH_UNKNOWN) {
0298         map.insert(QStringLiteral("allowed-auth"), (uint)bearerProperties.allowedAuthentication());
0299     }
0300     if (!bearerProperties.user().isEmpty()) {
0301         map.insert(QStringLiteral("user"), bearerProperties.user());
0302     }
0303     if (!bearerProperties.password().isEmpty()) {
0304         map.insert(QStringLiteral("password"), bearerProperties.password());
0305     }
0306     map.insert(QStringLiteral("allow-roaming"), bearerProperties.allowRoaming());
0307     if (bearerProperties.rmProtocol() != MM_MODEM_CDMA_RM_PROTOCOL_UNKNOWN) {
0308         map.insert(QStringLiteral("rm-protocol"), (uint)bearerProperties.rmProtocol());
0309     }
0310     if (!bearerProperties.number().isEmpty()) {
0311         map.insert(QStringLiteral("number"), bearerProperties.number());
0312     }
0313     return d->modemIface.CreateBearer(map);
0314 }
0315 
0316 QDBusPendingReply<void> ModemManager::Modem::deleteBearer(const QString &bearer)
0317 {
0318     Q_D(Modem);
0319     return d->modemIface.DeleteBearer(QDBusObjectPath(bearer));
0320 }
0321 
0322 ModemManager::Bearer::List ModemManager::Modem::listBearers() const
0323 {
0324     Q_D(const Modem);
0325 
0326     ModemManager::Bearer::List list;
0327     QMap<QString, Bearer::Ptr>::const_iterator i = d->bearers.constBegin();
0328     while (i != d->bearers.constEnd()) {
0329         ModemManager::Bearer::Ptr bearer = const_cast<ModemPrivate *>(d)->findRegisteredBearer(i.key());
0330         if (bearer) {
0331             list << bearer;
0332         }
0333         ++i;
0334     }
0335     return list;
0336 }
0337 
0338 ModemManager::Bearer::Ptr ModemManager::Modem::findBearer(const QString &bearer) const
0339 {
0340     Q_D(const Modem);
0341     return const_cast<ModemPrivate *>(d)->findRegisteredBearer(bearer);
0342 }
0343 
0344 QDBusPendingReply<void> ModemManager::Modem::reset()
0345 {
0346     Q_D(Modem);
0347     return d->modemIface.Reset();
0348 }
0349 
0350 QDBusPendingReply<void> ModemManager::Modem::factoryReset(const QString &code)
0351 {
0352     Q_D(Modem);
0353     return d->modemIface.FactoryReset(code);
0354 }
0355 
0356 QDBusPendingReply<void> ModemManager::Modem::setPowerState(MMModemPowerState state)
0357 {
0358     Q_D(Modem);
0359     return d->modemIface.SetPowerState(state);
0360 }
0361 
0362 QDBusPendingReply<void> ModemManager::Modem::setCurrentCapabilities(Capabilities caps)
0363 {
0364     Q_D(Modem);
0365     return d->modemIface.SetCurrentCapabilities((uint)caps);
0366 }
0367 
0368 QDBusPendingReply<void> ModemManager::Modem::setCurrentModes(const CurrentModesType &mode)
0369 {
0370     Q_D(Modem);
0371     return d->modemIface.SetCurrentModes(mode);
0372 }
0373 
0374 QDBusPendingReply<void> ModemManager::Modem::setCurrentBands(const QList<MMModemBand> &bands)
0375 {
0376     Q_D(Modem);
0377     QList<uint> tmp;
0378     Q_FOREACH (const MMModemBand band, bands) {
0379         tmp.append(band);
0380     }
0381     return d->modemIface.SetCurrentBands(tmp);
0382 }
0383 
0384 QDBusPendingReply<QString> ModemManager::Modem::command(const QString &cmd, uint timeout)
0385 {
0386     Q_D(Modem);
0387     return d->modemIface.Command(cmd, timeout);
0388 }
0389 
0390 QString ModemManager::Modem::simPath() const
0391 {
0392     Q_D(const Modem);
0393     return d->simPath;
0394 }
0395 
0396 QList<MMModemCapability> ModemManager::Modem::supportedCapabilities() const
0397 {
0398     Q_D(const Modem);
0399     return d->supportedCapabilities;
0400 }
0401 
0402 ModemManager::Modem::Capabilities ModemManager::Modem::currentCapabilities() const
0403 {
0404     Q_D(const Modem);
0405     return d->currentCapabilities;
0406 }
0407 
0408 uint ModemManager::Modem::maxBearers() const
0409 {
0410     Q_D(const Modem);
0411     return d->maxBearers;
0412 }
0413 
0414 uint ModemManager::Modem::maxActiveBearers() const
0415 {
0416     Q_D(const Modem);
0417     return d->maxActiveBearers;
0418 }
0419 
0420 QString ModemManager::Modem::manufacturer() const
0421 {
0422     Q_D(const Modem);
0423     return d->manufacturer;
0424 }
0425 
0426 QString ModemManager::Modem::model() const
0427 {
0428     Q_D(const Modem);
0429     return d->model;
0430 }
0431 
0432 QString ModemManager::Modem::revision() const
0433 {
0434     Q_D(const Modem);
0435     return d->revision;
0436 }
0437 
0438 QString ModemManager::Modem::deviceIdentifier() const
0439 {
0440     Q_D(const Modem);
0441     return d->deviceIdentifier;
0442 }
0443 
0444 QString ModemManager::Modem::device() const
0445 {
0446     Q_D(const Modem);
0447     return d->device;
0448 }
0449 
0450 QStringList ModemManager::Modem::drivers() const
0451 {
0452     Q_D(const Modem);
0453     return d->drivers;
0454 }
0455 
0456 QString ModemManager::Modem::plugin() const
0457 {
0458     Q_D(const Modem);
0459     return d->plugin;
0460 }
0461 
0462 QString ModemManager::Modem::primaryPort() const
0463 {
0464     Q_D(const Modem);
0465     return d->primaryPort;
0466 }
0467 
0468 ModemManager::PortList ModemManager::Modem::ports() const
0469 {
0470     Q_D(const Modem);
0471     return d->ports;
0472 }
0473 
0474 QString ModemManager::Modem::equipmentIdentifier() const
0475 {
0476     Q_D(const Modem);
0477     return d->equipmentIdentifier;
0478 }
0479 
0480 MMModemLock ModemManager::Modem::unlockRequired() const
0481 {
0482     Q_D(const Modem);
0483     return d->unlockRequired;
0484 }
0485 
0486 ModemManager::UnlockRetriesMap ModemManager::Modem::unlockRetries() const
0487 {
0488     Q_D(const Modem);
0489     return d->unlockRetries;
0490 }
0491 
0492 MMModemState ModemManager::Modem::state() const
0493 {
0494     Q_D(const Modem);
0495     return d->state;
0496 }
0497 
0498 MMModemStateFailedReason ModemManager::Modem::stateFailedReason() const
0499 {
0500     Q_D(const Modem);
0501     return d->stateFailedReason;
0502 }
0503 
0504 ModemManager::Modem::AccessTechnologies ModemManager::Modem::accessTechnologies() const
0505 {
0506     Q_D(const Modem);
0507     return d->accessTechnologies;
0508 }
0509 
0510 ModemManager::SignalQualityPair ModemManager::Modem::signalQuality() const
0511 {
0512     Q_D(const Modem);
0513     return d->signalQuality;
0514 }
0515 
0516 QStringList ModemManager::Modem::ownNumbers() const
0517 {
0518     Q_D(const Modem);
0519     return d->ownNumbers;
0520 }
0521 
0522 MMModemPowerState ModemManager::Modem::powerState() const
0523 {
0524     Q_D(const Modem);
0525     return d->powerState;
0526 }
0527 
0528 ModemManager::SupportedModesType ModemManager::Modem::supportedModes() const
0529 {
0530     Q_D(const Modem);
0531     return d->supportedModes;
0532 }
0533 
0534 ModemManager::CurrentModesType ModemManager::Modem::currentModes() const
0535 {
0536     Q_D(const Modem);
0537     return d->currentModes;
0538 }
0539 
0540 QList<MMModemBand> ModemManager::Modem::supportedBands() const
0541 {
0542     Q_D(const Modem);
0543     return d->supportedBands;
0544 }
0545 
0546 QList<MMModemBand> ModemManager::Modem::currentBands() const
0547 {
0548     Q_D(const Modem);
0549     return d->currentBands;
0550 }
0551 
0552 ModemManager::Modem::IpBearerFamilies ModemManager::Modem::supportedIpFamilies() const
0553 {
0554     Q_D(const Modem);
0555     return d->supportedIpFamilies;
0556 }
0557 
0558 ModemManager::Bearer::Ptr ModemManager::ModemPrivate::findRegisteredBearer(const QString &path)
0559 {
0560     Q_Q(Modem);
0561     ModemManager::Bearer::Ptr ret;
0562     if (!path.isEmpty()) {
0563         bool contains = bearers.contains(path);
0564         if (contains && bearers.value(path)) {
0565             ret = bearers.value(path);
0566         } else {
0567             ret = ModemManager::Bearer::Ptr(new ModemManager::Bearer(path), &QObject::deleteLater);
0568             bearers[path] = ret;
0569             if (!contains) {
0570                 Q_EMIT q->bearerAdded(path);
0571             }
0572         }
0573     }
0574     return ret;
0575 }
0576 
0577 void ModemManager::Modem::setTimeout(int timeout)
0578 {
0579     Q_D(Modem);
0580     d->modemIface.setTimeout(timeout);
0581 }
0582 
0583 int ModemManager::Modem::timeout() const
0584 {
0585     Q_D(const Modem);
0586     return d->modemIface.timeout();
0587 }
0588 
0589 void ModemManager::ModemPrivate::onPropertiesChanged(const QString &ifaceName, const QVariantMap &changedProps, const QStringList &invalidatedProps)
0590 {
0591     Q_UNUSED(invalidatedProps);
0592     Q_Q(Modem);
0593     qCDebug(MMQT) << ifaceName << changedProps.keys();
0594 
0595     if (ifaceName == QLatin1String(MMQT_DBUS_INTERFACE_MODEM)) {
0596         QVariantMap::const_iterator it = changedProps.constFind(QLatin1String(MM_MODEM_PROPERTY_SIM));
0597 
0598         if (it != changedProps.constEnd()) {
0599             Q_EMIT q->simPathChanged(simPath, it->toString());
0600             simPath = it->toString();
0601         }
0602 #if MM_CHECK_VERSION(1, 2, 0)
0603         it = changedProps.constFind(QLatin1String(MM_MODEM_PROPERTY_BEARERS));
0604         if (it != changedProps.constEnd()) {
0605             QList<QDBusObjectPath> bearerPaths = qdbus_cast<QList<QDBusObjectPath>>(*it);
0606             if (bearerPaths.isEmpty()) {
0607                 QMap<QString, Bearer::Ptr>::const_iterator it = bearers.constBegin();
0608                 while (it != bearers.constEnd()) {
0609                     Q_EMIT q->bearerRemoved(it.key());
0610                     ++it;
0611                 }
0612                 bearers.clear();
0613             } else {
0614                 QStringList knownBearers = bearers.keys();
0615                 Q_FOREACH (const QDBusObjectPath &bearer, bearerPaths) {
0616                     if (!bearers.contains(bearer.path())) {
0617                         bearers.insert(bearer.path(), ModemManager::Bearer::Ptr());
0618                         Q_EMIT q->bearerAdded(bearer.path());
0619                     } else {
0620                         knownBearers.removeOne(bearer.path());
0621                     }
0622                 }
0623                 Q_FOREACH (const QString &path, knownBearers) {
0624                     bearers.remove(path);
0625                     Q_EMIT q->bearerRemoved(path);
0626                 }
0627             }
0628             Q_EMIT q->bearersChanged();
0629         }
0630 #endif
0631         it = changedProps.constFind(QLatin1String(MM_MODEM_PROPERTY_SUPPORTEDCAPABILITIES));
0632         if (it != changedProps.constEnd()) {
0633             supportedCapabilities.clear();
0634             Q_FOREACH (const uint cap, qdbus_cast<QList<uint>>(*it)) {
0635                 supportedCapabilities << ((MMModemCapability)cap);
0636             }
0637             Q_EMIT q->supportedCapabilitiesChanged(supportedCapabilities);
0638         }
0639         it = changedProps.constFind(QLatin1String(MM_MODEM_PROPERTY_CURRENTCAPABILITIES));
0640         if (it != changedProps.constEnd()) {
0641             currentCapabilities = (QFlags<MMModemCapability>)it->toUInt();
0642             Q_EMIT q->currentCapabilitiesChanged(currentCapabilities);
0643         }
0644         it = changedProps.constFind(QLatin1String(MM_MODEM_PROPERTY_MAXBEARERS));
0645         if (it != changedProps.constEnd()) {
0646             maxBearers = it->toUInt();
0647             Q_EMIT q->maxBearersChanged(maxBearers);
0648         }
0649         it = changedProps.constFind(QLatin1String(MM_MODEM_PROPERTY_MAXACTIVEBEARERS));
0650         if (it != changedProps.constEnd()) {
0651             maxActiveBearers = it->toUInt();
0652             Q_EMIT q->maxActiveBearersChanged(maxActiveBearers);
0653         }
0654         it = changedProps.constFind(QLatin1String(MM_MODEM_PROPERTY_MANUFACTURER));
0655         if (it != changedProps.constEnd()) {
0656             manufacturer = it->toString();
0657             Q_EMIT q->manufacturerChanged(manufacturer);
0658         }
0659         it = changedProps.constFind(QLatin1String(MM_MODEM_PROPERTY_MODEL));
0660         if (it != changedProps.constEnd()) {
0661             model = it->toString();
0662             Q_EMIT q->modelChanged(model);
0663         }
0664         it = changedProps.constFind(QLatin1String(MM_MODEM_PROPERTY_REVISION));
0665         if (it != changedProps.constEnd()) {
0666             revision = it->toString();
0667             Q_EMIT q->revisionChanged(revision);
0668         }
0669         it = changedProps.constFind(QLatin1String(MM_MODEM_PROPERTY_DEVICEIDENTIFIER));
0670         if (it != changedProps.constEnd()) {
0671             deviceIdentifier = it->toString();
0672             Q_EMIT q->deviceIdentifierChanged(deviceIdentifier);
0673         }
0674         it = changedProps.constFind(QLatin1String(MM_MODEM_PROPERTY_DEVICE));
0675         if (it != changedProps.constEnd()) {
0676             device = it->toString();
0677             Q_EMIT q->deviceChanged(device);
0678         }
0679         it = changedProps.constFind(QLatin1String(MM_MODEM_PROPERTY_DRIVERS));
0680         if (it != changedProps.constEnd()) {
0681             drivers = it->toStringList();
0682             Q_EMIT q->driversChanged(drivers);
0683         }
0684         it = changedProps.constFind(QLatin1String(MM_MODEM_PROPERTY_PLUGIN));
0685         if (it != changedProps.constEnd()) {
0686             plugin = it->toString();
0687             Q_EMIT q->pluginChanged(plugin);
0688         }
0689         it = changedProps.constFind(QLatin1String(MM_MODEM_PROPERTY_PRIMARYPORT));
0690         if (it != changedProps.constEnd()) {
0691             primaryPort = it->toString();
0692             Q_EMIT q->primaryPortChanged(primaryPort);
0693         }
0694         it = changedProps.constFind(QLatin1String(MM_MODEM_PROPERTY_PORTS));
0695         if (it != changedProps.constEnd()) {
0696             ports = qdbus_cast<QList<Port>>(*it);
0697             Q_EMIT q->portsChanged(ports);
0698         }
0699         it = changedProps.constFind(QLatin1String(MM_MODEM_PROPERTY_EQUIPMENTIDENTIFIER));
0700         if (it != changedProps.constEnd()) {
0701             equipmentIdentifier = it->toString();
0702             Q_EMIT q->equipmentIdentifierChanged(equipmentIdentifier);
0703         }
0704         it = changedProps.constFind(QLatin1String(MM_MODEM_PROPERTY_UNLOCKREQUIRED));
0705         if (it != changedProps.constEnd()) {
0706             unlockRequired = (MMModemLock)it->toUInt();
0707             Q_EMIT q->unlockRequiredChanged(unlockRequired);
0708         }
0709         it = changedProps.constFind(QLatin1String(MM_MODEM_PROPERTY_UNLOCKRETRIES));
0710         if (it != changedProps.constEnd()) {
0711             unlockRetries = qdbus_cast<UnlockRetriesMap>(*it);
0712             Q_EMIT q->unlockRetriesChanged(unlockRetries);
0713         }
0714         it = changedProps.constFind(QLatin1String(MM_MODEM_PROPERTY_STATE));
0715         if (it != changedProps.constEnd()) {
0716             // Should be handled by StateChanged signal
0717             //             Q_EMIT q->stateChanged(state, (MMModemState)it->toInt());
0718             //             state = (MMModemState)it->toInt();
0719         }
0720         it = changedProps.constFind(QLatin1String(MM_MODEM_PROPERTY_STATEFAILEDREASON));
0721         if (it != changedProps.constEnd()) {
0722             stateFailedReason = (MMModemStateFailedReason)it->toUInt();
0723             Q_EMIT q->stateFailedReasonChanged(stateFailedReason);
0724         }
0725         it = changedProps.constFind(QLatin1String(MM_MODEM_PROPERTY_ACCESSTECHNOLOGIES));
0726         if (it != changedProps.constEnd()) {
0727             accessTechnologies = (ModemManager::Modem::AccessTechnologies)it->toUInt();
0728             Q_EMIT q->accessTechnologiesChanged(accessTechnologies);
0729         }
0730         it = changedProps.constFind(QLatin1String(MM_MODEM_PROPERTY_SIGNALQUALITY));
0731         if (it != changedProps.constEnd()) {
0732             signalQuality = qdbus_cast<SignalQualityPair>(*it);
0733             Q_EMIT q->signalQualityChanged(signalQuality);
0734         }
0735         it = changedProps.constFind(QLatin1String(MM_MODEM_PROPERTY_OWNNUMBERS));
0736         if (it != changedProps.constEnd()) {
0737             ownNumbers = it->toStringList();
0738             Q_EMIT q->ownNumbersChanged(ownNumbers);
0739         }
0740         it = changedProps.constFind(QLatin1String(MM_MODEM_PROPERTY_POWERSTATE));
0741         if (it != changedProps.constEnd()) {
0742             powerState = (MMModemPowerState)it->toUInt();
0743             Q_EMIT q->powerStateChanged(powerState);
0744         }
0745         it = changedProps.constFind(QLatin1String(MM_MODEM_PROPERTY_SUPPORTEDMODES));
0746         if (it != changedProps.constEnd()) {
0747             supportedModes = qdbus_cast<SupportedModesType>(*it);
0748             Q_EMIT q->supportedModesChanged(supportedModes);
0749         }
0750         it = changedProps.constFind(QLatin1String(MM_MODEM_PROPERTY_CURRENTMODES));
0751         if (it != changedProps.constEnd()) {
0752             currentModes = qdbus_cast<CurrentModesType>(*it);
0753             Q_EMIT q->currentModesChanged(currentModes);
0754         }
0755         it = changedProps.constFind(QLatin1String(MM_MODEM_PROPERTY_SUPPORTEDBANDS));
0756         if (it != changedProps.constEnd()) {
0757             supportedBands.clear();
0758             Q_FOREACH (const uint cap, qdbus_cast<QList<uint>>(*it)) {
0759                 supportedBands << ((MMModemBand)cap);
0760             }
0761             Q_EMIT q->supportedBandsChanged(supportedBands);
0762         }
0763         it = changedProps.constFind(QLatin1String(MM_MODEM_PROPERTY_CURRENTBANDS));
0764         if (it != changedProps.constEnd()) {
0765             currentBands.clear();
0766             Q_FOREACH (const uint cap, qdbus_cast<QList<uint>>(*it)) {
0767                 currentBands << ((MMModemBand)cap);
0768             }
0769             Q_EMIT q->currentBandsChanged(currentBands);
0770         }
0771         it = changedProps.constFind(QLatin1String(MM_MODEM_PROPERTY_SUPPORTEDIPFAMILIES));
0772         if (it != changedProps.constEnd()) {
0773             supportedIpFamilies = (ModemManager::Modem::IpBearerFamilies)it->toUInt();
0774             Q_EMIT q->supportedIpFamiliesChanged(supportedIpFamilies);
0775         }
0776     }
0777 }
0778 
0779 void ModemManager::ModemPrivate::onStateChanged(int oldState, int newState, uint reason)
0780 {
0781     Q_Q(Modem);
0782     state = (MMModemState)newState;
0783     Q_EMIT q->stateChanged((MMModemState)oldState, (MMModemState)newState, (MMModemStateChangeReason)reason);
0784 }
0785 
0786 #include "moc_modem.cpp"
0787 #include "moc_modem_p.cpp"