]> nmode's Git Repositories - signal-cli/blob - src/main/java/org/asamk/signal/dbus/DbusProperties.java
Improve error message when joining a group with already pending admin approval
[signal-cli] / src / main / java / org / asamk / signal / dbus / DbusProperties.java
1 package org.asamk.signal.dbus;
2
3 import org.asamk.Signal;
4 import org.freedesktop.dbus.interfaces.Properties;
5 import org.freedesktop.dbus.types.Variant;
6
7 import java.util.ArrayList;
8 import java.util.List;
9 import java.util.Map;
10 import java.util.Optional;
11 import java.util.stream.Collectors;
12
13 public abstract class DbusProperties implements Properties {
14
15 private final List<DbusInterfacePropertiesHandler> handlers = new ArrayList<>();
16
17 protected void addPropertiesHandler(DbusInterfacePropertiesHandler handler) {
18 this.handlers.add(handler);
19 }
20
21 DbusInterfacePropertiesHandler getHandler(String interfaceName) {
22 final var handler = getHandlerOptional(interfaceName);
23 if (handler.isEmpty()) {
24 throw new Signal.Error.Failure("Property not found");
25 }
26 return handler.get();
27 }
28
29 private Optional<DbusInterfacePropertiesHandler> getHandlerOptional(final String interfaceName) {
30 return handlers.stream().filter(h -> h.getInterfaceName().equals(interfaceName)).findFirst();
31 }
32
33 @Override
34 @SuppressWarnings("unchecked")
35 public <A> A Get(final String interface_name, final String property_name) {
36 final var handler = getHandler(interface_name);
37 final var getter = handler.getGetter(property_name);
38 if (getter == null) {
39 throw new Signal.Error.Failure("Property not found");
40 }
41 return (A) getter.get();
42 }
43
44 @Override
45 public <A> void Set(final String interface_name, final String property_name, final A value) {
46 final var handler = getHandler(interface_name);
47 final var setter = handler.getSetter(property_name);
48 if (setter == null) {
49 throw new Signal.Error.Failure("Property not found");
50 }
51 setter.accept(value);
52 }
53
54 @Override
55 @SuppressWarnings("unchecked")
56 public Map<String, Variant<?>> GetAll(final String interface_name) {
57 final var handler = getHandlerOptional(interface_name);
58 if (handler.isEmpty()) {
59 return Map.of();
60 }
61
62 return handler.get()
63 .getProperties()
64 .stream()
65 .filter(p -> p.getGetter() != null)
66 .collect(Collectors.toMap(DbusProperty::getName, p -> {
67 final Object o = p.getGetter().get();
68 return o instanceof Variant ? (Variant<Object>) o : new Variant<>(o);
69 }));
70 }
71 }