home *** CD-ROM | disk | FTP | other *** search
- D-BUS Mono Bindings
- ===
-
- These bindings are a 'thick' wrapper around the D-BUS API. For now
- they rely on the main loop provided by the GLib bindings but this
- dependancy will be removed in the near future.
-
- The wrapper serves two main functions: firstly, it has the know-how to
- introspect live objects passed to it by a server and service requests
- to those objects via the D-BUS. Secondly, it can create a proxy for
- clients who can pretend they are making calls to the regular
- objects. This latter piece of magic is implemented using
- Reflection.Emit to create an assembly on-the-fly containing
- sub-classes of the classes the client thinks it's really using. These
- sub-classes simply marshal each method's parameters off to the D-BUS,
- demarshal the results and return them to the client as if nothing
- happened.
-
- Usage
- ===
-
- A server do should something like this:
-
- namespace Foo
- {
- using System;
- using DBus;
- using Gtk;
-
- public class MyServer
- {
- public static int Main(string [] args)
- {
- Application.Init();
-
- 1 Connection connection = Bus.GetSessionBus();
- 2 Service service = new Service(connection, "org.foo");
- 3 MyObject myObject = new MyObject();
- 4 service.RegisterObject(myObject, "/org/foo/MyObject");
-
- Application.Run();
-
- return 0;
- }
- }
- }
-
- In line 1 we get a connection to the session bus. Then, in line 2 we
- create a service which will listen for requests to org.foo to
- service. In line 3 we create a MyObject object and register it with an
- object path in line 4. It's almost that simple. All that's missing is
- to mark MyObject in such a way that dbus-sharp knows how to export
- it. This is done using the attributes, Interface and Method,
- as in the following example:
-
- namespace Foo
- {
- using System;
- using DBus;
-
- [Interface("org.foo.MyObject")]
- public class MyObject
- {
- [Method]
- public virtual string Echo(string message)
- {
- return "Reply: " + message;
- }
- }
- }
-
- Note that the Methods should also be declared virtual in order for
- the client to use same class declaration.
-
- Now for the client:
-
- namespace Foo
- {
- using System;
- using DBus;
-
- public class MyClient
- {
- public static int Main(string [] args)
- {
- 1 Connection connection = Bus.GetSessionBus();
- 2 Service service = Service.Get(connection, "org.foo");
- 3 MyObject myObject = (MyObject)
- service.GetObject(typeof(MyObject), "/org/foo/MyObject");
- 4 System.Console.WriteLine(testObject.Echo("Hello world!"));
-
- return 0;
- }
- }
- }
-
- Here we start off the same by getting a connection to the session
- bus. This time though, in line 2, we get the existing service rather
- than creating it. In line 3, we ask the service to get the object
- "/org/foo/MyObject" as registered by the server and that return it as
- a MyObject. Once obtained we can use it like any normal object as in
- line 4. This supposes, of course, that you've just written MyObject
- and happen to have it readily available. If that were not the case,
- for example if you wanted to call a method on one of the well-known
- services, then you will need to write a stub class, like the MyObject
- class above, which has the method calls you need correctly defined but
- needn't actually have any implementation.
-
-
- Working Example
- ===
-
- The example directory contains a working example similar to that
- described above. It uses the session bus so first run dbus-launch and
- then export DBUS_SESSION_BUS_ADDRESS, as displayed by dbus-launch, to
- two terminals, one to run the server and one for the client. Then,
- start the server in one terminal, the client in the other and cross
- your fingers.
-