File indexing completed on 2024-05-05 05:36:38

0001 /*
0002     SPDX-FileCopyrightText: 2018 Martin Kacej <m.kacej@atlas.sk>
0003     SPDX-FileCopyrightText: 2020-2021 Devin Lin <espidev@gmail.com>
0004 
0005     SPDX-License-Identifier: GPL-2.0-or-later
0006 */
0007 
0008 #include "cellularnetworksettings.h"
0009 
0010 #include <KLocalizedString>
0011 #include <KPluginFactory>
0012 #include <KUser>
0013 
0014 #include <QQmlEngine>
0015 
0016 K_PLUGIN_CLASS_WITH_JSON(CellularNetworkSettings, "kcm_cellular_network.json")
0017 
0018 CellularNetworkSettings *CellularNetworkSettings::staticInst = nullptr;
0019 
0020 CellularNetworkSettings::CellularNetworkSettings(QObject *parent, const KPluginMetaData &metaData)
0021     : KQuickConfigModule(parent, metaData)
0022     , m_modemList{}
0023     , m_simList{}
0024 {
0025     setButtons({});
0026 
0027     CellularNetworkSettings::staticInst = this;
0028 
0029     qmlRegisterType<ProfileSettings>("cellularnetworkkcm", 1, 0, "ProfileSettings");
0030     qmlRegisterType<Modem>("cellularnetworkkcm", 1, 0, "Modem");
0031     qmlRegisterType<ModemDetails>("cellularnetworkkcm", 1, 0, "ModemDetails");
0032     qmlRegisterType<AvailableNetwork>("cellularnetworkkcm", 1, 0, "AvailableNetwork");
0033     qmlRegisterType<Sim>("cellularnetworkkcm", 1, 0, "Sim");
0034     qmlRegisterType<InlineMessage>("cellularnetworkkcm", 1, 0, "InlineMessage");
0035 
0036     // find modems
0037     updateModemList();
0038 
0039     connect(ModemManager::notifier(), &ModemManager::Notifier::modemAdded, this, &CellularNetworkSettings::updateModemList);
0040     connect(ModemManager::notifier(), &ModemManager::Notifier::modemRemoved, this, &CellularNetworkSettings::updateModemList);
0041 }
0042 
0043 CellularNetworkSettings *CellularNetworkSettings::instance()
0044 {
0045     return CellularNetworkSettings::staticInst;
0046 }
0047 
0048 Modem *CellularNetworkSettings::selectedModem()
0049 {
0050     // TODO: we are currently assuming there is a single modem
0051     if (m_modemList.count() > 0) {
0052         return m_modemList[0];
0053     }
0054     return nullptr;
0055 }
0056 
0057 QList<Modem *> CellularNetworkSettings::modems()
0058 {
0059     return m_modemList;
0060 }
0061 
0062 QList<Sim *> CellularNetworkSettings::sims()
0063 {
0064     return m_simList;
0065 }
0066 
0067 bool CellularNetworkSettings::modemFound()
0068 {
0069     return !m_modemList.empty();
0070 }
0071 
0072 void CellularNetworkSettings::updateModemList()
0073 {
0074     // loop over every modem
0075     for (ModemManager::ModemDevice::Ptr device : ModemManager::modemDevices()) {
0076         ModemManager::Modem::Ptr modem = device->modemInterface();
0077 
0078         qDebug() << QStringLiteral("Found modem:") << device->uni();
0079 
0080         m_modemList.push_back(new Modem(this, device, modem));
0081 
0082         // update sims list if modem's list changes
0083         connect(m_modemList[m_modemList.size() - 1], &Modem::simsChanged, this, [this]() -> void {
0084             fillSims();
0085         });
0086     }
0087 
0088     if (m_modemList.empty()) {
0089         qDebug() << QStringLiteral("No modems found.");
0090     }
0091 
0092     // fill sim list
0093     fillSims();
0094 
0095     // update the currently selected modem
0096     Q_EMIT selectedModemChanged();
0097 }
0098 
0099 void CellularNetworkSettings::fillSims()
0100 {
0101     for (auto p : m_simList) {
0102         delete p;
0103     }
0104     m_simList.clear();
0105 
0106     qDebug() << QStringLiteral("Scanning SIMs list...");
0107     for (auto modem : m_modemList) {
0108         auto sims = modem->sims();
0109         for (auto sim : sims) {
0110             qDebug() << QStringLiteral("Found SIM") << sim->uni() << sim->imsi();
0111             m_simList.push_back(sim);
0112         }
0113     }
0114 
0115     Q_EMIT simsChanged();
0116 }
0117 
0118 QList<InlineMessage *> CellularNetworkSettings::messages()
0119 {
0120     return m_messages;
0121 }
0122 
0123 void CellularNetworkSettings::addMessage(InlineMessage::Type type, QString msg)
0124 {
0125     m_messages.push_back(new InlineMessage{this, type, msg});
0126     Q_EMIT messagesChanged();
0127 }
0128 
0129 void CellularNetworkSettings::removeMessage(int index)
0130 {
0131     if (index >= 0 && index < m_messages.size()) {
0132         m_messages.removeAt(index);
0133         Q_EMIT messagesChanged();
0134     }
0135 }
0136 
0137 InlineMessage::InlineMessage(QObject *parent, Type type, QString message)
0138     : QObject{parent}
0139     , m_type{type}
0140     , m_message{message}
0141 {
0142 }
0143 
0144 InlineMessage::Type InlineMessage::type()
0145 {
0146     return m_type;
0147 }
0148 
0149 QString InlineMessage::message()
0150 {
0151     return m_message;
0152 }
0153 
0154 #include "cellularnetworksettings.moc"