1 package org
.asamk
.signal
;
3 import org
.asamk
.Signal
;
4 import org
.asamk
.signal
.manager
.Manager
;
5 import org
.freedesktop
.dbus
.connections
.impl
.DBusConnection
;
6 import org
.freedesktop
.dbus
.exceptions
.DBusException
;
7 import org
.whispersystems
.signalservice
.api
.messages
.SignalServiceAttachment
;
8 import org
.whispersystems
.signalservice
.api
.messages
.SignalServiceContent
;
9 import org
.whispersystems
.signalservice
.api
.messages
.SignalServiceDataMessage
;
10 import org
.whispersystems
.signalservice
.api
.messages
.SignalServiceEnvelope
;
11 import org
.whispersystems
.signalservice
.api
.messages
.SignalServiceGroup
;
12 import org
.whispersystems
.signalservice
.api
.messages
.SignalServiceReceiptMessage
;
13 import org
.whispersystems
.signalservice
.api
.messages
.multidevice
.SentTranscriptMessage
;
14 import org
.whispersystems
.signalservice
.api
.messages
.multidevice
.SignalServiceSyncMessage
;
16 import java
.util
.ArrayList
;
17 import java
.util
.List
;
19 public class JsonDbusReceiveMessageHandler
extends JsonReceiveMessageHandler
{
21 private final DBusConnection conn
;
23 private final String objectPath
;
25 public JsonDbusReceiveMessageHandler(Manager m
, DBusConnection conn
, final String objectPath
) {
28 this.objectPath
= objectPath
;
31 static void sendReceivedMessageToDbus(SignalServiceEnvelope envelope
, SignalServiceContent content
, DBusConnection conn
, final String objectPath
, Manager m
) {
32 if (envelope
.isReceipt()) {
34 conn
.sendMessage(new Signal
.ReceiptReceived(
36 envelope
.getTimestamp(),
37 !envelope
.isUnidentifiedSender() && envelope
.hasSource() ? envelope
.getSourceE164().get() : content
.getSender().getNumber().get()
39 } catch (DBusException e
) {
42 } else if (content
!= null) {
43 if (content
.getReceiptMessage().isPresent()) {
44 final SignalServiceReceiptMessage receiptMessage
= content
.getReceiptMessage().get();
45 if (receiptMessage
.isDeliveryReceipt()) {
46 final String sender
= !envelope
.isUnidentifiedSender() && envelope
.hasSource() ? envelope
.getSourceE164().get() : content
.getSender().getNumber().get();
47 for (long timestamp
: receiptMessage
.getTimestamps()) {
49 conn
.sendMessage(new Signal
.ReceiptReceived(
54 } catch (DBusException e
) {
59 } else if (content
.getDataMessage().isPresent()) {
60 SignalServiceDataMessage message
= content
.getDataMessage().get();
62 if (!message
.isEndSession() &&
63 !(message
.getGroupContext().isPresent() &&
64 message
.getGroupContext().get().getGroupV1Type() != SignalServiceGroup
.Type
.DELIVER
)) {
66 conn
.sendMessage(new Signal
.MessageReceived(
68 message
.getTimestamp(),
69 envelope
.isUnidentifiedSender() || !envelope
.hasSource() ? content
.getSender().getNumber().get() : envelope
.getSourceE164().get(),
70 message
.getGroupContext().isPresent() && message
.getGroupContext().get().getGroupV1().isPresent()
71 ? message
.getGroupContext().get().getGroupV1().get().getGroupId() : new byte[0],
72 message
.getBody().isPresent() ? message
.getBody().get() : "",
73 JsonDbusReceiveMessageHandler
.getAttachments(message
, m
)));
74 } catch (DBusException e
) {
78 } else if (content
.getSyncMessage().isPresent()) {
79 SignalServiceSyncMessage sync_message
= content
.getSyncMessage().get();
80 if (sync_message
.getSent().isPresent()) {
81 SentTranscriptMessage transcript
= sync_message
.getSent().get();
83 if (!envelope
.isUnidentifiedSender() && envelope
.hasSource() && (transcript
.getDestination().isPresent() || transcript
.getMessage().getGroupContext().isPresent())) {
84 SignalServiceDataMessage message
= transcript
.getMessage();
87 conn
.sendMessage(new Signal
.SyncMessageReceived(
89 transcript
.getTimestamp(),
90 envelope
.getSourceAddress().getNumber().get(),
91 transcript
.getDestination().isPresent() ? transcript
.getDestination().get().getNumber().get() : "",
92 message
.getGroupContext().isPresent() && message
.getGroupContext().get().getGroupV1().isPresent()
93 ? message
.getGroupContext().get().getGroupV1().get().getGroupId() : new byte[0],
94 message
.getBody().isPresent() ? message
.getBody().get() : "",
95 JsonDbusReceiveMessageHandler
.getAttachments(message
, m
)));
96 } catch (DBusException e
) {
105 static private List
<String
> getAttachments(SignalServiceDataMessage message
, Manager m
) {
106 List
<String
> attachments
= new ArrayList
<>();
107 if (message
.getAttachments().isPresent()) {
108 for (SignalServiceAttachment attachment
: message
.getAttachments().get()) {
109 if (attachment
.isPointer()) {
110 attachments
.add(m
.getAttachmentFile(attachment
.asPointer().getId()).getAbsolutePath());
118 public void handleMessage(SignalServiceEnvelope envelope
, SignalServiceContent content
, Throwable exception
) {
119 super.handleMessage(envelope
, content
, exception
);
121 sendReceivedMessageToDbus(envelope
, content
, conn
, objectPath
, m
);