vala r1636 - in trunk: . gobject
- From: juergbi svn gnome org
- To: svn-commits-list gnome org
- Subject: vala r1636 - in trunk: . gobject
- Date: Mon, 23 Jun 2008 11:03:09 +0000 (UTC)
Author: juergbi
Date: Mon Jun 23 11:03:09 2008
New Revision: 1636
URL: http://svn.gnome.org/viewvc/vala?rev=1636&view=rev
Log:
2008-06-23 JÃrg Billeter <j bitron ch>
* gobject/valaccodedynamicpropertybinding.vala:
Support dynamic D-Bus properties
Modified:
trunk/ChangeLog
trunk/gobject/valaccodedynamicpropertybinding.vala
Modified: trunk/gobject/valaccodedynamicpropertybinding.vala
==============================================================================
--- trunk/gobject/valaccodedynamicpropertybinding.vala (original)
+++ trunk/gobject/valaccodedynamicpropertybinding.vala Mon Jun 23 11:03:09 2008
@@ -53,8 +53,10 @@
func.add_parameter (new CCodeFormalParameter ("obj", dynamic_property.dynamic_type.get_cname ()));
var block = new CCodeBlock ();
- if (dynamic_property.dynamic_type.data_type != null
- && dynamic_property.dynamic_type.data_type.is_subtype_of (codegen.gobject_type)) {
+ if (dynamic_property.dynamic_type.data_type == codegen.dbus_object_type) {
+ generate_dbus_property_getter_wrapper (block);
+ } else if (dynamic_property.dynamic_type.data_type != null
+ && dynamic_property.dynamic_type.data_type.is_subtype_of (codegen.gobject_type)) {
generate_gobject_property_getter_wrapper (block);
} else {
Report.error (node.source_reference, "dynamic properties are not supported for `%s'".printf (dynamic_property.dynamic_type.to_string ()));
@@ -84,8 +86,10 @@
func.add_parameter (new CCodeFormalParameter ("value", node.property_type.get_cname ()));
var block = new CCodeBlock ();
- if (dynamic_property.dynamic_type.data_type != null
- && dynamic_property.dynamic_type.data_type.is_subtype_of (codegen.gobject_type)) {
+ if (dynamic_property.dynamic_type.data_type == codegen.dbus_object_type) {
+ generate_dbus_property_setter_wrapper (block);
+ } else if (dynamic_property.dynamic_type.data_type != null
+ && dynamic_property.dynamic_type.data_type.is_subtype_of (codegen.gobject_type)) {
generate_gobject_property_setter_wrapper (block);
} else {
Report.error (node.source_reference, "dynamic properties are not supported for `%s'".printf (dynamic_property.dynamic_type.to_string ()));
@@ -125,4 +129,122 @@
block.add_statement (new CCodeExpressionStatement (call));
}
+
+ void create_dbus_property_proxy (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 (CCodeBlock block) {
+ create_dbus_property_proxy (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 (CCodeBlock block) {
+ create_dbus_property_proxy (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));
+ }
}
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]