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