diff options
author | Jürg Billeter <j@bitron.ch> | 2008-11-06 19:24:23 +0000 |
---|---|---|
committer | Jürg Billeter <juergbi@src.gnome.org> | 2008-11-06 19:24:23 +0000 |
commit | 965530de59d1f4d9d85e3e1ff8be5e406dfb58ee (patch) | |
tree | 54cf5652b1a3109d7c6b16656dd7de4cccb3ee25 /gobject/valadbusclientmodule.vala | |
parent | 204c092c5533450935a72c1001c8758367393dbf (diff) | |
download | vala-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.vala | 169 |
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)); + } } |