File indexing completed on 2024-04-28 11:47:34

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