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