Blame gio/tests/gdbus-testserver.c

Packit ae235b
#include <gio/gio.h>
Packit ae235b
#include <stdlib.h>
Packit ae235b
Packit ae235b
static GDBusNodeInfo *introspection_data = NULL;
Packit ae235b
static GMainLoop *loop = NULL;
Packit ae235b
static GHashTable *properties = NULL;
Packit ae235b
Packit ae235b
static const gchar introspection_xml[] =
Packit ae235b
  "<node>"
Packit ae235b
  "  <interface name='com.example.Frob'>"
Packit ae235b
  "    <method name='Quit'>"
Packit ae235b
  "    </method>"
Packit ae235b
  "    <method name='TestArrayOfStringTypes'>"
Packit ae235b
  "      <arg direction='in'  type='as' name='val_string' />"
Packit ae235b
  "      <arg direction='in'  type='ao' name='val_objpath' />"
Packit ae235b
  "      <arg direction='in'  type='ag' name='val_signature' />"
Packit ae235b
  "      <arg direction='out' type='as' />"
Packit ae235b
  "      <arg direction='out' type='ao' />"
Packit ae235b
  "      <arg direction='out' type='ag' />"
Packit ae235b
  "    </method>"
Packit ae235b
  "    <method name='TestPrimitiveTypes'>"
Packit ae235b
  "      <arg direction='in'  type='y' name='val_byte' />"
Packit ae235b
  "      <arg direction='in'  type='b' name='val_boolean' />"
Packit ae235b
  "      <arg direction='in'  type='n' name='val_int16' />"
Packit ae235b
  "      <arg direction='in'  type='q' name='val_uint16' />"
Packit ae235b
  "      <arg direction='in'  type='i' name='val_int32' />"
Packit ae235b
  "      <arg direction='in'  type='u' name='val_uint32' />"
Packit ae235b
  "      <arg direction='in'  type='x' name='val_int64' />"
Packit ae235b
  "      <arg direction='in'  type='t' name='val_uint64' />"
Packit ae235b
  "      <arg direction='in'  type='d' name='val_double' />"
Packit ae235b
  "      <arg direction='in'  type='s' name='val_string' />"
Packit ae235b
  "      <arg direction='in'  type='o' name='val_objpath' />"
Packit ae235b
  "      <arg direction='in'  type='g' name='val_signature' />"
Packit ae235b
  "      <arg direction='out' type='y' />"
Packit ae235b
  "      <arg direction='out' type='b' />"
Packit ae235b
  "      <arg direction='out' type='n' />"
Packit ae235b
  "      <arg direction='out' type='q' />"
Packit ae235b
  "      <arg direction='out' type='i' />"
Packit ae235b
  "      <arg direction='out' type='u' />"
Packit ae235b
  "      <arg direction='out' type='x' />"
Packit ae235b
  "      <arg direction='out' type='t' />"
Packit ae235b
  "      <arg direction='out' type='d' />"
Packit ae235b
  "      <arg direction='out' type='s' />"
Packit ae235b
  "      <arg direction='out' type='o' />"
Packit ae235b
  "      <arg direction='out' type='g' />"
Packit ae235b
  "    </method>"
Packit ae235b
  "    <method name='EmitSignal'>"
Packit ae235b
  "      <arg direction='in'  type='s' name='str1' />"
Packit ae235b
  "      <arg direction='in'  type='o' name='objpath1' />"
Packit ae235b
  "    </method>"
Packit ae235b
  "    <method name='TestArrayOfPrimitiveTypes'>"
Packit ae235b
  "      <arg direction='in'  type='ay' name='val_byte' />"
Packit ae235b
  "      <arg direction='in'  type='ab' name='val_boolean' />"
Packit ae235b
  "      <arg direction='in'  type='an' name='val_int16' />"
Packit ae235b
  "      <arg direction='in'  type='aq' name='val_uint16' />"
Packit ae235b
  "      <arg direction='in'  type='ai' name='val_int32' />"
Packit ae235b
  "      <arg direction='in'  type='au' name='val_uint32' />"
Packit ae235b
  "      <arg direction='in'  type='ax' name='val_int64' />"
Packit ae235b
  "      <arg direction='in'  type='at' name='val_uint64' />"
Packit ae235b
  "      <arg direction='in'  type='ad' name='val_double' />"
Packit ae235b
  "      <arg direction='out' type='ay' />"
Packit ae235b
  "      <arg direction='out' type='ab' />"
Packit ae235b
  "      <arg direction='out' type='an' />"
Packit ae235b
  "      <arg direction='out' type='aq' />"
Packit ae235b
  "      <arg direction='out' type='ai' />"
Packit ae235b
  "      <arg direction='out' type='au' />"
Packit ae235b
  "      <arg direction='out' type='ax' />"
Packit ae235b
  "      <arg direction='out' type='at' />"
Packit ae235b
  "      <arg direction='out' type='ad' />"
Packit ae235b
  "    </method>"
Packit ae235b
  "    <method name='FrobSetProperty'>"
Packit ae235b
  "      <arg direction='in'  type='s' name='prop_name' />"
Packit ae235b
  "      <arg direction='in'  type='v' name='prop_value' />"
Packit ae235b
  "    </method>"
Packit ae235b
  "    <signal name='TestSignal'>"
Packit ae235b
  "      <arg type='s' name='str1' />"
Packit ae235b
  "      <arg type='o' name='objpath1' />"
Packit ae235b
  "      <arg type='v' name='variant1' />"
Packit ae235b
  "    </signal>"
Packit ae235b
  "    <method name='TestComplexArrays'>"
Packit ae235b
  "      <arg direction='in'  type='a(ii)' name='aii' />"
Packit ae235b
  "      <arg direction='in'  type='aa(ii)' name='aaii' />"
Packit ae235b
  "      <arg direction='in'  type='aas' name='aas' />"
Packit ae235b
  "      <arg direction='in'  type='aa{ss}' name='ahashes' />"
Packit ae235b
  "      <arg direction='in'  type='aay' name='aay' />"
Packit ae235b
  "      <arg direction='in'  type='av' name='av' />"
Packit ae235b
  "      <arg direction='in'  type='aav' name='aav' />"
Packit ae235b
  "      <arg direction='out' type='a(ii)' />"
Packit ae235b
  "      <arg direction='out' type='aa(ii)' />"
Packit ae235b
  "      <arg direction='out' type='aas' />"
Packit ae235b
  "      <arg direction='out' type='aa{ss}' />"
Packit ae235b
  "      <arg direction='out' type='aay' />"
Packit ae235b
  "      <arg direction='out' type='av' />"
Packit ae235b
  "      <arg direction='out' type='aav' />"
Packit ae235b
  "    </method>"
Packit ae235b
  "    <method name='TestVariant'>"
Packit ae235b
  "      <arg direction='in'  type='v' name='v' />"
Packit ae235b
  "      <arg direction='in'  type='b' name='modify' />"
Packit ae235b
  "      <arg direction='out' type='v' />"
Packit ae235b
  "    </method>"
Packit ae235b
  "    <method name='FrobInvalidateProperty'>"
