/*
 * Generated by gdbus-codegen 2.49.4. DO NOT EDIT.
 *
 * The license of this code is the same as for the source it was derived from.
 */

#ifdef HAVE_CONFIG_H
#  include "config.h"
#endif

#include "gdbus-daemon-generated.h"

#include <string.h>
#ifdef G_OS_UNIX
#  include <gio/gunixfdlist.h>
#endif

typedef struct
{
  GDBusArgInfo parent_struct;
  gboolean use_gvariant;
} _ExtendedGDBusArgInfo;

typedef struct
{
  GDBusMethodInfo parent_struct;
  const gchar *signal_name;
  gboolean pass_fdlist;
} _ExtendedGDBusMethodInfo;

typedef struct
{
  GDBusSignalInfo parent_struct;
  const gchar *signal_name;
} _ExtendedGDBusSignalInfo;

typedef struct
{
  GDBusPropertyInfo parent_struct;
  const gchar *hyphen_name;
  gboolean use_gvariant;
} _ExtendedGDBusPropertyInfo;

typedef struct
{
  GDBusInterfaceInfo parent_struct;
  const gchar *hyphen_name;
} _ExtendedGDBusInterfaceInfo;

typedef struct
{
  const _ExtendedGDBusPropertyInfo *info;
  guint prop_id;
  GValue orig_value; /* the value before the change */
} ChangedProperty;

static void
_changed_property_free (ChangedProperty *data)
{
  g_value_unset (&data->orig_value);
  g_free (data);
}

static gboolean
_g_strv_equal0 (gchar **a, gchar **b)
{
  gboolean ret = FALSE;
  guint n;
  if (a == NULL && b == NULL)
    {
      ret = TRUE;
      goto out;
    }
  if (a == NULL || b == NULL)
    goto out;
  if (g_strv_length (a) != g_strv_length (b))
    goto out;
  for (n = 0; a[n] != NULL; n++)
    if (g_strcmp0 (a[n], b[n]) != 0)
      goto out;
  ret = TRUE;
out:
  return ret;
}

static gboolean
_g_variant_equal0 (GVariant *a, GVariant *b)
{
  gboolean ret = FALSE;
  if (a == NULL && b == NULL)
    {
      ret = TRUE;
      goto out;
    }
  if (a == NULL || b == NULL)
    goto out;
  ret = g_variant_equal (a, b);
out:
  return ret;
}

G_GNUC_UNUSED static gboolean
_g_value_equal (const GValue *a, const GValue *b)
{
  gboolean ret = FALSE;
  g_assert (G_VALUE_TYPE (a) == G_VALUE_TYPE (b));
  switch (G_VALUE_TYPE (a))
    {
      case G_TYPE_BOOLEAN:
        ret = (g_value_get_boolean (a) == g_value_get_boolean (b));
        break;
      case G_TYPE_UCHAR:
        ret = (g_value_get_uchar (a) == g_value_get_uchar (b));
        break;
      case G_TYPE_INT:
        ret = (g_value_get_int (a) == g_value_get_int (b));
        break;
      case G_TYPE_UINT:
        ret = (g_value_get_uint (a) == g_value_get_uint (b));
        break;
      case G_TYPE_INT64:
        ret = (g_value_get_int64 (a) == g_value_get_int64 (b));
        break;
      case G_TYPE_UINT64:
        ret = (g_value_get_uint64 (a) == g_value_get_uint64 (b));
        break;
      case G_TYPE_DOUBLE:
        {
          /* Avoid -Wfloat-equal warnings by doing a direct bit compare */
          gdouble da = g_value_get_double (a);
          gdouble db = g_value_get_double (b);
          ret = memcmp (&da, &db, sizeof (gdouble)) == 0;
        }
        break;
      case G_TYPE_STRING:
        ret = (g_strcmp0 (g_value_get_string (a), g_value_get_string (b)) == 0);
        break;
      case G_TYPE_VARIANT:
        ret = _g_variant_equal0 (g_value_get_variant (a), g_value_get_variant (b));
        break;
      default:
        if (G_VALUE_TYPE (a) == G_TYPE_STRV)
          ret = _g_strv_equal0 (g_value_get_boxed (a), g_value_get_boxed (b));
        else
          g_critical ("_g_value_equal() does not handle type %s", g_type_name (G_VALUE_TYPE (a)));
        break;
    }
  return ret;
}

/* ------------------------------------------------------------------------
 * Code for interface org.freedesktop.DBus
 * ------------------------------------------------------------------------
 */

/**
 * SECTION:_GFreedesktopDBus
 * @title: _GFreedesktopDBus
 * @short_description: Generated C code for the org.freedesktop.DBus D-Bus interface
 *
 * This section contains code for working with the <link linkend="gdbus-interface-org-freedesktop-DBus.top_of_page">org.freedesktop.DBus</link> D-Bus interface in C.
 */

/* ---- Introspection data for org.freedesktop.DBus ---- */

static const _ExtendedGDBusArgInfo __g_freedesktop_dbus_method_info_hello_OUT_ARG_assigned_name =
{
  {
    -1,
    (gchar *) "assigned_name",
    (gchar *) "s",
    NULL
  },
  FALSE
};

static const _ExtendedGDBusArgInfo * const __g_freedesktop_dbus_method_info_hello_OUT_ARG_pointers[] =
{
  &__g_freedesktop_dbus_method_info_hello_OUT_ARG_assigned_name,
  NULL
};

static const _ExtendedGDBusMethodInfo __g_freedesktop_dbus_method_info_hello =
{
  {
    -1,
    (gchar *) "Hello",
    NULL,
    (GDBusArgInfo **) &__g_freedesktop_dbus_method_info_hello_OUT_ARG_pointers,
    NULL
  },
  "handle-hello",
  FALSE
};

static const _ExtendedGDBusArgInfo __g_freedesktop_dbus_method_info_request_name_IN_ARG_name =
{
  {
    -1,
    (gchar *) "name",
    (gchar *) "s",
    NULL
  },
  FALSE
};

static const _ExtendedGDBusArgInfo __g_freedesktop_dbus_method_info_request_name_IN_ARG_flags =
{
  {
    -1,
    (gchar *) "flags",
    (gchar *) "u",
    NULL
  },
  FALSE
};

static const _ExtendedGDBusArgInfo * const __g_freedesktop_dbus_method_info_request_name_IN_ARG_pointers[] =
{
  &__g_freedesktop_dbus_method_info_request_name_IN_ARG_name,
  &__g_freedesktop_dbus_method_info_request_name_IN_ARG_flags,
  NULL
};

static const _ExtendedGDBusArgInfo __g_freedesktop_dbus_method_info_request_name_OUT_ARG_value =
{
  {
    -1,
    (gchar *) "value",
    (gchar *) "u",
    NULL
  },
  FALSE
};

static const _ExtendedGDBusArgInfo * const __g_freedesktop_dbus_method_info_request_name_OUT_ARG_pointers[] =
{
  &__g_freedesktop_dbus_method_info_request_name_OUT_ARG_value,
  NULL
};

static const _ExtendedGDBusMethodInfo __g_freedesktop_dbus_method_info_request_name =
{
  {
    -1,
    (gchar *) "RequestName",
    (GDBusArgInfo **) &__g_freedesktop_dbus_method_info_request_name_IN_ARG_pointers,
    (GDBusArgInfo **) &__g_freedesktop_dbus_method_info_request_name_OUT_ARG_pointers,
    NULL
  },
  "handle-request-name",
  FALSE
};

static const _ExtendedGDBusArgInfo __g_freedesktop_dbus_method_info_release_name_IN_ARG_name =
{
  {
    -1,
    (gchar *) "name",
    (gchar *) "s",
    NULL
  },
  FALSE
};

static const _ExtendedGDBusArgInfo * const __g_freedesktop_dbus_method_info_release_name_IN_ARG_pointers[] =
{
  &__g_freedesktop_dbus_method_info_release_name_IN_ARG_name,
  NULL
};

static const _ExtendedGDBusArgInfo __g_freedesktop_dbus_method_info_release_name_OUT_ARG_value =
{
  {
    -1,
    (gchar *) "value",
    (gchar *) "u",
    NULL
  },
  FALSE
};

static const _ExtendedGDBusArgInfo * const __g_freedesktop_dbus_method_info_release_name_OUT_ARG_pointers[] =
{
  &__g_freedesktop_dbus_method_info_release_name_OUT_ARG_value,
  NULL
};

static const _ExtendedGDBusMethodInfo __g_freedesktop_dbus_method_info_release_name =
{
  {
    -1,
    (gchar *) "ReleaseName",
    (GDBusArgInfo **) &__g_freedesktop_dbus_method_info_release_name_IN_ARG_pointers,
    (GDBusArgInfo **) &__g_freedesktop_dbus_method_info_release_name_OUT_ARG_pointers,
    NULL
  },
  "handle-release-name",
  FALSE
};

static const _ExtendedGDBusArgInfo __g_freedesktop_dbus_method_info_start_service_by_name_IN_ARG_name =
{
  {
    -1,
    (gchar *) "name",
    (gchar *) "s",
    NULL
  },
  FALSE
};

static const _ExtendedGDBusArgInfo __g_freedesktop_dbus_method_info_start_service_by_name_IN_ARG_flags =
{
  {
    -1,
    (gchar *) "flags",
    (gchar *) "u",
    NULL
  },
  FALSE
};

static const _ExtendedGDBusArgInfo * const __g_freedesktop_dbus_method_info_start_service_by_name_IN_ARG_pointers[] =
{
  &__g_freedesktop_dbus_method_info_start_service_by_name_IN_ARG_name,
  &__g_freedesktop_dbus_method_info_start_service_by_name_IN_ARG_flags,
  NULL
};

static const _ExtendedGDBusArgInfo __g_freedesktop_dbus_method_info_start_service_by_name_OUT_ARG_value =
{
  {
    -1,
    (gchar *) "value",
    (gchar *) "u",
    NULL
  },
  FALSE
};

static const _ExtendedGDBusArgInfo * const __g_freedesktop_dbus_method_info_start_service_by_name_OUT_ARG_pointers[] =
{
  &__g_freedesktop_dbus_method_info_start_service_by_name_OUT_ARG_value,
  NULL
};

static const _ExtendedGDBusMethodInfo __g_freedesktop_dbus_method_info_start_service_by_name =
{
  {
    -1,
    (gchar *) "StartServiceByName",
    (GDBusArgInfo **) &__g_freedesktop_dbus_method_info_start_service_by_name_IN_ARG_pointers,
    (GDBusArgInfo **) &__g_freedesktop_dbus_method_info_start_service_by_name_OUT_ARG_pointers,
    NULL
  },
  "handle-start-service-by-name",
  FALSE
};

static const _ExtendedGDBusArgInfo __g_freedesktop_dbus_method_info_name_has_owner_IN_ARG_name =
{
  {
    -1,
    (gchar *) "name",
    (gchar *) "s",
    NULL
  },
  FALSE
};

static const _ExtendedGDBusArgInfo * const __g_freedesktop_dbus_method_info_name_has_owner_IN_ARG_pointers[] =
{
  &__g_freedesktop_dbus_method_info_name_has_owner_IN_ARG_name,
  NULL
};

static const _ExtendedGDBusArgInfo __g_freedesktop_dbus_method_info_name_has_owner_OUT_ARG_has_owner =
{
  {
    -1,
    (gchar *) "has_owner",
    (gchar *) "b",
    NULL
  },
  FALSE
};

static const _ExtendedGDBusArgInfo * const __g_freedesktop_dbus_method_info_name_has_owner_OUT_ARG_pointers[] =
{
  &__g_freedesktop_dbus_method_info_name_has_owner_OUT_ARG_has_owner,
  NULL
};

static const _ExtendedGDBusMethodInfo __g_freedesktop_dbus_method_info_name_has_owner =
{
  {
    -1,
    (gchar *) "NameHasOwner",
    (GDBusArgInfo **) &__g_freedesktop_dbus_method_info_name_has_owner_IN_ARG_pointers,
    (GDBusArgInfo **) &__g_freedesktop_dbus_method_info_name_has_owner_OUT_ARG_pointers,
    NULL
  },
  "handle-name-has-owner",
  FALSE
};

static const _ExtendedGDBusArgInfo __g_freedesktop_dbus_method_info_list_names_OUT_ARG_names =
{
  {
    -1,
    (gchar *) "names",
    (gchar *) "as",
    NULL
  },
  FALSE
};

static const _ExtendedGDBusArgInfo * const __g_freedesktop_dbus_method_info_list_names_OUT_ARG_pointers[] =
{
  &__g_freedesktop_dbus_method_info_list_names_OUT_ARG_names,
  NULL
};

static const _ExtendedGDBusMethodInfo __g_freedesktop_dbus_method_info_list_names =
{
  {
    -1,
    (gchar *) "ListNames",
    NULL,
    (GDBusArgInfo **) &__g_freedesktop_dbus_method_info_list_names_OUT_ARG_pointers,
    NULL
  },
  "handle-list-names",
  FALSE
};

static const _ExtendedGDBusArgInfo __g_freedesktop_dbus_method_info_list_activatable_names_OUT_ARG_activatable_names =
{
  {
    -1,
    (gchar *) "activatable_names",
    (gchar *) "as",
    NULL
  },
  FALSE
};

static const _ExtendedGDBusArgInfo * const __g_freedesktop_dbus_method_info_list_activatable_names_OUT_ARG_pointers[] =
{
  &__g_freedesktop_dbus_method_info_list_activatable_names_OUT_ARG_activatable_names,
  NULL
};

static const _ExtendedGDBusMethodInfo __g_freedesktop_dbus_method_info_list_activatable_names =
{
  {
    -1,
    (gchar *) "ListActivatableNames",
    NULL,
    (GDBusArgInfo **) &__g_freedesktop_dbus_method_info_list_activatable_names_OUT_ARG_pointers,
    NULL
  },
  "handle-list-activatable-names",
  FALSE
};

static const _ExtendedGDBusArgInfo __g_freedesktop_dbus_method_info_add_match_IN_ARG_rule =
{
  {
    -1,
    (gchar *) "rule",
    (gchar *) "s",
    NULL
  },
  FALSE
};

static const _ExtendedGDBusArgInfo * const __g_freedesktop_dbus_method_info_add_match_IN_ARG_pointers[] =
{
  &__g_freedesktop_dbus_method_info_add_match_IN_ARG_rule,
  NULL
};

static const _ExtendedGDBusMethodInfo __g_freedesktop_dbus_method_info_add_match =
{
  {
    -1,
    (gchar *) "AddMatch",
    (GDBusArgInfo **) &__g_freedesktop_dbus_method_info_add_match_IN_ARG_pointers,
    NULL,
    NULL
  },
  "handle-add-match",
  FALSE
};

static const _ExtendedGDBusArgInfo __g_freedesktop_dbus_method_info_remove_match_IN_ARG_rule =
{
  {
    -1,
    (gchar *) "rule",
    (gchar *) "s",
    NULL
  },
  FALSE
};

static const _ExtendedGDBusArgInfo * const __g_freedesktop_dbus_method_info_remove_match_IN_ARG_pointers[] =
{
  &__g_freedesktop_dbus_method_info_remove_match_IN_ARG_rule,
  NULL
};

static const _ExtendedGDBusMethodInfo __g_freedesktop_dbus_method_info_remove_match =
{
  {
    -1,
    (gchar *) "RemoveMatch",
    (GDBusArgInfo **) &__g_freedesktop_dbus_method_info_remove_match_IN_ARG_pointers,
    NULL,
    NULL
  },
  "handle-remove-match",
  FALSE
};

static const _ExtendedGDBusArgInfo __g_freedesktop_dbus_method_info_get_name_owner_IN_ARG_name =
{
  {
    -1,
    (gchar *) "name",
    (gchar *) "s",
    NULL
  },
  FALSE
};

static const _ExtendedGDBusArgInfo * const __g_freedesktop_dbus_method_info_get_name_owner_IN_ARG_pointers[] =
{
  &__g_freedesktop_dbus_method_info_get_name_owner_IN_ARG_name,
  NULL
};

static const _ExtendedGDBusArgInfo __g_freedesktop_dbus_method_info_get_name_owner_OUT_ARG_unique_name =
{
  {
    -1,
    (gchar *) "unique_name",
    (gchar *) "s",
    NULL
  },
  FALSE
};

static const _ExtendedGDBusArgInfo * const __g_freedesktop_dbus_method_info_get_name_owner_OUT_ARG_pointers[] =
{
  &__g_freedesktop_dbus_method_info_get_name_owner_OUT_ARG_unique_name,
  NULL
};

static const _ExtendedGDBusMethodInfo __g_freedesktop_dbus_method_info_get_name_owner =
{
  {
    -1,
    (gchar *) "GetNameOwner",
    (GDBusArgInfo **) &__g_freedesktop_dbus_method_info_get_name_owner_IN_ARG_pointers,
    (GDBusArgInfo **) &__g_freedesktop_dbus_method_info_get_name_owner_OUT_ARG_pointers,
    NULL
  },
  "handle-get-name-owner",
  FALSE
};

static const _ExtendedGDBusArgInfo __g_freedesktop_dbus_method_info_list_queued_owners_IN_ARG_name =
{
  {
    -1,
    (gchar *) "name",
    (gchar *) "s",
    NULL
  },
  FALSE
};

static const _ExtendedGDBusArgInfo * const __g_freedesktop_dbus_method_info_list_queued_owners_IN_ARG_pointers[] =
{
  &__g_freedesktop_dbus_method_info_list_queued_owners_IN_ARG_name,
  NULL
};

static const _ExtendedGDBusArgInfo __g_freedesktop_dbus_method_info_list_queued_owners_OUT_ARG_queued_owners =
{
  {
    -1,
    (gchar *) "queued_owners",
    (gchar *) "as",
    NULL
  },
  FALSE
};

static const _ExtendedGDBusArgInfo * const __g_freedesktop_dbus_method_info_list_queued_owners_OUT_ARG_pointers[] =
{
  &__g_freedesktop_dbus_method_info_list_queued_owners_OUT_ARG_queued_owners,
  NULL
};

static const _ExtendedGDBusMethodInfo __g_freedesktop_dbus_method_info_list_queued_owners =
{
  {
    -1,
    (gchar *) "ListQueuedOwners",
    (GDBusArgInfo **) &__g_freedesktop_dbus_method_info_list_queued_owners_IN_ARG_pointers,
    (GDBusArgInfo **) &__g_freedesktop_dbus_method_info_list_queued_owners_OUT_ARG_pointers,
    NULL
  },
  "handle-list-queued-owners",
  FALSE
};

static const _ExtendedGDBusArgInfo __g_freedesktop_dbus_method_info_get_connection_unix_user_IN_ARG_name =
{
  {
    -1,
    (gchar *) "name",
    (gchar *) "s",
    NULL
  },
  FALSE
};

static const _ExtendedGDBusArgInfo * const __g_freedesktop_dbus_method_info_get_connection_unix_user_IN_ARG_pointers[] =
{
  &__g_freedesktop_dbus_method_info_get_connection_unix_user_IN_ARG_name,
  NULL
};

static const _ExtendedGDBusArgInfo __g_freedesktop_dbus_method_info_get_connection_unix_user_OUT_ARG_uid =
{
  {
    -1,
    (gchar *) "uid",
    (gchar *) "u",
    NULL
  },
  FALSE
};

static const _ExtendedGDBusArgInfo * const __g_freedesktop_dbus_method_info_get_connection_unix_user_OUT_ARG_pointers[] =
{
  &__g_freedesktop_dbus_method_info_get_connection_unix_user_OUT_ARG_uid,
  NULL
};

static const _ExtendedGDBusMethodInfo __g_freedesktop_dbus_method_info_get_connection_unix_user =
{
  {
    -1,
    (gchar *) "GetConnectionUnixUser",
    (GDBusArgInfo **) &__g_freedesktop_dbus_method_info_get_connection_unix_user_IN_ARG_pointers,
    (GDBusArgInfo **) &__g_freedesktop_dbus_method_info_get_connection_unix_user_OUT_ARG_pointers,
    NULL
  },
  "handle-get-connection-unix-user",
  FALSE
};

static const _ExtendedGDBusArgInfo __g_freedesktop_dbus_method_info_get_connection_unix_process_id_IN_ARG_name =
{
  {
    -1,
    (gchar *) "name",
    (gchar *) "s",
    NULL
  },
  FALSE
};

static const _ExtendedGDBusArgInfo * const __g_freedesktop_dbus_method_info_get_connection_unix_process_id_IN_ARG_pointers[] =
{
  &__g_freedesktop_dbus_method_info_get_connection_unix_process_id_IN_ARG_name,
  NULL
};

static const _ExtendedGDBusArgInfo __g_freedesktop_dbus_method_info_get_connection_unix_process_id_OUT_ARG_pid =
{
  {
    -1,
    (gchar *) "pid",
    (gchar *) "u",
    NULL
  },
  FALSE
};

static const _ExtendedGDBusArgInfo * const __g_freedesktop_dbus_method_info_get_connection_unix_process_id_OUT_ARG_pointers[] =
{
  &__g_freedesktop_dbus_method_info_get_connection_unix_process_id_OUT_ARG_pid,
  NULL
};

static const _ExtendedGDBusMethodInfo __g_freedesktop_dbus_method_info_get_connection_unix_process_id =
{
  {
    -1,
    (gchar *) "GetConnectionUnixProcessID",
    (GDBusArgInfo **) &__g_freedesktop_dbus_method_info_get_connection_unix_process_id_IN_ARG_pointers,
    (GDBusArgInfo **) &__g_freedesktop_dbus_method_info_get_connection_unix_process_id_OUT_ARG_pointers,
    NULL
  },
  "handle-get-connection-unix-process-id",
  FALSE
};

static const _ExtendedGDBusArgInfo __g_freedesktop_dbus_method_info_get_connection_selinux_security_context_IN_ARG_name =
{
  {
    -1,
    (gchar *) "name",
    (gchar *) "s",
    NULL
  },
  FALSE
};

