1 package org
.argeo
.cms
.dbus
;
3 import java
.io
.IOException
;
4 import java
.nio
.file
.Files
;
5 import java
.nio
.file
.Path
;
6 import java
.nio
.file
.Paths
;
8 import org
.argeo
.api
.cms
.CmsEventBus
;
9 import org
.argeo
.api
.cms
.CmsLog
;
10 import org
.freedesktop
.dbus
.bin
.EmbeddedDBusDaemon
;
11 import org
.freedesktop
.dbus
.connections
.BusAddress
;
12 import org
.freedesktop
.dbus
.connections
.impl
.DBusConnection
;
13 import org
.freedesktop
.dbus
.connections
.impl
.DBusConnectionBuilder
;
14 import org
.freedesktop
.dbus
.exceptions
.DBusException
;
16 public class CmsDBusImpl
implements CmsDBus
{
17 private final static CmsLog log
= CmsLog
.getLog(CmsDBusImpl
.class);
19 private BusAddress sessionBusAddress
;
21 private EmbeddedDBusDaemon dBusDaemon
;
22 private Path dBusDaemonSocket
;
24 private CmsEventBus cmsEventBus
;
28 final String envSessionBusAddress
= System
.getenv(DBUS_SESSION_BUS_ADDRESS
);
29 if (envSessionBusAddress
!= null) {
30 sessionBusAddress
= BusAddress
.of(envSessionBusAddress
);
32 // !! We must first initialise a connection, otherwise there are classloader
34 try (DBusConnection dBusConnection
= DBusConnectionBuilder
.forAddress(sessionBusAddress
)
35 .withShared(false).build()) {
38 log
.debug(() -> "Found session DBus with address " + sessionBusAddress
);
40 Path socketLocation
= Paths
.get(System
.getProperty("user.home"), ".cache", "argeo", "bus");
41 if (Files
.exists(socketLocation
))
42 Files
.delete(socketLocation
);
44 Files
.createDirectories(socketLocation
.getParent());
46 String embeddedSessionBusAddress
= "unix:path=" + socketLocation
.toString();
47 dBusDaemon
= new EmbeddedDBusDaemon(embeddedSessionBusAddress
+ ",listen=true");
48 dBusDaemon
.startInBackgroundAndWait(30 * 1000);
49 dBusDaemonSocket
= socketLocation
;
51 sessionBusAddress
= BusAddress
.of(embeddedSessionBusAddress
);
52 try (DBusConnection dBusConnection
= DBusConnectionBuilder
.forAddress(sessionBusAddress
)
53 .withShared(false).build()) {
56 log
.debug(() -> "Started embedded session DBus with address " + sessionBusAddress
);
58 // TODO set environment variable?
60 } catch (DBusException
| IOException e
) {
61 throw new IllegalStateException("Cannot find a session bus", e
);
66 if (dBusDaemon
!= null) {
69 } catch (IOException e
) {
70 log
.error("Cannot close embedded DBus daemon", e
);
73 Files
.delete(dBusDaemonSocket
);
74 } catch (IOException e
) {
75 log
.error("Cannot delete DBus daemon socket " + dBusDaemonSocket
, e
);
81 public DBusConnection
openSessionConnection() {
83 DBusConnection dBusConnection
= DBusConnectionBuilder
.forAddress(sessionBusAddress
).withShared(false)
85 // TODO track all connections?
86 return dBusConnection
;
87 } catch (DBusException e
) {
89 throw new IllegalStateException("Cannot open connection to session DBus", e
);
93 public void setCmsEventBus(CmsEventBus cmsEventBus
) {
94 this.cmsEventBus
= cmsEventBus
;