]> nmode's Git Repositories - signal-cli/blobdiff - src/main/java/org/asamk/signal/dbus/DbusManagerImpl.java
Reexport dbus objects when self number changes
[signal-cli] / src / main / java / org / asamk / signal / dbus / DbusManagerImpl.java
index df21d94d61722ad6c8767ad02e324dc256b62c07..51323395fa3576bee1c4b16a1b85dec73fa8f293 100644 (file)
@@ -2,10 +2,8 @@ package org.asamk.signal.dbus;
 
 import org.asamk.Signal;
 import org.asamk.signal.DbusConfig;
-import org.asamk.signal.manager.AttachmentInvalidException;
 import org.asamk.signal.manager.Manager;
-import org.asamk.signal.manager.NotMasterDeviceException;
-import org.asamk.signal.manager.StickerPackInvalidException;
+import org.asamk.signal.manager.api.AttachmentInvalidException;
 import org.asamk.signal.manager.api.Configuration;
 import org.asamk.signal.manager.api.Device;
 import org.asamk.signal.manager.api.Group;
@@ -14,10 +12,14 @@ import org.asamk.signal.manager.api.InactiveGroupLinkException;
 import org.asamk.signal.manager.api.InvalidDeviceLinkException;
 import org.asamk.signal.manager.api.Message;
 import org.asamk.signal.manager.api.MessageEnvelope;
+import org.asamk.signal.manager.api.NotMasterDeviceException;
 import org.asamk.signal.manager.api.Pair;
 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;
 import org.asamk.signal.manager.groups.GroupId;
@@ -42,6 +44,7 @@ import java.io.File;
 import java.io.IOException;
 import java.net.URI;
 import java.net.URISyntaxException;
+import java.time.Duration;
 import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.HashSet;
@@ -50,7 +53,7 @@ import java.util.Map;
 import java.util.Optional;
 import java.util.Set;
 import java.util.UUID;
-import java.util.concurrent.TimeUnit;
+import java.util.concurrent.atomic.AtomicLong;
 import java.util.function.Function;
 import java.util.function.Supplier;
 import java.util.stream.Collectors;
@@ -82,11 +85,6 @@ public class DbusManagerImpl implements Manager {
         return signal.getSelfNumber();
     }
 
-    @Override
-    public void checkAccountState() throws IOException {
-        throw new UnsupportedOperationException();
-    }
-
     @Override
     public Map<String, Pair<String, UUID>> areUsersRegistered(final Set<String> numbers) throws IOException {
         final var numbersList = new ArrayList<>(numbers);
@@ -171,7 +169,7 @@ public class DbusManagerImpl implements Manager {
         return signal.listDevices().stream().map(d -> {
             final var device = getRemoteObject(d.getObjectPath(),
                     Signal.Device.class).GetAll("org.asamk.Signal.Device");
-            return new Device((long) device.get("Id").getValue(),
+            return new Device((Integer) device.get("Id").getValue(),
                     (String) device.get("Name").getValue(),
                     (long) device.get("Created").getValue(),
                     (long) device.get("LastSeen").getValue(),
@@ -180,7 +178,7 @@ public class DbusManagerImpl implements Manager {
     }
 
     @Override
-    public void removeLinkedDevices(final long deviceId) throws IOException {
+    public void removeLinkedDevices(final int deviceId) throws IOException {
         final var devicePath = signal.getDevice(deviceId);
         getRemoteObject(devicePath, Signal.Device.class).removeDevice();
     }
@@ -392,12 +390,12 @@ public class DbusManagerImpl implements Manager {
     }
 
     @Override
-    public void deleteRecipient(final RecipientIdentifier.Single recipient) throws IOException {
+    public void deleteRecipient(final RecipientIdentifier.Single recipient) {
         signal.deleteRecipient(recipient.getIdentifier());
     }
 
     @Override
-    public void deleteContact(final RecipientIdentifier.Single recipient) throws IOException {
+    public void deleteContact(final RecipientIdentifier.Single recipient) {
         signal.deleteContact(recipient.getIdentifier());
     }
 
@@ -435,14 +433,19 @@ public class DbusManagerImpl implements Manager {
     }
 
     @Override
-    public URI uploadStickerPack(final File path) throws IOException, StickerPackInvalidException {
+    public StickerPackUrl uploadStickerPack(final File path) throws IOException, StickerPackInvalidException {
         try {
-            return new URI(signal.uploadStickerPack(path.getPath()));
-        } catch (URISyntaxException e) {
+            return StickerPackUrl.fromUri(new URI(signal.uploadStickerPack(path.getPath())));
+        } catch (URISyntaxException | StickerPackUrl.InvalidStickerPackLinkException e) {
             throw new AssertionError(e);
         }
     }
 
+    @Override
+    public List<StickerPack> getStickerPacks() {
+        throw new UnsupportedOperationException();
+    }
+
     @Override
     public void requestAllSyncData() throws IOException {
         signal.sendSyncRequest();
@@ -494,14 +497,26 @@ public class DbusManagerImpl implements Manager {
 
     @Override
     public void receiveMessages(
-            final long timeout, final TimeUnit unit, final ReceiveMessageHandler handler
+            final Duration timeout, final ReceiveMessageHandler handler
     ) throws IOException {
-        addReceiveHandler(handler);
-        try {
-            Thread.sleep(unit.toMillis(timeout));
-        } 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
@@ -606,6 +621,10 @@ public class DbusManagerImpl implements Manager {
         throw new UnsupportedOperationException();
     }
 
+    @Override
+    public void addAddressChangedListener(final Runnable listener) {
+    }
+
     @Override
     public void addClosedListener(final Runnable listener) {
         synchronized (closedListeners) {
@@ -614,7 +633,7 @@ public class DbusManagerImpl implements Manager {
     }
 
     @Override
-    public void close() throws IOException {
+    public void close() {
         synchronized (this) {
             this.notify();
         }
@@ -665,9 +684,9 @@ public class DbusManagerImpl implements Manager {
         return string == null ? "" : string;
     }
 
-    private <T extends DBusInterface> T getRemoteObject(final DBusPath devicePath, final Class<T> type) {
+    private <T extends DBusInterface> T getRemoteObject(final DBusPath path, final Class<T> type) {
         try {
-            return connection.getRemoteObject(DbusConfig.getBusname(), devicePath.getPath(), type);
+            return connection.getRemoteObject(DbusConfig.getBusname(), path.getPath(), type);
         } catch (DBusException e) {
             throw new AssertionError(e);
         }