]> nmode's Git Repositories - signal-cli/blob - src/main/java/org/asamk/signal/dbus/DbusProperties.java
Extend getUserStatus command for usernames
[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 public Map<String, Variant<?>> GetAll(final String interface_name) {
56 final var handler = getHandlerOptional(interface_name);
57 if (handler.isEmpty()) {
58 return Map.of();
59 }
60
61 return handler.get()
62 .getProperties()
63 .stream()
64 .filter(p -> p.getGetter() != null)
65 .collect(Collectors.toMap(DbusProperty::getName, p -> {
66 final Object o = p.getGetter().get();
67 return o instanceof Variant<?> variant ? variant : new Variant<>(o);
68 }));
69 }
70 }