static const _ExtendedGDBusArgInfo * const __g_freedesktop_dbus_method_info_get_connection_selinux_security_context_IN_ARG_pointers[] =
{
  &__g_freedesktop_dbus_method_info_get_connection_selinux_security_context_IN_ARG_name,
  NULL
};

static const _ExtendedGDBusArgInfo __g_freedesktop_dbus_method_info_get_connection_selinux_security_context_OUT_ARG_security_context =
{
  {
    -1,
    (gchar *) "security_context",
    (gchar *) "ay",
    NULL
  },
  FALSE
};

static const _ExtendedGDBusArgInfo * const __g_freedesktop_dbus_method_info_get_connection_selinux_security_context_OUT_ARG_pointers[] =
{
  &__g_freedesktop_dbus_method_info_get_connection_selinux_security_context_OUT_ARG_security_context,
  NULL
};

static const _ExtendedGDBusMethodInfo __g_freedesktop_dbus_method_info_get_connection_selinux_security_context =
{
  {
    -1,
    (gchar *) "GetConnectionSELinuxSecurityContext",
    (GDBusArgInfo **) &__g_freedesktop_dbus_method_info_get_connection_selinux_security_context_IN_ARG_pointers,
    (GDBusArgInfo **) &__g_freedesktop_dbus_method_info_get_connection_selinux_security_context_OUT_ARG_pointers,
    NULL
  },
  "handle-get-connection-selinux-security-context",
  FALSE
};

static const _ExtendedGDBusArgInfo __g_freedesktop_dbus_method_info_update_activation_environment_IN_ARG_environment =
{
  {
    -1,
    (gchar *) "environment",
    (gchar *) "a{ss}",
    NULL
  },
  FALSE
};

static const _ExtendedGDBusArgInfo * const __g_freedesktop_dbus_method_info_update_activation_environment_IN_ARG_pointers[] =
{
  &__g_freedesktop_dbus_method_info_update_activation_environment_IN_ARG_environment,
  NULL
};

static const _ExtendedGDBusMethodInfo __g_freedesktop_dbus_method_info_update_activation_environment =
{
  {
    -1,
    (gchar *) "UpdateActivationEnvironment",
    (GDBusArgInfo **) &__g_freedesktop_dbus_method_info_update_activation_environment_IN_ARG_pointers,
    NULL,
    NULL
  },
  "handle-update-activation-environment",
  FALSE
};

static const _ExtendedGDBusMethodInfo __g_freedesktop_dbus_method_info_reload_config =
{
  {
    -1,
    (gchar *) "ReloadConfig",
    NULL,
    NULL,
    NULL
  },
  "handle-reload-config",
  FALSE
};

static const _ExtendedGDBusArgInfo __g_freedesktop_dbus_method_info_get_id_OUT_ARG_unique_id =
{
  {
    -1,
    (gchar *) "unique_id",
    (gchar *) "s",
    NULL
  },
  FALSE
};

static const _ExtendedGDBusArgInfo * const __g_freedesktop_dbus_method_info_get_id_OUT_ARG_pointers[] =
{
  &__g_freedesktop_dbus_method_info_get_id_OUT_ARG_unique_id,
  NULL
};

static const _ExtendedGDBusMethodInfo __g_freedesktop_dbus_method_info_get_id =
{
  {
    -1,
    (gchar *) "GetId",
    NULL,
    (GDBusArgInfo **) &__g_freedesktop_dbus_method_info_get_id_OUT_ARG_pointers,
    NULL
  },
  "handle-get-id",
  FALSE
};

static const _ExtendedGDBusMethodInfo * const __g_freedesktop_dbus_method_info_pointers[] =
{
  &__g_freedesktop_dbus_method_info_hello,
  &__g_freedesktop_dbus_method_info_request_name,
  &__g_freedesktop_dbus_method_info_release_name,
  &__g_freedesktop_dbus_method_info_start_service_by_name,
  &__g_freedesktop_dbus_method_info_name_has_owner,
  &__g_freedesktop_dbus_method_info_list_names,
  &__g_freedesktop_dbus_method_info_list_activatable_names,
  &__g_freedesktop_dbus_method_info_add_match,
  &__g_freedesktop_dbus_method_info_remove_match,
  &__g_freedesktop_dbus_method_info_get_name_owner,
  &__g_freedesktop_dbus_method_info_list_queued_owners,
  &__g_freedesktop_dbus_method_info_get_connection_unix_user,
  &__g_freedesktop_dbus_method_info_get_connection_unix_process_id,
  &__g_freedesktop_dbus_method_info_get_connection_selinux_security_context,
  &__g_freedesktop_dbus_method_info_update_activation_environment,
  &__g_freedesktop_dbus_method_info_reload_config,
  &__g_freedesktop_dbus_method_info_get_id,
  NULL
};

static const _ExtendedGDBusArgInfo __g_freedesktop_dbus_signal_info_name_owner_changed_ARG_name =
{
  {
    -1,
    (gchar *) "name",
    (gchar *) "s",
    NULL
  },
  FALSE
};

static const _ExtendedGDBusArgInfo __g_freedesktop_dbus_signal_info_name_owner_changed_ARG_old_owner =
{
  {
    -1,
    (gchar *) "old_owner",
    (gchar *) "s",
    NULL
  },
  FALSE
};

static const _ExtendedGDBusArgInfo __g_freedesktop_dbus_signal_info_name_owner_changed_ARG_new_owner =
{
  {
    -1,
    (gchar *) "new_owner",
    (gchar *) "s",
    NULL
  },
  FALSE
};

static const _ExtendedGDBusArgInfo * const __g_freedesktop_dbus_signal_info_name_owner_changed_ARG_pointers[] =
{
  &__g_freedesktop_dbus_signal_info_name_owner_changed_ARG_name,
  &__g_freedesktop_dbus_signal_info_name_owner_changed_ARG_old_owner,
  &__g_freedesktop_dbus_signal_info_name_owner_changed_ARG_new_owner,
  NULL
};

static const _ExtendedGDBusSignalInfo __g_freedesktop_dbus_signal_info_name_owner_changed =
{
  {
    -1,
    (gchar *) "NameOwnerChanged",
    (GDBusArgInfo **) &__g_freedesktop_dbus_signal_info_name_owner_changed_ARG_pointers,
    NULL
  },
  "name-owner-changed"
};

static const _ExtendedGDBusArgInfo __g_freedesktop_dbus_signal_info_name_lost_ARG_name =
{
  {
    -1,
    (gchar *) "name",
    (gchar *) "s",
    NULL
  },
  FALSE
};

static const _ExtendedGDBusArgInfo * const __g_freedesktop_dbus_signal_info_name_lost_ARG_pointers[] =
{
  &__g_freedesktop_dbus_signal_info_name_lost_ARG_name,
  NULL
};

static const _ExtendedGDBusSignalInfo __g_freedesktop_dbus_signal_info_name_lost =
{
  {
    -1,
    (gchar *) "NameLost",
    (GDBusArgInfo **) &__g_freedesktop_dbus_signal_info_name_lost_ARG_pointers,
    NULL
  },
  "name-lost"
};

static const _ExtendedGDBusArgInfo __g_freedesktop_dbus_signal_info_name_acquired_ARG_name =
{
  {
    -1,
    (gchar *) "name",
    (gchar *) "s",
    NULL
  },
  FALSE
};

static const _ExtendedGDBusArgInfo * const __g_freedesktop_dbus_signal_info_name_acquired_ARG_pointers[] =
{
  &__g_freedesktop_dbus_signal_info_name_acquired_ARG_name,
  NULL
};

static const _ExtendedGDBusSignalInfo __g_freedesktop_dbus_signal_info_name_acquired =
{
  {
    -1,
    (gchar *) "NameAcquired",
    (GDBusArgInfo **) &__g_freedesktop_dbus_signal_info_name_acquired_ARG_pointers,
    NULL
  },
  "name-acquired"
};

static const _ExtendedGDBusSignalInfo * const __g_freedesktop_dbus_signal_info_pointers[] =
{
  &__g_freedesktop_dbus_signal_info_name_owner_changed,
  &__g_freedesktop_dbus_signal_info_name_lost,
  &__g_freedesktop_dbus_signal_info_name_acquired,
  NULL
};

static const _ExtendedGDBusInterfaceInfo __g_freedesktop_dbus_interface_info =
{
  {
    -1,
    (gchar *) "org.freedesktop.DBus",
    (GDBusMethodInfo **) &__g_freedesktop_dbus_method_info_pointers,
    (GDBusSignalInfo **) &__g_freedesktop_dbus_signal_info_pointers,
    NULL,
    NULL
  },
  "freedesktop-dbus",
};


/**
 * _g_freedesktop_dbus_interface_info:
 *
 * Gets a machine-readable description of the <link linkend="gdbus-interface-org-freedesktop-DBus.top_of_page">org.freedesktop.DBus</link> D-Bus interface.
 *
 * Returns: (transfer none): A #GDBusInterfaceInfo. Do not free.
 */
GDBusInterfaceInfo *
_g_freedesktop_dbus_interface_info (void)
{
  return (GDBusInterfaceInfo *) &__g_freedesktop_dbus_interface_info.parent_struct;
}

/**
 * _g_freedesktop_dbus_override_properties:
 * @klass: The class structure for a #GObject<!-- -->-derived class.
 * @property_id_begin: The property id to assign to the first overridden property.
 *
 * Overrides all #GObject properties in the #_GFreedesktopDBus interface for a concrete class.
 * The properties are overridden in the order they are defined.
 *
 * Returns: The last property id.
 */
guint
_g_freedesktop_dbus_override_properties (GObjectClass *klass, guint property_id_begin)
{
  return property_id_begin - 1;
}



/**
 * _GFreedesktopDBus:
 *
 * Abstract interface type for the D-Bus interface <link linkend="gdbus-interface-org-freedesktop-DBus.top_of_page">org.freedesktop.DBus</link>.
 */

/**
 * _GFreedesktopDBusIface:
 * @parent_iface: The parent interface.
 * @handle_add_match: Handler for the #_GFreedesktopDBus::handle-add-match signal.
 * @handle_get_connection_selinux_security_context: Handler for the #_GFreedesktopDBus::handle-get-connection-selinux-security-context signal.
 * @handle_get_connection_unix_process_id: Handler for the #_GFreedesktopDBus::handle-get-connection-unix-process-id signal.
 * @handle_get_connection_unix_user: Handler for the #_GFreedesktopDBus::handle-get-connection-unix-user signal.
 * @handle_get_id: Handler for the #_GFreedesktopDBus::handle-get-id signal.
 * @handle_get_name_owner: Handler for the #_GFreedesktopDBus::handle-get-name-owner signal.
 * @handle_hello: Handler for the #_GFreedesktopDBus::handle-hello signal.
 * @handle_list_activatable_names: Handler for the #_GFreedesktopDBus::handle-list-activatable-names signal.
 * @handle_list_names: Handler for the #_GFreedesktopDBus::handle-list-names signal.
 * @handle_list_queued_owners: Handler for the #_GFreedesktopDBus::handle-list-queued-owners signal.
 * @handle_name_has_owner: Handler for the #_GFreedesktopDBus::handle-name-has-owner signal.
 * @handle_release_name: Handler for the #_GFreedesktopDBus::handle-release-name signal.
 * @handle_reload_config: Handler for the #_GFreedesktopDBus::handle-reload-config signal.
 * @handle_remove_match: Handler for the #_GFreedesktopDBus::handle-remove-match signal.
 * @handle_request_name: Handler for the #_GFreedesktopDBus::handle-request-name signal.
 * @handle_start_service_by_name: Handler for the #_GFreedesktopDBus::handle-start-service-by-name signal.
 * @handle_update_activation_environment: Handler for the #_GFreedesktopDBus::handle-update-activation-environment signal.
 * @name_acquired: Handler for the #_GFreedesktopDBus::name-acquired signal.
 * @name_lost: Handler for the #_GFreedesktopDBus::name-lost signal.
 * @name_owner_changed: Handler for the #_GFreedesktopDBus::name-owner-changed signal.
 *
 * Virtual table for the D-Bus interface <link linkend="gdbus-interface-org-freedesktop-DBus.top_of_page">org.freedesktop.DBus</link>.
 */

typedef _GFreedesktopDBusIface _GFreedesktopDBusInterface;
G_DEFINE_INTERFACE (_GFreedesktopDBus, _g_freedesktop_dbus, G_TYPE_OBJECT);

