]> git.argeo.org Git - lgpl/argeo-commons.git/blob - org.argeo.cms.lib.dbus/src/org/argeo/cms/dbus/CmsDBusImpl.java
Prepare next development cycle
[lgpl/argeo-commons.git] / org.argeo.cms.lib.dbus / src / org / argeo / cms / dbus / CmsDBusImpl.java
1 package org.argeo.cms.dbus;
2
3 import java.io.IOException;
4 import java.nio.file.Files;
5 import java.nio.file.Path;
6 import java.nio.file.Paths;
7
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;
15
16 public class CmsDBusImpl implements CmsDBus {
17 private final static CmsLog log = CmsLog.getLog(CmsDBusImpl.class);
18
19 private BusAddress sessionBusAddress;
20
21 private EmbeddedDBusDaemon dBusDaemon;
22 private Path dBusDaemonSocket;
23
24 private CmsEventBus cmsEventBus;
25
26 public void start() {
27 try {
28 final String envSessionBusAddress = System.getenv(DBUS_SESSION_BUS_ADDRESS);
29 if (envSessionBusAddress != null) {
30 sessionBusAddress = BusAddress.of(envSessionBusAddress);
31
32 // !! We must first initialise a connection, otherwise there are classloader
33 // issues later on
34 try (DBusConnection dBusConnection = DBusConnectionBuilder.forAddress(sessionBusAddress)
35 .withShared(false).build()) {
36
37 }
38 log.debug(() -> "Found session DBus with address " + sessionBusAddress);
39 } else {
40 Path socketLocation = Paths.get(System.getProperty("user.home"), ".cache", "argeo", "bus");
41 if (Files.exists(socketLocation))
42 Files.delete(socketLocation);
43 else
44 Files.createDirectories(socketLocation.getParent());
45
46 String embeddedSessionBusAddress = "unix:path=" + socketLocation.toString();
47 dBusDaemon = new EmbeddedDBusDaemon(embeddedSessionBusAddress + ",listen=true");
48 dBusDaemon.startInBackgroundAndWait(30 * 1000);
49 dBusDaemonSocket = socketLocation;
50
51 sessionBusAddress = BusAddress.of(embeddedSessionBusAddress);
52 try (DBusConnection dBusConnection = DBusConnectionBuilder.forAddress(sessionBusAddress)
53 .withShared(false).build()) {
54
55 }
56 log.debug(() -> "Started embedded session DBus with address " + sessionBusAddress);
57
58 // TODO set environment variable?
59 }
60 } catch (DBusException | IOException e) {
61 throw new IllegalStateException("Cannot find a session bus", e);
62 }
63 }
64
65 public void stop() {
66 if (dBusDaemon != null) {
67 try {
68 dBusDaemon.close();
69 } catch (IOException e) {
70 log.error("Cannot close embedded DBus daemon", e);
71 }
72 try {
73 Files.delete(dBusDaemonSocket);
74 } catch (IOException e) {
75 log.error("Cannot delete DBus daemon socket " + dBusDaemonSocket, e);
76 }
77 }
78 }
79
80 @Override
81 public DBusConnection openSessionConnection() {
82 try {
83 DBusConnection dBusConnection = DBusConnectionBuilder.forAddress(sessionBusAddress).withShared(false)
84 .build();
85 // TODO track all connections?
86 return dBusConnection;
87 } catch (DBusException e) {
88 e.printStackTrace();
89 throw new IllegalStateException("Cannot open connection to session DBus", e);
90 }
91 }
92
93 public void setCmsEventBus(CmsEventBus cmsEventBus) {
94 this.cmsEventBus = cmsEventBus;
95 }
96
97 }