]> nmode's Git Repositories - signal-cli/blobdiff - src/main/java/org/asamk/signal/dbus/DbusManagerImpl.java
Use improved shutdown for receive command
[signal-cli] / src / main / java / org / asamk / signal / dbus / DbusManagerImpl.java
index d6cd52fa19739b5379bcbb5483dea24a7557e5a9..cd6c67150bd260a2377273cd483ac10b066b9058 100644 (file)
@@ -3,7 +3,9 @@ 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.AlreadyReceivingException;
 import org.asamk.signal.manager.api.AttachmentInvalidException;
+import org.asamk.signal.manager.api.CaptchaRequiredException;
 import org.asamk.signal.manager.api.Configuration;
 import org.asamk.signal.manager.api.Contact;
 import org.asamk.signal.manager.api.Device;
@@ -17,15 +19,19 @@ import org.asamk.signal.manager.api.GroupSendingNotAllowedException;
 import org.asamk.signal.manager.api.Identity;
 import org.asamk.signal.manager.api.IdentityVerificationCode;
 import org.asamk.signal.manager.api.InactiveGroupLinkException;
+import org.asamk.signal.manager.api.IncorrectPinException;
 import org.asamk.signal.manager.api.InvalidDeviceLinkException;
 import org.asamk.signal.manager.api.InvalidStickerException;
 import org.asamk.signal.manager.api.InvalidUsernameException;
 import org.asamk.signal.manager.api.LastGroupAdminException;
 import org.asamk.signal.manager.api.Message;
 import org.asamk.signal.manager.api.MessageEnvelope;
+import org.asamk.signal.manager.api.NonNormalizedPhoneNumberException;
 import org.asamk.signal.manager.api.NotAGroupMemberException;
 import org.asamk.signal.manager.api.NotPrimaryDeviceException;
 import org.asamk.signal.manager.api.Pair;
+import org.asamk.signal.manager.api.PinLockedException;
+import org.asamk.signal.manager.api.RateLimitException;
 import org.asamk.signal.manager.api.ReceiveConfig;
 import org.asamk.signal.manager.api.Recipient;
 import org.asamk.signal.manager.api.RecipientAddress;
@@ -131,7 +137,7 @@ public class DbusManagerImpl implements Manager {
     }
 
     @Override
