From: AsamK Date: Sun, 6 Feb 2022 18:33:50 +0000 (+0100) Subject: Align receive timeout behavior for dbus client with cli and JSON-RPC X-Git-Tag: v0.10.4~30 X-Git-Url: https://git.nmode.ca/signal-cli/commitdiff_plain/8e773d92c19533cf4a00bb2e21c30bd4a85e2feb?ds=sidebyside Align receive timeout behavior for dbus client with cli and JSON-RPC Timeout is reset by every incoming message --- diff --git a/src/main/java/org/asamk/signal/dbus/DbusManagerImpl.java b/src/main/java/org/asamk/signal/dbus/DbusManagerImpl.java index 33b149d9..a7152a52 100644 --- a/src/main/java/org/asamk/signal/dbus/DbusManagerImpl.java +++ b/src/main/java/org/asamk/signal/dbus/DbusManagerImpl.java @@ -3,7 +3,6 @@ package org.asamk.signal.dbus; import org.asamk.Signal; import org.asamk.signal.DbusConfig; import org.asamk.signal.manager.Manager; -import org.asamk.signal.manager.api.StickerPackInvalidException; import org.asamk.signal.manager.api.AttachmentInvalidException; import org.asamk.signal.manager.api.Configuration; import org.asamk.signal.manager.api.Device; @@ -19,6 +18,7 @@ import org.asamk.signal.manager.api.RecipientIdentifier; import org.asamk.signal.manager.api.SendGroupMessageResults; import org.asamk.signal.manager.api.SendMessageResults; import org.asamk.signal.manager.api.StickerPack; +import org.asamk.signal.manager.api.StickerPackInvalidException; import org.asamk.signal.manager.api.StickerPackUrl; import org.asamk.signal.manager.api.TypingAction; import org.asamk.signal.manager.api.UpdateGroup; @@ -53,6 +53,7 @@ import java.util.Map; import java.util.Optional; import java.util.Set; import java.util.UUID; +import java.util.concurrent.atomic.AtomicLong; import java.util.function.Function; import java.util.function.Supplier; import java.util.stream.Collectors; @@ -498,12 +499,24 @@ public class DbusManagerImpl implements Manager { public void receiveMessages( final Duration timeout, final ReceiveMessageHandler handler ) throws IOException { - addReceiveHandler(handler); - try { - Thread.sleep(timeout.toMillis()); - } catch (InterruptedException ignored) { + final var lastMessage = new AtomicLong(System.currentTimeMillis()); + + final ReceiveMessageHandler receiveHandler = (envelope, e) -> { + lastMessage.set(System.currentTimeMillis()); + handler.handleMessage(envelope, e); + }; + addReceiveHandler(receiveHandler); + while (true) { + try { + final var sleepTimeRemaining = timeout.toMillis() - (System.currentTimeMillis() - lastMessage.get()); + if (sleepTimeRemaining < 0) { + break; + } + Thread.sleep(sleepTimeRemaining); + } catch (InterruptedException ignored) { + } } - removeReceiveHandler(handler); + removeReceiveHandler(receiveHandler); } @Override