static void
_g_freedesktop_dbus_default_init (_GFreedesktopDBusIface *iface)
{
  /* GObject signals for incoming D-Bus method calls: */
  /**
   * _GFreedesktopDBus::handle-hello:
   * @object: A #_GFreedesktopDBus.
   * @invocation: A #GDBusMethodInvocation.
   *
   * Signal emitted when a remote caller is invoking the <link linkend="gdbus-method-org-freedesktop-DBus.Hello">Hello()</link> D-Bus method.
   *
   * If a signal handler returns %TRUE, it means the signal handler will handle the invocation (e.g. take a reference to @invocation and eventually call _g_freedesktop_dbus_complete_hello() or e.g. g_dbus_method_invocation_return_error() on it) and no order signal handlers will run. If no signal handler handles the invocation, the %G_DBUS_ERROR_UNKNOWN_METHOD error is returned.
   *
   * Returns: %TRUE if the invocation was handled, %FALSE to let other signal handlers run.
   */
  g_signal_new ("handle-hello",
    G_TYPE_FROM_INTERFACE (iface),
    G_SIGNAL_RUN_LAST,
    G_STRUCT_OFFSET (_GFreedesktopDBusIface, handle_hello),
    g_signal_accumulator_true_handled,
    NULL,
    g_cclosure_marshal_generic,
    G_TYPE_BOOLEAN,
    1,
    G_TYPE_DBUS_METHOD_INVOCATION);

  /**
   * _GFreedesktopDBus::handle-request-name:
   * @object: A #_GFreedesktopDBus.
   * @invocation: A #GDBusMethodInvocation.
   * @arg_name: Argument passed by remote caller.
   * @arg_flags: Argument passed by remote caller.
   *
   * Signal emitted when a remote caller is invoking the <link linkend="gdbus-method-org-freedesktop-DBus.RequestName">RequestName()</link> D-Bus method.
   *
   * If a signal handler returns %TRUE, it means the signal handler will handle the invocation (e.g. take a reference to @invocation and eventually call _g_freedesktop_dbus_complete_request_name() or e.g. g_dbus_method_invocation_return_error() on it) and no order signal handlers will run. If no signal handler handles the invocation, the %G_DBUS_ERROR_UNKNOWN_METHOD error is returned.
   *
   * Returns: %TRUE if the invocation was handled, %FALSE to let other signal handlers run.
   */
  g_signal_new ("handle-request-name",
    G_TYPE_FROM_INTERFACE (iface),
    G_SIGNAL_RUN_LAST,
    G_STRUCT_OFFSET (_GFreedesktopDBusIface, handle_request_name),
    g_signal_accumulator_true_handled,
    NULL,
    g_cclosure_marshal_generic,
    G_TYPE_BOOLEAN,
    3,
    G_TYPE_DBUS_METHOD_INVOCATION, G_TYPE_STRING, G_TYPE_UINT);

  /**
   * _GFreedesktopDBus::handle-release-name:
   * @object: A #_GFreedesktopDBus.
   * @invocation: A #GDBusMethodInvocation.
   * @arg_name: Argument passed by remote caller.
   *
   * Signal emitted when a remote caller is invoking the <link linkend="gdbus-method-org-freedesktop-DBus.ReleaseName">ReleaseName()</link> D-Bus method.
   *
   * If a signal handler returns %TRUE, it means the signal handler will handle the invocation (e.g. take a reference to @invocation and eventually call _g_freedesktop_dbus_complete_release_name() or e.g. g_dbus_method_invocation_return_error() on it) and no order signal handlers will run. If no signal handler handles the invocation, the %G_DBUS_ERROR_UNKNOWN_METHOD error is returned.
   *
   * Returns: %TRUE if the invocation was handled, %FALSE to let other signal handlers run.
   */
  g_signal_new ("handle-release-name",
    G_TYPE_FROM_INTERFACE (iface),
    G_SIGNAL_RUN_LAST,
    G_STRUCT_OFFSET (_GFreedesktopDBusIface, handle_release_name),
    g_signal_accumulator_true_handled,
    NULL,
    g_cclosure_marshal_generic,
    G_TYPE_BOOLEAN,
    2,
    G_TYPE_DBUS_METHOD_INVOCATION, G_TYPE_STRING);

  /**
   * _GFreedesktopDBus::handle-start-service-by-name:
   * @object: A #_GFreedesktopDBus.
   * @invocation: A #GDBusMethodInvocation.
   * @arg_name: Argument passed by remote caller.
   * @arg_flags: Argument passed by remote caller.
   *
   * Signal emitted when a remote caller is invoking the <link linkend="gdbus-method-org-freedesktop-DBus.StartServiceByName">StartServiceByName()</link> D-Bus method.
   *
   * If a signal handler returns %TRUE, it means the signal handler will handle the invocation (e.g. take a reference to @invocation and eventually call _g_freedesktop_dbus_complete_start_service_by_name() or e.g. g_dbus_method_invocation_return_error() on it) and no order signal handlers will run. If no signal handler handles the invocation, the %G_DBUS_ERROR_UNKNOWN_METHOD error is returned.
   *
   * Returns: %TRUE if the invocation was handled, %FALSE to let other signal handlers run.
   */
  g_signal_new ("handle-start-service-by-name",
    G_TYPE_FROM_INTERFACE (iface),
    G_SIGNAL_RUN_LAST,
    G_STRUCT_OFFSET (_GFreedesktopDBusIface, handle_start_service_by_name),
    g_signal_accumulator_true_handled,
    NULL,
    g_cclosure_marshal_generic,
    G_TYPE_BOOLEAN,
    3,
    G_TYPE_DBUS_METHOD_INVOCATION, G_TYPE_STRING, G_TYPE_UINT);

  /**
   * _GFreedesktopDBus::handle-name-has-owner:
   * @object: A #_GFreedesktopDBus.
   * @invocation: A #GDBusMethodInvocation.
   * @arg_name: Argument passed by remote caller.
   *
   * Signal emitted when a remote caller is invoking the <link linkend="gdbus-method-org-freedesktop-DBus.NameHasOwner">NameHasOwner()</link> D-Bus method.
   *
   * If a signal handler returns %TRUE, it means the signal handler will handle the invocation (e.g. take a reference to @invocation and eventually call _g_freedesktop_dbus_complete_name_has_owner() or e.g. g_dbus_method_invocation_return_error() on it) and no order signal handlers will run. If no signal handler handles the invocation, the %G_DBUS_ERROR_UNKNOWN_METHOD error is returned.
   *
   * Returns: %TRUE if the invocation was handled, %FALSE to let other signal handlers run.
   */
  g_signal_new ("handle-name-has-owner",
    G_TYPE_FROM_INTERFACE (iface),
    G_SIGNAL_RUN_LAST,
    G_STRUCT_OFFSET (_GFreedesktopDBusIface, handle_name_has_owner),
    g_signal_accumulator_true_handled,
    NULL,
    g_cclosure_marshal_generic,
    G_TYPE_BOOLEAN,
    2,
    G_TYPE_DBUS_METHOD_INVOCATION, G_TYPE_STRING);

  /**
   * _GFreedesktopDBus::handle-list-names:
   * @object: A #_GFreedesktopDBus.
   * @invocation: A #GDBusMethodInvocation.
   *
   * Signal emitted when a remote caller is invoking the <link linkend="gdbus-method-org-freedesktop-DBus.ListNames">ListNames()</link> D-Bus method.
   *
   * If a signal handler returns %TRUE, it means the signal handler will handle the invocation (e.g. take a reference to @invocation and eventually call _g_freedesktop_dbus_complete_list_names() or e.g. g_dbus_method_invocation_return_error() on it) and no order signal handlers will run. If no signal handler handles the invocation, the %G_DBUS_ERROR_UNKNOWN_METHOD error is returned.
   *
   * Returns: %TRUE if the invocation was handled, %FALSE to let other signal handlers run.
   */
  g_signal_new ("handle-list-names",
    G_TYPE_FROM_INTERFACE (iface),
    G_SIGNAL_RUN_LAST,
    G_STRUCT_OFFSET (_GFreedesktopDBusIface, handle_list_names),
    g_signal_accumulator_true_handled,
    NULL,
    g_cclosure_marshal_generic,
    G_TYPE_BOOLEAN,
    1,
    G_TYPE_DBUS_METHOD_INVOCATION);

  /**
   * _GFreedesktopDBus::handle-list-activatable-names:
   * @object: A #_GFreedesktopDBus.
   * @invocation: A #GDBusMethodInvocation.
   *
   * Signal emitted when a remote caller is invoking the <link linkend="gdbus-method-org-freedesktop-DBus.ListActivatableNames">ListActivatableNames()</link> D-Bus method.
   *
   * If a signal handler returns %TRUE, it means the signal handler will handle the invocation (e.g. take a reference to @invocation and eventually call _g_freedesktop_dbus_complete_list_activatable_names() or e.g. g_dbus_method_invocation_return_error() on it) and no order signal handlers will run. If no signal handler handles the invocation, the %G_DBUS_ERROR_UNKNOWN_METHOD error is returned.
   *
   * Returns: %TRUE if the invocation was handled, %FALSE to let other signal handlers run.
   */
  g_signal_new ("handle-list-activatable-names",
    G_TYPE_FROM_INTERFACE (iface),
    G_SIGNAL_RUN_LAST,
    G_STRUCT_OFFSET (_GFreedesktopDBusIface, handle_list_activatable_names),
    g_signal_accumulator_true_handled,
    NULL,
    g_cclosure_marshal_generic,
    G_TYPE_BOOLEAN,
    1,
    G_TYPE_DBUS_METHOD_INVOCATION);

  /**
   * _GFreedesktopDBus::handle-add-match:
   * @object: A #_GFreedesktopDBus.
   * @invocation: A #GDBusMethodInvocation.
   * @arg_rule: Argument passed by remote caller.
   *
   * Signal emitted when a remote caller is invoking the <link linkend="gdbus-method-org-freedesktop-DBus.AddMatch">AddMatch()</link> D-Bus method.
   *
   * If a signal handler returns %TRUE, it means the signal handler will handle the invocation (e.g. take a reference to @invocation and eventually call _g_freedesktop_dbus_complete_add_match() or e.g. g_dbus_method_invocation_return_error() on it) and no order signal handlers will run. If no signal handler handles the invocation, the %G_DBUS_ERROR_UNKNOWN_METHOD error is returned.
   *
   * Returns: %TRUE if the invocation was handled, %FALSE to let other signal handlers run.
   */
  g_signal_new ("handle-add-match",
    G_TYPE_FROM_INTERFACE (iface),
    G_SIGNAL_RUN_LAST,
    G_STRUCT_OFFSET (_GFreedesktopDBusIface, handle_add_match),
    g_signal_accumulator_true_handled,
    NULL,
    g_cclosure_marshal_generic,
    G_TYPE_BOOLEAN,
    2,
    G_TYPE_DBUS_METHOD_INVOCATION, G_TYPE_STRING);

  /**
   * _GFreedesktopDBus::handle-remove-match:
   * @object: A #_GFreedesktopDBus.
   * @invocation: A #GDBusMethodInvocation.
   * @arg_rule: Argument passed by remote caller.
   *
   * Signal emitted when a remote caller is invoking the <link linkend="gdbus-method-org-freedesktop-DBus.RemoveMatch">RemoveMatch()</link> D-Bus method.
   *
   * If a signal handler returns %TRUE, it means the signal handler will handle the invocation (e.g. take a reference to @invocation and eventually call _g_freedesktop_dbus_complete_remove_match() or e.g. g_dbus_method_invocation_return_error() on it) and no order signal handlers will run. If no signal handler handles the invocation, the %G_DBUS_ERROR_UNKNOWN_METHOD error is returned.
   *
   * Returns: %TRUE if the invocation was handled, %FALSE to let other signal handlers run.
   */
  g_signal_new ("handle-remove-match",
    G_TYPE_FROM_INTERFACE (iface),
    G_SIGNAL_RUN_LAST,
    G_STRUCT_OFFSET (_GFreedesktopDBusIface, handle_remove_match),
    g_signal_accumulator_true_handled,
    NULL,
    g_cclosure_marshal_generic,
    G_TYPE_BOOLEAN,
    2,
    G_TYPE_DBUS_METHOD_INVOCATION, G_TYPE_STRING);

  /**
   * _GFreedesktopDBus::handle-get-name-owner:
   * @object: A #_GFreedesktopDBus.
   * @invocation: A #GDBusMethodInvocation.
   * @arg_name: Argument passed by remote caller.
   *
   * Signal emitted when a remote caller is invoking the <link linkend="gdbus-method-org-freedesktop-DBus.GetNameOwner">GetNameOwner()</link> D-Bus method.
   *
   * If a signal handler returns %TRUE, it means the signal handler will handle the invocation (e.g. take a reference to @invocation and eventually call _g_freedesktop_dbus_complete_get_name_owner() or e.g. g_dbus_method_invocation_return_error() on it) and no order signal handlers will run. If no signal handler handles the invocation, the %G_DBUS_ERROR_UNKNOWN_METHOD error is returned.
   *
   * Returns: %TRUE if the invocation was handled, %FALSE to let other signal handlers run.
   */
  g_signal_new ("handle-get-name-owner",
    G_TYPE_FROM_INTERFACE (iface),
    G_SIGNAL_RUN_LAST,
    G_STRUCT_OFFSET (_GFreedesktopDBusIface, handle_get_name_owner),
    g_signal_accumulator_true_handled,
    NULL,
    g_cclosure_marshal_generic,
    G_TYPE_BOOLEAN,
    2,
    G_TYPE_DBUS_METHOD_INVOCATION, G_TYPE_STRING);

  /**
   * _GFreedesktopDBus::handle-list-queued-owners:
   * @object: A #_GFreedesktopDBus.
   * @invocation: A #GDBusMethodInvocation.
   * @arg_name: Argument passed by remote caller.
   *
   * Signal emitted when a remote caller is invoking the <link linkend="gdbus-method-org-freedesktop-DBus.ListQueuedOwners">ListQueuedOwners()</link> D-Bus method.
   *
   * If a signal handler returns %TRUE, it means the signal handler will handle the invocation (e.g. take a reference to @invocation and eventually call _g_freedesktop_dbus_complete_list_queued_owners() or e.g. g_dbus_method_invocation_return_error() on it) and no order signal handlers will run. If no signal handler handles the invocation, the %G_DBUS_ERROR_UNKNOWN_METHOD error is returned.
   *
   * Returns: %TRUE if the invocation was handled, %FALSE to let other signal handlers run.
   */
  g_signal_new ("handle-list-queued-owners",
    G_TYPE_FROM_INTERFACE (iface),
    G_SIGNAL_RUN_LAST,
    G_STRUCT_OFFSET (_GFreedesktopDBusIface, handle_list_queued_owners),
    g_signal_accumulator_true_handled,
    NULL,
    g_cclosure_marshal_generic,
    G_TYPE_BOOLEAN,
    2,
    G_TYPE_DBUS_METHOD_INVOCATION, G_TYPE_STRING);

  /**
   * _GFreedesktopDBus::handle-get-connection-unix-user:
   * @object: A #_GFreedesktopDBus.
   * @invocation: A #GDBusMethodInvocation.
   * @arg_name: Argument passed by remote caller.
   *
   * Signal emitted when a remote caller is invoking the <link linkend="gdbus-method-org-freedesktop-DBus.GetConnectionUnixUser">GetConnectionUnixUser()</link> D-Bus method.
   *
   * If a signal handler returns %TRUE, it means the signal handler will handle the invocation (e.g. take a reference to @invocation and eventually call _g_freedesktop_dbus_complete_get_connection_unix_user() or e.g. g_dbus_method_invocation_return_error() on it) and no order signal handlers will run. If no signal handler handles the invocation, the %G_DBUS_ERROR_UNKNOWN_METHOD error is returned.
   *
   * Returns: %TRUE if the invocation was handled, %FALSE to let other signal handlers run.
   */
  g_signal_new ("handle-get-connection-unix-user",
    G_TYPE_FROM_INTERFACE (iface),
    G_SIGNAL_RUN_LAST,
    G_STRUCT_OFFSET (_GFreedesktopDBusIface, handle_get_connection_unix_user),
    g_signal_accumulator_true_handled,
    NULL,
    g_cclosure_marshal_generic,
    G_TYPE_BOOLEAN,
    2,
    G_TYPE_DBUS_METHOD_INVOCATION, G_TYPE_STRING);

  /**
   * _GFreedesktopDBus::handle-get-connection-unix-process-id:
   * @object: A #_GFreedesktopDBus.
   * @invocation: A #GDBusMethodInvocation.
   * @arg_name: Argument passed by remote caller.
   *
   * Signal emitted when a remote caller is invoking the <link linkend="gdbus-method-org-freedesktop-DBus.GetConnectionUnixProcessID">GetConnectionUnixProcessID()</link> D-Bus method.
   *
   * If a signal handler returns %TRUE, it means the signal handler will handle the invocation (e.g. take a reference to @invocation and eventually call _g_freedesktop_dbus_complete_get_connection_unix_process_id() or e.g. g_dbus_method_invocation_return_error() on it) and no order signal handlers will run. If no signal handler handles the invocation, the %G_DBUS_ERROR_UNKNOWN_METHOD error is returned.
   *
   * Returns: %TRUE if the invocation was handled, %FALSE to let other signal handlers run.
   */
  g_signal_new ("handle-get-connection-unix-process-id",
    G_TYPE_FROM_INTERFACE (iface),
    G_SIGNAL_RUN_LAST,
    G_STRUCT_OFFSET (_GFreedesktopDBusIface, handle_get_connection_unix_process_id),
    g_signal_accumulator_true_handled,
    NULL,
    g_cclosure_marshal_generic,
    G_TYPE_BOOLEAN,
    2,
    G_TYPE_DBUS_METHOD_INVOCATION, G_TYPE_STRING);

  /**
   * _GFreedesktopDBus::handle-get-connection-selinux-security-context:
   * @object: A #_GFreedesktopDBus.
   * @invocation: A #GDBusMethodInvocation.
   * @arg_name: Argument passed by remote caller.
   *
   * Signal emitted when a remote caller is invoking the <link linkend="gdbus-method-org-freedesktop-DBus.GetConnectionSELinuxSecurityContext">GetConnectionSELinuxSecurityContext()</link> D-Bus method.
   *
   * If a signal handler returns %TRUE, it means the signal handler will handle the invocation (e.g. take a reference to @invocation and eventually call _g_freedesktop_dbus_complete_get_connection_selinux_security_context() or e.g. g_dbus_method_invocation_return_error() on it) and no order signal handlers will run. If no signal handler handles the invocation, the %G_DBUS_ERROR_UNKNOWN_METHOD error is returned.
   *
   * Returns: %TRUE if the invocation was handled, %FALSE to let other signal handlers run.
   */
  g_signal_new ("handle-get-connection-selinux-security-context",
    G_TYPE_FROM_INTERFACE (iface),
    G_SIGNAL_RUN_LAST,
    G_STRUCT_OFFSET (_GFreedesktopDBusIface, handle_get_connection_selinux_security_context),
    g_signal_accumulator_true_handled,
    NULL,
    g_cclosure_marshal_generic,
    G_TYPE_BOOLEAN,
    2,
    G_TYPE_DBUS_METHOD_INVOCATION, G_TYPE_STRING);

  /**
   * _GFreedesktopDBus::handle-update-activation-environment:
   * @object: A #_GFreedesktopDBus.
   * @invocation: A #GDBusMethodInvocation.
   * @arg_environment: Argument passed by remote caller.
   *
   * Signal emitted when a remote caller is invoking the <link linkend="gdbus-method-org-freedesktop-DBus.UpdateActivationEnvironment">UpdateActivationEnvironment()</link> D-Bus method.
   *
   * If a signal handler returns %TRUE, it means the signal handler will handle the invocation (e.g. take a reference to @invocation and eventually call _g_freedesktop_dbus_complete_update_activation_environment() or e.g. g_dbus_method_invocation_return_error() on it) and no order signal handlers will run. If no signal handler handles the invocation, the %G_DBUS_ERROR_UNKNOWN_METHOD error is returned.
   *
   * Returns: %TRUE if the invocation was handled, %FALSE to let other signal handlers run.
   */
  g_signal_new ("handle-update-activation-environment",
    G_TYPE_FROM_INTERFACE (iface),
    G_SIGNAL_RUN_LAST,
    G_STRUCT_OFFSET (_GFreedesktopDBusIface, handle_update_activation_environment),
    g_signal_accumulator_true_handled,
    NULL,
    g_cclosure_marshal_generic,
    G_TYPE_BOOLEAN,
    2,
    G_TYPE_DBUS_METHOD_INVOCATION, G_TYPE_VARIANT);

  /**
   * _GFreedesktopDBus::handle-reload-config:
   * @object: A #_GFreedesktopDBus.
   * @invocation: A #GDBusMethodInvocation.
   *
   * Signal emitted when a remote caller is invoking the <link linkend="gdbus-method-org-freedesktop-DBus.ReloadConfig">ReloadConfig()</link> D-Bus method.
   *
   * If a signal handler returns %TRUE, it means the signal handler will handle the invocation (e.g. take a reference to @invocation and eventually call _g_freedesktop_dbus_complete_reload_config() or e.g. g_dbus_method_invocation_return_error() on it) and no order signal handlers will run. If no signal handler handles the invocation, the %G_DBUS_ERROR_UNKNOWN_METHOD error is returned.
   *
   * Returns: %TRUE if the invocation was handled, %FALSE to let other signal handlers run.
   */
  g_signal_new ("handle-reload-config",
    G_TYPE_FROM_INTERFACE (iface),
    G_SIGNAL_RUN_LAST,
    G_STRUCT_OFFSET (_GFreedesktopDBusIface, handle_reload_config),
    g_signal_accumulator_true_handled,
    NULL,
    g_cclosure_marshal_generic,
    G_TYPE_BOOLEAN,
    1,
    G_TYPE_DBUS_METHOD_INVOCATION);

  /**
   * _GFreedesktopDBus::handle-get-id:
   * @object: A #_GFreedesktopDBus.
   * @invocation: A #GDBusMethodInvocation.
   *
   * Signal emitted when a remote caller is invoking the <link linkend="gdbus-method-org-freedesktop-DBus.GetId">GetId()</link> D-Bus method.
   *
   * If a signal handler returns %TRUE, it means the signal handler will handle the invocation (e.g. take a reference to @invocation and eventually call _g_freedesktop_dbus_complete_get_id() or e.g. g_dbus_method_invocation_return_error() on it) and no order signal handlers will run. If no signal handler handles the invocation, the %G_DBUS_ERROR_UNKNOWN_METHOD error is returned.
   *
   * Returns: %TRUE if the invocation was handled, %FALSE to let other signal handlers run.
   */
  g_signal_new ("handle-get-id",
    G_TYPE_FROM_INTERFACE (iface),
    G_SIGNAL_RUN_LAST,
    G_STRUCT_OFFSET (_GFreedesktopDBusIface, handle_get_id),
    g_signal_accumulator_true_handled,
    NULL,
    g_cclosure_marshal_generic,
    G_TYPE_BOOLEAN,
    1,
    G_TYPE_DBUS_METHOD_INVOCATION);

  /* GObject signals for received D-Bus signals: */
  /**
   * _GFreedesktopDBus::name-owner-changed:
   * @object: A #_GFreedesktopDBus.
   * @arg_name: Argument.
   * @arg_old_owner: Argument.
   * @arg_new_owner: Argument.
   *
   * On the client-side, this signal is emitted whenever the D-Bus signal <link linkend="gdbus-signal-org-freedesktop-DBus.NameOwnerChanged">"NameOwnerChanged"</link> is received.
   *
   * On the service-side, this signal can be used with e.g. g_signal_emit_by_name() to make the object emit the D-Bus signal.
   */
  g_signal_new ("name-owner-changed",
    G_TYPE_FROM_INTERFACE (iface),
    G_SIGNAL_RUN_LAST,
    G_STRUCT_OFFSET (_GFreedesktopDBusIface, name_owner_changed),
    NULL,
    NULL,
    g_cclosure_marshal_generic,
    G_TYPE_NONE,
    3, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING);

  /**
   * _GFreedesktopDBus::name-lost:
   * @object: A #_GFreedesktopDBus.
   * @arg_name: Argument.
   *
   * On the client-side, this signal is emitted whenever the D-Bus signal <link linkend="gdbus-signal-org-freedesktop-DBus.NameLost">"NameLost"</link> is received.
   *
   * On the service-side, this signal can be used with e.g. g_signal_emit_by_name() to make the object emit the D-Bus signal.
   */
  g_signal_new ("name-lost",
    G_TYPE_FROM_INTERFACE (iface),
    G_SIGNAL_RUN_LAST,
    G_STRUCT_OFFSET (_GFreedesktopDBusIface, name_lost),
    NULL,
    NULL,
    g_cclosure_marshal_generic,
    G_TYPE_NONE,
    1, G_TYPE_STRING);

  /**
   * _GFreedesktopDBus::name-acquired:
   * @object: A #_GFreedesktopDBus.
   * @arg_name: Argument.
   *
   * On the client-side, this signal is emitted whenever the D-Bus signal <link linkend="gdbus-signal-org-freedesktop-DBus.NameAcquired">"NameAcquired"</link> is received.
   *
   * On the service-side, this signal can be used with e.g. g_signal_emit_by_name() to make the object emit the D-Bus signal.
   */
  g_signal_new ("name-acquired",
    G_TYPE_FROM_INTERFACE (iface),
    G_SIGNAL_RUN_LAST,
    G_STRUCT_OFFSET (_GFreedesktopDBusIface, name_acquired),
    NULL,
    NULL,
    g_cclosure_marshal_generic,
    G_TYPE_NONE,
    1, G_TYPE_STRING);

}

/**
 * _g_freedesktop_dbus_emit_name_owner_changed:
 * @object: A #_GFreedesktopDBus.
 * @arg_name: Argument to pass with the signal.
 * @arg_old_owner: Argument to pass with the signal.
 * @arg_new_owner: Argument to pass with the signal.
 *
 * Emits the <link linkend="gdbus-signal-org-freedesktop-DBus.NameOwnerChanged">"NameOwnerChanged"</link> D-Bus signal.
 */
void
_g_freedesktop_dbus_emit_name_owner_changed (
    _GFreedesktopDBus *object,
    const gchar *arg_name,
    const gchar *arg_old_owner,
    const gchar *arg_new_owner)
{
  g_signal_emit_by_name (object, "name-owner-changed", arg_name, arg_old_owner, arg_new_owner);
}

/**
 * _g_freedesktop_dbus_emit_name_lost:
 * @object: A #_GFreedesktopDBus.
 * @arg_name: Argument to pass with the signal.
 *
 * Emits the <link linkend="gdbus-signal-org-freedesktop-DBus.NameLost">"NameLost"</link> D-Bus signal.
 */
void
_g_freedesktop_dbus_emit_name_lost (
    _GFreedesktopDBus *object,
    const gchar *arg_name)
{
  g_signal_emit_by_name (object, "name-lost", arg_name);
}

/**
 * _g_freedesktop_dbus_emit_name_acquired:
 * @object: A #_GFreedesktopDBus.
 * @arg_name: Argument to pass with the signal.
 *
 * Emits the <link linkend="gdbus-signal-org-freedesktop-DBus.NameAcquired">"NameAcquired"</link> D-Bus signal.
 */
void
_g_freedesktop_dbus_emit_name_acquired (
    _GFreedesktopDBus *object,
    const gchar *arg_name)
{
  g_signal_emit_by_name (object, "name-acquired", arg_name);
}

/**
 * _g_freedesktop_dbus_call_hello:
 * @proxy: A #_GFreedesktopDBusProxy.
 * @cancellable: (allow-none): A #GCancellable or %NULL.
 * @callback: A #GAsyncReadyCallback to call when the request is satisfied or %NULL.
 * @user_data: User data to pass to @callback.
 *
 * Asynchronously invokes the <link linkend="gdbus-method-org-freedesktop-DBus.Hello">Hello()</link> D-Bus method on @proxy.
 * When the operation is finished, @callback will be invoked in the <link linkend="g-main-context-push-thread-default">thread-default main loop</link> of the thread you are calling this method from.
 * You can then call _g_freedesktop_dbus_call_hello_finish() to get the result of the operation.
 *
 * See _g_freedesktop_dbus_call_hello_sync() for the synchronous, blocking version of this method.
 */
void
_g_freedesktop_dbus_call_hello (
    _GFreedesktopDBus *proxy,
    GCancellable *cancellable,
    GAsyncReadyCallback callback,
    gpointer user_data)
{
  g_dbus_proxy_call (G_DBUS_PROXY (proxy),
    "Hello",
    g_variant_new ("()"),
    G_DBUS_CALL_FLAGS_NONE,
    -1,
    cancellable,
    callback,
    user_data);
}

/**
 * _g_freedesktop_dbus_call_hello_finish:
 * @proxy: A #_GFreedesktopDBusProxy.
 * @out_assigned_name: (out): Return location for return parameter or %NULL to ignore.
 * @res: The #GAsyncResult obtained from the #GAsyncReadyCallback passed to _g_freedesktop_dbus_call_hello().
 * @error: Return location for error or %NULL.
 *
 * Finishes an operation started with _g_freedesktop_dbus_call_hello().
 *
 * Returns: (skip): %TRUE if the call succeded, %FALSE if @error is set.
 */
gboolean
_g_freedesktop_dbus_call_hello_finish (
    _GFreedesktopDBus *proxy,
    gchar **out_assigned_name,
    GAsyncResult *res,
    GError **error)
{
  GVariant *_ret;
  _ret = g_dbus_proxy_call_finish (G_DBUS_PROXY (proxy), res, error);
  if (_ret == NULL)
    goto _out;
  g_variant_get (_ret,
                 "(s)",
                 out_assigned_name);
  g_variant_unref (_ret);
_out:
  return _ret != NULL;
}

/**
 * _g_freedesktop_dbus_call_hello_sync:
 * @proxy: A #_GFreedesktopDBusProxy.
 * @out_assigned_name: (out): Return location for return parameter or %NULL to ignore.
 * @cancellable: (allow-none): A #GCancellable or %NULL.
 * @error: Return location for error or %NULL.
 *
 * Synchronously invokes the <link linkend="gdbus-method-org-freedesktop-DBus.Hello">Hello()</link> D-Bus method on @proxy. The calling thread is blocked until a reply is received.
 *
 * See _g_freedesktop_dbus_call_hello() for the asynchronous version of this method.
 *
 * Returns: (skip): %TRUE if the call succeded, %FALSE if @error is set.
 */
gboolean
_g_freedesktop_dbus_call_hello_sync (
    _GFreedesktopDBus *proxy,
    gchar **out_assigned_name,
    GCancellable *cancellable,
    GError **error)
{
  GVariant *_ret;
  _ret = g_dbus_proxy_call_sync (G_DBUS_PROXY (proxy),
    "Hello",
    g_variant_new ("()"),
    G_DBUS_CALL_FLAGS_NONE,
    -1,
    cancellable,
    error);
  if (_ret == NULL)
    goto _out;
  g_variant_get (_ret,
                 "(s)",
                 out_assigned_name);
  g_variant_unref (_ret);
_out:
  return _ret != NULL;
}

