X-Git-Url: https://git.argeo.org/?a=blobdiff_plain;f=org.argeo.cms.lib.dbus%2Fsrc%2Forg%2Fargeo%2Fcms%2Fdbus%2FCmsDBusImpl.java;fp=org.argeo.cms.lib.dbus%2Fsrc%2Forg%2Fargeo%2Fcms%2Fdbus%2FCmsDBusImpl.java;h=b9a202be9d7d2ab3e581f60bc9080fcae52c38da;hb=93832291a83666434bd589a0b3fd11f956224bfc;hp=0000000000000000000000000000000000000000;hpb=81eb40f8a68ee85349f26f3468ee52b9af121732;p=lgpl%2Fargeo-commons.git diff --git a/org.argeo.cms.lib.dbus/src/org/argeo/cms/dbus/CmsDBusImpl.java b/org.argeo.cms.lib.dbus/src/org/argeo/cms/dbus/CmsDBusImpl.java new file mode 100644 index 000000000..b9a202be9 --- /dev/null +++ b/org.argeo.cms.lib.dbus/src/org/argeo/cms/dbus/CmsDBusImpl.java @@ -0,0 +1,86 @@ +package org.argeo.cms.dbus; + +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; + +import org.argeo.api.cms.CmsEventBus; +import org.argeo.api.cms.CmsLog; +import org.freedesktop.dbus.bin.EmbeddedDBusDaemon; +import org.freedesktop.dbus.connections.BusAddress; +import org.freedesktop.dbus.connections.impl.DBusConnection; +import org.freedesktop.dbus.connections.impl.DBusConnectionBuilder; +import org.freedesktop.dbus.exceptions.DBusException; + +public class CmsDBusImpl implements CmsDBus { + private final static CmsLog log = CmsLog.getLog(CmsDBusImpl.class); + + private BusAddress sessionBusAddress; + + private EmbeddedDBusDaemon dBusDaemon; + + private CmsEventBus cmsEventBus; + + public void start() { + try { + final String envSessionBusAddress = System.getenv(DBUS_SESSION_BUS_ADDRESS); + if (envSessionBusAddress != null) { + sessionBusAddress = BusAddress.of(envSessionBusAddress); + + // !! We must first initialise a connection, otherwise there are classloader issues later on + try (DBusConnection dBusConnection = DBusConnectionBuilder.forAddress(sessionBusAddress) + .withShared(false).build()) { + + } + log.debug(() -> "Found session DBus with address " + sessionBusAddress); + } else { + Path socketLocation = Paths.get(System.getProperty("user.home"), ".cache", "argeo", "bus"); + Files.createDirectories(socketLocation.getParent()); + // TODO escape : on Windows? + String embeddedSessionBusAddress = "unix:path=" + socketLocation.toUri().getPath(); + dBusDaemon = new EmbeddedDBusDaemon(embeddedSessionBusAddress); + dBusDaemon.startInBackgroundAndWait(30 * 1000); + + sessionBusAddress = BusAddress.of(embeddedSessionBusAddress); + try (DBusConnection dBusConnection = DBusConnectionBuilder.forAddress(sessionBusAddress) + .withShared(false).build()) { + + } + log.debug(() -> "Started embedded session DBus with address " + sessionBusAddress); + + // TODO set environment variable? + } + } catch (DBusException | IOException e) { + throw new IllegalStateException("Cannot find a session bus", e); + } + } + + public void stop() { + if (dBusDaemon != null) { + try { + dBusDaemon.close(); + } catch (IOException e) { + log.error("Cannot close embedded DBus daemon", e); + } + } + } + + @Override + public DBusConnection openSessionConnection() { + try { + DBusConnection dBusConnection = DBusConnectionBuilder.forAddress(sessionBusAddress).withShared(false) + .build(); + // TODO track all connections? + return dBusConnection; + } catch (DBusException e) { + e.printStackTrace(); + throw new IllegalStateException("Cannot open connection to session DBus", e); + } + } + + public void setCmsEventBus(CmsEventBus cmsEventBus) { + this.cmsEventBus = cmsEventBus; + } + +}