Packit ae235b
  "      <arg direction='in'  type='s' name='new_value' />"
Packit ae235b
  "    </method>"
Packit ae235b
  "    <method name='HelloWorld'>"
Packit ae235b
  "      <arg direction='in'  type='s' name='hello_message' />"
Packit ae235b
  "      <arg direction='out' type='s' />"
Packit ae235b
  "    </method>"
Packit ae235b
  "    <method name='PairReturn'>"
Packit ae235b
  "      <arg direction='out' type='s' />"
Packit ae235b
  "      <arg direction='out' type='u' />"
Packit ae235b
  "    </method>"
Packit ae235b
  "    <method name='TestStructureTypes'>"
Packit ae235b
  "      <arg direction='in'  type='(ii)' name='s1' />"
Packit ae235b
  "      <arg direction='in'  type='(s(ii)aya{ss})' name='s2' />"
Packit ae235b
  "      <arg direction='out' type='(ii)' />"
Packit ae235b
  "      <arg direction='out' type='(s(ii)aya{ss})' />"
Packit ae235b
  "    </method>"
Packit ae235b
  "    <method name='EmitSignal2'>"
Packit ae235b
  "    </method>"
Packit ae235b
  "    <method name='DoubleHelloWorld'>"
Packit ae235b
  "      <arg direction='in'  type='s' name='hello1' />"
Packit ae235b
  "      <arg direction='in'  type='s' name='hello2' />"
Packit ae235b
  "      <arg direction='out' type='s' />"
Packit ae235b
  "      <arg direction='out' type='s' />"
Packit ae235b
  "    </method>"
Packit ae235b
  "    <method name='Sleep'>"
Packit ae235b
  "      <arg direction='in'  type='i' name='msec' />"
Packit ae235b
  "    </method>"
Packit ae235b
  "    <method name='TestHashTables'>"
Packit ae235b
  "      <arg direction='in'  type='a{yy}' name='hyy' />"
Packit ae235b
  "      <arg direction='in'  type='a{bb}' name='hbb' />"
Packit ae235b
  "      <arg direction='in'  type='a{nn}' name='hnn' />"
Packit ae235b
  "      <arg direction='in'  type='a{qq}' name='hqq' />"
Packit ae235b
  "      <arg direction='in'  type='a{ii}' name='hii' />"
Packit ae235b
  "      <arg direction='in'  type='a{uu}' name='huu' />"
Packit ae235b
  "      <arg direction='in'  type='a{xx}' name='hxx' />"
Packit ae235b
  "      <arg direction='in'  type='a{tt}' name='htt' />"
Packit ae235b
  "      <arg direction='in'  type='a{dd}' name='hdd' />"
Packit ae235b
  "      <arg direction='in'  type='a{ss}' name='hss' />"
Packit ae235b
  "      <arg direction='in'  type='a{oo}' name='hoo' />"
Packit ae235b
  "      <arg direction='in'  type='a{gg}' name='hgg' />"
Packit ae235b
  "      <arg direction='out' type='a{yy}' />"
Packit ae235b
  "      <arg direction='out' type='a{bb}' />"
Packit ae235b
  "      <arg direction='out' type='a{nn}' />"
Packit ae235b
  "      <arg direction='out' type='a{qq}' />"
Packit ae235b
  "      <arg direction='out' type='a{ii}' />"
Packit ae235b
  "      <arg direction='out' type='a{uu}' />"
Packit ae235b
  "      <arg direction='out' type='a{xx}' />"
Packit ae235b
  "      <arg direction='out' type='a{tt}' />"
Packit ae235b
  "      <arg direction='out' type='a{dd}' />"
Packit ae235b
  "      <arg direction='out' type='a{ss}' />"
Packit ae235b
  "      <arg direction='out' type='a{oo}' />"
Packit ae235b
  "      <arg direction='out' type='a{gg}' />"
Packit ae235b
  "    </method>"
Packit ae235b
  "    <signal name='TestSignal2'>"
Packit ae235b
  "      <arg type='i' name='int1' />"
Packit ae235b
  "    </signal>"
Packit ae235b
  "    <method name='TestComplexHashTables'>"
Packit ae235b
  "      <arg direction='in'  type='a{s(ii)}' name='h_str_to_pair' />"
Packit ae235b
  "      <arg direction='in'  type='a{sv}' name='h_str_to_variant' />"
Packit ae235b
  "      <arg direction='in'  type='a{sav}' name='h_str_to_av' />"
Packit ae235b
  "      <arg direction='in'  type='a{saav}' name='h_str_to_aav' />"
Packit ae235b
  "      <arg direction='in'  type='a{sa(ii)}' name='h_str_to_array_of_pairs' />"
Packit ae235b
  "      <arg direction='in'  type='a{sa{ss}}' name='hash_of_hashes' />"
Packit ae235b
  "      <arg direction='out' type='a{s(ii)}' />"
Packit ae235b
  "      <arg direction='out' type='a{sv}' />"
Packit ae235b
  "      <arg direction='out' type='a{sav}' />"
Packit ae235b
  "      <arg direction='out' type='a{saav}' />"
Packit ae235b
  "      <arg direction='out' type='a{sa(ii)}' />"
Packit ae235b
  "      <arg direction='out' type='a{sa{ss}}' />"
Packit ae235b
  "    </method>"
Packit ae235b
  "    <property type='y' name='y' access='readwrite' />"
Packit ae235b
  "    <property type='b' name='b' access='readwrite' />"
Packit ae235b
  "    <property type='n' name='n' access='readwrite' />"
Packit ae235b
  "    <property type='q' name='q' access='readwrite' />"
Packit ae235b
  "    <property type='i' name='i' access='readwrite' />"
Packit ae235b
  "    <property type='u' name='u' access='readwrite' />"
Packit ae235b
  "    <property type='x' name='x' access='readwrite' />"
Packit ae235b
  "    <property type='t' name='t' access='readwrite' />"
Packit ae235b
  "    <property type='d' name='d' access='readwrite' />"
Packit ae235b
  "    <property type='s' name='s' access='readwrite' />"
Packit ae235b
  "    <property type='o' name='o' access='readwrite' />"
Packit ae235b
  "    <property type='ay' name='ay' access='readwrite' />"
Packit ae235b
  "    <property type='ab' name='ab' access='readwrite' />"
Packit ae235b
  "    <property type='an' name='an' access='readwrite' />"
Packit ae235b
  "    <property type='aq' name='aq' access='readwrite' />"
Packit ae235b
  "    <property type='ai' name='ai' access='readwrite' />"
Packit ae235b
  "    <property type='au' name='au' access='readwrite' />"
Packit ae235b
  "    <property type='ax' name='ax' access='readwrite' />"
Packit ae235b
  "    <property type='at' name='at' access='readwrite' />"
Packit ae235b
  "    <property type='ad' name='ad' access='readwrite' />"
Packit ae235b
  "    <property type='as' name='as' access='readwrite' />"
Packit ae235b
  "    <property type='ao' name='ao' access='readwrite' />"
Packit ae235b
  "    <property type='s' name='foo' access='readwrite' />"
