Buscar este blog

domingo, 10 de junio de 2012

Usando dbus en .Net

Si programas para Linux una de las cosas que te serán muy útiles es usar dbus ya sea para implementar comunicación entre tus aplicaciones o para inspeccionar el estado del sistema.
En este ejemplo veremos como usar dbus para saber si el screensaver de gnome esta activo.
Usamos la dll dbus-sharp que se obtiene desde el git de mono, aquí esta la liga:
dbus-sharp en github
Yo use la ultima versión del repositorio no las descargas oficiales que son muy viejas.
Bueno lo mejor del proyecto es que te permite obtener la información con tipos de datos duros, nada de castear objects.
Lo primero que debes hacer es crear una interfaz que declare los miembros que exporta la clave de dbus que vas a usar por ejemplo para el screensaver en la siguiente pagina podemos ver los miembros exportados:
http://people.gnome.org/~mccann/gnome-screensaver/docs/gnome-screensaver.html

Ahí podemos ver que tenemos un método y una señal (evento) para saber si el screensaver esta activo:
GetActive y ActiveChanged
Asi que nuestra interfaz declara los dos miembros un evento y una función:
public delegate void ActiveChangedHandler(bool active);
[Interface("org.gnome.ScreenSaver")]
public interface IScreenSaver {
    event ActiveChangedHandler ActiveChanged;
    bool GetActive();
}
Como podemos ver podemos declarar solo los miembros que necesitamos no es necesario declarar todos los miembros.
Ahora usamos la interface en nuestro codigo, solo es necesario conectarse a dbus y obtener un objeto que implementa la interfaz desde la conexión, no es necesario ningún código para el objeto la dll se encarga de implementar la interfaz automáticamente, después solo resta usar los miembros:
class Program {
    static Connection con = Bus.Session;
    static void Main(string[] args) {
        ObjectPath opath = new ObjectPath("/org/gnome/ScreenSaver");
        IScreenSaver bus = con.GetObject<IScreenSaver>
            ("org.gnome.ScreenSaver", opath);
        for(int i = 0; i < 100; i++) {
            Console.WriteLine(bus.GetActive().ToString() + "\t"
                + i.ToString());
            Thread.Sleep(1000);
        }
    }
}
Sencillisimo y muy útil!
Por supuesto también usar en Windows y otros sistemas operativos, aunque por supuesto dbus es mucho mas común en Linux

No hay comentarios:

Publicar un comentario