/**
 * _g_freedesktop_dbus_call_request_name:
 * @proxy: A #_GFreedesktopDBusProxy.
 * @arg_name: Argument to pass with the method invocation.
 * @arg_flags: Argument to pass with the method invocation.
 * @cancellable: (allow-none): A #GCancellable or %NULL.
 * @callback: A #GAsyncReadyCallback to call when the request is satisfied or %NULL.
 * @user_data: User data to pass to @callback.
 *
 * Asynchronously invokes the <link linkend="gdbus-method-org-freedesktop-DBus.RequestName">RequestName()</link> D-Bus method on @proxy.
 * When the operation is finished, @callback will be invoked in the <link linkend="g-main-context-push-thread-default">thread-default main loop</link> of the thread you are calling this method from.
 * You can then call _g_freedesktop_dbus_call_request_name_finish() to get the result of the operation.
 *
 * See _g_freedesktop_dbus_call_request_name_sync() for the synchronous, blocking version of this method.
 */
void
_g_freedesktop_dbus_call_request_name (
    _GFreedesktopDBus *proxy,
    const gchar *arg_name,
    guint arg_flags,
    GCancellable *cancellable,
    GAsyncReadyCallback callback,
    gpointer user_data)
{
  g_dbus_proxy_call (G_DBUS_PROXY (proxy),
    "RequestName",
    g_variant_new ("(su)",
                   arg_name,
                   arg_flags),
    G_DBUS_CALL_FLAGS_NONE,
    -1,
    cancellable,
    callback,
    user_data);
}

/**
 * _g_freedesktop_dbus_call_request_name_finish:
 * @proxy: A #_GFreedesktopDBusProxy.
 * @out_value: (out): Return location for return parameter or %NULL to ignore.
 * @res: The #GAsyncResult obtained from the #GAsyncReadyCallback passed to _g_freedesktop_dbus_call_request_name().
 * @error: Return location for error or %NULL.
 *
 * Finishes an operation started with _g_freedesktop_dbus_call_request_name().
 *
 * Returns: (skip): %TRUE if the call succeded, %FALSE if @error is set.
 */
gboolean
_g_freedesktop_dbus_call_request_name_finish (
    _GFreedesktopDBus *proxy,
    guint *out_value,
    GAsyncResult *res,
    GError **error)
{
  GVariant *_ret;
  _ret = g_dbus_proxy_call_finish (G_DBUS_PROXY (proxy), res, error);
  if (_ret == NULL)
    goto _out;
  g_variant_get (_ret,
                 "(u)",
                 out_value);
  g_variant_unref (_ret);
_out:
  return _ret != NULL;
}

/**
 * _g_freedesktop_dbus_call_request_name_sync:
 * @proxy: A #_GFreedesktopDBusProxy.
 * @arg_name: Argument to pass with the method invocation.
 * @arg_flags: Argument to pass with the method invocation.
 * @out_value: (out): Return location for return parameter or %NULL to ignore.
 * @cancellable: (allow-none): A #GCancellable or %NULL.
 * @error: Return location for error or %NULL.
 *
 * Synchronously invokes the <link linkend="gdbus-method-org-freedesktop-DBus.RequestName">RequestName()</link> D-Bus method on @proxy. The calling thread is blocked until a reply is received.
 *
 * See _g_freedesktop_dbus_call_request_name() for the asynchronous version of this method.
 *
 * Returns: (skip): %TRUE if the call succeded, %FALSE if @error is set.
 */
gboolean
_g_freedesktop_dbus_call_request_name_sync (
    _GFreedesktopDBus *proxy,
    const gchar *arg_name,
    guint arg_flags,
    guint *out_value,
    GCancellable *cancellable,
    GError **error)
{
  GVariant *_ret;
  _ret = g_dbus_proxy_call_sync (G_DBUS_PROXY (proxy),
    "RequestName",
    g_variant_new ("(su)",
                   arg_name,
                   arg_flags),
    G_DBUS_CALL_FLAGS_NONE,
    -1,
    cancellable,
    error);
  if (_ret == NULL)
    goto _out;
  g_variant_get (_ret,
                 "(u)",
                 out_value);
  g_variant_unref (_ret);
_out:
  return _ret != NULL;
}

/**
 * _g_freedesktop_dbus_call_release_name:
 * @proxy: A #_GFreedesktopDBusProxy.
 * @arg_name: Argument to pass with the method invocation.
 * @cancellable: (allow-none): A #GCancellable or %NULL.
 * @callback: A #GAsyncReadyCallback to call when the request is satisfied or %NULL.
 * @user_data: User data to pass to @callback.
 *
 * Asynchronously invokes the <link linkend="gdbus-method-org-freedesktop-DBus.ReleaseName">ReleaseName()</link> D-Bus method on @proxy.
 * When the operation is finished, @callback will be invoked in the <link linkend="g-main-context-push-thread-default">thread-default main loop</link> of the thread you are calling this method from.
 * You can then call _g_freedesktop_dbus_call_release_name_finish() to get the result of the operation.
 *
 * See _g_freedesktop_dbus_call_release_name_sync() for the synchronous, blocking version of this method.
 */
void
_g_freedesktop_dbus_call_release_name (
    _GFreedesktopDBus *proxy,
    const gchar *arg_name,
    GCancellable *cancellable,
    GAsyncReadyCallback callback,
    gpointer user_data)
{
  g_dbus_proxy_call (G_DBUS_PROXY (proxy),
    "ReleaseName",
    g_variant_new ("(s)",
                   arg_name),
    G_DBUS_CALL_FLAGS_NONE,
    -1,
    cancellable,
    callback,
    user_data);
}

/**
 * _g_freedesktop_dbus_call_release_name_finish:
 * @proxy: A #_GFreedesktopDBusProxy.
 * @out_value: (out): Return location for return parameter or %NULL to ignore.
 * @res: The #GAsyncResult obtained from the #GAsyncReadyCallback passed to _g_freedesktop_dbus_call_release_name().
 * @error: Return location for error or %NULL.
 *
 * Finishes an operation started with _g_freedesktop_dbus_call_release_name().
 *
 * Returns: (skip): %TRUE if the call succeded, %FALSE if @error is set.
 */
gboolean
_g_freedesktop_dbus_call_release_name_finish (
    _GFreedesktopDBus *proxy,
    guint *out_value,
    GAsyncResult *res,
    GError **error)
{
  GVariant *_ret;
  _ret = g_dbus_proxy_call_finish (G_DBUS_PROXY (proxy), res, error);
  if (_ret == NULL)
    goto _out;
  g_variant_get (_ret,
                 "(u)",
                 out_value);
  g_variant_unref (_ret);
_out:
  return _ret != NULL;
}

/**
 * _g_freedesktop_dbus_call_release_name_sync:
 * @proxy: A #_GFreedesktopDBusProxy.
 * @arg_name: Argument to pass with the method invocation.
 * @out_value: (out): Return location for return parameter or %NULL to ignore.
 * @cancellable: (allow-none): A #GCancellable or %NULL.
 * @error: Return location for error or %NULL.
 *
 * Synchronously invokes the <link linkend="gdbus-method-org-freedesktop-DBus.ReleaseName">ReleaseName()</link> D-Bus method on @proxy. The calling thread is blocked until a reply is received.
 *
 * See _g_freedesktop_dbus_call_release_name() for the asynchronous version of this method.
 *
 * Returns: (skip): %TRUE if the call succeded, %FALSE if @error is set.
 */
gboolean
_g_freedesktop_dbus_call_release_name_sync (
    _GFreedesktopDBus *proxy,
    const gchar *arg_name,
    guint *out_value,
    GCancellable *cancellable,
    GError **error)
{
  GVariant *_ret;
  _ret = g_dbus_proxy_call_sync (G_DBUS_PROXY (proxy),
    "ReleaseName",
    g_variant_new ("(s)",
                   arg_name),
    G_DBUS_CALL_FLAGS_NONE,
    -1,
    cancellable,
    error);
  if (_ret == NULL)
    goto _out;
  g_variant_get (_ret,
                 "(u)",
                 out_value);
  g_variant_unref (_ret);
_out:
  return _ret != NULL;
}

/**
 * _g_freedesktop_dbus_call_start_service_by_name:
 * @proxy: A #_GFreedesktopDBusProxy.
 * @arg_name: Argument to pass with the method invocation.
 * @arg_flags: Argument to pass with the method invocation.
 * @cancellable: (allow-none): A #GCancellable or %NULL.
 * @callback: A #GAsyncReadyCallback to call when the request is satisfied or %NULL.
 * @user_data: User data to pass to @callback.
 *
 * Asynchronously invokes the <link linkend="gdbus-method-org-freedesktop-DBus.StartServiceByName">StartServiceByName()</link> D-Bus method on @proxy.
 * When the operation is finished, @callback will be invoked in the <link linkend="g-main-context-push-thread-default">thread-default main loop</link> of the thread you are calling this method from.
 * You can then call _g_freedesktop_dbus_call_start_service_by_name_finish() to get the result of the operation.
 *
 * See _g_freedesktop_dbus_call_start_service_by_name_sync() for the synchronous, blocking version of this method.
 */
void
_g_freedesktop_dbus_call_start_service_by_name (
    _GFreedesktopDBus *proxy,
    const gchar *arg_name,
    guint arg_flags,
    GCancellable *cancellable,
    GAsyncReadyCallback callback,
    gpointer user_data)
{
  g_dbus_proxy_call (G_DBUS_PROXY (proxy),
    "StartServiceByName",
    g_variant_new ("(su)",
                   arg_name,
                   arg_flags),
    G_DBUS_CALL_FLAGS_NONE,
    -1,
    cancellable,
    callback,
    user_data);
}

/**
 * _g_freedesktop_dbus_call_start_service_by_name_finish:
 * @proxy: A #_GFreedesktopDBusProxy.
 * @out_value: (out): Return location for return parameter or %NULL to ignore.
 * @res: The #GAsyncResult obtained from the #GAsyncReadyCallback passed to _g_freedesktop_dbus_call_start_service_by_name().
 * @error: Return location for error or %NULL.
 *
 * Finishes an operation started with _g_freedesktop_dbus_call_start_service_by_name().
 *
 * Returns: (skip): %TRUE if the call succeded, %FALSE if @error is set.
 */
gboolean
_g_freedesktop_dbus_call_start_service_by_name_finish (
    _GFreedesktopDBus *proxy,
    guint *out_value,
    GAsyncResult *res,
    GError **error)
{
  GVariant *_ret;
  _ret = g_dbus_proxy_call_finish (G_DBUS_PROXY (proxy), res, error);
  if (_ret == NULL)
    goto _out;
  g_variant_get (_ret,
                 "(u)",
                 out_value);
  g_variant_unref (_ret);
_out:
  return _ret != NULL;
}

/**
 * _g_freedesktop_dbus_call_start_service_by_name_sync:
 * @proxy: A #_GFreedesktopDBusProxy.
 * @arg_name: Argument to pass with the method invocation.
 * @arg_flags: Argument to pass with the method invocation.
 * @out_value: (out): Return location for return parameter or %NULL to ignore.
 * @cancellable: (allow-none): A #GCancellable or %NULL.
 * @error: Return location for error or %NULL.
 *
 * Synchronously invokes the <link linkend="gdbus-method-org-freedesktop-DBus.StartServiceByName">StartServiceByName()</link> D-Bus method on @proxy. The calling thread is blocked until a reply is received.
 *
 * See _g_freedesktop_dbus_call_start_service_by_name() for the asynchronous version of this method.
 *
 * Returns: (skip): %TRUE if the call succeded, %FALSE if @error is set.
 */
gboolean
_g_freedesktop_dbus_call_start_service_by_name_sync (
    _GFreedesktopDBus *proxy,
    const gchar *arg_name,
    guint arg_flags,
    guint *out_value,
    GCancellable *cancellable,
    GError **error)
{
  GVariant *_ret;
  _ret = g_dbus_proxy_call_sync (G_DBUS_PROXY (proxy),
    "StartServiceByName",
    g_variant_new ("(su)",
                   arg_name,
                   arg_flags),
    G_DBUS_CALL_FLAGS_NONE,
    -1,
    cancellable,
    error);
  if (_ret == NULL)
    goto _out;
  g_variant_get (_ret,
                 "(u)",
                 out_value);
  g_variant_unref (_ret);
_out:
  return _ret != NULL;
}

/**
 * _g_freedesktop_dbus_call_name_has_owner:
 * @proxy: A #_GFreedesktopDBusProxy.
 * @arg_name: Argument to pass with the method invocation.
 * @cancellable: (allow-none): A #GCancellable or %NULL.
 * @callback: A #GAsyncReadyCallback to call when the request is satisfied or %NULL.
 * @user_data: User data to pass to @callback.
 *
 * Asynchronously invokes the <link linkend="gdbus-method-org-freedesktop-DBus.NameHasOwner">NameHasOwner()</link> D-Bus method on @proxy.
 * When the operation is finished, @callback will be invoked in the <link linkend="g-main-context-push-thread-default">thread-default main loop</link> of the thread you are calling this method from.
 * You can then call _g_freedesktop_dbus_call_name_has_owner_finish() to get the result of the operation.
 *
 * See _g_freedesktop_dbus_call_name_has_owner_sync() for the synchronous, blocking version of this method.
 */
void
_g_freedesktop_dbus_call_name_has_owner (
    _GFreedesktopDBus *proxy,
    const gchar *arg_name,
    GCancellable *cancellable,
    GAsyncReadyCallback callback,
    gpointer user_data)
{
  g_dbus_proxy_call (G_DBUS_PROXY (proxy),
    "NameHasOwner",
    g_variant_new ("(s)",
                   arg_name),
    G_DBUS_CALL_FLAGS_NONE,
    -1,
    cancellable,
    callback,
    user_data);
}

/**
 * _g_freedesktop_dbus_call_name_has_owner_finish:
 * @proxy: A #_GFreedesktopDBusProxy.
 * @out_has_owner: (out): Return location for return parameter or %NULL to ignore.
 * @res: The #GAsyncResult obtained from the #GAsyncReadyCallback passed to _g_freedesktop_dbus_call_name_has_owner().
 * @error: Return location for error or %NULL.
 *
 * Finishes an operation started with _g_freedesktop_dbus_call_name_has_owner().
 *
 * Returns: (skip): %TRUE if the call succeded, %FALSE if @error is set.
 */
gboolean
_g_freedesktop_dbus_call_name_has_owner_finish (
    _GFreedesktopDBus *proxy,
    gboolean *out_has_owner,
    GAsyncResult *res,
    GError **error)
{
  GVariant *_ret;
  _ret = g_dbus_proxy_call_finish (G_DBUS_PROXY (proxy), res, error);
  if (_ret == NULL)
    goto _out;
  g_variant_get (_ret,
                 "(b)",
                 out_has_owner);
  g_variant_unref (_ret);
_out:
  return _ret != NULL;
}

/**
 * _g_freedesktop_dbus_call_name_has_owner_sync:
 * @proxy: A #_GFreedesktopDBusProxy.
 * @arg_name: Argument to pass with the method invocation.
 * @out_has_owner: (out): Return location for return parameter or %NULL to ignore.
 * @cancellable: (allow-none): A #GCancellable or %NULL.
 * @error: Return location for error or %NULL.
 *
 * Synchronously invokes the <link linkend="gdbus-method-org-freedesktop-DBus.NameHasOwner">NameHasOwner()</link> D-Bus method on @proxy. The calling thread is blocked until a reply is received.
 *
 * See _g_freedesktop_dbus_call_name_has_owner() for the asynchronous version of this method.
 *
 * Returns: (skip): %TRUE if the call succeded, %FALSE if @error is set.
 */
gboolean
_g_freedesktop_dbus_call_name_has_owner_sync (
    _GFreedesktopDBus *proxy,
    const gchar *arg_name,
    gboolean *out_has_owner,
    GCancellable *cancellable,
    GError **error)
{
  GVariant *_ret;
  _ret = g_dbus_proxy_call_sync (G_DBUS_PROXY (proxy),
    "NameHasOwner",
    g_variant_new ("(s)",
                   arg_name),
    G_DBUS_CALL_FLAGS_NONE,
    -1,
    cancellable,
    error);
  if (_ret == NULL)
    goto _out;
  g_variant_get (_ret,
                 "(b)",
                 out_has_owner);
  g_variant_unref (_ret);
_out:
  return _ret != NULL;
}

/**
 * _g_freedesktop_dbus_call_list_names:
 * @proxy: A #_GFreedesktopDBusProxy.
 * @cancellable: (allow-none): A #GCancellable or %NULL.
 * @callback: A #GAsyncReadyCallback to call when the request is satisfied or %NULL.
 * @user_data: User data to pass to @callback.
 *
 * Asynchronously invokes the <link linkend="gdbus-method-org-freedesktop-DBus.ListNames">ListNames()</link> D-Bus method on @proxy.
 * When the operation is finished, @callback will be invoked in the <link linkend="g-main-context-push-thread-default">thread-default main loop</link> of the thread you are calling this method from.
 * You can then call _g_freedesktop_dbus_call_list_names_finish() to get the result of the operation.
 *
 * See _g_freedesktop_dbus_call_list_names_sync() for the synchronous, blocking version of this method.
 */
void
_g_freedesktop_dbus_call_list_names (
    _GFreedesktopDBus *proxy,
    GCancellable *cancellable,
    GAsyncReadyCallback callback,
    gpointer user_data)
{
  g_dbus_proxy_call (G_DBUS_PROXY (proxy),
    "ListNames",
    g_variant_new ("()"),
    G_DBUS_CALL_FLAGS_NONE,
    -1,
    cancellable,
    callback,
    user_data);
}

/**
 * _g_freedesktop_dbus_call_list_names_finish:
 * @proxy: A #_GFreedesktopDBusProxy.
 * @out_names: (out): Return location for return parameter or %NULL to ignore.
 * @res: The #GAsyncResult obtained from the #GAsyncReadyCallback passed to _g_freedesktop_dbus_call_list_names().
 * @error: Return location for error or %NULL.
 *
 * Finishes an operation started with _g_freedesktop_dbus_call_list_names().
 *
 * Returns: (skip): %TRUE if the call succeded, %FALSE if @error is set.
 */
gboolean
_g_freedesktop_dbus_call_list_names_finish (
    _GFreedesktopDBus *proxy,
    gchar ***out_names,
    GAsyncResult *res,
    GError **error)
{
  GVariant *_ret;
  _ret = g_dbus_proxy_call_finish (G_DBUS_PROXY (proxy), res, error);
  if (_ret == NULL)
    goto _out;
  g_variant_get (_ret,
                 "(^as)",
                 out_names);
  g_variant_unref (_ret);
_out:
  return _ret != NULL;
}

/**
 * _g_freedesktop_dbus_call_list_names_sync:
 * @proxy: A #_GFreedesktopDBusProxy.
 * @out_names: (out): Return location for return parameter or %NULL to ignore.
 * @cancellable: (allow-none): A #GCancellable or %NULL.
 * @error: Return location for error or %NULL.
 *
 * Synchronously invokes the <link linkend="gdbus-method-org-freedesktop-DBus.ListNames">ListNames()</link> D-Bus method on @proxy. The calling thread is blocked until a reply is received.
 *
 * See _g_freedesktop_dbus_call_list_names() for the asynchronous version of this method.
 *
 * Returns: (skip): %TRUE if the call succeded, %FALSE if @error is set.
 */
gboolean
_g_freedesktop_dbus_call_list_names_sync (
    _GFreedesktopDBus *proxy,
    gchar ***out_names,
    GCancellable *cancellable,
    GError **error)
{
  GVariant *_ret;
  _ret = g_dbus_proxy_call_sync (G_DBUS_PROXY (proxy),
    "ListNames",
    g_variant_new ("()"),
    G_DBUS_CALL_FLAGS_NONE,
    -1,
    cancellable,
    error);
  if (_ret == NULL)
    goto _out;
  g_variant_get (_ret,
                 "(^as)",
                 out_names);
  g_variant_unref (_ret);
_out:
  return _ret != NULL;
}

/**
 * _g_freedesktop_dbus_call_list_activatable_names:
 * @proxy: A #_GFreedesktopDBusProxy.
 * @cancellable: (allow-none): A #GCancellable or %NULL.
 * @callback: A #GAsyncReadyCallback to call when the request is satisfied or %NULL.
 * @user_data: User data to pass to @callback.
 *
 * Asynchronously invokes the <link linkend="gdbus-method-org-freedesktop-DBus.ListActivatableNames">ListActivatableNames()</link> D-Bus method on @proxy.
 * When the operation is finished, @callback will be invoked in the <link linkend="g-main-context-push-thread-default">thread-default main loop</link> of the thread you are calling this method from.
 * You can then call _g_freedesktop_dbus_call_list_activatable_names_finish() to get the result of the operation.
 *
 * See _g_freedesktop_dbus_call_list_activatable_names_sync() for the synchronous, blocking version of this method.
 */
void
_g_freedesktop_dbus_call_list_activatable_names (
    _GFreedesktopDBus *proxy,
    GCancellable *cancellable,
    GAsyncReadyCallback callback,
    gpointer user_data)
{
  g_dbus_proxy_call (G_DBUS_PROXY (proxy),
    "ListActivatableNames",
    g_variant_new ("()"),
    G_DBUS_CALL_FLAGS_NONE,
    -1,
    cancellable,
    callback,
    user_data);
}

/**
 * _g_freedesktop_dbus_call_list_activatable_names_finish:
 * @proxy: A #_GFreedesktopDBusProxy.
 * @out_activatable_names: (out): Return location for return parameter or %NULL to ignore.
 * @res: The #GAsyncResult obtained from the #GAsyncReadyCallback passed to _g_freedesktop_dbus_call_list_activatable_names().
 * @error: Return location for error or %NULL.
 *
 * Finishes an operation started with _g_freedesktop_dbus_call_list_activatable_names().
 *
 * Returns: (skip): %TRUE if the call succeded, %FALSE if @error is set.
 */
