import org.asamk.signal.manager.Manager;
import org.asamk.signal.manager.NotMasterDeviceException;
import org.asamk.signal.manager.StickerPackInvalidException;
-import org.asamk.signal.manager.UntrustedIdentityException;
import org.asamk.signal.manager.api.Identity;
import org.asamk.signal.manager.api.InactiveGroupLinkException;
import org.asamk.signal.manager.api.InvalidDeviceLinkException;
private final Manager m;
private final DBusConnection connection;
private final String objectPath;
+ private final boolean noReceiveOnStart;
private DBusPath thisDevice;
private final List<StructDevice> devices = new ArrayList<>();
private final List<StructGroup> groups = new ArrayList<>();
+ private DbusReceiveMessageHandler dbusMessageHandler;
+ private int subscriberCount;
private final static Logger logger = LoggerFactory.getLogger(DbusSignalImpl.class);
- public DbusSignalImpl(final Manager m, DBusConnection connection, final String objectPath) {
+ public DbusSignalImpl(
+ final Manager m, DBusConnection connection, final String objectPath, final boolean noReceiveOnStart
+ ) {
this.m = m;
this.connection = connection;
this.objectPath = objectPath;
+ this.noReceiveOnStart = noReceiveOnStart;
}
public void initObjects() {
+ if (!noReceiveOnStart) {
+ subscribeReceive();
+ }
+
updateDevices();
updateGroups();
updateConfiguration();
}
public void close() {
+ if (dbusMessageHandler != null) {
+ m.removeReceiveHandler(dbusMessageHandler);
+ dbusMessageHandler = null;
+ }
unExportDevices();
unExportGroups();
unExportConfiguration();
}
@Override
- public void submitRateLimitChallenge(String challenge, String captchaString) {
- final var captcha = captchaString == null ? null : captchaString.replace("signalcaptcha://", "");
+ public void subscribeReceive() {
+ if (dbusMessageHandler == null) {
+ dbusMessageHandler = new DbusReceiveMessageHandler(connection, objectPath);
+ m.addReceiveHandler(dbusMessageHandler);
+ }
+ subscriberCount++;
+ }
+
+ @Override
+ public void unsubscribeReceive() {
+ subscriberCount = Math.max(0, subscriberCount - 1);
+ if (subscriberCount == 0 && dbusMessageHandler != null) {
+ m.removeReceiveHandler(dbusMessageHandler);
+ dbusMessageHandler = null;
+ }
+ }
+ @Override
+ public void submitRateLimitChallenge(String challenge, String captcha) {
try {
m.submitRateLimitRecaptchaChallenge(challenge, captcha);
} catch (IOException e) {
}
+ @Override
+ public void unregister() throws Error.Failure {
+ try {
+ m.unregister();
+ } catch (IOException e) {
+ throw new Error.Failure("Failed to unregister: " + e.getMessage());
+ }
+ }
+
+ @Override
+ public void deleteAccount() throws Error.Failure {
+ try {
+ m.deleteAccount();
+ } catch (IOException e) {
+ throw new Error.Failure("Failed to delete account: " + e.getMessage());
+ }
+ }
+
@Override
public void addDevice(String uri) {
try {
@Override
public long sendMessage(final String message, final List<String> attachments, final List<String> recipients) {
try {
- final var results = m.sendMessage(new Message(message, attachments),
+ final var results = m.sendMessage(new Message(message, attachments, List.of(), Optional.empty()),
getSingleRecipientIdentifiers(recipients, m.getSelfNumber()).stream()
.map(RecipientIdentifier.class::cast)
.collect(Collectors.toSet()));
try {
var recipients = new ArrayList<String>(1);
recipients.add(recipient);
- m.sendTypingMessage(stop ? TypingAction.STOP : TypingAction.START,
+ final var results = m.sendTypingMessage(stop ? TypingAction.STOP : TypingAction.START,
getSingleRecipientIdentifiers(recipients, m.getSelfNumber()).stream()
.map(RecipientIdentifier.class::cast)
.collect(Collectors.toSet()));
+ checkSendMessageResults(results.timestamp(), results.results());
} catch (IOException e) {
throw new Error.Failure(e.getMessage());
} catch (GroupNotFoundException | NotAGroupMemberException | GroupSendingNotAllowedException e) {
throw new Error.GroupNotFound(e.getMessage());
- } catch (UntrustedIdentityException e) {
- throw new Error.UntrustedIdentity(e.getMessage());
}
}
final String recipient, final List<Long> messageIds
) throws Error.Failure, Error.UntrustedIdentity {
try {
- m.sendReadReceipt(getSingleRecipientIdentifier(recipient, m.getSelfNumber()), messageIds);
+ final var results = m.sendReadReceipt(getSingleRecipientIdentifier(recipient, m.getSelfNumber()),
+ messageIds);
+ checkSendMessageResults(results.timestamp(), results.results());
} catch (IOException e) {
throw new Error.Failure(e.getMessage());
- } catch (UntrustedIdentityException e) {
- throw new Error.UntrustedIdentity(e.getMessage());
}
}
final String recipient, final List<Long> messageIds
) throws Error.Failure, Error.UntrustedIdentity {
try {
- m.sendViewedReceipt(getSingleRecipientIdentifier(recipient, m.getSelfNumber()), messageIds);
+ final var results = m.sendViewedReceipt(getSingleRecipientIdentifier(recipient, m.getSelfNumber()),
+ messageIds);
+ checkSendMessageResults(results.timestamp(), results.results());
} catch (IOException e) {
throw new Error.Failure(e.getMessage());
- } catch (UntrustedIdentityException e) {
- throw new Error.UntrustedIdentity(e.getMessage());
}
}
final String message, final List<String> attachments
) throws Error.AttachmentInvalid, Error.Failure, Error.UntrustedIdentity {
try {
- final var results = m.sendMessage(new Message(message, attachments),
+ final var results = m.sendMessage(new Message(message, attachments, List.of(), Optional.empty()),
Set.of(RecipientIdentifier.NoteToSelf.INSTANCE));
checkSendMessageResults(results.timestamp(), results.results());
return results.timestamp();
}
}
+ @Override
+ public void deleteRecipient(final String recipient) throws Error.Failure {
+ try {
+ m.deleteRecipient(getSingleRecipientIdentifier(recipient, m.getSelfNumber()));
+ } catch (IOException e) {
+ throw new Error.Failure("Recipient not found");
+ }
+ }
+
+ @Override
+ public void deleteContact(final String recipient) throws Error.Failure {
+ try {
+ m.deleteContact(getSingleRecipientIdentifier(recipient, m.getSelfNumber()));
+ } catch (IOException e) {
+ throw new Error.Failure("Contact not found");
+ }
+ }
+
@Override
public long sendGroupMessage(final String message, final List<String> attachments, final byte[] groupId) {
try {
- var results = m.sendMessage(new Message(message, attachments),
+ var results = m.sendMessage(new Message(message, attachments, List.of(), Optional.empty()),
Set.of(new RecipientIdentifier.Group(getGroupId(groupId))));
checkSendMessageResults(results.timestamp(), results.results());
return results.timestamp();
public List<String> listNumbers() {
return Stream.concat(m.getIdentities().stream().map(Identity::recipient),
m.getContacts().stream().map(Pair::first))
- .map(a -> a.getNumber().orElse(null))
+ .map(a -> a.number().orElse(null))
.filter(Objects::nonNull)
.distinct()
.collect(Collectors.toList());
// Try profiles if no contact name was found
for (var identity : m.getIdentities()) {
final var address = identity.recipient();
- var number = address.getNumber().orElse(null);
+ var number = address.number().orElse(null);
if (number != null) {
Profile profile = null;
try {