+ private SignalJsonRpcDispatcherHandler getSignalJsonRpcDispatcherHandler(
+ final SocketChannel c, final boolean noReceiveOnStart
+ ) {
+ final var lineSupplier = IOUtils.getLineSupplier(Channels.newReader(c, StandardCharsets.UTF_8));
+ final var jsonOutputWriter = new JsonWriterImpl(Channels.newWriter(c, StandardCharsets.UTF_8));
+
+ return new SignalJsonRpcDispatcherHandler(jsonOutputWriter, lineSupplier, noReceiveOnStart);
+ }
+
+ private void runDbusSingleAccount(
+ final Manager m, final boolean isDbusSystem, final boolean noReceiveOnStart
+ ) throws UnexpectedErrorException {
+ runDbus(isDbusSystem, (conn, objectPath) -> {
+ try {
+ exportDbusObject(conn, objectPath, m, noReceiveOnStart).join();
+ } catch (InterruptedException ignored) {
+ }
+ });
+ }
+
+ private void runDbusMultiAccount(
+ final MultiAccountManager c, final boolean noReceiveOnStart, final boolean isDbusSystem
+ ) throws UnexpectedErrorException {
+ runDbus(isDbusSystem, (connection, objectPath) -> {
+ final var signalControl = new DbusSignalControlImpl(c, objectPath);
+ connection.exportObject(signalControl);
+
+ c.addOnManagerAddedHandler(m -> {
+ final var thread = exportMultiAccountManager(connection, m, noReceiveOnStart);
+ if (thread != null) {
+ try {
+ thread.join();
+ } catch (InterruptedException ignored) {
+ }
+ }
+ });
+ c.addOnManagerRemovedHandler(m -> {
+ final var path = DbusConfig.getObjectPath(m.getSelfNumber());
+ try {
+ final var object = connection.getExportedObject(null, path);
+ if (object instanceof DbusSignalImpl dbusSignal) {
+ dbusSignal.close();
+ }
+ } catch (DBusException ignored) {
+ }
+ });