1 package org
.asamk
.signal
.dbus
;
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
;
14 import java
.io
.IOException
;
16 import java
.net
.URISyntaxException
;
17 import java
.util
.HashSet
;
18 import java
.util
.List
;
20 import java
.util
.concurrent
.TimeoutException
;
21 import java
.util
.function
.Consumer
;
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)
27 public class DbusMultiAccountManagerImpl
implements MultiAccountManager
{
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
;
36 public DbusMultiAccountManagerImpl(
37 final SignalControl signalControl
, DBusConnection connection
, final String busname
39 this.signalControl
= signalControl
;
40 this.connection
= connection
;
41 this.busname
= busname
;
45 public List
<String
> getAccountNumbers() {
46 return signalControl
.listAccounts()
48 .map(a
-> getRemoteObject(a
, Signal
.class).getSelfNumber())
53 public List
<Manager
> getManagers() {
54 return signalControl
.listAccounts()
56 .map(a
-> (Manager
) new DbusManagerImpl(getRemoteObject(a
, Signal
.class), connection
, busname
))
61 public void addOnManagerAddedHandler(final Consumer
<Manager
> handler
) {
62 synchronized (onManagerAddedHandlers
) {
63 onManagerAddedHandlers
.add(handler
);
68 public void addOnManagerRemovedHandler(final Consumer
<Manager
> handler
) {
69 synchronized (onManagerRemovedHandlers
) {
70 onManagerRemovedHandlers
.add(handler
);
75 public Manager
getManager(final String phoneNumber
) {
76 return new DbusManagerImpl(getRemoteObject(signalControl
.getAccount(phoneNumber
), Signal
.class),
82 public URI
getNewProvisioningDeviceLinkUri() throws TimeoutException
, IOException
{
84 return new URI(signalControl
.startLink());
85 } catch (URISyntaxException e
) {
86 throw new IOException(e
);
91 public ProvisioningManager
getProvisioningManagerFor(final URI deviceLinkUri
) {
92 return new DbusProvisioningManagerImpl(signalControl
, connection
, deviceLinkUri
);
96 public RegistrationManager
getNewRegistrationManager(final String account
) throws IOException
{
97 return new DbusRegistrationManagerImpl(account
, signalControl
, connection
);
101 public void close() {
104 private <T
extends DBusInterface
> T
getRemoteObject(final DBusPath path
, final Class
<T
> type
) {
106 return connection
.getRemoteObject(busname
, path
.getPath(), type
);
107 } catch (DBusException e
) {
108 throw new AssertionError(e
);