gboolean
_g_freedesktop_dbus_call_list_activatable_names_finish (
    _GFreedesktopDBus *proxy,
    gchar ***out_activatable_names,
    GAsyncResult *res,
    GError **error)
{
  GVariant *_ret;
  _ret = g_dbus_proxy_call_finish (G_DBUS_PROXY (proxy), res, error);
  if (_ret == NULL)
    goto _out;
  g_variant_get (_ret,
                 "(^as)",
                 out_activatable_names);
  g_variant_unref (_ret);
_out:
  return _ret != NULL;
}

/**
 * _g_freedesktop_dbus_call_list_activatable_names_sync:
 * @proxy: A #_GFreedesktopDBusProxy.
 * @out_activatable_names: (out): Return location for return parameter or %NULL to ignore.
 * @cancellable: (allow-none): A #GCancellable or %NULL.
 * @error: Return location for error or %NULL.
 *
 * Synchronously invokes the <link linkend="gdbus-method-org-freedesktop-DBus.ListActivatableNames">ListActivatableNames()</link> D-Bus method on @proxy. The calling thread is blocked until a reply is received.
 *
 * See _g_freedesktop_dbus_call_list_activatable_names() for the asynchronous version of this method.
 *
 * Returns: (skip): %TRUE if the call succeded, %FALSE if @error is set.
 */
gboolean
_g_freedesktop_dbus_call_list_activatable_names_sync (
    _GFreedesktopDBus *proxy,
    gchar ***out_activatable_names,
    GCancellable *cancellable,
    GError **error)
{
  GVariant *_ret;
  _ret = g_dbus_proxy_call_sync (G_DBUS_PROXY (proxy),
    "ListActivatableNames",
    g_variant_new ("()"),
    G_DBUS_CALL_FLAGS_NONE,
    -1,
    cancellable,
    error);
  if (_ret == NULL)
    goto _out;
  g_variant_get (_ret,
                 "(^as)",
                 out_activatable_names);
  g_variant_unref (_ret);
_out:
  return _ret != NULL;
}

/**
 * _g_freedesktop_dbus_call_add_match:
 * @proxy: A #_GFreedesktopDBusProxy.
 * @arg_rule: Argument to pass with the method invocation.
 * @cancellable: (allow-none): A #GCancellable or %NULL.
 * @callback: A #GAsyncReadyCallback to call when the request is satisfied or %NULL.
 * @user_data: User data to pass to @callback.
 *
 * Asynchronously invokes the <link linkend="gdbus-method-org-freedesktop-DBus.AddMatch">AddMatch()</link> D-Bus method on @proxy.
 * When the operation is finished, @callback will be invoked in the <link linkend="g-main-context-push-thread-default">thread-default main loop</link> of the thread you are calling this method from.
 * You can then call _g_freedesktop_dbus_call_add_match_finish() to get the result of the operation.
 *
 * See _g_freedesktop_dbus_call_add_match_sync() for the synchronous, blocking version of this method.
 */
void
_g_freedesktop_dbus_call_add_match (
    _GFreedesktopDBus *proxy,
    const gchar *arg_rule,
    GCancellable *cancellable,
    GAsyncReadyCallback callback,
    gpointer user_data)
{
  g_dbus_proxy_call (G_DBUS_PROXY (proxy),
    "AddMatch",
    g_variant_new ("(s)",
                   arg_rule),
    G_DBUS_CALL_FLAGS_NONE,
    -1,
    cancellable,
    callback,
    user_data);
}

/**
 * _g_freedesktop_dbus_call_add_match_finish:
 * @proxy: A #_GFreedesktopDBusProxy.
 * @res: The #GAsyncResult obtained from the #GAsyncReadyCallback passed to _g_freedesktop_dbus_call_add_match().
 * @error: Return location for error or %NULL.
 *
 * Finishes an operation started with _g_freedesktop_dbus_call_add_match().
 *
 * Returns: (skip): %TRUE if the call succeded, %FALSE if @error is set.
 */
gboolean
_g_freedesktop_dbus_call_add_match_finish (
    _GFreedesktopDBus *proxy,
    GAsyncResult *res,
    GError **error)
{
  GVariant *_ret;
  _ret = g_dbus_proxy_call_finish (G_DBUS_PROXY (proxy), res, error);
  if (_ret == NULL)
    goto _out;
  g_variant_get (_ret,
                 "()");
  g_variant_unref (_ret);
_out:
  return _ret != NULL;
}

/**
 * _g_freedesktop_dbus_call_add_match_sync:
 * @proxy: A #_GFreedesktopDBusProxy.
 * @arg_rule: Argument to pass with the method invocation.
 * @cancellable: (allow-none): A #GCancellable or %NULL.
 * @error: Return location for error or %NULL.
 *
 * Synchronously invokes the <link linkend="gdbus-method-org-freedesktop-DBus.AddMatch">AddMatch()</link> D-Bus method on @proxy. The calling thread is blocked until a reply is received.
 *
 * See _g_freedesktop_dbus_call_add_match() for the asynchronous version of this method.
 *
 * Returns: (skip): %TRUE if the call succeded, %FALSE if @error is set.
 */
gboolean
_g_freedesktop_dbus_call_add_match_sync (
    _GFreedesktopDBus *proxy,
    const gchar *arg_rule,
    GCancellable *cancellable,
    GError **error)
{
  GVariant *_ret;
  _ret = g_dbus_proxy_call_sync (G_DBUS_PROXY (proxy),
    "AddMatch",
    g_variant_new ("(s)",
                   arg_rule),
    G_DBUS_CALL_FLAGS_NONE,
    -1,
    cancellable,
    error);
  if (_ret == NULL)
    goto _out;
  g_variant_get (_ret,
                 "()");
  g_variant_unref (_ret);
_out:
  return _ret != NULL;
}

/**
 * _g_freedesktop_dbus_call_remove_match:
 * @proxy: A #_GFreedesktopDBusProxy.
 * @arg_rule: Argument to pass with the method invocation.
 * @cancellable: (allow-none): A #GCancellable or %NULL.
 * @callback: A #GAsyncReadyCallback to call when the request is satisfied or %NULL.
 * @user_data: User data to pass to @callback.
 *
 * Asynchronously invokes the <link linkend="gdbus-method-org-freedesktop-DBus.RemoveMatch">RemoveMatch()</link> D-Bus method on @proxy.
 * When the operation is finished, @callback will be invoked in the <link linkend="g-main-context-push-thread-default">thread-default main loop</link> of the thread you are calling this method from.
 * You can then call _g_freedesktop_dbus_call_remove_match_finish() to get the result of the operation.
 *
 * See _g_freedesktop_dbus_call_remove_match_sync() for the synchronous, blocking version of this method.
 */
void
_g_freedesktop_dbus_call_remove_match (
    _GFreedesktopDBus *proxy,
    const gchar *arg_rule,
    GCancellable *cancellable,
    GAsyncReadyCallback callback,
    gpointer user_data)
{
  g_dbus_proxy_call (G_DBUS_PROXY (proxy),
    "RemoveMatch",
    g_variant_new ("(s)",
                   arg_rule),
    G_DBUS_CALL_FLAGS_NONE,
    -1,
    cancellable,
    callback,
    user_data);
}

/**
 * _g_freedesktop_dbus_call_remove_match_finish:
 * @proxy: A #_GFreedesktopDBusProxy.
 * @res: The #GAsyncResult obtained from the #GAsyncReadyCallback passed to _g_freedesktop_dbus_call_remove_match().
 * @error: Return location for error or %NULL.
 *
 * Finishes an operation started with _g_freedesktop_dbus_call_remove_match().
 *
 * Returns: (skip): %TRUE if the call succeded, %FALSE if @error is set.
 */
gboolean
_g_freedesktop_dbus_call_remove_match_finish (
    _GFreedesktopDBus *proxy,
    GAsyncResult *res,
    GError **error)
{
  GVariant *_ret;
  _ret = g_dbus_proxy_call_finish (G_DBUS_PROXY (proxy), res, error);
  if (_ret == NULL)
    goto _out;
  g_variant_get (_ret,
                 "()");
  g_variant_unref (_ret);
_out:
  return _ret != NULL;
}

/**
 * _g_freedesktop_dbus_call_remove_match_sync:
 * @proxy: A #_GFreedesktopDBusProxy.
 * @arg_rule: Argument to pass with the method invocation.
 * @cancellable: (allow-none): A #GCancellable or %NULL.
 * @error: Return location for error or %NULL.
 *
 * Synchronously invokes the <link linkend="gdbus-method-org-freedesktop-DBus.RemoveMatch">RemoveMatch()</link> D-Bus method on @proxy. The calling thread is blocked until a reply is received.
 *
 * See _g_freedesktop_dbus_call_remove_match() for the asynchronous version of this method.
 *
 * Returns: (skip): %TRUE if the call succeded, %FALSE if @error is set.
 */
gboolean
_g_freedesktop_dbus_call_remove_match_sync (
    _GFreedesktopDBus *proxy,
    const gchar *arg_rule,
    GCancellable *cancellable,
    GError **error)
{
  GVariant *_ret;
  _ret = g_dbus_proxy_call_sync (G_DBUS_PROXY (proxy),
    "RemoveMatch",
    g_variant_new ("(s)",
                   arg_rule),
    G_DBUS_CALL_FLAGS_NONE,
    -1,
    cancellable,
    error);
  if (_ret == NULL)
    goto _out;
  g_variant_get (_ret,
                 "()");
  g_variant_unref (_ret);
_out:
  return _ret != NULL;
}

/**
 * _g_freedesktop_dbus_call_get_name_owner:
 * @proxy: A #_GFreedesktopDBusProxy.
 * @arg_name: Argument to pass with the method invocation.
 * @cancellable: (allow-none): A #GCancellable or %NULL.
 * @callback: A #GAsyncReadyCallback to call when the request is satisfied or %NULL.
 * @user_data: User data to pass to @callback.
 *
 * Asynchronously invokes the <link linkend="gdbus-method-org-freedesktop-DBus.GetNameOwner">GetNameOwner()</link> D-Bus method on @proxy.
 * When the operation is finished, @callback will be invoked in the <link linkend="g-main-context-push-thread-default">thread-default main loop</link> of the thread you are calling this method from.
 * You can then call _g_freedesktop_dbus_call_get_name_owner_finish() to get the result of the operation.
 *
 * See _g_freedesktop_dbus_call_get_name_owner_sync() for the synchronous, blocking version of this method.
 */
void
_g_freedesktop_dbus_call_get_name_owner (
    _GFreedesktopDBus *proxy,
    const gchar *arg_name,
    GCancellable *cancellable,
    GAsyncReadyCallback callback,
    gpointer user_data)
{
  g_dbus_proxy_call (G_DBUS_PROXY (proxy),
    "GetNameOwner",
    g_variant_new ("(s)",
                   arg_name),
    G_DBUS_CALL_FLAGS_NONE,
    -1,
    cancellable,
    callback,
    user_data);
}

/**
 * _g_freedesktop_dbus_call_get_name_owner_finish:
 * @proxy: A #_GFreedesktopDBusProxy.
 * @out_unique_name: (out): Return location for return parameter or %NULL to ignore.
 * @res: The #GAsyncResult obtained from the #GAsyncReadyCallback passed to _g_freedesktop_dbus_call_get_name_owner().
 * @error: Return location for error or %NULL.
 *
 * Finishes an operation started with _g_freedesktop_dbus_call_get_name_owner().
 *
 * Returns: (skip): %TRUE if the call succeded, %FALSE if @error is set.
 */
gboolean
_g_freedesktop_dbus_call_get_name_owner_finish (
    _GFreedesktopDBus *proxy,
    gchar **out_unique_name,
    GAsyncResult *res,
    GError **error)
{
  GVariant *_ret;
  _ret = g_dbus_proxy_call_finish (G_DBUS_PROXY (proxy), res, error);
  if (_ret == NULL)
    goto _out;
  g_variant_get (_ret,
                 "(s)",
                 out_unique_name);
  g_variant_unref (_ret);
_out:
  return _ret != NULL;
}

/**
 * _g_freedesktop_dbus_call_get_name_owner_sync:
 * @proxy: A #_GFreedesktopDBusProxy.
 * @arg_name: Argument to pass with the method invocation.
 * @out_unique_name: (out): Return location for return parameter or %NULL to ignore.
 * @cancellable: (allow-none): A #GCancellable or %NULL.
 * @error: Return location for error or %NULL.
 *
 * Synchronously invokes the <link linkend="gdbus-method-org-freedesktop-DBus.GetNameOwner">GetNameOwner()</link> D-Bus method on @proxy. The calling thread is blocked until a reply is received.
 *
 * See _g_freedesktop_dbus_call_get_name_owner() for the asynchronous version of this method.
 *
 * Returns: (skip): %TRUE if the call succeded, %FALSE if @error is set.
 */
gboolean
_g_freedesktop_dbus_call_get_name_owner_sync (
    _GFreedesktopDBus *proxy,
    const gchar *arg_name,
    gchar **out_unique_name,
    GCancellable *cancellable,
    GError **error)
{
  GVariant *_ret;
  _ret = g_dbus_proxy_call_sync (G_DBUS_PROXY (proxy),
    "GetNameOwner",
    g_variant_new ("(s)",
                   arg_name),
    G_DBUS_CALL_FLAGS_NONE,
    -1,
    cancellable,
    error);
  if (_ret == NULL)
    goto _out;
  g_variant_get (_ret,
                 "(s)",
                 out_unique_name);
  g_variant_unref (_ret);
_out:
  return _ret != NULL;
}

/**
 * _g_freedesktop_dbus_call_list_queued_owners:
 * @proxy: A #_GFreedesktopDBusProxy.
 * @arg_name: Argument to pass with the method invocation.
 * @cancellable: (allow-none): A #GCancellable or %NULL.
 * @callback: A #GAsyncReadyCallback to call when the request is satisfied or %NULL.
 * @user_data: User data to pass to @callback.
 *
 * Asynchronously invokes the <link linkend="gdbus-method-org-freedesktop-DBus.ListQueuedOwners">ListQueuedOwners()</link> D-Bus method on @proxy.
 * When the operation is finished, @callback will be invoked in the <link linkend="g-main-context-push-thread-default">thread-default main loop</link> of the thread you are calling this method from.
 * You can then call _g_freedesktop_dbus_call_list_queued_owners_finish() to get the result of the operation.
 *
 * See _g_freedesktop_dbus_call_list_queued_owners_sync() for the synchronous, blocking version of this method.
 */
void
_g_freedesktop_dbus_call_list_queued_owners (
    _GFreedesktopDBus *proxy,
    const gchar *arg_name,
    GCancellable *cancellable,
    GAsyncReadyCallback callback,
    gpointer user_data)
{
  g_dbus_proxy_call (G_DBUS_PROXY (proxy),
    "ListQueuedOwners",
    g_variant_new ("(s)",
                   arg_name),
    G_DBUS_CALL_FLAGS_NONE,
    -1,
    cancellable,
    callback,
    user_data);
}

/**
 * _g_freedesktop_dbus_call_list_queued_owners_finish:
 * @proxy: A #_GFreedesktopDBusProxy.
 * @out_queued_owners: (out): Return location for return parameter or %NULL to ignore.
 * @res: The #GAsyncResult obtained from the #GAsyncReadyCallback passed to _g_freedesktop_dbus_call_list_queued_owners().
 * @error: Return location for error or %NULL.
 *
 * Finishes an operation started with _g_freedesktop_dbus_call_list_queued_owners().
 *
 * Returns: (skip): %TRUE if the call succeded, %FALSE if @error is set.
 */
gboolean
_g_freedesktop_dbus_call_list_queued_owners_finish (
    _GFreedesktopDBus *proxy,
    gchar ***out_queued_owners,
    GAsyncResult *res,
    GError **error)
{
  GVariant *_ret;
  _ret = g_dbus_proxy_call_finish (G_DBUS_PROXY (proxy), res, error);
  if (_ret == NULL)
    goto _out;
  g_variant_get (_ret,
                 "(^as)",
                 out_queued_owners);
  g_variant_unref (_ret);
_out:
  return _ret != NULL;
}

/**
 * _g_freedesktop_dbus_call_list_queued_owners_sync:
 * @proxy: A #_GFreedesktopDBusProxy.
 * @arg_name: Argument to pass with the method invocation.
 * @out_queued_owners: (out): Return location for return parameter or %NULL to ignore.
 * @cancellable: (allow-none): A #GCancellable or %NULL.
 * @error: Return location for error or %NULL.
 *
 * Synchronously invokes the <link linkend="gdbus-method-org-freedesktop-DBus.ListQueuedOwners">ListQueuedOwners()</link> D-Bus method on @proxy. The calling thread is blocked until a reply is received.
 *
 * See _g_freedesktop_dbus_call_list_queued_owners() for the asynchronous version of this method.
 *
 * Returns: (skip): %TRUE if the call succeded, %FALSE if @error is set.
 */
gboolean
_g_freedesktop_dbus_call_list_queued_owners_sync (
    _GFreedesktopDBus *proxy,
    const gchar *arg_name,
    gchar ***out_queued_owners,
    GCancellable *cancellable,
    GError **error)
{
  GVariant *_ret;
  _ret = g_dbus_proxy_call_sync (G_DBUS_PROXY (proxy),
    "ListQueuedOwners",
    g_variant_new ("(s)",
                   arg_name),
    G_DBUS_CALL_FLAGS_NONE,
    -1,
    cancellable,
    error);
  if (_ret == NULL)
    goto _out;
  g_variant_get (_ret,
                 "(^as)",
                 out_queued_owners);
  g_variant_unref (_ret);
_out:
  return _ret != NULL;
}

/**
 * _g_freedesktop_dbus_call_get_connection_unix_user:
 * @proxy: A #_GFreedesktopDBusProxy.
 * @arg_name: Argument to pass with the method invocation.
 * @cancellable: (allow-none): A #GCancellable or %NULL.
 * @callback: A #GAsyncReadyCallback to call when the request is satisfied or %NULL.
 * @user_data: User data to pass to @callback.
 *
 * Asynchronously invokes the <link linkend="gdbus-method-org-freedesktop-DBus.GetConnectionUnixUser">GetConnectionUnixUser()</link> D-Bus method on @proxy.
 * When the operation is finished, @callback will be invoked in the <link linkend="g-main-context-push-thread-default">thread-default main loop</link> of the thread you are calling this method from.
 * You can then call _g_freedesktop_dbus_call_get_connection_unix_user_finish() to get the result of the operation.
 *
 * See _g_freedesktop_dbus_call_get_connection_unix_user_sync() for the synchronous, blocking version of this method.
 */
void
_g_freedesktop_dbus_call_get_connection_unix_user (
    _GFreedesktopDBus *proxy,
    const gchar *arg_name,
    GCancellable *cancellable,
    GAsyncReadyCallback callback,
    gpointer user_data)
{
  g_dbus_proxy_call (G_DBUS_PROXY (proxy),
    "GetConnectionUnixUser",
    g_variant_new ("(s)",
                   arg_name),
    G_DBUS_CALL_FLAGS_NONE,
    -1,
    cancellable,
    callback,
    user_data);
}

/**
 * _g_freedesktop_dbus_call_get_connection_unix_user_finish:
 * @proxy: A #_GFreedesktopDBusProxy.
 * @out_uid: (out): Return location for return parameter or %NULL to ignore.
 * @res: The #GAsyncResult obtained from the #GAsyncReadyCallback passed to _g_freedesktop_dbus_call_get_connection_unix_user().
 * @error: Return location for error or %NULL.
 *
 * Finishes an operation started with _g_freedesktop_dbus_call_get_connection_unix_user().
 *
 * Returns: (skip): %TRUE if the call succeded, %FALSE if @error is set.
 */
gboolean
_g_freedesktop_dbus_call_get_connection_unix_user_finish (
    _GFreedesktopDBus *proxy,
    guint *out_uid,
    GAsyncResult *res,
    GError **error)
{
  GVariant *_ret;
  _ret = g_dbus_proxy_call_finish (G_DBUS_PROXY (proxy), res, error);
  if (_ret == NULL)
    goto _out;
  g_variant_get (_ret,
                 "(u)",
                 out_uid);
  g_variant_unref (_ret);
_out:
  return _ret != NULL;
}

/**
 * _g_freedesktop_dbus_call_get_connection_unix_user_sync:
 * @proxy: A #_GFreedesktopDBusProxy.
 * @arg_name: Argument to pass with the method invocation.
 * @out_uid: (out): Return location for return parameter or %NULL to ignore.
 * @cancellable: (allow-none): A #GCancellable or %NULL.
 * @error: Return location for error or %NULL.
 *
 * Synchronously invokes the <link linkend="gdbus-method-org-freedesktop-DBus.GetConnectionUnixUser">GetConnectionUnixUser()</link> D-Bus method on @proxy. The calling thread is blocked until a reply is received.
 *
 * See _g_freedesktop_dbus_call_get_connection_unix_user() for the asynchronous version of this method.
 *
 * Returns: (skip): %TRUE if the call succeded, %FALSE if @error is set.
 */
gboolean
_g_freedesktop_dbus_call_get_connection_unix_user_sync (
    _GFreedesktopDBus *proxy,
    const gchar *arg_name,
    guint *out_uid,
    GCancellable *cancellable,
    GError **error)
{
  GVariant *_ret;
  _ret = g_dbus_proxy_call_sync (G_DBUS_PROXY (proxy),
    "GetConnectionUnixUser",
    g_variant_new ("(s)",
                   arg_name),
    G_DBUS_CALL_FLAGS_NONE,
    -1,
    cancellable,
    error);
  if (_ret == NULL)
    goto _out;
  g_variant_get (_ret,
                 "(u)",
                 out_uid);
  g_variant_unref (_ret);
_out:
  return _ret != NULL;
}

