File indexing completed on 2024-04-21 03:59:50

0001 /*
0002     SPDX-FileCopyrightText: 2013, 2014 Lukas Tinkl <ltinkl@redhat.com>
0003     SPDX-FileCopyrightText: 2013-2015 Jan Grulich <jgrulich@redhat.com>
0004 
0005     SPDX-License-Identifier: LGPL-2.1-only OR LGPL-3.0-only OR LicenseRef-KDE-Accepted-LGPL
0006 */
0007 
0008 #include "modemdevice.h"
0009 #include "modemdevice_p.h"
0010 
0011 #ifdef MMQT_STATIC
0012 #include "dbus/fakedbus.h"
0013 #else
0014 #include "dbus/dbus.h"
0015 #endif
0016 #include "manager.h"
0017 #include "mmdebug_p.h"
0018 #include "modem3gpp.h"
0019 #include "modem3gppussd.h"
0020 #include "modemcdma.h"
0021 #include "modemlocation.h"
0022 #if MM_CHECK_VERSION(1, 2, 0)
0023 #include "modemoma.h"
0024 #include "modemsignal.h"
0025 #endif
0026 #if MM_CHECK_VERSION(1, 6, 0)
0027 #include "modemvoice.h"
0028 #endif
0029 #include "modemfirmware.h"
0030 #include "modemsimple.h"
0031 #include "modemtime.h"
0032 
0033 #include <QDBusConnection>
0034 #include <QDomDocument>
0035 
0036 ModemManager::ModemDevicePrivate::ModemDevicePrivate(const QString &path, ModemManager::ModemDevice *q)
0037     : uni(path)
0038     , q_ptr(q)
0039 {
0040     init();
0041 }
0042 
0043 ModemManager::ModemDevicePrivate::~ModemDevicePrivate()
0044 {
0045 }
0046 
0047 void ModemManager::ModemDevicePrivate::init()
0048 {
0049     Q_Q(ModemManager::ModemDevice);
0050 #ifdef MMQT_STATIC
0051     bool success = QDBusConnection::sessionBus().connect(QLatin1String(MMQT_DBUS_SERVICE),
0052                                                          QLatin1String(MMQT_DBUS_PATH),
0053                                                          QLatin1String(DBUS_INTERFACE_MANAGER),
0054                                                          QStringLiteral("InterfacesAdded"),
0055                                                          this,
0056                                                          SLOT(onInterfacesAdded(QDBusObjectPath, ModemManager::MMVariantMapMap)));
0057     success = QDBusConnection::sessionBus().connect(QLatin1String(MMQT_DBUS_SERVICE),
0058                                                     QLatin1String(MMQT_DBUS_PATH),
0059                                                     QLatin1String(DBUS_INTERFACE_MANAGER),
0060                                                     QStringLiteral("InterfacesRemoved"),
0061                                                     this,
0062                                                     SLOT(onInterfacesRemoved(QDBusObjectPath, QStringList)));
0063 #else
0064     bool success = QDBusConnection::systemBus().connect(QLatin1String(MMQT_DBUS_SERVICE),
0065                                                         QLatin1String(MMQT_DBUS_PATH),
0066                                                         QLatin1String(DBUS_INTERFACE_MANAGER),
0067                                                         QStringLiteral("InterfacesAdded"),
0068                                                         this,
0069                                                         SLOT(onInterfacesAdded(QDBusObjectPath, ModemManager::MMVariantMapMap)));
0070     success = QDBusConnection::systemBus().connect(QLatin1String(MMQT_DBUS_SERVICE),
0071                                                    QLatin1String(MMQT_DBUS_PATH),
0072                                                    QLatin1String(DBUS_INTERFACE_MANAGER),
0073                                                    QStringLiteral("InterfacesRemoved"),
0074                                                    this,
0075                                                    SLOT(onInterfacesRemoved(QDBusObjectPath, QStringList)));
0076 #endif
0077 
0078     initInterfaces();
0079 }
0080 
0081 void ModemManager::ModemDevicePrivate::initInterfaces()
0082 {
0083     interfaceList.clear();
0084 
0085     const QString xmlData = introspect();
0086     if (xmlData.isEmpty()) {
0087         qCDebug(MMQT) << uni << "has no interfaces!";
0088         return;
0089     }
0090 
0091     QDomDocument dom;
0092     dom.setContent(xmlData);
0093 
0094     QDomNodeList ifaceNodeList = dom.elementsByTagName(QStringLiteral("interface"));
0095     for (int i = 0; i < ifaceNodeList.count(); i++) {
0096         QDomElement ifaceElem = ifaceNodeList.item(i).toElement();
0097         /* Accept only MM interfaces so that when the device is unplugged,
0098          * interfaceList goes empty and we can easily verify that the device is gone. */
0099         if (!ifaceElem.isNull() && ifaceElem.attribute(QStringLiteral("name")).startsWith(QLatin1String(MMQT_DBUS_SERVICE))) {
0100             const QString name = ifaceElem.attribute(QStringLiteral("name"));
0101             if (name == QLatin1String(MMQT_DBUS_INTERFACE_MODEM)) {
0102                 interfaceList.insert(ModemManager::ModemDevice::ModemInterface, ModemManager::Modem::Ptr());
0103                 if (interfaceList.contains(ModemManager::ModemDevice::ModemInterface)) {
0104                     ModemManager::Modem::Ptr modemInterface = interface(ModemManager::ModemDevice::ModemInterface).objectCast<ModemManager::Modem>();
0105                     if (!modemInterface->simPath().isEmpty()) {
0106                         simCard = ModemManager::Sim::Ptr(new ModemManager::Sim(modemInterface->simPath()), &QObject::deleteLater);
0107                         // q->simAdded(modemInterface->simPath());
0108 
0109                         QObject::connect(modemInterface.data(), SIGNAL(simPathChanged(QString, QString)), this, SLOT(onSimPathChanged(QString, QString)));
0110                     }
0111                 }
0112             } else if (name == QLatin1String(MMQT_DBUS_INTERFACE_MODEM_SIMPLE)) {
0113                 interfaceList.insert(ModemManager::ModemDevice::SimpleInterface, ModemManager::ModemSimple::Ptr());
0114             } else if (name == QLatin1String(MMQT_DBUS_INTERFACE_MODEM_MODEM3GPP)) {
0115                 interfaceList.insert(ModemManager::ModemDevice::GsmInterface, ModemManager::Modem3gpp::Ptr());
0116             } else if (name == QLatin1String(MMQT_DBUS_INTERFACE_MODEM_MODEM3GPP_USSD)) {
0117                 interfaceList.insert(ModemManager::ModemDevice::GsmUssdInterface, ModemManager::Modem3gppUssd::Ptr());
0118             } else if (name == QLatin1String(MMQT_DBUS_INTERFACE_MODEM_MODEMCDMA)) {
0119                 interfaceList.insert(ModemManager::ModemDevice::CdmaInterface, ModemManager::ModemCdma::Ptr());
0120             } else if (name == QLatin1String(MMQT_DBUS_INTERFACE_MODEM_MESSAGING)) {
0121                 interfaceList.insert(ModemManager::ModemDevice::MessagingInterface, ModemManager::ModemMessaging::Ptr());
0122             } else if (name == QLatin1String(MMQT_DBUS_INTERFACE_MODEM_LOCATION)) {
0123                 interfaceList.insert(ModemManager::ModemDevice::LocationInterface, ModemManager::ModemLocation::Ptr());
0124             } else if (name == QLatin1String(MMQT_DBUS_INTERFACE_MODEM_TIME)) {
0125                 interfaceList.insert(ModemManager::ModemDevice::TimeInterface, ModemManager::ModemTime::Ptr());
0126             }
0127 #if MM_CHECK_VERSION(1, 2, 0)
0128             else if (name == QLatin1String(MMQT_DBUS_INTERFACE_MODEM_OMA)) {
0129                 interfaceList.insert(ModemManager::ModemDevice::OmaInterface, ModemManager::ModemOma::Ptr());
0130             } else if (name == QLatin1String(MMQT_DBUS_INTERFACE_MODEM_SIGNAL)) {
0131                 interfaceList.insert(ModemManager::ModemDevice::SignalInterface, ModemManager::ModemSignal::Ptr());
0132             }
0133 #endif
0134             else if (name == QLatin1String(MMQT_DBUS_INTERFACE_MODEM_FIRMWARE)) {
0135                 interfaceList.insert(ModemManager::ModemDevice::FirmwareInterface, ModemManager::ModemFirmware::Ptr());
0136             }
0137 #if MM_CHECK_VERSION(1, 6, 0)
0138             else if (name == QLatin1String(MMQT_DBUS_INTERFACE_MODEM_VOICE)) {
0139                 interfaceList.insert(ModemManager::ModemDevice::VoiceInterface, ModemManager::ModemVoice::Ptr());
0140             }
0141 #endif
0142         }
0143     }
0144 
0145     qCDebug(MMQT) << uni << "has interfaces:" << interfaceList.keys();
0146 }
0147 
0148 QString ModemManager::ModemDevicePrivate::introspect() const
0149 {
0150     QDBusMessage call =
0151         QDBusMessage::createMethodCall(QLatin1String(MMQT_DBUS_SERVICE), uni, QLatin1String(DBUS_INTERFACE_INTROSPECT), QLatin1String("Introspect"));
0152 #ifdef MMQT_STATIC
0153     QDBusPendingReply<QString> reply = QDBusConnection::sessionBus().call(call);
0154 #else
0155     QDBusPendingReply<QString> reply = QDBusConnection::systemBus().call(call);
0156 #endif
0157 
0158     if (reply.isValid()) {
0159         return reply.value();
0160     } else {
0161         return QString();
0162     }
0163 }
0164 
0165 ModemManager::ModemDevice::ModemDevice(const QString &path, QObject *parent)
0166     : QObject(parent)
0167     , d_ptr(new ModemDevicePrivate(path, this))
0168 {
0169 }
0170 
0171 ModemManager::ModemDevice::ModemDevice(ModemDevicePrivate &dd, QObject *parent)
0172     : QObject(parent)
0173     , d_ptr(&dd)
0174 {
0175 }
0176 
0177 ModemManager::ModemDevice::~ModemDevice()
0178 {
0179     delete d_ptr;
0180 }
0181 
0182 ModemManager::Interface::List ModemManager::ModemDevicePrivate::interfaces()
0183 {
0184     ModemManager::Interface::List list;
0185 
0186     QMap<ModemManager::ModemDevice::InterfaceType, ModemManager::Interface::Ptr>::const_iterator i;
0187     for (i = interfaceList.constBegin(); i != interfaceList.constEnd(); ++i) {
0188         ModemManager::Interface::Ptr modemInterface = interface(i.key());
0189         if (modemInterface) {
0190             list.append(modemInterface);
0191         } else {
0192             qCWarning(MMQT) << "warning: null network Interface for" << i.key();
0193         }
0194     }
0195 
0196     return list;
0197 }
0198 
0199 ModemManager::Interface::Ptr ModemManager::ModemDevicePrivate::interface(ModemManager::ModemDevice::InterfaceType type)
0200 {
0201     ModemManager::Interface::Ptr modemInterface;
0202 
0203     if (interfaceList.contains(type)) {
0204         if (interfaceList.value(type)) {
0205             modemInterface = interfaceList.value(type);
0206         } else {
0207             modemInterface = createInterface(type);
0208             interfaceList[type] = modemInterface;
0209         }
0210     }
0211 
0212     return modemInterface;
0213 }
0214 
0215 ModemManager::Interface::Ptr ModemManager::ModemDevicePrivate::createInterface(ModemManager::ModemDevice::InterfaceType type)
0216 {
0217     ModemManager::Interface::Ptr createdInterface;
0218     switch (type) {
0219     case ModemManager::ModemDevice::ModemInterface:
0220         createdInterface = ModemManager::Interface::Ptr(new ModemManager::Modem(uni), &QObject::deleteLater);
0221         break;
0222     case ModemManager::ModemDevice::SimpleInterface:
0223         createdInterface = ModemManager::Interface::Ptr(new ModemManager::ModemSimple(uni), &QObject::deleteLater);
0224         break;
0225     case ModemManager::ModemDevice::GsmInterface:
0226         createdInterface = ModemManager::Interface::Ptr(new ModemManager::Modem3gpp(uni), &QObject::deleteLater);
0227         break;
0228     case ModemManager::ModemDevice::GsmUssdInterface:
0229         createdInterface = ModemManager::Interface::Ptr(new ModemManager::Modem3gppUssd(uni), &QObject::deleteLater);
0230         break;
0231     case ModemManager::ModemDevice::CdmaInterface:
0232         createdInterface = ModemManager::Interface::Ptr(new ModemManager::ModemCdma(uni), &QObject::deleteLater);
0233         break;
0234     case ModemManager::ModemDevice::MessagingInterface:
0235         createdInterface = ModemManager::Interface::Ptr(new ModemManager::ModemMessaging(uni), &QObject::deleteLater);
0236         break;
0237     case ModemManager::ModemDevice::LocationInterface:
0238         createdInterface = ModemManager::Interface::Ptr(new ModemManager::ModemLocation(uni), &QObject::deleteLater);
0239         break;
0240     case ModemManager::ModemDevice::TimeInterface:
0241         createdInterface = ModemManager::Interface::Ptr(new ModemManager::ModemTime(uni), &QObject::deleteLater);
0242         break;
0243 #if MM_CHECK_VERSION(1, 2, 0)
0244     case ModemManager::ModemDevice::OmaInterface:
0245         createdInterface = ModemManager::Interface::Ptr(new ModemManager::ModemOma(uni), &QObject::deleteLater);
0246         break;
0247     case ModemManager::ModemDevice::SignalInterface:
0248         createdInterface = ModemManager::Interface::Ptr(new ModemManager::ModemSignal(uni), &QObject::deleteLater);
0249         break;
0250 #endif
0251     case ModemManager::ModemDevice::FirmwareInterface:
0252         createdInterface = ModemManager::Interface::Ptr(new ModemManager::ModemFirmware(uni), &QObject::deleteLater);
0253         break;
0254 #if MM_CHECK_VERSION(1, 6, 0)
0255     case ModemManager::ModemDevice::VoiceInterface:
0256         createdInterface = ModemManager::Interface::Ptr(new ModemManager::ModemVoice(uni), &QObject::deleteLater);
0257         break;
0258 #endif
0259     }
0260     return createdInterface;
0261 }
0262 
0263 ModemManager::Bearer::Ptr ModemManager::ModemDevicePrivate::findBearer(const QString &uni)
0264 {
0265     ModemManager::Bearer::Ptr result;
0266     Q_FOREACH (const ModemManager::Bearer::Ptr &bearer, bearers()) {
0267         if (bearer->uni() == uni) {
0268             result = bearer;
0269             break;
0270         }
0271     }
0272 
0273     return result;
0274 }
0275 
0276 ModemManager::Bearer::List ModemManager::ModemDevicePrivate::bearers()
0277 {
0278     Q_Q(ModemManager::ModemDevice);
0279 
0280     return q->modemInterface()->listBearers();
0281 }
0282 
0283 ModemManager::Sim::Ptr ModemManager::ModemDevicePrivate::sim()
0284 {
0285     return simCard;
0286 }
0287 
0288 QString ModemManager::ModemDevice::uni() const
0289 {
0290     Q_D(const ModemDevice);
0291     return d->uni;
0292 }
0293 
0294 bool ModemManager::ModemDevice::hasInterface(ModemManager::ModemDevice::InterfaceType type) const
0295 {
0296     Q_D(const ModemDevice);
0297     return d->interfaceList.contains(type);
0298 }
0299 
0300 ModemManager::Interface::Ptr ModemManager::ModemDevice::interface(ModemManager::ModemDevice::InterfaceType type) const
0301 {
0302     Q_D(const ModemDevice);
0303 
0304     return const_cast<ModemDevicePrivate *>(d)->interface(type);
0305 }
0306 
0307 ModemManager::Interface::List ModemManager::ModemDevice::interfaces() const
0308 {
0309     Q_D(const ModemDevice);
0310 
0311     return const_cast<ModemDevicePrivate *>(d)->interfaces();
0312 }
0313 
0314 ModemManager::ModemMessaging::Ptr ModemManager::ModemDevice::messagingInterface()
0315 {
0316     Q_D(ModemDevice);
0317 
0318     return d->interface(ModemManager::ModemDevice::MessagingInterface).objectCast<ModemManager::ModemMessaging>();
0319 }
0320 
0321 ModemManager::Modem::Ptr ModemManager::ModemDevice::modemInterface()
0322 {
0323     Q_D(ModemDevice);
0324 
0325     return d->interface(ModemManager::ModemDevice::ModemInterface).objectCast<ModemManager::Modem>();
0326 }
0327 
0328 ModemManager::Bearer::Ptr ModemManager::ModemDevice::findBearer(const QString &uni)
0329 {
0330     Q_D(ModemDevice);
0331 
0332     return d->findBearer(uni);
0333 }
0334 
0335 ModemManager::Bearer::List ModemManager::ModemDevice::bearers() const
0336 {
0337     Q_D(const ModemDevice);
0338 
0339     return const_cast<ModemDevicePrivate *>(d)->bearers();
0340 }
0341 
0342 ModemManager::Sim::Ptr ModemManager::ModemDevice::sim() const
0343 {
0344     Q_D(const ModemDevice);
0345 
0346     return const_cast<ModemDevicePrivate *>(d)->sim();
0347 }
0348 
0349 bool ModemManager::ModemDevice::isGsmModem() const
0350 {
0351     return hasInterface(ModemManager::ModemDevice::GsmInterface);
0352 }
0353 
0354 bool ModemManager::ModemDevice::isCdmaModem() const
0355 {
0356     return hasInterface(ModemManager::ModemDevice::CdmaInterface);
0357 }
0358 
0359 void ModemManager::ModemDevicePrivate::onInterfacesAdded(const QDBusObjectPath &object_path, const MMVariantMapMap &interfaces_and_properties)
0360 {
0361     Q_Q(ModemDevice);
0362     if (object_path.path() != uni) {
0363         return;
0364     }
0365 
0366     Q_FOREACH (const QString &iface, interfaces_and_properties.keys()) {
0367         /* Don't store generic DBus interfaces */
0368         if (iface.startsWith(QLatin1String(MMQT_DBUS_SERVICE))) {
0369             if (iface == QLatin1String(MMQT_DBUS_INTERFACE_MODEM)) {
0370                 interfaceList.insert(ModemManager::ModemDevice::ModemInterface, ModemManager::Modem::Ptr());
0371                 Q_EMIT q->interfaceAdded(ModemManager::ModemDevice::ModemInterface);
0372             } else if (iface == QLatin1String(MMQT_DBUS_INTERFACE_MODEM_SIMPLE)) {
0373                 interfaceList.insert(ModemManager::ModemDevice::SimpleInterface, ModemManager::ModemSimple::Ptr());
0374                 Q_EMIT q->interfaceAdded(ModemManager::ModemDevice::SimpleInterface);
0375             } else if (iface == QLatin1String(MMQT_DBUS_INTERFACE_MODEM_MODEM3GPP)) {
0376                 interfaceList.insert(ModemManager::ModemDevice::GsmInterface, ModemManager::Modem3gpp::Ptr());
0377                 Q_EMIT q->interfaceAdded(ModemManager::ModemDevice::GsmInterface);
0378             } else if (iface == QLatin1String(MMQT_DBUS_INTERFACE_MODEM_MODEM3GPP_USSD)) {
0379                 interfaceList.insert(ModemManager::ModemDevice::GsmUssdInterface, ModemManager::Modem3gppUssd::Ptr());
0380                 Q_EMIT q->interfaceAdded(ModemManager::ModemDevice::GsmUssdInterface);
0381             } else if (iface == QLatin1String(MMQT_DBUS_INTERFACE_MODEM_MODEMCDMA)) {
0382                 interfaceList.insert(ModemManager::ModemDevice::CdmaInterface, ModemManager::ModemCdma::Ptr());
0383                 Q_EMIT q->interfaceAdded(ModemManager::ModemDevice::CdmaInterface);
0384             } else if (iface == QLatin1String(MMQT_DBUS_INTERFACE_MODEM_MESSAGING)) {
0385                 interfaceList.insert(ModemManager::ModemDevice::MessagingInterface, ModemManager::ModemMessaging::Ptr());
0386                 Q_EMIT q->interfaceAdded(ModemManager::ModemDevice::MessagingInterface);
0387             } else if (iface == QLatin1String(MMQT_DBUS_INTERFACE_MODEM_LOCATION)) {
0388                 interfaceList.insert(ModemManager::ModemDevice::LocationInterface, ModemManager::ModemLocation::Ptr());
0389                 Q_EMIT q->interfaceAdded(ModemManager::ModemDevice::LocationInterface);
0390             } else if (iface == QLatin1String(MMQT_DBUS_INTERFACE_MODEM_TIME)) {
0391                 interfaceList.insert(ModemManager::ModemDevice::TimeInterface, ModemManager::ModemTime::Ptr());
0392                 Q_EMIT q->interfaceAdded(ModemManager::ModemDevice::TimeInterface);
0393             }
0394 #if MM_CHECK_VERSION(1, 2, 0)
0395             else if (iface == QLatin1String(MMQT_DBUS_INTERFACE_MODEM_OMA)) {
0396                 interfaceList.insert(ModemManager::ModemDevice::OmaInterface, ModemManager::ModemOma::Ptr());
0397                 Q_EMIT q->interfaceAdded(ModemManager::ModemDevice::OmaInterface);
0398             } else if (iface == QLatin1String(MMQT_DBUS_INTERFACE_MODEM_SIGNAL)) {
0399                 interfaceList.insert(ModemManager::ModemDevice::SignalInterface, ModemManager::ModemSignal::Ptr());
0400                 Q_EMIT q->interfaceAdded(ModemManager::ModemDevice::SignalInterface);
0401             }
0402 #endif
0403             else if (iface == QLatin1String(MMQT_DBUS_INTERFACE_MODEM_FIRMWARE)) {
0404                 interfaceList.insert(ModemManager::ModemDevice::FirmwareInterface, ModemManager::ModemFirmware::Ptr());
0405                 Q_EMIT q->interfaceAdded(ModemManager::ModemDevice::FirmwareInterface);
0406             }
0407 #if MM_CHECK_VERSION(1, 6, 0)
0408             else if (iface == QLatin1String(MMQT_DBUS_INTERFACE_MODEM_VOICE)) {
0409                 interfaceList.insert(ModemManager::ModemDevice::VoiceInterface, ModemManager::ModemVoice::Ptr());
0410                 Q_EMIT q->interfaceAdded(ModemManager::ModemDevice::VoiceInterface);
0411             }
0412 #endif
0413         }
0414     }
0415 }
0416 
0417 void ModemManager::ModemDevicePrivate::onInterfacesRemoved(const QDBusObjectPath &object_path, const QStringList &interfaces)
0418 {
0419     Q_Q(ModemDevice);
0420     if (object_path.path() != uni) {
0421         return;
0422     }
0423 
0424     if (interfaces.contains(QLatin1String(MMQT_DBUS_INTERFACE_MODEM)) || interfaces.isEmpty()) {
0425         if (simCard) {
0426             Q_EMIT q->simRemoved(simCard->uni());
0427             simCard = ModemManager::Sim::Ptr();
0428         }
0429     }
0430 
0431     Q_FOREACH (const QString &iface, interfaces) {
0432         if (iface == QLatin1String(MMQT_DBUS_INTERFACE_MODEM)) {
0433             interfaceList.remove(ModemManager::ModemDevice::ModemInterface);
0434             Q_EMIT q->interfaceRemoved(ModemManager::ModemDevice::ModemInterface);
0435         } else if (iface == QLatin1String(MMQT_DBUS_INTERFACE_MODEM_SIMPLE)) {
0436             interfaceList.remove(ModemManager::ModemDevice::SimpleInterface);
0437             Q_EMIT q->interfaceRemoved(ModemManager::ModemDevice::SimpleInterface);
0438         } else if (iface == QLatin1String(MMQT_DBUS_INTERFACE_MODEM_MODEM3GPP)) {
0439             interfaceList.remove(ModemManager::ModemDevice::GsmInterface);
0440             Q_EMIT q->interfaceRemoved(ModemManager::ModemDevice::GsmInterface);
0441         } else if (iface == QLatin1String(MMQT_DBUS_INTERFACE_MODEM_MODEM3GPP_USSD)) {
0442             interfaceList.remove(ModemManager::ModemDevice::GsmUssdInterface);
0443             Q_EMIT q->interfaceRemoved(ModemManager::ModemDevice::GsmUssdInterface);
0444         } else if (iface == QLatin1String(MMQT_DBUS_INTERFACE_MODEM_MODEMCDMA)) {
0445             interfaceList.remove(ModemManager::ModemDevice::CdmaInterface);
0446             Q_EMIT q->interfaceRemoved(ModemManager::ModemDevice::CdmaInterface);
0447         } else if (iface == QLatin1String(MMQT_DBUS_INTERFACE_MODEM_MESSAGING)) {
0448             interfaceList.remove(ModemManager::ModemDevice::MessagingInterface);
0449             Q_EMIT q->interfaceRemoved(ModemManager::ModemDevice::MessagingInterface);
0450         } else if (iface == QLatin1String(MMQT_DBUS_INTERFACE_MODEM_LOCATION)) {
0451             interfaceList.remove(ModemManager::ModemDevice::LocationInterface);
0452             Q_EMIT q->interfaceRemoved(ModemManager::ModemDevice::LocationInterface);
0453         } else if (iface == QLatin1String(MMQT_DBUS_INTERFACE_MODEM_TIME)) {
0454             interfaceList.remove(ModemManager::ModemDevice::TimeInterface);
0455             Q_EMIT q->interfaceRemoved(ModemManager::ModemDevice::TimeInterface);
0456         }
0457 #if MM_CHECK_VERSION(1, 2, 0)
0458         else if (iface == QLatin1String(MMQT_DBUS_INTERFACE_MODEM_OMA)) {
0459             interfaceList.remove(ModemManager::ModemDevice::OmaInterface);
0460             Q_EMIT q->interfaceRemoved(ModemManager::ModemDevice::OmaInterface);
0461         } else if (iface == QLatin1String(MMQT_DBUS_INTERFACE_MODEM_SIGNAL)) {
0462             interfaceList.remove(ModemManager::ModemDevice::SignalInterface);
0463             Q_EMIT q->interfaceRemoved(ModemManager::ModemDevice::SignalInterface);
0464         }
0465 #endif
0466         else if (iface == QLatin1String(MMQT_DBUS_INTERFACE_MODEM_FIRMWARE)) {
0467             interfaceList.remove(ModemManager::ModemDevice::FirmwareInterface);
0468             Q_EMIT q->interfaceRemoved(ModemManager::ModemDevice::FirmwareInterface);
0469         }
0470 #if MM_CHECK_VERSION(1, 6, 0)
0471         else if (iface == QLatin1String(MMQT_DBUS_INTERFACE_MODEM_VOICE)) {
0472             interfaceList.remove(ModemManager::ModemDevice::VoiceInterface);
0473             Q_EMIT q->interfaceRemoved(ModemManager::ModemDevice::VoiceInterface);
0474         }
0475 #endif
0476     }
0477 }
0478 
0479 void ModemManager::ModemDevicePrivate::onSimPathChanged(const QString &oldPath, const QString &newPath)
0480 {
0481     Q_Q(ModemDevice);
0482 
0483     if (!oldPath.isEmpty() && simCard->uni() == oldPath) {
0484         Q_EMIT q->simRemoved(oldPath);
0485         simCard = ModemManager::Sim::Ptr();
0486     }
0487 
0488     if (!newPath.isEmpty()) {
0489         simCard = ModemManager::Sim::Ptr(new ModemManager::Sim(newPath), &QObject::deleteLater);
0490         Q_EMIT q->simAdded(newPath);
0491     }
0492 }
0493 
0494 #include "moc_modemdevice.cpp"
0495 #include "moc_modemdevice_p.cpp"