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"