/**
 * _g_freedesktop_dbus_call_get_connection_unix_process_id:
 * @proxy: A #_GFreedesktopDBusProxy.
 * @arg_name: Argument to pass with the method invocation.
 * @cancellable: (allow-none): A #GCancellable or %NULL.
 * @callback: A #GAsyncReadyCallback to call when the request is satisfied or %NULL.
 * @user_data: User data to pass to @callback.
 *
 * Asynchronously invokes the <link linkend="gdbus-method-org-freedesktop-DBus.GetConnectionUnixProcessID">GetConnectionUnixProcessID()</link> D-Bus method on @proxy.
 * When the operation is finished, @callback will be invoked in the <link linkend="g-main-context-push-thread-default">thread-default main loop</link> of the thread you are calling this method from.
 * You can then call _g_freedesktop_dbus_call_get_connection_unix_process_id_finish() to get the result of the operation.
 *
 * See _g_freedesktop_dbus_call_get_connection_unix_process_id_sync() for the synchronous, blocking version of this method.
 */
void
_g_freedesktop_dbus_call_get_connection_unix_process_id (
    _GFreedesktopDBus *proxy,
    const gchar *arg_name,
    GCancellable *cancellable,
    GAsyncReadyCallback callback,
    gpointer user_data)
{
  g_dbus_proxy_call (G_DBUS_PROXY (proxy),
    "GetConnectionUnixProcessID",
    g_variant_new ("(s)",
                   arg_name),
    G_DBUS_CALL_FLAGS_NONE,
    -1,
    cancellable,
    callback,
    user_data);
}

/**
 * _g_freedesktop_dbus_call_get_connection_unix_process_id_finish:
 * @proxy: A #_GFreedesktopDBusProxy.
 * @out_pid: (out): Return location for return parameter or %NULL to ignore.
 * @res: The #GAsyncResult obtained from the #GAsyncReadyCallback passed to _g_freedesktop_dbus_call_get_connection_unix_process_id().
 * @error: Return location for error or %NULL.
 *
 * Finishes an operation started with _g_freedesktop_dbus_call_get_connection_unix_process_id().
 *
 * Returns: (skip): %TRUE if the call succeded, %FALSE if @error is set.
 */
gboolean
_g_freedesktop_dbus_call_get_connection_unix_process_id_finish (
    _GFreedesktopDBus *proxy,
    guint *out_pid,
    GAsyncResult *res,
    GError **error)
{
  GVariant *_ret;
  _ret = g_dbus_proxy_call_finish (G_DBUS_PROXY (proxy), res, error);
  if (_ret == NULL)
    goto _out;
  g_variant_get (_ret,
                 "(u)",
                 out_pid);
  g_variant_unref (_ret);
_out:
  return _ret != NULL;
}

/**
 * _g_freedesktop_dbus_call_get_connection_unix_process_id_sync:
 * @proxy: A #_GFreedesktopDBusProxy.
 * @arg_name: Argument to pass with the method invocation.
 * @out_pid: (out): Return location for return parameter or %NULL to ignore.
 * @cancellable: (allow-none): A #GCancellable or %NULL.
 * @error: Return location for error or %NULL.
 *
 * Synchronously invokes the <link linkend="gdbus-method-org-freedesktop-DBus.GetConnectionUnixProcessID">GetConnectionUnixProcessID()</link> D-Bus method on @proxy. The calling thread is blocked until a reply is received.
 *
 * See _g_freedesktop_dbus_call_get_connection_unix_process_id() for the asynchronous version of this method.
 *
 * Returns: (skip): %TRUE if the call succeded, %FALSE if @error is set.
 */
gboolean
_g_freedesktop_dbus_call_get_connection_unix_process_id_sync (
    _GFreedesktopDBus *proxy,
    const gchar *arg_name,
    guint *out_pid,
    GCancellable *cancellable,
    GError **error)
{
  GVariant *_ret;
  _ret = g_dbus_proxy_call_sync (G_DBUS_PROXY (proxy),
    "GetConnectionUnixProcessID",
    g_variant_new ("(s)",
                   arg_name),
    G_DBUS_CALL_FLAGS_NONE,
    -1,
    cancellable,
    error);
  if (_ret == NULL)
    goto _out;
  g_variant_get (_ret,
                 "(u)",
                 out_pid);
  g_variant_unref (_ret);
_out:
  return _ret != NULL;
}

/**
 * _g_freedesktop_dbus_call_get_connection_selinux_security_context:
 * @proxy: A #_GFreedesktopDBusProxy.
 * @arg_name: Argument to pass with the method invocation.
 * @cancellable: (allow-none): A #GCancellable or %NULL.
 * @callback: A #GAsyncReadyCallback to call when the request is satisfied or %NULL.
 * @user_data: User data to pass to @callback.
 *
 * Asynchronously invokes the <link linkend="gdbus-method-org-freedesktop-DBus.GetConnectionSELinuxSecurityContext">GetConnectionSELinuxSecurityContext()</link> D-Bus method on @proxy.
 * When the operation is finished, @callback will be invoked in the <link linkend="g-main-context-push-thread-default">thread-default main loop</link> of the thread you are calling this method from.
 * You can then call _g_freedesktop_dbus_call_get_connection_selinux_security_context_finish() to get the result of the operation.
 *
 * See _g_freedesktop_dbus_call_get_connection_selinux_security_context_sync() for the synchronous, blocking version of this method.
 */
void
_g_freedesktop_dbus_call_get_connection_selinux_security_context (
    _GFreedesktopDBus *proxy,
    const gchar *arg_name,
    GCancellable *cancellable,
    GAsyncReadyCallback callback,
    gpointer user_data)
{
  g_dbus_proxy_call (G_DBUS_PROXY (proxy),
    "GetConnectionSELinuxSecurityContext",
    g_variant_new ("(s)",
                   arg_name),
    G_DBUS_CALL_FLAGS_NONE,
    -1,
    cancellable,
    callback,
    user_data);
}

/**
 * _g_freedesktop_dbus_call_get_connection_selinux_security_context_finish:
 * @proxy: A #_GFreedesktopDBusProxy.
 * @out_security_context: (out): Return location for return parameter or %NULL to ignore.
 * @res: The #GAsyncResult obtained from the #GAsyncReadyCallback passed to _g_freedesktop_dbus_call_get_connection_selinux_security_context().
 * @error: Return location for error or %NULL.
 *
 * Finishes an operation started with _g_freedesktop_dbus_call_get_connection_selinux_security_context().
 *
 * Returns: (skip): %TRUE if the call succeded, %FALSE if @error is set.
 */
gboolean
_g_freedesktop_dbus_call_get_connection_selinux_security_context_finish (
    _GFreedesktopDBus *proxy,
    gchar **out_security_context,
    GAsyncResult *res,
    GError **error)
{
  GVariant *_ret;
  _ret = g_dbus_proxy_call_finish (G_DBUS_PROXY (proxy), res, error);
  if (_ret == NULL)
    goto _out;
  g_variant_get (_ret,
                 "(^ay)",
                 out_security_context);
  g_variant_unref (_ret);
_out:
  return _ret != NULL;
}

/**
 * _g_freedesktop_dbus_call_get_connection_selinux_security_context_sync:
 * @proxy: A #_GFreedesktopDBusProxy.
 * @arg_name: Argument to pass with the method invocation.
 * @out_security_context: (out): Return location for return parameter or %NULL to ignore.
 * @cancellable: (allow-none): A #GCancellable or %NULL.
 * @error: Return location for error or %NULL.
 *
 * Synchronously invokes the <link linkend="gdbus-method-org-freedesktop-DBus.GetConnectionSELinuxSecurityContext">GetConnectionSELinuxSecurityContext()</link> D-Bus method on @proxy. The calling thread is blocked until a reply is received.
 *
 * See _g_freedesktop_dbus_call_get_connection_selinux_security_context() for the asynchronous version of this method.
 *
 * Returns: (skip): %TRUE if the call succeded, %FALSE if @error is set.
 */
gboolean
_g_freedesktop_dbus_call_get_connection_selinux_security_context_sync (
    _GFreedesktopDBus *proxy,
    const gchar *arg_name,
    gchar **out_security_context,
    GCancellable *cancellable,
    GError **error)
{
  GVariant *_ret;
  _ret = g_dbus_proxy_call_sync (G_DBUS_PROXY (proxy),
    "GetConnectionSELinuxSecurityContext",
    g_variant_new ("(s)",
                   arg_name),
    G_DBUS_CALL_FLAGS_NONE,
    -1,
    cancellable,
    error);
  if (_ret == NULL)
    goto _out;
  g_variant_get (_ret,
                 "(^ay)",
                 out_security_context);
  g_variant_unref (_ret);
_out:
  return _ret != NULL;
}

/**
 * _g_freedesktop_dbus_call_update_activation_environment:
 * @proxy: A #_GFreedesktopDBusProxy.
 * @arg_environment: Argument to pass with the method invocation.
 * @cancellable: (allow-none): A #GCancellable or %NULL.
 * @callback: A #GAsyncReadyCallback to call when the request is satisfied or %NULL.
 * @user_data: User data to pass to @callback.
 *
 * Asynchronously invokes the <link linkend="gdbus-method-org-freedesktop-DBus.UpdateActivationEnvironment">UpdateActivationEnvironment()</link> D-Bus method on @proxy.
 * When the operation is finished, @callback will be invoked in the <link linkend="g-main-context-push-thread-default">thread-default main loop</link> of the thread you are calling this method from.
 * You can then call _g_freedesktop_dbus_call_update_activation_environment_finish() to get the result of the operation.
 *
 * See _g_freedesktop_dbus_call_update_activation_environment_sync() for the synchronous, blocking version of this method.
 */
void
_g_freedesktop_dbus_call_update_activation_environment (
    _GFreedesktopDBus *proxy,
    GVariant *arg_environment,
    GCancellable *cancellable,
    GAsyncReadyCallback callback,
    gpointer user_data)
{
  g_dbus_proxy_call (G_DBUS_PROXY (proxy),
    "UpdateActivationEnvironment",
    g_variant_new ("(@a{ss})",
                   arg_environment),
    G_DBUS_CALL_FLAGS_NONE,
    -1,
    cancellable,
    callback,
    user_data);
}

/**
 * _g_freedesktop_dbus_call_update_activation_environment_finish:
 * @proxy: A #_GFreedesktopDBusProxy.
 * @res: The #GAsyncResult obtained from the #GAsyncReadyCallback passed to _g_freedesktop_dbus_call_update_activation_environment().
 * @error: Return location for error or %NULL.
 *
 * Finishes an operation started with _g_freedesktop_dbus_call_update_activation_environment().
 *
 * Returns: (skip): %TRUE if the call succeded, %FALSE if @error is set.
 */
gboolean
_g_freedesktop_dbus_call_update_activation_environment_finish (
    _GFreedesktopDBus *proxy,
    GAsyncResult *res,
    GError **error)
{
  GVariant *_ret;
  _ret = g_dbus_proxy_call_finish (G_DBUS_PROXY (proxy), res, error);
  if (_ret == NULL)
    goto _out;
  g_variant_get (_ret,
                 "()");
  g_variant_unref (_ret);
_out:
  return _ret != NULL;
}

/**
 * _g_freedesktop_dbus_call_update_activation_environment_sync:
 * @proxy: A #_GFreedesktopDBusProxy.
 * @arg_environment: Argument to pass with the method invocation.
 * @cancellable: (allow-none): A #GCancellable or %NULL.
 * @error: Return location for error or %NULL.
 *
 * Synchronously invokes the <link linkend="gdbus-method-org-freedesktop-DBus.UpdateActivationEnvironment">UpdateActivationEnvironment()</link> D-Bus method on @proxy. The calling thread is blocked until a reply is received.
 *
 * See _g_freedesktop_dbus_call_update_activation_environment() for the asynchronous version of this method.
 *
 * Returns: (skip): %TRUE if the call succeded, %FALSE if @error is set.
 */
gboolean
_g_freedesktop_dbus_call_update_activation_environment_sync (
    _GFreedesktopDBus *proxy,
    GVariant *arg_environment,
    GCancellable *cancellable,
    GError **error)
{
  GVariant *_ret;
  _ret = g_dbus_proxy_call_sync (G_DBUS_PROXY (proxy),
    "UpdateActivationEnvironment",
    g_variant_new ("(@a{ss})",
                   arg_environment),
    G_DBUS_CALL_FLAGS_NONE,
    -1,
    cancellable,
    error);
  if (_ret == NULL)
    goto _out;
  g_variant_get (_ret,
                 "()");
  g_variant_unref (_ret);
_out:
  return _ret != NULL;
}

/**
 * _g_freedesktop_dbus_call_reload_config:
 * @proxy: A #_GFreedesktopDBusProxy.
 * @cancellable: (allow-none): A #GCancellable or %NULL.
 * @callback: A #GAsyncReadyCallback to call when the request is satisfied or %NULL.
 * @user_data: User data to pass to @callback.
 *
 * Asynchronously invokes the <link linkend="gdbus-method-org-freedesktop-DBus.ReloadConfig">ReloadConfig()</link> D-Bus method on @proxy.
 * When the operation is finished, @callback will be invoked in the <link linkend="g-main-context-push-thread-default">thread-default main loop</link> of the thread you are calling this method from.
 * You can then call _g_freedesktop_dbus_call_reload_config_finish() to get the result of the operation.
 *
 * See _g_freedesktop_dbus_call_reload_config_sync() for the synchronous, blocking version of this method.
 */
void
_g_freedesktop_dbus_call_reload_config (
    _GFreedesktopDBus *proxy,
    GCancellable *cancellable,
    GAsyncReadyCallback callback,
    gpointer user_data)
{
  g_dbus_proxy_call (G_DBUS_PROXY (proxy),
    "ReloadConfig",
    g_variant_new ("()"),
    G_DBUS_CALL_FLAGS_NONE,
    -1,
    cancellable,
    callback,
    user_data);
}

/**
 * _g_freedesktop_dbus_call_reload_config_finish:
 * @proxy: A #_GFreedesktopDBusProxy.
 * @res: The #GAsyncResult obtained from the #GAsyncReadyCallback passed to _g_freedesktop_dbus_call_reload_config().
 * @error: Return location for error or %NULL.
 *
 * Finishes an operation started with _g_freedesktop_dbus_call_reload_config().
 *
 * Returns: (skip): %TRUE if the call succeded, %FALSE if @error is set.
 */
gboolean
_g_freedesktop_dbus_call_reload_config_finish (
    _GFreedesktopDBus *proxy,
    GAsyncResult *res,
    GError **error)
{
  GVariant *_ret;
  _ret = g_dbus_proxy_call_finish (G_DBUS_PROXY (proxy), res, error);
  if (_ret == NULL)
    goto _out;
  g_variant_get (_ret,
                 "()");
  g_variant_unref (_ret);
_out:
  return _ret != NULL;
}

/**
 * _g_freedesktop_dbus_call_reload_config_sync:
 * @proxy: A #_GFreedesktopDBusProxy.
 * @cancellable: (allow-none): A #GCancellable or %NULL.
 * @error: Return location for error or %NULL.
 *
 * Synchronously invokes the <link linkend="gdbus-method-org-freedesktop-DBus.ReloadConfig">ReloadConfig()</link> D-Bus method on @proxy. The calling thread is blocked until a reply is received.
 *
 * See _g_freedesktop_dbus_call_reload_config() for the asynchronous version of this method.
 *
 * Returns: (skip): %TRUE if the call succeded, %FALSE if @error is set.
 */
gboolean
_g_freedesktop_dbus_call_reload_config_sync (
    _GFreedesktopDBus *proxy,
    GCancellable *cancellable,
    GError **error)
{
  GVariant *_ret;
  _ret = g_dbus_proxy_call_sync (G_DBUS_PROXY (proxy),
    "ReloadConfig",
    g_variant_new ("()"),
    G_DBUS_CALL_FLAGS_NONE,
    -1,
    cancellable,
    error);
  if (_ret == NULL)
    goto _out;
  g_variant_get (_ret,
                 "()");
  g_variant_unref (_ret);
_out:
  return _ret != NULL;
}

/**
 * _g_freedesktop_dbus_call_get_id:
 * @proxy: A #_GFreedesktopDBusProxy.
 * @cancellable: (allow-none): A #GCancellable or %NULL.
 * @callback: A #GAsyncReadyCallback to call when the request is satisfied or %NULL.
 * @user_data: User data to pass to @callback.
 *
 * Asynchronously invokes the <link linkend="gdbus-method-org-freedesktop-DBus.GetId">GetId()</link> D-Bus method on @proxy.
 * When the operation is finished, @callback will be invoked in the <link linkend="g-main-context-push-thread-default">thread-default main loop</link> of the thread you are calling this method from.
 * You can then call _g_freedesktop_dbus_call_get_id_finish() to get the result of the operation.
 *
 * See _g_freedesktop_dbus_call_get_id_sync() for the synchronous, blocking version of this method.
 */
void
_g_freedesktop_dbus_call_get_id (
    _GFreedesktopDBus *proxy,
    GCancellable *cancellable,
    GAsyncReadyCallback callback,
    gpointer user_data)
{
  g_dbus_proxy_call (G_DBUS_PROXY (proxy),
    "GetId",
    g_variant_new ("()"),
    G_DBUS_CALL_FLAGS_NONE,
    -1,
    cancellable,
    callback,
    user_data);
}

/**
 * _g_freedesktop_dbus_call_get_id_finish:
 * @proxy: A #_GFreedesktopDBusProxy.
 * @out_unique_id: (out): Return location for return parameter or %NULL to ignore.
 * @res: The #GAsyncResult obtained from the #GAsyncReadyCallback passed to _g_freedesktop_dbus_call_get_id().
 * @error: Return location for error or %NULL.
 *
 * Finishes an operation started with _g_freedesktop_dbus_call_get_id().
 *
 * Returns: (skip): %TRUE if the call succeded, %FALSE if @error is set.
 */
gboolean
_g_freedesktop_dbus_call_get_id_finish (
    _GFreedesktopDBus *proxy,
    gchar **out_unique_id,
    GAsyncResult *res,
    GError **error)
{
  GVariant *_ret;
  _ret = g_dbus_proxy_call_finish (G_DBUS_PROXY (proxy), res, error);
  if (_ret == NULL)
    goto _out;
  g_variant_get (_ret,
                 "(s)",
                 out_unique_id);
  g_variant_unref (_ret);
_out:
  return _ret != NULL;
}

/**
 * _g_freedesktop_dbus_call_get_id_sync:
 * @proxy: A #_GFreedesktopDBusProxy.
 * @out_unique_id: (out): Return location for return parameter or %NULL to ignore.
 * @cancellable: (allow-none): A #GCancellable or %NULL.
 * @error: Return location for error or %NULL.
 *
 * Synchronously invokes the <link linkend="gdbus-method-org-freedesktop-DBus.GetId">GetId()</link> D-Bus method on @proxy. The calling thread is blocked until a reply is received.
 *
 * See _g_freedesktop_dbus_call_get_id() for the asynchronous version of this method.
 *
 * Returns: (skip): %TRUE if the call succeded, %FALSE if @error is set.
 */
gboolean
_g_freedesktop_dbus_call_get_id_sync (
    _GFreedesktopDBus *proxy,
    gchar **out_unique_id,
    GCancellable *cancellable,
    GError **error)
{
  GVariant *_ret;
  _ret = g_dbus_proxy_call_sync (G_DBUS_PROXY (proxy),
    "GetId",
    g_variant_new ("()"),
    G_DBUS_CALL_FLAGS_NONE,
    -1,
    cancellable,
    error);
  if (_ret == NULL)
    goto _out;
  g_variant_get (_ret,
                 "(s)",
                 out_unique_id);
  g_variant_unref (_ret);
_out:
  return _ret != NULL;
}

/**
 * _g_freedesktop_dbus_complete_hello:
 * @object: A #_GFreedesktopDBus.
 * @invocation: (transfer full): A #GDBusMethodInvocation.
 * @assigned_name: Parameter to return.
 *
 * Helper function used in service implementations to finish handling invocations of the <link linkend="gdbus-method-org-freedesktop-DBus.Hello">Hello()</link> D-Bus method. If you instead want to finish handling an invocation by returning an error, use g_dbus_method_invocation_return_error() or similar.
 *
 * This method will free @invocation, you cannot use it afterwards.
 */
void
_g_freedesktop_dbus_complete_hello (
    _GFreedesktopDBus *object,
    GDBusMethodInvocation *invocation,
    const gchar *assigned_name)
{
  g_dbus_method_invocation_return_value (invocation,
    g_variant_new ("(s)",
                   assigned_name));
}

/**
 * _g_freedesktop_dbus_complete_request_name:
 * @object: A #_GFreedesktopDBus.
 * @invocation: (transfer full): A #GDBusMethodInvocation.
 * @value: Parameter to return.
 *
 * Helper function used in service implementations to finish handling invocations of the <link linkend="gdbus-method-org-freedesktop-DBus.RequestName">RequestName()</link> D-Bus method. If you instead want to finish handling an invocation by returning an error, use g_dbus_method_invocation_return_error() or similar.
 *
 * This method will free @invocation, you cannot use it afterwards.
 */
void
_g_freedesktop_dbus_complete_request_name (
    _GFreedesktopDBus *object,
    GDBusMethodInvocation *invocation,
    guint value)
{
  g_dbus_method_invocation_return_value (invocation,
    g_variant_new ("(u)",
                   value));
}

/**
 * _g_freedesktop_dbus_complete_release_name:
 * @object: A #_GFreedesktopDBus.
 * @invocation: (transfer full): A #GDBusMethodInvocation.
 * @value: Parameter to return.
 *
 * Helper function used in service implementations to finish handling invocations of the <link linkend="gdbus-method-org-freedesktop-DBus.ReleaseName">ReleaseName()</link> D-Bus method. If you instead want to finish handling an invocation by returning an error, use g_dbus_method_invocation_return_error() or similar.
 *
 * This method will free @invocation, you cannot use it afterwards.
 */
void
_g_freedesktop_dbus_complete_release_name (
    _GFreedesktopDBus *object,
    GDBusMethodInvocation *invocation,
    guint value)
{
  g_dbus_method_invocation_return_value (invocation,
    g_variant_new ("(u)",
                   value));
}

