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

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 "call.h"
0008 #include "call_p.h"
0009 #include "mmdebug_p.h"
0010 
0011 #ifdef MMQT_STATIC
0012 #include "dbus/fakedbus.h"
0013 #else
0014 #include "dbus/dbus.h"
0015 #endif
0016 
0017 #include <ModemManager/ModemManager.h>
0018 
0019 ModemManager::CallPrivate::CallPrivate(const QString &path, Call *q)
0020 #ifdef MMQT_STATIC
0021     : callIface(QLatin1String(MMQT_DBUS_SERVICE), path, QDBusConnection::sessionBus())
0022 #else
0023     : callIface(QLatin1String(MMQT_DBUS_SERVICE), path, QDBusConnection::systemBus())
0024 #endif
0025     , q_ptr(q)
0026 {
0027     if (callIface.isValid()) {
0028         uni = path;
0029         state = (MMCallState)callIface.state();
0030         stateReason = (MMCallStateReason)callIface.stateReason();
0031         direction = (MMCallDirection)callIface.direction();
0032         number = callIface.number();
0033     }
0034 }
0035 
0036 ModemManager::Call::Call(const QString &path, QObject *parent)
0037     : QObject(parent)
0038     , d_ptr(new CallPrivate(path, this))
0039 {
0040     Q_D(Call);
0041 
0042     qRegisterMetaType<MMCallState>();
0043     qRegisterMetaType<MMCallStateReason>();
0044     qRegisterMetaType<MMCallDirection>();
0045 
0046 #ifdef MMQT_STATIC
0047     QDBusConnection::sessionBus().connect(QLatin1String(MMQT_DBUS_SERVICE),
0048                                           path,
0049                                           QLatin1String(DBUS_INTERFACE_PROPS),
0050                                           QStringLiteral("PropertiesChanged"),
0051                                           d,
0052                                           SLOT(onPropertiesChanged(QString, QVariantMap, QStringList)));
0053 #else
0054     QDBusConnection::systemBus().connect(QLatin1String(MMQT_DBUS_SERVICE),
0055                                          path,
0056                                          QLatin1String(DBUS_INTERFACE_PROPS),
0057                                          QStringLiteral("PropertiesChanged"),
0058                                          d,
0059                                          SLOT(onPropertiesChanged(QString, QVariantMap, QStringList)));
0060 #endif
0061 
0062     connect(&d->callIface, &OrgFreedesktopModemManager1CallInterface::StateChanged, d, &CallPrivate::onStateChanged);
0063     connect(&d->callIface, &OrgFreedesktopModemManager1CallInterface::DtmfReceived, d, &CallPrivate::onDtmfReceived);
0064 }
0065 
0066 ModemManager::Call::~Call()
0067 {
0068     delete d_ptr;
0069 }
0070 
0071 QString ModemManager::Call::uni() const
0072 {
0073     Q_D(const Call);
0074     return d->uni;
0075 }
0076 
0077 QDBusPendingReply<> ModemManager::Call::start()
0078 {
0079     Q_D(Call);
0080     return d->callIface.Start();
0081 }
0082 
0083 QDBusPendingReply<> ModemManager::Call::accept()
0084 {
0085     Q_D(Call);
0086     return d->callIface.Accept();
0087 }
0088 
0089 QDBusPendingReply<> ModemManager::Call::hangup()
0090 {
0091     Q_D(Call);
0092     return d->callIface.Hangup();
0093 }
0094 
0095 QDBusPendingReply<> ModemManager::Call::sendDtmf(const QString &dtmf)
0096 {
0097     Q_D(Call);
0098     return d->callIface.SendDtmf(dtmf);
0099 }
0100 
0101 MMCallState ModemManager::Call::state() const
0102 {
0103     Q_D(const Call);
0104     return d->state;
0105 }
0106 
0107 MMCallStateReason ModemManager::Call::stateReason() const
0108 {
0109     Q_D(const Call);
0110     return d->stateReason;
0111 }
0112 
0113 MMCallDirection ModemManager::Call::direction() const
0114 {
0115     Q_D(const Call);
0116     return d->direction;
0117 }
0118 
0119 QString ModemManager::Call::number() const
0120 {
0121     Q_D(const Call);
0122     return d->number;
0123 }
0124 
0125 void ModemManager::Call::setTimeout(int timeout)
0126 {
0127     Q_D(Call);
0128     d->callIface.setTimeout(timeout);
0129 }
0130 
0131 int ModemManager::Call::timeout() const
0132 {
0133     Q_D(const Call);
0134     return d->callIface.timeout();
0135 }
0136 
0137 void ModemManager::CallPrivate::onStateChanged(int oldState, int newState, uint reason)
0138 {
0139     Q_Q(Call);
0140     state = (MMCallState)newState;
0141     stateReason = (MMCallStateReason)reason;
0142     Q_EMIT q->stateChanged((MMCallState)oldState, (MMCallState)newState, (MMCallStateReason)reason);
0143 }
0144 
0145 void ModemManager::CallPrivate::onDtmfReceived(const QString &dtmf)
0146 {
0147     Q_Q(Call);
0148     Q_EMIT q->dtmfReceived(dtmf);
0149 }
0150 
0151 void ModemManager::CallPrivate::onPropertiesChanged(const QString &interfaceName,
0152                                                     const QVariantMap &changedProperties,
0153                                                     const QStringList &invalidatedProperties)
0154 {
0155     Q_UNUSED(invalidatedProperties);
0156     Q_Q(Call);
0157 
0158     if (interfaceName == QLatin1String(MMQT_DBUS_INTERFACE_CALL)) {
0159         QVariantMap::const_iterator it = changedProperties.constFind(QLatin1String(MM_CALL_PROPERTY_NUMBER));
0160         if (it != changedProperties.constEnd()) {
0161             number = it->toString();
0162             Q_EMIT q->numberChanged(number);
0163         }
0164     }
0165 }
0166 
0167 #include "moc_call.cpp"
0168 #include "moc_call_p.cpp"