]> git.ipfire.org Git - thirdparty/vala.git/commitdiff
Support serialization and deserialization of structs in static D-Bus
authorJürg Billeter <j@bitron.ch>
Fri, 21 Nov 2008 19:01:51 +0000 (19:01 +0000)
committerJürg Billeter <juergbi@src.gnome.org>
Fri, 21 Nov 2008 19:01:51 +0000 (19:01 +0000)
2008-11-21  Jürg Billeter  <j@bitron.ch>

* gobject/valadbusclientmodule.vala:
* gobject/valadbusmodule.vala:

Support serialization and deserialization of structs in static
D-Bus clients

svn path=/trunk/; revision=2052

ChangeLog
gobject/valadbusclientmodule.vala
gobject/valadbusmodule.vala

index 8766ee29d9efcad03e4bec9cf1eba1ee541684bc..3ebf6220a91d7ef0ca59ac0d60bdca3feb210f79 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,11 @@
+2008-11-21  Jürg Billeter  <j@bitron.ch>
+
+       * gobject/valadbusclientmodule.vala:
+       * gobject/valadbusmodule.vala:
+
+       Support serialization and deserialization of structs in static
+       D-Bus clients
+
 2008-11-21  Jürg Billeter  <j@bitron.ch>
 
        * gobject/valadbusclientmodule.vala:
