You are looking at historical revision 10265 of this page. It may differ significantly from its current revision.

dbus

Overview

This is a binding for libdbus 1.0 (and hopefully 1.2.x).

Goals & status

Goal Achieved?
send signals yes
call methods in other processes, and get the return values yes
call methods in other processes asynchronously, and the return values come back to a callback later
register a procedure as a handler for a service/method yes
assign a path to a TinyClos object and map applicable generic functions as dbus methods
create proxy objects matching remote objects
discover services locally
discover services on nearby machines
user code to do any of the above should be minimal: abstract away the orthogonal extra steps (open a connection, start a polling thread, etc.) yes

Author

Shawn Rutledge

Requirements

libdbus and its headers

Download

dbus.egg

License

libdbus has historically had a GPL license. The dbus homepage refers to an incomplete "planned X11/MIT license change due to a couple of license holders who have yet to respond. For the most part this license change is being pursued to simplify licensing issues and fix a couple of licensing corner cases. When this happens D-Bus will be released under the 1.2.0 version." So this egg is released under the MIT license, however if you link it with a version prior to 1.2.0, then you are probably bound by the terms of the GPL.

Examples

These are in the test subdirectory in svn. (Not included in the egg itself at this point)

Examples you can test with QT

QT includes a DBUS remote-controlled car example. E.g. it might be located in /usr/share/qt4/examples/qdbus/remotecontrolledcar/car depending on your distro. If you run the car, you can cause the wheels of the car to turn to the right by doing this:

(use dbus)
(define rc-car-context (dbus:make-context
        service: 'com.trolltech.CarExample
        interface: 'com.trolltech.Examples.CarInterface
        path: '/Car))
(dbus:send rc-car-context "turnRight")

That example called a method but it did not expect any return values.

Now suppose you want to simulate the car, so you can use the above example to control your own car rather than the QT one:

(use dbus)
(define (turn-right) (printf "car is turning to the right~%"))
(define (turn-left) (printf "car is turning to the left~%"))
(define rc-car-context (dbus:make-context
        service: 'com.trolltech.CarExample
        path: '/Car
        interface: 'com.trolltech.Examples.CarInterface ))
(dbus:register-method rc-car-context "turnRight" turn-right)
(dbus:register-method rc-car-context "turnLeft" turn-left)

dbus:register-method starts a polling loop. So you can then run the program above which does dbus:send, and you will see the appropriate printf statement execute asynchronously when the message is received.

Examples based on the DBus Tutorial

The next example, taken from the tutorial, shows how to deal with return values. First the "listener" program which will answer the query:

(use dbus)
(define (query . params)
        (printf "got a query; params: ~s~%" params)
        ;; the response to the query:
        `(#t 42))
(define ctxt (dbus:make-context
        service: 'test.method.server
        interface: 'test.method.Type
        path: '/test/method/Object))
(dbus:register-method ctxt "Method" query)

And now the program which sends a query and prints out the response:

(use dbus)
(define ctxt (dbus:make-context
        service: 'test.method.server
        interface: 'test.method.Type
        path: '/test/method/Object))
(let ([response (dbus:send-and-await-reply ctxt "Method" "query"
                "What is the meaning of life, the universe and everything?") ])
(printf "sent a very important query with a known answer; got flippant response ~s~%" response)
        (if (and (list? response) (eq? 42 (cadr response)))
                (printf "bingo!~%")
                (printf "and the answer is wrong too!  Bad supercomputer, bad!~%")))