File indexing completed on 2024-04-28 03:59:48

0001 /*
0002     SPDX-FileCopyrightText: 2015 Jan Grulich <jgrulich@redhat.com>
0003 
0004     SPDX-License-Identifier: LGPL-2.1-only OR LGPL-3.0-only OR LicenseRef-KDE-Accepted-LGPL
0005 */
0006 
0007 #include "fakemodem.h"
0008 #include "dbus/fakedbus.h"
0009 
0010 #include <QDBusConnection>
0011 #include <QDBusMessage>
0012 #include <QDBusMetaType>
0013 
0014 FakeModem::FakeModem(QObject *parent)
0015     : QObject(parent)
0016     , m_bearerCounter(0)
0017     , m_modemCounter(0)
0018     , m_objectManager(new ObjectManager(this))
0019 {
0020     qDBusRegisterMetaType<ModemManager::MMVariantMapMap>();
0021     qDBusRegisterMetaType<ModemManager::UIntList>();
0022     qDBusRegisterMetaType<ModemManager::CurrentModesType>();
0023     qDBusRegisterMetaType<ModemManager::SupportedModesType>();
0024     qDBusRegisterMetaType<ModemManager::SignalQualityPair>();
0025     qDBusRegisterMetaType<ModemManager::PortList>();
0026     qDBusRegisterMetaType<ModemManager::UnlockRetriesMap>();
0027     qDBusRegisterMetaType<ModemManager::Port>();
0028     qDBusRegisterMetaType<ModemManager::LocationInformationMap>();
0029 
0030     QDBusConnection::sessionBus().registerService(QLatin1String(MMQT_DBUS_SERVICE));
0031     QDBusConnection::sessionBus().registerObject(QLatin1String(MMQT_DBUS_PATH),
0032                                                  this,
0033                                                  QDBusConnection::ExportScriptableContents | QDBusConnection::ExportAdaptors);
0034 }
0035 
0036 FakeModem::~FakeModem()
0037 {
0038     QDBusConnection::sessionBus().unregisterObject(QLatin1String(MMQT_DBUS_SERVICE));
0039     QDBusConnection::sessionBus().unregisterService(QLatin1String(MMQT_DBUS_SERVICE));
0040 }
0041 
0042 void FakeModem::addModem(Modem *modem)
0043 {
0044     QString newModemPath = QStringLiteral("/org/kde/fakemodem/Modem/") + QString::number(m_modemCounter++);
0045     modem->setModemPath(newModemPath);
0046     // Start monitoring property changes
0047     modem->setEnableNotifications(true);
0048     m_modems.insert(QDBusObjectPath(newModemPath), modem);
0049     QDBusConnection::sessionBus().registerObject(newModemPath, modem, QDBusConnection::ExportScriptableContents | QDBusConnection::ExportAdaptors);
0050 
0051     ModemManager::MMVariantMapMap interfaces;
0052     interfaces.insert(QLatin1String(MMQT_DBUS_INTERFACE_MODEM), modem->toMap());
0053 
0054     m_objectManager->addInterfaces(QDBusObjectPath(newModemPath), interfaces);
0055 }
0056 
0057 void FakeModem::removeModem(Modem *modem)
0058 {
0059     m_modems.remove(QDBusObjectPath(modem->modemPath()));
0060     QDBusConnection::sessionBus().unregisterObject(modem->modemPath());
0061 
0062     m_objectManager->removeInterfaces(QDBusObjectPath(modem->modemPath()), {QLatin1String(MMQT_DBUS_INTERFACE_MODEM)});
0063 }
0064 
0065 void FakeModem::addBearer(Bearer *bearer)
0066 {
0067     QString newBearerPath = QStringLiteral("/org/kde/fakemodem/Bearer/") + QString::number(m_bearerCounter++);
0068     bearer->setBearerPath(newBearerPath);
0069     bearer->setEnableNotifications(true);
0070     m_bearers.insert(QDBusObjectPath(newBearerPath), bearer);
0071     QDBusConnection::sessionBus().registerObject(newBearerPath, bearer, QDBusConnection::ExportScriptableContents);
0072     Q_FOREACH (Modem *modem, m_modems.values()) {
0073         modem->addBearer(QDBusObjectPath(newBearerPath));
0074         QVariantMap map;
0075         map.insert(QLatin1String("Bearers"), QVariant::fromValue<QList<QDBusObjectPath>>(modem->bearers()));
0076         QDBusMessage message =
0077             QDBusMessage::createSignal(modem->modemPath(), QLatin1String("org.freedesktop.DBus.Properties"), QLatin1String("PropertiesChanged"));
0078         message << QLatin1String("org.kde.fakemodem.Modem") << map << QStringList();
0079         QDBusConnection::sessionBus().send(message);
0080     }
0081 }
0082 
0083 void FakeModem::removeBearer(Bearer *bearer)
0084 {
0085     m_bearers.remove(QDBusObjectPath(bearer->bearerPath()));
0086     QDBusConnection::sessionBus().unregisterObject(bearer->bearerPath());
0087     Q_FOREACH (Modem *modem, m_modems.values()) {
0088         modem->removeBearer(QDBusObjectPath(bearer->bearerPath()));
0089         QVariantMap map;
0090         map.insert(QLatin1String("Bearers"), QVariant::fromValue<QList<QDBusObjectPath>>(modem->bearers()));
0091         QDBusMessage message =
0092             QDBusMessage::createSignal(modem->modemPath(), QLatin1String("org.freedesktop.DBus.Properties"), QLatin1String("PropertiesChanged"));
0093         message << QLatin1String("org.kde.fakemodem.Modem") << map << QStringList();
0094         QDBusConnection::sessionBus().send(message);
0095     }
0096 }
0097 
0098 void FakeModem::addInterfaces(const QDBusObjectPath &object_path, const ModemManager::MMVariantMapMap &interfaces_and_properties)
0099 {
0100     m_objectManager->addInterfaces(object_path, interfaces_and_properties);
0101 }
0102 
0103 void FakeModem::removeInterfaces(const QDBusObjectPath &object_path, const QStringList &interfaces)
0104 {
0105     m_objectManager->removeInterfaces(object_path, interfaces);
0106 }
0107 
0108 void FakeModem::ScanDevices()
0109 {
0110 }
0111 
0112 void FakeModem::SetLogging(const QString &level)
0113 {
0114     Q_UNUSED(level);
0115 }
0116 
0117 #include "moc_fakemodem.cpp"