Languages

Purple - Instant Messaging with D-Bus

No votes yet
using DBus;
 
public class DBusSample : GLib.Object {
 
    private DBus.Connection conn;
    private dynamic DBus.Object purple;
 
    public void run () throws DBus.Error, GLib.Error {
        // remove the space before SESSION, it is only required for this wiki
        conn = DBus.Bus.get (DBus.BusType. SESSION);
 
        purple = conn.get_object ("im.pidgin.purple.PurpleService",
                                  "/im/pidgin/purple/PurpleObject",
                                  "im.pidgin.purple.PurpleInterface");
 
        // async dbus call
        purple.PurpleAccountsGetAllActive (getall_reply);
 
        // dbus signals
        purple.ReceivedImMsg += msg_received;
    }
 
    private void msg_received (dynamic DBus.Object purple, int dummy1, string sender,
                               string message_, int dummy2, uint dummy3)
    {
        // dbus signal handler
 
        message ("Message received %s %s", sender, message_);
    }
 
    private void getall_reply (int[] ids, GLib.Error e) {
        // callback for async dbus call
        if (e != null) {
            critical ("%s", e.message);
            return;
        }
        try {
            foreach (int id in ids) {
                // sync dbus call
                string s = purple.PurpleAccountGetUsername (id);
                message ("Account %s", s);
            }
        } catch (DBus.Error dbus_error) {
            critical ("%s", dbus_error.message);
        }
    }
 
    static int main (string[] args) {
        var loop = new MainLoop (null, false);
 
        var test = new DBusSample ();
        try {
            test.run ();
        } catch (DBus.Error e) {
            stderr.printf ("Failed to initialise");
            return 1;
        } catch {
            stderr.printf ("Dynamic method failure");
            return 1;
        }
 
        loop.run ();
 
        return 0;
    }
}