1 package org
.asamk
.signal
.dbus
;
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
;
15 import java
.io
.IOException
;
17 import java
.net
.URISyntaxException
;
18 import java
.util
.HashSet
;
19 import java
.util
.List
;
21 import java
.util
.concurrent
.TimeoutException
;
22 import java
.util
.function
.Consumer
;
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)
28 public class DbusMultiAccountManagerImpl
implements MultiAccountManager
{
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
<>();
36 public DbusMultiAccountManagerImpl(final SignalControl signalControl
, DBusConnection connection
) {
37 this.signalControl
= signalControl
;
38 this.connection
= connection
;
42 public List
<String
> getAccountNumbers() {
43 return signalControl
.listAccounts()
45 .map(a
-> getRemoteObject(a
, Signal
.class).getSelfNumber())
50 public void addOnManagerAddedHandler(final Consumer
<Manager
> handler
) {
51 synchronized (onManagerAddedHandlers
) {
52 onManagerAddedHandlers
.add(handler
);
57 public void addOnManagerRemovedHandler(final Consumer
<Manager
> handler
) {
58 synchronized (onManagerRemovedHandlers
) {
59 onManagerRemovedHandlers
.add(handler
);
64 public Manager
getManager(final String phoneNumber
) {
65 return new DbusManagerImpl(getRemoteObject(signalControl
.getAccount(phoneNumber
), Signal
.class), connection
);
69 public URI
getNewProvisioningDeviceLinkUri() throws TimeoutException
, IOException
{
71 return new URI(signalControl
.startLink());
72 } catch (URISyntaxException e
) {
73 throw new IOException(e
);
78 public ProvisioningManager
getProvisioningManagerFor(final URI deviceLinkUri
) {
79 return new DbusProvisioningManagerImpl(signalControl
, connection
, deviceLinkUri
);
83 public RegistrationManager
getNewRegistrationManager(final String account
) throws IOException
{
84 return new DbusRegistrationManagerImpl(account
, signalControl
, connection
);
91 private <T
extends DBusInterface
> T
getRemoteObject(final DBusPath path
, final Class
<T
> type
) {
93 return connection
.getRemoteObject(DbusConfig
.getBusname(), path
.getPath(), type
);
94 } catch (DBusException e
) {
95 throw new AssertionError(e
);