]> git.ipfire.org Git - thirdparty/vala.git/commitdiff
gdbus: Allow DBusConnection and DBusMethodInvocation parameters
authorSergey Bugaev <bugaevc@gmail.com>
Thu, 12 Jun 2025 14:34:47 +0000 (17:34 +0300)
committerRico Tzschichholz <ricotz@ubuntu.com>
Sat, 16 May 2026 11:49:26 +0000 (13:49 +0200)
This is a way for the server implementation to get hold of the
connection that the current method is being invoked on (which may be
important if it's exported on multiple connections, or just to avoid
global variables), for instance to export other objects, or make proxy
calls, on this connection. A full DBusMethodInvocation object can also
be requested in the same way.

Suggested-by: Ivan Molodetskikh <yalterz@gmail.com>
codegen/valagdbusclientmodule.vala
codegen/valagdbusmodule.vala
codegen/valagdbusservermodule.vala
tests/Makefile.am
tests/dbus/special-parameters-1.c-expected [new file with mode: 0644]
tests/dbus/special-parameters-1.vala [new file with mode: 0644]
tests/dbus/special-parameters-2.test [new file with mode: 0644]
tests/dbus/special-parameters-2_client.c-expected [new file with mode: 0644]
tests/dbus/special-parameters-2_server.c-expected [new file with mode: 0644]

index cb63f8ec3ad32ab5c176dda7f38c3b6415ea6af1..fda3e0ecf3942f43b778ec5d197d7a5637466515 100644 (file)
@@ -620,14 +620,18 @@ public class Vala.GDBusClientModule : GDBusModule {
                                                expr = new CCodeUnaryExpression (CCodeUnaryOperator.POINTER_INDIRECTION, expr);
                                        }
 
