Class DBusConnection

All Implemented Interfaces:
Closeable, AutoCloseable, IRemoteObjectGetter

public final class DBusConnection extends AbstractConnection implements IRemoteObjectGetter
Handles a connection to DBus.

This is a Singleton class, only 1 connection to the SYSTEM or SESSION busses can be made. Repeated calls to getConnection will return the same reference.

Signal Handlers and method calls from remote objects are run in their own threads, you MUST handle the concurrency issues.

  • Method Details

    • register

      public void register() throws DBusException
      Register this connection on the bus using 'Hello' message.
      Will do nothing if session was already registered.
      Throws:
      DBusException - when sending message fails
      Since:
      5.0.0 - 2023-10-11
    • dynamicProxy

      public <T extends DBusInterface> T dynamicProxy(String _source, String _path, Class<T> _type) throws DBusException
      Tries to resolve a proxy to a remote object. If a type class is given, it tries to convert the object using that class. If null is given as type, it tries to find a proper interface for this object.
      Type Parameters:
      T - object type (DBusInterface compatible)
      Parameters:
      _source - source
      _path - path
      _type - class of object type
      Returns:
      DBusInterface compatible object
      Throws:
      DBusException - when something goes wrong
      API Note:
      This method is only intended for internal use. Visibility may change in future release
    • getExportedObject

      public <T extends DBusInterface> T getExportedObject(String _source, String _path, Class<T> _type) throws DBusException
      Description copied from class: AbstractConnectionBase
      Retrieves an remote object using source and path. Will use the given type as object class.
      Specified by:
      getExportedObject in class AbstractConnectionBase
      Parameters:
      _source - source
      _path - path
      _type - class of remote object
      Returns:
      DBusInterface compatible object
      Throws:
      DBusException
    • getExportedObject

      public DBusInterface getExportedObject(String _source, String _path) throws DBusException
      Description copied from class: AbstractConnectionBase
      Retrieves an remote object using source and path. Will try to find suitable exported DBusInterface automatically.
      Specified by:
      getExportedObject in class AbstractConnectionBase
      Parameters:
      _source - source
      _path - path
      Returns:
      DBusInterface compatible object
      Throws:
      DBusException
    • releaseBusName

      public void releaseBusName(String _busname) throws DBusException
      Release a bus name. Releases the name so that other people can use it
      Parameters:
      _busname - The name to release. MUST be in dot-notation like "org.freedesktop.local"
      Throws:
      DBusException - If the busname is incorrectly formatted.
    • requestBusName

      public void requestBusName(String _busname) throws DBusException
      Request a bus name. Request the well known name that this should respond to on the Bus.
      Parameters:
      _busname - The name to respond to. MUST be in dot-notation like "org.freedesktop.local"
      Throws:
      DBusException - If the register name failed, or our name already exists on the bus. or if busname is incorrectly formatted.
    • getUniqueName

      public String getUniqueName()
      Returns the unique name of this connection.
      Returns:
      unique name
    • getNames

      public String[] getNames()
      Returns all the names owned by this connection.
      Returns:
      connection names
    • getDBusOwnerName

      public String getDBusOwnerName(String _busName)
      Description copied from interface: IRemoteObjectGetter
      Returns name of the current owning dbus session.
      Specified by:
      getDBusOwnerName in interface IRemoteObjectGetter
      Parameters:
      _busName - bus name
      Returns:
      String or null
    • getPeerRemoteObject

      public DBusInterface getPeerRemoteObject(String _busname, String _objectpath) throws InvalidBusNameException, DBusException
      Description copied from interface: IRemoteObjectGetter
      Return a reference to a remote object. This method will resolve the well known name (if given) to a unique bus name when you call it. This means that if a well known name is released by one process and acquired by another calls to objects gained from this method will continue to operate on the original process. This method will use bus introspection to determine the interfaces on a remote object and so may block and may fail. The resulting proxy object will, however, be castable to any interface it implements. It will also autostart the process if applicable. Also note that the resulting proxy may fail to execute the correct method with overloaded methods and that complex types may fail in interesting ways. Basically, if something odd happens, try specifying the interface explicitly.
      Specified by:
      getPeerRemoteObject in interface IRemoteObjectGetter
      Parameters:
      _busname - The bus name to connect to. Usually a well known bus name in dot-notation (such as "org.freedesktop.local") or may be a DBus address such as ":1-16".
      _objectpath - The path on which the process is exporting the object.$
      Returns:
      A reference to a remote object.
      Throws:
      DBusException - on any other errors
      InvalidBusNameException
    • getRemoteObject

      public DBusInterface getRemoteObject(String _busname, String _objectpath) throws DBusException, InvalidBusNameException, InvalidObjectPathException
      Description copied from interface: IRemoteObjectGetter
      Return a reference to a remote object. This method will always refer to the well known name (if given) rather than resolving it to a unique bus name. In particular this means that if a process providing the well known name disappears and is taken over by another process proxy objects gained by this method will make calls on the new proccess. This method will use bus introspection to determine the interfaces on a remote object and so may block and may fail. The resulting proxy object will, however, be castable to any interface it implements. It will also autostart the process if applicable. Also note that the resulting proxy may fail to execute the correct method with overloaded methods and that complex types may fail in interesting ways. Basically, if something odd happens, try specifying the interface explicitly.
      Specified by:
      getRemoteObject in interface IRemoteObjectGetter
      Parameters:
      _busname - The bus name to connect to. Usually a well known bus name name in dot-notation (such as "org.freedesktop.local") or may be a DBus address such as ":1-16".
      _objectpath - The path on which the process is exporting the object.
      Returns:
      A reference to a remote object.
      Throws:
      DBusException - If remote object cannot be retrieved
      InvalidBusNameException - If busname is incorrectly formatted
      InvalidObjectPathException - If objectpath is incorrectly formatted
    • getRemoteObject

      public <I extends DBusInterface> I getRemoteObject(String _busname, String _objectpath, Class<I> _type, boolean _autostart) throws DBusException
      Description copied from interface: IRemoteObjectGetter
      Return a reference to a remote object. This method will always refer to the well known name (if given) rather than resolving it to a unique bus name. In particular this means that if a process providing the well known name disappears and is taken over by another process proxy objects gained by this method will make calls on the new process.
      Specified by:
      getRemoteObject in interface IRemoteObjectGetter
      Type Parameters:
      I - class extending DBusInterface
      Parameters:
      _busname - The bus name to connect to. Usually a well known bus name name in dot-notation (such as "org.freedesktop.local") or may be a DBus address such as ":1-16".
      _objectpath - The path on which the process is exporting the object.
      _type - The interface they are exporting it on. This type must have the same full class name and exposed method signatures as the interface the remote object is exporting.
      _autostart - Disable/Enable auto-starting of services in response to calls on this object. Default is enabled; when calling a method with auto-start enabled, if the destination is a well-known name and is not owned the bus will attempt to start a process to take the name. When disabled an error is returned immediately.
      Returns:
      A reference to a remote object.
      Throws:
      DBusException - on any other errors
    • removeSigHandler

      public <T extends DBusSignal> void removeSigHandler(Class<T> _type, String _source, DBusSigHandler<T> _handler) throws DBusException
      Remove a Signal Handler. Stops listening for this signal.
      Type Parameters:
      T - class extending DBusSignal
      Parameters:
      _type - The signal to watch for.
      _source - The source of the signal.
      _handler - the handler
      Throws:
      DBusException - If listening for the signal on the bus failed.
      ClassCastException - If type is not a sub-type of DBusSignal.
    • removeSigHandler

      public <T extends DBusSignal> void removeSigHandler(Class<T> _type, String _source, DBusInterface _object, DBusSigHandler<T> _handler) throws DBusException
      Remove a Signal Handler. Stops listening for this signal.
      Type Parameters:
      T - class extending DBusSignal
      Parameters:
      _type - The signal to watch for.
      _source - The source of the signal.
      _object - The object emitting the signal.
      _handler - the handler
      Throws:
      DBusException - If listening for the signal on the bus failed.
      ClassCastException - If type is not a sub-type of DBusSignal.
    • removeSigHandler

      public <T extends DBusSignal> void removeSigHandler(DBusMatchRule _rule, DBusSigHandler<T> _handler) throws DBusException
      Remove a match rule with the given DBusSigHandler. The rule will only be removed from DBus if no other additional handlers are registered to the same rule.
      Specified by:
      removeSigHandler in class AbstractConnection
      Type Parameters:
      T - signal type
      Parameters:
      _rule - rule to remove
      _handler - handler to remove
      Throws:
      DBusException - on error
    • addSigHandler

      public <T extends DBusSignal> AutoCloseable addSigHandler(Class<T> _type, String _source, DBusSigHandler<T> _handler) throws DBusException
      Add a Signal Handler. Adds a signal handler to call when a signal is received which matches the specified type, name and source.
      Type Parameters:
      T - class extending DBusSignal
      Parameters:
      _type - The signal to watch for.
      _source - The process which will send the signal. This MUST be a unique bus name and not a well known name.
      _handler - The handler to call when a signal is received.
      Returns:
      closeable that removes signal handler
      Throws:
      DBusException - If listening for the signal on the bus failed.
      ClassCastException - If type is not a sub-type of DBusSignal.
    • addSigHandler

      public <T extends DBusSignal> AutoCloseable addSigHandler(Class<T> _type, String _source, DBusInterface _object, DBusSigHandler<T> _handler) throws DBusException
      Add a Signal Handler. Adds a signal handler to call when a signal is received which matches the specified type, name, source and object.
      Type Parameters:
      T - class extending DBusSignal
      Parameters:
      _type - The signal to watch for.
      _source - The process which will send the signal. This MUST be a unique bus name and not a well known name.
      _object - The object from which the signal will be emitted
      _handler - The handler to call when a signal is received.
      Returns:
      closeable that removes signal handler
      Throws:
      DBusException - If listening for the signal on the bus failed.
      ClassCastException - If type is not a sub-type of DBusSignal.
    • addSigHandler

      public <T extends DBusSignal> AutoCloseable addSigHandler(DBusMatchRule _rule, DBusSigHandler<T> _handler) throws DBusException
      Add a signal handler with the given DBusMatchRule to DBus. The rule will be added to DBus if it was not added before. If the rule was already added, the signal handler is added to the internal map receiving the same signal as the first (and additional) handlers for this rule.
      Specified by:
      addSigHandler in class AbstractConnection
      Type Parameters:
      T - signal type
      Parameters:
      _rule - rule to add
      _handler - handler to use
      Returns:
      closeable that removes signal handler
      Throws:
      DBusException - on error
    • disconnect

      public void disconnect()
      Disconnect from the Bus. If this is a shared connection, it only disconnects when the last reference to the bus has called disconnect. If this is not a shared connection, disconnect will close the connection instantly.
      Overrides:
      disconnect in class AbstractConnectionBase
    • close

      public void close() throws IOException
      Same as disconnect.
      Specified by:
      close in interface AutoCloseable
      Specified by:
      close in interface Closeable
      Overrides:
      close in class AbstractConnectionBase
      Throws:
      IOException
    • getMachineId

      public String getMachineId()
      Description copied from class: AbstractConnectionBase
      The generated UUID of this machine.
      Specified by:
      getMachineId in class AbstractConnectionBase
      Returns:
      String
    • removeGenericSigHandler

      public void removeGenericSigHandler(DBusMatchRule _rule, DBusSigHandler<DBusSignal> _handler) throws DBusException
      Description copied from class: AbstractConnection
      Remove a generic signal handler with the given DBusMatchRule. The rule will only be removed from DBus if no other additional handlers are registered to the same rule.
      Specified by:
      removeGenericSigHandler in class AbstractConnection
      Parameters:
      _rule - rule to remove
      _handler - handler to remove
      Throws:
      DBusException - on error
    • addGenericSigHandler

      public AutoCloseable addGenericSigHandler(DBusMatchRule _rule, DBusSigHandler<DBusSignal> _handler) throws DBusException
      Description copied from class: AbstractConnection
      Adds a DBusMatchRule to with a generic signal handler. Generic signal handlers allow receiving different signals with the same handler. If the rule was already added, the signal handler is added to the internal map receiving the same signal as the first (and additional) handlers for this rule.
      Specified by:
      addGenericSigHandler in class AbstractConnection
      Parameters:
      _rule - rule to add
      _handler - handler to use
      Returns:
      closeable that removes signal handler
      Throws:
      DBusException - on error