[vala] D-Bus: Support D-Bus interfaces with prerequisites
- From: Jürg Billeter <juergbi src gnome org>
- To: svn-commits-list gnome org
- Cc:
- Subject: [vala] D-Bus: Support D-Bus interfaces with prerequisites
- Date: Mon, 12 Oct 2009 15:42:02 +0000 (UTC)
commit 04a8e745c78d3d2ccd84574d1a5f91481099cb3f
Author: Jürg Billeter <j bitron ch>
Date: Mon Oct 12 17:40:58 2009 +0200
D-Bus: Support D-Bus interfaces with prerequisites
Fixes bug 598073.
codegen/valadbusclientmodule.vala | 168 +++++++++++++++++++++++--------------
1 files changed, 105 insertions(+), 63 deletions(-)
---
diff --git a/codegen/valadbusclientmodule.vala b/codegen/valadbusclientmodule.vala
index 4836f7d..7b71f2d 100644
--- a/codegen/valadbusclientmodule.vala
+++ b/codegen/valadbusclientmodule.vala
@@ -851,6 +851,98 @@ internal class Vala.DBusClientModule : DBusModule {
expr.ccodenode = ccall;
}
+ void generate_proxy_interface_init (Interface main_iface, Interface iface) {
+ // also generate proxy for prerequisites
+ foreach (var prereq in iface.get_prerequisites ()) {
+ if (prereq.data_type is Interface) {
+ generate_proxy_interface_init (main_iface, (Interface) prereq.data_type);
+ }
+ }
+
+ string lower_cname = main_iface.get_lower_case_cprefix () + "dbus_proxy";
+
+ var proxy_iface_init = new CCodeFunction (lower_cname + "_" + iface.get_lower_case_cprefix () + "_interface_init", "void");
+ proxy_iface_init.add_parameter (new CCodeFormalParameter ("iface", iface.get_cname () + "Iface*"));
+
+ var iface_block = new CCodeBlock ();
+
+ foreach (Method m in iface.get_methods ()) {
+ var vfunc_entry = new CCodeMemberAccess.pointer (new CCodeIdentifier ("iface"), m.vfunc_name);
+ if (!m.coroutine) {
+ iface_block.add_statement (new CCodeExpressionStatement (new CCodeAssignment (vfunc_entry, new CCodeIdentifier (generate_dbus_proxy_method (main_iface, iface, m)))));
+ } else {
+ iface_block.add_statement (new CCodeExpressionStatement (new CCodeAssignment (vfunc_entry, new CCodeIdentifier (generate_async_dbus_proxy_method (main_iface, iface, m)))));
+ vfunc_entry = new CCodeMemberAccess.pointer (new CCodeIdentifier ("iface"), m.get_finish_vfunc_name ());
+ iface_block.add_statement (new CCodeExpressionStatement (new CCodeAssignment (vfunc_entry, new CCodeIdentifier (generate_finish_dbus_proxy_method (main_iface, iface, m)))));
+ }
+ }
+
+ foreach (Property prop in iface.get_properties ()) {
+ if (prop.get_accessor != null) {
+ var vfunc_entry = new CCodeMemberAccess.pointer (new CCodeIdentifier ("iface"), "get_" + prop.name);
+ iface_block.add_statement (new CCodeExpressionStatement (new CCodeAssignment (vfunc_entry, new CCodeIdentifier (generate_dbus_proxy_property_get (main_iface, iface, prop)))));
+ }
+ if (prop.set_accessor != null) {
+ var vfunc_entry = new CCodeMemberAccess.pointer (new CCodeIdentifier ("iface"), "set_" + prop.name);
+ iface_block.add_statement (new CCodeExpressionStatement (new CCodeAssignment (vfunc_entry, new CCodeIdentifier (generate_dbus_proxy_property_set (main_iface, iface, prop)))));
+ }
+ }
+
+ proxy_iface_init.modifiers = CCodeModifiers.STATIC;
+ source_declarations.add_type_member_declaration (proxy_iface_init.copy ());
+ proxy_iface_init.block = iface_block;
+ source_type_member_definition.append (proxy_iface_init);
+ }
+
+ string implement_interface (CCodeFunctionCall define_type, Interface main_iface, Interface iface) {
+ string result = "";
+
+ // also implement prerequisites
+ foreach (var prereq in iface.get_prerequisites ()) {
+ if (prereq.data_type is Interface) {
+ result += implement_interface (define_type, main_iface, (Interface) prereq.data_type);
+ }
+ }
+
+ result += "G_IMPLEMENT_INTERFACE (%s, %sdbus_proxy_%s_interface_init) ".printf (
+ iface.get_upper_case_cname ("TYPE_"),
+ main_iface.get_lower_case_cprefix (),
+ iface.get_lower_case_cprefix ());
+ return result;
+ }
+
+ void implement_property (CCodeBlock block, Interface main_iface, Interface iface) {
+ // also implement prerequisites
+ foreach (var prereq in iface.get_prerequisites ()) {
+ if (prereq.data_type is Interface) {
+ implement_property (block, main_iface, (Interface) prereq.data_type);
+ }
+ }
+
+ var gobject_class = new CCodeFunctionCall (new CCodeIdentifier ("G_OBJECT_CLASS"));
+ gobject_class.add_argument (new CCodeIdentifier ("klass"));
+
+ foreach (Property prop in iface.get_properties ()) {
+ if (!prop.is_abstract) {
+ continue;
+ }
+
+ if (prop.property_type is ArrayType) {
+ continue;
+ }
+
+ string prop_ev = "%s_dbus_proxy_%s".printf (main_iface.get_lower_case_cname (null), Symbol.camel_case_to_lower_case (prop.name)).up ();
+
+ var cinst = new CCodeFunctionCall (new CCodeIdentifier ("g_object_class_override_property"));
+ cinst.add_argument (gobject_class);
+ cinst.add_argument (new CCodeConstant (prop_ev));
+ cinst.add_argument (prop.get_canonical_cconstant ());
+ block.add_statement (new CCodeExpressionStatement (cinst));
+
+ prop_enum.add_value (new CCodeEnumValue (prop_ev));
+ }
+ }
+
public override void visit_interface (Interface iface) {
base.visit_interface (iface);
@@ -880,16 +972,12 @@ internal class Vala.DBusClientModule : DBusModule {
source_declarations.add_type_member_declaration (new CCodeFunction(lower_cname + "_get_type", "GType"));
- var implement = new CCodeFunctionCall (new CCodeIdentifier ("G_IMPLEMENT_INTERFACE"));
- implement.add_argument (new CCodeIdentifier (iface.get_upper_case_cname ("TYPE_")));
- implement.add_argument (new CCodeIdentifier (lower_cname + "_interface_init"));
-
var define_type = new CCodeFunctionCall (new CCodeIdentifier ("G_DEFINE_TYPE_EXTENDED"));
define_type.add_argument (new CCodeIdentifier (cname));
define_type.add_argument (new CCodeIdentifier (lower_cname));
define_type.add_argument (new CCodeIdentifier ("DBUS_TYPE_G_PROXY"));
define_type.add_argument (new CCodeConstant ("0"));
- define_type.add_argument (implement);
+ define_type.add_argument (new CCodeIdentifier (implement_interface (define_type, iface, iface)));
source_type_member_definition.append (new CCodeExpressionStatement (define_type));
@@ -1066,23 +1154,7 @@ internal class Vala.DBusClientModule : DBusModule {
prop_enum = new CCodeEnum ();
prop_enum.add_value (new CCodeEnumValue ("%s_DUMMY_PROPERTY".printf (lower_cname.up ())));
- foreach (Property prop in iface.get_properties ()) {
- if (!prop.is_abstract) {
- continue;
- }
-
- if (prop.property_type is ArrayType) {
- continue;
- }
-
- var cinst = new CCodeFunctionCall (new CCodeIdentifier ("g_object_class_override_property"));
- cinst.add_argument (gobject_class);
- cinst.add_argument (new CCodeConstant (prop.get_upper_case_cname ()));
- cinst.add_argument (prop.get_canonical_cconstant ());
- proxy_class_init.block.add_statement (new CCodeExpressionStatement (cinst));
-
- prop_enum.add_value (new CCodeEnumValue (prop.get_upper_case_cname ()));
- }
+ implement_property (proxy_class_init.block, iface, iface);
source_declarations.add_type_member_declaration (prop_enum);
@@ -1092,37 +1164,7 @@ internal class Vala.DBusClientModule : DBusModule {
proxy_instance_init.block = new CCodeBlock ();
source_type_member_definition.append (proxy_instance_init);
- var proxy_iface_init = new CCodeFunction (lower_cname + "_interface_init", "void");
- proxy_iface_init.add_parameter (new CCodeFormalParameter ("iface", iface.get_cname () + "Iface*"));
-
- var iface_block = new CCodeBlock ();
-
- foreach (Method m in iface.get_methods ()) {
- var vfunc_entry = new CCodeMemberAccess.pointer (new CCodeIdentifier ("iface"), m.vfunc_name);
- if (!m.coroutine) {
- iface_block.add_statement (new CCodeExpressionStatement (new CCodeAssignment (vfunc_entry, new CCodeIdentifier (generate_dbus_proxy_method (iface, m)))));
- } else {
- iface_block.add_statement (new CCodeExpressionStatement (new CCodeAssignment (vfunc_entry, new CCodeIdentifier (generate_async_dbus_proxy_method (iface, m)))));
- vfunc_entry = new CCodeMemberAccess.pointer (new CCodeIdentifier ("iface"), m.get_finish_vfunc_name ());
- iface_block.add_statement (new CCodeExpressionStatement (new CCodeAssignment (vfunc_entry, new CCodeIdentifier (generate_finish_dbus_proxy_method (iface, m)))));
- }
- }
-
- foreach (Property prop in iface.get_properties ()) {
- if (prop.get_accessor != null) {
- var vfunc_entry = new CCodeMemberAccess.pointer (new CCodeIdentifier ("iface"), "get_" + prop.name);
- iface_block.add_statement (new CCodeExpressionStatement (new CCodeAssignment (vfunc_entry, new CCodeIdentifier (generate_dbus_proxy_property_get (iface, prop)))));
- }
- if (prop.set_accessor != null) {
- var vfunc_entry = new CCodeMemberAccess.pointer (new CCodeIdentifier ("iface"), "set_" + prop.name);
- iface_block.add_statement (new CCodeExpressionStatement (new CCodeAssignment (vfunc_entry, new CCodeIdentifier (generate_dbus_proxy_property_set (iface, prop)))));
- }
- }
-
- proxy_iface_init.modifiers = CCodeModifiers.STATIC;
- source_declarations.add_type_member_declaration (proxy_iface_init.copy ());
- proxy_iface_init.block = iface_block;
- source_type_member_definition.append (proxy_iface_init);
+ generate_proxy_interface_init (iface, iface);
// dbus proxy get/set_property stubs
// TODO add actual implementation
@@ -1460,8 +1502,8 @@ internal class Vala.DBusClientModule : DBusModule {
}
}
- string generate_dbus_proxy_method (Interface iface, Method m) {
- string proxy_name = "%sdbus_proxy_%s".printf (iface.get_lower_case_cprefix (), m.name);
+ string generate_dbus_proxy_method (Interface main_iface, Interface iface, Method m) {
+ string proxy_name = "%sdbus_proxy_%s".printf (main_iface.get_lower_case_cprefix (), m.name);
string dbus_iface_name = get_dbus_name (iface);
@@ -1666,8 +1708,8 @@ internal class Vala.DBusClientModule : DBusModule {
error_block.add_statement (if_else_if);
}
- string generate_async_dbus_proxy_method (Interface iface, Method m) {
- string proxy_name = "%sdbus_proxy_%s_async".printf (iface.get_lower_case_cprefix (), m.name);
+ string generate_async_dbus_proxy_method (Interface main_iface, Interface iface, Method m) {
+ string proxy_name = "%sdbus_proxy_%s_async".printf (main_iface.get_lower_case_cprefix (), m.name);
string dbus_iface_name = get_dbus_name (iface);
@@ -1811,8 +1853,8 @@ internal class Vala.DBusClientModule : DBusModule {
return proxy_name;
}
- string generate_finish_dbus_proxy_method (Interface iface, Method m) {
- string proxy_name = "%sdbus_proxy_%s_finish".printf (iface.get_lower_case_cprefix (), m.name);
+ string generate_finish_dbus_proxy_method (Interface main_iface, Interface iface, Method m) {
+ string proxy_name = "%sdbus_proxy_%s_finish".printf (main_iface.get_lower_case_cprefix (), m.name);
string dbus_iface_name = get_dbus_name (iface);
@@ -1871,8 +1913,8 @@ internal class Vala.DBusClientModule : DBusModule {
return proxy_name;
}
- string generate_dbus_proxy_property_get (Interface iface, Property prop) {
- string proxy_name = "%sdbus_proxy_get_%s".printf (iface.get_lower_case_cprefix (), prop.name);
+ string generate_dbus_proxy_property_get (Interface main_iface, Interface iface, Property prop) {
+ string proxy_name = "%sdbus_proxy_get_%s".printf (main_iface.get_lower_case_cprefix (), prop.name);
string dbus_iface_name = get_dbus_name (iface);
@@ -2018,8 +2060,8 @@ internal class Vala.DBusClientModule : DBusModule {
return proxy_name;
}
- string generate_dbus_proxy_property_set (Interface iface, Property prop) {
- string proxy_name = "%sdbus_proxy_set_%s".printf (iface.get_lower_case_cprefix (), prop.name);
+ string generate_dbus_proxy_property_set (Interface main_iface, Interface iface, Property prop) {
+ string proxy_name = "%sdbus_proxy_set_%s".printf (main_iface.get_lower_case_cprefix (), prop.name);
string dbus_iface_name = get_dbus_name (iface);
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]