1 package org
.asamk
.signal
.dbus
;
3 import org
.asamk
.Signal
;
4 import org
.asamk
.signal
.manager
.AttachmentInvalidException
;
5 import org
.asamk
.signal
.manager
.Manager
;
6 import org
.asamk
.signal
.manager
.groups
.GroupId
;
7 import org
.asamk
.signal
.manager
.groups
.GroupNotFoundException
;
8 import org
.asamk
.signal
.manager
.groups
.NotAGroupMemberException
;
9 import org
.asamk
.signal
.manager
.storage
.groups
.GroupInfo
;
10 import org
.asamk
.signal
.util
.ErrorUtils
;
11 import org
.freedesktop
.dbus
.exceptions
.DBusExecutionException
;
12 import org
.whispersystems
.libsignal
.util
.Pair
;
13 import org
.whispersystems
.signalservice
.api
.messages
.SendMessageResult
;
14 import org
.whispersystems
.signalservice
.api
.push
.SignalServiceAddress
;
15 import org
.whispersystems
.signalservice
.api
.util
.InvalidNumberException
;
17 import java
.io
.IOException
;
18 import java
.util
.ArrayList
;
19 import java
.util
.Collections
;
20 import java
.util
.List
;
21 import java
.util
.stream
.Collectors
;
23 public class DbusSignalImpl
implements Signal
{
25 private final Manager m
;
27 public DbusSignalImpl(final Manager m
) {
32 public boolean isRemote() {
37 public String
getObjectPath() {
42 public long sendMessage(final String message
, final List
<String
> attachments
, final String recipient
) {
43 List
<String
> recipients
= new ArrayList
<>(1);
44 recipients
.add(recipient
);
45 return sendMessage(message
, attachments
, recipients
);
48 private static void checkSendMessageResults(
49 long timestamp
, List
<SendMessageResult
> results
50 ) throws DBusExecutionException
{
51 List
<String
> errors
= ErrorUtils
.getErrorMessagesFromSendMessageResults(results
);
52 if (errors
.size() == 0) {
56 StringBuilder message
= new StringBuilder();
57 message
.append(timestamp
).append('\n');
58 message
.append("Failed to send (some) messages:\n");
59 for (String error
: errors
) {
60 message
.append(error
).append('\n');
63 throw new Error
.Failure(message
.toString());
67 public long sendMessage(final String message
, final List
<String
> attachments
, final List
<String
> recipients
) {
69 final Pair
<Long
, List
<SendMessageResult
>> results
= m
.sendMessage(message
, attachments
, recipients
);
70 checkSendMessageResults(results
.first(), results
.second());
71 return results
.first();
72 } catch (InvalidNumberException e
) {
73 throw new Error
.InvalidNumber(e
.getMessage());
74 } catch (AttachmentInvalidException e
) {
75 throw new Error
.AttachmentInvalid(e
.getMessage());
76 } catch (IOException e
) {
77 throw new Error
.Failure(e
.getMessage());
82 public void sendEndSessionMessage(final List
<String
> recipients
) {
84 final Pair
<Long
, List
<SendMessageResult
>> results
= m
.sendEndSessionMessage(recipients
);
85 checkSendMessageResults(results
.first(), results
.second());
86 } catch (IOException e
) {
87 throw new Error
.Failure(e
.getMessage());
88 } catch (InvalidNumberException e
) {
89 throw new Error
.InvalidNumber(e
.getMessage());
94 public long sendGroupMessage(final String message
, final List
<String
> attachments
, final byte[] groupId
) {
96 Pair
<Long
, List
<SendMessageResult
>> results
= m
.sendGroupMessage(message
,
98 GroupId
.unknownVersion(groupId
));
99 checkSendMessageResults(results
.first(), results
.second());
100 return results
.first();
101 } catch (IOException e
) {
102 throw new Error
.Failure(e
.getMessage());
103 } catch (GroupNotFoundException
| NotAGroupMemberException e
) {
104 throw new Error
.GroupNotFound(e
.getMessage());
105 } catch (AttachmentInvalidException e
) {
106 throw new Error
.AttachmentInvalid(e
.getMessage());
111 public String
getContactName(final String number
) {
113 return m
.getContactName(number
);
114 } catch (InvalidNumberException e
) {
115 throw new Error
.InvalidNumber(e
.getMessage());
120 public void setContactName(final String number
, final String name
) {
122 m
.setContactName(number
, name
);
123 } catch (InvalidNumberException e
) {
124 throw new Error
.InvalidNumber(e
.getMessage());
129 public void setContactBlocked(final String number
, final boolean blocked
) {
131 m
.setContactBlocked(number
, blocked
);
132 } catch (InvalidNumberException e
) {
133 throw new Error
.InvalidNumber(e
.getMessage());
138 public void setGroupBlocked(final byte[] groupId
, final boolean blocked
) {
140 m
.setGroupBlocked(GroupId
.unknownVersion(groupId
), blocked
);
141 } catch (GroupNotFoundException e
) {
142 throw new Error
.GroupNotFound(e
.getMessage());
147 public List
<byte[]> getGroupIds() {
148 List
<GroupInfo
> groups
= m
.getGroups();
149 List
<byte[]> ids
= new ArrayList
<>(groups
.size());
150 for (GroupInfo group
: groups
) {
151 ids
.add(group
.getGroupId().serialize());
157 public String
getGroupName(final byte[] groupId
) {
158 GroupInfo group
= m
.getGroup(GroupId
.unknownVersion(groupId
));
162 return group
.getTitle();
167 public List
<String
> getGroupMembers(final byte[] groupId
) {
168 GroupInfo group
= m
.getGroup(GroupId
.unknownVersion(groupId
));
170 return Collections
.emptyList();
172 return group
.getMembers()
174 .map(m
::resolveSignalServiceAddress
)
175 .map(SignalServiceAddress
::getLegacyIdentifier
)
176 .collect(Collectors
.toList());
181 public byte[] updateGroup(byte[] groupId
, String name
, List
<String
> members
, String avatar
) {
183 if (groupId
.length
== 0) {
186 if (name
.isEmpty()) {
189 if (members
.isEmpty()) {
192 if (avatar
.isEmpty()) {
195 final Pair
<GroupId
, List
<SendMessageResult
>> results
= m
.updateGroup(groupId
== null
197 : GroupId
.unknownVersion(groupId
), name
, members
, avatar
);
198 checkSendMessageResults(0, results
.second());
199 return results
.first().serialize();
200 } catch (IOException e
) {
201 throw new Error
.Failure(e
.getMessage());
202 } catch (GroupNotFoundException
| NotAGroupMemberException e
) {
203 throw new Error
.GroupNotFound(e
.getMessage());
204 } catch (InvalidNumberException e
) {
205 throw new Error
.InvalidNumber(e
.getMessage());
206 } catch (AttachmentInvalidException e
) {
207 throw new Error
.AttachmentInvalid(e
.getMessage());
212 public boolean isRegistered() {