vala r2054 - in trunk: . gobject
- From: juergbi svn gnome org
- To: svn-commits-list gnome org
- Subject: vala r2054 - in trunk: . gobject
- Date: Fri, 21 Nov 2008 19:44:47 +0000 (UTC)
Author: juergbi
Date: Fri Nov 21 19:44:47 2008
New Revision: 2054
URL: http://svn.gnome.org/viewvc/vala?rev=2054&view=rev
Log:
2008-11-21 JÃrg Billeter <j bitron ch>
* gobject/valadbusmodule.vala:
Support serialization and deserialization of GHashTable objects
in static D-Bus clients
Modified:
trunk/ChangeLog
trunk/gobject/valadbusmodule.vala
Modified: trunk/gobject/valadbusmodule.vala
==============================================================================
--- trunk/gobject/valadbusmodule.vala (original)
+++ trunk/gobject/valadbusmodule.vala Fri Nov 21 19:44:47 2008
@@ -240,6 +240,95 @@
return new CCodeIdentifier (temp_name);
}
+ CCodeExpression read_hash_table (CCodeFragment fragment, ObjectType type, CCodeExpression iter_expr) {
+ string temp_name = "_tmp%d".printf (next_temp_var_id++);
+ string subiter_name = "_tmp%d".printf (next_temp_var_id++);
+ string entryiter_name = "_tmp%d".printf (next_temp_var_id++);
+
+ var type_args = type.get_type_arguments ();
+ assert (type_args.size == 2);
+ var key_type = type_args.get (0);
+ var value_type = type_args.get (1);
+
+ var cdecl = new CCodeDeclaration ("GHashTable*");
+ cdecl.add_declarator (new CCodeVariableDeclarator (temp_name));
+ fragment.append (cdecl);
+
+ cdecl = new CCodeDeclaration ("DBusMessageIter");
+ cdecl.add_declarator (new CCodeVariableDeclarator (subiter_name));
+ fragment.append (cdecl);
+
+ cdecl = new CCodeDeclaration ("DBusMessageIter");
+ cdecl.add_declarator (new CCodeVariableDeclarator (entryiter_name));
+ fragment.append (cdecl);
+
+ var hash_table_new = new CCodeFunctionCall (new CCodeIdentifier ("g_hash_table_new_full"));
+ if (key_type.data_type == string_type.data_type) {
+ hash_table_new.add_argument (new CCodeIdentifier ("g_str_hash"));
+ hash_table_new.add_argument (new CCodeIdentifier ("g_str_equal"));
+ } else {
+ hash_table_new.add_argument (new CCodeIdentifier ("g_direct_hash"));
+ hash_table_new.add_argument (new CCodeIdentifier ("g_direct_equal"));
+ }
+ if (key_type.data_type == string_type.data_type) {
+ hash_table_new.add_argument (new CCodeIdentifier ("g_free"));
+ } else {
+ hash_table_new.add_argument (new CCodeIdentifier ("NULL"));
+ }
+ if (value_type.data_type == string_type.data_type) {
+ hash_table_new.add_argument (new CCodeIdentifier ("g_free"));
+ } else {
+ hash_table_new.add_argument (new CCodeIdentifier ("NULL"));
+ }
+ fragment.append (new CCodeExpressionStatement (new CCodeAssignment (new CCodeIdentifier (temp_name), hash_table_new)));
+
+ 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));
+
+ iter_call = new CCodeFunctionCall (new CCodeIdentifier ("dbus_message_iter_get_arg_type"));
+ iter_call.add_argument (new CCodeUnaryExpression (CCodeUnaryOperator.ADDRESS_OF, new CCodeIdentifier (subiter_name)));
+
+ var cwhileblock = new CCodeBlock ();
+ var cwhilefragment = new CCodeFragment ();
+ cwhileblock.add_statement (cwhilefragment);
+ var cwhile = new CCodeWhileStatement (iter_call, cwhileblock);
+
+ iter_call = new CCodeFunctionCall (new CCodeIdentifier ("dbus_message_iter_recurse"));
+ iter_call.add_argument (new CCodeUnaryExpression (CCodeUnaryOperator.ADDRESS_OF, new CCodeIdentifier (subiter_name)));
+ iter_call.add_argument (new CCodeUnaryExpression (CCodeUnaryOperator.ADDRESS_OF, new CCodeIdentifier (entryiter_name)));
+ cwhilefragment.append (new CCodeExpressionStatement (iter_call));
+
+ cdecl = new CCodeDeclaration (key_type.get_cname ());
+ cdecl.add_declarator (new CCodeVariableDeclarator ("_key"));
+ cwhilefragment.append (cdecl);
+
+ cdecl = new CCodeDeclaration (value_type.get_cname ());
+ cdecl.add_declarator (new CCodeVariableDeclarator ("_value"));
+ cwhilefragment.append (cdecl);
+
+ var key_expr = read_expression (cwhilefragment, key_type, new CCodeIdentifier (entryiter_name), null);
+ cwhilefragment.append (new CCodeExpressionStatement (new CCodeAssignment (new CCodeIdentifier ("_key"), key_expr)));
+
+ var value_expr = read_expression (cwhilefragment, value_type, new CCodeIdentifier (entryiter_name), null);
+ cwhilefragment.append (new CCodeExpressionStatement (new CCodeAssignment (new CCodeIdentifier ("_value"), value_expr)));
+
+ var hash_table_insert = new CCodeFunctionCall (new CCodeIdentifier ("g_hash_table_insert"));
+ hash_table_insert.add_argument (new CCodeIdentifier (temp_name));
+ hash_table_insert.add_argument (convert_to_generic_pointer (new CCodeIdentifier ("_key"), key_type));
+ hash_table_insert.add_argument (convert_to_generic_pointer (new CCodeIdentifier ("_value"), value_type));
+ cwhilefragment.append (new CCodeExpressionStatement (hash_table_insert));
+
+ iter_call = new CCodeFunctionCall (new CCodeIdentifier ("dbus_message_iter_next"));
+ iter_call.add_argument (new CCodeUnaryExpression (CCodeUnaryOperator.ADDRESS_OF, new CCodeIdentifier (subiter_name)));
+ cwhilefragment.append (new CCodeExpressionStatement (iter_call));
+
+ fragment.append (cwhile);
+
+ return new CCodeIdentifier (temp_name);
+ }
+
public CCodeExpression? read_expression (CCodeFragment fragment, DataType type, CCodeExpression iter_expr, CCodeExpression? expr) {
BasicTypeInfo basic_type;
CCodeExpression result = null;
@@ -253,6 +342,10 @@
} else {
result = read_struct (fragment, (Struct) type.data_type, iter_expr);
}
+ } else if (type is ObjectType) {
+ if (type.data_type.get_full_name () == "GLib.HashTable") {
+ result = read_hash_table (fragment, (ObjectType) type, iter_expr);
+ }
} else {
Report.error (type.source_reference, "D-Bus deserialization of type `%s' is not supported".printf (type.to_string ()));
return null;
@@ -395,6 +488,88 @@
}
}
+ void write_hash_table (CCodeFragment fragment, ObjectType type, CCodeExpression iter_expr, CCodeExpression hash_table_expr) {
+ string subiter_name = "_tmp%d".printf (next_temp_var_id++);
+ string entryiter_name = "_tmp%d".printf (next_temp_var_id++);
+ string tableiter_name = "_tmp%d".printf (next_temp_var_id++);
+ string key_name = "_tmp%d".printf (next_temp_var_id++);
+ string value_name = "_tmp%d".printf (next_temp_var_id++);
+
+ var type_args = type.get_type_arguments ();
+ assert (type_args.size == 2);
+ var key_type = type_args.get (0);
+ var value_type = type_args.get (1);
+
+ 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_ARRAY"));
+ iter_call.add_argument (new CCodeConstant ("\"{%s%s}\"".printf (key_type.get_type_signature (), value_type.get_type_signature ())));
+ iter_call.add_argument (new CCodeUnaryExpression (CCodeUnaryOperator.ADDRESS_OF, new CCodeIdentifier (subiter_name)));
+ fragment.append (new CCodeExpressionStatement (iter_call));
+
+ var cdecl = new CCodeDeclaration ("DBusMessageIter");
+ cdecl.add_declarator (new CCodeVariableDeclarator (subiter_name));
+ cdecl.add_declarator (new CCodeVariableDeclarator (entryiter_name));
+ fragment.append (cdecl);
+
+ cdecl = new CCodeDeclaration ("GHashTableIter");
+ cdecl.add_declarator (new CCodeVariableDeclarator (tableiter_name));
+ fragment.append (cdecl);
+
+ cdecl = new CCodeDeclaration ("gpointer");
+ cdecl.add_declarator (new CCodeVariableDeclarator (key_name));
+ cdecl.add_declarator (new CCodeVariableDeclarator (value_name));
+ fragment.append (cdecl);
+
+ var iter_init_call = new CCodeFunctionCall (new CCodeIdentifier ("g_hash_table_iter_init"));
+ iter_init_call.add_argument (new CCodeUnaryExpression (CCodeUnaryOperator.ADDRESS_OF, new CCodeIdentifier (tableiter_name)));
+ iter_init_call.add_argument (hash_table_expr);
+ fragment.append (new CCodeExpressionStatement (iter_init_call));
+
+ var iter_next_call = new CCodeFunctionCall (new CCodeIdentifier ("g_hash_table_iter_next"));
+ iter_next_call.add_argument (new CCodeUnaryExpression (CCodeUnaryOperator.ADDRESS_OF, new CCodeIdentifier (tableiter_name)));
+ iter_next_call.add_argument (new CCodeUnaryExpression (CCodeUnaryOperator.ADDRESS_OF, new CCodeIdentifier (key_name)));
+ iter_next_call.add_argument (new CCodeUnaryExpression (CCodeUnaryOperator.ADDRESS_OF, new CCodeIdentifier (value_name)));
+
+ var cwhileblock = new CCodeBlock ();
+ var cwhilefragment = new CCodeFragment ();
+ cwhileblock.add_statement (cwhilefragment);
+ var cwhile = new CCodeWhileStatement (iter_next_call, cwhileblock);
+
+ cdecl = new CCodeDeclaration (key_type.get_cname ());
+ cdecl.add_declarator (new CCodeVariableDeclarator ("_key"));
+ cwhilefragment.append (cdecl);
+
+ cdecl = new CCodeDeclaration (value_type.get_cname ());
+ cdecl.add_declarator (new CCodeVariableDeclarator ("_value"));
+ cwhilefragment.append (cdecl);
+
+ iter_call = new CCodeFunctionCall (new CCodeIdentifier ("dbus_message_iter_open_container"));
+ iter_call.add_argument (new CCodeUnaryExpression (CCodeUnaryOperator.ADDRESS_OF, new CCodeIdentifier (subiter_name)));
+ iter_call.add_argument (new CCodeIdentifier ("DBUS_TYPE_DICT_ENTRY"));
+ iter_call.add_argument (new CCodeConstant ("NULL"));
+ iter_call.add_argument (new CCodeUnaryExpression (CCodeUnaryOperator.ADDRESS_OF, new CCodeIdentifier (entryiter_name)));
+ cwhilefragment.append (new CCodeExpressionStatement (iter_call));
+
+ cwhilefragment.append (new CCodeExpressionStatement (new CCodeAssignment (new CCodeIdentifier ("_key"), convert_from_generic_pointer (new CCodeIdentifier (key_name), key_type))));
+ cwhilefragment.append (new CCodeExpressionStatement (new CCodeAssignment (new CCodeIdentifier ("_value"), convert_from_generic_pointer (new CCodeIdentifier (value_name), value_type))));
+
+ write_expression (cwhilefragment, key_type, new CCodeIdentifier (entryiter_name), new CCodeIdentifier ("_key"));
+ write_expression (cwhilefragment, value_type, new CCodeIdentifier (entryiter_name), new CCodeIdentifier ("_value"));
+
+ iter_call = new CCodeFunctionCall (new CCodeIdentifier ("dbus_message_iter_close_container"));
+ iter_call.add_argument (new CCodeUnaryExpression (CCodeUnaryOperator.ADDRESS_OF, new CCodeIdentifier (subiter_name)));
+ iter_call.add_argument (new CCodeUnaryExpression (CCodeUnaryOperator.ADDRESS_OF, new CCodeIdentifier (entryiter_name)));
+ cwhilefragment.append (new CCodeExpressionStatement (iter_call));
+
+ fragment.append (cwhile);
+
+ 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)) {
@@ -407,6 +582,10 @@
} else {
write_struct (fragment, (Struct) type.data_type, iter_expr, expr);
}
+ } else if (type is ObjectType) {
+ if (type.data_type.get_full_name () == "GLib.HashTable") {
+ write_hash_table (fragment, (ObjectType) type, iter_expr, expr);
+ }
} else {
Report.error (type.source_reference, "D-Bus serialization of type `%s' is not supported".printf (type.to_string ()));
}
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]