/**
 * _g_freedesktop_dbus_complete_start_service_by_name:
 * @object: A #_GFreedesktopDBus.
 * @invocation: (transfer full): A #GDBusMethodInvocation.
 * @value: Parameter to return.
 *
 * Helper function used in service implementations to finish handling invocations of the <link linkend="gdbus-method-org-freedesktop-DBus.StartServiceByName">StartServiceByName()</link> D-Bus method. If you instead want to finish handling an invocation by returning an error, use g_dbus_method_invocation_return_error() or similar.
 *
 * This method will free @invocation, you cannot use it afterwards.
 */
void
_g_freedesktop_dbus_complete_start_service_by_name (
    _GFreedesktopDBus *object,
    GDBusMethodInvocation *invocation,
    guint value)
{
  g_dbus_method_invocation_return_value (invocation,
    g_variant_new ("(u)",
                   value));
}

/**
 * _g_freedesktop_dbus_complete_name_has_owner:
 * @object: A #_GFreedesktopDBus.
 * @invocation: (transfer full): A #GDBusMethodInvocation.
 * @has_owner: Parameter to return.
 *
 * Helper function used in service implementations to finish handling invocations of the <link linkend="gdbus-method-org-freedesktop-DBus.NameHasOwner">NameHasOwner()</link> D-Bus method. If you instead want to finish handling an invocation by returning an error, use g_dbus_method_invocation_return_error() or similar.
 *
 * This method will free @invocation, you cannot use it afterwards.
 */
void
_g_freedesktop_dbus_complete_name_has_owner (
    _GFreedesktopDBus *object,
    GDBusMethodInvocation *invocation,
    gboolean has_owner)
{
  g_dbus_method_invocation_return_value (invocation,
    g_variant_new ("(b)",
                   has_owner));
}

/**
 * _g_freedesktop_dbus_complete_list_names:
 * @object: A #_GFreedesktopDBus.
 * @invocation: (transfer full): A #GDBusMethodInvocation.
 * @names: Parameter to return.
 *
 * Helper function used in service implementations to finish handling invocations of the <link linkend="gdbus-method-org-freedesktop-DBus.ListNames">ListNames()</link> D-Bus method. If you instead want to finish handling an invocation by returning an error, use g_dbus_method_invocation_return_error() or similar.
 *
 * This method will free @invocation, you cannot use it afterwards.
 */
void
_g_freedesktop_dbus_complete_list_names (
    _GFreedesktopDBus *object,
    GDBusMethodInvocation *invocation,
    const gchar *const *names)
{
  g_dbus_method_invocation_return_value (invocation,
    g_variant_new ("(^as)",
                   names));
}

/**
 * _g_freedesktop_dbus_complete_list_activatable_names:
 * @object: A #_GFreedesktopDBus.
 * @invocation: (transfer full): A #GDBusMethodInvocation.
 * @activatable_names: Parameter to return.
 *
 * Helper function used in service implementations to finish handling invocations of the <link linkend="gdbus-method-org-freedesktop-DBus.ListActivatableNames">ListActivatableNames()</link> D-Bus method. If you instead want to finish handling an invocation by returning an error, use g_dbus_method_invocation_return_error() or similar.
 *
 * This method will free @invocation, you cannot use it afterwards.
 */
void
_g_freedesktop_dbus_complete_list_activatable_names (
    _GFreedesktopDBus *object,
    GDBusMethodInvocation *invocation,
    const gchar *const *activatable_names)
{
  g_dbus_method_invocation_return_value (invocation,
    g_variant_new ("(^as)",
                   activatable_names));
}

/**
 * _g_freedesktop_dbus_complete_add_match:
 * @object: A #_GFreedesktopDBus.
 * @invocation: (transfer full): A #GDBusMethodInvocation.
 *
 * Helper function used in service implementations to finish handling invocations of the <link linkend="gdbus-method-org-freedesktop-DBus.AddMatch">AddMatch()</link> D-Bus method. If you instead want to finish handling an invocation by returning an error, use g_dbus_method_invocation_return_error() or similar.
 *
 * This method will free @invocation, you cannot use it afterwards.
 */
void
_g_freedesktop_dbus_complete_add_match (
    _GFreedesktopDBus *object,
    GDBusMethodInvocation *invocation)
{
  g_dbus_method_invocation_return_value (invocation,
    g_variant_new ("()"));
}

/**
 * _g_freedesktop_dbus_complete_remove_match:
 * @object: A #_GFreedesktopDBus.
 * @invocation: (transfer full): A #GDBusMethodInvocation.
 *
 * Helper function used in service implementations to finish handling invocations of the <link linkend="gdbus-method-org-freedesktop-DBus.RemoveMatch">RemoveMatch()</link> D-Bus method. If you instead want to finish handling an invocation by returning an error, use g_dbus_method_invocation_return_error() or similar.
 *
 * This method will free @invocation, you cannot use it afterwards.
 */
void
_g_freedesktop_dbus_complete_remove_match (
    _GFreedesktopDBus *object,
    GDBusMethodInvocation *invocation)
{
  g_dbus_method_invocation_return_value (invocation,
    g_variant_new ("()"));
}

/**
 * _g_freedesktop_dbus_complete_get_name_owner:
 * @object: A #_GFreedesktopDBus.
 * @invocation: (transfer full): A #GDBusMethodInvocation.
 * @unique_name: Parameter to return.
 *
 * Helper function used in service implementations to finish handling invocations of the <link linkend="gdbus-method-org-freedesktop-DBus.GetNameOwner">GetNameOwner()</link> D-Bus method. If you instead want to finish handling an invocation by returning an error, use g_dbus_method_invocation_return_error() or similar.
 *
 * This method will free @invocation, you cannot use it afterwards.
 */
void
_g_freedesktop_dbus_complete_get_name_owner (
    _GFreedesktopDBus *object,
    GDBusMethodInvocation *invocation,
    const gchar *unique_name)
{
  g_dbus_method_invocation_return_value (invocation,
    g_variant_new ("(s)",
                   unique_name));
}

/**
 * _g_freedesktop_dbus_complete_list_queued_owners:
 * @object: A #_GFreedesktopDBus.
 * @invocation: (transfer full): A #GDBusMethodInvocation.
 * @queued_owners: Parameter to return.
 *
 * Helper function used in service implementations to finish handling invocations of the <link linkend="gdbus-method-org-freedesktop-DBus.ListQueuedOwners">ListQueuedOwners()</link> D-Bus method. If you instead want to finish handling an invocation by returning an error, use g_dbus_method_invocation_return_error() or similar.
 *
 * This method will free @invocation, you cannot use it afterwards.
 */
void
_g_freedesktop_dbus_complete_list_queued_owners (
    _GFreedesktopDBus *object,
    GDBusMethodInvocation *invocation,
    const gchar *const *queued_owners)
{
  g_dbus_method_invocation_return_value (invocation,
    g_variant_new ("(^as)",
                   queued_owners));
}

/**
 * _g_freedesktop_dbus_complete_get_connection_unix_user:
 * @object: A #_GFreedesktopDBus.
 * @invocation: (transfer full): A #GDBusMethodInvocation.
 * @uid: Parameter to return.
 *
 * Helper function used in service implementations to finish handling invocations of the <link linkend="gdbus-method-org-freedesktop-DBus.GetConnectionUnixUser">GetConnectionUnixUser()</link> D-Bus method. If you instead want to finish handling an invocation by returning an error, use g_dbus_method_invocation_return_error() or similar.
 *
 * This method will free @invocation, you cannot use it afterwards.
 */
void
_g_freedesktop_dbus_complete_get_connection_unix_user (
    _GFreedesktopDBus *object,
    GDBusMethodInvocation *invocation,
    guint uid)
{
  g_dbus_method_invocation_return_value (invocation,
    g_variant_new ("(u)",
                   uid));
}

/**
 * _g_freedesktop_dbus_complete_get_connection_unix_process_id:
 * @object: A #_GFreedesktopDBus.
 * @invocation: (transfer full): A #GDBusMethodInvocation.
 * @pid: Parameter to return.
 *
 * Helper function used in service implementations to finish handling invocations of the <link linkend="gdbus-method-org-freedesktop-DBus.GetConnectionUnixProcessID">GetConnectionUnixProcessID()</link> D-Bus method. If you instead want to finish handling an invocation by returning an error, use g_dbus_method_invocation_return_error() or similar.
 *
 * This method will free @invocation, you cannot use it afterwards.
 */
void
_g_freedesktop_dbus_complete_get_connection_unix_process_id (
    _GFreedesktopDBus *object,
    GDBusMethodInvocation *invocation,
    guint pid)
{
  g_dbus_method_invocation_return_value (invocation,
    g_variant_new ("(u)",
                   pid));
}

/**
 * _g_freedesktop_dbus_complete_get_connection_selinux_security_context:
 * @object: A #_GFreedesktopDBus.
 * @invocation: (transfer full): A #GDBusMethodInvocation.
 * @security_context: Parameter to return.
 *
 * Helper function used in service implementations to finish handling invocations of the <link linkend="gdbus-method-org-freedesktop-DBus.GetConnectionSELinuxSecurityContext">GetConnectionSELinuxSecurityContext()</link> D-Bus method. If you instead want to finish handling an invocation by returning an error, use g_dbus_method_invocation_return_error() or similar.
 *
 * This method will free @invocation, you cannot use it afterwards.
 */
void
_g_freedesktop_dbus_complete_get_connection_selinux_security_context (
    _GFreedesktopDBus *object,
    GDBusMethodInvocation *invocation,
    const gchar *security_context)
{
  g_dbus_method_invocation_return_value (invocation,
    g_variant_new ("(^ay)",
                   security_context));
}

/**
 * _g_freedesktop_dbus_complete_update_activation_environment:
 * @object: A #_GFreedesktopDBus.
 * @invocation: (transfer full): A #GDBusMethodInvocation.
 *
 * Helper function used in service implementations to finish handling invocations of the <link linkend="gdbus-method-org-freedesktop-DBus.UpdateActivationEnvironment">UpdateActivationEnvironment()</link> D-Bus method. If you instead want to finish handling an invocation by returning an error, use g_dbus_method_invocation_return_error() or similar.
 *
 * This method will free @invocation, you cannot use it afterwards.
 */
void
_g_freedesktop_dbus_complete_update_activation_environment (
    _GFreedesktopDBus *object,
    GDBusMethodInvocation *invocation)
{
  g_dbus_method_invocation_return_value (invocation,
    g_variant_new ("()"));
}

/**
 * _g_freedesktop_dbus_complete_reload_config:
 * @object: A #_GFreedesktopDBus.
 * @invocation: (transfer full): A #GDBusMethodInvocation.
 *
 * Helper function used in service implementations to finish handling invocations of the <link linkend="gdbus-method-org-freedesktop-DBus.ReloadConfig">ReloadConfig()</link> D-Bus method. If you instead want to finish handling an invocation by returning an error, use g_dbus_method_invocation_return_error() or similar.
 *
 * This method will free @invocation, you cannot use it afterwards.
 */
void
_g_freedesktop_dbus_complete_reload_config (
    _GFreedesktopDBus *object,
    GDBusMethodInvocation *invocation)
{
  g_dbus_method_invocation_return_value (invocation,
    g_variant_new ("()"));
}

/**
 * _g_freedesktop_dbus_complete_get_id:
 * @object: A #_GFreedesktopDBus.
 * @invocation: (transfer full): A #GDBusMethodInvocation.
 * @unique_id: Parameter to return.
 *
 * Helper function used in service implementations to finish handling invocations of the <link linkend="gdbus-method-org-freedesktop-DBus.GetId">GetId()</link> D-Bus method. If you instead want to finish handling an invocation by returning an error, use g_dbus_method_invocation_return_error() or similar.
 *
 * This method will free @invocation, you cannot use it afterwards.
 */
void
_g_freedesktop_dbus_complete_get_id (
    _GFreedesktopDBus *object,
    GDBusMethodInvocation *invocation,
    const gchar *unique_id)
{
  g_dbus_method_invocation_return_value (invocation,
    g_variant_new ("(s)",
                   unique_id));
}

/* ------------------------------------------------------------------------ */

/**
 * _GFreedesktopDBusProxy:
 *
 * The #_GFreedesktopDBusProxy structure contains only private data and should only be accessed using the provided API.
 */

/**
 * _GFreedesktopDBusProxyClass:
 * @parent_class: The parent class.
 *
 * Class structure for #_GFreedesktopDBusProxy.
 */

struct __GFreedesktopDBusProxyPrivate
{
  GData *qdata;
};

static void _g_freedesktop_dbus_proxy_iface_init (_GFreedesktopDBusIface *iface);

#if GLIB_VERSION_MAX_ALLOWED >= GLIB_VERSION_2_38
G_DEFINE_TYPE_WITH_CODE (_GFreedesktopDBusProxy, _g_freedesktop_dbus_proxy, G_TYPE_DBUS_PROXY,
                         G_ADD_PRIVATE (_GFreedesktopDBusProxy)
                         G_IMPLEMENT_INTERFACE (_G_TYPE_FREEDESKTOP_DBUS, _g_freedesktop_dbus_proxy_iface_init));

#else
G_DEFINE_TYPE_WITH_CODE (_GFreedesktopDBusProxy, _g_freedesktop_dbus_proxy, G_TYPE_DBUS_PROXY,
                         G_IMPLEMENT_INTERFACE (_G_TYPE_FREEDESKTOP_DBUS, _g_freedesktop_dbus_proxy_iface_init));

#endif
static void
_g_freedesktop_dbus_proxy_finalize (GObject *object)
{
  _GFreedesktopDBusProxy *proxy = _G_FREEDESKTOP_DBUS_PROXY (object);
  g_datalist_clear (&proxy->priv->qdata);
  G_OBJECT_CLASS (_g_freedesktop_dbus_proxy_parent_class)->finalize (object);
}

static void
_g_freedesktop_dbus_proxy_get_property (GObject      *object,
  guint         prop_id,
  GValue       *value,
  GParamSpec   *pspec G_GNUC_UNUSED)
{
}

static void
_g_freedesktop_dbus_proxy_set_property (GObject      *object,
  guint         prop_id,
  const GValue *value,
  GParamSpec   *pspec G_GNUC_UNUSED)
{
}

static void
_g_freedesktop_dbus_proxy_g_signal (GDBusProxy *proxy,
  const gchar *sender_name G_GNUC_UNUSED,
  const gchar *signal_name,
  GVariant *parameters)
{
  _ExtendedGDBusSignalInfo *info;
  GVariantIter iter;
  GVariant *child;
  GValue *paramv;
  guint num_params;
  guint n;
  guint signal_id;
  info = (_ExtendedGDBusSignalInfo *) g_dbus_interface_info_lookup_signal ((GDBusInterfaceInfo *) &__g_freedesktop_dbus_interface_info.parent_struct, signal_name);
  if (info == NULL)
    return;
  num_params = g_variant_n_children (parameters);
  paramv = g_new0 (GValue, num_params + 1);
  g_value_init (&paramv[0], _G_TYPE_FREEDESKTOP_DBUS);
  g_value_set_object (&paramv[0], proxy);
  g_variant_iter_init (&iter, parameters);
  n = 1;
  while ((child = g_variant_iter_next_value (&iter)) != NULL)
    {
      _ExtendedGDBusArgInfo *arg_info = (_ExtendedGDBusArgInfo *) info->parent_struct.args[n - 1];
      if (arg_info->use_gvariant)
        {
          g_value_init (&paramv[n], G_TYPE_VARIANT);
          g_value_set_variant (&paramv[n], child);
          n++;
        }
      else
        g_dbus_gvariant_to_gvalue (child, &paramv[n++]);
      g_variant_unref (child);
    }
  signal_id = g_signal_lookup (info->signal_name, _G_TYPE_FREEDESKTOP_DBUS);
  g_signal_emitv (paramv, signal_id, 0, NULL);
  for (n = 0; n < num_params + 1; n++)
    g_value_unset (&paramv[n]);
  g_free (paramv);
}

static void
_g_freedesktop_dbus_proxy_g_properties_changed (GDBusProxy *_proxy,
  GVariant *changed_properties,
  const gchar *const *invalidated_properties)
{
  _GFreedesktopDBusProxy *proxy = _G_FREEDESKTOP_DBUS_PROXY (_proxy);
  guint n;
  const gchar *key;
  GVariantIter *iter;
  _ExtendedGDBusPropertyInfo *info;
  g_variant_get (changed_properties, "a{sv}", &iter);
  while (g_variant_iter_next (iter, "{&sv}", &key, NULL))
    {
      info = (_ExtendedGDBusPropertyInfo *) g_dbus_interface_info_lookup_property ((GDBusInterfaceInfo *) &__g_freedesktop_dbus_interface_info.parent_struct, key);
      g_datalist_remove_data (&proxy->priv->qdata, key);
      if (info != NULL)
        g_object_notify (G_OBJECT (proxy), info->hyphen_name);
    }
  g_variant_iter_free (iter);
  for (n = 0; invalidated_properties[n] != NULL; n++)
    {
      info = (_ExtendedGDBusPropertyInfo *) g_dbus_interface_info_lookup_property ((GDBusInterfaceInfo *) &__g_freedesktop_dbus_interface_info.parent_struct, invalidated_properties[n]);
      g_datalist_remove_data (&proxy->priv->qdata, invalidated_properties[n]);
      if (info != NULL)
        g_object_notify (G_OBJECT (proxy), info->hyphen_name);
    }
}

static void
_g_freedesktop_dbus_proxy_init (_GFreedesktopDBusProxy *proxy)
{
#if GLIB_VERSION_MAX_ALLOWED >= GLIB_VERSION_2_38
  proxy->priv = _g_freedesktop_dbus_proxy_get_instance_private (proxy);
#else
  proxy->priv = G_TYPE_INSTANCE_GET_PRIVATE (proxy, _G_TYPE_FREEDESKTOP_DBUS_PROXY, _GFreedesktopDBusProxyPrivate);
#endif

  g_dbus_proxy_set_interface_info (G_DBUS_PROXY (proxy), _g_freedesktop_dbus_interface_info ());
}

static void
_g_freedesktop_dbus_proxy_class_init (_GFreedesktopDBusProxyClass *klass)
{
  GObjectClass *gobject_class;
  GDBusProxyClass *proxy_class;

  gobject_class = G_OBJECT_CLASS (klass);
  gobject_class->finalize     = _g_freedesktop_dbus_proxy_finalize;
  gobject_class->get_property = _g_freedesktop_dbus_proxy_get_property;
  gobject_class->set_property = _g_freedesktop_dbus_proxy_set_property;

  proxy_class = G_DBUS_PROXY_CLASS (klass);
  proxy_class->g_signal = _g_freedesktop_dbus_proxy_g_signal;
  proxy_class->g_properties_changed = _g_freedesktop_dbus_proxy_g_properties_changed;

#if GLIB_VERSION_MAX_ALLOWED < GLIB_VERSION_2_38
  g_type_class_add_private (klass, sizeof (_GFreedesktopDBusProxyPrivate));
#endif
}

static void
_g_freedesktop_dbus_proxy_iface_init (_GFreedesktopDBusIface *iface)
{
}

/**
 * _g_freedesktop_dbus_proxy_new:
 * @connection: A #GDBusConnection.
 * @flags: Flags from the #GDBusProxyFlags enumeration.
 * @name: (allow-none): A bus name (well-known or unique) or %NULL if @connection is not a message bus connection.
 * @object_path: An object path.
 * @cancellable: (allow-none): A #GCancellable or %NULL.
 * @callback: A #GAsyncReadyCallback to call when the request is satisfied.
 * @user_data: User data to pass to @callback.
 *
 * Asynchronously creates a proxy for the D-Bus interface <link linkend="gdbus-interface-org-freedesktop-DBus.top_of_page">org.freedesktop.DBus</link>. See g_dbus_proxy_new() for more details.
 *
 * When the operation is finished, @callback will be invoked in the <link linkend="g-main-context-push-thread-default">thread-default main loop</link> of the thread you are calling this method from.
 * You can then call _g_freedesktop_dbus_proxy_new_finish() to get the result of the operation.
 *
 * See _g_freedesktop_dbus_proxy_new_sync() for the synchronous, blocking version of this constructor.
 */
void
_g_freedesktop_dbus_proxy_new (
    GDBusConnection     *connection,
    GDBusProxyFlags      flags,
    const gchar         *name,
    const gchar         *object_path,
    GCancellable        *cancellable,
    GAsyncReadyCallback  callback,
    gpointer             user_data)
{
  g_async_initable_new_async (_G_TYPE_FREEDESKTOP_DBUS_PROXY, G_PRIORITY_DEFAULT, cancellable, callback, user_data, "g-flags", flags, "g-name", name, "g-connection", connection, "g-object-path", object_path, "g-interface-name", "org.freedesktop.DBus", NULL);
}

/**
 * _g_freedesktop_dbus_proxy_new_finish:
 * @res: The #GAsyncResult obtained from the #GAsyncReadyCallback passed to _g_freedesktop_dbus_proxy_new().
 * @error: Return location for error or %NULL
 *
 * Finishes an operation started with _g_freedesktop_dbus_proxy_new().
 *
 * Returns: (transfer full) (type _GFreedesktopDBusProxy): The constructed proxy object or %NULL if @error is set.
 */
_GFreedesktopDBus *
_g_freedesktop_dbus_proxy_new_finish (
    GAsyncResult        *res,
    GError             **error)
{
  GObject *ret;
  GObject *source_object;
  source_object = g_async_result_get_source_object (res);
  ret = g_async_initable_new_finish (G_ASYNC_INITABLE (source_object), res, error);
  g_object_unref (source_object);
  if (ret != NULL)
    return _G_FREEDESKTOP_DBUS (ret);
  else
    return NULL;
}

