]> nmode's Git Repositories - signal-cli/blob - src/main/java/org/asamk/signal/commands/DaemonCommand.java
Remove deprecated --json parameter
[signal-cli] / src / main / java / org / asamk / signal / commands / DaemonCommand.java
1 package org.asamk.signal.commands;
2
3 import net.sourceforge.argparse4j.impl.Arguments;
4 import net.sourceforge.argparse4j.inf.Namespace;
5 import net.sourceforge.argparse4j.inf.Subparser;
6
7 import org.asamk.signal.DbusConfig;
8 import org.asamk.signal.DbusReceiveMessageHandler;
9 import org.asamk.signal.JsonDbusReceiveMessageHandler;
10 import org.asamk.signal.OutputType;
11 import org.asamk.signal.commands.exceptions.CommandException;
12 import org.asamk.signal.commands.exceptions.UnexpectedErrorException;
13 import org.asamk.signal.dbus.DbusSignalImpl;
14 import org.asamk.signal.manager.Manager;
15 import org.freedesktop.dbus.connections.impl.DBusConnection;
16 import org.freedesktop.dbus.exceptions.DBusException;
17 import org.slf4j.Logger;
18 import org.slf4j.LoggerFactory;
19
20 import java.io.IOException;
21 import java.util.ArrayList;
22 import java.util.List;
23 import java.util.Set;
24 import java.util.concurrent.TimeUnit;
25
26 public class DaemonCommand implements MultiLocalCommand {
27
28 private final static Logger logger = LoggerFactory.getLogger(DaemonCommand.class);
29
30 @Override
31 public void attachToSubparser(final Subparser subparser) {
32 subparser.help("Run in daemon mode and provide an experimental dbus interface.");
33 subparser.addArgument("--system")
34 .action(Arguments.storeTrue())
35 .help("Use DBus system bus instead of user bus.");
36 subparser.addArgument("--ignore-attachments")
37 .help("Don’t download attachments of received messages.")
38 .action(Arguments.storeTrue());
39 }
40
41 @Override
42 public Set<OutputType> getSupportedOutputTypes() {
43 return Set.of(OutputType.PLAIN_TEXT, OutputType.JSON);
44 }
45
46 @Override
47 public void handleCommand(final Namespace ns, final Manager m) throws CommandException {
48 var inJson = ns.get("output") == OutputType.JSON;
49
50 boolean ignoreAttachments = ns.getBoolean("ignore-attachments");
51
52 DBusConnection.DBusBusType busType;
53 if (ns.getBoolean("system")) {
54 busType = DBusConnection.DBusBusType.SYSTEM;
55 } else {
56 busType = DBusConnection.DBusBusType.SESSION;
57 }
58
59 try (var conn = DBusConnection.getConnection(busType)) {
60 var objectPath = DbusConfig.getObjectPath();
61 var t = run(conn, objectPath, m, ignoreAttachments, inJson);
62
63 conn.requestBusName(DbusConfig.getBusname());
64
65 try {
66 t.join();
67 } catch (InterruptedException ignored) {
68 }
69 } catch (DBusException | IOException e) {
70 logger.error("Dbus command failed", e);
71 throw new UnexpectedErrorException("Dbus command failed");
72 }
73 }
74
75 @Override
76 public void handleCommand(final Namespace ns, final List<Manager> managers) throws CommandException {
77 var inJson = ns.get("output") == OutputType.JSON;
78
79 boolean ignoreAttachments = ns.getBoolean("ignore-attachments");
80
81 DBusConnection.DBusBusType busType;
82 if (ns.getBoolean("system")) {
83 busType = DBusConnection.DBusBusType.SYSTEM;
84 } else {
85 busType = DBusConnection.DBusBusType.SESSION;
86 }
87
88 try (var conn = DBusConnection.getConnection(busType)) {
89 var receiveThreads = new ArrayList<Thread>();
90 for (var m : managers) {
91 var objectPath = DbusConfig.getObjectPath(m.getUsername());
92 var thread = run(conn, objectPath, m, ignoreAttachments, inJson);
93 receiveThreads.add(thread);
94 }
95
96 conn.requestBusName(DbusConfig.getBusname());
97
98 for (var t : receiveThreads) {
99 try {
100 t.join();
101 } catch (InterruptedException ignored) {
102 }
103 }
104 } catch (DBusException | IOException e) {
105 logger.error("Dbus command failed", e);
106 throw new UnexpectedErrorException("Dbus command failed");
107 }
108 }
109
110 private Thread run(
111 DBusConnection conn, String objectPath, Manager m, boolean ignoreAttachments, boolean inJson
112 ) throws DBusException {
113 conn.exportObject(objectPath, new DbusSignalImpl(m));
114
115 final var thread = new Thread(() -> {
116 while (true) {
117 try {
118 m.receiveMessages(1,
119 TimeUnit.HOURS,
120 false,
121 ignoreAttachments,
122 inJson
123 ? new JsonDbusReceiveMessageHandler(m, conn, objectPath)
124 : new DbusReceiveMessageHandler(m, conn, objectPath));
125 } catch (IOException e) {
126 logger.warn("Receiving messages failed, retrying", e);
127 }
128 }
129 });
130
131 logger.info("Exported dbus object: " + objectPath);
132
133 thread.start();
134
135 return thread;
136 }
137 }