File indexing completed on 2024-04-21 04:56:50
0001 /** 0002 * SPDX-FileCopyrightText: 2019 Richard Liebscher <richard.liebscher@gmail.com> 0003 * SPDX-FileCopyrightText: 2022 Yoram Bar Haim <bhyoram@protonmail.com> 0004 * 0005 * SPDX-License-Identifier: GPL-3.0-or-later OR LicenseRef-KDE-Accepted-GPL 0006 */ 0007 0008 #include "mmtelephonyplugin.h" 0009 0010 #include <KLocalizedString> 0011 #include <QDebug> 0012 #include <QLoggingCategory> 0013 0014 #include "plugin_mmtelephony_debug.h" 0015 #include <KPluginFactory> 0016 0017 K_PLUGIN_CLASS_WITH_JSON(MMTelephonyPlugin, "kdeconnect_mmtelephony.json") 0018 0019 static const QString PACKET_TYPE_TELEPHONY = QStringLiteral("kdeconnect.telephony"); 0020 static const QString PACKET_TYPE_TELEPHONY_REQUEST_MUTE = QStringLiteral("kdeconnect.telephony.request_mute"); 0021 0022 QSharedPointer<ModemManager::ModemVoice> _voiceInterface(const QSharedPointer<ModemManager::ModemDevice> modemDevice) 0023 { 0024 return modemDevice->interface(ModemManager::ModemDevice::VoiceInterface).objectCast<ModemManager::ModemVoice>(); 0025 } 0026 0027 MMTelephonyPlugin::MMTelephonyPlugin(QObject *parent, const QVariantList &args) 0028 : KdeConnectPlugin(parent, args) 0029 { 0030 connect(ModemManager::notifier(), &ModemManager::Notifier::modemAdded, this, &MMTelephonyPlugin::onModemAdded); 0031 } 0032 0033 void MMTelephonyPlugin::receivePacket(const NetworkPacket &np) 0034 { 0035 if (np.get<QString>(QStringLiteral("event")) == QLatin1String("mute")) { 0036 // TODO: mute code 0037 } 0038 } 0039 0040 void MMTelephonyPlugin::onModemAdded(const QString &path) 0041 { 0042 auto modemDevice = ModemManager::findModemDevice(path); 0043 QSharedPointer<ModemManager::ModemVoice> vcm = _voiceInterface(modemDevice); 0044 auto voice = vcm.get(); 0045 connect(voice, &ModemManager::ModemVoice::callAdded, this, [this, voice](const QString &uni) { 0046 auto call = voice->findCall(uni); 0047 onCallAdded(call); 0048 }); 0049 connect(voice, &ModemManager::ModemVoice::callDeleted, this, [this, voice](const QString &uni) { 0050 auto call = voice->findCall(uni); 0051 onCallRemoved(call); 0052 }); 0053 } 0054 0055 void MMTelephonyPlugin::onCallAdded(ModemManager::Call::Ptr call) 0056 { 0057 qCDebug(KDECONNECT_PLUGIN_MMTELEPHONY) << "Call added" << call->number(); 0058 0059 connect(call.get(), &ModemManager::Call::stateChanged, this, [=](MMCallState newState, MMCallState oldState) { 0060 onCallStateChanged(call.get(), newState, oldState); 0061 }); 0062 } 0063 0064 void MMTelephonyPlugin::onCallRemoved(ModemManager::Call::Ptr call) 0065 { 0066 qCDebug(KDECONNECT_PLUGIN_MMTELEPHONY) << "Call removed" << call.get()->number(); 0067 } 0068 0069 QString MMTelephonyPlugin::stateName(MMCallState state) 0070 { 0071 QString event; 0072 switch (state) { 0073 case MMCallState::MM_CALL_STATE_RINGING_IN: 0074 event = QStringLiteral("ringing"); 0075 break; 0076 case MMCallState::MM_CALL_STATE_ACTIVE: 0077 event = QStringLiteral("talking"); 0078 break; 0079 case MMCallState::MM_CALL_STATE_TERMINATED: 0080 event = QStringLiteral("disconnected"); 0081 break; 0082 case MMCallState::MM_CALL_STATE_UNKNOWN: 0083 default: 0084 event = QStringLiteral("Unknown"); 0085 } 0086 return event; 0087 } 0088 0089 void MMTelephonyPlugin::onCallStateChanged(ModemManager::Call *call, MMCallState newState, MMCallState oldState) 0090 { 0091 auto event = stateName(newState); 0092 0093 qCDebug(KDECONNECT_PLUGIN_MMTELEPHONY) << "Call state changed" << call->uni() << event; 0094 if (newState != MMCallState::MM_CALL_STATE_TERMINATED) 0095 sendMMTelephonyPacket(call, event); 0096 else 0097 sendCancelMMTelephonyPacket(call, stateName(oldState)); 0098 } 0099 0100 void MMTelephonyPlugin::sendMMTelephonyPacket(ModemManager::Call *call, const QString &state) 0101 { 0102 QString phoneNumber = call->number(); 0103 0104 qCDebug(KDECONNECT_PLUGIN_MMTELEPHONY) << "Phone number is" << phoneNumber; 0105 NetworkPacket np{PACKET_TYPE_TELEPHONY, 0106 { 0107 {QStringLiteral("event"), state}, 0108 {QStringLiteral("phoneNumber"), phoneNumber}, 0109 {QStringLiteral("contactName"), phoneNumber}, 0110 }}; 0111 sendPacket(np); 0112 } 0113 0114 void MMTelephonyPlugin::sendCancelMMTelephonyPacket(ModemManager::Call *call, const QString &lastState) 0115 { 0116 QString phoneNumber = call->number(); 0117 0118 NetworkPacket np{PACKET_TYPE_TELEPHONY, 0119 {{QStringLiteral("event"), lastState}, 0120 {QStringLiteral("phoneNumber"), phoneNumber}, 0121 {QStringLiteral("contactName"), phoneNumber}, 0122 {QStringLiteral("isCancel"), true}}}; 0123 sendPacket(np); 0124 } 0125 0126 #include "mmtelephonyplugin.moc" 0127 #include "moc_mmtelephonyplugin.cpp"