X-Git-Url: https://git.nmode.ca/signal-cli/blobdiff_plain/af292d8f0ea897ea13470489d51c40acca50fc3e..f39983f78acf438049cd709c17ddb3e9ccefedef:/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 6b5361e5..6e0c3173 100644 --- a/src/main/java/org/asamk/signal/commands/JsonRpcDispatcherCommand.java +++ b/src/main/java/org/asamk/signal/commands/JsonRpcDispatcherCommand.java @@ -33,7 +33,6 @@ import java.io.IOException; import java.io.InputStreamReader; import java.util.List; import java.util.Map; -import java.util.concurrent.TimeUnit; public class JsonRpcDispatcherCommand implements LocalCommand { @@ -65,15 +64,27 @@ public class JsonRpcDispatcherCommand implements LocalCommand { public void handleCommand( final Namespace ns, final Manager m, final OutputWriter outputWriter ) throws CommandException { - final boolean ignoreAttachments = ns.getBoolean("ignore-attachments"); + final boolean ignoreAttachments = Boolean.TRUE.equals(ns.getBoolean("ignore-attachments")); + m.setIgnoreAttachments(ignoreAttachments); final var objectMapper = Util.createJsonObjectMapper(); final var jsonRpcSender = new JsonRpcSender((JsonWriter) outputWriter); - final var receiveThread = receiveMessages(s -> jsonRpcSender.sendRequest(JsonRpcRequest.forNotification( - "receive", - objectMapper.valueToTree(s), - null)), m, ignoreAttachments); + final var receiveMessageHandler = new JsonReceiveMessageHandler(m, + s -> jsonRpcSender.sendRequest(JsonRpcRequest.forNotification("receive", + objectMapper.valueToTree(s), + null))); + m.addReceiveHandler(receiveMessageHandler); + + // Maybe this should be handled inside the Manager + while (!m.hasCaughtUpWithOldMessages()) { + try { + synchronized (m) { + m.wait(); + } + } catch (InterruptedException ignored) { + } + } final BufferedReader reader = new BufferedReader(new InputStreamReader(System.in)); @@ -87,11 +98,7 @@ public class JsonRpcDispatcherCommand implements LocalCommand { jsonRpcReader.readRequests((method, params) -> handleRequest(m, objectMapper, method, params), response -> logger.debug("Received unexpected response for id {}", response.getId())); - receiveThread.interrupt(); - try { - receiveThread.join(); - } catch (InterruptedException ignored) { - } + m.removeReceiveHandler(receiveMessageHandler); } private JsonNode handleRequest( @@ -156,26 +163,4 @@ public class JsonRpcDispatcherCommand implements LocalCommand { } command.handleCommand(requestParams, m, outputWriter); } - - private Thread receiveMessages( - JsonWriter jsonWriter, Manager m, boolean ignoreAttachments - ) { - final var thread = new Thread(() -> { - while (!Thread.interrupted()) { - try { - final var receiveMessageHandler = new JsonReceiveMessageHandler(m, jsonWriter); - m.receiveMessages(1, TimeUnit.HOURS, false, ignoreAttachments, receiveMessageHandler); - break; - } catch (IOException e) { - logger.warn("Receiving messages failed, retrying", e); - } catch (InterruptedException e) { - break; - } - } - }); - - thread.start(); - - return thread; - } }