3
#include <glib/gi18n.h>
4
#include <glib-object.h>
6
#include "my-object-marshal.h"
8
#include "test-service-glib-glue.h"
26
static guint signals[LAST_SIGNAL] = { 0 };
28
G_DEFINE_TYPE(MyObject, my_object, G_TYPE_OBJECT)
31
my_object_finalize (GObject *object)
33
MyObject *mobject = MY_OBJECT (object);
35
g_free (mobject->this_is_a_string);
37
(G_OBJECT_CLASS (my_object_parent_class)->finalize) (object);
41
my_object_set_property (GObject *object,
48
mobject = MY_OBJECT (object);
52
case PROP_THIS_IS_A_STRING:
53
g_free (mobject->this_is_a_string);
54
mobject->this_is_a_string = g_value_dup_string (value);
58
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
64
my_object_get_property (GObject *object,
71
mobject = MY_OBJECT (object);
75
case PROP_THIS_IS_A_STRING:
76
g_value_set_string (value, mobject->this_is_a_string);
80
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
86
my_object_init (MyObject *obj)
92
my_object_class_init (MyObjectClass *mobject_class)
94
GObjectClass *gobject_class = G_OBJECT_CLASS (mobject_class);
96
dbus_g_object_type_install_info (MY_TYPE_OBJECT,
97
&dbus_glib_my_object_object_info);
99
gobject_class->finalize = my_object_finalize;
100
gobject_class->set_property = my_object_set_property;
101
gobject_class->get_property = my_object_get_property;
103
g_object_class_install_property (gobject_class,
104
PROP_THIS_IS_A_STRING,
105
g_param_spec_string ("this_is_a_string",
107
_("Example of a string property"),
110
signals[FROBNICATE] =
111
g_signal_new ("frobnicate",
112
G_OBJECT_CLASS_TYPE (mobject_class),
113
G_SIGNAL_RUN_LAST | G_SIGNAL_DETAILED,
116
g_cclosure_marshal_VOID__INT,
117
G_TYPE_NONE, 1, G_TYPE_INT);
120
g_signal_new ("sig0",
121
G_OBJECT_CLASS_TYPE (mobject_class),
122
G_SIGNAL_RUN_LAST | G_SIGNAL_DETAILED,
125
my_object_marshal_VOID__STRING_INT_STRING,
126
G_TYPE_NONE, 3, G_TYPE_STRING, G_TYPE_INT, G_TYPE_STRING);
129
g_signal_new ("sig1",
130
G_OBJECT_CLASS_TYPE (mobject_class),
131
G_SIGNAL_RUN_LAST | G_SIGNAL_DETAILED,
134
my_object_marshal_VOID__STRING_BOXED,
135
G_TYPE_NONE, 2, G_TYPE_STRING, G_TYPE_VALUE);
138
g_signal_new ("sig2",
139
G_OBJECT_CLASS_TYPE (mobject_class),
140
G_SIGNAL_RUN_LAST | G_SIGNAL_DETAILED,
143
g_cclosure_marshal_VOID__BOXED,
144
G_TYPE_NONE, 1, DBUS_TYPE_G_STRING_STRING_HASHTABLE);
148
my_object_error_quark (void)
150
static GQuark quark = 0;
152
quark = g_quark_from_static_string ("my_object_error");
157
/* This should really be standard. */
158
#define ENUM_ENTRY(NAME, DESC) { NAME, "" #NAME "", DESC }
161
my_object_error_get_type (void)
163
static GType etype = 0;
167
static const GEnumValue values[] =
170
ENUM_ENTRY (MY_OBJECT_ERROR_FOO, "Foo"),
171
ENUM_ENTRY (MY_OBJECT_ERROR_BAR, "Bar"),
175
etype = g_enum_register_static ("MyObjectError", values);
182
my_object_do_nothing (MyObject *obj, GError **error)
188
my_object_increment (MyObject *obj, gint32 x, gint32 *ret, GError **error)
195
my_object_increment_retval (MyObject *obj, gint32 x)
201
my_object_increment_retval_error (MyObject *obj, gint32 x, GError **error)
209
"x is bigger than 9");
216
my_object_throw_error (MyObject *obj, GError **error)
222
"this method always loses");
227
my_object_uppercase (MyObject *obj, const char *str, char **ret, GError **error)
229
*ret = g_ascii_strup (str, -1);
234
my_object_many_args (MyObject *obj, guint32 x, const char *str, double trouble, double *d_ret, char **str_ret, GError **error)
236
*d_ret = trouble + (x * 2);
237
*str_ret = g_ascii_strup (str, -1);
242
my_object_many_return (MyObject *obj, guint32 *arg0, char **arg1, gint32 *arg2, guint32 *arg3, guint32 *arg4, const char **arg5, GError **error)
245
*arg1 = g_strdup ("42");
249
*arg5 = "hello world"; /* Annotation specifies as const */
254
my_object_stringify (MyObject *obj, GValue *value, char **ret, GError **error)
256
GValue valstr = {0, };
258
g_value_init (&valstr, G_TYPE_STRING);
259
if (!g_value_transform (value, &valstr))
264
"couldn't transform value");
267
*ret = g_value_dup_string (&valstr);
268
g_value_unset (&valstr);
273
my_object_unstringify (MyObject *obj, const char *str, GValue *value, GError **error)
275
if (str[0] == '\0' || !g_ascii_isdigit (str[0])) {
276
g_value_init (value, G_TYPE_STRING);
277
g_value_set_string (value, str);
279
g_value_init (value, G_TYPE_INT);
280
g_value_set_int (value, (int) g_ascii_strtoull (str, NULL, 10));
286
my_object_recursive1 (MyObject *obj, GArray *array, guint32 *len_ret, GError **error)
288
*len_ret = array->len;
293
my_object_recursive2 (MyObject *obj, guint32 reqlen, GArray **ret, GError **error)
298
array = g_array_new (FALSE, TRUE, sizeof (guint32));
302
g_array_append_val (array, val);
304
g_array_append_val (array, val);
308
g_array_append_val (array, val);
314
my_object_many_uppercase (MyObject *obj, const char * const *in, char ***out, GError **error)
319
len = g_strv_length ((char**) in);
321
*out = g_new0 (char *, len + 1);
322
for (i = 0; i < len; i++)
324
(*out)[i] = g_ascii_strup (in[i], -1);
332
hash_foreach_stringify (gpointer key, gpointer val, gpointer user_data)
334
const char *keystr = key;
335
const GValue *value = val;
337
GHashTable *ret = user_data;
339
sval = g_new0 (GValue, 1);
340
g_value_init (sval, G_TYPE_STRING);
341
if (!g_value_transform (value, sval))
342
g_assert_not_reached ();
344
g_hash_table_insert (ret, g_strdup (keystr), sval);
348
unset_and_free_gvalue (gpointer val)
355
my_object_many_stringify (MyObject *obj, GHashTable /* char * -> GValue * */ *vals, GHashTable /* char * -> GValue * */ **ret, GError **error)
357
*ret = g_hash_table_new_full (g_str_hash, g_str_equal,
358
g_free, unset_and_free_gvalue);
359
g_hash_table_foreach (vals, hash_foreach_stringify, *ret);
364
my_object_rec_arrays (MyObject *obj, GPtrArray *in, GPtrArray **ret, GError **error)
375
"invalid array len");
379
strs = g_ptr_array_index (in, 0);
380
if (!*strs || strcmp (*strs, "foo"))
389
if (!*strs || strcmp (*strs, "bar"))
403
"invalid string array len in pos 0");
406
strs = g_ptr_array_index (in, 1);
407
if (!*strs || strcmp (*strs, "baz"))
416
if (!*strs || strcmp (*strs, "whee"))
425
if (!*strs || strcmp (*strs, "moo"))
439
"invalid string array len in pos 1");
443
*ret = g_ptr_array_new ();
445
ints = g_array_new (TRUE, TRUE, sizeof (guint));
447
g_array_append_val (ints, v_UINT);
449
g_array_append_val (ints, v_UINT);
451
g_array_append_val (ints, v_UINT);
452
g_ptr_array_add (*ret, ints);
454
ints = g_array_new (TRUE, TRUE, sizeof (guint));
456
g_array_append_val (ints, v_UINT);
457
g_ptr_array_add (*ret, ints);
462
my_object_objpath (MyObject *obj, const char *incoming, const char **outgoing, GError **error)
464
if (strcmp (incoming, "/org/freedesktop/DBus/GLib/Tests/MyTestObject"))
469
"invalid incoming object");
472
*outgoing = "/org/freedesktop/DBus/GLib/Tests/MyTestObject2";
477
my_object_get_objs (MyObject *obj, GPtrArray **objs, GError **error)
479
*objs = g_ptr_array_new ();
481
g_ptr_array_add (*objs, g_strdup ("/org/freedesktop/DBus/GLib/Tests/MyTestObject"));
482
g_ptr_array_add (*objs, g_strdup ("/org/freedesktop/DBus/GLib/Tests/MyTestObject2"));
488
hash_foreach (gpointer key, gpointer val, gpointer user_data)
490
const char *keystr = key;
491
const char *valstr = val;
492
guint *count = user_data;
494
*count += (strlen (keystr) + strlen (valstr));
495
g_print ("%s -> %s\n", keystr, valstr);
499
my_object_str_hash_len (MyObject *obj, GHashTable *table, guint *len, GError **error)
502
g_hash_table_foreach (table, hash_foreach, len);
507
my_object_send_car (MyObject *obj, GValueArray *invals, GValueArray **outvals, GError **error)
509
if (invals->n_values != 3
510
|| G_VALUE_TYPE (g_value_array_get_nth (invals, 0)) != G_TYPE_STRING
511
|| G_VALUE_TYPE (g_value_array_get_nth (invals, 1)) != G_TYPE_UINT
512
|| G_VALUE_TYPE (g_value_array_get_nth (invals, 2)) != G_TYPE_VALUE)
517
"invalid incoming values");
520
*outvals = g_value_array_new (2);
521
g_value_array_append (*outvals, NULL);
522
g_value_init (g_value_array_get_nth (*outvals, (*outvals)->n_values - 1), G_TYPE_UINT);
523
g_value_set_uint (g_value_array_get_nth (*outvals, (*outvals)->n_values - 1),
524
g_value_get_uint (g_value_array_get_nth (invals, 1)) + 1);
525
g_value_array_append (*outvals, NULL);
526
g_value_init (g_value_array_get_nth (*outvals, (*outvals)->n_values - 1), DBUS_TYPE_G_OBJECT_PATH);
527
g_value_set_boxed (g_value_array_get_nth (*outvals, (*outvals)->n_values - 1),
528
g_strdup ("/org/freedesktop/DBus/GLib/Tests/MyTestObject2"));
533
my_object_get_hash (MyObject *obj, GHashTable **ret, GError **error)
537
table = g_hash_table_new (g_str_hash, g_str_equal);
538
g_hash_table_insert (table, "foo", "bar");
539
g_hash_table_insert (table, "baz", "whee");
540
g_hash_table_insert (table, "cow", "crack");
546
my_object_increment_val (MyObject *obj, GError **error)
553
my_object_get_val (MyObject *obj, guint *ret, GError **error)
560
my_object_get_value (MyObject *obj, guint *ret, GError **error)
567
my_object_echo_variant (MyObject *obj, GValue *variant, GValue *ret, GError **error)
570
t = G_VALUE_TYPE(variant);
571
g_value_init (ret, t);
572
g_value_copy (variant, ret);
578
my_object_process_variant_of_array_of_ints123 (MyObject *obj, GValue *variant, GError **error)
586
array = (GArray *)g_value_get_boxed (variant);
588
for (i = 0; i <= 2; i++)
590
j = g_array_index (array, int, i);
598
*error = g_error_new (MY_OBJECT_ERROR,
600
"Error decoding a variant of type ai (i + 1 = %i, j = %i)",
606
typedef struct _HashAndString HashAndString;
608
struct _HashAndString
615
hash_foreach_prepend_string (gpointer key, gpointer val, gpointer user_data)
617
HashAndString *data = (HashAndString*) user_data;
618
gchar *in = (gchar*) val;
619
g_hash_table_insert (data->hash, g_strdup ((gchar*) key),
620
g_strjoin (" ", data->string, in, NULL));
625
hash_foreach_mangle_dict_of_strings (gpointer key, gpointer val, gpointer user_data)
627
GHashTable *out = (GHashTable*) user_data;
628
GHashTable *in_dict = (GHashTable *) val;
629
HashAndString *data = g_new0 (HashAndString, 1);
631
data->string = (gchar*) key;
632
data->hash = g_hash_table_new_full (g_str_hash, g_str_equal,
634
g_hash_table_foreach (in_dict, hash_foreach_prepend_string, data);
636
g_hash_table_insert(out, g_strdup ((gchar*) key), data->hash);
640
my_object_dict_of_dicts (MyObject *obj, GHashTable *in,
641
GHashTable **out, GError **error)
643
*out = g_hash_table_new_full (g_str_hash, g_str_equal,
644
(GDestroyNotify) g_free,
645
(GDestroyNotify) g_hash_table_destroy);
646
g_hash_table_foreach (in, hash_foreach_mangle_dict_of_strings, *out);
651
my_object_emit_frobnicate (MyObject *obj, GError **error)
653
g_signal_emit (obj, signals[FROBNICATE], 0, 42);
658
my_object_emit_signals (MyObject *obj, GError **error)
662
g_signal_emit (obj, signals[SIG0], 0, "foo", 22, "moo");
664
g_value_init (&val, G_TYPE_STRING);
665
g_value_set_string (&val, "bar");
666
g_signal_emit (obj, signals[SIG1], 0, "baz", &val);
667
g_value_unset (&val);
673
my_object_emit_signal2 (MyObject *obj, GError **error)
677
table = g_hash_table_new (g_str_hash, g_str_equal);
678
g_hash_table_insert (table, "baz", "cow");
679
g_hash_table_insert (table, "bar", "foo");
680
g_signal_emit (obj, signals[SIG2], 0, table);
681
g_hash_table_destroy (table);
687
DBusGMethodInvocation *context;
691
do_async_increment (IncrementData *data)
693
gint32 newx = data->x + 1;
694
dbus_g_method_return (data->context, newx);
700
my_object_async_increment (MyObject *obj, gint32 x, DBusGMethodInvocation *context)
702
IncrementData *data = g_new0 (IncrementData, 1);
704
data->context = context;
705
g_idle_add ((GSourceFunc)do_async_increment, data);
709
do_async_error (IncrementData *data)
712
error = g_error_new (MY_OBJECT_ERROR,
715
"this method always loses");
716
dbus_g_method_return_error (data->context, error);
722
my_object_async_throw_error (MyObject *obj, DBusGMethodInvocation *context)
724
IncrementData *data = g_new0(IncrementData, 1);
725
data->context = context;
726
g_idle_add ((GSourceFunc)do_async_error, data);
730
extern GMainLoop *loop;
733
my_object_terminate (MyObject *obj, GError **error)
735
g_main_loop_quit (loop);