summaryrefslogtreecommitdiff
path: root/gobject/valadbusclientmodule.vala
diff options
context:
space:
mode:
authorJürg Billeter <j@bitron.ch>2008-11-06 19:24:23 +0000
committerJürg Billeter <juergbi@src.gnome.org>2008-11-06 19:24:23 +0000
commit965530de59d1f4d9d85e3e1ff8be5e406dfb58ee (patch)
tree54cf5652b1a3109d7c6b16656dd7de4cccb3ee25 /gobject/valadbusclientmodule.vala
parent204c092c5533450935a72c1001c8758367393dbf (diff)
downloadvala-965530de59d1f4d9d85e3e1ff8be5e406dfb58ee.tar.gz
Move dynamic property generation to GObjectModule and DBusClientModule
2008-11-06 Jürg Billeter <j@bitron.ch> * gobject/Makefile.am: * gobject/valaccodedynamicpropertymodule.vala: * gobject/valaccodedynamicsignalmodule.vala: * gobject/valaccodegenerator.vala: * gobject/valadbusclientmodule.vala: * gobject/valagobjectmodule.vala: Move dynamic property generation to GObjectModule and DBusClientModule svn path=/trunk/; revision=1989
Diffstat (limited to 'gobject/valadbusclientmodule.vala')
-rw-r--r--gobject/valadbusclientmodule.vala169
1 files changed, 169 insertions, 0 deletions
diff --git a/gobject/valadbusclientmodule.vala b/gobject/valadbusclientmodule.vala
index c4dc2564f..e49be5d4f 100644
--- a/gobject/valadbusclientmodule.vala
+++ b/gobject/valadbusclientmodule.vala
@@ -29,6 +29,8 @@ using Gee;
* The link between a dynamic method and generated code.
*/
public class Vala.DBusClientModule : GAsyncModule {
+ int dynamic_property_id;
+
public DBusClientModule (CCodeGenerator codegen, CCodeModule? next) {
base (codegen, next);
}
@@ -509,4 +511,171 @@ public class Vala.DBusClientModule : GAsyncModule {
return true;
}
}
+
+ public override string get_dynamic_property_getter_cname (DynamicProperty prop) {
+ if (prop.dynamic_type.data_type != dbus_object_type) {
+ return base.get_dynamic_property_getter_cname (prop);
+ }
+
+ string getter_cname = "_dynamic_get_%s%d".printf (prop.name, dynamic_property_id++);
+
+ var func = new CCodeFunction (getter_cname, prop.property_type.get_cname ());
+ func.modifiers |= CCodeModifiers.STATIC | CCodeModifiers.INLINE;
+
+ func.add_parameter (new CCodeFormalParameter ("obj", prop.dynamic_type.get_cname ()));
+
+ var block = new CCodeBlock ();
+ generate_dbus_property_getter_wrapper (prop, block);
+
+ // append to C source file
+ source_type_member_declaration.append (func.copy ());
+
+ func.block = block;
+ source_type_member_definition.append (func);
+
+ return getter_cname;
+ }
+
+ public override string get_dynamic_property_setter_cname (DynamicProperty prop) {
+ if (prop.dynamic_type.data_type != dbus_object_type) {
+ return base.get_dynamic_property_setter_cname (prop);
+ }
+
+ string setter_cname = "_dynamic_set_%s%d".printf (prop.name, dynamic_property_id++);
+
+ var func = new CCodeFunction (setter_cname, "void");
+ func.modifiers |= CCodeModifiers.STATIC | CCodeModifiers.INLINE;
+
+ func.add_parameter (new CCodeFormalParameter ("obj", prop.dynamic_type.get_cname ()));
+ func.add_parameter (new CCodeFormalParameter ("value", prop.property_type.get_cname ()));
+
+ var block = new CCodeBlock ();
+ generate_dbus_property_setter_wrapper (prop, block);
+
+ // append to C source file
+ source_type_member_declaration.append (func.copy ());
+
+ func.block = block;
+ source_type_member_definition.append (func);
+
+ return setter_cname;
+ }
+
+ void create_dbus_property_proxy (DynamicProperty node, CCodeBlock block) {
+ var prop_proxy_call = new CCodeFunctionCall (new CCodeIdentifier ("dbus_g_proxy_new_from_proxy"));
+ prop_proxy_call.add_argument (new CCodeIdentifier ("obj"));
+ prop_proxy_call.add_argument (new CCodeConstant ("DBUS_INTERFACE_PROPERTIES"));
+ prop_proxy_call.add_argument (new CCodeConstant ("NULL"));
+
+ var prop_proxy_decl = new CCodeDeclaration ("DBusGProxy*");
+ prop_proxy_decl.add_declarator (new CCodeVariableDeclarator.with_initializer ("property_proxy", prop_proxy_call));
+ block.add_statement (prop_proxy_decl);
+ }
+
+ void generate_dbus_property_getter_wrapper (DynamicProperty node, CCodeBlock block) {
+ create_dbus_property_proxy (node, block);
+
+ // initialize GValue
+ var cvalinit = new CCodeInitializerList ();
+ cvalinit.append (new CCodeConstant ("0"));
+
+ var cval_decl = new CCodeDeclaration ("GValue");
+ cval_decl.add_declarator (new CCodeVariableDeclarator.with_initializer ("gvalue", cvalinit));
+ block.add_statement (cval_decl);
+
+ var val_ptr = new CCodeUnaryExpression (CCodeUnaryOperator.ADDRESS_OF, new CCodeIdentifier ("gvalue"));
+
+ // call Get method on property proxy
+ var cdecl = new CCodeDeclaration (node.property_type.get_cname ());
+ cdecl.add_declarator (new CCodeVariableDeclarator ("result"));
+ block.add_statement (cdecl);
+
+ var ccall = new CCodeFunctionCall (new CCodeIdentifier ("dbus_g_proxy_call"));
+ ccall.add_argument (new CCodeIdentifier ("property_proxy"));
+ ccall.add_argument (new CCodeConstant ("\"Get\""));
+ ccall.add_argument (new CCodeConstant ("NULL"));
+
+ ccall.add_argument (new CCodeIdentifier ("G_TYPE_STRING"));
+ var get_iface = new CCodeFunctionCall (new CCodeIdentifier ("dbus_g_proxy_get_interface"));
+ get_iface.add_argument (new CCodeIdentifier ("obj"));
+ ccall.add_argument (get_iface);
+
+ ccall.add_argument (new CCodeIdentifier ("G_TYPE_STRING"));
+ ccall.add_argument (new CCodeConstant ("\"%s\"".printf (Symbol.lower_case_to_camel_case (node.name))));
+
+ ccall.add_argument (new CCodeIdentifier ("G_TYPE_INVALID"));
+
+ ccall.add_argument (new CCodeIdentifier ("G_TYPE_VALUE"));
+ ccall.add_argument (val_ptr);
+
+ ccall.add_argument (new CCodeIdentifier ("G_TYPE_INVALID"));
+
+ block.add_statement (new CCodeExpressionStatement (ccall));
+
+ // unref property proxy
+ var prop_proxy_unref = new CCodeFunctionCall (new CCodeIdentifier ("g_object_unref"));
+ prop_proxy_unref.add_argument (new CCodeIdentifier ("property_proxy"));
+ block.add_statement (new CCodeExpressionStatement (prop_proxy_unref));
+
+ // assign value to result variable
+ var cget_call = new CCodeFunctionCall (new CCodeIdentifier (node.property_type.data_type.get_get_value_function ()));
+ cget_call.add_argument (val_ptr);
+ var assign = new CCodeAssignment (new CCodeIdentifier ("result"), cget_call);
+ block.add_statement (new CCodeExpressionStatement (assign));
+
+ // return result
+ block.add_statement (new CCodeReturnStatement (new CCodeIdentifier ("result")));
+ }
+
+ void generate_dbus_property_setter_wrapper (DynamicProperty node, CCodeBlock block) {
+ create_dbus_property_proxy (node, block);
+
+ // initialize GValue
+ var cvalinit = new CCodeInitializerList ();
+ cvalinit.append (new CCodeConstant ("0"));
+
+ var cval_decl = new CCodeDeclaration ("GValue");
+ cval_decl.add_declarator (new CCodeVariableDeclarator.with_initializer ("gvalue", cvalinit));
+ block.add_statement (cval_decl);
+
+ var val_ptr = new CCodeUnaryExpression (CCodeUnaryOperator.ADDRESS_OF, new CCodeIdentifier ("gvalue"));
+
+ var cinit_call = new CCodeFunctionCall (new CCodeIdentifier ("g_value_init"));
+ cinit_call.add_argument (val_ptr);
+ cinit_call.add_argument (new CCodeIdentifier (node.property_type.data_type.get_type_id ()));
+ block.add_statement (new CCodeExpressionStatement (cinit_call));
+
+ var cset_call = new CCodeFunctionCall (new CCodeIdentifier (node.property_type.data_type.get_set_value_function ()));
+ cset_call.add_argument (val_ptr);
+ cset_call.add_argument (new CCodeIdentifier ("value"));
+ block.add_statement (new CCodeExpressionStatement (cset_call));
+
+ // call Set method on property proxy
+ var ccall = new CCodeFunctionCall (new CCodeIdentifier ("dbus_g_proxy_call"));
+ ccall.add_argument (new CCodeIdentifier ("property_proxy"));
+ ccall.add_argument (new CCodeConstant ("\"Set\""));
+ ccall.add_argument (new CCodeConstant ("NULL"));
+
+ ccall.add_argument (new CCodeIdentifier ("G_TYPE_STRING"));
+ var get_iface = new CCodeFunctionCall (new CCodeIdentifier ("dbus_g_proxy_get_interface"));
+ get_iface.add_argument (new CCodeIdentifier ("obj"));
+ ccall.add_argument (get_iface);
+
+ ccall.add_argument (new CCodeIdentifier ("G_TYPE_STRING"));
+ ccall.add_argument (new CCodeConstant ("\"%s\"".printf (Symbol.lower_case_to_camel_case (node.name))));
+
+ ccall.add_argument (new CCodeIdentifier ("G_TYPE_VALUE"));
+ ccall.add_argument (val_ptr);
+
+ ccall.add_argument (new CCodeIdentifier ("G_TYPE_INVALID"));
+
+ ccall.add_argument (new CCodeIdentifier ("G_TYPE_INVALID"));
+
+ block.add_statement (new CCodeExpressionStatement (ccall));
+
+ // unref property proxy
+ var prop_proxy_unref = new CCodeFunctionCall (new CCodeIdentifier ("g_object_unref"));
+ prop_proxy_unref.add_argument (new CCodeIdentifier ("property_proxy"));
+ block.add_statement (new CCodeExpressionStatement (prop_proxy_unref));
+ }
}