]> nmode's Git Repositories - signal-cli/blob - src/main/java/org/asamk/signal/dbus/DbusMultiAccountManagerImpl.java
9659fea52cd3fe6fd97e7bbfdc1429155d6747d9
[signal-cli] / src / main / java / org / asamk / signal / dbus / DbusMultiAccountManagerImpl.java
1 package org.asamk.signal.dbus;
2
3 import org.asamk.Signal;
4 import org.asamk.SignalControl;
5 import org.asamk.signal.DbusConfig;
6 import org.asamk.signal.manager.Manager;
7 import org.asamk.signal.manager.MultiAccountManager;
8 import org.asamk.signal.manager.ProvisioningManager;
9 import org.asamk.signal.manager.RegistrationManager;
10 import org.freedesktop.dbus.DBusPath;
11 import org.freedesktop.dbus.connections.impl.DBusConnection;
12 import org.freedesktop.dbus.exceptions.DBusException;
13 import org.freedesktop.dbus.interfaces.DBusInterface;
14
15 import java.io.IOException;
16 import java.net.URI;
17 import java.net.URISyntaxException;
18 import java.util.HashSet;
19 import java.util.List;
20 import java.util.Set;
21 import java.util.concurrent.TimeoutException;
22 import java.util.function.Consumer;
23
24 /**
25 * This class implements the MultiAccountManager interface using the DBus Signal interface, where possible.
26 * It's used for the signal-cli dbus client mode (--dbus, --dbus-system)
27 */
28 public class DbusMultiAccountManagerImpl implements MultiAccountManager {
29
30 private final SignalControl signalControl;
31 private final DBusConnection connection;
32 // TODO add listeners for added/removed accounts
33 private final Set<Consumer<Manager>> onManagerAddedHandlers = new HashSet<>();
34 private final Set<Consumer<Manager>> onManagerRemovedHandlers = new HashSet<>();
35
36 public DbusMultiAccountManagerImpl(final SignalControl signalControl, DBusConnection connection) {
37 this.signalControl = signalControl;
38 this.connection = connection;
39 }
40
41 @Override
42 public List<String> getAccountNumbers() {
43 return signalControl.listAccounts()
44 .stream()
45 .map(a -> getRemoteObject(a, Signal.class).getSelfNumber())
46 .toList();
47 }
48
49 @Override
50 public void addOnManagerAddedHandler(final Consumer<Manager> handler) {
51 synchronized (onManagerAddedHandlers) {
52 onManagerAddedHandlers.add(handler);
53 }
54 }
55
56 @Override
57 public void addOnManagerRemovedHandler(final Consumer<Manager> handler) {
58 synchronized (onManagerRemovedHandlers) {
59 onManagerRemovedHandlers.add(handler);
60 }
61 }
62
63 @Override
64 public Manager getManager(final String phoneNumber) {
65 return new DbusManagerImpl(getRemoteObject(signalControl.getAccount(phoneNumber), Signal.class), connection);
66 }
67
68 @Override
69 public URI getNewProvisioningDeviceLinkUri() throws TimeoutException, IOException {
70 try {
71 return new URI(signalControl.startLink());
72 } catch (URISyntaxException e) {
73 throw new IOException(e);
74 }
75 }
76
77 @Override
78 public ProvisioningManager getProvisioningManagerFor(final URI deviceLinkUri) {
79 return new DbusProvisioningManagerImpl(signalControl, connection, deviceLinkUri);
80 }
81
82 @Override
83 public RegistrationManager getNewRegistrationManager(final String account) throws IOException {
84 return new DbusRegistrationManagerImpl(account, signalControl, connection);
85 }
86
87 @Override
88 public void close() {
89 }
90
91 private <T extends DBusInterface> T getRemoteObject(final DBusPath path, final Class<T> type) {
92 try {
93 return connection.getRemoteObject(DbusConfig.getBusname(), path.getPath(), type);
94 } catch (DBusException e) {
95 throw new AssertionError(e);
96 }
97 }
98 }