index aea9a3447d79cea129f10c7283329b140713469b..21e3ac996aed9c2a0bb8432730c999e60161b38a 100644 (file)
@@ -1014,7 +1014,11 @@ public class Vala.DBusClientModule : DBusModule {
 
                foreach (FormalParameter param in m.get_parameters ()) {
                        if (param.direction == ParameterDirection.IN) {
-                               write_expression (prefragment, param.parameter_type, new CCodeIdentifier ("_iter"), new CCodeIdentifier (param.name));
+                               CCodeExpression expr = new CCodeIdentifier (param.name);
+                               if (param.parameter_type.is_real_struct_type ()) {
+                                       expr = new CCodeUnaryExpression (CCodeUnaryOperator.POINTER_INDIRECTION, expr);
+                               }
+                               write_expression (prefragment, param.parameter_type, new CCodeIdentifier ("_iter"), expr);
                        } else {
                                cdecl = new CCodeDeclaration (param.parameter_type.get_cname ());
                                cdecl.add_declarator (new CCodeVariableDeclarator ("_" + param.name));
index 187c18050e3a08fa03d3923df33921f630125076..127519c13b9e4d2d472272715547a12f4566f7d5 100644 (file)
@@ -155,6 +155,35 @@ public class Vala.DBusModule : GAsyncModule {
                return new CCodeIdentifier (temp_name);
        }
 
+       CCodeExpression read_struct (CCodeFragment fragment, Struct st, CCodeExpression iter_expr) {
+               string temp_name = "_tmp%d".printf (next_temp_var_id++);
+               string subiter_name = "_tmp%d".printf (next_temp_var_id++);
+
+               var cdecl = new CCodeDeclaration (st.get_cname ());
+               cdecl.add_declarator (new CCodeVariableDeclarator (temp_name));
+               fragment.append (cdecl);
+
+               cdecl = new CCodeDeclaration ("DBusMessageIter");
+               cdecl.add_declarator (new CCodeVariableDeclarator (subiter_name));
+               fragment.append (cdecl);
+
+               var iter_call = new CCodeFunctionCall (new CCodeIdentifier ("dbus_message_iter_recurse"));
+               iter_call.add_argument (new CCodeUnaryExpression (CCodeUnaryOperator.ADDRESS_OF, iter_expr));
+               iter_call.add_argument (new CCodeUnaryExpression (CCodeUnaryOperator.ADDRESS_OF, new CCodeIdentifier (subiter_name)));
+               fragment.append (new CCodeExpressionStatement (iter_call));
+
+               foreach (Field f in st.get_fields ()) {
+                       if (f.binding != MemberBinding.INSTANCE) {
+                               continue;
+                       }
+
+                       var field_expr = read_expression (fragment, f.field_type, new CCodeIdentifier (subiter_name), new CCodeMemberAccess (new CCodeIdentifier (temp_name), f.get_cname ()));
+                       fragment.append (new CCodeExpressionStatement (new CCodeAssignment (new CCodeMemberAccess (new CCodeIdentifier (temp_name), f.get_cname ()), field_expr)));
+               }
+
+               return new CCodeIdentifier (temp_name);
+       }
+
        public CCodeExpression? read_expression (CCodeFragment fragment, DataType type, CCodeExpression iter_expr, CCodeExpression? expr) {
                BasicTypeInfo basic_type;
                CCodeExpression result = null;
@@ -162,6 +191,8 @@ public class Vala.DBusModule : GAsyncModule {
                        result = read_basic (fragment, basic_type, iter_expr);
                } else if (type is ArrayType) {
                        result = read_array (fragment, (ArrayType) type, iter_expr, expr);
+               } else if (type.data_type is Struct) {
+                       result = read_struct (fragment, (Struct) type.data_type, iter_expr);
                } else {
                        Report.error (type.source_reference, "D-Bus deserialization of type `%s' is not supported".printf (type.to_string ()));
                        return null;
@@ -225,12 +256,42 @@ public class Vala.DBusModule : GAsyncModule {
                fragment.append (new CCodeExpressionStatement (iter_call));
        }
 
+       void write_struct (CCodeFragment fragment, Struct st, CCodeExpression iter_expr, CCodeExpression struct_expr) {
+               string subiter_name = "_tmp%d".printf (next_temp_var_id++);
+
+               var cdecl = new CCodeDeclaration ("DBusMessageIter");
+               cdecl.add_declarator (new CCodeVariableDeclarator (subiter_name));
+               fragment.append (cdecl);
+
+               var iter_call = new CCodeFunctionCall (new CCodeIdentifier ("dbus_message_iter_open_container"));
+               iter_call.add_argument (new CCodeUnaryExpression (CCodeUnaryOperator.ADDRESS_OF, iter_expr));
+               iter_call.add_argument (new CCodeIdentifier ("DBUS_TYPE_STRUCT"));
+               iter_call.add_argument (new CCodeConstant ("NULL"));
+               iter_call.add_argument (new CCodeUnaryExpression (CCodeUnaryOperator.ADDRESS_OF, new CCodeIdentifier (subiter_name)));
+               fragment.append (new CCodeExpressionStatement (iter_call));
+
+               foreach (Field f in st.get_fields ()) {
+                       if (f.binding != MemberBinding.INSTANCE) {
+                               continue;
+                       }
+
+                       write_expression (fragment, f.field_type, new CCodeIdentifier (subiter_name), new CCodeMemberAccess (struct_expr, f.get_cname ()));
+               }
+
+               iter_call = new CCodeFunctionCall (new CCodeIdentifier ("dbus_message_iter_close_container"));
+               iter_call.add_argument (new CCodeUnaryExpression (CCodeUnaryOperator.ADDRESS_OF, iter_expr));
+               iter_call.add_argument (new CCodeUnaryExpression (CCodeUnaryOperator.ADDRESS_OF, new CCodeIdentifier (subiter_name)));
+               fragment.append (new CCodeExpressionStatement (iter_call));
+       }
+
        public void write_expression (CCodeFragment fragment, DataType type, CCodeExpression iter_expr, CCodeExpression expr) {
                BasicTypeInfo basic_type;
                if (get_basic_type_info (type.get_type_signature (), out basic_type)) {
                        write_basic (fragment, basic_type, iter_expr, expr);
                } else if (type is ArrayType) {
                        write_array (fragment, (ArrayType) type, iter_expr, expr);
+               } else if (type.data_type is Struct) {
+                       write_struct (fragment, (Struct) type.data_type, iter_expr, expr);
                } else {
                        Report.error (type.source_reference, "D-Bus serialization of type `%s' is not supported".printf (type.to_string ()));
                }