X-Git-Url: https://git.nmode.ca/signal-cli/blobdiff_plain/8a216e324571db898a83f7e127018b22a0318ac5..4a1af0786c938f887a109a17dcc879da21704a8b:/src/main/java/org/asamk/signal/dbus/DbusSignalImpl.java diff --git a/src/main/java/org/asamk/signal/dbus/DbusSignalImpl.java b/src/main/java/org/asamk/signal/dbus/DbusSignalImpl.java index 047b4f99..2983b293 100644 --- a/src/main/java/org/asamk/signal/dbus/DbusSignalImpl.java +++ b/src/main/java/org/asamk/signal/dbus/DbusSignalImpl.java @@ -2,6 +2,7 @@ package org.asamk.signal.dbus; import org.asamk.Signal; import org.asamk.signal.BaseConfig; +import org.asamk.signal.DbusReceiveMessageHandler; import org.asamk.signal.manager.AttachmentInvalidException; import org.asamk.signal.manager.Manager; import org.asamk.signal.manager.NotMasterDeviceException; @@ -32,6 +33,7 @@ import org.freedesktop.dbus.DBusPath; import org.freedesktop.dbus.connections.impl.DBusConnection; import org.freedesktop.dbus.exceptions.DBusException; import org.freedesktop.dbus.exceptions.DBusExecutionException; +import org.freedesktop.dbus.interfaces.DBusInterface; import org.freedesktop.dbus.types.Variant; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -59,26 +61,40 @@ public class DbusSignalImpl implements Signal { private final Manager m; private final DBusConnection connection; private final String objectPath; + private final boolean noReceiveOnStart; private DBusPath thisDevice; private final List devices = new ArrayList<>(); private final List 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(); @@ -95,9 +111,25 @@ public class DbusSignalImpl implements Signal { } @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) { @@ -839,12 +871,7 @@ public class DbusSignalImpl implements Signal { linkedDevices.forEach(d -> { final var object = new DbusSignalDeviceImpl(d); final var deviceObjectPath = object.getObjectPath(); - try { - connection.exportObject(object); - logger.debug("Exported dbus object: " + deviceObjectPath); - } catch (DBusException e) { - e.printStackTrace(); - } + exportObject(object); if (d.isThisDevice()) { thisDevice = new DBusPath(deviceObjectPath); } @@ -876,12 +903,7 @@ public class DbusSignalImpl implements Signal { groups.forEach(g -> { final var object = new DbusSignalGroupImpl(g.groupId()); - try { - connection.exportObject(object); - logger.debug("Exported dbus object: " + object.getObjectPath()); - } catch (DBusException e) { - e.printStackTrace(); - } + exportObject(object); this.groups.add(new StructGroup(new DBusPath(object.getObjectPath()), g.groupId().serialize(), emptyIfNull(g.title()))); @@ -898,14 +920,9 @@ public class DbusSignalImpl implements Signal { } private void updateConfiguration() { - try { - unExportConfiguration(); - final var object = new DbusSignalConfigurationImpl(); - connection.exportObject(object); - logger.debug("Exported dbus object: " + objectPath + "/Configuration"); - } catch (DBusException e) { - e.printStackTrace(); - } + unExportConfiguration(); + final var object = new DbusSignalConfigurationImpl(); + exportObject(object); } private void unExportConfiguration() { @@ -913,6 +930,15 @@ public class DbusSignalImpl implements Signal { connection.unExportObject(objectPath); } + private void exportObject(final DBusInterface object) { + try { + connection.exportObject(object); + logger.debug("Exported dbus object: " + object.getObjectPath()); + } catch (DBusException e) { + e.printStackTrace(); + } + } + public class DbusSignalDeviceImpl extends DbusProperties implements Signal.Device { private final org.asamk.signal.manager.api.Device device;