File indexing completed on 2024-10-06 07:57:35
0001 /** 0002 * SPDX-FileCopyrightText: 2020 Nicolas Fella <nicolas.fella@gmx.de> 0003 * SPDX-FileCopyrightText: 2021 Nate Graham <nate@kde.org> 0004 * SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-only OR LicenseRef-KDE-Accepted-GPL 0005 */ 0006 0007 #include "bluetooth.h" 0008 0009 #include <QAbstractItemModel> 0010 #include <QDBusConnection> 0011 #include <QDBusMessage> 0012 #include <QDBusPendingCallWatcher> 0013 #include <QDBusPendingReply> 0014 0015 #include <KAboutData> 0016 #include <KConfigGroup> 0017 #include <KIO/ApplicationLauncherJob> 0018 #include <KIO/CommandLauncherJob> 0019 #include <KLocalizedString> 0020 #include <KPluginFactory> 0021 #include <KSharedConfig> 0022 0023 #include <BluezQt/Services> 0024 0025 #include "filereceiversettings.h" 0026 0027 K_PLUGIN_CLASS_WITH_JSON(Bluetooth, "kcm_bluetooth.json") 0028 0029 Bluetooth::Bluetooth(QObject *parent, const KPluginMetaData &data) 0030 : KQuickConfigModule(parent, data) 0031 { 0032 setButtons(Help); 0033 0034 qmlRegisterAnonymousType<QAbstractItemModel>("org.kde.bluedevil.kcm", 1); 0035 qmlRegisterSingletonInstance("org.kde.bluedevil.kcm", 1, 0, "FileReceiverSettings", FileReceiverSettings::self()); 0036 } 0037 0038 void Bluetooth::runWizard() 0039 { 0040 auto *job = new KIO::ApplicationLauncherJob(KService::serviceByDesktopName(QStringLiteral("org.kde.bluedevilwizard"))); 0041 connect(job, &KJob::finished, this, [this](KJob *job) { 0042 if (job->error()) { 0043 Q_EMIT errorOccured(job->errorString()); 0044 } 0045 }); 0046 job->start(); 0047 } 0048 0049 void Bluetooth::runSendFile(const QString &ubi) 0050 { 0051 auto *job = new KIO::CommandLauncherJob(QStringLiteral("bluedevil-sendfile"), {QStringLiteral("-u"), ubi}); 0052 job->setDesktopName(QStringLiteral("org.kde.bluedevilsendfile")); 0053 connect(job, &KJob::finished, this, [this](KJob *job) { 0054 if (job->error()) { 0055 Q_EMIT errorOccured(job->errorString()); 0056 } 0057 }); 0058 job->start(); 0059 } 0060 0061 void Bluetooth::checkNetworkConnection(const QStringList &uuids, const QString &address) 0062 { 0063 if (uuids.contains(BluezQt::Services::Nap)) { 0064 checkNetworkInternal(QStringLiteral("nap"), address); 0065 } 0066 0067 if (uuids.contains(BluezQt::Services::DialupNetworking)) { 0068 checkNetworkInternal(QStringLiteral("dun"), address); 0069 } 0070 } 0071 0072 void Bluetooth::checkNetworkInternal(const QString &service, const QString &address) 0073 { 0074 QDBusMessage msg = QDBusMessage::createMethodCall(QStringLiteral("org.kde.plasmanetworkmanagement"), 0075 QStringLiteral("/org/kde/plasmanetworkmanagement"), 0076 QStringLiteral("org.kde.plasmanetworkmanagement"), 0077 QStringLiteral("bluetoothConnectionExists")); 0078 0079 msg << address; 0080 msg << service; 0081 0082 QDBusPendingCallWatcher *call = new QDBusPendingCallWatcher(QDBusConnection::sessionBus().asyncCall(msg)); 0083 connect(call, &QDBusPendingCallWatcher::finished, this, [this, service, call]() { 0084 QDBusPendingReply<bool> reply = *call; 0085 if (reply.isError()) { 0086 return; 0087 } 0088 0089 Q_EMIT networkAvailable(service, reply.value()); 0090 }); 0091 } 0092 0093 void Bluetooth::setupNetworkConnection(const QString &service, const QString &address, const QString &deviceName) 0094 { 0095 QDBusMessage msg = QDBusMessage::createMethodCall(QStringLiteral("org.kde.plasmanetworkmanagement"), 0096 QStringLiteral("/org/kde/plasmanetworkmanagement"), 0097 QStringLiteral("org.kde.plasmanetworkmanagement"), 0098 QStringLiteral("addBluetoothConnection")); 0099 0100 msg << address; 0101 msg << service; 0102 msg << i18nc("DeviceName Network (Service)", "%1 Network (%2)", deviceName, service); 0103 0104 QDBusConnection::sessionBus().call(msg, QDBus::NoBlock); 0105 } 0106 0107 QString Bluetooth::bluetoothStatusAtLogin() const 0108 { 0109 const auto config = KSharedConfig::openConfig(QStringLiteral("bluedevilglobalrc")); 0110 const KConfigGroup globalGroup = config->group("Global"); 0111 return globalGroup.readEntry("launchState", "remember"); 0112 } 0113 0114 void Bluetooth::setBluetoothStatusAtLogin(const QString &newStatus) 0115 { 0116 auto config = KSharedConfig::openConfig(QStringLiteral("bluedevilglobalrc")); 0117 KConfigGroup globalGroup = config->group("Global"); 0118 const QString currentValue = (globalGroup.readEntry("launchState", "remember")); 0119 0120 if (newStatus == currentValue) { 0121 return; 0122 } 0123 0124 if (newStatus == "remember") { 0125 // Default value 0126 globalGroup.deleteEntry("launchState"); 0127 } else { 0128 globalGroup.writeEntry("launchState", newStatus); 0129 } 0130 0131 Q_EMIT bluetoothStatusAtLoginChanged(newStatus); 0132 } 0133 0134 #include "bluetooth.moc" 0135 0136 #include "moc_bluetooth.cpp"