diff options
author | Jürg Billeter <j@bitron.ch> | 2010-10-18 18:37:52 +0200 |
---|---|---|
committer | Jürg Billeter <j@bitron.ch> | 2010-10-23 18:11:47 +0200 |
commit | 4584bde2e8c07e823b261a97b5cc3b37260a4bd4 (patch) | |
tree | 1e2e12906817757f771990b1f6ed74d5b58668ad /codegen/valagdbusservermodule.vala | |
parent | 12b44a8b138a3d5d4e9d179fc4e9229cebb8c1e7 (diff) | |
download | vala-4584bde2e8c07e823b261a97b5cc3b37260a4bd4.tar.gz |
D-Bus: Add support for sending file descriptors with GDBus
Diffstat (limited to 'codegen/valagdbusservermodule.vala')
-rw-r--r-- | codegen/valagdbusservermodule.vala | 20 |
1 files changed, 17 insertions, 3 deletions
diff --git a/codegen/valagdbusservermodule.vala b/codegen/valagdbusservermodule.vala index 754204d53..fff2f260c 100644 --- a/codegen/valagdbusservermodule.vala +++ b/codegen/valagdbusservermodule.vala @@ -74,6 +74,8 @@ public class Vala.GDBusServerModule : GDBusClientModule { push_function (function); + cfile.add_include ("gio/gunixfdlist.h"); + if (ready) { ccode.add_declaration ("GDBusMethodInvocation *", new CCodeVariableDeclarator ("invocation", new CCodeIdentifier ("_user_data_"))); } @@ -229,6 +231,9 @@ public class Vala.GDBusServerModule : GDBusClientModule { builder_init.add_argument (new CCodeIdentifier ("G_VARIANT_TYPE_TUPLE")); ccode.add_expression (builder_init); + ccode.add_declaration ("GUnixFDList", new CCodeVariableDeclarator ("*_fd_list")); + ccode.add_expression (new CCodeAssignment (new CCodeIdentifier ("_fd_list"), new CCodeFunctionCall (new CCodeIdentifier ("g_unix_fd_list_new")))); + foreach (FormalParameter param in m.get_parameters ()) { if (param.direction != ParameterDirection.OUT) { continue; @@ -248,14 +253,14 @@ public class Vala.GDBusServerModule : GDBusClientModule { } } - write_expression (param.variable_type, new CCodeIdentifier ("_reply_builder"), new CCodeIdentifier (param.name), param); + send_dbus_value (param.variable_type, new CCodeIdentifier ("_reply_builder"), new CCodeIdentifier (param.name), param); } if (!(m.return_type is VoidType)) { if (m.return_type.is_real_non_null_struct_type ()) { ccode.add_declaration (m.return_type.get_cname (), new CCodeVariableDeclarator.zero ("result", default_value_for_type (m.return_type, true))); - write_expression (m.return_type, new CCodeIdentifier ("_reply_builder"), new CCodeIdentifier ("result"), m); + send_dbus_value (m.return_type, new CCodeIdentifier ("_reply_builder"), new CCodeIdentifier ("result"), m); if (requires_destroy (m.return_type)) { // keep local alive (symbol_reference is weak) @@ -280,7 +285,7 @@ public class Vala.GDBusServerModule : GDBusClientModule { } } - write_expression (m.return_type, new CCodeIdentifier ("_reply_builder"), new CCodeIdentifier ("result"), m); + send_dbus_value (m.return_type, new CCodeIdentifier ("_reply_builder"), new CCodeIdentifier ("result"), m); if (requires_destroy (m.return_type)) { // keep local alive (symbol_reference is weak) @@ -304,6 +309,15 @@ public class Vala.GDBusServerModule : GDBusClientModule { set_body.add_argument (new CCodeIdentifier ("_reply_message")); set_body.add_argument (new CCodeIdentifier ("_reply")); ccode.add_expression (set_body); + + ccall = new CCodeFunctionCall (new CCodeIdentifier ("g_dbus_message_set_unix_fd_list")); + ccall.add_argument (new CCodeIdentifier ("_reply_message")); + ccall.add_argument (new CCodeIdentifier ("_fd_list")); + ccode.add_expression (ccall); + + ccall = new CCodeFunctionCall (new CCodeIdentifier ("g_object_unref")); + ccall.add_argument (new CCodeIdentifier ("_fd_list")); + ccode.add_expression (ccall); } else { ccode.add_expression (ccall); } |