]> nmode's Git Repositories - signal-cli/blob - lib/src/main/java/org/asamk/signal/manager/MultiAccountManagerImpl.java
Implement startLink and finishLink for jsonrpc 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 this.dataPath = dataPath;
40 this.serviceEnvironment = serviceEnvironment;
41 this.userAgent = userAgent;
42 }
43
44 @Override
45 public List<String> getAccountNumbers() {
46 synchronized (managers) {
47 return managers.stream().map(Manager::getSelfNumber).collect(Collectors.toList());
48 }
49 }
50
51 void addManager(final Manager m) {
52 synchronized (managers) {
53 if (managers.contains(m)) {
54 return;
55 }
56 managers.add(m);
57 }
58 synchronized (onManagerAddedHandlers) {
59 for (final var handler : onManagerAddedHandlers) {
60 handler.accept(m);
61 }
62 }
63 }
64
65 @Override
66 public void addOnManagerAddedHandler(final Consumer<Manager> handler) {
67 synchronized (onManagerAddedHandlers) {
68 onManagerAddedHandlers.add(handler);
69 }
70 }
71
72 @Override
73 public void addOnManagerRemovedHandler(final Consumer<Manager> handler) {
74 synchronized (onManagerRemovedHandlers) {
75 onManagerRemovedHandlers.add(handler);
76 }
77 }
78
79 @Override
80 public Manager getManager(final String account) {
81 synchronized (managers) {
82 return managers.stream().filter(m -> m.getSelfNumber().equals(account)).findFirst().orElse(null);
83 }
84 }
85
86 @Override
87 public URI getNewProvisioningDeviceLinkUri() throws TimeoutException, IOException {
88 final var provisioningManager = getNewProvisioningManager();
89 final var deviceLinkUri = provisioningManager.getDeviceLinkUri();
90 provisioningManagers.put(deviceLinkUri, provisioningManager);
91 return deviceLinkUri;
92 }
93
94 @Override
95 public ProvisioningManager getProvisioningManagerFor(final URI deviceLinkUri) {
96 return provisioningManagers.remove(deviceLinkUri);
97 }
98
99 @Override
100 public ProvisioningManager getNewProvisioningManager() {
101 return ProvisioningManager.init(dataPath, serviceEnvironment, userAgent, this::addManager);
102 }
103
104 @Override
105 public RegistrationManager getNewRegistrationManager(String account) throws IOException {
106 return RegistrationManager.init(account, dataPath, serviceEnvironment, userAgent, this::addManager);
107 }
108
109 @Override
110 public void close() {
111 synchronized (managers) {
112 for (var m : managers) {
113 try {
114 m.close();
115 } catch (IOException e) {
116 logger.warn("Cleanup failed", e);
117 }
118 }
119 managers.clear();
120 }
121 }
122 }