File indexing completed on 2024-04-21 04:56:49

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"