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

0001 /*
0002     SPDX-FileCopyrightText: 2018 Aleksander Morgado <aleksander@aleksander.es>
0003 
0004     SPDX-License-Identifier: LGPL-2.1-only OR LGPL-3.0-only OR LicenseRef-KDE-Accepted-LGPL
0005 */
0006 
0007 #include "modemvoice.h"
0008 #include "modemvoice_p.h"
0009 
0010 #ifdef MMQT_STATIC
0011 #include "dbus/fakedbus.h"
0012 #else
0013 #include "dbus/dbus.h"
0014 #endif
0015 #include "mmdebug_p.h"
0016 
0017 #include <ModemManager/ModemManager.h>
0018 
0019 ModemManager::ModemVoicePrivate::ModemVoicePrivate(const QString &path, ModemVoice *q)
0020     : InterfacePrivate(path, q)
0021 #ifdef MMQT_STATIC
0022     , modemVoiceIface(QLatin1String(MMQT_DBUS_SERVICE), path, QDBusConnection::sessionBus())
0023 #else
0024     , modemVoiceIface(QLatin1String(MMQT_DBUS_SERVICE), path, QDBusConnection::systemBus())
0025 #endif
0026     , q_ptr(q)
0027 {
0028     if (modemVoiceIface.isValid()) {
0029         connect(&modemVoiceIface, &OrgFreedesktopModemManager1ModemVoiceInterface::CallAdded, this, &ModemVoicePrivate::onCallAdded);
0030         connect(&modemVoiceIface, &OrgFreedesktopModemManager1ModemVoiceInterface::CallDeleted, this, &ModemVoicePrivate::onCallDeleted);
0031     }
0032 }
0033 
0034 ModemManager::ModemVoice::ModemVoice(const QString &path, QObject *parent)
0035     : Interface(*new ModemVoicePrivate(path, this), parent)
0036 {
0037     Q_D(ModemVoice);
0038 
0039     // Note: no need to listen for PropertiesChanged signals. Additions and
0040     // removals of calls are already notified via CallAdded and CallRemoved
0041 
0042     QList<QDBusObjectPath> calls = d->modemVoiceIface.calls();
0043     Q_FOREACH (const QDBusObjectPath &op, calls) {
0044         const QString path = op.path();
0045         d->callList.insert(path, ModemManager::Call::Ptr());
0046         Q_EMIT callAdded(path);
0047     }
0048 }
0049 
0050 ModemManager::ModemVoice::~ModemVoice()
0051 {
0052 }
0053 
0054 ModemManager::Call::Ptr ModemManager::ModemVoicePrivate::findCall(const QString &uni)
0055 {
0056     ModemManager::Call::Ptr call;
0057     if (callList.contains(uni)) {
0058         if (callList.value(uni)) {
0059             call = callList.value(uni);
0060         } else {
0061             call = ModemManager::Call::Ptr(new ModemManager::Call(uni), &QObject::deleteLater);
0062             callList[uni] = call;
0063         }
0064     }
0065     return call;
0066 }
0067 
0068 ModemManager::Call::List ModemManager::ModemVoicePrivate::ModemVoicePrivate::calls()
0069 {
0070     ModemManager::Call::List list;
0071 
0072     QMap<QString, ModemManager::Call::Ptr>::const_iterator i;
0073     for (i = callList.constBegin(); i != callList.constEnd(); ++i) {
0074         ModemManager::Call::Ptr call = findCall(i.key());
0075         if (call) {
0076             list.append(call);
0077         } else {
0078             qCWarning(MMQT) << "warning: null call for" << i.key();
0079         }
0080     }
0081 
0082     return list;
0083 }
0084 
0085 void ModemManager::ModemVoicePrivate::onCallAdded(const QDBusObjectPath &path)
0086 {
0087     Q_Q(ModemVoice);
0088     callList.insert(path.path(), ModemManager::Call::Ptr());
0089     Q_EMIT q->callAdded(path.path());
0090 }
0091 
0092 void ModemManager::ModemVoicePrivate::onCallDeleted(const QDBusObjectPath &path)
0093 {
0094     Q_Q(ModemVoice);
0095     callList.remove(path.path());
0096     Q_EMIT q->callDeleted(path.path());
0097 }
0098 
0099 ModemManager::Call::List ModemManager::ModemVoice::calls() const
0100 {
0101     Q_D(const ModemVoice);
0102     return const_cast<ModemVoicePrivate *>(d)->calls();
0103 }
0104 
0105 QDBusPendingReply<QDBusObjectPath> ModemManager::ModemVoice::createCall(const QString &number)
0106 {
0107     QVariantMap map;
0108     map.insert(QStringLiteral("number"), number);
0109     return createCall(map);
0110 }
0111 
0112 QDBusPendingReply<QDBusObjectPath> ModemManager::ModemVoice::createCall(const QVariantMap &call)
0113 {
0114     Q_D(ModemVoice);
0115 
0116     if (!call.contains(QLatin1String("number"))) {
0117         qCDebug(MMQT) << "Unable to create call, missing some property";
0118         return QDBusPendingReply<QDBusObjectPath>();
0119     }
0120 
0121     return d->modemVoiceIface.CreateCall(call);
0122 }
0123 
0124 QDBusPendingReply<void> ModemManager::ModemVoice::deleteCall(const QString &uni)
0125 {
0126     Q_D(ModemVoice);
0127     return d->modemVoiceIface.DeleteCall(QDBusObjectPath(uni));
0128 }
0129 
0130 ModemManager::Call::Ptr ModemManager::ModemVoice::findCall(const QString &uni)
0131 {
0132     Q_D(ModemVoice);
0133     return d->findCall(uni);
0134 }
0135 
0136 void ModemManager::ModemVoice::setTimeout(int timeout)
0137 {
0138     Q_D(ModemVoice);
0139     d->modemVoiceIface.setTimeout(timeout);
0140 }
0141 
0142 int ModemManager::ModemVoice::timeout() const
0143 {
0144     Q_D(const ModemVoice);
0145     return d->modemVoiceIface.timeout();
0146 }
0147 
0148 #include "moc_modemvoice.cpp"