File indexing completed on 2025-02-02 14:20:50
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"