]> nmode's Git Repositories - signal-cli/blob - src/main/java/org/asamk/signal/dbus/DbusMultiAccountManagerImpl.java
Refactor manager update profile method
[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 List<Manager> getManagers() {
51 return signalControl.listAccounts()
52 .stream()
53 .map(a -> (Manager) new DbusManagerImpl(getRemoteObject(a, Signal.class), connection))
54 .toList();
55 }
56
57 @Override
58 public void addOnManagerAddedHandler(final Consumer<Manager> handler) {
59 synchronized (onManagerAddedHandlers) {
60 onManagerAddedHandlers.add(handler);
61 }
62 }
63
64 @Override
65 public void addOnManagerRemovedHandler(final Consumer<Manager> handler) {
66 synchronized (onManagerRemovedHandlers) {
67 onManagerRemovedHandlers.add(handler);
68 }
69 }
70
71 @Override
72 public Manager getManager(final String phoneNumber) {
73 return new DbusManagerImpl(getRemoteObject(signalControl.getAccount(phoneNumber), Signal.class), connection);
74 }
75
76 @Override
77 public URI getNewProvisioningDeviceLinkUri() throws TimeoutException, IOException {
78 try {
79 return new URI(signalControl.startLink());
80 } catch (URISyntaxException e) {
81 throw new IOException(e);
82 }
83 }
84
85 @Override
86 public ProvisioningManager getProvisioningManagerFor(final URI deviceLinkUri) {
87 return new DbusProvisioningManagerImpl(signalControl, connection, deviceLinkUri);
88 }
89
90 @Override
91 public RegistrationManager getNewRegistrationManager(final String account) throws IOException {
92 return new DbusRegistrationManagerImpl(account, signalControl, connection);
93 }
94
95 @Override
96 public void close() {
97 }
98
99 private <T extends DBusInterface> T getRemoteObject(final DBusPath path, final Class<T> type) {
100 try {
101 return connection.getRemoteObject(DbusConfig.getBusname(), path.getPath(), type);
102 } catch (DBusException e) {
103 throw new AssertionError(e);
104 }
105 }
106 }