X-Git-Url: https://git.nmode.ca/signal-cli/blobdiff_plain/48b2c7ff8ad7b653c3a0cb42775a5850f593d0a0..6c000544072fb0be012dafeea5761fa9e0744ee4:/src/main/java/org/asamk/signal/commands/DaemonCommand.java diff --git a/src/main/java/org/asamk/signal/commands/DaemonCommand.java b/src/main/java/org/asamk/signal/commands/DaemonCommand.java index f7d8b12e..7988c8ef 100644 --- a/src/main/java/org/asamk/signal/commands/DaemonCommand.java +++ b/src/main/java/org/asamk/signal/commands/DaemonCommand.java @@ -13,6 +13,7 @@ import org.asamk.signal.OutputWriter; import org.asamk.signal.PlainTextWriter; import org.asamk.signal.commands.exceptions.CommandException; import org.asamk.signal.commands.exceptions.UnexpectedErrorException; +import org.asamk.signal.dbus.DbusSignalControlImpl; import org.asamk.signal.dbus.DbusSignalImpl; import org.asamk.signal.manager.Manager; import org.freedesktop.dbus.connections.impl.DBusConnection; @@ -21,7 +22,6 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.io.IOException; -import java.util.ArrayList; import java.util.List; import java.util.Set; import java.util.concurrent.TimeUnit; @@ -78,7 +78,9 @@ public class DaemonCommand implements MultiLocalCommand { } @Override - public void handleCommand(final Namespace ns, final List managers) throws CommandException { + public void handleCommand( + final Namespace ns, final List managers, SignalCreator c + ) throws CommandException { boolean ignoreAttachments = ns.getBoolean("ignore-attachments"); DBusConnection.DBusBusType busType; @@ -89,21 +91,24 @@ public class DaemonCommand implements MultiLocalCommand { } try (var conn = DBusConnection.getConnection(busType)) { - var receiveThreads = new ArrayList(); + final var signalControl = new DbusSignalControlImpl(c, m -> { + try { + final var objectPath = DbusConfig.getObjectPath(m.getUsername()); + return run(conn, objectPath, m, ignoreAttachments); + } catch (DBusException e) { + logger.error("Failed to export object", e); + return null; + } + }, DbusConfig.getObjectPath()); + conn.exportObject(signalControl); + for (var m : managers) { - var objectPath = DbusConfig.getObjectPath(m.getUsername()); - var thread = run(conn, objectPath, m, ignoreAttachments); - receiveThreads.add(thread); + signalControl.addManager(m); } conn.requestBusName(DbusConfig.getBusname()); - for (var t : receiveThreads) { - try { - t.join(); - } catch (InterruptedException ignored) { - } - } + signalControl.run(); } catch (DBusException | IOException e) { logger.error("Dbus command failed", e); throw new UnexpectedErrorException("Dbus command failed"); @@ -113,7 +118,9 @@ public class DaemonCommand implements MultiLocalCommand { private Thread run( DBusConnection conn, String objectPath, Manager m, boolean ignoreAttachments ) throws DBusException { - conn.exportObject(objectPath, new DbusSignalImpl(m)); + conn.exportObject(new DbusSignalImpl(m, objectPath)); + + logger.info("Exported dbus object: " + objectPath); final var thread = new Thread(() -> { while (true) { @@ -128,8 +135,6 @@ public class DaemonCommand implements MultiLocalCommand { } }); - logger.info("Exported dbus object: " + objectPath); - thread.start(); return thread;