dbus-codegen
- Description
- Lisp code generation for D-Bus.
- Latest
- dbus-codegen-0.1.tar (.sig), 2024-Mar-31, 50.0 KiB
- Maintainer
- <[email protected]>
- Atom feed
- dbus-codegen.xml
- Website
- https://elpa.gnu.org/packages/dbus-codegen.html
- Browse repository
- CGit or Gitweb
- Badge
To install this package from Emacs, use package-install
or list-packages
.
Full description
This package provides macros and functions to make D-Bus client/server implementation easy, inspired by the `gdbus-codegen' utility in GLib. To get it work, `lexical-binding' must be enabled. * Client support A proxy object representing a D-Bus client can be defined with either `dbus-codegen-define-proxy' or `dbus-codegen-make-proxy'. `dbus-codegen-define-proxy' takes a static XML definition of a D-Bus service and generates code at compile time. This is good for stable D-Bus services. On the other hand, `dbus-codegen-make-proxy' uses D-Bus introspection and retrieves a D-Bus service definition from a running service itself. This is good for debugging or for unstable D-Bus services. ** Example Suppose the following code: (dbus-codegen-define-proxy test-proxy "\ <node> <interface name='org.example.Test'> <method name='OpenFile'> <arg type='s' name='path' direction='in'/> </method> <signal name='Changed'> <arg type='s' name='a_string'/> </signal> <property type='s' name='Content' access='read'/> </interface> </node>" "org.example.Test") The `dbus-codegen-define-proxy' macro expands to a definition a struct `test-proxy' with a slot `content', which corresponds to the "Content" property. The slot value will be initialized when the proxy is created and updated when the server sends a notification. The proxy can always retrieve the value with the function `PROXY-retrieve-PROPERTY-property'. The macro also defines the following wrapper functions: - `test-proxy-create' constructor of the proxy - `test-proxy-destroy' destructor of the proxy - `test-proxy-open-file' wrapper around calling the "OpenFile" method - `test-proxy-open-file-asynchronously' asynchronous wrapper around calling the "OpenFile" method - `test-proxy-send-changed-signal' wrapper around sending the "Changed" signal - `test-proxy-register-changed-signal' wrapper around registering a handler for the "Changed" signal - `test-proxy-retrieve-content-property' retrieve the value of the "Content" property In addition to those, the macro also defines a generic function `test-proxy-handle-changed-signal' to allow a class-wide signal handler definition. To register a class-wide signal handler, define a method `test-proxy-handle-changed-signal' with `cl-defmethod', like this: (cl-defmethod test-proxy-handle-changed-signal ((proxy test-proxy) string) ... do something with PROXY and STRING ...) * Server support A skeleton object representing a D-Bus server can be defined with `dbus-codegen-define-skeleton'. `dbus-codegen-define-skeleton' takes a static XML definition of a D-Bus service and generates code at compile time. ** Example Suppose the following code: (dbus-codegen-define-skeleton test-skeleton "\ <node> <interface name='org.example.Test'> <method name='OpenFile'> <arg type='s' name='path' direction='in'/> </method> <signal name='Changed'> <arg type='s' name='a_string'/> </signal> <property type='s' name='Content' access='read'/> </interface> </node>" "org.example.Test") The `dbus-codegen-define-skeleton' macro expands to a definition a struct `test-skeleton' with a slot `content', which corresponds to the "Content" property. The macro also defines the following wrapper functions: - `test-skeleton-create' constructor of the skeleton - `test-skeleton-destroy' destructor of the skeleton - `test-skeleton-register-open-file-method' wrapper around registering a handler for the "OpenFile" method - `test-skeleton-send-changed-signal' wrapper around sending the "Changed" signal - `test-skeleton-register-changed-signal' wrapper around registering a handler for the "Changed" signal - `test-skeleton-register-content-property' wrapper around registering a value of the "Content" property In addition to those, the macro also defines a generic function `test-skeleton-handle-open-file-method' to allow a class-wide method handler definition. To register a class-wide method handler, define a method `test-skeleton-handle-open-file-method' with `cl-defmethod', like this: (cl-defmethod test-skeleton-handle-open-file-method ((skeleton test-skeleton) string) ... do something with SKELETON and STRING ...) * TODO - function documentation generation from annotations