]> nmode's Git Repositories - signal-cli/blob - lib/src/main/java/org/asamk/signal/manager/MultiAccountManagerImpl.java
Implement unregister command for jsonrpc and dbus daemon
[signal-cli] / lib / src / main / java / org / asamk / signal / manager / MultiAccountManagerImpl.java
1 package org.asamk.signal.manager;
2
3 import org.asamk.signal.manager.config.ServiceEnvironment;
4 import org.slf4j.Logger;
5 import org.slf4j.LoggerFactory;
6
7 import java.io.File;
8 import java.io.IOException;
9 import java.net.URI;
10 import java.util.Collection;
11 import java.util.HashMap;
12 import java.util.HashSet;
13 import java.util.List;
14 import java.util.Map;
15 import java.util.Set;
16 import java.util.concurrent.TimeoutException;
17 import java.util.function.Consumer;
18 import java.util.stream.Collectors;
19
20 public class MultiAccountManagerImpl implements MultiAccountManager {
21
22 private final static Logger logger = LoggerFactory.getLogger(MultiAccountManagerImpl.class);
23
24 private final Set<Consumer<Manager>> onManagerAddedHandlers = new HashSet<>();
25 private final Set<Consumer<Manager>> onManagerRemovedHandlers = new HashSet<>();
26 private final Set<Manager> managers = new HashSet<>();
27 private final Map<URI, ProvisioningManager> provisioningManagers = new HashMap<>();
28 private final File dataPath;
29 private final ServiceEnvironment serviceEnvironment;
30 private final String userAgent;
31
32 public MultiAccountManagerImpl(
33 final Collection<Manager> managers,
34 final File dataPath,
35 final ServiceEnvironment serviceEnvironment,
36 final String userAgent
37 ) {
38 this.managers.addAll(managers);
39 managers.forEach(m -> m.addClosedListener(() -> this.removeManager(m)));
40 this.dataPath = dataPath;
41 this.serviceEnvironment = serviceEnvironment;
42 this.userAgent = userAgent;
43 }
44
45 @Override
46 public List<String> getAccountNumbers() {
47 synchronized (managers) {
48 return managers.stream().map(Manager::getSelfNumber).collect(Collectors.toList());
49 }
50 }
51
52 void addManager(final Manager m) {
53 synchronized (managers) {
54 if (managers.contains(m)) {
55 return;
56 }
57 managers.add(m);
58 m.addClosedListener(() -> this.removeManager(m));
59 }
60 synchronized (onManagerAddedHandlers) {
61 for (final var handler : onManagerAddedHandlers) {
62 handler.accept(m);
63 }
64 }
65 }
66
67 @Override
68 public void addOnManagerAddedHandler(final Consumer<Manager> handler) {
69 synchronized (onManagerAddedHandlers) {
70 onManagerAddedHandlers.add(handler);
71 }
72 }
73
74 void removeManager(final Manager m) {
75 synchronized (managers) {
76 if (!managers.remove(m)) {
77 return;
78 }
79 }
80 synchronized (onManagerRemovedHandlers) {
81 for (final var handler : onManagerRemovedHandlers) {
82 handler.accept(m);
83 }
84 }
85 }
86
87 @Override
88 public void addOnManagerRemovedHandler(final Consumer<Manager> handler) {
89 synchronized (onManagerRemovedHandlers) {
90 onManagerRemovedHandlers.add(handler);
91 }
92 }
93
94 @Override
95 public Manager getManager(final String account) {
96 synchronized (managers) {
97 return managers.stream().filter(m -> m.getSelfNumber().equals(account)).findFirst().orElse(null);
98 }
99 }
100
101 @Override
102 public URI getNewProvisioningDeviceLinkUri() throws TimeoutException, IOException {
103 final var provisioningManager = getNewProvisioningManager();
104 final var deviceLinkUri = provisioningManager.getDeviceLinkUri();
105 provisioningManagers.put(deviceLinkUri, provisioningManager);
106 return deviceLinkUri;
107 }
108
109 @Override
110 public ProvisioningManager getProvisioningManagerFor(final URI deviceLinkUri) {
111 return provisioningManagers.remove(deviceLinkUri);
112 }
113
114 @Override
115 public ProvisioningManager getNewProvisioningManager() {
116 return ProvisioningManager.init(dataPath, serviceEnvironment, userAgent, this::addManager);
117 }
118
119 @Override
120 public RegistrationManager getNewRegistrationManager(String account) throws IOException {
121 return RegistrationManager.init(account, dataPath, serviceEnvironment, userAgent, this::addManager);
122 }
123
124 @Override
125 public void close() {
126 synchronized (managers) {
127 for (var m : managers) {
128 try {
129 m.close();
130 } catch (IOException e) {
131 logger.warn("Cleanup failed", e);
132 }
133 }
134 managers.clear();
135 }
136 }
137 }