Java bindings, how to tap into Hal DeviceAdded signal?
Berend Dekens
cyberwizzard at gmail.com
Thu Apr 10 15:57:18 PDT 2008
Hello,
I'm trying to figure out how to get notifications about new devices (I
want to auto-mount block devices and scan them for media files to be
exact). I am struggling with the DBus API and the HAL API. The docs
make it seem so easy and the first part (listing UDI's) went smoothly.
However, now I try to get the signals when a device is added but
whatever I try, nothing happens when I insert my USB drive (even
though KDE shows a popup, so at least dbus itself is working fine).
I currently have 2 classes, the org.freedesktop.Hal.Manager interface
and the class tying it together (the classes are below for
readability). I tried adding the Signal in multiple ways but I get no
errors and no events. Except when I use the public <T extends
DBusSignal> void addSigHandler(Class<T> type, String source,
DBusInterface object, DBusSigHandler<T> handler) method in the
DBusConnection class: I have no clue what source should and everything
I insert in there either results in a invalid bus name or well known
name error.
I googled all night long but I can't find further examples or docs to
turn me in the right direction. Can someone help me?
Regards,
Berend Dekens
-------------------------------- org/freedesktop/Hal/Manager.java
----------------------------------
package org.freedesktop.Hal;
import org.freedesktop.dbus.DBusInterface;
import org.freedesktop.dbus.DBusSignal;
import org.freedesktop.dbus.exceptions.DBusException;
import org.freedesktop.dbus.exceptions.DBusExecutionException;
/**
* Java interface for the org.freedesktop.Hal.Manager interface which
handles most of the system generated
* events. Based upon the Hal 0.5.10 specification at
http://people.freedesktop.org/~david/hal-spec/hal-spec.html#interface-manager
* @author cyberwizzard
*
*/
public interface Manager extends DBusInterface {
/**
* Get all UDI's in the database.
* @return Objref[] An array of UDI's - Strings for all I know
*/
public String[] GetAllDevices();
/**
* Determines if a given object exists.
* @return True if the device exists.
*/
public boolean DeviceExists();
/**
* Find devices for which the given string property assumes the given value.
* @param key
* @param value
* @return Objref[] An array of UDI's - Strings for all I know
*/
public String[] FindDeviceStringMatch(String key, String value);
/**
* Finds devices of the given capability.
* @param capability
* @return Objref[] An array of UDI's - Strings for all I know
*/
public String[] FindDeviceByCapability(String capability);
/**
* Creates a new device object in the temporary device list (TDL)
and return the UDI. Caller must be uid 0.
* @return Objref
* @throws DBusExecutionException PermissionDenied when you lack
the right permissions
*/
public String NewDevice() throws DBusExecutionException;
/**
* Removes a device object that was created in the TDL. Caller
must be uid 0.
* @param tmp_udi Objref tmp_udi
* @throws DBusExecutionException NoSuchDevice, PermissionDenied
*/
public void Remove(String tmp_udi) throws DBusExecutionException;
/**
* Moves a device from the temporary device list (TDL) to the
global device list (GDL). Caller must be uid 0.
* @param tmp_udi Objref tmp_udi
* @param udi Objref udi
* @throws DBusExecutionException NoSuchDevice, PermissionDenied
*/
public void CommitToGdl(String tmp_udi, String udi) throws
DBusExecutionException;
/**
* Acquires a global lock on an interface. See Chapter 4, Locking
for details
* @param interface_name String interface_name
* @param exclusive Bool exclusive
* @throws DBusExecutionException Device.InterfaceAlreadyLocked
*/
public void AcquireGlobalInterfaceLock(String interface_name,
boolean exclusive) throws DBusExecutionException;
/**
* Releases a global lock on an interface. See Chapter 4, Locking
for details.
* @param interface_name String interface_name
* @throws DBusExecutionException Device.InterfaceNotLocked
*/
public void ReleaseGlobalInterfaceLock(String interface_name)
throws DBusExecutionException;
/**
* DBus Signal DeviceAdded(Objref obj) is send by
org.freedesktop.Hal.Manager
* A device was added to the global device list (GDL).
* Based on the HAL 0.5.10 specs.
* @author cyberwizzard
*/
public class DeviceAdded extends DBusSignal {
public final String obj;
public DeviceAdded(String obj) throws DBusException {
super(obj);
this.obj = obj;
}
}
}
----------------------------------------- DbusMonitor.java
---------------------------------------
package org.omegacar.monitor;
import org.freedesktop.Hal.Manager;
import org.freedesktop.dbus.*;
import org.freedesktop.dbus.exceptions.DBusException;
public class DbusMonitor implements DBusSigHandler {
public void handle(DBusSignal s) {
System.out.println("SIGNAL!!");
if (s instanceof Manager.DeviceAdded)
System.out.println("Got a device connect for " +
((Manager.DeviceAdded) s).obj);
}
/**
* Make sure we cannot be instanced, the DBus stuff will create
multiple instances for
* callbacks and their handlers.
*/
protected DbusMonitor() {}
public static void createMonitor() {
System.out.println("Creating DBus Connection");
DBusConnection conn = null;
try {
conn = DBusConnection.getConnection(DBusConnection.SYSTEM);
} catch (DBusException DBe) {
System.out.println("Could not connect to bus: " + DBe);
System.exit(1);
}
Manager HAL = null;
try {
HAL = (Manager)conn.getRemoteObject("org.freedesktop.Hal","/org/freedesktop/Hal/Manager",Manager.class);
System.out.println("Printing UDI's");
String UDI[] = HAL.GetAllDevices();
for(int i = 0; i < UDI.length; i++) {
System.out.println("UDI: " + UDI[i]);
}
conn.addSigHandler(Manager.DeviceAdded.class, new DbusMonitor());
//conn.addSigHandler(Manager.DeviceAdded.class, HAL, new DbusMonitor());
//conn.addSigHandler(DbusMonitor.DeviceAdded.class,
"org.freedesktop.Hal.Manager", HAL, new DbusMonitor());
} catch (DBusException DBe) {
System.out.println("Could not set connect to HAL: " + DBe);
conn.disconnect();
System.exit(1);
}
System.out.println("DBus hooking complete");
}
}
More information about the dbus
mailing list