}
CCodeExpression deserialize_array (ArrayType array_type, CCodeExpression variant_expr, CCodeExpression? expr) {
+ if (array_type.rank == 1 && get_type_signature (array_type) == "ay") {
+ return deserialize_buffer_array (array_type, variant_expr, expr);
+ }
+
string temp_name = "_tmp%d_".printf (next_temp_var_id++);
var new_call = new CCodeFunctionCall (new CCodeIdentifier ("g_new"));
}
}
+ CCodeExpression deserialize_buffer_array (ArrayType array_type, CCodeExpression variant_expr, CCodeExpression? expr) {
+ string temp_name = "_tmp%d_".printf (next_temp_var_id++);
+
+ var get_data_call = new CCodeFunctionCall (new CCodeIdentifier ("g_variant_get_data"));
+ get_data_call.add_argument (variant_expr);
+
+ var get_size_call = new CCodeFunctionCall (new CCodeIdentifier ("g_variant_get_size"));
+ get_size_call.add_argument (variant_expr);
+ ccode.add_declaration ("gsize", new CCodeVariableDeclarator (temp_name + "_length", get_size_call));
+ var length = new CCodeIdentifier (temp_name + "_length");
+
+ var dup_call = new CCodeFunctionCall (new CCodeIdentifier ("g_memdup"));
+ dup_call.add_argument (get_data_call);
+ dup_call.add_argument (length);
+
+ ccode.add_declaration (get_ccode_name (array_type), new CCodeVariableDeclarator (temp_name, dup_call));
+ if (expr != null) {
+ ccode.add_assignment (get_array_length (expr, 1), length);
+ }
+
+ return new CCodeIdentifier (temp_name);
+ }
+
CCodeExpression? deserialize_struct (Struct st, CCodeExpression variant_expr) {
string temp_name = "_tmp%d_".printf (next_temp_var_id++);
string subiter_name = "_tmp%d_".printf (next_temp_var_id++);
}
CCodeExpression? serialize_array (ArrayType array_type, CCodeExpression array_expr) {
+ if (array_type.rank == 1 && get_type_signature (array_type) == "ay") {
+ return serialize_buffer_array (array_type, array_expr);
+ }
+
string array_iter_name = "_tmp%d_".printf (next_temp_var_id++);
ccode.add_declaration (get_ccode_name (array_type), new CCodeVariableDeclarator (array_iter_name));
return builder_end;
}
+ CCodeExpression serialize_buffer_array (ArrayType array_type, CCodeExpression array_expr) {
+ string buffer_name = "_tmp%d_".printf (next_temp_var_id++);
+
+ var gvariant_type = new CCodeFunctionCall (new CCodeIdentifier ("G_VARIANT_TYPE"));
+ gvariant_type.add_argument (new CCodeConstant ("\"%s\"".printf (get_type_signature (array_type))));
+
+ var dup_call = new CCodeFunctionCall (new CCodeIdentifier ("g_memdup"));
+ dup_call.add_argument (array_expr);
+ dup_call.add_argument (get_array_length (array_expr, 1));
+ ccode.add_declaration (get_ccode_name (array_type), new CCodeVariableDeclarator (buffer_name, dup_call));
+
+ var new_call = new CCodeFunctionCall (new CCodeIdentifier ("g_variant_new_from_data"));
+ new_call.add_argument (gvariant_type);
+ new_call.add_argument (new CCodeIdentifier (buffer_name));
+ new_call.add_argument (get_array_length (array_expr, 1));
+ new_call.add_argument (new CCodeConstant ("TRUE"));
+ new_call.add_argument (new CCodeIdentifier ("g_free"));
+ new_call.add_argument (new CCodeIdentifier (buffer_name));
+
+ return new_call;
+ }
+
CCodeExpression? serialize_struct (Struct st, CCodeExpression struct_expr) {
string builder_name = "_tmp%d_".printf (next_temp_var_id++);