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(m, 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()),
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()),
Set.of(RecipientIdentifier.NoteToSelf.INSTANCE));
checkSendMessageResults(results.timestamp(), results.results());
return results.timestamp();
@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()),
Set.of(new RecipientIdentifier.Group(getGroupId(groupId))));
checkSendMessageResults(results.timestamp(), results.results());
return results.timestamp();