X-Git-Url: https://git.nmode.ca/signal-cli/blobdiff_plain/a7a5947a1bc468cbf202c603ed14fe40b14c73b0..3e981d66e9534db61953078b3ca8faf16ed9dd2d:/src/main/java/org/asamk/signal/commands/JsonRpcDispatcherCommand.java diff --git a/src/main/java/org/asamk/signal/commands/JsonRpcDispatcherCommand.java b/src/main/java/org/asamk/signal/commands/JsonRpcDispatcherCommand.java index 166dfcef..5ce9daf4 100644 --- a/src/main/java/org/asamk/signal/commands/JsonRpcDispatcherCommand.java +++ b/src/main/java/org/asamk/signal/commands/JsonRpcDispatcherCommand.java @@ -5,24 +5,29 @@ import net.sourceforge.argparse4j.inf.Namespace; import net.sourceforge.argparse4j.inf.Subparser; import org.asamk.signal.OutputType; +import org.asamk.signal.Shutdown; import org.asamk.signal.commands.exceptions.CommandException; import org.asamk.signal.jsonrpc.SignalJsonRpcDispatcherHandler; import org.asamk.signal.manager.Manager; import org.asamk.signal.manager.MultiAccountManager; -import org.asamk.signal.manager.api.ReceiveConfig; import org.asamk.signal.output.JsonWriter; import org.asamk.signal.output.OutputWriter; import org.asamk.signal.util.IOUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import java.io.FileDescriptor; +import java.io.FileInputStream; import java.io.InputStreamReader; +import java.nio.channels.Channels; import java.util.List; import java.util.function.Supplier; +import static org.asamk.signal.util.CommandUtil.getReceiveConfig; + public class JsonRpcDispatcherCommand implements LocalCommand, MultiLocalCommand { - private final static Logger logger = LoggerFactory.getLogger(JsonRpcDispatcherCommand.class); + private static final Logger logger = LoggerFactory.getLogger(JsonRpcDispatcherCommand.class); @Override public String getName() { @@ -54,8 +59,11 @@ public class JsonRpcDispatcherCommand implements LocalCommand, MultiLocalCommand @Override public void handleCommand( - final Namespace ns, final Manager m, final OutputWriter outputWriter + final Namespace ns, + final Manager m, + final OutputWriter outputWriter ) throws CommandException { + Shutdown.installHandler(); final var receiveMode = ns.get("receive-mode"); final var receiveConfig = getReceiveConfig(ns); m.setReceiveConfig(receiveConfig); @@ -66,13 +74,18 @@ public class JsonRpcDispatcherCommand implements LocalCommand, MultiLocalCommand final var handler = new SignalJsonRpcDispatcherHandler(jsonOutputWriter, lineSupplier, receiveMode == ReceiveMode.MANUAL); + final var thread = Thread.currentThread(); + Shutdown.registerShutdownListener(thread::interrupt); handler.handleConnection(m); } @Override public void handleCommand( - final Namespace ns, final MultiAccountManager c, final OutputWriter outputWriter + final Namespace ns, + final MultiAccountManager c, + final OutputWriter outputWriter ) throws CommandException { + Shutdown.installHandler(); final var receiveMode = ns.get("receive-mode"); final var receiveConfig = getReceiveConfig(ns); c.getManagers().forEach(m -> m.setReceiveConfig(receiveConfig)); @@ -84,17 +97,14 @@ public class JsonRpcDispatcherCommand implements LocalCommand, MultiLocalCommand final var handler = new SignalJsonRpcDispatcherHandler(jsonOutputWriter, lineSupplier, receiveMode == ReceiveMode.MANUAL); + final var thread = Thread.currentThread(); + Shutdown.registerShutdownListener(thread::interrupt); handler.handleConnection(c); } - private static ReceiveConfig getReceiveConfig(final Namespace ns) { - final var ignoreAttachments = Boolean.TRUE.equals(ns.getBoolean("ignore-attachments")); - final var ignoreStories = Boolean.TRUE.equals(ns.getBoolean("ignore-stories")); - final var sendReadReceipts = Boolean.TRUE.equals(ns.getBoolean("send-read-receipts")); - return new ReceiveConfig(ignoreAttachments, ignoreStories, sendReadReceipts); - } - private static Supplier getLineSupplier() { - return IOUtils.getLineSupplier(new InputStreamReader(System.in, IOUtils.getConsoleCharset())); + // Use FileChannel for stdin, because System.in is uninterruptible + final var stdInCh = Channels.newInputStream((new FileInputStream(FileDescriptor.in)).getChannel()); + return IOUtils.getLineSupplier(new InputStreamReader(stdInCh, IOUtils.getConsoleCharset())); } }