-    public void updateConfiguration(Configuration newConfiguration) throws IOException {
+    public void updateConfiguration(Configuration newConfiguration) {
         final var configuration = getRemoteObject(new DBusPath(signal.getObjectPath() + "/Configuration"),
                 Signal.Configuration.class);
         newConfiguration.readReceipts()
@@ -166,6 +172,20 @@ public class DbusManagerImpl implements Manager {
         throw new UnsupportedOperationException();
     }
 
+    @Override
+    public void startChangeNumber(
+            final String newNumber, final boolean voiceVerification, final String captcha
+    ) throws RateLimitException, IOException, CaptchaRequiredException, NonNormalizedPhoneNumberException {
+        throw new UnsupportedOperationException();
+    }
+
+    @Override
+    public void finishChangeNumber(
+            final String newNumber, final String verificationCode, final String pin
+    ) throws IncorrectPinException, PinLockedException, IOException {
+        throw new UnsupportedOperationException();
+    }
+
     @Override
     public void unregister() throws IOException {
         signal.unregister();
@@ -225,7 +245,7 @@ public class DbusManagerImpl implements Manager {
     public SendGroupMessageResults quitGroup(
             final GroupId groupId, final Set<RecipientIdentifier.Single> groupAdmins
     ) throws GroupNotFoundException, IOException, NotAGroupMemberException, LastGroupAdminException {
-        if (groupAdmins.size() > 0) {
+        if (!groupAdmins.isEmpty()) {
             throw new UnsupportedOperationException();
         }
         final var group = getRemoteObject(signal.getGroup(groupId.serialize()), Signal.Group.class);
@@ -503,7 +523,7 @@ public class DbusManagerImpl implements Manager {
             if (isWeakListener) {
                 weakHandlers.add(handler);
             } else {
-                if (messageHandlers.size() == 0) {
+                if (messageHandlers.isEmpty()) {
                     installMessageHandlers();
                 }
                 messageHandlers.add(handler);
@@ -516,7 +536,7 @@ public class DbusManagerImpl implements Manager {
         synchronized (messageHandlers) {
             weakHandlers.remove(handler);
             messageHandlers.remove(handler);
-            if (messageHandlers.size() == 0) {
+            if (messageHandlers.isEmpty()) {
                 uninstallMessageHandlers();
             }
         }
@@ -525,14 +545,21 @@ public class DbusManagerImpl implements Manager {
     @Override
     public boolean isReceiving() {
         synchronized (messageHandlers) {
-            return messageHandlers.size() > 0;
+            return !messageHandlers.isEmpty();
         }
     }
 
+    private Thread receiveThread;
+
     @Override
     public void receiveMessages(
             Optional<Duration> timeout, Optional<Integer> maxMessages, ReceiveMessageHandler handler
-    ) throws IOException {
+    ) throws IOException, AlreadyReceivingException {
+        if (receiveThread != null) {
+            throw new AlreadyReceivingException("Already receiving message.");
+        }
+        receiveThread = Thread.currentThread();
+
         final var remainingMessages = new AtomicInteger(maxMessages.orElse(-1));
         final var lastMessage = new AtomicLong(System.currentTimeMillis());
         final var thread = Thread.currentThread();
@@ -558,6 +585,7 @@ public class DbusManagerImpl implements Manager {
                     }
                     Thread.sleep(sleepTimeRemaining);
                 } catch (InterruptedException ignored) {
+                    break;
                 }
             }
         } else {
@@ -570,6 +598,14 @@ public class DbusManagerImpl implements Manager {
         }
 
         removeReceiveHandler(receiveHandler);
+        receiveThread = null;
+    }
+
+    @Override
+    public void stopReceiveMessages() {
+        if (receiveThread != null) {
+            receiveThread.interrupt();
+        }
     }
 
     @Override
@@ -603,7 +639,7 @@ public class DbusManagerImpl implements Manager {
                 return null;
             }
             final var contactName = signal.getContactName(n);
-            if (onlyContacts && contactName.length() == 0) {
+            if (onlyContacts && contactName.isEmpty()) {
                 return null;
             }
             if (name.isPresent() && !name.get().equals(contactName)) {
@@ -702,7 +738,7 @@ public class DbusManagerImpl implements Manager {
             this.notify();
         }
         synchronized (messageHandlers) {
-            if (messageHandlers.size() > 0) {
+            if (!messageHandlers.isEmpty()) {
                 uninstallMessageHandlers();
             }
             weakHandlers.clear();
@@ -726,7 +762,7 @@ public class DbusManagerImpl implements Manager {
                 .map(RecipientIdentifier.Single.class::cast)
                 .map(RecipientIdentifier.Single::getIdentifier)
                 .toList();
-        if (singleRecipients.size() > 0) {
+        if (!singleRecipients.isEmpty()) {
             timestamp = recipientsHandler.apply(singleRecipients);
         }
 
@@ -929,7 +965,7 @@ public class DbusManagerImpl implements Manager {
             };
             connection.addSigHandler(Signal.SyncMessageReceivedV2.class, signal, this.dbusSyncHandler);
         } catch (DBusException e) {
-            e.printStackTrace();
+            throw new RuntimeException(e);
         }
         signal.subscribeReceive();
     }
@@ -949,7 +985,7 @@ public class DbusManagerImpl implements Manager {
             connection.removeSigHandler(Signal.ReceiptReceivedV2.class, signal, this.dbusRcptHandler);
             connection.removeSigHandler(Signal.SyncMessageReceivedV2.class, signal, this.dbusSyncHandler);
         } catch (DBusException e) {
-            e.printStackTrace();
+            throw new RuntimeException(e);
         }
     }