[vala/gdbus: 1/11] D-Bus: Use lowlevel message API for method calls in GDBus clients
- From: Jürg Billeter <juergbi src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [vala/gdbus: 1/11] D-Bus: Use lowlevel message API for method calls in GDBus clients
- Date: Fri, 22 Oct 2010 11:09:00 +0000 (UTC)
commit df2f82d83b8c94e26e2c1e9f7026f9e2529954e4
Author: Jürg Billeter <j bitron ch>
Date: Mon Oct 18 14:44:42 2010 +0200
D-Bus: Use lowlevel message API for method calls in GDBus clients
This will be required for file descriptor passing.
codegen/valagdbusclientmodule.vala | 244 +++++++++++++++++++++---------------
1 files changed, 143 insertions(+), 101 deletions(-)
---
diff --git a/codegen/valagdbusclientmodule.vala b/codegen/valagdbusclientmodule.vala
index 120fe24..2519135 100644
--- a/codegen/valagdbusclientmodule.vala
+++ b/codegen/valagdbusclientmodule.vala
@@ -415,7 +415,37 @@ public class Vala.GDBusClientModule : GDBusModule {
}
void generate_marshalling (Method m, CallType call_type, string? iface_name, string? method_name) {
+ var connection = new CCodeFunctionCall (new CCodeIdentifier ("g_dbus_proxy_get_connection"));
+ connection.add_argument (new CCodeIdentifier ("self"));
+
if (call_type != CallType.FINISH) {
+ var destination = new CCodeFunctionCall (new CCodeIdentifier ("g_dbus_proxy_get_name"));
+ destination.add_argument (new CCodeIdentifier ("self"));
+
+ var interface_name = new CCodeFunctionCall (new CCodeIdentifier ("g_dbus_proxy_get_interface_name"));
+ interface_name.add_argument (new CCodeIdentifier ("self"));
+
+ var object_path = new CCodeFunctionCall (new CCodeIdentifier ("g_dbus_proxy_get_object_path"));
+ object_path.add_argument (new CCodeIdentifier ("self"));
+
+ var timeout = new CCodeFunctionCall (new CCodeIdentifier ("g_dbus_proxy_get_default_timeout"));
+ timeout.add_argument (new CCodeIdentifier ("self"));
+
+ // build D-Bus message
+
+ ccode.add_declaration ("GDBusMessage", new CCodeVariableDeclarator ("*_message"));
+
+ var ccall = new CCodeFunctionCall (new CCodeIdentifier ("g_dbus_message_new_method_call"));
+ ccall.add_argument (destination);
+ ccall.add_argument (object_path);
+ if (iface_name != null) {
+ ccall.add_argument (new CCodeConstant ("\"%s\"".printf (iface_name)));
+ } else {
+ ccall.add_argument (interface_name);
+ }
+ ccall.add_argument (new CCodeConstant ("\"%s\"".printf (method_name)));
+ ccode.add_expression (new CCodeAssignment (new CCodeIdentifier ("_message"), ccall));
+
ccode.add_declaration ("GVariant", new CCodeVariableDeclarator ("*_arguments"));
ccode.add_declaration ("GVariantBuilder", new CCodeVariableDeclarator ("_arguments_builder"));
@@ -437,148 +467,160 @@ public class Vala.GDBusClientModule : GDBusModule {
var builder_end = new CCodeFunctionCall (new CCodeIdentifier ("g_variant_builder_end"));
builder_end.add_argument (new CCodeUnaryExpression (CCodeUnaryOperator.ADDRESS_OF, new CCodeIdentifier ("_arguments_builder")));
ccode.add_expression (new CCodeAssignment (new CCodeIdentifier ("_arguments"), builder_end));
- }
-
- if (call_type == CallType.SYNC) {
- var ccall = new CCodeFunctionCall (new CCodeIdentifier ("g_dbus_proxy_call_sync"));
- ccall.add_argument (new CCodeCastExpression (new CCodeIdentifier ("self"), "GDBusProxy *"));
- ccall.add_argument (new CCodeConstant ("\"%s\"".printf (method_name)));
- ccall.add_argument (new CCodeIdentifier ("_arguments"));
- ccall.add_argument (new CCodeConstant ("G_DBUS_CALL_FLAGS_NONE"));
- ccall.add_argument (get_dbus_timeout (m));
- ccall.add_argument (new CCodeConstant ("NULL"));
- ccall.add_argument (new CCodeConstant ("error"));
- ccode.add_expression (new CCodeAssignment (new CCodeIdentifier ("_reply"), ccall));
- } else if (call_type == CallType.NO_REPLY) {
- ccode.add_declaration ("GDBusMessage", new CCodeVariableDeclarator ("*_message"));
-
- var connection = new CCodeFunctionCall (new CCodeIdentifier ("g_dbus_proxy_get_connection"));
- connection.add_argument (new CCodeIdentifier ("self"));
-
- var destination = new CCodeFunctionCall (new CCodeIdentifier ("g_dbus_proxy_get_name"));
- destination.add_argument (new CCodeIdentifier ("self"));
-
- var object_path = new CCodeFunctionCall (new CCodeIdentifier ("g_dbus_proxy_get_object_path"));
- object_path.add_argument (new CCodeIdentifier ("self"));
-
- var ccall = new CCodeFunctionCall (new CCodeIdentifier ("g_dbus_message_new_method_call"));
- ccall.add_argument (destination);
- ccall.add_argument (object_path);
- ccall.add_argument (new CCodeConstant ("\"%s\"".printf (iface_name)));
- ccall.add_argument (new CCodeConstant ("\"%s\"".printf (get_dbus_name_for_member (m))));
- ccode.add_expression (new CCodeAssignment (new CCodeIdentifier ("_message"), ccall));
-
- var set_flags = new CCodeFunctionCall (new CCodeIdentifier ("g_dbus_message_set_flags"));
- set_flags.add_argument (new CCodeIdentifier ("_message"));
- set_flags.add_argument (new CCodeConstant ("G_DBUS_MESSAGE_FLAGS_NO_REPLY_EXPECTED"));
- ccode.add_expression (set_flags);
var set_body = new CCodeFunctionCall (new CCodeIdentifier ("g_dbus_message_set_body"));
set_body.add_argument (new CCodeIdentifier ("_message"));
set_body.add_argument (new CCodeIdentifier ("_arguments"));
ccode.add_expression (set_body);
- ccall = new CCodeFunctionCall (new CCodeIdentifier ("g_dbus_connection_send_message"));
- ccall.add_argument (connection);
- ccall.add_argument (new CCodeIdentifier ("_message"));
- ccall.add_argument (new CCodeConstant ("0"));
- ccall.add_argument (new CCodeConstant ("NULL"));
- ccall.add_argument (new CCodeIdentifier ("error"));
- ccode.add_expression (ccall);
+ // send D-Bus message
+
+ if (call_type == CallType.SYNC) {
+ ccall = new CCodeFunctionCall (new CCodeIdentifier ("g_dbus_connection_send_message_with_reply_sync"));
+ ccall.add_argument (connection);
+ ccall.add_argument (new CCodeIdentifier ("_message"));
+ ccall.add_argument (new CCodeConstant ("G_DBUS_SEND_MESSAGE_FLAGS_NONE"));
+ ccall.add_argument (timeout);
+ ccall.add_argument (new CCodeConstant ("NULL"));
+ ccall.add_argument (new CCodeConstant ("NULL"));
+ ccall.add_argument (new CCodeIdentifier ("error"));
+ ccode.add_expression (new CCodeAssignment (new CCodeIdentifier ("_reply_message"), ccall));
+ } else if (call_type == CallType.NO_REPLY) {
+ var set_flags = new CCodeFunctionCall (new CCodeIdentifier ("g_dbus_message_set_flags"));
+ set_flags.add_argument (new CCodeIdentifier ("_message"));
+ set_flags.add_argument (new CCodeConstant ("G_DBUS_MESSAGE_FLAGS_NO_REPLY_EXPECTED"));
+ ccode.add_expression (set_flags);
+
+ ccall = new CCodeFunctionCall (new CCodeIdentifier ("g_dbus_connection_send_message"));
+ ccall.add_argument (connection);
+ ccall.add_argument (new CCodeIdentifier ("_message"));
+ ccall.add_argument (new CCodeConstant ("G_DBUS_SEND_MESSAGE_FLAGS_NONE"));
+ ccall.add_argument (new CCodeConstant ("NULL"));
+ ccall.add_argument (new CCodeIdentifier ("error"));
+ ccode.add_expression (ccall);
+ } else if (call_type == CallType.ASYNC) {
+ ccall = new CCodeFunctionCall (new CCodeIdentifier ("g_dbus_connection_send_message_with_reply"));
+ ccall.add_argument (connection);
+ ccall.add_argument (new CCodeIdentifier ("_message"));
+ ccall.add_argument (new CCodeConstant ("G_DBUS_SEND_MESSAGE_FLAGS_NONE"));
+ ccall.add_argument (timeout);
+ ccall.add_argument (new CCodeConstant ("NULL"));
+ ccall.add_argument (new CCodeConstant ("NULL"));
+ ccall.add_argument (new CCodeIdentifier ("_callback_"));
+ ccall.add_argument (new CCodeIdentifier ("_user_data_"));
+ ccode.add_expression (ccall);
+ }
+
+ // free D-Bus message
ccall = new CCodeFunctionCall (new CCodeIdentifier ("g_object_unref"));
ccall.add_argument (new CCodeIdentifier ("_message"));
ccode.add_expression (ccall);
- } else if (call_type == CallType.ASYNC) {
- var ccall = new CCodeFunctionCall (new CCodeIdentifier ("g_dbus_proxy_call"));
- ccall.add_argument (new CCodeCastExpression (new CCodeIdentifier ("self"), "GDBusProxy *"));
- ccall.add_argument (new CCodeConstant ("\"%s\"".printf (method_name)));
- ccall.add_argument (new CCodeIdentifier ("_arguments"));
- ccall.add_argument (new CCodeConstant ("G_DBUS_CALL_FLAGS_NONE"));
- ccall.add_argument (get_dbus_timeout (m));
- ccall.add_argument (new CCodeConstant ("NULL"));
- ccall.add_argument (new CCodeIdentifier ("_callback_"));
- ccall.add_argument (new CCodeIdentifier ("_user_data_"));
- ccode.add_expression (ccall);
- } else if (call_type == CallType.FINISH) {
- var ccall = new CCodeFunctionCall (new CCodeIdentifier ("g_dbus_proxy_call_finish"));
- ccall.add_argument (new CCodeCastExpression (new CCodeIdentifier ("self"), "GDBusProxy *"));
+ } else {
+ var ccall = new CCodeFunctionCall (new CCodeIdentifier ("g_dbus_connection_send_message_with_reply_finish"));
+ ccall.add_argument (connection);
ccall.add_argument (new CCodeIdentifier ("_res_"));
ccall.add_argument (new CCodeConstant ("error"));
- ccode.add_expression (new CCodeAssignment (new CCodeIdentifier ("_reply"), ccall));
+ ccode.add_expression (new CCodeAssignment (new CCodeIdentifier ("_reply_message"), ccall));
}
if (call_type == CallType.SYNC || call_type == CallType.FINISH) {
- ccode.add_declaration ("GVariant", new CCodeVariableDeclarator ("*_reply"));
+ ccode.add_declaration ("GDBusMessage", new CCodeVariableDeclarator ("*_reply_message"));
+
+ var unref_reply = new CCodeFunctionCall (new CCodeIdentifier ("g_object_unref"));
+ unref_reply.add_argument (new CCodeIdentifier ("_reply_message"));
- // return on error
- ccode.open_if (new CCodeUnaryExpression (CCodeUnaryOperator.LOGICAL_NEGATION, new CCodeIdentifier ("_reply")));
+ // return on io error
+ var reply_is_null = new CCodeUnaryExpression (CCodeUnaryOperator.LOGICAL_NEGATION, new CCodeIdentifier ("_reply_message"));
+ ccode.open_if (reply_is_null);
return_default_value (m.return_type);
ccode.close ();
- ccode.add_declaration ("GVariantIter", new CCodeVariableDeclarator ("_reply_iter"));
+ // return on remote error
+ var ccall = new CCodeFunctionCall (new CCodeIdentifier ("g_dbus_message_to_gerror"));
+ ccall.add_argument (new CCodeIdentifier ("_reply_message"));
+ ccall.add_argument (new CCodeIdentifier ("error"));
+ ccode.open_if (ccall);
+ ccode.add_expression (unref_reply);
+ return_default_value (m.return_type);
+ ccode.close ();
- var iter_init = new CCodeFunctionCall (new CCodeIdentifier ("g_variant_iter_init"));
- iter_init.add_argument (new CCodeUnaryExpression (CCodeUnaryOperator.ADDRESS_OF, new CCodeIdentifier ("_reply_iter")));
- iter_init.add_argument (new CCodeIdentifier ("_reply"));
- ccode.add_expression (iter_init);
+ bool has_result = !(m.return_type is VoidType);
foreach (FormalParameter param in m.get_parameters ()) {
if (param.direction == ParameterDirection.OUT) {
- ccode.add_declaration (param.variable_type.get_cname (), new CCodeVariableDeclarator ("_" + param.name));
+ has_result = true;
+ }
+ }
- var array_type = param.variable_type as ArrayType;
+ if (has_result) {
+ ccode.add_declaration ("GVariant", new CCodeVariableDeclarator ("*_reply"));
+ ccode.add_declaration ("GVariantIter", new CCodeVariableDeclarator ("_reply_iter"));
- if (array_type != null) {
- for (int dim = 1; dim <= array_type.rank; dim++) {
- ccode.add_declaration ("int", new CCodeVariableDeclarator ("_%s_length%d".printf (param.name, dim), new CCodeConstant ("0")));
+ ccall = new CCodeFunctionCall (new CCodeIdentifier ("g_dbus_message_get_body"));
+ ccall.add_argument (new CCodeIdentifier ("_reply_message"));
+ ccode.add_expression (new CCodeAssignment (new CCodeIdentifier ("_reply"), ccall));
+
+ var iter_init = new CCodeFunctionCall (new CCodeIdentifier ("g_variant_iter_init"));
+ iter_init.add_argument (new CCodeUnaryExpression (CCodeUnaryOperator.ADDRESS_OF, new CCodeIdentifier ("_reply_iter")));
+ iter_init.add_argument (new CCodeIdentifier ("_reply"));
+ ccode.add_expression (iter_init);
+
+ foreach (FormalParameter param in m.get_parameters ()) {
+ if (param.direction == ParameterDirection.OUT) {
+ ccode.add_declaration (param.variable_type.get_cname (), new CCodeVariableDeclarator ("_" + param.name));
+
+ var array_type = param.variable_type as ArrayType;
+
+ if (array_type != null) {
+ for (int dim = 1; dim <= array_type.rank; dim++) {
+ ccode.add_declaration ("int", new CCodeVariableDeclarator ("_%s_length%d".printf (param.name, dim), new CCodeConstant ("0")));
+ }
}
- }
- var target = new CCodeIdentifier ("_" + param.name);
- read_expression (param.variable_type, new CCodeIdentifier ("_reply_iter"), target, param);
+ var target = new CCodeIdentifier ("_" + param.name);
+ read_expression (param.variable_type, new CCodeIdentifier ("_reply_iter"), target, param);
- // TODO check that parameter is not NULL (out parameters are optional)
- // free value if parameter is NULL
- ccode.add_expression (new CCodeAssignment (new CCodeUnaryExpression (CCodeUnaryOperator.POINTER_INDIRECTION, new CCodeIdentifier (param.name)), target));
+ // TODO check that parameter is not NULL (out parameters are optional)
+ // free value if parameter is NULL
+ ccode.add_expression (new CCodeAssignment (new CCodeUnaryExpression (CCodeUnaryOperator.POINTER_INDIRECTION, new CCodeIdentifier (param.name)), target));
- if (array_type != null) {
- for (int dim = 1; dim <= array_type.rank; dim++) {
- // TODO check that parameter is not NULL (out parameters are optional)
- ccode.add_expression (new CCodeAssignment (new CCodeUnaryExpression (CCodeUnaryOperator.POINTER_INDIRECTION, new CCodeIdentifier ("%s_length%d".printf (param.name, dim))), new CCodeIdentifier ("_%s_length%d".printf (param.name, dim))));
+ if (array_type != null) {
+ for (int dim = 1; dim <= array_type.rank; dim++) {
+ // TODO check that parameter is not NULL (out parameters are optional)
+ ccode.add_expression (new CCodeAssignment (new CCodeUnaryExpression (CCodeUnaryOperator.POINTER_INDIRECTION, new CCodeIdentifier ("%s_length%d".printf (param.name, dim))), new CCodeIdentifier ("_%s_length%d".printf (param.name, dim))));
+ }
}
}
}
- }
- if (!(m.return_type is VoidType)) {
- if (m.return_type.is_real_non_null_struct_type ()) {
- var target = new CCodeUnaryExpression (CCodeUnaryOperator.POINTER_INDIRECTION, new CCodeIdentifier ("result"));
- read_expression (m.return_type, new CCodeIdentifier ("_reply_iter"), target, m);
- } else {
- ccode.add_declaration (m.return_type.get_cname (), new CCodeVariableDeclarator ("_result"));
+ if (!(m.return_type is VoidType)) {
+ if (m.return_type.is_real_non_null_struct_type ()) {
+ var target = new CCodeUnaryExpression (CCodeUnaryOperator.POINTER_INDIRECTION, new CCodeIdentifier ("result"));
+ read_expression (m.return_type, new CCodeIdentifier ("_reply_iter"), target, m);
+ } else {
+ ccode.add_declaration (m.return_type.get_cname (), new CCodeVariableDeclarator ("_result"));
- var array_type = m.return_type as ArrayType;
+ var array_type = m.return_type as ArrayType;
- if (array_type != null) {
- for (int dim = 1; dim <= array_type.rank; dim++) {
- ccode.add_declaration ("int", new CCodeVariableDeclarator ("_result_length%d".printf (dim), new CCodeConstant ("0")));
+ if (array_type != null) {
+ for (int dim = 1; dim <= array_type.rank; dim++) {
+ ccode.add_declaration ("int", new CCodeVariableDeclarator ("_result_length%d".printf (dim), new CCodeConstant ("0")));
+ }
}
- }
- read_expression (m.return_type, new CCodeIdentifier ("_reply_iter"), new CCodeIdentifier ("_result"), m);
+ read_expression (m.return_type, new CCodeIdentifier ("_reply_iter"), new CCodeIdentifier ("_result"), m);
- if (array_type != null) {
- for (int dim = 1; dim <= array_type.rank; dim++) {
- // TODO check that parameter is not NULL (out parameters are optional)
- ccode.add_expression (new CCodeAssignment (new CCodeUnaryExpression (CCodeUnaryOperator.POINTER_INDIRECTION, new CCodeIdentifier ("result_length%d".printf (dim))), new CCodeIdentifier ("_result_length%d".printf (dim))));
+ if (array_type != null) {
+ for (int dim = 1; dim <= array_type.rank; dim++) {
+ // TODO check that parameter is not NULL (out parameters are optional)
+ ccode.add_expression (new CCodeAssignment (new CCodeUnaryExpression (CCodeUnaryOperator.POINTER_INDIRECTION, new CCodeIdentifier ("result_length%d".printf (dim))), new CCodeIdentifier ("_result_length%d".printf (dim))));
+ }
}
}
}
}
- var unref_reply = new CCodeFunctionCall (new CCodeIdentifier ("g_variant_unref"));
- unref_reply.add_argument (new CCodeIdentifier ("_reply"));
ccode.add_expression (unref_reply);
if (!(m.return_type is VoidType || m.return_type.is_real_non_null_struct_type ())) {
@@ -603,7 +645,7 @@ public class Vala.GDBusClientModule : GDBusModule {
push_function (function);
- generate_marshalling (m, no_reply ? CallType.NO_REPLY : CallType.SYNC, dbus_iface_name, "%s.%s".printf (dbus_iface_name, get_dbus_name_for_member (m)));
+ generate_marshalling (m, no_reply ? CallType.NO_REPLY : CallType.SYNC, dbus_iface_name, get_dbus_name_for_member (m));
pop_function ();
@@ -630,7 +672,7 @@ public class Vala.GDBusClientModule : GDBusModule {
push_function (function);
- generate_marshalling (m, CallType.ASYNC, dbus_iface_name, "%s.%s".printf (dbus_iface_name, get_dbus_name_for_member (m)));
+ generate_marshalling (m, CallType.ASYNC, dbus_iface_name, get_dbus_name_for_member (m));
pop_function ();
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]