]> nmode's Git Repositories - signal-cli/blob - src/main/java/org/asamk/signal/JsonDbusReceiveMessageHandler.java
Improve SignalServiceAddress handling
[signal-cli] / src / main / java / org / asamk / signal / JsonDbusReceiveMessageHandler.java
1 package org.asamk.signal;
2
3 import org.asamk.Signal;
4 import org.asamk.signal.manager.Manager;
5 import org.freedesktop.dbus.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
13 import java.util.ArrayList;
14 import java.util.List;
15
16 public class JsonDbusReceiveMessageHandler extends JsonReceiveMessageHandler {
17
18 private final DBusConnection conn;
19
20 private final String objectPath;
21
22 public JsonDbusReceiveMessageHandler(Manager m, DBusConnection conn, final String objectPath) {
23 super(m);
24 this.conn = conn;
25 this.objectPath = objectPath;
26 }
27
28 static void sendReceivedMessageToDbus(SignalServiceEnvelope envelope, SignalServiceContent content, DBusConnection conn, final String objectPath, Manager m) {
29 if (envelope.isReceipt()) {
30 try {
31 conn.sendSignal(new Signal.ReceiptReceived(
32 objectPath,
33 envelope.getTimestamp(),
34 !envelope.isUnidentifiedSender() && envelope.hasSource() ? envelope.getSourceE164().get() : content.getSender().getNumber().get()
35 ));
36 } catch (DBusException e) {
37 e.printStackTrace();
38 }
39 } else if (content != null && content.getDataMessage().isPresent()) {
40 SignalServiceDataMessage message = content.getDataMessage().get();
41
42 if (!message.isEndSession() &&
43 !(message.getGroupInfo().isPresent() &&
44 message.getGroupInfo().get().getType() != SignalServiceGroup.Type.DELIVER)) {
45 List<String> attachments = new ArrayList<>();
46 if (message.getAttachments().isPresent()) {
47 for (SignalServiceAttachment attachment : message.getAttachments().get()) {
48 if (attachment.isPointer()) {
49 attachments.add(m.getAttachmentFile(attachment.asPointer().getId()).getAbsolutePath());
50 }
51 }
52 }
53
54 try {
55 conn.sendSignal(new Signal.MessageReceived(
56 objectPath,
57 message.getTimestamp(),
58 envelope.isUnidentifiedSender() || !envelope.hasSource() ? content.getSender().getNumber().get() : envelope.getSourceE164().get(),
59 message.getGroupInfo().isPresent() ? message.getGroupInfo().get().getGroupId() : new byte[0],
60 message.getBody().isPresent() ? message.getBody().get() : "",
61 attachments));
62 } catch (DBusException e) {
63 e.printStackTrace();
64 }
65 }
66 }
67 }
68
69 @Override
70 public void handleMessage(SignalServiceEnvelope envelope, SignalServiceContent content, Throwable exception) {
71 super.handleMessage(envelope, content, exception);
72
73 sendReceivedMessageToDbus(envelope, content, conn, objectPath, m);
74 }
75 }