]> git.ipfire.org Git - thirdparty/vala.git/commitdiff
D-Bus: GType-based client proxy instantiation
authorDidier 'Ptitjes <ptitjes@free.fr>
Thu, 30 Apr 2009 15:26:02 +0000 (17:26 +0200)
committerJürg Billeter <j@bitron.ch>
Tue, 28 Jul 2009 18:56:12 +0000 (20:56 +0200)
Add internal DBus.get_object_from_type method to dbus-glib-1 binding,
fixes bug 571831.

Signed-off-by: Didier 'Ptitjes <ptitjes@free.fr>
codegen/valadbusclientmodule.vala
vapi/dbus-glib-1.vapi

index 1767bcd880559a92faf601455f5bac984a7999b4..9dfcaae01f914d2481d0bf6aec69b397da78902b 100644 (file)
@@ -1146,6 +1146,48 @@ internal class Vala.DBusClientModule : DBusModule {
                return new DBusInterfaceRegisterFunction (iface, context);
        }
 
+       public override void visit_method_call (MethodCall expr) {
+               var mtype = expr.call.value_type as MethodType;
+               if (mtype == null || mtype.method_symbol.get_cname () != "dbus_g_proxy_new_from_type") {
+                       base.visit_method_call (expr);
+                       return;
+               }
+
+               var args = expr.get_argument_list ();
+               Expression connection = ((MemberAccess) expr.call).inner;
+               Expression bus_name = args.get (0);
+               Expression object_path = args.get (1);
+               Expression interface_name = args.get (2);
+               Expression type = args.get (3);
+
+               var quark_call = new CCodeFunctionCall (new CCodeIdentifier ("g_quark_from_string"));
+               quark_call.add_argument (new CCodeConstant ("\"ValaDBusInterfaceProxyType\""));
+
+               var qdata_call = new CCodeFunctionCall (new CCodeIdentifier ("g_type_get_qdata"));
+               type.accept (codegen);
+               qdata_call.add_argument ((CCodeExpression) type.ccodenode);
+               qdata_call.add_argument (quark_call);
+
+               var get_type_call = new CCodeFunctionCall (new CCodeCastExpression (qdata_call, "GType (*)(void)"));
+
+               var ccall = new CCodeFunctionCall (new CCodeIdentifier ("g_object_new"));
+               ccall.add_argument (get_type_call);
+               ccall.add_argument (new CCodeConstant ("\"connection\""));
+               connection.accept (codegen);
+               ccall.add_argument ((CCodeExpression) connection.ccodenode);
+               ccall.add_argument (new CCodeConstant ("\"name\""));
+               bus_name.accept (codegen);
+               ccall.add_argument ((CCodeExpression) bus_name.ccodenode);
+               ccall.add_argument (new CCodeConstant ("\"path\""));
+               object_path.accept (codegen);
+               ccall.add_argument ((CCodeExpression) object_path.ccodenode);
+               ccall.add_argument (new CCodeConstant ("\"interface\""));
+               interface_name.accept (codegen);
+               ccall.add_argument ((CCodeExpression) interface_name.ccodenode);
+               ccall.add_argument (new CCodeConstant ("NULL"));
+               expr.ccodenode = ccall;
+       }
+
        void generate_proxy_filter_function (Interface iface) {
                string lower_cname = iface.get_lower_case_cprefix () + "dbus_proxy";
 
index cda3179eca0e5da3826c9e09e646ff9ca0a05385..0c921c20563ce87bdf1c9039926ae5a84999d5d3 100644 (file)
@@ -101,6 +101,8 @@ namespace DBus {
        public class Connection {
                [CCode (cname = "dbus_g_proxy_new_for_name")]
                public Object get_object (string name, string path, string? interface_ = null);
+               [CCode (cname = "dbus_g_proxy_new_from_type")]
+               public GLib.Object get_object_from_type (string name, string path, string interface_, GLib.Type type);
                [CCode (cname = "dbus_g_connection_register_g_object")]
                public void register_object (string at_path, GLib.Object object);
                [CCode (cname = "dbus_g_connection_lookup_g_object")]