+ }
+
+ private void runDbus(
+ final boolean isDbusSystem, DbusRunner dbusRunner
+ ) throws UnexpectedErrorException {
+ DBusConnection.DBusBusType busType;
+ if (isDbusSystem) {
+ busType = DBusConnection.DBusBusType.SYSTEM;
+ } else {
+ busType = DBusConnection.DBusBusType.SESSION;
+ }
+ try {
+ var conn = DBusConnection.getConnection(busType);
+ dbusRunner.run(conn, DbusConfig.getObjectPath());
+
+ conn.requestBusName(DbusConfig.getBusname());
+
+ logger.info("DBus daemon running on {} bus: {}", busType, DbusConfig.getBusname());
+ } catch (DBusException e) {
+ logger.error("Dbus command failed", e);
+ throw new UnexpectedErrorException("Dbus command failed", e);
+ }
+ }
+
+ private Thread exportMultiAccountManager(
+ final DBusConnection conn, final Manager m, final boolean noReceiveOnStart
+ ) {
+ try {
+ final var objectPath = DbusConfig.getObjectPath(m.getSelfNumber());
+ return exportDbusObject(conn, objectPath, m, noReceiveOnStart);
+ } catch (DBusException e) {
+ logger.error("Failed to export object", e);
+ return null;
+ }
+ }
+
+ private Thread exportDbusObject(
+ final DBusConnection conn, final String objectPath, final Manager m, final boolean noReceiveOnStart
+ ) throws DBusException {
+ final var signal = new DbusSignalImpl(m, conn, objectPath, noReceiveOnStart);
+ conn.exportObject(signal);
+ final var initThread = new Thread(signal::initObjects);
+ initThread.start();
+
+ logger.debug("Exported dbus object: " + objectPath);
+
+ return initThread;
+ }