File indexing completed on 2025-02-16 13:12:31
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 path = op.path(); 0065 d->messageList.insert(path, ModemManager::Sms::Ptr()); 0066 Q_EMIT messageAdded(path, 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"