File indexing completed on 2025-04-20 04:33:18
0001 /** 0002 * SPDX-FileCopyrightText: 2013 Albert Vaca <albertvaka@gmail.com> 0003 * 0004 * SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-only OR LicenseRef-KDE-Accepted-GPL 0005 */ 0006 0007 #include "clipboardplugin.h" 0008 0009 #include "clipboardlistener.h" 0010 #include "plugin_clipboard_debug.h" 0011 0012 #include <KPluginFactory> 0013 0014 K_PLUGIN_CLASS_WITH_JSON(ClipboardPlugin, "kdeconnect_clipboard.json") 0015 0016 ClipboardPlugin::ClipboardPlugin(QObject *parent, const QVariantList &args) 0017 : KdeConnectPlugin(parent, args) 0018 { 0019 connect(ClipboardListener::instance(), &ClipboardListener::clipboardChanged, this, &ClipboardPlugin::clipboardChanged); 0020 connect(config(), &KdeConnectPluginConfig::configChanged, this, &ClipboardPlugin::configChanged); 0021 configChanged(); 0022 } 0023 0024 void ClipboardPlugin::connected() 0025 { 0026 sendConnectPacket(); 0027 } 0028 0029 QString ClipboardPlugin::dbusPath() const 0030 { 0031 return QLatin1String("/modules/kdeconnect/devices/%1/clipboard").arg(device()->id()); 0032 } 0033 0034 void ClipboardPlugin::clipboardChanged(const QString &content, ClipboardListener::ClipboardContentType contentType) 0035 { 0036 if (!autoShare) { 0037 return; 0038 } 0039 0040 if (contentType == ClipboardListener::ClipboardContentTypePassword) { 0041 if (!sharePasswords) { 0042 return; 0043 } 0044 } 0045 0046 sendClipboard(content); 0047 } 0048 0049 void ClipboardPlugin::configChanged() 0050 { 0051 autoShare = config()->getBool(QStringLiteral("autoShare"), config()->getBool(QStringLiteral("sendUnknown"), true)); 0052 sharePasswords = config()->getBool(QStringLiteral("sendPassword"), true); 0053 Q_EMIT autoShareDisabledChanged(isAutoShareDisabled()); 0054 } 0055 0056 bool ClipboardPlugin::isAutoShareDisabled() 0057 { 0058 // Return true also if autoShare is enabled but disabled for passwords 0059 return !autoShare || !sharePasswords; 0060 } 0061 0062 void ClipboardPlugin::sendClipboard() 0063 { 0064 QString content = ClipboardListener::instance()->currentContent(); 0065 sendClipboard(content); 0066 } 0067 0068 void ClipboardPlugin::sendClipboard(const QString &content) 0069 { 0070 NetworkPacket np(PACKET_TYPE_CLIPBOARD, {{QStringLiteral("content"), content}}); 0071 sendPacket(np); 0072 } 0073 0074 void ClipboardPlugin::sendConnectPacket() 0075 { 0076 NetworkPacket np(PACKET_TYPE_CLIPBOARD_CONNECT, 0077 {{QStringLiteral("content"), ClipboardListener::instance()->currentContent()}, 0078 {QStringLiteral("timestamp"), ClipboardListener::instance()->updateTimestamp()}}); 0079 sendPacket(np); 0080 } 0081 0082 void ClipboardPlugin::receivePacket(const NetworkPacket &np) 0083 { 0084 QString content = np.get<QString>(QStringLiteral("content")); 0085 if (np.type() == PACKET_TYPE_CLIPBOARD) { 0086 ClipboardListener::instance()->setText(content); 0087 } else if (np.type() == PACKET_TYPE_CLIPBOARD_CONNECT) { 0088 qint64 packetTime = np.get<qint64>(QStringLiteral("timestamp")); 0089 // If the packetTime is 0, it means the timestamp is unknown (so do nothing). 0090 if (packetTime == 0 || packetTime < ClipboardListener::instance()->updateTimestamp()) { 0091 qCWarning(KDECONNECT_PLUGIN_CLIPBOARD) << "Ignoring clipboard without timestamp"; 0092 return; 0093 } 0094 0095 ClipboardListener::instance()->setText(content); 0096 } 0097 } 0098 0099 #include "clipboardplugin.moc" 0100 #include "moc_clipboardplugin.cpp"