2018-09-10 10:28:54 +01:00
|
|
|
/**
|
2020-08-17 10:48:10 +01:00
|
|
|
* SPDX-FileCopyrightText: 2013 Albert Vaca <albertvaka@gmail.com>
|
|
|
|
* SPDX-FileCopyrightText: 2018 Simon Redman <simon@ergotech.com>
|
2018-09-10 10:28:54 +01:00
|
|
|
*
|
2020-08-17 10:48:10 +01:00
|
|
|
* SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-only OR LicenseRef-KDE-Accepted-GPL
|
2018-09-10 10:28:54 +01:00
|
|
|
*/
|
|
|
|
|
|
|
|
#ifndef SMSPLUGIN_H
|
|
|
|
#define SMSPLUGIN_H
|
|
|
|
|
|
|
|
#include <QObject>
|
|
|
|
|
|
|
|
#include <core/kdeconnectplugin.h>
|
|
|
|
|
|
|
|
#include "conversationsdbusinterface.h"
|
|
|
|
#include "interfaces/conversationmessage.h"
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Packet used to indicate a batch of messages has been pushed from the remote device
|
|
|
|
*
|
|
|
|
* The body should contain the key "messages" mapping to an array of messages
|
|
|
|
*
|
|
|
|
* For example:
|
2019-07-20 21:35:53 +01:00
|
|
|
* {
|
|
|
|
* "version": 2 // This is the second version of this packet type and
|
|
|
|
* // version 1 packets (which did not carry this flag)
|
|
|
|
* // are incompatible with the new format
|
|
|
|
* "messages" : [
|
2018-11-15 23:57:58 +00:00
|
|
|
* { "event" : 1, // 32-bit field containing a bitwise-or of event flags
|
|
|
|
* // See constants declared in SMSHelper.Message for defined
|
|
|
|
* // values and explanations
|
|
|
|
* "body" : "Hello", // Text message body
|
2019-07-20 21:35:53 +01:00
|
|
|
* "addresses": <List<Address>> // List of Address objects, one for each participant of the conversation
|
|
|
|
* // The user's Address is excluded so:
|
2019-12-22 08:15:58 +00:00
|
|
|
* // If this is a single-target message, there will only be one
|
2019-07-20 21:35:53 +01:00
|
|
|
* // Address (the other party)
|
|
|
|
* // If this is an incoming multi-target message, the first Address is the
|
|
|
|
* // sender and all other addresses are other parties to the conversation
|
|
|
|
* // If this is an outgoing multi-target message, the sender is implicit
|
|
|
|
* // (the user's phone number) and all Addresses are recipients
|
2018-11-15 23:57:58 +00:00
|
|
|
* "date" : "1518846484880", // Timestamp of the message
|
|
|
|
* "type" : "2", // Compare with Android's
|
|
|
|
* // Telephony.TextBasedSmsColumns.MESSAGE_TYPE_*
|
2019-07-20 21:35:53 +01:00
|
|
|
* "thread_id" : 132 // Thread to which the message belongs
|
2018-11-15 23:57:58 +00:00
|
|
|
* "read" : true // Boolean representing whether a message is read or unread
|
|
|
|
* },
|
|
|
|
* { ... },
|
|
|
|
* ...
|
|
|
|
* ]
|
2019-07-20 21:35:53 +01:00
|
|
|
*
|
|
|
|
* The following optional fields of a message object may be defined
|
|
|
|
* "sub_id": <int> // Android's subscriber ID, which is basically used to determine which SIM card the message
|
|
|
|
* // belongs to. This is mostly useful when attempting to reply to an SMS with the correct
|
|
|
|
* // SIM card using PACKET_TYPE_SMS_REQUEST.
|
|
|
|
* // If this value is not defined or if it does not match a valid subscriber_id known by
|
|
|
|
* // Android, we will use whatever subscriber ID Android gives us as the default
|
|
|
|
*
|
2020-08-09 20:00:57 +01:00
|
|
|
* "attachments": <List<Attachment>> // List of Attachment objects, one for each attached file in the message.
|
|
|
|
*
|
|
|
|
* An Attachment object looks like:
|
|
|
|
* {
|
|
|
|
* "part_id": <long> // part_id of the attachment used to read the file from MMS database
|
|
|
|
* "mime_type": <int> // contains the mime type of the file (image, video, audio, etc.)
|
|
|
|
* "encoded_thumbnail": <String> // Optional base64-encoded thumbnail preview of the content for types which support it
|
|
|
|
* "unique_identifier": <String> // Unique name of te file
|
|
|
|
* }
|
|
|
|
*
|
2019-07-20 21:35:53 +01:00
|
|
|
* An Address object looks like:
|
|
|
|
* {
|
|
|
|
* "address": <String> // Address (phone number, email address, etc.) of this object
|
|
|
|
* }
|
2018-09-10 10:28:54 +01:00
|
|
|
*/
|
2018-09-16 23:03:31 +01:00
|
|
|
#define PACKET_TYPE_SMS_MESSAGES QStringLiteral("kdeconnect.sms.messages")
|
2018-09-10 10:28:54 +01:00
|
|
|
|
2018-09-16 23:03:31 +01:00
|
|
|
/**
|
|
|
|
* Packet sent to request a message be sent
|
|
|
|
*
|
|
|
|
* The body should look like so:
|
2020-08-31 11:05:25 +01:00
|
|
|
* { "version": 2,
|
2020-07-08 09:16:56 +01:00
|
|
|
* "addresses": <List of Addresses>
|
2020-08-31 11:05:25 +01:00
|
|
|
* "textMessage": "Hi mom!",
|
|
|
|
* "attachments": <List of Attached files>
|
2020-03-20 02:16:55 +00:00
|
|
|
* "sub_id": "3859358340534"
|
2018-09-16 23:03:31 +01:00
|
|
|
* }
|
2020-08-31 11:05:25 +01:00
|
|
|
*
|
|
|
|
* An AttachmentContainer object looks like:
|
|
|
|
* {
|
|
|
|
* "fileName": <String> // Name of the file
|
|
|
|
* "base64EncodedFile": <String> // Base64 encoded file
|
|
|
|
* "mimeType": <String> // File type (eg: image/jpg, video/mp4 etc.)
|
|
|
|
* }
|
|
|
|
*
|
2018-09-16 23:03:31 +01:00
|
|
|
*/
|
2018-09-10 10:28:54 +01:00
|
|
|
#define PACKET_TYPE_SMS_REQUEST QStringLiteral("kdeconnect.sms.request")
|
|
|
|
|
|
|
|
/**
|
2018-09-16 23:03:31 +01:00
|
|
|
* Packet sent to request the most-recent message in each conversations on the device
|
2018-09-10 10:28:54 +01:00
|
|
|
*
|
|
|
|
* The request packet shall contain no body
|
|
|
|
*/
|
2018-09-16 23:03:31 +01:00
|
|
|
#define PACKET_TYPE_SMS_REQUEST_CONVERSATIONS QStringLiteral("kdeconnect.sms.request_conversations")
|
2018-09-10 10:28:54 +01:00
|
|
|
|
|
|
|
/**
|
|
|
|
* Packet sent to request all the messages in a particular conversation
|
|
|
|
*
|
2018-09-16 23:03:31 +01:00
|
|
|
* The body should contain the key "threadID" mapping to the threadID being requested
|
2018-09-10 10:28:54 +01:00
|
|
|
* For example:
|
|
|
|
* { "threadID": 203 }
|
|
|
|
*/
|
2018-09-16 23:03:31 +01:00
|
|
|
#define PACKET_TYPE_SMS_REQUEST_CONVERSATION QStringLiteral("kdeconnect.sms.request_conversation")
|
2018-09-10 10:28:54 +01:00
|
|
|
|
2020-08-13 19:23:02 +01:00
|
|
|
/**
|
|
|
|
* Packet sent to request an attachment file in a particular message of a conversation
|
|
|
|
*
|
|
|
|
* The body should look like so:
|
|
|
|
* "part_id": <long> // Part id of the attachment
|
|
|
|
* "unique_identifier": <String> // It can be any hash code or unique name of the file
|
|
|
|
*/
|
|
|
|
#define PACKET_TYPE_SMS_REQUEST_ATTACHMENT QStringLiteral("kdeconnect.sms.request_attachment")
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Packet used to send original attachment file from mms database to desktop
|
|
|
|
* <p>
|
|
|
|
* The following fields are available:
|
|
|
|
* "thread_id": <long> // Thread to which the attachment belongs
|
|
|
|
* "filename": <String> // Name of the attachment file in the database
|
|
|
|
*/
|
|
|
|
#define PACKET_TYPE_SMS_ATTACHMENT_FILE QStringLiteral("kdeconnect.sms.attachment_file")
|
|
|
|
|
2018-09-10 10:28:54 +01:00
|
|
|
Q_DECLARE_LOGGING_CATEGORY(KDECONNECT_PLUGIN_SMS)
|
|
|
|
|
2020-08-31 11:05:25 +01:00
|
|
|
#define CODEC_NAME "CP1251"
|
|
|
|
|
|
|
|
class QTextCodec;
|
|
|
|
|
2018-09-10 10:28:54 +01:00
|
|
|
class Q_DECL_EXPORT SmsPlugin
|
|
|
|
: public KdeConnectPlugin
|
|
|
|
{
|
|
|
|
Q_OBJECT
|
|
|
|
Q_CLASSINFO("D-Bus Interface", "org.kde.kdeconnect.device.sms")
|
|
|
|
|
|
|
|
public:
|
|
|
|
explicit SmsPlugin(QObject* parent, const QVariantList& args);
|
|
|
|
~SmsPlugin() override;
|
|
|
|
|
|
|
|
bool receivePacket(const NetworkPacket& np) override;
|
|
|
|
void connected() override {}
|
|
|
|
|
|
|
|
QString dbusPath() const override;
|
|
|
|
|
|
|
|
public Q_SLOTS:
|
2020-08-31 11:05:25 +01:00
|
|
|
Q_SCRIPTABLE void sendSms(const QVariantList& addresses, const QString& textMessage, const QVariantList& attachmentUrls, const qint64 subID = -1);
|
2018-09-10 10:28:54 +01:00
|
|
|
|
|
|
|
/**
|
|
|
|
* Send a request to the remote for all of its conversations
|
|
|
|
*/
|
|
|
|
Q_SCRIPTABLE void requestAllConversations();
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Send a request to the remote for a particular conversation
|
[SMS App] Make requestMoreMessages asynchronous, blocking, and caching
Summary:
The most serious change from this patch is to move the asynchronous replying to a request from the app for more messages to a newly-spawned, self-destructing thread. Within that thread, we block until the remote device replies with the requested messages.
All gotten messages are cached in the ConversationDbusInterface, so all future requests are fast and don't hit the remote device.
Test Plan: After applying this diff, the messaging app should show 10 messages every time it is opened
Reviewers: #kde_connect, nicolasfella, albertvaka
Reviewed By: #kde_connect, albertvaka
Subscribers: albertvaka, apol, nicolasfella, kdeconnect
Tags: #kde_connect
Differential Revision: https://phabricator.kde.org/D16475
2018-12-13 05:42:45 +00:00
|
|
|
*
|
|
|
|
* TODO: Make interface capable of requesting limited window of messages
|
2018-09-10 10:28:54 +01:00
|
|
|
*/
|
[SMS App] Make requestMoreMessages asynchronous, blocking, and caching
Summary:
The most serious change from this patch is to move the asynchronous replying to a request from the app for more messages to a newly-spawned, self-destructing thread. Within that thread, we block until the remote device replies with the requested messages.
All gotten messages are cached in the ConversationDbusInterface, so all future requests are fast and don't hit the remote device.
Test Plan: After applying this diff, the messaging app should show 10 messages every time it is opened
Reviewers: #kde_connect, nicolasfella, albertvaka
Reviewed By: #kde_connect, albertvaka
Subscribers: albertvaka, apol, nicolasfella, kdeconnect
Tags: #kde_connect
Differential Revision: https://phabricator.kde.org/D16475
2018-12-13 05:42:45 +00:00
|
|
|
Q_SCRIPTABLE void requestConversation(const qint64& conversationID) const;
|
2018-09-10 10:28:54 +01:00
|
|
|
|
2019-07-20 15:02:38 +01:00
|
|
|
Q_SCRIPTABLE void launchApp();
|
|
|
|
|
2020-08-13 19:23:02 +01:00
|
|
|
/**
|
|
|
|
* Send a request to the remote device for a particulr attachment file
|
|
|
|
*/
|
|
|
|
Q_SCRIPTABLE void requestAttachment(const qint64& partID, const QString& uniqueIdentifier);
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Searches the requested file in the application's cache directory,
|
|
|
|
* if not found then sends the request to remote device
|
|
|
|
*/
|
|
|
|
Q_SCRIPTABLE void getAttachment(const qint64& partID, const QString& uniqueIdentifier);
|
|
|
|
|
2018-09-10 10:28:54 +01:00
|
|
|
private:
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Send to the telepathy plugin if it is available
|
|
|
|
*/
|
|
|
|
void forwardToTelepathy(const ConversationMessage& message);
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Handle a packet which contains many messages, such as PACKET_TYPE_TELEPHONY_MESSAGE
|
|
|
|
*/
|
|
|
|
bool handleBatchMessages(const NetworkPacket& np);
|
|
|
|
|
2020-08-13 19:23:02 +01:00
|
|
|
/**
|
|
|
|
* Handle a packet of type PACKET_TYPE_SMS_ATTACHMENT_FILE which contains an attachment file
|
|
|
|
*/
|
|
|
|
bool handleSmsAttachmentFile(const NetworkPacket& np);
|
|
|
|
|
2020-08-31 11:05:25 +01:00
|
|
|
/**
|
|
|
|
* Encode a local file so it can be sent to the remote device as part of an MMS message.
|
|
|
|
*/
|
|
|
|
Attachment createAttachmentFromUrl(const QString& url);
|
|
|
|
|
2018-09-10 10:28:54 +01:00
|
|
|
QDBusInterface m_telepathyInterface;
|
|
|
|
ConversationsDbusInterface* m_conversationInterface;
|
2020-08-31 11:05:25 +01:00
|
|
|
QTextCodec *m_codec;
|
2018-09-10 10:28:54 +01:00
|
|
|
};
|
|
|
|
|
|
|
|
#endif
|