File indexing completed on 2024-04-14 03:57:24

0001 /*
0002     SPDX-FileCopyrightText: 2013 Anant Kamath <kamathanant@gmail.com>
0003     SPDX-FileCopyrightText: 2013 Lukas Tinkl <ltinkl@redhat.com>
0004     SPDX-FileCopyrightText: 2013-2015 Jan Grulich <jgrulich@redhat.com>
0005 
0006     SPDX-License-Identifier: LGPL-2.1-only OR LGPL-3.0-only OR LicenseRef-KDE-Accepted-LGPL
0007 */
0008 
0009 #include "modemmessaging.h"
0010 #include "modemmessaging_p.h"
0011 
0012 #ifdef MMQT_STATIC
0013 #include "dbus/fakedbus.h"
0014 #else
0015 #include "dbus/dbus.h"
0016 #endif
0017 #include "mmdebug_p.h"
0018 
0019 #include <ModemManager/ModemManager.h>
0020 
0021 ModemManager::ModemMessagingPrivate::ModemMessagingPrivate(const QString &path, ModemMessaging *q)
0022     : InterfacePrivate(path, q)
0023 #ifdef MMQT_STATIC
0024     , modemMessagingIface(QLatin1String(MMQT_DBUS_SERVICE), path, QDBusConnection::sessionBus())
0025 #else
0026     , modemMessagingIface(QLatin1String(MMQT_DBUS_SERVICE), path, QDBusConnection::systemBus())
0027 #endif
0028     , q_ptr(q)
0029 {
0030     if (modemMessagingIface.isValid()) {
0031         QList<MMSmsStorage> storages;
0032         Q_FOREACH (uint storage, modemMessagingIface.supportedStorages()) {
0033             storages.append((MMSmsStorage)storage);
0034         }
0035         supportedStorages = storages;
0036         defaultStorage = (MMSmsStorage)modemMessagingIface.defaultStorage();
0037 
0038         connect(&modemMessagingIface, &OrgFreedesktopModemManager1ModemMessagingInterface::Added, this, &ModemMessagingPrivate::onMessageAdded);
0039         connect(&modemMessagingIface, &OrgFreedesktopModemManager1ModemMessagingInterface::Deleted, this, &ModemMessagingPrivate::onMessageDeleted);
0040     }
0041 }
0042 
0043 ModemManager::ModemMessaging::ModemMessaging(const QString &path, QObject *parent)
0044     : Interface(*new ModemMessagingPrivate(path, this), parent)
0045 {
0046     Q_D(ModemMessaging);
0047 #ifdef MMQT_STATIC
0048     QDBusConnection::sessionBus().connect(QLatin1String(MMQT_DBUS_SERVICE),
0049                                           path,
0050                                           QLatin1String(DBUS_INTERFACE_PROPS),
0051                                           QStringLiteral("PropertiesChanged"),
0052                                           this,
0053                                           SLOT(onPropertiesChanged(QString, QVariantMap, QStringList)));
0054 #else
0055     QDBusConnection::systemBus().connect(QLatin1String(MMQT_DBUS_SERVICE),
0056                                          path,
0057                                          QLatin1String(DBUS_INTERFACE_PROPS),
0058                                          QStringLiteral("PropertiesChanged"),
0059                                          this,
0060                                          SLOT(onPropertiesChanged(QString, QVariantMap, QStringList)));
0061 #endif
0062     QList<QDBusObjectPath> messages = d->modemMessagingIface.messages();
0063     Q_FOREACH (const QDBusObjectPath &op, messages) {
0064         const QString objectPathAsString = op.path();
0065         d->messageList.insert(objectPathAsString, ModemManager::Sms::Ptr());
0066         Q_EMIT messageAdded(objectPathAsString, false);
0067     }
0068 }
0069 
0070 ModemManager::ModemMessaging::~ModemMessaging()
0071 {
0072 }
0073 
0074 ModemManager::Sms::Ptr ModemManager::ModemMessagingPrivate::findMessage(const QString &uni)
0075 {
0076     ModemManager::Sms::Ptr sms;
0077     if (messageList.contains(uni)) {
0078         if (messageList.value(uni)) {
0079             sms = messageList.value(uni);
0080         } else {
0081             sms = ModemManager::Sms::Ptr(new ModemManager::Sms(uni), &QObject::deleteLater);
0082             messageList[uni] = sms;
0083         }
0084     }
0085     return sms;
0086 }
0087 
0088 ModemManager::Sms::List ModemManager::ModemMessagingPrivate::ModemMessagingPrivate::messages()
0089 {
0090     ModemManager::Sms::List list;
0091 
0092     QMap<QString, ModemManager::Sms::Ptr>::const_iterator i;
0093     for (i = messageList.constBegin(); i != messageList.constEnd(); ++i) {
0094         ModemManager::Sms::Ptr sms = findMessage(i.key());
0095         if (sms) {
0096             list.append(sms);
0097         } else {
0098             qCWarning(MMQT) << "warning: null message for" << i.key();
0099         }
0100     }
0101 
0102     return list;
0103 }
0104 
0105 void ModemManager::ModemMessagingPrivate::onPropertiesChanged(const QString &interfaceName,
0106                                                               const QVariantMap &changedProperties,
0107                                                               const QStringList &invalidatedProperties)
0108 {
0109     Q_UNUSED(invalidatedProperties);
0110 
0111     if (interfaceName == QLatin1String(MMQT_DBUS_INTERFACE_MODEM_MESSAGING)) {
0112         QVariantMap::const_iterator it = changedProperties.constFind(QLatin1String(MM_MODEM_MESSAGING_PROPERTY_SUPPORTEDSTORAGES));
0113         if (it != changedProperties.constEnd()) {
0114             QList<MMSmsStorage> storages;
0115             Q_FOREACH (uint storage, it->value<UIntList>()) {
0116                 storages.append((MMSmsStorage)storage);
0117             }
0118             supportedStorages = storages;
0119         }
0120         it = changedProperties.constFind(QLatin1String(MM_MODEM_MESSAGING_PROPERTY_DEFAULTSTORAGE));
0121         if (it != changedProperties.constEnd()) {
0122             defaultStorage = (MMSmsStorage)it->toInt();
0123         }
0124         // MESSAGES? should be handled by Added/Deleted signals
0125     }
0126 }
0127 
0128 void ModemManager::ModemMessagingPrivate::onMessageAdded(const QDBusObjectPath &path, bool received)
0129 {
0130     Q_Q(ModemMessaging);
0131     messageList.insert(path.path(), ModemManager::Sms::Ptr());
0132     Q_EMIT q->messageAdded(path.path(), received);
0133 }
0134 
0135 void ModemManager::ModemMessagingPrivate::onMessageDeleted(const QDBusObjectPath &path)
0136 {
0137     Q_Q(ModemMessaging);
0138     messageList.remove(path.path());
0139     Q_EMIT q->messageDeleted(path.path());
0140 }
0141 
0142 QList<MMSmsStorage> ModemManager::ModemMessaging::supportedStorages() const
0143 {
0144     Q_D(const ModemMessaging);
0145     return d->supportedStorages;
0146 }
0147 
0148 MMSmsStorage ModemManager::ModemMessaging::defaultStorage() const
0149 {
0150     Q_D(const ModemMessaging);
0151     return d->defaultStorage;
0152 }
0153 
0154 ModemManager::Sms::List ModemManager::ModemMessaging::messages() const
0155 {
0156     Q_D(const ModemMessaging);
0157     return const_cast<ModemMessagingPrivate *>(d)->messages();
0158 }
0159 
0160 QDBusPendingReply<QDBusObjectPath> ModemManager::ModemMessaging::createMessage(const Message &message)
0161 {
0162     QVariantMap map;
0163     map.insert(QStringLiteral("number"), message.number);
0164     map.insert(QStringLiteral("text"), message.text);
0165     map.insert(QStringLiteral("data"), message.data);
0166 
0167     return createMessage(map);
0168 }
0169 
0170 QDBusPendingReply<QDBusObjectPath> ModemManager::ModemMessaging::createMessage(const QVariantMap &message)
0171 {
0172     Q_D(ModemMessaging);
0173 
0174     if (!message.contains(QLatin1String("number")) || (!message.contains(QLatin1String("text")) && !message.contains(QLatin1String("data")))) {
0175         qCDebug(MMQT) << "Unable to create message, missing some property";
0176         return QDBusPendingReply<QDBusObjectPath>();
0177     }
0178 
0179     return d->modemMessagingIface.Create(message);
0180 }
0181 
0182 QDBusPendingReply<void> ModemManager::ModemMessaging::deleteMessage(const QString &uni)
0183 {
0184     Q_D(ModemMessaging);
0185     return d->modemMessagingIface.Delete(QDBusObjectPath(uni));
0186 }
0187 
0188 ModemManager::Sms::Ptr ModemManager::ModemMessaging::findMessage(const QString &uni)
0189 {
0190     Q_D(ModemMessaging);
0191     return d->findMessage(uni);
0192 }
0193 
0194 void ModemManager::ModemMessaging::setTimeout(int timeout)
0195 {
0196     Q_D(ModemMessaging);
0197     d->modemMessagingIface.setTimeout(timeout);
0198 }
0199 
0200 int ModemManager::ModemMessaging::timeout() const
0201 {
0202     Q_D(const ModemMessaging);
0203     return d->modemMessagingIface.timeout();
0204 }
0205 
0206 #include "moc_modemmessaging.cpp"