/**
 * _g_freedesktop_dbus_proxy_new_sync:
 * @connection: A #GDBusConnection.
 * @flags: Flags from the #GDBusProxyFlags enumeration.
 * @name: (allow-none): A bus name (well-known or unique) or %NULL if @connection is not a message bus connection.
 * @object_path: An object path.
 * @cancellable: (allow-none): A #GCancellable or %NULL.
 * @error: Return location for error or %NULL
 *
 * Synchronously creates a proxy for the D-Bus interface <link linkend="gdbus-interface-org-freedesktop-DBus.top_of_page">org.freedesktop.DBus</link>. See g_dbus_proxy_new_sync() for more details.
 *
 * The calling thread is blocked until a reply is received.
 *
 * See _g_freedesktop_dbus_proxy_new() for the asynchronous version of this constructor.
 *
 * Returns: (transfer full) (type _GFreedesktopDBusProxy): The constructed proxy object or %NULL if @error is set.
 */
_GFreedesktopDBus *
_g_freedesktop_dbus_proxy_new_sync (
    GDBusConnection     *connection,
    GDBusProxyFlags      flags,
    const gchar         *name,
    const gchar         *object_path,
    GCancellable        *cancellable,
    GError             **error)
{
  GInitable *ret;
  ret = g_initable_new (_G_TYPE_FREEDESKTOP_DBUS_PROXY, cancellable, error, "g-flags", flags, "g-name", name, "g-connection", connection, "g-object-path", object_path, "g-interface-name", "org.freedesktop.DBus", NULL);
  if (ret != NULL)
    return _G_FREEDESKTOP_DBUS (ret);
  else
    return NULL;
}


/**
 * _g_freedesktop_dbus_proxy_new_for_bus:
 * @bus_type: A #GBusType.
 * @flags: Flags from the #GDBusProxyFlags enumeration.
 * @name: A bus name (well-known or unique).
 * @object_path: An object path.
 * @cancellable: (allow-none): A #GCancellable or %NULL.
 * @callback: A #GAsyncReadyCallback to call when the request is satisfied.
 * @user_data: User data to pass to @callback.
 *
 * Like _g_freedesktop_dbus_proxy_new() but takes a #GBusType instead of a #GDBusConnection.
 *
 * When the operation is finished, @callback will be invoked in the <link linkend="g-main-context-push-thread-default">thread-default main loop</link> of the thread you are calling this method from.
 * You can then call _g_freedesktop_dbus_proxy_new_for_bus_finish() to get the result of the operation.
 *
 * See _g_freedesktop_dbus_proxy_new_for_bus_sync() for the synchronous, blocking version of this constructor.
 */
void
_g_freedesktop_dbus_proxy_new_for_bus (
    GBusType             bus_type,
    GDBusProxyFlags      flags,
    const gchar         *name,
    const gchar         *object_path,
    GCancellable        *cancellable,
    GAsyncReadyCallback  callback,
    gpointer             user_data)
{
  g_async_initable_new_async (_G_TYPE_FREEDESKTOP_DBUS_PROXY, G_PRIORITY_DEFAULT, cancellable, callback, user_data, "g-flags", flags, "g-name", name, "g-bus-type", bus_type, "g-object-path", object_path, "g-interface-name", "org.freedesktop.DBus", NULL);
}

/**
 * _g_freedesktop_dbus_proxy_new_for_bus_finish:
 * @res: The #GAsyncResult obtained from the #GAsyncReadyCallback passed to _g_freedesktop_dbus_proxy_new_for_bus().
 * @error: Return location for error or %NULL
 *
 * Finishes an operation started with _g_freedesktop_dbus_proxy_new_for_bus().
 *
 * Returns: (transfer full) (type _GFreedesktopDBusProxy): The constructed proxy object or %NULL if @error is set.
 */
_GFreedesktopDBus *
_g_freedesktop_dbus_proxy_new_for_bus_finish (
    GAsyncResult        *res,
    GError             **error)
{
  GObject *ret;
  GObject *source_object;
  source_object = g_async_result_get_source_object (res);
  ret = g_async_initable_new_finish (G_ASYNC_INITABLE (source_object), res, error);
  g_object_unref (source_object);
  if (ret != NULL)
    return _G_FREEDESKTOP_DBUS (ret);
  else
    return NULL;
}

/**
 * _g_freedesktop_dbus_proxy_new_for_bus_sync:
 * @bus_type: A #GBusType.
 * @flags: Flags from the #GDBusProxyFlags enumeration.
 * @name: A bus name (well-known or unique).
 * @object_path: An object path.
 * @cancellable: (allow-none): A #GCancellable or %NULL.
 * @error: Return location for error or %NULL
 *
 * Like _g_freedesktop_dbus_proxy_new_sync() but takes a #GBusType instead of a #GDBusConnection.
 *
 * The calling thread is blocked until a reply is received.
 *
 * See _g_freedesktop_dbus_proxy_new_for_bus() for the asynchronous version of this constructor.
 *
 * Returns: (transfer full) (type _GFreedesktopDBusProxy): The constructed proxy object or %NULL if @error is set.
 */
_GFreedesktopDBus *
_g_freedesktop_dbus_proxy_new_for_bus_sync (
    GBusType             bus_type,
    GDBusProxyFlags      flags,
    const gchar         *name,
    const gchar         *object_path,
    GCancellable        *cancellable,
    GError             **error)
{
  GInitable *ret;
  ret = g_initable_new (_G_TYPE_FREEDESKTOP_DBUS_PROXY, cancellable, error, "g-flags", flags, "g-name", name, "g-bus-type", bus_type, "g-object-path", object_path, "g-interface-name", "org.freedesktop.DBus", NULL);
  if (ret != NULL)
    return _G_FREEDESKTOP_DBUS (ret);
  else
    return NULL;
}


/* ------------------------------------------------------------------------ */

/**
 * _GFreedesktopDBusSkeleton:
 *
 * The #_GFreedesktopDBusSkeleton structure contains only private data and should only be accessed using the provided API.
 */

/**
 * _GFreedesktopDBusSkeletonClass:
 * @parent_class: The parent class.
 *
 * Class structure for #_GFreedesktopDBusSkeleton.
 */

struct __GFreedesktopDBusSkeletonPrivate
{
  GValue *properties;
  GList *changed_properties;
  GSource *changed_properties_idle_source;
  GMainContext *context;
  GMutex lock;
};

static void
__g_freedesktop_dbus_skeleton_handle_method_call (
  GDBusConnection *connection G_GNUC_UNUSED,
  const gchar *sender G_GNUC_UNUSED,
  const gchar *object_path G_GNUC_UNUSED,
  const gchar *interface_name,
  const gchar *method_name,
  GVariant *parameters,
  GDBusMethodInvocation *invocation,
  gpointer user_data)
{
  _GFreedesktopDBusSkeleton *skeleton = _G_FREEDESKTOP_DBUS_SKELETON (user_data);
  _ExtendedGDBusMethodInfo *info;
  GVariantIter iter;
  GVariant *child;
  GValue *paramv;
  guint num_params;
  guint num_extra;
  guint n;
  guint signal_id;
  GValue return_value = G_VALUE_INIT;
  info = (_ExtendedGDBusMethodInfo *) g_dbus_method_invocation_get_method_info (invocation);
  g_assert (info != NULL);
  num_params = g_variant_n_children (parameters);
  num_extra = info->pass_fdlist ? 3 : 2;  paramv = g_new0 (GValue, num_params + num_extra);
  n = 0;
  g_value_init (&paramv[n], _G_TYPE_FREEDESKTOP_DBUS);
  g_value_set_object (&paramv[n++], skeleton);
  g_value_init (&paramv[n], G_TYPE_DBUS_METHOD_INVOCATION);
  g_value_set_object (&paramv[n++], invocation);
  if (info->pass_fdlist)
    {
#ifdef G_OS_UNIX
      g_value_init (&paramv[n], G_TYPE_UNIX_FD_LIST);
      g_value_set_object (&paramv[n++], g_dbus_message_get_unix_fd_list (g_dbus_method_invocation_get_message (invocation)));
#else
      g_assert_not_reached ();
#endif
    }
  g_variant_iter_init (&iter, parameters);
  while ((child = g_variant_iter_next_value (&iter)) != NULL)
    {
      _ExtendedGDBusArgInfo *arg_info = (_ExtendedGDBusArgInfo *) info->parent_struct.in_args[n - num_extra];
      if (arg_info->use_gvariant)
        {
          g_value_init (&paramv[n], G_TYPE_VARIANT);
          g_value_set_variant (&paramv[n], child);
          n++;
        }
      else
        g_dbus_gvariant_to_gvalue (child, &paramv[n++]);
      g_variant_unref (child);
    }
  signal_id = g_signal_lookup (info->signal_name, _G_TYPE_FREEDESKTOP_DBUS);
  g_value_init (&return_value, G_TYPE_BOOLEAN);
  g_signal_emitv (paramv, signal_id, 0, &return_value);
  if (!g_value_get_boolean (&return_value))
    g_dbus_method_invocation_return_error (invocation, G_DBUS_ERROR, G_DBUS_ERROR_UNKNOWN_METHOD, "Method %s is not implemented on interface %s", method_name, interface_name);
  g_value_unset (&return_value);
  for (n = 0; n < num_params + num_extra; n++)
    g_value_unset (&paramv[n]);
  g_free (paramv);
}

static GVariant *
__g_freedesktop_dbus_skeleton_handle_get_property (
  GDBusConnection *connection G_GNUC_UNUSED,
  const gchar *sender G_GNUC_UNUSED,
  const gchar *object_path G_GNUC_UNUSED,
  const gchar *interface_name G_GNUC_UNUSED,
  const gchar *property_name,
  GError **error,
  gpointer user_data)
{
  _GFreedesktopDBusSkeleton *skeleton = _G_FREEDESKTOP_DBUS_SKELETON (user_data);
  GValue value = G_VALUE_INIT;
  GParamSpec *pspec;
  _ExtendedGDBusPropertyInfo *info;
  GVariant *ret;
  ret = NULL;
  info = (_ExtendedGDBusPropertyInfo *) g_dbus_interface_info_lookup_property ((GDBusInterfaceInfo *) &__g_freedesktop_dbus_interface_info.parent_struct, property_name);
  g_assert (info != NULL);
  pspec = g_object_class_find_property (G_OBJECT_GET_CLASS (skeleton), info->hyphen_name);
  if (pspec == NULL)
    {
      g_set_error (error, G_DBUS_ERROR, G_DBUS_ERROR_INVALID_ARGS, "No property with name %s", property_name);
    }
  else
    {
      g_value_init (&value, pspec->value_type);
      g_object_get_property (G_OBJECT (skeleton), info->hyphen_name, &value);
      ret = g_dbus_gvalue_to_gvariant (&value, G_VARIANT_TYPE (info->parent_struct.signature));
      g_value_unset (&value);
    }
  return ret;
}

static gboolean
__g_freedesktop_dbus_skeleton_handle_set_property (
  GDBusConnection *connection G_GNUC_UNUSED,
  const gchar *sender G_GNUC_UNUSED,
  const gchar *object_path G_GNUC_UNUSED,
  const gchar *interface_name G_GNUC_UNUSED,
  const gchar *property_name,
  GVariant *variant,
  GError **error,
  gpointer user_data)
{
  _GFreedesktopDBusSkeleton *skeleton = _G_FREEDESKTOP_DBUS_SKELETON (user_data);
  GValue value = G_VALUE_INIT;
  GParamSpec *pspec;
  _ExtendedGDBusPropertyInfo *info;
  gboolean ret;
  ret = FALSE;
  info = (_ExtendedGDBusPropertyInfo *) g_dbus_interface_info_lookup_property ((GDBusInterfaceInfo *) &__g_freedesktop_dbus_interface_info.parent_struct, property_name);
  g_assert (info != NULL);
  pspec = g_object_class_find_property (G_OBJECT_GET_CLASS (skeleton), info->hyphen_name);
  if (pspec == NULL)
    {
      g_set_error (error, G_DBUS_ERROR, G_DBUS_ERROR_INVALID_ARGS, "No property with name %s", property_name);
    }
  else
    {
      if (info->use_gvariant)
        g_value_set_variant (&value, variant);
      else
        g_dbus_gvariant_to_gvalue (variant, &value);
      g_object_set_property (G_OBJECT (skeleton), info->hyphen_name, &value);
      g_value_unset (&value);
      ret = TRUE;
    }
  return ret;
}

static const GDBusInterfaceVTable __g_freedesktop_dbus_skeleton_vtable =
{
  __g_freedesktop_dbus_skeleton_handle_method_call,
  __g_freedesktop_dbus_skeleton_handle_get_property,
  __g_freedesktop_dbus_skeleton_handle_set_property,
  {NULL}
};

static GDBusInterfaceInfo *
_g_freedesktop_dbus_skeleton_dbus_interface_get_info (GDBusInterfaceSkeleton *skeleton G_GNUC_UNUSED)
{
  return _g_freedesktop_dbus_interface_info ();
}

static GDBusInterfaceVTable *
_g_freedesktop_dbus_skeleton_dbus_interface_get_vtable (GDBusInterfaceSkeleton *skeleton G_GNUC_UNUSED)
{
  return (GDBusInterfaceVTable *) &__g_freedesktop_dbus_skeleton_vtable;
}

static GVariant *
_g_freedesktop_dbus_skeleton_dbus_interface_get_properties (GDBusInterfaceSkeleton *_skeleton)
{
  _GFreedesktopDBusSkeleton *skeleton = _G_FREEDESKTOP_DBUS_SKELETON (_skeleton);

  GVariantBuilder builder;
  guint n;
  g_variant_builder_init (&builder, G_VARIANT_TYPE ("a{sv}"));
  if (__g_freedesktop_dbus_interface_info.parent_struct.properties == NULL)
    goto out;
  for (n = 0; __g_freedesktop_dbus_interface_info.parent_struct.properties[n] != NULL; n++)
    {
      GDBusPropertyInfo *info = __g_freedesktop_dbus_interface_info.parent_struct.properties[n];
      if (info->flags & G_DBUS_PROPERTY_INFO_FLAGS_READABLE)
        {
          GVariant *value;
          value = __g_freedesktop_dbus_skeleton_handle_get_property (g_dbus_interface_skeleton_get_connection (G_DBUS_INTERFACE_SKELETON (skeleton)), NULL, g_dbus_interface_skeleton_get_object_path (G_DBUS_INTERFACE_SKELETON (skeleton)), "org.freedesktop.DBus", info->name, NULL, skeleton);
          if (value != NULL)
            {
              g_variant_take_ref (value);
              g_variant_builder_add (&builder, "{sv}", info->name, value);
              g_variant_unref (value);
            }
        }
    }
out:
  return g_variant_builder_end (&builder);
}

static void
_g_freedesktop_dbus_skeleton_dbus_interface_flush (GDBusInterfaceSkeleton *_skeleton)
{
}

static void
__g_freedesktop_dbus_on_signal_name_owner_changed (
    _GFreedesktopDBus *object,
    const gchar *arg_name,
    const gchar *arg_old_owner,
    const gchar *arg_new_owner)
{
  _GFreedesktopDBusSkeleton *skeleton = _G_FREEDESKTOP_DBUS_SKELETON (object);

  GList      *connections, *l;
  GVariant   *signal_variant;
  connections = g_dbus_interface_skeleton_get_connections (G_DBUS_INTERFACE_SKELETON (skeleton));

  signal_variant = g_variant_ref_sink (g_variant_new ("(sss)",
                   arg_name,
                   arg_old_owner,
                   arg_new_owner));
  for (l = connections; l != NULL; l = l->next)
    {
      GDBusConnection *connection = l->data;
      g_dbus_connection_emit_signal (connection,
        NULL, g_dbus_interface_skeleton_get_object_path (G_DBUS_INTERFACE_SKELETON (skeleton)), "org.freedesktop.DBus", "NameOwnerChanged",
        signal_variant, NULL);
    }
  g_variant_unref (signal_variant);
  g_list_free_full (connections, g_object_unref);
}

static void
__g_freedesktop_dbus_on_signal_name_lost (
    _GFreedesktopDBus *object,
    const gchar *arg_name)
{
  _GFreedesktopDBusSkeleton *skeleton = _G_FREEDESKTOP_DBUS_SKELETON (object);

  GList      *connections, *l;
  GVariant   *signal_variant;
  connections = g_dbus_interface_skeleton_get_connections (G_DBUS_INTERFACE_SKELETON (skeleton));

  signal_variant = g_variant_ref_sink (g_variant_new ("(s)",
                   arg_name));
  for (l = connections; l != NULL; l = l->next)
    {
      GDBusConnection *connection = l->data;
      g_dbus_connection_emit_signal (connection,
        NULL, g_dbus_interface_skeleton_get_object_path (G_DBUS_INTERFACE_SKELETON (skeleton)), "org.freedesktop.DBus", "NameLost",
        signal_variant, NULL);
    }
  g_variant_unref (signal_variant);
  g_list_free_full (connections, g_object_unref);
}

static void
__g_freedesktop_dbus_on_signal_name_acquired (
    _GFreedesktopDBus *object,
    const gchar *arg_name)
{
  _GFreedesktopDBusSkeleton *skeleton = _G_FREEDESKTOP_DBUS_SKELETON (object);

  GList      *connections, *l;
  GVariant   *signal_variant;
  connections = g_dbus_interface_skeleton_get_connections (G_DBUS_INTERFACE_SKELETON (skeleton));

  signal_variant = g_variant_ref_sink (g_variant_new ("(s)",
                   arg_name));
  for (l = connections; l != NULL; l = l->next)
    {
      GDBusConnection *connection = l->data;
      g_dbus_connection_emit_signal (connection,
        NULL, g_dbus_interface_skeleton_get_object_path (G_DBUS_INTERFACE_SKELETON (skeleton)), "org.freedesktop.DBus", "NameAcquired",
        signal_variant, NULL);
    }
  g_variant_unref (signal_variant);
  g_list_free_full (connections, g_object_unref);
}

static void _g_freedesktop_dbus_skeleton_iface_init (_GFreedesktopDBusIface *iface);
#if GLIB_VERSION_MAX_ALLOWED >= GLIB_VERSION_2_38
G_DEFINE_TYPE_WITH_CODE (_GFreedesktopDBusSkeleton, _g_freedesktop_dbus_skeleton, G_TYPE_DBUS_INTERFACE_SKELETON,
                         G_ADD_PRIVATE (_GFreedesktopDBusSkeleton)
                         G_IMPLEMENT_INTERFACE (_G_TYPE_FREEDESKTOP_DBUS, _g_freedesktop_dbus_skeleton_iface_init));

#else
G_DEFINE_TYPE_WITH_CODE (_GFreedesktopDBusSkeleton, _g_freedesktop_dbus_skeleton, G_TYPE_DBUS_INTERFACE_SKELETON,
                         G_IMPLEMENT_INTERFACE (_G_TYPE_FREEDESKTOP_DBUS, _g_freedesktop_dbus_skeleton_iface_init));

#endif
static void
_g_freedesktop_dbus_skeleton_finalize (GObject *object)
{
  _GFreedesktopDBusSkeleton *skeleton = _G_FREEDESKTOP_DBUS_SKELETON (object);
  g_list_free_full (skeleton->priv->changed_properties, (GDestroyNotify) _changed_property_free);
  if (skeleton->priv->changed_properties_idle_source != NULL)
    g_source_destroy (skeleton->priv->changed_properties_idle_source);
  g_main_context_unref (skeleton->priv->context);
  g_mutex_clear (&skeleton->priv->lock);
  G_OBJECT_CLASS (_g_freedesktop_dbus_skeleton_parent_class)->finalize (object);
}

static void
_g_freedesktop_dbus_skeleton_init (_GFreedesktopDBusSkeleton *skeleton)
{
#if GLIB_VERSION_MAX_ALLOWED >= GLIB_VERSION_2_38
  skeleton->priv = _g_freedesktop_dbus_skeleton_get_instance_private (skeleton);
#else
  skeleton->priv = G_TYPE_INSTANCE_GET_PRIVATE (skeleton, _G_TYPE_FREEDESKTOP_DBUS_SKELETON, _GFreedesktopDBusSkeletonPrivate);
#endif

  g_mutex_init (&skeleton->priv->lock);
  skeleton->priv->context = g_main_context_ref_thread_default ();
}

static void
_g_freedesktop_dbus_skeleton_class_init (_GFreedesktopDBusSkeletonClass *klass)
{
  GObjectClass *gobject_class;
  GDBusInterfaceSkeletonClass *skeleton_class;

  gobject_class = G_OBJECT_CLASS (klass);
  gobject_class->finalize = _g_freedesktop_dbus_skeleton_finalize;

  skeleton_class = G_DBUS_INTERFACE_SKELETON_CLASS (klass);
  skeleton_class->get_info = _g_freedesktop_dbus_skeleton_dbus_interface_get_info;
  skeleton_class->get_properties = _g_freedesktop_dbus_skeleton_dbus_interface_get_properties;
  skeleton_class->flush = _g_freedesktop_dbus_skeleton_dbus_interface_flush;
  skeleton_class->get_vtable = _g_freedesktop_dbus_skeleton_dbus_interface_get_vtable;

#if GLIB_VERSION_MAX_ALLOWED < GLIB_VERSION_2_38
  g_type_class_add_private (klass, sizeof (_GFreedesktopDBusSkeletonPrivate));
#endif
}

static void
_g_freedesktop_dbus_skeleton_iface_init (_GFreedesktopDBusIface *iface)
{
  iface->name_owner_changed = __g_freedesktop_dbus_on_signal_name_owner_changed;
  iface->name_lost = __g_freedesktop_dbus_on_signal_name_lost;
  iface->name_acquired = __g_freedesktop_dbus_on_signal_name_acquired;
}

/**
 * _g_freedesktop_dbus_skeleton_new:
 *
 * Creates a skeleton object for the D-Bus interface <link linkend="gdbus-interface-org-freedesktop-DBus.top_of_page">org.freedesktop.DBus</link>.
 *
 * Returns: (transfer full) (type _GFreedesktopDBusSkeleton): The skeleton object.
 */
_GFreedesktopDBus *
_g_freedesktop_dbus_skeleton_new (void)
{
  return _G_FREEDESKTOP_DBUS (g_object_new (_G_TYPE_FREEDESKTOP_DBUS_SKELETON, NULL));
}

