Re: [Vala] Using GDBus to Listen to Messages



Hello
Here is a client notification example fitting the server notifications I
wrote some time ago(
http://live.gnome.org/Vala/DBusServerSample#Service_with_D-Bus_property_change_notifications
)
--------------
Client:

[DBus (name = "org.example.Demo")]
public interface Demo : Object {
    public abstract string pubprop { owned get; set; }
}

[DBus (name = "org.freedesktop.DBus.Properties")]
public interface NotifierProxy : Object {
    public abstract signal void PropertiesChanged (string ifc,
HashTable<string, Variant> ht, string[] inv_prop);
}

void main () {
    Demo demo = null;
    NotifierProxy np = null;
    try {
        demo = Bus.get_proxy_sync (BusType.SESSION, "org.example.Demo",

"/org/example/demo");
    } 
    catch (IOError e) {
        stderr.printf ("%s\n", e.message);
    }
    try {
        np = Bus.get_proxy_sync (BusType.SESSION, "org.example.Demo",

"/org/example/demo");
    } 
    catch (IOError er) {
        stderr.printf ("%s\n", er.message);
    }
    demo.pubprop = "jkfdgk";
    np.PropertiesChanged.connect( (x, ht, i) => { 
        print("PropertiesChanged for %s\n", x); 
    });
    new GLib.MainLoop().run();
}
-------------------


-------------------
Server:
[DBus (name = "org.example.Demo")]
public class DemoServer : Object {
  
    public string pubprop { owned get; set; }
  
    private weak DBusConnection conn;
  
    public DemoServer (DBusConnection conn) {
        this.conn = conn;
        this.notify.connect (send_property_change);
    }

    private void send_property_change (ParamSpec p) {
        var builder = new VariantBuilder (VariantType.ARRAY);
        var invalid_builder = new VariantBuilder (new VariantType
("as"));

        if (p.name == "pubprop") {
            Variant i = pubprop;
            builder.add ("{sv}", "pubprop", i);
        }

        try {
            conn.emit_signal (null, 
                              "/org/example/demo", 
                              "org.freedesktop.DBus.Properties", 
                              "PropertiesChanged", 
                              new Variant ("(sa{sv}as)", 
                                           "org.example.Demo", 
                                           builder, 
                                           invalid_builder)
                              );
        } catch (Error e) {
            stderr.printf ("%s\n", e.message);
        }
    }
}

public class NotificationsTest : Object {

    private DemoServer dserver;

    public NotificationsTest () {
        Bus.own_name (BusType.SESSION, "org.example.Demo",
BusNameOwnerFlags.NONE,
                      on_bus_acquired, on_name_acquired, on_name_lost);
    }

    private void on_bus_acquired (DBusConnection conn) {
        print ("bus acquired\n");
        try {
            this.dserver = new DemoServer (conn);
            conn.register_object ("/org/example/demo", this.dserver);
        } catch (IOError e) {
            print ("%s\n", e.message);
        }
    }

    private void on_name_acquired () {
        print ("name acquired\n");
    }  

    private void on_name_lost () {
        print ("name_lost\n");
    }

    public void setup_timeout () {
        Timeout.add_seconds (4, () => {
            dserver.pubprop = Random.next_int ().to_string ();
            return true;
        });
    }
}

void main () {
    var nt = new NotificationsTest ();
    nt.setup_timeout ();
    new MainLoop ().run ();
}
---------------------
Client and server should be compiled as usual with '--pkg gio-2.0'
option.
PS: I didn't check unpacking the PropertiesChanged args.
I also didn't check your code. 
Hope it still helps.

Best Regards





Hello,

I've been experimenting with the prowl protocol and transferring
notifications from a linux system to an iDevice with it. I've thus far come
up with a python proof of concept. I wanted to rewrite this into Vala as an
exercise for myself mostly.

A little background first on how I capture the notifications. I basically
use the message filter feature of DBus to get the notifications, filtering
for interface=org.freedesktop.Notifications and member=Notify.

This is how I've done so using Python: http://codepad.org/dauMCxXY

At first with Vala I came up with this using dbus-glib:
http://codepad.org/JiFvX4vK

But I've since found out that dbus-glib has been deprecated and is not
recommended for use. The alternative being GDBus. Thus I attempted to create
an equivalent program using it: http://codepad.org/RorMIB4O

Unfortunately, this does not work as expected, as in not capturing the
notifications as desired. I'm not sure how to this using GDBus. I've asked
around in #vala on GIMPNet as well as #gtk.
_______________________________________________
vala-list mailing list
vala-list gnome org
http://mail.gnome.org/mailman/listinfo/vala-list





[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]