File indexing completed on 2024-04-28 15:32:58

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