Packit ae235b
  "    <property type='s' name='PropertyThatWillBeInvalidated' access='readwrite' />"
Packit ae235b
  "  </interface>"
Packit ae235b
  "</node>";
Packit ae235b
Packit ae235b
static gboolean
Packit ae235b
end_sleep (gpointer data)
Packit ae235b
{
Packit ae235b
  GDBusMethodInvocation *invocation = data;
Packit ae235b
Packit ae235b
  g_dbus_method_invocation_return_value (invocation, NULL);
Packit ae235b
  g_object_unref (invocation);
Packit ae235b
Packit ae235b
  return G_SOURCE_REMOVE;
Packit ae235b
}
Packit ae235b
Packit ae235b
static void
Packit ae235b
handle_method_call (GDBusConnection       *connection,
Packit ae235b
                    const gchar           *sender,
Packit ae235b
                    const gchar           *object_path,
Packit ae235b
                    const gchar           *interface_name,
Packit ae235b
                    const gchar           *method_name,
Packit ae235b
                    GVariant              *parameters,
Packit ae235b
                    GDBusMethodInvocation *invocation,
Packit ae235b
                    gpointer               user_data)
Packit ae235b
{
Packit ae235b
  if (g_strcmp0 (method_name, "HelloWorld") == 0)
Packit ae235b
    {
Packit ae235b
      const gchar *greeting;
Packit ae235b
Packit ae235b
      g_variant_get (parameters, "(&s)", &greeting);
Packit ae235b
      if (g_strcmp0 (greeting, "Yo") == 0)
Packit ae235b
        {
Packit ae235b
          g_dbus_method_invocation_return_dbus_error (invocation,
Packit ae235b
                                                      "com.example.TestException",
Packit ae235b
                                                      "Yo is not a proper greeting");
Packit ae235b
        }
Packit ae235b
      else
Packit ae235b
        {
Packit ae235b
          gchar *response;
Packit ae235b
          response = g_strdup_printf ("You greeted me with '%s'. Thanks!", greeting);
Packit ae235b
          g_dbus_method_invocation_return_value (invocation,
Packit ae235b
                                                 g_variant_new ("(s)", response));
Packit ae235b
          g_free ( response);
Packit ae235b
        }
Packit ae235b
    }
Packit ae235b
  else if (g_strcmp0 (method_name, "DoubleHelloWorld") == 0)
Packit ae235b
    {
Packit ae235b
      const gchar *hello1, *hello2;
Packit ae235b
      gchar *reply1, *reply2;
Packit ae235b
Packit ae235b
      g_variant_get (parameters, "(&s&s)", &hello1, &hello2);
Packit ae235b
      reply1 = g_strdup_printf ("You greeted me with '%s'. Thanks!", hello1);
Packit ae235b
      reply2 = g_strdup_printf ("Yo dawg, you uttered '%s'. Thanks!", hello2);
Packit ae235b
      g_dbus_method_invocation_return_value (invocation,
Packit ae235b
                                             g_variant_new ("(ss)", reply1, reply2));
Packit ae235b
      g_free (reply1);
Packit ae235b
      g_free (reply2);
Packit ae235b
    }
Packit ae235b
  else if (g_strcmp0 (method_name, "PairReturn") == 0)
Packit ae235b
    {
Packit ae235b
      g_dbus_method_invocation_return_value (invocation,
Packit ae235b
                                             g_variant_new ("(su)", "foo", 42));
Packit ae235b
    }
Packit ae235b
  else if (g_strcmp0 (method_name, "TestPrimitiveTypes") == 0)
Packit ae235b
    {
Packit ae235b
      guchar val_byte;
Packit ae235b
      gboolean val_boolean;
Packit ae235b
      gint16 val_int16;
Packit ae235b
      guint16 val_uint16;
Packit ae235b
      gint32 val_int32;
Packit ae235b
      guint32 val_uint32;
Packit ae235b
      gint64 val_int64;
Packit ae235b
      guint64 val_uint64;
Packit ae235b
      gdouble val_double;
Packit ae235b
      const gchar *val_string;
Packit ae235b
      const gchar *val_objpath;
Packit ae235b
      const gchar *val_signature;
Packit ae235b
      gchar *ret_string;
Packit ae235b
      gchar *ret_objpath;
Packit ae235b
      gchar *ret_signature;
Packit ae235b
Packit ae235b
      g_variant_get (parameters, "(ybnqiuxtd&s&o&g)",
Packit ae235b
                     &val_byte,
Packit ae235b
                     &val_boolean,
Packit ae235b
                     &val_int16,
Packit ae235b
                     &val_uint16,
Packit ae235b
                     &val_int32,
Packit ae235b
                     &val_uint32,
Packit ae235b
                     &val_int64,
Packit ae235b
                     &val_uint64,
Packit ae235b
                     &val_double,
Packit ae235b
                     &val_string,
Packit ae235b
                     &val_objpath,
Packit ae235b
                     &val_signature);
Packit ae235b
Packit ae235b
      ret_string = g_strconcat (val_string, val_string, NULL);
Packit ae235b
      ret_objpath = g_strconcat (val_objpath, "/modified", NULL);
Packit ae235b
      ret_signature = g_strconcat (val_signature, val_signature, NULL);
Packit ae235b
Packit ae235b
      g_dbus_method_invocation_return_value (invocation,
Packit ae235b
          g_variant_new ("(ybnqiuxtdsog)",
Packit ae235b
                         val_byte + 1,
Packit ae235b
                         !val_boolean,
Packit ae235b
                         val_int16 + 1,
Packit ae235b
                         val_uint16 + 1,
Packit ae235b
                         val_int32 + 1,
Packit ae235b
                         val_uint32 + 1,
Packit ae235b
                         val_int64 + 1,
Packit ae235b
                         val_uint64 + 1,
Packit ae235b
                         - val_double + 0.123,
Packit ae235b
                         ret_string,
Packit ae235b
                         ret_objpath,
Packit ae235b
                         ret_signature));
Packit ae235b
Packit ae235b
      g_free (ret_string);
Packit ae235b
      g_free (ret_objpath);
Packit ae235b
      g_free (ret_signature);
Packit ae235b
    }
Packit ae235b
  else if (g_strcmp0 (method_name, "TestArrayOfPrimitiveTypes") == 0)
Packit ae235b
    {
Packit ae235b
      GVariant *v;
Packit ae235b
      const guchar *bytes;
Packit ae235b
      const gint16 *int16s;
Packit ae235b
      const guint16 *uint16s;
Packit ae235b
      const gint32 *int32s;
Packit ae235b
      const guint32 *uint32s;
Packit ae235b
      const gint64 *int64s;
Packit ae235b
      const guint64 *uint64s;
Packit ae235b
      const gdouble *doubles;
Packit ae235b
      gsize n_elts;
Packit ae235b
      gint i, j;
Packit ae235b
      GVariantBuilder ret;
Packit ae235b
Packit ae235b
      g_variant_builder_init (&ret, G_VARIANT_TYPE ("(ayabanaqaiauaxatad)"));
Packit ae235b
Packit ae235b
      v = g_variant_get_child_value (parameters, 0);
Packit ae235b
      bytes = g_variant_get_fixed_array (v, &n_elts, 1);
Packit ae235b
      g_variant_builder_open (&ret, G_VARIANT_TYPE ("ay"));
Packit ae235b
      for (j = 0; j < 2; j++)
Packit ae235b
        for (i = 0; i < n_elts; i++)
Packit ae235b
          g_variant_builder_add (&ret, "y", bytes[i]);
Packit ae235b
      g_variant_builder_close (&ret;;
Packit ae235b
      g_variant_unref (v);
Packit ae235b
Packit ae235b
      v = g_variant_get_child_value (parameters, 1);
Packit ae235b
      bytes = g_variant_get_fixed_array (v, &n_elts, 1);
Packit ae235b
      g_variant_builder_open (&ret, G_VARIANT_TYPE ("ab"));
Packit ae235b
      for (j = 0; j < 2; j++)
Packit ae235b
        for (i = 0; i < n_elts; i++)
Packit ae235b
          g_variant_builder_add (&ret, "b", (gboolean)bytes[i]);
Packit ae235b
      g_variant_builder_close (&ret;;
Packit ae235b
      g_variant_unref (v);
Packit ae235b
Packit ae235b
      v = g_variant_get_child_value (parameters, 2);
Packit ae235b
      int16s = g_variant_get_fixed_array (v, &n_elts, 2);
Packit ae235b
      g_variant_builder_open (&ret, G_VARIANT_TYPE ("an"));
Packit ae235b
      for (j = 0; j < 2; j++)
Packit ae235b
        for (i = 0; i < n_elts; i++)
Packit ae235b
          g_variant_builder_add (&ret, "n", int16s[i]);
Packit ae235b
      g_variant_builder_close (&ret;;
Packit ae235b
      g_variant_unref (v);
Packit ae235b
Packit ae235b
      v = g_variant_get_child_value (parameters, 3);
Packit ae235b
      uint16s = g_variant_get_fixed_array (v, &n_elts, 2);
Packit ae235b
      g_variant_builder_open (&ret, G_VARIANT_TYPE ("aq"));
Packit ae235b
      for (j = 0; j < 2; j++)
Packit ae235b
        for (i = 0; i < n_elts; i++)
Packit ae235b
          g_variant_builder_add (&ret, "q", uint16s[i]);
Packit ae235b
      g_variant_builder_close (&ret;;
Packit ae235b
      g_variant_unref (v);
Packit ae235b
Packit ae235b
      v = g_variant_get_child_value (parameters, 4);
Packit ae235b
      int32s = g_variant_get_fixed_array (v, &n_elts, 4);
Packit ae235b
      g_variant_builder_open (&ret, G_VARIANT_TYPE ("ai"));
Packit ae235b
      for (j = 0; j < 2; j++)
Packit ae235b
        for (i = 0; i < n_elts; i++)
Packit ae235b
          g_variant_builder_add (&ret, "i", int32s[i]);
Packit ae235b
      g_variant_builder_close (&ret;;
Packit ae235b
      g_variant_unref (v);
Packit ae235b
Packit ae235b
      v = g_variant_get_child_value (parameters, 5);
Packit ae235b
      uint32s = g_variant_get_fixed_array (v, &n_elts, 4);
Packit ae235b
      g_variant_builder_open (&ret, G_VARIANT_TYPE ("au"));
Packit ae235b
      for (j = 0; j < 2; j++)
Packit ae235b
        for (i = 0; i < n_elts; i++)
Packit ae235b
          g_variant_builder_add (&ret, "u", uint32s[i]);
Packit ae235b
      g_variant_builder_close (&ret;;
Packit ae235b
      g_variant_unref (v);
Packit ae235b
Packit ae235b
      v = g_variant_get_child_value (parameters, 6);
Packit ae235b
      int64s = g_variant_get_fixed_array (v, &n_elts, 8);
Packit ae235b
      g_variant_builder_open (&ret, G_VARIANT_TYPE ("ax"));
Packit ae235b
      for (j = 0; j < 2; j++)
Packit ae235b
        for (i = 0; i < n_elts; i++)
Packit ae235b
          g_variant_builder_add (&ret, "x", int64s[i]);
Packit ae235b
      g_variant_builder_close (&ret;;
Packit ae235b
      g_variant_unref (v);
Packit ae235b
Packit ae235b
      v = g_variant_get_child_value (parameters, 7);
Packit ae235b
      uint64s = g_variant_get_fixed_array (v, &n_elts, 8);
Packit ae235b
      g_variant_builder_open (&ret, G_VARIANT_TYPE ("at"));
Packit ae235b
      for (j = 0; j < 2; j++)
Packit ae235b
        for (i = 0; i < n_elts; i++)
Packit ae235b
          g_variant_builder_add (&ret, "t", uint64s[i]);
Packit ae235b
      g_variant_builder_close (&ret;;
Packit ae235b
      g_variant_unref (v);
Packit ae235b
Packit ae235b
      v = g_variant_get_child_value (parameters, 8);
Packit ae235b
      doubles = g_variant_get_fixed_array (v, &n_elts, sizeof (gdouble));
Packit ae235b
      g_variant_builder_open (&ret, G_VARIANT_TYPE ("ad"));
Packit ae235b
      for (j = 0; j < 2; j++)
Packit ae235b
        for (i = 0; i < n_elts; i++)
Packit ae235b
          g_variant_builder_add (&ret, "d", doubles[i]);
Packit ae235b
      g_variant_builder_close (&ret;;
Packit ae235b
      g_variant_unref (v);
Packit ae235b
Packit ae235b
      g_dbus_method_invocation_return_value (invocation,
Packit ae235b
                                             g_variant_builder_end (&ret));
Packit ae235b
    }
Packit ae235b
  else if (g_strcmp0 (method_name, "TestArrayOfStringTypes") == 0)
Packit ae235b
    {
Packit ae235b
      GVariantIter *iter1;
Packit ae235b
      GVariantIter *iter2;
Packit ae235b
      GVariantIter *iter3;
Packit ae235b
      GVariantIter *iter;
Packit ae235b
      GVariantBuilder ret;
Packit ae235b
      const gchar *s;
Packit ae235b
      gint i;
Packit ae235b
Packit ae235b
      g_variant_builder_init (&ret, G_VARIANT_TYPE ("(asaoag)"));
Packit ae235b
      g_variant_get (parameters, "(asaoag)", &iter1, &iter2, &iter3);
Packit ae235b
Packit ae235b
      g_variant_builder_open (&ret, G_VARIANT_TYPE ("as"));
Packit ae235b
      for (i = 0; i < 2; i++)
Packit ae235b
        {
Packit ae235b
          iter = g_variant_iter_copy (iter1);
Packit ae235b
          while (g_variant_iter_loop (iter, "s", &s))
Packit ae235b
            g_variant_builder_add (&ret, "s", s);
Packit ae235b
          g_variant_iter_free (iter);
Packit ae235b
        }
Packit ae235b
      g_variant_builder_close (&ret;;
Packit ae235b
Packit ae235b
      g_variant_builder_open (&ret, G_VARIANT_TYPE ("ao"));
Packit ae235b
      for (i = 0; i < 2; i++)
Packit ae235b
        {
Packit ae235b
          iter = g_variant_iter_copy (iter1);
Packit ae235b
          while (g_variant_iter_loop (iter, "o", &s))
Packit ae235b
            g_variant_builder_add (&ret, "o", s);
Packit ae235b
          g_variant_iter_free (iter);
Packit ae235b
        }
Packit ae235b
      g_variant_builder_close (&ret;;
Packit ae235b
Packit ae235b
      g_variant_builder_open (&ret, G_VARIANT_TYPE ("ag"));
Packit ae235b
      for (i = 0; i < 2; i++)
Packit ae235b
        {
Packit ae235b
          iter = g_variant_iter_copy (iter1);
Packit ae235b
          while (g_variant_iter_loop (iter, "g", &s))
Packit ae235b
            g_variant_builder_add (&ret, "g", s);
Packit ae235b
          g_variant_iter_free (iter);
Packit ae235b
        }
Packit ae235b
      g_variant_builder_close (&ret;;
Packit ae235b
Packit ae235b
      g_variant_iter_free (iter1);
Packit ae235b
      g_variant_iter_free (iter2);
Packit ae235b
      g_variant_iter_free (iter3);
Packit ae235b
Packit ae235b
      g_dbus_method_invocation_return_value (invocation,
Packit ae235b
                                             g_variant_builder_end (&ret));
Packit ae235b
    }
Packit ae235b
  else if (g_strcmp0 (method_name, "TestHashTables") == 0)
Packit ae235b
    {
Packit ae235b
      GVariant *v;
Packit ae235b
      GVariantIter iter;
Packit ae235b
      GVariantBuilder ret;
Packit ae235b
      guint8 y1, y2;
Packit ae235b
      gboolean b1, b2;
Packit ae235b
      gint16 n1, n2;
Packit ae235b
      guint16 q1, q2;
Packit ae235b
      gint i1, i2;
Packit ae235b
      guint u1, u2;
Packit ae235b
      gint64 x1, x2;
Packit ae235b
      guint64 t1, t2;
Packit ae235b
      gdouble d1, d2;
Packit ae235b
      gchar *s1, *s2;
Packit ae235b
Packit ae235b
      g_variant_builder_init (&ret, G_VARIANT_TYPE ("(a{yy}a{bb}a{nn}a{qq}a{ii}a{uu}a{xx}a{tt}a{dd}a{ss}a{oo}a{gg})"));
Packit ae235b
Packit ae235b
      g_variant_builder_open (&ret, G_VARIANT_TYPE ("a{yy}"));
Packit ae235b
      v = g_variant_get_child_value (parameters, 0);
Packit ae235b
      g_variant_iter_init (&iter, v);
Packit ae235b
      while (g_variant_iter_loop (&iter, "yy", &y1, &y2))
Packit ae235b
        g_variant_builder_add (&ret, "{yy}", y1 * 2, (y2 * 3) & 255);
Packit ae235b
      g_variant_unref (v);
Packit ae235b
      g_variant_builder_close (&ret;;
Packit ae235b
Packit ae235b
      g_variant_builder_open (&ret, G_VARIANT_TYPE ("a{bb}"));
Packit ae235b
      v = g_variant_get_child_value (parameters, 1);
Packit ae235b
      g_variant_iter_init (&iter, v);
Packit ae235b
      while (g_variant_iter_loop (&iter, "bb", &b1, &b2))
Packit ae235b
        g_variant_builder_add (&ret, "{bb}", b1, TRUE);
Packit ae235b
      g_variant_unref (v);
Packit ae235b
      g_variant_builder_close (&ret;;
Packit ae235b
Packit ae235b
      g_variant_builder_open (&ret, G_VARIANT_TYPE ("a{nn}"));
Packit ae235b
      v = g_variant_get_child_value (parameters, 2);
Packit ae235b
      g_variant_iter_init (&iter, v);
Packit ae235b
      while (g_variant_iter_loop (&iter, "nn", &n1, &n2))
Packit ae235b
        g_variant_builder_add (&ret, "{nn}", n1 * 2, n2 * 3);
Packit ae235b
      g_variant_unref (v);
Packit ae235b
      g_variant_builder_close (&ret;;
Packit ae235b
Packit ae235b
      g_variant_builder_open (&ret, G_VARIANT_TYPE ("a{qq}"));
Packit ae235b
      v = g_variant_get_child_value (parameters, 3);
Packit ae235b
      g_variant_iter_init (&iter, v);
Packit ae235b
      while (g_variant_iter_loop (&iter, "qq", &q1, &q2))
Packit ae235b
        g_variant_builder_add (&ret, "{qq}", q1 * 2, q2 * 3);
Packit ae235b
      g_variant_unref (v);
Packit ae235b
      g_variant_builder_close (&ret;;
Packit ae235b
Packit ae235b
      g_variant_builder_open (&ret, G_VARIANT_TYPE ("a{ii}"));
Packit ae235b
      v = g_variant_get_child_value (parameters, 4);
Packit ae235b
      g_variant_iter_init (&iter, v);
Packit ae235b
      while (g_variant_iter_loop (&iter, "ii", &i1, &i2))
Packit ae235b
        g_variant_builder_add (&ret, "{ii}", i1 * 2, i2 * 3);
Packit ae235b
      g_variant_unref (v);
Packit ae235b
      g_variant_builder_close (&ret;;
Packit ae235b
Packit ae235b
      g_variant_builder_open (&ret, G_VARIANT_TYPE ("a{uu}"));
Packit ae235b
      v = g_variant_get_child_value (parameters, 5);
Packit ae235b
      g_variant_iter_init (&iter, v);
Packit ae235b
      while (g_variant_iter_loop (&iter, "uu", &u1, &u2))
Packit ae235b
        g_variant_builder_add (&ret, "{uu}", u1 * 2, u2 * 3);
Packit ae235b
      g_variant_unref (v);
Packit ae235b
      g_variant_builder_close (&ret;;
Packit ae235b
Packit ae235b
      g_variant_builder_open (&ret, G_VARIANT_TYPE ("a{xx}"));
Packit ae235b
      v = g_variant_get_child_value (parameters, 6);
Packit ae235b
      g_variant_iter_init (&iter, v);
Packit ae235b
      while (g_variant_iter_loop (&iter, "xx", &x1, &x2))
Packit ae235b
        g_variant_builder_add (&ret, "{xx}", x1 + 2, x2  + 1);
Packit ae235b
      g_variant_unref (v);
Packit ae235b
      g_variant_builder_close (&ret;;
Packit ae235b
Packit ae235b
      g_variant_builder_open (&ret, G_VARIANT_TYPE ("a{tt}"));
Packit ae235b
      v = g_variant_get_child_value (parameters, 7);
Packit ae235b
      g_variant_iter_init (&iter, v);
Packit ae235b
      while (g_variant_iter_loop (&iter, "tt", &t1, &t2))
Packit ae235b
        g_variant_builder_add (&ret, "{tt}", t1 + 2, t2  + 1);
Packit ae235b
      g_variant_unref (v);
Packit ae235b
      g_variant_builder_close (&ret;;
Packit ae235b
Packit ae235b
      g_variant_builder_open (&ret, G_VARIANT_TYPE ("a{dd}"));
Packit ae235b
      v = g_variant_get_child_value (parameters, 8);
Packit ae235b
      g_variant_iter_init (&iter, v);
Packit ae235b
      while (g_variant_iter_loop (&iter, "dd", &d1, &d2))
Packit ae235b
        g_variant_builder_add (&ret, "{dd}", d1 + 2.5, d2  + 5.0);
Packit ae235b
      g_variant_unref (v);
Packit ae235b
      g_variant_builder_close (&ret;;
Packit ae235b
Packit ae235b
      g_variant_builder_open (&ret, G_VARIANT_TYPE ("a{ss}"));
Packit ae235b
      v = g_variant_get_child_value (parameters, 9);
Packit ae235b
      g_variant_iter_init (&iter, v);
Packit ae235b
      while (g_variant_iter_loop (&iter, "ss", &s1, &s2))
Packit ae235b
        {
Packit ae235b
          gchar *tmp1, *tmp2;
Packit ae235b
          tmp1 = g_strconcat (s1, "mod", NULL);
Packit ae235b
          tmp2 = g_strconcat (s2, s2, NULL);
Packit ae235b
          g_variant_builder_add (&ret, "{ss}", tmp1, tmp2);
Packit ae235b
          g_free (tmp1);
Packit ae235b
          g_free (tmp2);
Packit ae235b
        }
Packit ae235b
      g_variant_unref (v);
Packit ae235b
      g_variant_builder_close (&ret;;
Packit ae235b
Packit ae235b
      g_variant_builder_open (&ret, G_VARIANT_TYPE ("a{oo}"));
Packit ae235b
      v = g_variant_get_child_value (parameters, 10);
Packit ae235b
      g_variant_iter_init (&iter, v);
Packit ae235b
      while (g_variant_iter_loop (&iter, "oo", &s1, &s2))
Packit ae235b
        {
Packit ae235b
          gchar *tmp1, *tmp2;
Packit ae235b
          tmp1 = g_strconcat (s1, "/mod", NULL);
Packit ae235b
          tmp2 = g_strconcat (s2, "/mod2", NULL);
Packit ae235b
          g_variant_builder_add (&ret, "{oo}", tmp1, tmp2);
Packit ae235b
          g_free (tmp1);
Packit ae235b
          g_free (tmp2);
Packit ae235b
        }
Packit ae235b
      g_variant_unref (v);
Packit ae235b
      g_variant_builder_close (&ret;;
Packit ae235b
Packit ae235b
      g_variant_builder_open (&ret, G_VARIANT_TYPE ("a{gg}"));
Packit ae235b
      v = g_variant_get_child_value (parameters, 11);
Packit ae235b
      g_variant_iter_init (&iter, v);
Packit ae235b
      while (g_variant_iter_loop (&iter, "gg", &s1, &s2))
Packit ae235b
        {
Packit ae235b
          gchar *tmp1, *tmp2;
Packit ae235b
          tmp1 = g_strconcat (s1, "assgit", NULL);
Packit ae235b
          tmp2 = g_strconcat (s2, s2, NULL);
Packit ae235b
          g_variant_builder_add (&ret, "{gg}", tmp1, tmp2);
Packit ae235b
          g_free (tmp1);
Packit ae235b
          g_free (tmp2);
Packit ae235b
        }
Packit ae235b
      g_variant_unref (v);
Packit ae235b
      g_variant_builder_close (&ret;;
Packit ae235b
Packit ae235b
      g_dbus_method_invocation_return_value (invocation,
Packit ae235b
                                             g_variant_builder_end (&ret));
Packit ae235b
    }
Packit ae235b
  else if (g_strcmp0 (method_name, "TestStructureTypes") == 0)
Packit ae235b
    {
Packit ae235b
      gint x, y, x1, y1;
Packit ae235b
      const gchar *desc;
Packit ae235b
      GVariantIter *iter1, *iter2;
Packit ae235b
      gchar *desc_ret;
Packit ae235b
      GVariantBuilder ret1, ret2;
Packit ae235b
      GVariantIter *iter;
Packit ae235b
      GVariant *v;
Packit ae235b
      gchar *s1, *s2;
Packit ae235b
Packit ae235b
      g_variant_get (parameters, "((ii)(&s(ii)aya{ss}))",
Packit ae235b
                     &x, &y, &desc, &x1, &y1, &iter1, &iter2);
Packit ae235b
Packit ae235b
      desc_ret = g_strconcat (desc, "... in bed!", NULL);
Packit ae235b
Packit ae235b
      g_variant_builder_init (&ret1, G_VARIANT_TYPE ("ay"));
Packit ae235b
      iter = g_variant_iter_copy (iter1);
Packit ae235b
      while (g_variant_iter_loop (iter1, "y", &v))
Packit ae235b
        g_variant_builder_add (&ret1, "y", v);
Packit ae235b
      while (g_variant_iter_loop (iter, "y", &v))
Packit ae235b
        g_variant_builder_add (&ret1, "y", v);
Packit ae235b
      g_variant_iter_free (iter);
Packit ae235b
      g_variant_iter_free (iter1);
Packit ae235b
Packit ae235b
      g_variant_builder_init (&ret2, G_VARIANT_TYPE ("a{ss}"));
Packit ae235b
      while (g_variant_iter_loop (iter1, "ss", &s1, &s2))
Packit ae235b
        {
Packit ae235b
          gchar *tmp;
Packit ae235b
          tmp = g_strconcat (s2, " ... in bed!", NULL);
Packit ae235b
          g_variant_builder_add (&ret1, "{ss}", s1, tmp);
Packit ae235b
          g_free (tmp);
Packit ae235b
        }
Packit ae235b
      g_variant_iter_free (iter2);
Packit ae235b
Packit ae235b
      g_dbus_method_invocation_return_value (invocation,
Packit ae235b
           g_variant_new ("((ii)(&s(ii)aya{ss}))",
Packit ae235b
                          x + 1, y + 1, desc_ret, x1 + 2, y1 + 2,
Packit ae235b
                          &ret1, &ret2));
Packit ae235b
Packit ae235b
      g_free (desc_ret);
Packit ae235b
    }
Packit ae235b
  else if (g_strcmp0 (method_name, "TestVariant") == 0)
Packit ae235b
    {
Packit ae235b
      GVariant *v;
Packit ae235b
      gboolean modify;
Packit ae235b
      GVariant *ret;
Packit ae235b
Packit ae235b
      g_variant_get (parameters, "(vb)", &v, &modify);
Packit ae235b
Packit ae235b
      /* FIXME handle more cases */
Packit ae235b
      if (modify)
Packit ae235b
        {
Packit ae235b
          if (g_variant_is_of_type (v, G_VARIANT_TYPE_BOOLEAN))
Packit ae235b
            {
Packit ae235b
              ret = g_variant_new_boolean (FALSE);
Packit ae235b
            }
Packit ae235b
          else if (g_variant_is_of_type (v, G_VARIANT_TYPE_TUPLE))
Packit ae235b
            {
Packit ae235b
              ret = g_variant_new ("(si)", "other struct", 100);
Packit ae235b
            }
Packit ae235b
          else
Packit ae235b
            g_assert_not_reached ();
Packit ae235b
        }
Packit ae235b
      else
Packit ae235b
        ret = v;
Packit ae235b
Packit ae235b
      g_dbus_method_invocation_return_value (invocation, ret);
Packit ae235b
      g_variant_unref (v);
Packit ae235b
    }
Packit ae235b
  else if (g_strcmp0 (method_name, "TestComplexArrays") == 0)
Packit ae235b
    {
Packit ae235b
      /* FIXME */
Packit ae235b
      g_dbus_method_invocation_return_value (invocation, parameters);
Packit ae235b
    }
Packit ae235b
  else if (g_strcmp0 (method_name, "TestComplexHashTables") == 0)
Packit ae235b
    {
Packit ae235b
      /* FIXME */
Packit ae235b
      g_dbus_method_invocation_return_value (invocation, parameters);
Packit ae235b
    }
Packit ae235b
  else if (g_strcmp0 (method_name, "FrobSetProperty") == 0)
Packit ae235b
    {
Packit ae235b
      gchar *name;
Packit ae235b
      GVariant *value;
Packit ae235b
      g_variant_get (parameters, "(sv)", &name, &value);
Packit ae235b
      g_hash_table_replace (properties, name, value);
Packit ae235b
      g_dbus_connection_emit_signal (connection,
Packit ae235b
                                     NULL,
Packit ae235b
                                     "/com/example/TestObject",
Packit ae235b
                                     "org.freedesktop.DBus.Properties",
Packit ae235b
                                     "PropertiesChanged",
Packit ae235b
                                     g_variant_new_parsed ("('com.example.Frob', [{%s, %v}], @as [])", name, value),
Packit ae235b
                                     NULL);
Packit ae235b
      g_dbus_method_invocation_return_value (invocation, NULL);
Packit ae235b
    }
Packit ae235b
  else if (g_strcmp0 (method_name, "FrobInvalidateProperty") == 0)
Packit ae235b
    {
Packit ae235b
      const gchar *value;
Packit ae235b
      g_variant_get (parameters, "(&s)", &value);
Packit ae235b
      g_hash_table_replace (properties, g_strdup ("PropertyThatWillBeInvalidated"), g_variant_ref_sink (g_variant_new_string (value)));
Packit ae235b
Packit ae235b
      g_dbus_connection_emit_signal (connection,
Packit ae235b
                                     NULL,
Packit ae235b
                                     "/com/example/TestObject",
Packit ae235b
                                     "org.freedesktop.DBus.Properties",
Packit ae235b
                                     "PropertiesChanged",
Packit ae235b
                                     g_variant_new_parsed ("('com.example.Frob', @a{sv} [], ['PropertyThatWillBeInvalidated'])"),
Packit ae235b
                                     NULL);
Packit ae235b
      g_dbus_method_invocation_return_value (invocation, NULL);
Packit ae235b
    }
Packit ae235b
  else if (g_strcmp0 (method_name, "EmitSignal") == 0)
Packit ae235b
    {
Packit ae235b
      const gchar *str;
Packit ae235b
      const gchar *path;
Packit ae235b
      gchar *str_ret;
Packit ae235b
      gchar *path_ret;
Packit ae235b
      g_variant_get (parameters, "(&s&o)", &str, &path);
Packit ae235b
      str_ret = g_strconcat (str, " .. in bed!", NULL);
Packit ae235b
      path_ret = g_strconcat (path, "/in/bed", NULL);
Packit ae235b
      g_dbus_connection_emit_signal (connection,
Packit ae235b
                                     NULL,
Packit ae235b
                                     "/com/example/TestObject",
Packit ae235b
                                     "com.example.Frob",
Packit ae235b
                                     "TestSignal",
Packit ae235b
                                     g_variant_new_parsed ("(%s, %o, <'a variant'>)", str_ret, path_ret),
Packit ae235b
                                     NULL);
Packit ae235b
      g_free (str_ret);
Packit ae235b
      g_free (path_ret);
Packit ae235b
      g_dbus_method_invocation_return_value (invocation, NULL);
Packit ae235b
    }
Packit ae235b
  else if (g_strcmp0 (method_name, "EmitSignal2") == 0)
Packit ae235b
    {
Packit ae235b
      g_dbus_connection_emit_signal (connection,
Packit ae235b
                                     NULL,
Packit ae235b
                                     "/com/example/TestObject",
Packit ae235b
                                     "com.example.Frob",
Packit ae235b
                                     "TestSignal2",
Packit ae235b
                                     g_variant_new_parsed ("(42, )"),
Packit ae235b
                                     NULL);
Packit ae235b
      g_dbus_method_invocation_return_value (invocation, NULL);
Packit ae235b
    }
Packit ae235b
  else if (g_strcmp0 (method_name, "Sleep") == 0)
Packit ae235b
    {
Packit ae235b
      gint msec;
Packit ae235b
Packit ae235b
      g_variant_get (parameters, "(i)", &msec);
Packit ae235b
Packit ae235b
      g_timeout_add ((guint)msec, end_sleep, g_object_ref (invocation));
Packit ae235b
    }
Packit ae235b
  else if (g_strcmp0 (method_name, "Quit") == 0)
Packit ae235b
    {
Packit ae235b
      g_dbus_method_invocation_return_value (invocation, NULL);
Packit ae235b
      g_main_loop_quit (loop);
Packit ae235b
    }
Packit ae235b
}
Packit ae235b
Packit ae235b
static GVariant *
Packit ae235b
handle_get_property (GDBusConnection  *connection,
Packit ae235b
                     const gchar      *sender,
Packit ae235b
                     const gchar      *object_path,
Packit ae235b
                     const gchar      *interface_name,
Packit ae235b
                     const gchar      *property_name,
Packit ae235b
                     GError          **error,
Packit ae235b
                     gpointer          user_data)
Packit ae235b
{
Packit ae235b
  GVariant *ret;
Packit ae235b
Packit ae235b
  ret = g_hash_table_lookup (properties, property_name);
Packit ae235b
  if (ret)
Packit ae235b
    {
Packit ae235b
      g_assert (!g_variant_is_floating (ret));
Packit ae235b
      g_variant_ref (ret);
Packit ae235b
    }
Packit ae235b
  else
Packit ae235b
    {
Packit ae235b
      g_set_error (error,
Packit ae235b
                   G_DBUS_ERROR, G_DBUS_ERROR_FAILED,
Packit ae235b
                   "no such property: %s", property_name);
Packit ae235b
    }
Packit ae235b
Packit ae235b
  return ret;
Packit ae235b
}
Packit ae235b
Packit ae235b
static gboolean
Packit ae235b
handle_set_property (GDBusConnection  *connection,
Packit ae235b
                     const gchar      *sender,
Packit ae235b
                     const gchar      *object_path,
Packit ae235b
                     const gchar      *interface_name,
Packit ae235b
                     const gchar      *property_name,
Packit ae235b
                     GVariant         *value,
Packit ae235b
                     GError          **error,
Packit ae235b
                     gpointer          user_data)
Packit ae235b
{
Packit ae235b
  g_set_error (error,
Packit ae235b
               G_DBUS_ERROR, G_DBUS_ERROR_FAILED,
Packit ae235b
               "SetProperty not implemented");
Packit ae235b
  return FALSE;
Packit ae235b
}
Packit ae235b
Packit ae235b
static const GDBusInterfaceVTable interface_vtable =
Packit ae235b
{
Packit ae235b
  handle_method_call,
Packit ae235b
  handle_get_property,
Packit ae235b
  handle_set_property
Packit ae235b
};
Packit ae235b
Packit ae235b
static void
Packit ae235b
on_bus_acquired (GDBusConnection *connection,
Packit ae235b
                 const gchar     *name,
Packit ae235b
                 gpointer         user_data)
Packit ae235b
{
Packit ae235b
  guint id;
Packit ae235b
Packit ae235b
  id = g_dbus_connection_register_object (connection,
Packit ae235b
                                          "/com/example/TestObject",
Packit ae235b
                                          introspection_data->interfaces[0],
Packit ae235b
                                          &interface_vtable,
Packit ae235b
                                          NULL,
Packit ae235b
                                          NULL,
Packit ae235b
                                          NULL);
Packit ae235b
  g_assert (id > 0);
Packit ae235b
}
Packit ae235b
Packit ae235b
static void
Packit ae235b
on_name_acquired (GDBusConnection *connection,
Packit ae235b
                  const gchar     *name,
Packit ae235b
                  gpointer         user_data)
Packit ae235b
{
Packit ae235b
}
Packit ae235b
Packit ae235b
static void
Packit ae235b
on_name_lost (GDBusConnection *connection,
Packit ae235b
              const gchar     *name,
Packit ae235b
              gpointer         user_data)
Packit ae235b
{
Packit ae235b
  exit (1);
Packit ae235b
}
Packit ae235b
Packit ae235b
int
Packit ae235b
main (int argc, char *argv[])
Packit ae235b
{
Packit ae235b
  guint owner_id;
Packit ae235b
Packit ae235b
  introspection_data = g_dbus_node_info_new_for_xml (introspection_xml, NULL);
Packit ae235b
  properties = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, (GDestroyNotify)g_variant_unref);
Packit ae235b
  g_hash_table_insert (properties, g_strdup ("y"), g_variant_ref_sink (g_variant_new_byte (1)));
Packit ae235b
  g_hash_table_insert (properties, g_strdup ("b"), g_variant_ref_sink (g_variant_new_boolean (TRUE)));
Packit ae235b
  g_hash_table_insert (properties, g_strdup ("n"), g_variant_ref_sink (g_variant_new_int16 (2)));
Packit ae235b
  g_hash_table_insert (properties, g_strdup ("q"), g_variant_ref_sink (g_variant_new_uint16 (3)));
Packit ae235b
  g_hash_table_insert (properties, g_strdup ("i"), g_variant_ref_sink (g_variant_new_int32 (4)));
Packit ae235b
  g_hash_table_insert (properties, g_strdup ("u"), g_variant_ref_sink (g_variant_new_uint32 (5)));
Packit ae235b
  g_hash_table_insert (properties, g_strdup ("x"), g_variant_ref_sink (g_variant_new_int64 (6)));
Packit ae235b
  g_hash_table_insert (properties, g_strdup ("t"), g_variant_ref_sink (g_variant_new_uint64 (7)));
Packit ae235b
  g_hash_table_insert (properties, g_strdup ("d"), g_variant_ref_sink (g_variant_new_double (7.5)));
Packit ae235b
  g_hash_table_insert (properties, g_strdup ("s"), g_variant_ref_sink (g_variant_new_string ("a string")));
Packit ae235b
  g_hash_table_insert (properties, g_strdup ("o"), g_variant_ref_sink (g_variant_new_object_path ("/some/path")));
Packit ae235b
  g_hash_table_insert (properties, g_strdup ("ay"), g_variant_ref_sink (g_variant_new_parsed ("[@y 1, @y 11]")));
Packit ae235b
  g_hash_table_insert (properties, g_strdup ("ab"), g_variant_ref_sink (g_variant_new_parsed ("[true, false]")));
Packit ae235b
  g_hash_table_insert (properties, g_strdup ("an"), g_variant_ref_sink (g_variant_new_parsed ("[@n 2, @n 12]")));
Packit ae235b
  g_hash_table_insert (properties, g_strdup ("aq"), g_variant_ref_sink (g_variant_new_parsed ("[@q 3, @q 13]")));
Packit ae235b
  g_hash_table_insert (properties, g_strdup ("ai"), g_variant_ref_sink (g_variant_new_parsed ("[@i 4, @i 14]")));
Packit ae235b
  g_hash_table_insert (properties, g_strdup ("au"), g_variant_ref_sink (g_variant_new_parsed ("[@u 5, @u 15]")));
Packit ae235b
  g_hash_table_insert (properties, g_strdup ("ax"), g_variant_ref_sink (g_variant_new_parsed ("[@x 6, @x 16]")));
Packit ae235b
  g_hash_table_insert (properties, g_strdup ("at"), g_variant_ref_sink (g_variant_new_parsed ("[@t 7, @t 17]")));
Packit ae235b
  g_hash_table_insert (properties, g_strdup ("ad"), g_variant_ref_sink (g_variant_new_parsed ("[7.5, 17.5]")));
Packit ae235b
  g_hash_table_insert (properties, g_strdup ("as"), g_variant_ref_sink (g_variant_new_parsed ("['a string', 'another string']")));
Packit ae235b
  g_hash_table_insert (properties, g_strdup ("ao"), g_variant_ref_sink (g_variant_new_parsed ("[@o '/some/path', @o '/another/path']")));
Packit ae235b
  g_hash_table_insert (properties, g_strdup ("foo"), g_variant_ref_sink (g_variant_new_string ("a frobbed string")));
Packit ae235b
  g_hash_table_insert (properties, g_strdup ("PropertyThatWillBeInvalidated"), g_variant_ref_sink (g_variant_new_string ("InitialValue")));
Packit ae235b
Packit ae235b
  owner_id = g_bus_own_name (G_BUS_TYPE_SESSION,
Packit ae235b
                             "com.example.TestService",
Packit ae235b
                             G_BUS_NAME_OWNER_FLAGS_NONE,
Packit ae235b
                             on_bus_acquired,
Packit ae235b
                             on_name_acquired,
Packit ae235b
                             on_name_lost,
Packit ae235b
                             NULL,
Packit ae235b
                             NULL);
Packit ae235b
Packit ae235b
  loop = g_main_loop_new (NULL, FALSE);
Packit ae235b
  g_main_loop_run (loop);
Packit ae235b
Packit ae235b
  g_bus_unown_name (owner_id);
Packit ae235b
Packit ae235b
  g_dbus_node_info_unref (introspection_data);
Packit ae235b
Packit ae235b
  return 0;
Packit ae235b
}