[vala/wip/tintou/dbus-autogen] WIP: Add code to automatically generate GDBusProxy classes



commit 794348a54a303aecd6c5ee7e985d322d2a17b2ab
Author: Corentin Noël <corentin elementary io>
Date:   Mon Mar 30 11:53:29 2020 +0200

    WIP: Add code to automatically generate GDBusProxy classes

 codegen/valagdbusclientmodule.vala | 43 ++++++++++++++++++++++++++++++++++++++
 vala/valasemanticanalyzer.vala     |  5 -----
 2 files changed, 43 insertions(+), 5 deletions(-)
---
diff --git a/codegen/valagdbusclientmodule.vala b/codegen/valagdbusclientmodule.vala
index 12a7693d2..3068e9655 100644
--- a/codegen/valagdbusclientmodule.vala
+++ b/codegen/valagdbusclientmodule.vala
@@ -171,6 +171,32 @@ public class Vala.GDBusClientModule : GDBusModule {
                }
        }
 
+       private Method create_g_signal_override (Interface iface, Signal signl) {
+               var g_signal_override = new Method (signl.name, signl.return_type, null, null);
+               g_signal_override.overrides = true;
+               unowned List<Parameter> parameters = signl.get_parameters ();
+               Parameter signal_name_param = parameters.get (1);
+               Parameter params_param = parameters.get (2);
+               foreach (var param in parameters) {
+                       g_signal_override.add_parameter (param);
+               }
+
+               g_signal_override.body = new Block (null);
+               var signal_name_param_access = new MemberAccess.simple (signal_name_param.name, null);
+               signal_name_param_access.value_type = signal_name_param.variable_type;
+               //Report.warning (iface.source_reference, "%s".printf (signal_name_param.name));
+
+               var switch_statement = new SwitchStatement (signal_name_param_access, null);
+               /*foreach (var iface_signl in iface.get_signals ()) {
+                       var section = new SwitchSection (null);
+                       var label = new SwitchLabel (new StringLiteral (iface_signl.name, null), null);
+                       section.add_label (label);
+                       switch_statement.add_section (section);
+               }*/
+               g_signal_override.body.add_statement (switch_statement);
+               return g_signal_override;
+       }
+
        public override void visit_interface (Interface iface) {
                base.visit_interface (iface);
 
@@ -196,6 +222,23 @@ public class Vala.GDBusClientModule : GDBusModule {
                        type_macro = "G_DEFINE_TYPE_EXTENDED";
                }
 
+               var proxy_vala_class = new Vala.Class (iface.name + "2", iface.source_reference, null);
+               var context = Vala.CodeContext.@get ();
+               var root_symbol = context.root;
+               var glib_ns = root_symbol.scope.lookup ("GLib");
+               var dbusproxy_type = (Vala.Class) glib_ns.scope.lookup ("DBusProxy");
+               proxy_vala_class.base_class = dbusproxy_type;
+               proxy_vala_class.add_base_type (new InterfaceType (iface));
+               foreach (var sgnal in dbusproxy_type.get_signals ()) {
+                       if (sgnal.name == "g_signal") {
+                               var method = create_g_signal_override (iface, sgnal);
+                               proxy_vala_class.add_method (method);
+                       }
+               }
+               iface.parent_symbol.add_class (proxy_vala_class);
+               iface.parent_symbol.check (context);
+               proxy_vala_class.accept (this);
+
                var define_type = new CCodeFunctionCall (new CCodeIdentifier (type_macro));
                define_type.add_argument (new CCodeIdentifier (cname));
                define_type.add_argument (new CCodeIdentifier (lower_cname));
diff --git a/vala/valasemanticanalyzer.vala b/vala/valasemanticanalyzer.vala
index f2d2bdd1f..1df779513 100644
--- a/vala/valasemanticanalyzer.vala
+++ b/vala/valasemanticanalyzer.vala
@@ -476,11 +476,6 @@ public class Vala.SemanticAnalyzer : CodeVisitor {
                        return false;
                }
 
-               if (type_sym is Interface && type_sym.get_attribute ("DBus") != null) {
-                       // GObject properties not currently supported in D-Bus interfaces
-                       return false;
-               }
-
                return true;
        }
 


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