-                                       if (param.variable_type is ObjectType && param.variable_type.type_symbol.get_full_name () == "GLib.Cancellable") {
-                                               cancellable = expr;
-                                               continue;
-                                       }
-
-                                       if (param.variable_type is ObjectType && param.variable_type.type_symbol.get_full_name () == "GLib.BusName") {
-                                               // ignore BusName sender parameters
-                                               continue;
+                                       if (param.variable_type is ObjectType) {
+                                               var full_name = param.variable_type.type_symbol.get_full_name ();
+                                               switch (full_name) {
+                                               case "GLib.Cancellable":
+                                                       cancellable = expr;
+                                                       continue;
+                                               case "GLib.BusName":
+                                               case "GLib.DBusConnection":
+                                               case "GLib.DBusMethodInvocation":
+                                                       // Ignore.
+                                                       continue;
+                                               }
                                        }
 
                                        send_dbus_value (param.variable_type, new CCodeIdentifier ("_arguments_builder"), expr, param);
index f779934977e2d04a05f326c808c223bafff97f42..14e5afcafada4463f8a7d26d991f00278212b437 100644 (file)
@@ -271,11 +271,15 @@ public class Vala.GDBusModule : GVariantModule {
                        var out_args_info = new CCodeInitializerList ();
 
                        foreach (Parameter param in m.get_parameters ()) {
-                               if (param.variable_type is ObjectType && param.variable_type.type_symbol.get_full_name () == "GLib.Cancellable") {
-                                       continue;
-                               }
-                               if (param.variable_type is ObjectType && param.variable_type.type_symbol.get_full_name () == "GLib.BusName") {
-                                       continue;
+                               if (param.variable_type is ObjectType) {
+                                       var full_name = param.variable_type.type_symbol.get_full_name ();
+                                       switch (full_name) {
+                                       case "GLib.Cancellable":
+                                       case "GLib.BusName":
+                                       case "GLib.DBusConnection":
+                                       case "GLib.DBusMethodInvocation":
+                                               continue;
+                                       }
                                }
 
                                var info = new CCodeInitializerList ();
index 4e782e09a55bef293d57a53b8db0d07d4d89b4ae..eaaf08c120e62464d12179bb7a092694e6ce6d4c 100644 (file)
@@ -123,13 +123,16 @@ public class Vala.GDBusServerModule : GDBusClientModule {
                                        continue;
                                }
 
-                               if (param.variable_type is ObjectType && param.variable_type.type_symbol.get_full_name () == "GLib.Cancellable") {
-                                       continue;
-                               }
-
-                               if (param.variable_type is ObjectType && param.variable_type.type_symbol.get_full_name () == "GLib.BusName") {
-                                       // ignore BusName sender parameters
-                                       continue;
+                               // Skip special parameters.
+                               if (param.variable_type is ObjectType) {
+                                       var full_name = param.variable_type.type_symbol.get_full_name ();
+                                       switch (full_name) {
+                                       case "GLib.Cancellable":
+                                       case "GLib.BusName":
+                                       case "GLib.DBusConnection":
+                                       case "GLib.DBusMethodInvocation":
+                                               continue;
+                                       }
                                }
 
                                CCodeExpression param_expr;
@@ -208,17 +211,47 @@ public class Vala.GDBusServerModule : GDBusClientModule {
                        }
 
                        if (param.direction == ParameterDirection.IN && !ready) {
-                               if (param.variable_type is ObjectType && param.variable_type.type_symbol.get_full_name () == "GLib.Cancellable") {
-                                       ccall.add_argument (new CCodeConstant ("NULL"));
-                                       continue;
-                               }
-
-                               if (param.variable_type is ObjectType && param.variable_type.type_symbol.get_full_name () == "GLib.BusName") {
-                                       // ignore BusName sender parameters
-                                       var sender = new CCodeFunctionCall (new CCodeIdentifier ("g_dbus_method_invocation_get_sender"));
-                                       sender.add_argument (new CCodeIdentifier ("invocation"));
-                                       ccall.add_argument (sender);
-                                       continue;
+                               // Handle special params.
+                               if (param.variable_type is ObjectType) {
+                                       var full_name = param.variable_type.type_symbol.get_full_name ();
+                                       switch (full_name) {
+                                       case "GLib.Cancellable":
+                                               // No cancellable on the server side.
+                                               if (!param.variable_type.nullable) {
+                                                       Report.warning (param.variable_type.source_reference, "D-Bus cancellable parameters should be nullable");
+                                               }
+                                               ccall.add_argument (new CCodeConstant ("NULL"));
+                                               continue;
+                                       case "GLib.BusName":
+                                               var sender = new CCodeFunctionCall (new CCodeIdentifier ("g_dbus_method_invocation_get_sender"));
+                                               sender.add_argument (new CCodeIdentifier ("invocation"));
+                                               if (param.variable_type.value_owned) {
+                                                       var cdup = new CCodeFunctionCall (new CCodeIdentifier ("g_strdup"));
+                                                       cdup.add_argument (sender);
+                                                       sender = (owned) cdup;
+                                               }
+                                               ccall.add_argument (sender);
+                                               continue;
+                                       case "GLib.DBusConnection":
+                                               var cconn = new CCodeFunctionCall (new CCodeIdentifier ("g_dbus_method_invocation_get_connection"));
+                                               cconn.add_argument (new CCodeIdentifier ("invocation"));
+                                               if (param.variable_type.value_owned) {
+                                                       var cref = new CCodeFunctionCall (new CCodeIdentifier ("g_object_ref"));
+                                                       cref.add_argument (cconn);
+                                                       cconn = (owned) cref;
+                                               }
+                                               ccall.add_argument (cconn);
+                                               continue;
+                                       case "GLib.DBusMethodInvocation":
+                                               CCodeExpression cinvoc = new CCodeIdentifier ("invocation");
+                                               if (param.variable_type.value_owned) {
+                                                       var cref = new CCodeFunctionCall (new CCodeIdentifier ("g_object_ref"));
+                                                       cref.add_argument (cinvoc);
+                                                       cinvoc = (owned) cref;
+                                               }
+                                               ccall.add_argument (cinvoc);
+                                               continue;
+                                       }
                                }
 
                                unowned Struct? st = param.variable_type.type_symbol as Struct;
@@ -431,13 +464,16 @@ public class Vala.GDBusServerModule : GDBusClientModule {
                foreach (Parameter param in m.get_parameters ()) {
                        if ((param.direction == ParameterDirection.IN && (ready_data_expr == null || ready)) ||
                            (param.direction == ParameterDirection.OUT && !no_reply && (!m.coroutine || ready))) {
-                               if (param.variable_type is ObjectType && param.variable_type.type_symbol.get_full_name () == "GLib.Cancellable") {
-                                       continue;
-                               }
 
-                               if (param.variable_type is ObjectType && param.variable_type.type_symbol.get_full_name () == "GLib.BusName") {
-                                       // ignore BusName sender parameters
-                                       continue;
+                               if (param.variable_type is ObjectType) {
+                                       var full_name = param.variable_type.type_symbol.get_full_name ();
+                                       switch (full_name) {
+                                       case "GLib.Cancellable":
+                                       case "GLib.BusName":
+                                       case "GLib.DBusConnection":
+                                       case "GLib.DBusMethodInvocation":
+                                               continue;
+                                       }
                                }
 
                                var owned_type = param.variable_type.copy ();
index e70c7c3a03c266f994d420c154cbcc5f50ed1355..9275a270c5d623c3adc7429f036b340ebf53641f 100644 (file)
@@ -878,6 +878,8 @@ TESTS = \
        dbus/generics.test \
        dbus/no-reply.test \
        dbus/signals.test \
+       dbus/special-parameters-1.vala \
+       dbus/special-parameters-2.test \
        dbus/filedescriptor.test \
        dbus/filedescriptor-async.test \
        dbus/filedescriptor-errors.test \
diff --git a/tests/dbus/special-parameters-1.c-expected b/tests/dbus/special-parameters-1.c-expected
new file mode 100644 (file)
index 0000000..26789d7
--- /dev/null
@@ -0,0 +1,912 @@
+/* dbus_special_parameters_1.c generated by valac, the Vala compiler
+ * generated from dbus_special_parameters_1.vala, do not modify */
+
+#include <glib-object.h>
+#include <gio/gio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <glib.h>
+
+#if !defined(VALA_STRICT_C)
+#if !defined(__clang__) && defined(__GNUC__) && (__GNUC__ >= 14)
+#pragma GCC diagnostic warning "-Wincompatible-pointer-types"
+#elif defined(__clang__) && (__clang_major__ >= 16)
+#pragma clang diagnostic ignored "-Wincompatible-function-pointer-types"
+#pragma clang diagnostic ignored "-Wincompatible-pointer-types"
+#endif
+#endif
+#if !defined(VALA_EXTERN)
+#if defined(_WIN32) || defined(__CYGWIN__)
+#define VALA_EXTERN __declspec(dllexport) extern
+#elif __GNUC__ >= 4
+#define VALA_EXTERN __attribute__((visibility("default"))) extern
+#else
+#define VALA_EXTERN extern
+#endif
+#endif
+
+#define TYPE_SERVER (server_get_type ())
+#define SERVER(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), TYPE_SERVER, Server))
+#define SERVER_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), TYPE_SERVER, ServerClass))
+#define IS_SERVER(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), TYPE_SERVER))
+#define IS_SERVER_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), TYPE_SERVER))
+#define SERVER_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), TYPE_SERVER, ServerClass))
+
+typedef struct _Server Server;
+typedef struct _ServerClass ServerClass;
+typedef struct _ServerPrivate ServerPrivate;
+enum  {
+       SERVER_0_PROPERTY,
+       SERVER_NUM_PROPERTIES
+};
+static GParamSpec* server_properties[SERVER_NUM_PROPERTIES];
+#define _g_free0(var) (var = (g_free (var), NULL))
+#define _g_object_unref0(var) ((var == NULL) ? NULL : (var = (g_object_unref (var), NULL)))
+typedef struct _ServerAsyncMethodData ServerAsyncMethodData;
+typedef struct _ServerAsyncMethodReadyData ServerAsyncMethodReadyData;
+
+#define TYPE_PROXY (proxy_get_type ())
+#define PROXY(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), TYPE_PROXY, Proxy))
+#define IS_PROXY(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), TYPE_PROXY))
+#define PROXY_GET_INTERFACE(obj) (G_TYPE_INSTANCE_GET_INTERFACE ((obj), TYPE_PROXY, ProxyIface))
+
+typedef struct _Proxy Proxy;
+typedef struct _ProxyIface ProxyIface;
+
+#define TYPE_PROXY_PROXY (proxy_proxy_get_type ())
+typedef GDBusProxy ProxyProxy;
+typedef GDBusProxyClass ProxyProxyClass;
+typedef struct _ProxyAsyncMethodReadyData ProxyAsyncMethodReadyData;
+
+struct _Server {
+       GObject parent_instance;
+       ServerPrivate * priv;
+};
+
+struct _ServerClass {
+       GObjectClass parent_class;
+};
+
+struct _ServerAsyncMethodData {
+       int _state_;
+       GObject* _source_object_;
+       GAsyncResult* _res_;
+       GTask* _async_result;
+       Server* self;
+       char* sender;
+       GCancellable* cancellable;
+       GDBusConnection* conn;
+       GDBusMethodInvocation* inv;
+       gint arg;
+};
+
+struct _ServerAsyncMethodReadyData {
+       GDBusMethodInvocation* _invocation_;
+       gint arg;
+};
+
+struct _ProxyIface {
+       GTypeInterface parent_iface;
+       void (*sync_method) (Proxy* self, const char* sender, GCancellable* cancellable, GDBusConnection* conn, GDBusMethodInvocation* inv, gint arg, GError** error);
+       void (*async_method) (Proxy* self, const char* sender, GCancellable* cancellable, GDBusConnection* conn, GDBusMethodInvocation* inv, gint arg, GAsyncReadyCallback _callback_, gpointer _user_data_);
+       void (*async_method_finish) (Proxy* self, GAsyncResult* _res_, GError** error);
+};
+
+struct _ProxyAsyncMethodReadyData {
+       GDBusMethodInvocation* _invocation_;
+       gint arg;
+};
+
+static gpointer server_parent_class = NULL;
+
+VALA_EXTERN GType server_get_type (void) G_GNUC_CONST ;
+G_DEFINE_AUTOPTR_CLEANUP_FUNC (Server, g_object_unref)
+VALA_EXTERN guint server_register_object (void* object,
+                              GDBusConnection* connection,
+                              const gchar* path,
+                              GError** error);
+VALA_EXTERN void server_sync_method (Server* self,
+                         const char* sender,
+                         GCancellable* cancellable,
+                         GDBusConnection* conn,
+                         GDBusMethodInvocation* inv,
+                         gint arg,
+                         GError** error);
+static void server_async_method_data_free (gpointer _data);
+VALA_EXTERN void server_async_method (Server* self,
+                          const char* sender,
+                          GCancellable* cancellable,
+                          GDBusConnection* conn,
+                          GDBusMethodInvocation* inv,
+                          gint arg,
+                          GAsyncReadyCallback _callback_,
+                          gpointer _user_data_);
+VALA_EXTERN void server_async_method_finish (Server* self,
+                                 GAsyncResult* _res_,
+                                 GError** error);
+static gboolean server_async_method_co (ServerAsyncMethodData* _data_);
+VALA_EXTERN Server* server_new (void);
+VALA_EXTERN Server* server_construct (GType object_type);
+static GType server_get_type_once (void);
+static void _dbus_server_sync_method (Server* self,
+                               GVariant* _parameters_,
+                               GDBusMethodInvocation* invocation);
+static void _dbus_server_async_method (Server* self,
+                                GVariant* _parameters_,
+                                GDBusMethodInvocation* invocation);
+static void _dbus_server_async_method_ready (GObject * source_object,
+                                      GAsyncResult * _res_,
+                                      gpointer _user_data_);
+static void server_dbus_interface_method_call (GDBusConnection* connection,
+                                        const gchar* sender,
+                                        const gchar* object_path,
+                                        const gchar* interface_name,
+                                        const gchar* method_name,
+                                        GVariant* parameters,
+                                        GDBusMethodInvocation* invocation,
+                                        gpointer user_data);
+static GVariant* server_dbus_interface_get_property (GDBusConnection* connection,
+                                              const gchar* sender,
+                                              const gchar* object_path,
+                                              const gchar* interface_name,
+                                              const gchar* property_name,
+                                              GError** error,
+                                              gpointer user_data);
+static gboolean server_dbus_interface_set_property (GDBusConnection* connection,
+                                             const gchar* sender,
+                                             const gchar* object_path,
+                                             const gchar* interface_name,
+                                             const gchar* property_name,
+                                             GVariant* value,
+                                             GError** error,
+                                             gpointer user_data);
+static void _server_unregister_object (gpointer user_data);
+VALA_EXTERN GType proxy_proxy_get_type (void) G_GNUC_CONST ;
+VALA_EXTERN guint proxy_register_object (void* object,
+                             GDBusConnection* connection,
+                             const gchar* path,
+                             GError** error);
+VALA_EXTERN GType proxy_get_type (void) G_GNUC_CONST ;
+G_DEFINE_AUTOPTR_CLEANUP_FUNC (Proxy, g_object_unref)
+VALA_EXTERN void proxy_sync_method (Proxy* self,
+                        const char* sender,
+                        GCancellable* cancellable,
+                        GDBusConnection* conn,
+                        GDBusMethodInvocation* inv,
+                        gint arg,
+                        GError** error);
+VALA_EXTERN void proxy_async_method (Proxy* self,
+                         const char* sender,
+                         GCancellable* cancellable,
+                         GDBusConnection* conn,
+                         GDBusMethodInvocation* inv,
+                         gint arg,
+                         GAsyncReadyCallback _callback_,
+                         gpointer _user_data_);
+VALA_EXTERN void proxy_async_method_finish (Proxy* self,
+                                GAsyncResult* _res_,
+                                GError** error);
+static GType proxy_get_type_once (void);
+static void proxy_proxy_g_signal (GDBusProxy* proxy,
+                           const gchar* sender_name,
+                           const gchar* signal_name,
+                           GVariant* parameters);
+static void proxy_proxy_sync_method (Proxy* self,
+                              const char* sender,
+                              GCancellable* cancellable,
+                              GDBusConnection* conn,
+                              GDBusMethodInvocation* inv,
+                              gint arg,
+                              GError** error);
+static void proxy_proxy_async_method_async (Proxy* self,
+                                     const char* sender,
+                                     GCancellable* cancellable,
+                                     GDBusConnection* conn,
+                                     GDBusMethodInvocation* inv,
+                                     gint arg,
+                                     GAsyncReadyCallback _callback_,
+                                     gpointer _user_data_);
+static void proxy_proxy_async_method_finish (Proxy* self,
+                                      GAsyncResult* _res_,
+                                      GError** error);
+static void proxy_proxy_proxy_interface_init (ProxyIface* iface);
+static void _dbus_proxy_sync_method (Proxy* self,
+                              GVariant* _parameters_,
+                              GDBusMethodInvocation* invocation);
+static void _dbus_proxy_async_method (Proxy* self,
+                               GVariant* _parameters_,
+                               GDBusMethodInvocation* invocation);
+static void _dbus_proxy_async_method_ready (GObject * source_object,
+                                     GAsyncResult * _res_,
+                                     gpointer _user_data_);
+static void proxy_dbus_interface_method_call (GDBusConnection* connection,
+                                       const gchar* sender,
+                                       const gchar* object_path,
+                                       const gchar* interface_name,
+                                       const gchar* method_name,
+                                       GVariant* parameters,
+                                       GDBusMethodInvocation* invocation,
+                                       gpointer user_data);
+static GVariant* proxy_dbus_interface_get_property (GDBusConnection* connection,
+                                             const gchar* sender,
+                                             const gchar* object_path,
+                                             const gchar* interface_name,
+                                             const gchar* property_name,
+                                             GError** error,
+                                             gpointer user_data);
+static gboolean proxy_dbus_interface_set_property (GDBusConnection* connection,
+                                            const gchar* sender,
+                                            const gchar* object_path,
+                                            const gchar* interface_name,
+                                            const gchar* property_name,
+                                            GVariant* value,
+                                            GError** error,
+                                            gpointer user_data);
+static void _proxy_unregister_object (gpointer user_data);
+static void _vala_main (void);
+
+static const GDBusArgInfo _server_dbus_arg_info_sync_method_arg = {-1, "arg", "i", NULL};
+static const GDBusArgInfo * const _server_dbus_arg_info_sync_method_in[] = {&_server_dbus_arg_info_sync_method_arg, NULL};
+static const GDBusArgInfo * const _server_dbus_arg_info_sync_method_out[] = {NULL};
+static const GDBusMethodInfo _server_dbus_method_info_sync_method = {-1, "SyncMethod", (GDBusArgInfo **) (&_server_dbus_arg_info_sync_method_in), (GDBusArgInfo **) (&_server_dbus_arg_info_sync_method_out), NULL};
+static const GDBusArgInfo _server_dbus_arg_info_async_method_arg = {-1, "arg", "i", NULL};
+static const GDBusArgInfo * const _server_dbus_arg_info_async_method_in[] = {&_server_dbus_arg_info_async_method_arg, NULL};
+static const GDBusArgInfo * const _server_dbus_arg_info_async_method_out[] = {NULL};
+static const GDBusMethodInfo _server_dbus_method_info_async_method = {-1, "AsyncMethod", (GDBusArgInfo **) (&_server_dbus_arg_info_async_method_in), (GDBusArgInfo **) (&_server_dbus_arg_info_async_method_out), NULL};
+static const GDBusMethodInfo * const _server_dbus_method_info[] = {&_server_dbus_method_info_sync_method, &_server_dbus_method_info_async_method, NULL};
+static const GDBusSignalInfo * const _server_dbus_signal_info[] = {NULL};
+static const GDBusPropertyInfo * const _server_dbus_property_info[] = {NULL};
+static const GDBusInterfaceInfo _server_dbus_interface_info = {-1, "org.example.Server", (GDBusMethodInfo **) (&_server_dbus_method_info), (GDBusSignalInfo **) (&_server_dbus_signal_info), (GDBusPropertyInfo **) (&_server_dbus_property_info), NULL};
+static const GDBusInterfaceVTable _server_dbus_interface_vtable = {server_dbus_interface_method_call, server_dbus_interface_get_property, server_dbus_interface_set_property};
+static const GDBusArgInfo _proxy_dbus_arg_info_sync_method_arg = {-1, "arg", "i", NULL};
+static const GDBusArgInfo * const _proxy_dbus_arg_info_sync_method_in[] = {&_proxy_dbus_arg_info_sync_method_arg, NULL};
+static const GDBusArgInfo * const _proxy_dbus_arg_info_sync_method_out[] = {NULL};
+static const GDBusMethodInfo _proxy_dbus_method_info_sync_method = {-1, "SyncMethod", (GDBusArgInfo **) (&_proxy_dbus_arg_info_sync_method_in), (GDBusArgInfo **) (&_proxy_dbus_arg_info_sync_method_out), NULL};
+static const GDBusArgInfo _proxy_dbus_arg_info_async_method_arg = {-1, "arg", "i", NULL};
+static const GDBusArgInfo * const _proxy_dbus_arg_info_async_method_in[] = {&_proxy_dbus_arg_info_async_method_arg, NULL};
+static const GDBusArgInfo * const _proxy_dbus_arg_info_async_method_out[] = {NULL};
+static const GDBusMethodInfo _proxy_dbus_method_info_async_method = {-1, "AsyncMethod", (GDBusArgInfo **) (&_proxy_dbus_arg_info_async_method_in), (GDBusArgInfo **) (&_proxy_dbus_arg_info_async_method_out), NULL};
+static const GDBusMethodInfo * const _proxy_dbus_method_info[] = {&_proxy_dbus_method_info_sync_method, &_proxy_dbus_method_info_async_method, NULL};
+static const GDBusSignalInfo * const _proxy_dbus_signal_info[] = {NULL};
+static const GDBusPropertyInfo * const _proxy_dbus_property_info[] = {NULL};
+static const GDBusInterfaceInfo _proxy_dbus_interface_info = {-1, "org.example.Server", (GDBusMethodInfo **) (&_proxy_dbus_method_info), (GDBusSignalInfo **) (&_proxy_dbus_signal_info), (GDBusPropertyInfo **) (&_proxy_dbus_property_info), NULL};
+static const GDBusInterfaceVTable _proxy_dbus_interface_vtable = {proxy_dbus_interface_method_call, proxy_dbus_interface_get_property, proxy_dbus_interface_set_property};
+
+void
+server_sync_method (Server* self,
+                    const char* sender,
+                    GCancellable* cancellable,
+                    GDBusConnection* conn,
+                    GDBusMethodInvocation* inv,
+                    gint arg,
+                    GError** error)
+{
+       g_return_if_fail (IS_SERVER (self));
+       g_return_if_fail (sender != NULL);
+       g_return_if_fail ((cancellable == NULL) || G_TYPE_CHECK_INSTANCE_TYPE (cancellable, g_cancellable_get_type ()));
+       g_return_if_fail (G_TYPE_CHECK_INSTANCE_TYPE (conn, g_dbus_connection_get_type ()));
+       g_return_if_fail (G_TYPE_CHECK_INSTANCE_TYPE (inv, g_dbus_method_invocation_get_type ()));
+}
+
+static void
+server_async_method_data_free (gpointer _data)
+{
+       ServerAsyncMethodData* _data_;
+       _data_ = _data;
+       _g_free0 (_data_->sender);
+       _g_object_unref0 (_data_->cancellable);
+       _g_object_unref0 (_data_->conn);
+       _g_object_unref0 (_data_->inv);
+       _g_object_unref0 (_data_->self);
+       g_slice_free (ServerAsyncMethodData, _data_);
+}
+
+static gpointer
+_g_object_ref0 (gpointer self)
+{
+       return self ? g_object_ref (self) : NULL;
+}
+
+void
+server_async_method (Server* self,
+                     const char* sender,
+                     GCancellable* cancellable,
+                     GDBusConnection* conn,
+                     GDBusMethodInvocation* inv,
+                     gint arg,
+                     GAsyncReadyCallback _callback_,
+                     gpointer _user_data_)
+{
+       ServerAsyncMethodData* _data_;
+       Server* _tmp0_;
+       char* _tmp1_;
+       GCancellable* _tmp2_;
+       GDBusConnection* _tmp3_;
+       GDBusMethodInvocation* _tmp4_;
+       g_return_if_fail (IS_SERVER (self));
+       g_return_if_fail (sender != NULL);
+       g_return_if_fail ((cancellable == NULL) || G_TYPE_CHECK_INSTANCE_TYPE (cancellable, g_cancellable_get_type ()));
+       g_return_if_fail (G_TYPE_CHECK_INSTANCE_TYPE (conn, g_dbus_connection_get_type ()));
+       g_return_if_fail (G_TYPE_CHECK_INSTANCE_TYPE (inv, g_dbus_method_invocation_get_type ()));
+       _data_ = g_slice_new0 (ServerAsyncMethodData);
+       _data_->_async_result = g_task_new (G_OBJECT (self), cancellable, _callback_, _user_data_);
+       g_task_set_source_tag (_data_->_async_result, server_async_method);
+       g_task_set_task_data (_data_->_async_result, _data_, server_async_method_data_free);
+       _tmp0_ = _g_object_ref0 (self);
+       _data_->self = _tmp0_;
+       _tmp1_ = g_strdup (sender);
+       _g_free0 (_data_->sender);
+       _data_->sender = _tmp1_;
+       _tmp2_ = _g_object_ref0 (cancellable);
+       _g_object_unref0 (_data_->cancellable);
+       _data_->cancellable = _tmp2_;
+       _tmp3_ = _g_object_ref0 (conn);
+       _g_object_unref0 (_data_->conn);
+       _data_->conn = _tmp3_;
+       _tmp4_ = _g_object_ref0 (inv);
+       _g_object_unref0 (_data_->inv);
+       _data_->inv = _tmp4_;
+       _data_->arg = arg;
+       server_async_method_co (_data_);
+}
+
+void
+server_async_method_finish (Server* self,
+                            GAsyncResult* _res_,
+                            GError** error)
+{
+       ServerAsyncMethodData* _data_;
+       g_return_if_fail (g_task_is_valid (_res_, G_OBJECT (self)));
+       g_return_if_fail (g_async_result_is_tagged (_res_, server_async_method));
+       _data_ = g_task_propagate_pointer (G_TASK (_res_), error);
+       if (NULL == _data_) {
+               return;
+       }
+}
+
+static gboolean
+server_async_method_co (ServerAsyncMethodData* _data_)
+{
+       switch (_data_->_state_) {
+               case 0:
+               goto _state_0;
+               default:
+               g_assert_not_reached ();
+       }
+       _state_0:
+       g_task_return_pointer (_data_->_async_result, _data_, NULL);
+       if (_data_->_state_ != 0) {
+               while (!g_task_get_completed (_data_->_async_result)) {
+                       g_main_context_iteration (g_task_get_context (_data_->_async_result), TRUE);
+               }
+       }
+       g_object_unref (_data_->_async_result);
+       return FALSE;
+}
+
+Server*
+server_construct (GType object_type)
+{
+       Server * self = NULL;
+       self = (Server*) g_object_new (object_type, NULL);
+       return self;
+}
+
+Server*
+server_new (void)
+{
+       return server_construct (TYPE_SERVER);
+}
+
+static void
+server_class_init (ServerClass * klass,
+                   gpointer klass_data)
+{
+       server_parent_class = g_type_class_peek_parent (klass);
+}
+
+static void
+server_instance_init (Server * self,
+                      gpointer klass)
+{
+}
+
+static GType
+server_get_type_once (void)
+{
+       static const GTypeInfo g_define_type_info = { sizeof (ServerClass), (GBaseInitFunc) NULL, (GBaseFinalizeFunc) NULL, (GClassInitFunc) server_class_init, (GClassFinalizeFunc) NULL, NULL, sizeof (Server), 0, (GInstanceInitFunc) server_instance_init, NULL };
+       GType server_type_id;
+       server_type_id = g_type_register_static (G_TYPE_OBJECT, "Server", &g_define_type_info, 0);
+       g_type_set_qdata (server_type_id, g_quark_from_static_string ("vala-dbus-register-object"), (void*) server_register_object);
+       return server_type_id;
+}
+
+GType
+server_get_type (void)
+{
+       static volatile gsize server_type_id__once = 0;
+       if (g_once_init_enter (&server_type_id__once)) {
+               GType server_type_id;
+               server_type_id = server_get_type_once ();
+               g_once_init_leave (&server_type_id__once, server_type_id);
+       }
+       return server_type_id__once;
+}
+
+static void
+_dbus_server_sync_method (Server* self,
+                          GVariant* _parameters_,
+                          GDBusMethodInvocation* invocation)
+{
+       GError* error = NULL;
+       GVariantIter _arguments_iter;
+       gint arg = 0;
+       GVariant* _tmp0_;
+       GDBusMessage* _reply_message = NULL;
+       GVariant* _reply;
+       GVariantBuilder _reply_builder;
+       g_variant_iter_init (&_arguments_iter, _parameters_);
+       _tmp0_ = g_variant_iter_next_value (&_arguments_iter);
+       arg = g_variant_get_int32 (_tmp0_);
+       g_variant_unref (_tmp0_);
+       server_sync_method (self, g_dbus_method_invocation_get_sender (invocation), NULL, g_dbus_method_invocation_get_connection (invocation), invocation, arg, &error);
+       if (error) {
+               g_dbus_method_invocation_take_error (invocation, error);
+               return;
+       }
+       _reply_message = g_dbus_message_new_method_reply (g_dbus_method_invocation_get_message (invocation));
+       g_variant_builder_init (&_reply_builder, G_VARIANT_TYPE_TUPLE);
+       _reply = g_variant_builder_end (&_reply_builder);
+       g_dbus_message_set_body (_reply_message, _reply);
+       g_dbus_connection_send_message (g_dbus_method_invocation_get_connection (invocation), _reply_message, G_DBUS_SEND_MESSAGE_FLAGS_NONE, NULL, NULL);
+       g_object_unref (invocation);
+       g_object_unref (_reply_message);
+}
+
+static void
+_dbus_server_async_method (Server* self,
+                           GVariant* _parameters_,
+                           GDBusMethodInvocation* invocation)
+{
+       GVariantIter _arguments_iter;
+       ServerAsyncMethodReadyData* _ready_data;
+       GVariant* _tmp1_;
+       g_variant_iter_init (&_arguments_iter, _parameters_);
+       _ready_data = g_slice_new0 (ServerAsyncMethodReadyData);
+       _ready_data->_invocation_ = invocation;
+       _tmp1_ = g_variant_iter_next_value (&_arguments_iter);
+       _ready_data->arg = g_variant_get_int32 (_tmp1_);
+       g_variant_unref (_tmp1_);
+       server_async_method (self, g_dbus_method_invocation_get_sender (invocation), NULL, g_dbus_method_invocation_get_connection (invocation), invocation, _ready_data->arg, (GAsyncReadyCallback) _dbus_server_async_method_ready, _ready_data);
+}
+
+static void
+_dbus_server_async_method_ready (GObject * source_object,
+                                 GAsyncResult * _res_,
+                                 gpointer _user_data_)
+{
+       ServerAsyncMethodReadyData* _ready_data;
+       GDBusMethodInvocation* invocation;
+       GError* error = NULL;
+       GDBusMessage* _reply_message = NULL;
+       GVariant* _reply;
+       GVariantBuilder _reply_builder;
+       _ready_data = _user_data_;
+       invocation = _ready_data->_invocation_;
+       server_async_method_finish ((Server*) source_object, _res_, &error);
+       if (error) {
+               g_dbus_method_invocation_take_error (invocation, error);
+               goto _error;
+       }
+       _reply_message = g_dbus_message_new_method_reply (g_dbus_method_invocation_get_message (invocation));
+       g_variant_builder_init (&_reply_builder, G_VARIANT_TYPE_TUPLE);
+       _reply = g_variant_builder_end (&_reply_builder);
+       g_dbus_message_set_body (_reply_message, _reply);
+       g_dbus_connection_send_message (g_dbus_method_invocation_get_connection (invocation), _reply_message, G_DBUS_SEND_MESSAGE_FLAGS_NONE, NULL, NULL);
+       g_object_unref (invocation);
+       g_object_unref (_reply_message);
+       _error:
+       g_slice_free (ServerAsyncMethodReadyData, _ready_data);
+}
+
+static void
+server_dbus_interface_method_call (GDBusConnection* connection,
+                                   const gchar* sender,
+                                   const gchar* object_path,
+                                   const gchar* interface_name,
+                                   const gchar* method_name,
+                                   GVariant* parameters,
+                                   GDBusMethodInvocation* invocation,
+                                   gpointer user_data)
+{
+       gpointer* data;
+       gpointer object;
+       data = user_data;
+       object = data[0];
+       if (strcmp (method_name, "SyncMethod") == 0) {
+               _dbus_server_sync_method (object, parameters, invocation);
+       } else if (strcmp (method_name, "AsyncMethod") == 0) {
+               _dbus_server_async_method (object, parameters, invocation);
+       } else {
+               g_object_unref (invocation);
+       }
+}
+
+static GVariant*
+server_dbus_interface_get_property (GDBusConnection* connection,
+                                    const gchar* sender,
+                                    const gchar* object_path,
+                                    const gchar* interface_name,
+                                    const gchar* property_name,
+                                    GError** error,
+                                    gpointer user_data)
+{
+       return NULL;
+}
+
+static gboolean
+server_dbus_interface_set_property (GDBusConnection* connection,
+                                    const gchar* sender,
+                                    const gchar* object_path,
+                                    const gchar* interface_name,
+                                    const gchar* property_name,
+                                    GVariant* value,
+                                    GError** error,
+                                    gpointer user_data)
+{
+       return FALSE;
+}
+
+guint
+server_register_object (gpointer object,
+                        GDBusConnection* connection,
+                        const gchar* path,
+                        GError** error)
+{
+       guint result;
+       gpointer *data;
+       data = g_new (gpointer, 3);
+       data[0] = g_object_ref (object);
+       data[1] = g_object_ref (connection);
+       data[2] = g_strdup (path);
+       result = g_dbus_connection_register_object (connection, path, (GDBusInterfaceInfo *) (&_server_dbus_interface_info), &_server_dbus_interface_vtable, data, _server_unregister_object, error);
+       if (!result) {
+               return 0;
+       }
+       return result;
+}
+
+static void
+_server_unregister_object (gpointer user_data)
+{
+       gpointer* data;
+       data = user_data;
+       g_object_unref (data[0]);
+       g_object_unref (data[1]);
+       g_free (data[2]);
+       g_free (data);
+}
+
+void
+proxy_sync_method (Proxy* self,
+                   const char* sender,
+                   GCancellable* cancellable,
+                   GDBusConnection* conn,
+                   GDBusMethodInvocation* inv,
+                   gint arg,
+                   GError** error)
+{
+       ProxyIface* _iface_;
+       g_return_if_fail (IS_PROXY (self));
+       _iface_ = PROXY_GET_INTERFACE (self);
+       if (_iface_->sync_method) {
+               _iface_->sync_method (self, sender, cancellable, conn, inv, arg, error);
+       }
+}
+
+void
+proxy_async_method (Proxy* self,
+                    const char* sender,
+                    GCancellable* cancellable,
+                    GDBusConnection* conn,
+                    GDBusMethodInvocation* inv,
+                    gint arg,
+                    GAsyncReadyCallback _callback_,
+                    gpointer _user_data_)
+{
+       ProxyIface* _iface_;
+       _iface_ = PROXY_GET_INTERFACE (self);
+       if (_iface_->async_method) {
+               _iface_->async_method (self, sender, cancellable, conn, inv, arg, _callback_, _user_data_);
+       }
+}
+
+void
+proxy_async_method_finish (Proxy* self,
+                           GAsyncResult* _res_,
+                           GError** error)
+{
+       ProxyIface* _iface_;
+       _iface_ = PROXY_GET_INTERFACE (self);
+       if (_iface_->async_method_finish) {
+               _iface_->async_method_finish (self, _res_, error);
+       }
+}
+
+static void
+proxy_default_init (ProxyIface * iface,
+                    gpointer iface_data)
+{
+}
+
+static GType
+proxy_get_type_once (void)
+{
+       static const GTypeInfo g_define_type_info = { sizeof (ProxyIface), (GBaseInitFunc) NULL, (GBaseFinalizeFunc) NULL, (GClassInitFunc) proxy_default_init, (GClassFinalizeFunc) NULL, NULL, 0, 0, (GInstanceInitFunc) NULL, NULL };
+       GType proxy_type_id;
+       proxy_type_id = g_type_register_static (G_TYPE_INTERFACE, "Proxy", &g_define_type_info, 0);
+       g_type_interface_add_prerequisite (proxy_type_id, G_TYPE_OBJECT);
+       g_type_set_qdata (proxy_type_id, g_quark_from_static_string ("vala-dbus-proxy-type"), (void*) proxy_proxy_get_type);
+       g_type_set_qdata (proxy_type_id, g_quark_from_static_string ("vala-dbus-interface-name"), "org.example.Server");
+       g_type_set_qdata (proxy_type_id, g_quark_from_static_string ("vala-dbus-interface-info"), (void*) (&_proxy_dbus_interface_info));
+       g_type_set_qdata (proxy_type_id, g_quark_from_static_string ("vala-dbus-register-object"), (void*) proxy_register_object);
+       return proxy_type_id;
+}
+
+GType
+proxy_get_type (void)
+{
+       static volatile gsize proxy_type_id__once = 0;
+       if (g_once_init_enter (&proxy_type_id__once)) {
+               GType proxy_type_id;
+               proxy_type_id = proxy_get_type_once ();
+               g_once_init_leave (&proxy_type_id__once, proxy_type_id);
+       }
+       return proxy_type_id__once;
+}
+
+G_DEFINE_TYPE_EXTENDED (ProxyProxy, proxy_proxy, G_TYPE_DBUS_PROXY, 0, G_IMPLEMENT_INTERFACE (TYPE_PROXY, proxy_proxy_proxy_interface_init) )
+static void
+proxy_proxy_class_init (ProxyProxyClass* klass)
+{
+       G_DBUS_PROXY_CLASS (klass)->g_signal = proxy_proxy_g_signal;
+}
+
+static void
+proxy_proxy_g_signal (GDBusProxy* proxy,
+                      const gchar* sender_name,
+                      const gchar* signal_name,
+                      GVariant* parameters)
+{
+}
+
+static void
+proxy_proxy_init (ProxyProxy* self)
+{
+       g_dbus_proxy_set_interface_info (G_DBUS_PROXY (self), (GDBusInterfaceInfo *) (&_proxy_dbus_interface_info));
+}
+
+static void
+proxy_proxy_sync_method (Proxy* self,
+                         const char* sender,
+                         GCancellable* cancellable,
+                         GDBusConnection* conn,
+                         GDBusMethodInvocation* inv,
+                         gint arg,
+                         GError** error)
+{
+       GVariant *_reply;
+       GVariantBuilder _arguments_builder;
+       g_variant_builder_init (&_arguments_builder, G_VARIANT_TYPE_TUPLE);
+       g_variant_builder_add_value (&_arguments_builder, g_variant_new_int32 (arg));
+       _reply = g_dbus_proxy_call_sync ((GDBusProxy *) self, "SyncMethod", g_variant_builder_end (&_arguments_builder), G_DBUS_CALL_FLAGS_NONE, -1, cancellable, error);
+       if (!_reply) {
+               return;
+       }
+       g_variant_unref (_reply);
+}
+
+static void
+proxy_proxy_async_method_async (Proxy* self,
+                                const char* sender,
+                                GCancellable* cancellable,
+                                GDBusConnection* conn,
+                                GDBusMethodInvocation* inv,
+                                gint arg,
+                                GAsyncReadyCallback _callback_,
+                                gpointer _user_data_)
+{
+       GVariantBuilder _arguments_builder;
+       g_variant_builder_init (&_arguments_builder, G_VARIANT_TYPE_TUPLE);
+       g_variant_builder_add_value (&_arguments_builder, g_variant_new_int32 (arg));
+       g_dbus_proxy_call ((GDBusProxy *) self, "AsyncMethod", g_variant_builder_end (&_arguments_builder), G_DBUS_CALL_FLAGS_NONE, -1, cancellable, _callback_, _user_data_);
+}
+
+static void
+proxy_proxy_async_method_finish (Proxy* self,
+                                 GAsyncResult* _res_,
+                                 GError** error)
+{
+       GVariant *_reply;
+       _reply = g_dbus_proxy_call_finish ((GDBusProxy *) self, _res_, error);
+       if (!_reply) {
+               return;
+       }
+       g_variant_unref (_reply);
+}
+
+static void
+proxy_proxy_proxy_interface_init (ProxyIface* iface)
+{
+       iface->sync_method = proxy_proxy_sync_method;
+       iface->async_method = proxy_proxy_async_method_async;
+       iface->async_method_finish = proxy_proxy_async_method_finish;
+}
+
+static void
+_dbus_proxy_sync_method (Proxy* self,
+                         GVariant* _parameters_,
+                         GDBusMethodInvocation* invocation)
+{
+       GError* error = NULL;
+       GVariantIter _arguments_iter;
+       gint arg = 0;
+       GVariant* _tmp2_;
+       GDBusMessage* _reply_message = NULL;
+       GVariant* _reply;
+       GVariantBuilder _reply_builder;
+       g_variant_iter_init (&_arguments_iter, _parameters_);
+       _tmp2_ = g_variant_iter_next_value (&_arguments_iter);
+       arg = g_variant_get_int32 (_tmp2_);
+       g_variant_unref (_tmp2_);
+       proxy_sync_method (self, g_dbus_method_invocation_get_sender (invocation), NULL, g_dbus_method_invocation_get_connection (invocation), invocation, arg, &error);
+       if (error) {
+               g_dbus_method_invocation_take_error (invocation, error);
+               return;
+       }
+       _reply_message = g_dbus_message_new_method_reply (g_dbus_method_invocation_get_message (invocation));
+       g_variant_builder_init (&_reply_builder, G_VARIANT_TYPE_TUPLE);
+       _reply = g_variant_builder_end (&_reply_builder);
+       g_dbus_message_set_body (_reply_message, _reply);
+       g_dbus_connection_send_message (g_dbus_method_invocation_get_connection (invocation), _reply_message, G_DBUS_SEND_MESSAGE_FLAGS_NONE, NULL, NULL);
+       g_object_unref (invocation);
+       g_object_unref (_reply_message);
+}
+
+static void
+_dbus_proxy_async_method (Proxy* self,
+                          GVariant* _parameters_,
+                          GDBusMethodInvocation* invocation)
+{
+       GVariantIter _arguments_iter;
+       ProxyAsyncMethodReadyData* _ready_data;
+       GVariant* _tmp3_;
+       g_variant_iter_init (&_arguments_iter, _parameters_);
+       _ready_data = g_slice_new0 (ProxyAsyncMethodReadyData);
+       _ready_data->_invocation_ = invocation;
+       _tmp3_ = g_variant_iter_next_value (&_arguments_iter);
+       _ready_data->arg = g_variant_get_int32 (_tmp3_);
+       g_variant_unref (_tmp3_);
+       proxy_async_method (self, g_dbus_method_invocation_get_sender (invocation), NULL, g_dbus_method_invocation_get_connection (invocation), invocation, _ready_data->arg, (GAsyncReadyCallback) _dbus_proxy_async_method_ready, _ready_data);
+}
+
+static void
+_dbus_proxy_async_method_ready (GObject * source_object,
+                                GAsyncResult * _res_,
+                                gpointer _user_data_)
+{
+       ProxyAsyncMethodReadyData* _ready_data;
+       GDBusMethodInvocation* invocation;
+       GError* error = NULL;
+       GDBusMessage* _reply_message = NULL;
+       GVariant* _reply;
+       GVariantBuilder _reply_builder;
+       _ready_data = _user_data_;
+       invocation = _ready_data->_invocation_;
+       proxy_async_method_finish ((Proxy*) source_object, _res_, &error);
+       if (error) {
+               g_dbus_method_invocation_take_error (invocation, error);
+               goto _error;
+       }
+       _reply_message = g_dbus_message_new_method_reply (g_dbus_method_invocation_get_message (invocation));
+       g_variant_builder_init (&_reply_builder, G_VARIANT_TYPE_TUPLE);
+       _reply = g_variant_builder_end (&_reply_builder);
+       g_dbus_message_set_body (_reply_message, _reply);
+       g_dbus_connection_send_message (g_dbus_method_invocation_get_connection (invocation), _reply_message, G_DBUS_SEND_MESSAGE_FLAGS_NONE, NULL, NULL);
+       g_object_unref (invocation);
+       g_object_unref (_reply_message);
+       _error:
+       g_slice_free (ProxyAsyncMethodReadyData, _ready_data);
+}
+
+static void
+proxy_dbus_interface_method_call (GDBusConnection* connection,
+                                  const gchar* sender,
+                                  const gchar* object_path,
+                                  const gchar* interface_name,
+                                  const gchar* method_name,
+                                  GVariant* parameters,
+                                  GDBusMethodInvocation* invocation,
+                                  gpointer user_data)
+{
+       gpointer* data;
+       gpointer object;
+       data = user_data;
+       object = data[0];
+       if (strcmp (method_name, "SyncMethod") == 0) {
+               _dbus_proxy_sync_method (object, parameters, invocation);
+       } else if (strcmp (method_name, "AsyncMethod") == 0) {
+               _dbus_proxy_async_method (object, parameters, invocation);
+       } else {
+               g_object_unref (invocation);
+       }
+}
+
+static GVariant*
+proxy_dbus_interface_get_property (GDBusConnection* connection,
+                                   const gchar* sender,
+                                   const gchar* object_path,
+                                   const gchar* interface_name,
+                                   const gchar* property_name,
+                                   GError** error,
+                                   gpointer user_data)
+{
+       return NULL;
+}
+
+static gboolean
+proxy_dbus_interface_set_property (GDBusConnection* connection,
+                                   const gchar* sender,
+                                   const gchar* object_path,
+                                   const gchar* interface_name,
+                                   const gchar* property_name,
+                                   GVariant* value,
+                                   GError** error,
+                                   gpointer user_data)
+{
+       return FALSE;
+}
+
+guint
+proxy_register_object (gpointer object,
+                       GDBusConnection* connection,
+                       const gchar* path,
+                       GError** error)
+{
+       guint result;
+       gpointer *data;
+       data = g_new (gpointer, 3);
+       data[0] = g_object_ref (object);
+       data[1] = g_object_ref (connection);
+       data[2] = g_strdup (path);
+       result = g_dbus_connection_register_object (connection, path, (GDBusInterfaceInfo *) (&_proxy_dbus_interface_info), &_proxy_dbus_interface_vtable, data, _proxy_unregister_object, error);
+       if (!result) {
+               return 0;
+       }
+       return result;
+}
+
+static void
+_proxy_unregister_object (gpointer user_data)
+{
+       gpointer* data;
+       data = user_data;
+       g_object_unref (data[0]);
+       g_object_unref (data[1]);
+       g_free (data[2]);
+       g_free (data);
+}
+
+static void
+_vala_main (void)
+{
+}
+
+int
+main (int argc,
+      char ** argv)
+{
+       _vala_main ();
+       return 0;
+}
+
diff --git a/tests/dbus/special-parameters-1.vala b/tests/dbus/special-parameters-1.vala
new file mode 100644 (file)
index 0000000..b55e316
--- /dev/null
@@ -0,0 +1,17 @@
+[DBus (name = "org.example.Server")]
+class Server : Object {
+       public void sync_method (BusName sender, Cancellable? cancellable, DBusConnection conn, DBusMethodInvocation inv, int arg) throws DBusError, IOError {
+       }
+
+       public async void async_method (BusName sender, Cancellable? cancellable, DBusConnection conn, DBusMethodInvocation inv, int arg) throws DBusError, IOError {
+       }
+}
+
+[DBus (name = "org.example.Server")]
+interface Proxy : Object {
+       public abstract void sync_method (BusName sender, Cancellable? cancellable, DBusConnection conn, DBusMethodInvocation inv, int arg) throws DBusError, IOError;
+       public abstract async void async_method (BusName sender, Cancellable? cancellable, DBusConnection conn, DBusMethodInvocation inv, int arg) throws DBusError, IOError;
+}
+
+void main () {
+}
diff --git a/tests/dbus/special-parameters-2.test b/tests/dbus/special-parameters-2.test
new file mode 100644 (file)
index 0000000..e9dcef9
--- /dev/null
@@ -0,0 +1,75 @@
+Packages: gio-2.0
+D-Bus
+
+Program: client
+
+[DBus (name = "org.example.Test.Manager")]
+interface Manager : Object {
+       public abstract ObjectPath get_unit (string name) throws Error;
+}
+
+[DBus (name = "org.example.Test.Unit")]
+interface Unit : Object {
+       public abstract string name { owned get; }
+}
+
+void main () {
+       // client
+       Manager manager = Bus.get_proxy_sync (SESSION, "org.example.Test", "/org/example/test/Manager");
+       var unit_path = manager.get_unit ("example.service");
+       assert (unit_path == "/org/example/test/Manager/0");
+       // Proxy for the same connection, same name.
+       unowned DBusProxy manager_proxy = (DBusProxy) manager;
+       Unit unit = manager_proxy.get_connection ().get_proxy_sync (manager_proxy.get_name_owner (), unit_path);
+       assert (unit.name == "example.service");
+}
+
+Program: server
+
+[DBus (name = "org.example.Test.Manager")]
+class Manager : Object {
+       private uint next_unit_id = 0;
+
+       public ObjectPath get_unit (string name, DBusConnection connection, DBusMethodInvocation invocation) {
+               // If exposed under different object paths (perhaps on different connections), we can
+               // know the one we're accessed htrough this time.
+               unowned string my_object_path = invocation.get_object_path ();
+               uint unit_id = next_unit_id++;
+               string unit_object_path = @"$my_object_path/$unit_id";
+               var unit = new Unit () { name = name };
+               // Register the unit object on the same connection that the request is made on.
+               connection.register_object (unit_object_path, unit);
+               return new ObjectPath (unit_object_path);
+       }
+}
+
+[DBus (name = "org.example.Test.Unit")]
+class Unit : Object {
+       public string name { get; construct set; }
+}
+
+MainLoop main_loop;
+
+void client_exit (Pid pid, int status) {
+       // client finished, terminate server
+       assert (status == 0);
+       main_loop.quit ();
+}
+
+void main () {
+       var conn = Bus.get_sync (SESSION);
+       conn.register_object ("/org/example/test/Manager", new Manager ());
+
+       // try to register service in session bus
+       var request_result = conn.call_sync ("org.freedesktop.DBus", "/org/freedesktop/DBus", "org.freedesktop.DBus", "RequestName",
+                                             new Variant ("(su)", "org.example.Test", 0x4), null, 0, -1);
+       assert ((uint) request_result.get_child_value (0) == 1);
+
+       // server ready, spawn client
+       Pid client_pid;
+       Process.spawn_async (null, { "dbus_special_parameters_2_client" }, null, SpawnFlags.DO_NOT_REAP_CHILD, null, out client_pid);
+       ChildWatch.add (client_pid, client_exit);
+
+       main_loop = new MainLoop ();
+       main_loop.run ();
+}
diff --git a/tests/dbus/special-parameters-2_client.c-expected b/tests/dbus/special-parameters-2_client.c-expected
new file mode 100644 (file)
index 0000000..b761e3d
--- /dev/null
@@ -0,0 +1,654 @@
+/* dbus_special_parameters_2_client.c generated by valac, the Vala compiler
+ * generated from dbus_special_parameters_2_client.vala, do not modify */
+
+#include <glib-object.h>
+#include <gio/gio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <glib.h>
+
+#if !defined(VALA_STRICT_C)
+#if !defined(__clang__) && defined(__GNUC__) && (__GNUC__ >= 14)
+#pragma GCC diagnostic warning "-Wincompatible-pointer-types"
+#elif defined(__clang__) && (__clang_major__ >= 16)
+#pragma clang diagnostic ignored "-Wincompatible-function-pointer-types"
+#pragma clang diagnostic ignored "-Wincompatible-pointer-types"
+#endif
+#endif
+#if !defined(VALA_EXTERN)
+#if defined(_WIN32) || defined(__CYGWIN__)
+#define VALA_EXTERN __declspec(dllexport) extern
+#elif __GNUC__ >= 4
+#define VALA_EXTERN __attribute__((visibility("default"))) extern
+#else
+#define VALA_EXTERN extern
+#endif
+#endif
+
+#define TYPE_MANAGER (manager_get_type ())
+#define MANAGER(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), TYPE_MANAGER, Manager))
+#define IS_MANAGER(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), TYPE_MANAGER))
+#define MANAGER_GET_INTERFACE(obj) (G_TYPE_INSTANCE_GET_INTERFACE ((obj), TYPE_MANAGER, ManagerIface))
+
+typedef struct _Manager Manager;
+typedef struct _ManagerIface ManagerIface;
+
+#define TYPE_MANAGER_PROXY (manager_proxy_get_type ())
+typedef GDBusProxy ManagerProxy;
+typedef GDBusProxyClass ManagerProxyClass;
+#define _g_free0(var) (var = (g_free (var), NULL))
+
+#define TYPE_UNIT (unit_get_type ())
+#define UNIT(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), TYPE_UNIT, Unit))
+#define IS_UNIT(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), TYPE_UNIT))
+#define UNIT_GET_INTERFACE(obj) (G_TYPE_INSTANCE_GET_INTERFACE ((obj), TYPE_UNIT, UnitIface))
+
+typedef struct _Unit Unit;
+typedef struct _UnitIface UnitIface;
+
+#define TYPE_UNIT_PROXY (unit_proxy_get_type ())
+typedef GDBusProxy UnitProxy;
+typedef GDBusProxyClass UnitProxyClass;
+#define _g_object_unref0(var) ((var == NULL) ? NULL : (var = (g_object_unref (var), NULL)))
+#define _vala_assert(expr, msg) if G_LIKELY (expr) ; else g_assertion_message_expr (G_LOG_DOMAIN, __FILE__, __LINE__, G_STRFUNC, msg);
+#define _vala_return_if_fail(expr, msg) if G_LIKELY (expr) ; else { g_return_if_fail_warning (G_LOG_DOMAIN, G_STRFUNC, msg); return; }
+#define _vala_return_val_if_fail(expr, msg, val) if G_LIKELY (expr) ; else { g_return_if_fail_warning (G_LOG_DOMAIN, G_STRFUNC, msg); return val; }
+#define _vala_warn_if_fail(expr, msg) if G_LIKELY (expr) ; else g_warn_message (G_LOG_DOMAIN, __FILE__, __LINE__, G_STRFUNC, msg);
+
+struct _ManagerIface {
+       GTypeInterface parent_iface;
+       char* (*get_unit) (Manager* self, const gchar* name, GError** error);
+};
+
+struct _UnitIface {
+       GTypeInterface parent_iface;
+       gchar* (*get_name) (Unit* self);
+};
+
+VALA_EXTERN GType manager_proxy_get_type (void) G_GNUC_CONST ;
+VALA_EXTERN guint manager_register_object (void* object,
+                               GDBusConnection* connection,
+                               const gchar* path,
+                               GError** error);
+VALA_EXTERN GType manager_get_type (void) G_GNUC_CONST ;
+G_DEFINE_AUTOPTR_CLEANUP_FUNC (Manager, g_object_unref)
+VALA_EXTERN char* manager_get_unit (Manager* self,
+                        const gchar* name,
+                        GError** error);
+static GType manager_get_type_once (void);
+static void manager_proxy_g_signal (GDBusProxy* proxy,
+                             const gchar* sender_name,
+                             const gchar* signal_name,
+                             GVariant* parameters);
+static char* manager_proxy_get_unit (Manager* self,
+                              const gchar* name,
+                              GError** error);
+static void manager_proxy_manager_interface_init (ManagerIface* iface);
+static void _dbus_manager_get_unit (Manager* self,
+                             GVariant* _parameters_,
+                             GDBusMethodInvocation* invocation);
+static void manager_dbus_interface_method_call (GDBusConnection* connection,
+                                         const gchar* sender,
+                                         const gchar* object_path,
+                                         const gchar* interface_name,
+                                         const gchar* method_name,
+                                         GVariant* parameters,
+                                         GDBusMethodInvocation* invocation,
+                                         gpointer user_data);
+static GVariant* manager_dbus_interface_get_property (GDBusConnection* connection,
+                                               const gchar* sender,
+                                               const gchar* object_path,
+                                               const gchar* interface_name,
+                                               const gchar* property_name,
+                                               GError** error,
+                                               gpointer user_data);
+static gboolean manager_dbus_interface_set_property (GDBusConnection* connection,
+                                              const gchar* sender,
+                                              const gchar* object_path,
+                                              const gchar* interface_name,
+                                              const gchar* property_name,
+                                              GVariant* value,
+                                              GError** error,
+                                              gpointer user_data);
+static void _manager_unregister_object (gpointer user_data);
+VALA_EXTERN GType unit_get_type (void) G_GNUC_CONST ;
+G_DEFINE_AUTOPTR_CLEANUP_FUNC (Unit, g_object_unref)
+VALA_EXTERN GType unit_proxy_get_type (void) G_GNUC_CONST ;
+VALA_EXTERN guint unit_register_object (void* object,
+                            GDBusConnection* connection,
+                            const gchar* path,
+                            GError** error);
+VALA_EXTERN gchar* unit_get_name (Unit* self);
+static GType unit_get_type_once (void);
+static void unit_proxy_g_signal (GDBusProxy* proxy,
+                          const gchar* sender_name,
+                          const gchar* signal_name,
+                          GVariant* parameters);
+static gchar* unit_dbus_proxy_get_name (Unit* self);
+static void unit_proxy_unit_interface_init (UnitIface* iface);
+static void unit_dbus_interface_method_call (GDBusConnection* connection,
+                                      const gchar* sender,
+                                      const gchar* object_path,
+                                      const gchar* interface_name,
+                                      const gchar* method_name,
+                                      GVariant* parameters,
+                                      GDBusMethodInvocation* invocation,
+                                      gpointer user_data);
+static GVariant* unit_dbus_interface_get_property (GDBusConnection* connection,
+                                            const gchar* sender,
+                                            const gchar* object_path,
+                                            const gchar* interface_name,
+                                            const gchar* property_name,
+                                            GError** error,
+                                            gpointer user_data);
+static GVariant* _dbus_unit_get_name (Unit* self);
+static gboolean unit_dbus_interface_set_property (GDBusConnection* connection,
+                                           const gchar* sender,
+                                           const gchar* object_path,
+                                           const gchar* interface_name,
+                                           const gchar* property_name,
+                                           GVariant* value,
+                                           GError** error,
+                                           gpointer user_data);
+static void _unit_unregister_object (gpointer user_data);
+static void _vala_main (void);
+
+static const GDBusArgInfo _manager_dbus_arg_info_get_unit_name = {-1, "name", "s", NULL};
+static const GDBusArgInfo _manager_dbus_arg_info_get_unit_result = {-1, "result", "o", NULL};
+static const GDBusArgInfo * const _manager_dbus_arg_info_get_unit_in[] = {&_manager_dbus_arg_info_get_unit_name, NULL};
+static const GDBusArgInfo * const _manager_dbus_arg_info_get_unit_out[] = {&_manager_dbus_arg_info_get_unit_result, NULL};
+static const GDBusMethodInfo _manager_dbus_method_info_get_unit = {-1, "GetUnit", (GDBusArgInfo **) (&_manager_dbus_arg_info_get_unit_in), (GDBusArgInfo **) (&_manager_dbus_arg_info_get_unit_out), NULL};
+static const GDBusMethodInfo * const _manager_dbus_method_info[] = {&_manager_dbus_method_info_get_unit, NULL};
+static const GDBusSignalInfo * const _manager_dbus_signal_info[] = {NULL};
+static const GDBusPropertyInfo * const _manager_dbus_property_info[] = {NULL};
+static const GDBusInterfaceInfo _manager_dbus_interface_info = {-1, "org.example.Test.Manager", (GDBusMethodInfo **) (&_manager_dbus_method_info), (GDBusSignalInfo **) (&_manager_dbus_signal_info), (GDBusPropertyInfo **) (&_manager_dbus_property_info), NULL};
+static const GDBusInterfaceVTable _manager_dbus_interface_vtable = {manager_dbus_interface_method_call, manager_dbus_interface_get_property, manager_dbus_interface_set_property};
+static const GDBusMethodInfo * const _unit_dbus_method_info[] = {NULL};
+static const GDBusSignalInfo * const _unit_dbus_signal_info[] = {NULL};
+static const GDBusPropertyInfo _unit_dbus_property_info_name = {-1, "Name", "s", G_DBUS_PROPERTY_INFO_FLAGS_READABLE, NULL};
+static const GDBusPropertyInfo * const _unit_dbus_property_info[] = {&_unit_dbus_property_info_name, NULL};
+static const GDBusInterfaceInfo _unit_dbus_interface_info = {-1, "org.example.Test.Unit", (GDBusMethodInfo **) (&_unit_dbus_method_info), (GDBusSignalInfo **) (&_unit_dbus_signal_info), (GDBusPropertyInfo **) (&_unit_dbus_property_info), NULL};
+static const GDBusInterfaceVTable _unit_dbus_interface_vtable = {unit_dbus_interface_method_call, unit_dbus_interface_get_property, unit_dbus_interface_set_property};
+
+char*
+manager_get_unit (Manager* self,
+                  const gchar* name,
+                  GError** error)
+{
+       ManagerIface* _iface_;
+       g_return_val_if_fail (IS_MANAGER (self), NULL);
+       _iface_ = MANAGER_GET_INTERFACE (self);
+       if (_iface_->get_unit) {
+               return _iface_->get_unit (self, name, error);
+       }
+       return NULL;
+}
+
+static void
+manager_default_init (ManagerIface * iface,
+                      gpointer iface_data)
+{
+}
+
+static GType
+manager_get_type_once (void)
+{
+       static const GTypeInfo g_define_type_info = { sizeof (ManagerIface), (GBaseInitFunc) NULL, (GBaseFinalizeFunc) NULL, (GClassInitFunc) manager_default_init, (GClassFinalizeFunc) NULL, NULL, 0, 0, (GInstanceInitFunc) NULL, NULL };
+       GType manager_type_id;
+       manager_type_id = g_type_register_static (G_TYPE_INTERFACE, "Manager", &g_define_type_info, 0);
+       g_type_interface_add_prerequisite (manager_type_id, G_TYPE_OBJECT);
+       g_type_set_qdata (manager_type_id, g_quark_from_static_string ("vala-dbus-proxy-type"), (void*) manager_proxy_get_type);
+       g_type_set_qdata (manager_type_id, g_quark_from_static_string ("vala-dbus-interface-name"), "org.example.Test.Manager");
+       g_type_set_qdata (manager_type_id, g_quark_from_static_string ("vala-dbus-interface-info"), (void*) (&_manager_dbus_interface_info));
+       g_type_set_qdata (manager_type_id, g_quark_from_static_string ("vala-dbus-register-object"), (void*) manager_register_object);
+       return manager_type_id;
+}
+
+GType
+manager_get_type (void)
+{
+       static volatile gsize manager_type_id__once = 0;
+       if (g_once_init_enter (&manager_type_id__once)) {
+               GType manager_type_id;
+               manager_type_id = manager_get_type_once ();
+               g_once_init_leave (&manager_type_id__once, manager_type_id);
+       }
+       return manager_type_id__once;
+}
+
+G_DEFINE_TYPE_EXTENDED (ManagerProxy, manager_proxy, G_TYPE_DBUS_PROXY, 0, G_IMPLEMENT_INTERFACE (TYPE_MANAGER, manager_proxy_manager_interface_init) )
+static void
+manager_proxy_class_init (ManagerProxyClass* klass)
+{
+       G_DBUS_PROXY_CLASS (klass)->g_signal = manager_proxy_g_signal;
+}
+
+static void
+manager_proxy_g_signal (GDBusProxy* proxy,
+                        const gchar* sender_name,
+                        const gchar* signal_name,
+                        GVariant* parameters)
+{
+}
+
+static void
+manager_proxy_init (ManagerProxy* self)
+{
+       g_dbus_proxy_set_interface_info (G_DBUS_PROXY (self), (GDBusInterfaceInfo *) (&_manager_dbus_interface_info));
+}
+
+static char*
+manager_proxy_get_unit (Manager* self,
+                        const gchar* name,
+                        GError** error)
+{
+       GVariant *_reply;
+       GVariantBuilder _arguments_builder;
+       GVariantIter _reply_iter;
+       char* _result = NULL;
+       GVariant* _tmp0_;
+       g_variant_builder_init (&_arguments_builder, G_VARIANT_TYPE_TUPLE);
+       g_variant_builder_add_value (&_arguments_builder, g_variant_new_string (name));
+       _reply = g_dbus_proxy_call_sync ((GDBusProxy *) self, "GetUnit", g_variant_builder_end (&_arguments_builder), G_DBUS_CALL_FLAGS_NONE, -1, NULL, error);
+       if (!_reply) {
+               return NULL;
+       }
+       g_variant_iter_init (&_reply_iter, _reply);
+       _tmp0_ = g_variant_iter_next_value (&_reply_iter);
+       _result = g_variant_dup_string (_tmp0_, NULL);
+       g_variant_unref (_tmp0_);
+       g_variant_unref (_reply);
+       return _result;
+}
+
+static void
+manager_proxy_manager_interface_init (ManagerIface* iface)
+{
+       iface->get_unit = manager_proxy_get_unit;
+}
+
+static void
+_dbus_manager_get_unit (Manager* self,
+                        GVariant* _parameters_,
+                        GDBusMethodInvocation* invocation)
+{
+       GError* error = NULL;
+       GVariantIter _arguments_iter;
+       gchar* name = NULL;
+       GVariant* _tmp1_;
+       GDBusMessage* _reply_message = NULL;
+       GVariant* _reply;
+       GVariantBuilder _reply_builder;
+       char* result;
+       g_variant_iter_init (&_arguments_iter, _parameters_);
+       _tmp1_ = g_variant_iter_next_value (&_arguments_iter);
+       name = g_variant_dup_string (_tmp1_, NULL);
+       g_variant_unref (_tmp1_);
+       result = manager_get_unit (self, name, &error);
+       if (error) {
+               g_dbus_method_invocation_take_error (invocation, error);
+               goto _error;
+       }
+       _reply_message = g_dbus_message_new_method_reply (g_dbus_method_invocation_get_message (invocation));
+       g_variant_builder_init (&_reply_builder, G_VARIANT_TYPE_TUPLE);
+       g_variant_builder_add_value (&_reply_builder, g_variant_new_object_path (result));
+       _g_free0 (result);
+       _reply = g_variant_builder_end (&_reply_builder);
+       g_dbus_message_set_body (_reply_message, _reply);
+       g_dbus_connection_send_message (g_dbus_method_invocation_get_connection (invocation), _reply_message, G_DBUS_SEND_MESSAGE_FLAGS_NONE, NULL, NULL);
+       g_object_unref (invocation);
+       g_object_unref (_reply_message);
+       _error:
+       _g_free0 (name);
+       ;
+}
+
+static void
+manager_dbus_interface_method_call (GDBusConnection* connection,
+                                    const gchar* sender,
+                                    const gchar* object_path,
+                                    const gchar* interface_name,
+                                    const gchar* method_name,
+                                    GVariant* parameters,
+                                    GDBusMethodInvocation* invocation,
+                                    gpointer user_data)
+{
+       gpointer* data;
+       gpointer object;
+       data = user_data;
+       object = data[0];
+       if (strcmp (method_name, "GetUnit") == 0) {
+               _dbus_manager_get_unit (object, parameters, invocation);
+       } else {
+               g_object_unref (invocation);
+       }
+}
+
+static GVariant*
+manager_dbus_interface_get_property (GDBusConnection* connection,
+                                     const gchar* sender,
+                                     const gchar* object_path,
+                                     const gchar* interface_name,
+                                     const gchar* property_name,
+                                     GError** error,
+                                     gpointer user_data)
+{
+       return NULL;
+}
+
+static gboolean
+manager_dbus_interface_set_property (GDBusConnection* connection,
+                                     const gchar* sender,
+                                     const gchar* object_path,
+                                     const gchar* interface_name,
+                                     const gchar* property_name,
+                                     GVariant* value,
+                                     GError** error,
+                                     gpointer user_data)
+{
+       return FALSE;
+}
+
+guint
+manager_register_object (gpointer object,
+                         GDBusConnection* connection,
+                         const gchar* path,
+                         GError** error)
+{
+       guint result;
+       gpointer *data;
+       data = g_new (gpointer, 3);
+       data[0] = g_object_ref (object);
+       data[1] = g_object_ref (connection);
+       data[2] = g_strdup (path);
+       result = g_dbus_connection_register_object (connection, path, (GDBusInterfaceInfo *) (&_manager_dbus_interface_info), &_manager_dbus_interface_vtable, data, _manager_unregister_object, error);
+       if (!result) {
+               return 0;
+       }
+       return result;
+}
+
+static void
+_manager_unregister_object (gpointer user_data)
+{
+       gpointer* data;
+       data = user_data;
+       g_object_unref (data[0]);
+       g_object_unref (data[1]);
+       g_free (data[2]);
+       g_free (data);
+}
+
+gchar*
+unit_get_name (Unit* self)
+{
+       UnitIface* _iface_;
+       g_return_val_if_fail (IS_UNIT (self), NULL);
+       _iface_ = UNIT_GET_INTERFACE (self);
+       if (_iface_->get_name) {
+               return _iface_->get_name (self);
+       }
+       return NULL;
+}
+
+static void
+unit_default_init (UnitIface * iface,
+                   gpointer iface_data)
+{
+}
+
+static GType
+unit_get_type_once (void)
+{
+       static const GTypeInfo g_define_type_info = { sizeof (UnitIface), (GBaseInitFunc) NULL, (GBaseFinalizeFunc) NULL, (GClassInitFunc) unit_default_init, (GClassFinalizeFunc) NULL, NULL, 0, 0, (GInstanceInitFunc) NULL, NULL };
+       GType unit_type_id;
+       unit_type_id = g_type_register_static (G_TYPE_INTERFACE, "Unit", &g_define_type_info, 0);
+       g_type_interface_add_prerequisite (unit_type_id, G_TYPE_OBJECT);
+       g_type_set_qdata (unit_type_id, g_quark_from_static_string ("vala-dbus-proxy-type"), (void*) unit_proxy_get_type);
+       g_type_set_qdata (unit_type_id, g_quark_from_static_string ("vala-dbus-interface-name"), "org.example.Test.Unit");
+       g_type_set_qdata (unit_type_id, g_quark_from_static_string ("vala-dbus-interface-info"), (void*) (&_unit_dbus_interface_info));
+       g_type_set_qdata (unit_type_id, g_quark_from_static_string ("vala-dbus-register-object"), (void*) unit_register_object);
+       return unit_type_id;
+}
+
+GType
+unit_get_type (void)
+{
+       static volatile gsize unit_type_id__once = 0;
+       if (g_once_init_enter (&unit_type_id__once)) {
+               GType unit_type_id;
+               unit_type_id = unit_get_type_once ();
+               g_once_init_leave (&unit_type_id__once, unit_type_id);
+       }
+       return unit_type_id__once;
+}
+
+G_DEFINE_TYPE_EXTENDED (UnitProxy, unit_proxy, G_TYPE_DBUS_PROXY, 0, G_IMPLEMENT_INTERFACE (TYPE_UNIT, unit_proxy_unit_interface_init) )
+static void
+unit_proxy_class_init (UnitProxyClass* klass)
+{
+       G_DBUS_PROXY_CLASS (klass)->g_signal = unit_proxy_g_signal;
+}
+
+static void
+unit_proxy_g_signal (GDBusProxy* proxy,
+                     const gchar* sender_name,
+                     const gchar* signal_name,
+                     GVariant* parameters)
+{
+}
+
+static void
+unit_proxy_init (UnitProxy* self)
+{
+       g_dbus_proxy_set_interface_info (G_DBUS_PROXY (self), (GDBusInterfaceInfo *) (&_unit_dbus_interface_info));
+}
+
+static gchar*
+unit_dbus_proxy_get_name (Unit* self)
+{
+       GVariant *_inner_reply;
+       gchar* _result;
+       _inner_reply = g_dbus_proxy_get_cached_property ((GDBusProxy *) self, "Name");
+       if (!_inner_reply) {
+               GVariant *_arguments;
+               GVariant *_reply;
+               GVariantBuilder _arguments_builder;
+               g_variant_builder_init (&_arguments_builder, G_VARIANT_TYPE_TUPLE);
+               g_variant_builder_add_value (&_arguments_builder, g_variant_new_string ("org.example.Test.Unit"));
+               g_variant_builder_add_value (&_arguments_builder, g_variant_new_string ("Name"));
+               _arguments = g_variant_builder_end (&_arguments_builder);
+               _reply = g_dbus_proxy_call_sync ((GDBusProxy *) self, "org.freedesktop.DBus.Properties.Get", _arguments, G_DBUS_CALL_FLAGS_NONE, -1, NULL, NULL);
+               if (!_reply) {
+                       return NULL;
+               }
+               if (G_UNLIKELY (!g_variant_is_of_type (_reply, G_VARIANT_TYPE ("(v)")))) {
+                       g_variant_unref (_reply);
+                       return NULL;
+               }
+               g_variant_get (_reply, "(v)", &_inner_reply);
+               g_variant_unref (_reply);
+       }
+       if (G_UNLIKELY (!g_variant_is_of_type (_inner_reply, G_VARIANT_TYPE ("s")))) {
+               g_warning ("Expected property %s.%s to be of type '%s', but received '%s'", "org.example.Test.Unit", "Name", "s", g_variant_get_type_string (_inner_reply));
+               g_variant_unref (_inner_reply);
+               return NULL;
+       }
+       _result = g_variant_dup_string (_inner_reply, NULL);
+       g_variant_unref (_inner_reply);
+       return _result;
+}
+
+static void
+unit_proxy_unit_interface_init (UnitIface* iface)
+{
+       iface->get_name = unit_dbus_proxy_get_name;
+}
+
+static void
+unit_dbus_interface_method_call (GDBusConnection* connection,
+                                 const gchar* sender,
+                                 const gchar* object_path,
+                                 const gchar* interface_name,
+                                 const gchar* method_name,
+                                 GVariant* parameters,
+                                 GDBusMethodInvocation* invocation,
+                                 gpointer user_data)
+{
+       g_object_unref (invocation);
+}
+
+static GVariant*
+_dbus_unit_get_name (Unit* self)
+{
+       gchar* result;
+       GVariant* _reply;
+       result = unit_get_name (self);
+       _reply = g_variant_new_string (result);
+       _g_free0 (result);
+       return _reply;
+}
+
+static GVariant*
+unit_dbus_interface_get_property (GDBusConnection* connection,
+                                  const gchar* sender,
+                                  const gchar* object_path,
+                                  const gchar* interface_name,
+                                  const gchar* property_name,
+                                  GError** error,
+                                  gpointer user_data)
+{
+       gpointer* data;
+       gpointer object;
+       data = user_data;
+       object = data[0];
+       if (strcmp (property_name, "Name") == 0) {
+               return _dbus_unit_get_name (object);
+       }
+       return NULL;
+}
+
+static gboolean
+unit_dbus_interface_set_property (GDBusConnection* connection,
+                                  const gchar* sender,
+                                  const gchar* object_path,
+                                  const gchar* interface_name,
+                                  const gchar* property_name,
+                                  GVariant* value,
+                                  GError** error,
+                                  gpointer user_data)
+{
+       return FALSE;
+}
+
+guint
+unit_register_object (gpointer object,
+                      GDBusConnection* connection,
+                      const gchar* path,
+                      GError** error)
+{
+       guint result;
+       gpointer *data;
+       data = g_new (gpointer, 3);
+       data[0] = g_object_ref (object);
+       data[1] = g_object_ref (connection);
+       data[2] = g_strdup (path);
+       result = g_dbus_connection_register_object (connection, path, (GDBusInterfaceInfo *) (&_unit_dbus_interface_info), &_unit_dbus_interface_vtable, data, _unit_unregister_object, error);
+       if (!result) {
+               return 0;
+       }
+       return result;
+}
+
+static void
+_unit_unregister_object (gpointer user_data)
+{
+       gpointer* data;
+       data = user_data;
+       g_object_unref (data[0]);
+       g_object_unref (data[1]);
+       g_free (data[2]);
+       g_free (data);
+}
+
+static void
+_vala_main (void)
+{
+       Manager* manager = NULL;
+       Manager* _tmp0_;
+       char* unit_path = NULL;
+       Manager* _tmp1_;
+       char* _tmp2_;
+       const char* _tmp3_;
+       GDBusProxy* manager_proxy = NULL;
+       Manager* _tmp4_;
+       Unit* unit = NULL;
+       GDBusProxy* _tmp5_;
+       GDBusConnection* _tmp6_;
+       GDBusProxy* _tmp7_;
+       gchar* _tmp8_;
+       gchar* _tmp9_;
+       const char* _tmp10_;
+       Unit* _tmp11_;
+       Unit* _tmp12_;
+       Unit* _tmp13_;
+       gchar* _tmp14_;
+       gchar* _tmp15_;
+       gchar* _tmp16_;
+       GError* _inner_error0_ = NULL;
+       _tmp0_ = (Manager*) g_initable_new (TYPE_MANAGER_PROXY, NULL, &_inner_error0_, "g-flags", 0, "g-name", "org.example.Test", "g-bus-type", G_BUS_TYPE_SESSION, "g-object-path", "/org/example/test/Manager", "g-interface-name", "org.example.Test.Manager", NULL);
+       manager = (Manager*) _tmp0_;
+       if (G_UNLIKELY (_inner_error0_ != NULL)) {
+               g_critical ("file %s: line %d: uncaught error: %s (%s, %d)", __FILE__, __LINE__, _inner_error0_->message, g_quark_to_string (_inner_error0_->domain), _inner_error0_->code);
+               g_clear_error (&_inner_error0_);
+               return;
+       }
+       _tmp1_ = manager;
+       _tmp2_ = manager_get_unit (_tmp1_, "example.service", &_inner_error0_);
+       unit_path = _tmp2_;
+       if (G_UNLIKELY (_inner_error0_ != NULL)) {
+               _g_object_unref0 (manager);
+               g_critical ("file %s: line %d: uncaught error: %s (%s, %d)", __FILE__, __LINE__, _inner_error0_->message, g_quark_to_string (_inner_error0_->domain), _inner_error0_->code);
+               g_clear_error (&_inner_error0_);
+               return;
+       }
+       _tmp3_ = unit_path;
+       _vala_assert (g_strcmp0 (_tmp3_, "/org/example/test/Manager/0") == 0, "unit_path == \"/org/example/test/Manager/0\"");
+       _tmp4_ = manager;
+       manager_proxy = G_TYPE_CHECK_INSTANCE_CAST (_tmp4_, g_dbus_proxy_get_type (), GDBusProxy);
+       _tmp5_ = manager_proxy;
+       _tmp6_ = g_dbus_proxy_get_connection (_tmp5_);
+       _tmp7_ = manager_proxy;
+       _tmp8_ = g_dbus_proxy_get_name_owner (_tmp7_);
+       _tmp9_ = _tmp8_;
+       _tmp10_ = unit_path;
+       _tmp11_ = (Unit*) g_initable_new (TYPE_UNIT_PROXY, NULL, &_inner_error0_, "g-flags", 0, "g-name", _tmp9_, "g-connection", _tmp6_, "g-object-path", (const gchar*) _tmp10_, "g-interface-name", "org.example.Test.Unit", NULL);
+       _tmp12_ = (Unit*) _tmp11_;
+       _g_free0 (_tmp9_);
+       unit = _tmp12_;
+       if (G_UNLIKELY (_inner_error0_ != NULL)) {
+               _g_free0 (unit_path);
+               _g_object_unref0 (manager);
+               g_critical ("file %s: line %d: uncaught error: %s (%s, %d)", __FILE__, __LINE__, _inner_error0_->message, g_quark_to_string (_inner_error0_->domain), _inner_error0_->code);
+               g_clear_error (&_inner_error0_);
+               return;
+       }
+       _tmp13_ = unit;
+       _tmp14_ = unit_get_name (_tmp13_);
+       _tmp15_ = _tmp14_;
+       _tmp16_ = _tmp15_;
+       _vala_assert (g_strcmp0 (_tmp16_, "example.service") == 0, "unit.name == \"example.service\"");
+       _g_free0 (_tmp16_);
+       _g_object_unref0 (unit);
+       _g_free0 (unit_path);
+       _g_object_unref0 (manager);
+}
+
+int
+main (int argc,
+      char ** argv)
+{
+       _vala_main ();
+       return 0;
+}
+
diff --git a/tests/dbus/special-parameters-2_server.c-expected b/tests/dbus/special-parameters-2_server.c-expected
new file mode 100644 (file)
index 0000000..a415ffc
--- /dev/null
@@ -0,0 +1,845 @@
+/* dbus_special_parameters_2_server.c generated by valac, the Vala compiler
+ * generated from dbus_special_parameters_2_server.vala, do not modify */
+
+#include <glib-object.h>
+#include <gio/gio.h>
+#include <glib.h>
+#include <stdlib.h>
+#include <string.h>
+
+#if !defined(VALA_STRICT_C)
+#if !defined(__clang__) && defined(__GNUC__) && (__GNUC__ >= 14)
+#pragma GCC diagnostic warning "-Wincompatible-pointer-types"
+#elif defined(__clang__) && (__clang_major__ >= 16)
+#pragma clang diagnostic ignored "-Wincompatible-function-pointer-types"
+#pragma clang diagnostic ignored "-Wincompatible-pointer-types"
+#endif
+#endif
+#if !defined(VALA_EXTERN)
+#if defined(_WIN32) || defined(__CYGWIN__)
+#define VALA_EXTERN __declspec(dllexport) extern
+#elif __GNUC__ >= 4
+#define VALA_EXTERN __attribute__((visibility("default"))) extern
+#else
+#define VALA_EXTERN extern
+#endif
+#endif
+
+#define TYPE_MANAGER (manager_get_type ())
+#define MANAGER(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), TYPE_MANAGER, Manager))
+#define MANAGER_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), TYPE_MANAGER, ManagerClass))
+#define IS_MANAGER(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), TYPE_MANAGER))
+#define IS_MANAGER_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), TYPE_MANAGER))
+#define MANAGER_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), TYPE_MANAGER, ManagerClass))
+
+typedef struct _Manager Manager;
+typedef struct _ManagerClass ManagerClass;
+typedef struct _ManagerPrivate ManagerPrivate;
+enum  {
+       MANAGER_0_PROPERTY,
+       MANAGER_NUM_PROPERTIES
+};
+static GParamSpec* manager_properties[MANAGER_NUM_PROPERTIES];
+#define _g_free0(var) (var = (g_free (var), NULL))
+
+#define TYPE_UNIT (unit_get_type ())
+#define UNIT(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), TYPE_UNIT, Unit))
+#define UNIT_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), TYPE_UNIT, UnitClass))
+#define IS_UNIT(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), TYPE_UNIT))
+#define IS_UNIT_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), TYPE_UNIT))
+#define UNIT_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), TYPE_UNIT, UnitClass))
+
+typedef struct _Unit Unit;
+typedef struct _UnitClass UnitClass;
+#define _g_object_unref0(var) ((var == NULL) ? NULL : (var = (g_object_unref (var), NULL)))
+typedef struct _UnitPrivate UnitPrivate;
+enum  {
+       UNIT_0_PROPERTY,
+       UNIT_NAME_PROPERTY,
+       UNIT_NUM_PROPERTIES
+};
+static GParamSpec* unit_properties[UNIT_NUM_PROPERTIES];
+#define _g_variant_unref0(var) ((var == NULL) ? NULL : (var = (g_variant_unref (var), NULL)))
+#define _g_main_loop_unref0(var) ((var == NULL) ? NULL : (var = (g_main_loop_unref (var), NULL)))
+#define _vala_assert(expr, msg) if G_LIKELY (expr) ; else g_assertion_message_expr (G_LOG_DOMAIN, __FILE__, __LINE__, G_STRFUNC, msg);
+#define _vala_return_if_fail(expr, msg) if G_LIKELY (expr) ; else { g_return_if_fail_warning (G_LOG_DOMAIN, G_STRFUNC, msg); return; }
+#define _vala_return_val_if_fail(expr, msg, val) if G_LIKELY (expr) ; else { g_return_if_fail_warning (G_LOG_DOMAIN, G_STRFUNC, msg); return val; }
+#define _vala_warn_if_fail(expr, msg) if G_LIKELY (expr) ; else g_warn_message (G_LOG_DOMAIN, __FILE__, __LINE__, G_STRFUNC, msg);
+
+struct _Manager {
+       GObject parent_instance;
+       ManagerPrivate * priv;
+};
+
+struct _ManagerClass {
+       GObjectClass parent_class;
+};
+
+struct _ManagerPrivate {
+       guint next_unit_id;
+};
+
+struct _Unit {
+       GObject parent_instance;
+       UnitPrivate * priv;
+};
+
+struct _UnitClass {
+       GObjectClass parent_class;
+};
+
+struct _UnitPrivate {
+       gchar* _name;
+};
+
+static gint Manager_private_offset;
+static gpointer manager_parent_class = NULL;
+static gint Unit_private_offset;
+static gpointer unit_parent_class = NULL;
+VALA_EXTERN GMainLoop* main_loop;
+GMainLoop* main_loop = NULL;
+
+VALA_EXTERN GType manager_get_type (void) G_GNUC_CONST ;
+G_DEFINE_AUTOPTR_CLEANUP_FUNC (Manager, g_object_unref)
+VALA_EXTERN guint manager_register_object (void* object,
+                               GDBusConnection* connection,
+                               const gchar* path,
+                               GError** error);
+VALA_EXTERN char* manager_get_unit (Manager* self,
+                        const gchar* name,
+                        GDBusConnection* connection,
+                        GDBusMethodInvocation* invocation);
+VALA_EXTERN GType unit_get_type (void) G_GNUC_CONST ;
+G_DEFINE_AUTOPTR_CLEANUP_FUNC (Unit, g_object_unref)
+VALA_EXTERN guint unit_register_object (void* object,
+                            GDBusConnection* connection,
+                            const gchar* path,
+                            GError** error);
+VALA_EXTERN Unit* unit_new (void);
+VALA_EXTERN Unit* unit_construct (GType object_type);
+VALA_EXTERN void unit_set_name (Unit* self,
+                    const gchar* value);
+VALA_EXTERN Manager* manager_new (void);
+VALA_EXTERN Manager* manager_construct (GType object_type);
+static void manager_finalize (GObject * obj);
+static GType manager_get_type_once (void);
+static void _dbus_manager_get_unit (Manager* self,
+                             GVariant* _parameters_,
+                             GDBusMethodInvocation* invocation);
+static void manager_dbus_interface_method_call (GDBusConnection* connection,
+                                         const gchar* sender,
+                                         const gchar* object_path,
+                                         const gchar* interface_name,
+                                         const gchar* method_name,
+                                         GVariant* parameters,
+                                         GDBusMethodInvocation* invocation,
+                                         gpointer user_data);
+static GVariant* manager_dbus_interface_get_property (GDBusConnection* connection,
+                                               const gchar* sender,
+                                               const gchar* object_path,
+                                               const gchar* interface_name,
+                                               const gchar* property_name,
+                                               GError** error,
+                                               gpointer user_data);
+static gboolean manager_dbus_interface_set_property (GDBusConnection* connection,
+                                              const gchar* sender,
+                                              const gchar* object_path,
+                                              const gchar* interface_name,
+                                              const gchar* property_name,
+                                              GVariant* value,
+                                              GError** error,
+                                              gpointer user_data);
+static void _manager_unregister_object (gpointer user_data);
+VALA_EXTERN const gchar* unit_get_name (Unit* self);
+static void unit_finalize (GObject * obj);
+static GType unit_get_type_once (void);
+static void _vala_unit_get_property (GObject * object,
+                              guint property_id,
+                              GValue * value,
+                              GParamSpec * pspec);
+static void _vala_unit_set_property (GObject * object,
+                              guint property_id,
+                              const GValue * value,
+                              GParamSpec * pspec);
+static void unit_dbus_interface_method_call (GDBusConnection* connection,
+                                      const gchar* sender,
+                                      const gchar* object_path,
+                                      const gchar* interface_name,
+                                      const gchar* method_name,
+                                      GVariant* parameters,
+                                      GDBusMethodInvocation* invocation,
+                                      gpointer user_data);
+static GVariant* unit_dbus_interface_get_property (GDBusConnection* connection,
+                                            const gchar* sender,
+                                            const gchar* object_path,
+                                            const gchar* interface_name,
+                                            const gchar* property_name,
+                                            GError** error,
+                                            gpointer user_data);
+static GVariant* _dbus_unit_get_name (Unit* self);
+static gboolean unit_dbus_interface_set_property (GDBusConnection* connection,
+                                           const gchar* sender,
+                                           const gchar* object_path,
+                                           const gchar* interface_name,
+                                           const gchar* property_name,
+                                           GVariant* value,
+                                           GError** error,
+                                           gpointer user_data);
+static void _dbus_unit_set_name (Unit* self,
+                          GVariant* _value);
+static void _unit_unregister_object (gpointer user_data);
+VALA_EXTERN void client_exit (GPid pid,
+                  gint status);
+static void _vala_main (void);
+static guint _variant_get1 (GVariant* value);
+static void _client_exit_gchild_watch_func (GPid pid,
+                                     gint wait_status,
+                                     gpointer self);
+static void _vala_array_destroy (gpointer array,
+                          gssize array_length,
+                          GDestroyNotify destroy_func);
+static void _vala_array_free (gpointer array,
+                       gssize array_length,
+                       GDestroyNotify destroy_func);
+
+static const GDBusArgInfo _manager_dbus_arg_info_get_unit_name = {-1, "name", "s", NULL};
+static const GDBusArgInfo _manager_dbus_arg_info_get_unit_result = {-1, "result", "o", NULL};
+static const GDBusArgInfo * const _manager_dbus_arg_info_get_unit_in[] = {&_manager_dbus_arg_info_get_unit_name, NULL};
+static const GDBusArgInfo * const _manager_dbus_arg_info_get_unit_out[] = {&_manager_dbus_arg_info_get_unit_result, NULL};
+static const GDBusMethodInfo _manager_dbus_method_info_get_unit = {-1, "GetUnit", (GDBusArgInfo **) (&_manager_dbus_arg_info_get_unit_in), (GDBusArgInfo **) (&_manager_dbus_arg_info_get_unit_out), NULL};
+static const GDBusMethodInfo * const _manager_dbus_method_info[] = {&_manager_dbus_method_info_get_unit, NULL};
+static const GDBusSignalInfo * const _manager_dbus_signal_info[] = {NULL};
+static const GDBusPropertyInfo * const _manager_dbus_property_info[] = {NULL};
+static const GDBusInterfaceInfo _manager_dbus_interface_info = {-1, "org.example.Test.Manager", (GDBusMethodInfo **) (&_manager_dbus_method_info), (GDBusSignalInfo **) (&_manager_dbus_signal_info), (GDBusPropertyInfo **) (&_manager_dbus_property_info), NULL};
+static const GDBusInterfaceVTable _manager_dbus_interface_vtable = {manager_dbus_interface_method_call, manager_dbus_interface_get_property, manager_dbus_interface_set_property};
+static const GDBusMethodInfo * const _unit_dbus_method_info[] = {NULL};
+static const GDBusSignalInfo * const _unit_dbus_signal_info[] = {NULL};
+static const GDBusPropertyInfo _unit_dbus_property_info_name = {-1, "Name", "s", G_DBUS_PROPERTY_INFO_FLAGS_READABLE | G_DBUS_PROPERTY_INFO_FLAGS_WRITABLE, NULL};
+static const GDBusPropertyInfo * const _unit_dbus_property_info[] = {&_unit_dbus_property_info_name, NULL};
+static const GDBusInterfaceInfo _unit_dbus_interface_info = {-1, "org.example.Test.Unit", (GDBusMethodInfo **) (&_unit_dbus_method_info), (GDBusSignalInfo **) (&_unit_dbus_signal_info), (GDBusPropertyInfo **) (&_unit_dbus_property_info), NULL};
+static const GDBusInterfaceVTable _unit_dbus_interface_vtable = {unit_dbus_interface_method_call, unit_dbus_interface_get_property, unit_dbus_interface_set_property};
+
+static inline gpointer
+manager_get_instance_private (Manager* self)
+{
+       return G_STRUCT_MEMBER_P (self, Manager_private_offset);
+}
+
+static const gchar*
+string_to_string (const gchar* self)
+{
+       const gchar* result;
+       g_return_val_if_fail (self != NULL, NULL);
+       result = self;
+       return result;
+}
+
+char*
+manager_get_unit (Manager* self,
+                  const gchar* name,
+                  GDBusConnection* connection,
+                  GDBusMethodInvocation* invocation)
+{
+       const gchar* my_object_path = NULL;
+       const gchar* _tmp0_;
+       guint unit_id = 0U;
+       guint _tmp1_;
+       gchar* unit_object_path = NULL;
+       const gchar* _tmp2_;
+       gchar* _tmp3_;
+       gchar* _tmp4_;
+       gchar* _tmp5_;
+       gchar* _tmp6_;
+       Unit* unit = NULL;
+       gchar* _tmp7_;
+       Unit* _tmp8_ = NULL;
+       char* _tmp9_;
+       GError* _inner_error0_ = NULL;
+       char* result;
+       g_return_val_if_fail (IS_MANAGER (self), NULL);
+       g_return_val_if_fail (name != NULL, NULL);
+       g_return_val_if_fail (G_TYPE_CHECK_INSTANCE_TYPE (connection, g_dbus_connection_get_type ()), NULL);
+       g_return_val_if_fail (G_TYPE_CHECK_INSTANCE_TYPE (invocation, g_dbus_method_invocation_get_type ()), NULL);
+       _tmp0_ = g_dbus_method_invocation_get_object_path (invocation);
+       my_object_path = _tmp0_;
+       _tmp1_ = self->priv->next_unit_id;
+       self->priv->next_unit_id = _tmp1_ + 1;
+       unit_id = _tmp1_;
+       _tmp2_ = string_to_string (my_object_path);
+       _tmp3_ = g_strdup_printf ("%u", unit_id);
+       _tmp4_ = _tmp3_;
+       _tmp5_ = g_strconcat (_tmp2_, "/", _tmp4_, NULL);
+       _tmp6_ = _tmp5_;
+       _g_free0 (_tmp4_);
+       unit_object_path = _tmp6_;
+       _tmp7_ = g_strdup (name);
+       _tmp8_ = unit_new ();
+       unit_set_name (_tmp8_, _tmp7_);
+       _g_free0 (_tmp7_);
+       unit = _tmp8_;
+       unit_register_object (unit, connection, unit_object_path, &_inner_error0_);
+       if (G_UNLIKELY (_inner_error0_ != NULL)) {
+               _g_object_unref0 (unit);
+               _g_free0 (unit_object_path);
+               g_critical ("file %s: line %d: uncaught error: %s (%s, %d)", __FILE__, __LINE__, _inner_error0_->message, g_quark_to_string (_inner_error0_->domain), _inner_error0_->code);
+               g_clear_error (&_inner_error0_);
+               return NULL;
+       }
+       _tmp9_ = g_strdup (unit_object_path);
+       result = _tmp9_;
+       _g_object_unref0 (unit);
+       _g_free0 (unit_object_path);
+       return result;
+}
+
+Manager*
+manager_construct (GType object_type)
+{
+       Manager * self = NULL;
+       self = (Manager*) g_object_new (object_type, NULL);
+       return self;
+}
+
+Manager*
+manager_new (void)
+{
+       return manager_construct (TYPE_MANAGER);
+}
+
+static void
+manager_class_init (ManagerClass * klass,
+                    gpointer klass_data)
+{
+       manager_parent_class = g_type_class_peek_parent (klass);
+       g_type_class_adjust_private_offset (klass, &Manager_private_offset);
+       G_OBJECT_CLASS (klass)->finalize = manager_finalize;
+}
+
+static void
+manager_instance_init (Manager * self,
+                       gpointer klass)
+{
+       self->priv = manager_get_instance_private (self);
+       self->priv->next_unit_id = (guint) 0;
+}
+
+static void
+manager_finalize (GObject * obj)
+{
+       Manager * self;
+       self = G_TYPE_CHECK_INSTANCE_CAST (obj, TYPE_MANAGER, Manager);
+       G_OBJECT_CLASS (manager_parent_class)->finalize (obj);
+}
+
+static GType
+manager_get_type_once (void)
+{
+       static const GTypeInfo g_define_type_info = { sizeof (ManagerClass), (GBaseInitFunc) NULL, (GBaseFinalizeFunc) NULL, (GClassInitFunc) manager_class_init, (GClassFinalizeFunc) NULL, NULL, sizeof (Manager), 0, (GInstanceInitFunc) manager_instance_init, NULL };
+       GType manager_type_id;
+       manager_type_id = g_type_register_static (G_TYPE_OBJECT, "Manager", &g_define_type_info, 0);
+       g_type_set_qdata (manager_type_id, g_quark_from_static_string ("vala-dbus-register-object"), (void*) manager_register_object);
+       Manager_private_offset = g_type_add_instance_private (manager_type_id, sizeof (ManagerPrivate));
+       return manager_type_id;
+}
+
+GType
+manager_get_type (void)
+{
+       static volatile gsize manager_type_id__once = 0;
+       if (g_once_init_enter (&manager_type_id__once)) {
+               GType manager_type_id;
+               manager_type_id = manager_get_type_once ();
+               g_once_init_leave (&manager_type_id__once, manager_type_id);
+       }
+       return manager_type_id__once;
+}
+
+static void
+_dbus_manager_get_unit (Manager* self,
+                        GVariant* _parameters_,
+                        GDBusMethodInvocation* invocation)
+{
+       GError* error = NULL;
+       GVariantIter _arguments_iter;
+       gchar* name = NULL;
+       GVariant* _tmp0_;
+       GDBusMessage* _reply_message = NULL;
+       GVariant* _reply;
+       GVariantBuilder _reply_builder;
+       char* result;
+       g_variant_iter_init (&_arguments_iter, _parameters_);
+       _tmp0_ = g_variant_iter_next_value (&_arguments_iter);
+       name = g_variant_dup_string (_tmp0_, NULL);
+       g_variant_unref (_tmp0_);
+       result = manager_get_unit (self, name, g_dbus_method_invocation_get_connection (invocation), invocation);
+       _reply_message = g_dbus_message_new_method_reply (g_dbus_method_invocation_get_message (invocation));
+       g_variant_builder_init (&_reply_builder, G_VARIANT_TYPE_TUPLE);
+       g_variant_builder_add_value (&_reply_builder, g_variant_new_object_path (result));
+       _g_free0 (result);
+       _reply = g_variant_builder_end (&_reply_builder);
+       g_dbus_message_set_body (_reply_message, _reply);
+       g_dbus_connection_send_message (g_dbus_method_invocation_get_connection (invocation), _reply_message, G_DBUS_SEND_MESSAGE_FLAGS_NONE, NULL, NULL);
+       g_object_unref (invocation);
+       g_object_unref (_reply_message);
+       _g_free0 (name);
+}
+
+static void
+manager_dbus_interface_method_call (GDBusConnection* connection,
+                                    const gchar* sender,
+                                    const gchar* object_path,
+                                    const gchar* interface_name,
+                                    const gchar* method_name,
+                                    GVariant* parameters,
+                                    GDBusMethodInvocation* invocation,
+                                    gpointer user_data)
+{
+       gpointer* data;
+       gpointer object;
+       data = user_data;
+       object = data[0];
+       if (strcmp (method_name, "GetUnit") == 0) {
+               _dbus_manager_get_unit (object, parameters, invocation);
+       } else {
+               g_object_unref (invocation);
+       }
+}
+
+static GVariant*
+manager_dbus_interface_get_property (GDBusConnection* connection,
+                                     const gchar* sender,
+                                     const gchar* object_path,
+                                     const gchar* interface_name,
+                                     const gchar* property_name,
+                                     GError** error,
+                                     gpointer user_data)
+{
+       return NULL;
+}
+
+static gboolean
+manager_dbus_interface_set_property (GDBusConnection* connection,
+                                     const gchar* sender,
+                                     const gchar* object_path,
+                                     const gchar* interface_name,
+                                     const gchar* property_name,
+                                     GVariant* value,
+                                     GError** error,
+                                     gpointer user_data)
+{
+       return FALSE;
+}
+
+guint
+manager_register_object (gpointer object,
+                         GDBusConnection* connection,
+                         const gchar* path,
+                         GError** error)
+{
+       guint result;
+       gpointer *data;
+       data = g_new (gpointer, 3);
+       data[0] = g_object_ref (object);
+       data[1] = g_object_ref (connection);
+       data[2] = g_strdup (path);
+       result = g_dbus_connection_register_object (connection, path, (GDBusInterfaceInfo *) (&_manager_dbus_interface_info), &_manager_dbus_interface_vtable, data, _manager_unregister_object, error);
+       if (!result) {
+               return 0;
+       }
+       return result;
+}
+
+static void
+_manager_unregister_object (gpointer user_data)
+{
+       gpointer* data;
+       data = user_data;
+       g_object_unref (data[0]);
+       g_object_unref (data[1]);
+       g_free (data[2]);
+       g_free (data);
+}
+
+static inline gpointer
+unit_get_instance_private (Unit* self)
+{
+       return G_STRUCT_MEMBER_P (self, Unit_private_offset);
+}
+
+Unit*
+unit_construct (GType object_type)
+{
+       Unit * self = NULL;
+       self = (Unit*) g_object_new (object_type, NULL);
+       return self;
+}
+
+Unit*
+unit_new (void)
+{
+       return unit_construct (TYPE_UNIT);
+}
+
+const gchar*
+unit_get_name (Unit* self)
+{
+       const gchar* result;
+       const gchar* _tmp0_;
+       g_return_val_if_fail (IS_UNIT (self), NULL);
+       _tmp0_ = self->priv->_name;
+       result = _tmp0_;
+       return result;
+}
+
+void
+unit_set_name (Unit* self,
+               const gchar* value)
+{
+       gchar* old_value;
+       g_return_if_fail (IS_UNIT (self));
+       old_value = unit_get_name (self);
+       if (g_strcmp0 (value, old_value) != 0) {
+               gchar* _tmp0_;
+               _tmp0_ = g_strdup (value);
+               _g_free0 (self->priv->_name);
+               self->priv->_name = _tmp0_;
+               g_object_notify_by_pspec ((GObject *) self, unit_properties[UNIT_NAME_PROPERTY]);
+       }
+}
+
+static void
+unit_class_init (UnitClass * klass,
+                 gpointer klass_data)
+{
+       unit_parent_class = g_type_class_peek_parent (klass);
+       g_type_class_adjust_private_offset (klass, &Unit_private_offset);
+       G_OBJECT_CLASS (klass)->get_property = _vala_unit_get_property;
+       G_OBJECT_CLASS (klass)->set_property = _vala_unit_set_property;
+       G_OBJECT_CLASS (klass)->finalize = unit_finalize;
+       g_object_class_install_property (G_OBJECT_CLASS (klass), UNIT_NAME_PROPERTY, unit_properties[UNIT_NAME_PROPERTY] = g_param_spec_string ("name", "name", "name", NULL, G_PARAM_STATIC_STRINGS | G_PARAM_READABLE | G_PARAM_WRITABLE | G_PARAM_CONSTRUCT));
+}
+
+static void
+unit_instance_init (Unit * self,
+                    gpointer klass)
+{
+       self->priv = unit_get_instance_private (self);
+}
+
+static void
+unit_finalize (GObject * obj)
+{
+       Unit * self;
+       self = G_TYPE_CHECK_INSTANCE_CAST (obj, TYPE_UNIT, Unit);
+       _g_free0 (self->priv->_name);
+       G_OBJECT_CLASS (unit_parent_class)->finalize (obj);
+}
+
+static GType
+unit_get_type_once (void)
+{
+       static const GTypeInfo g_define_type_info = { sizeof (UnitClass), (GBaseInitFunc) NULL, (GBaseFinalizeFunc) NULL, (GClassInitFunc) unit_class_init, (GClassFinalizeFunc) NULL, NULL, sizeof (Unit), 0, (GInstanceInitFunc) unit_instance_init, NULL };
+       GType unit_type_id;
+       unit_type_id = g_type_register_static (G_TYPE_OBJECT, "Unit", &g_define_type_info, 0);
+       g_type_set_qdata (unit_type_id, g_quark_from_static_string ("vala-dbus-register-object"), (void*) unit_register_object);
+       Unit_private_offset = g_type_add_instance_private (unit_type_id, sizeof (UnitPrivate));
+       return unit_type_id;
+}
+
+GType
+unit_get_type (void)
+{
+       static volatile gsize unit_type_id__once = 0;
+       if (g_once_init_enter (&unit_type_id__once)) {
+               GType unit_type_id;
+               unit_type_id = unit_get_type_once ();
+               g_once_init_leave (&unit_type_id__once, unit_type_id);
+       }
+       return unit_type_id__once;
+}
+
+static void
+_vala_unit_get_property (GObject * object,
+                         guint property_id,
+                         GValue * value,
+                         GParamSpec * pspec)
+{
+       Unit * self;
+       self = G_TYPE_CHECK_INSTANCE_CAST (object, TYPE_UNIT, Unit);
+       switch (property_id) {
+               case UNIT_NAME_PROPERTY:
+               g_value_set_string (value, unit_get_name (self));
+               break;
+               default:
+               G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
+               break;
+       }
+}
+
+static void
+_vala_unit_set_property (GObject * object,
+                         guint property_id,
+                         const GValue * value,
+                         GParamSpec * pspec)
+{
+       Unit * self;
+       self = G_TYPE_CHECK_INSTANCE_CAST (object, TYPE_UNIT, Unit);
+       switch (property_id) {
+               case UNIT_NAME_PROPERTY:
+               unit_set_name (self, g_value_get_string (value));
+               break;
+               default:
+               G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
+               break;
+       }
+}
+
+static void
+unit_dbus_interface_method_call (GDBusConnection* connection,
+                                 const gchar* sender,
+                                 const gchar* object_path,
+                                 const gchar* interface_name,
+                                 const gchar* method_name,
+                                 GVariant* parameters,
+                                 GDBusMethodInvocation* invocation,
+                                 gpointer user_data)
+{
+       g_object_unref (invocation);
+}
+
+static GVariant*
+_dbus_unit_get_name (Unit* self)
+{
+       const gchar* result;
+       GVariant* _reply;
+       result = unit_get_name (self);
+       _reply = g_variant_new_string (result);
+       return _reply;
+}
+
+static GVariant*
+unit_dbus_interface_get_property (GDBusConnection* connection,
+                                  const gchar* sender,
+                                  const gchar* object_path,
+                                  const gchar* interface_name,
+                                  const gchar* property_name,
+                                  GError** error,
+                                  gpointer user_data)
+{
+       gpointer* data;
+       gpointer object;
+       data = user_data;
+       object = data[0];
+       if (strcmp (property_name, "Name") == 0) {
+               return _dbus_unit_get_name (object);
+       }
+       return NULL;
+}
+
+static void
+_dbus_unit_set_name (Unit* self,
+                     GVariant* _value)
+{
+       gchar* value = NULL;
+       value = g_variant_dup_string (_value, NULL);
+       unit_set_name (self, value);
+       _g_free0 (value);
+}
+
+static gboolean
+unit_dbus_interface_set_property (GDBusConnection* connection,
+                                  const gchar* sender,
+                                  const gchar* object_path,
+                                  const gchar* interface_name,
+                                  const gchar* property_name,
+                                  GVariant* value,
+                                  GError** error,
+                                  gpointer user_data)
+{
+       gpointer* data;
+       gpointer object;
+       data = user_data;
+       object = data[0];
+       if (strcmp (property_name, "Name") == 0) {
+               _dbus_unit_set_name (object, value);
+               return TRUE;
+       }
+       return FALSE;
+}
+
+guint
+unit_register_object (gpointer object,
+                      GDBusConnection* connection,
+                      const gchar* path,
+                      GError** error)
+{
+       guint result;
+       gpointer *data;
+       data = g_new (gpointer, 3);
+       data[0] = g_object_ref (object);
+       data[1] = g_object_ref (connection);
+       data[2] = g_strdup (path);
+       result = g_dbus_connection_register_object (connection, path, (GDBusInterfaceInfo *) (&_unit_dbus_interface_info), &_unit_dbus_interface_vtable, data, _unit_unregister_object, error);
+       if (!result) {
+               return 0;
+       }
+       return result;
+}
+
+static void
+_unit_unregister_object (gpointer user_data)
+{
+       gpointer* data;
+       data = user_data;
+       g_object_unref (data[0]);
+       g_object_unref (data[1]);
+       g_free (data[2]);
+       g_free (data);
+}
+
+void
+client_exit (GPid pid,
+             gint status)
+{
+       GMainLoop* _tmp0_;
+       _vala_assert (status == 0, "status == 0");
+       _tmp0_ = main_loop;
+       g_main_loop_quit (_tmp0_);
+}
+
+static guint
+_variant_get1 (GVariant* value)
+{
+       return g_variant_get_uint32 (value);
+}
+
+static void
+_client_exit_gchild_watch_func (GPid pid,
+                                gint wait_status,
+                                gpointer self)
+{
+       client_exit (pid, wait_status);
+}
+
+static void
+_vala_main (void)
+{
+       GDBusConnection* conn = NULL;
+       GDBusConnection* _tmp0_;
+       GDBusConnection* _tmp1_;
+       Manager* _tmp2_;
+       Manager* _tmp3_;
+       GVariant* request_result = NULL;
+       GDBusConnection* _tmp4_;
+       GVariant* _tmp5_;
+       GVariant* _tmp6_;
+       GVariant* _tmp7_;
+       GVariant* _tmp8_;
+       GVariant* _tmp9_;
+       GVariant* _tmp10_;
+       GVariant* _tmp11_;
+       guint _tmp12_;
+       GPid client_pid = 0;
+       gchar* _tmp13_;
+       gchar** _tmp14_;
+       gchar** _tmp15_;
+       gint _tmp15__length1;
+       GPid _tmp16_ = 0;
+       GMainLoop* _tmp17_;
+       GMainLoop* _tmp18_;
+       GError* _inner_error0_ = NULL;
+       _tmp0_ = g_bus_get_sync (G_BUS_TYPE_SESSION, NULL, &_inner_error0_);
+       conn = _tmp0_;
+       if (G_UNLIKELY (_inner_error0_ != NULL)) {
+               g_critical ("file %s: line %d: uncaught error: %s (%s, %d)", __FILE__, __LINE__, _inner_error0_->message, g_quark_to_string (_inner_error0_->domain), _inner_error0_->code);
+               g_clear_error (&_inner_error0_);
+               return;
+       }
+       _tmp1_ = conn;
+       _tmp2_ = manager_new ();
+       _tmp3_ = _tmp2_;
+       manager_register_object (_tmp3_, _tmp1_, "/org/example/test/Manager", &_inner_error0_);
+       _g_object_unref0 (_tmp3_);
+       if (G_UNLIKELY (_inner_error0_ != NULL)) {
+               _g_object_unref0 (conn);
+               g_critical ("file %s: line %d: uncaught error: %s (%s, %d)", __FILE__, __LINE__, _inner_error0_->message, g_quark_to_string (_inner_error0_->domain), _inner_error0_->code);
+               g_clear_error (&_inner_error0_);
+               return;
+       }
+       _tmp4_ = conn;
+       _tmp5_ = g_variant_new ("(su)", "org.example.Test", 0x4, NULL);
+       g_variant_ref_sink (_tmp5_);
+       _tmp6_ = _tmp5_;
+       _tmp7_ = g_dbus_connection_call_sync (_tmp4_, "org.freedesktop.DBus", "/org/freedesktop/DBus", "org.freedesktop.DBus", "RequestName", _tmp6_, NULL, 0, -1, NULL, &_inner_error0_);
+       _tmp8_ = _tmp7_;
+       _g_variant_unref0 (_tmp6_);
+       request_result = _tmp8_;
+       if (G_UNLIKELY (_inner_error0_ != NULL)) {
+               _g_object_unref0 (conn);
+               g_critical ("file %s: line %d: uncaught error: %s (%s, %d)", __FILE__, __LINE__, _inner_error0_->message, g_quark_to_string (_inner_error0_->domain), _inner_error0_->code);
+               g_clear_error (&_inner_error0_);
+               return;
+       }
+       _tmp9_ = request_result;
+       _tmp10_ = g_variant_get_child_value (_tmp9_, (gsize) 0);
+       _tmp11_ = _tmp10_;
+       _tmp12_ = _variant_get1 (_tmp11_);
+       _vala_assert (_tmp12_ == ((guint) 1), "(uint) request_result.get_child_value (0) == 1");
+       _g_variant_unref0 (_tmp11_);
+       _tmp13_ = g_strdup ("dbus_special_parameters_2_client");
+       _tmp14_ = g_new0 (gchar*, 1 + 1);
+       _tmp14_[0] = _tmp13_;
+       _tmp15_ = _tmp14_;
+       _tmp15__length1 = 1;
+       g_spawn_async (NULL, _tmp15_, NULL, G_SPAWN_DO_NOT_REAP_CHILD, NULL, NULL, &_tmp16_, &_inner_error0_);
+       client_pid = _tmp16_;
+       _tmp15_ = (_vala_array_free (_tmp15_, _tmp15__length1, (GDestroyNotify) g_free), NULL);
+       if (G_UNLIKELY (_inner_error0_ != NULL)) {
+               _g_variant_unref0 (request_result);
+               _g_object_unref0 (conn);
+               g_critical ("file %s: line %d: uncaught error: %s (%s, %d)", __FILE__, __LINE__, _inner_error0_->message, g_quark_to_string (_inner_error0_->domain), _inner_error0_->code);
+               g_clear_error (&_inner_error0_);
+               return;
+       }
+       g_child_watch_add_full (G_PRIORITY_DEFAULT_IDLE, client_pid, _client_exit_gchild_watch_func, NULL, NULL);
+       _tmp17_ = g_main_loop_new (NULL, FALSE);
+       _g_main_loop_unref0 (main_loop);
+       main_loop = _tmp17_;
+       _tmp18_ = main_loop;
+       g_main_loop_run (_tmp18_);
+       _g_variant_unref0 (request_result);
+       _g_object_unref0 (conn);
+}
+
+int
+main (int argc,
+      char ** argv)
+{
+       _vala_main ();
+       return 0;
+}
+
+static void
+_vala_array_destroy (gpointer array,
+                     gssize array_length,
+                     GDestroyNotify destroy_func)
+{
+       if ((array != NULL) && (destroy_func != NULL)) {
+               gssize i;
+               for (i = 0; i < array_length; i = i + 1) {
+                       if (((gpointer*) array)[i] != NULL) {
+                               destroy_func (((gpointer*) array)[i]);
+                       }
+               }
+       }
+}
+
+static void
+_vala_array_free (gpointer array,
+                  gssize array_length,
+                  GDestroyNotify destroy_func)
+{
+       _vala_array_destroy (array, array_length, destroy_func);
+       g_free (array);
+}
+