summaryrefslogtreecommitdiff
path: root/tools/glib-client-gen.py
diff options
context:
space:
mode:
authorSimon McVittie <simon.mcvittie@collabora.co.uk>2008-01-08 17:23:57 +0000
committerSimon McVittie <simon.mcvittie@collabora.co.uk>2008-01-08 17:23:57 +0000
commit00badb03990c2dfe71e68a6ddf860f71c7aa62bd (patch)
treeb18b00456368af90851403b03828c189a640bb33 /tools/glib-client-gen.py
parentf7e0d1b2bc085c4e3b326921073a78c95e2e9f60 (diff)
downloadtelepathy-glib-00badb03990c2dfe71e68a6ddf860f71c7aa62bd.tar.gz
TpProxy: redo signal connection API so signal callbacks can be invoked in idle callbacks (same reasoning as method callbacks)
20080108172357-53eee-ff162a3eb55384b248cf560e3bf377ec7d9470b9.gz
Diffstat (limited to 'tools/glib-client-gen.py')
-rw-r--r--tools/glib-client-gen.py171
1 files changed, 125 insertions, 46 deletions
diff --git a/tools/glib-client-gen.py b/tools/glib-client-gen.py
index 3fe1244ec..517e14cf0 100644
--- a/tools/glib-client-gen.py
+++ b/tools/glib-client-gen.py
@@ -86,6 +86,10 @@ class Generator(object):
callback_name = ('%s_%s_signal_callback_%s'
% (self.prefix_lc, iface_lc, member_lc))
+ collect_name = ('_%s_%s_collect_args_of_%s'
+ % (self.prefix_lc, iface_lc, member_lc))
+ invoke_name = ('_%s_%s_invoke_callback_for_%s'
+ % (self.prefix_lc, iface_lc, member_lc))
# Example:
#
@@ -127,49 +131,123 @@ class Generator(object):
self.h(' gpointer user_data, GObject *weak_object);')
- # Example:
- # static void _tp_cli_connection_signal_callback_new_channel
- # (DBusGProxy *proxy, const gchar *arg_object_path,
- # const gchar *arg_channel_type, guint arg_handle_type,
- # guint arg_handle, gboolean arg_suppress_handler,
- # TpProxySignalConnection *signal_connection);
+ if args:
+ self.b('static void')
+ self.b('%s (DBusGProxy *proxy,' % collect_name)
- self.b('static void _%s (DBusGProxy *proxy,'
- % callback_name)
+ for arg in args:
+ name, info, tp_type, elt = arg
+ ctype, gtype, marshaller, pointer = info
- for arg in args:
- name, info, tp_type, elt = arg
- ctype, gtype, marshaller, pointer = info
+ const = pointer and 'const ' or ''
- const = pointer and 'const ' or ''
+ self.b(' %s%s%s,' % (const, ctype, name))
- self.b(' %s%s%s,' % (const, ctype, name))
+ self.b(' TpProxySignalConnection *sc)')
+ self.b('{')
+ self.b(' GValueArray *args = g_value_array_new (%d);' % len(args))
+ self.b(' GValue blank = { 0 };')
+ self.b(' guint i;')
+ self.b('')
+ self.b(' g_value_init (&blank, G_TYPE_INT);')
+ self.b('')
+ self.b(' for (i = 0; i < %d; i++)' % len(args))
+ self.b(' g_value_array_append (args, &blank);')
+ self.b('')
+
+ for i, arg in enumerate(args):
+ name, info, tp_type, elt = arg
+ ctype, gtype, marshaller, pointer = info
+
+ self.b(' g_value_unset (args->values + %d);' % i)
+ self.b(' g_value_init (args->values + %d, %s);' % (i, gtype))
+
+ if gtype == 'G_TYPE_STRING':
+ self.b(' g_value_set_string (args->values + %d, %s);'
+ % (i, name))
+ elif marshaller == 'BOXED':
+ self.b(' g_value_set_boxed (args->values + %d, %s);'
+ % (i, name))
+ elif gtype == 'G_TYPE_UCHAR':
+ self.b(' g_value_set_uchar (args->values + %d, %s);'
+ % (i, name))
+ elif gtype == 'G_TYPE_BOOLEAN':
+ self.b(' g_value_set_boolean (args->values + %d, %s);'
+ % (i, name))
+ elif gtype == 'G_TYPE_INT':
+ self.b(' g_value_set_int (args->values + %d, %s);'
+ % (i, name))
+ elif gtype == 'G_TYPE_UINT':
+ self.b(' g_value_set_uint (args->values + %d, %s);'
+ % (i, name))
+ elif gtype == 'G_TYPE_INT64':
+ self.b(' g_value_set_int (args->values + %d, %s);'
+ % (i, name))
+ elif gtype == 'G_TYPE_UINT64':
+ self.b(' g_value_set_uint (args->values + %d, %s);'
+ % (i, name))
+ elif gtype == 'G_TYPE_DOUBLE':
+ self.b(' g_value_set_double (args->values + %d, %s);'
+ % (i, name))
+ else:
+ assert False, ("Don't know how to put %s in a GValue"
+ % gtype)
+ self.b('')
- self.b(' TpProxySignalConnection *signal_connection)')
+ self.b(' tp_proxy_signal_connection_v0_take_results (sc, args);')
+ self.b('}')
+
+ self.b('static void')
+ self.b('%s (TpProxy *tpproxy,' % invoke_name)
+ self.b(' GError *error,')
+ self.b(' GValueArray *args,')
+ self.b(' GCallback generic_callback,')
+ self.b(' gpointer user_data,')
+ self.b(' GObject *weak_object)')
self.b('{')
- self.b(' TpProxy *tpproxy;')
- self.b(' gpointer user_data;')
- self.b(' GObject *weak_object;')
self.b(' %s callback =' % callback_name)
- self.b(' (%s)' % callback_name)
- self.b(' tp_proxy_signal_connection_get_callback '
- '(signal_connection,')
- self.b(' &tpproxy,')
- self.b(' &user_data,')
- self.b(' &weak_object);')
- self.b('')
- self.b(' g_assert (tpproxy != NULL);')
+ self.b(' (%s) generic_callback;' % callback_name)
self.b('')
self.b(' if (callback != NULL)')
self.b(' callback (g_object_ref (tpproxy),')
- for arg in args:
+ # FIXME: factor out into a function
+ for i, arg in enumerate(args):
name, info, tp_type, elt = arg
- self.b(' %s,' % name)
+ ctype, gtype, marshaller, pointer = info
+
+ if marshaller == 'BOXED':
+ self.b(' g_value_get_boxed (args->values + %d),' % i)
+ elif gtype == 'G_TYPE_STRING':
+ self.b(' g_value_get_string (args->values + %d),' % i)
+ elif gtype == 'G_TYPE_UCHAR':
+ self.b(' g_value_get_uchar (args->values + %d),' % i)
+ elif gtype == 'G_TYPE_BOOLEAN':
+ self.b(' g_value_get_boolean (args->values + %d),' % i)
+ elif gtype == 'G_TYPE_UINT':
+ self.b(' g_value_get_uint (args->values + %d),' % i)
+ elif gtype == 'G_TYPE_INT':
+ self.b(' g_value_get_int (args->values + %d),' % i)
+ elif gtype == 'G_TYPE_UINT64':
+ self.b(' g_value_get_uint64 (args->values + %d),' % i)
+ elif gtype == 'G_TYPE_INT64':
+ self.b(' g_value_get_int64 (args->values + %d),' % i)
+ elif gtype == 'G_TYPE_DOUBLE':
+ self.b(' g_value_get_double (args->values + %d),' % i)
+ else:
+ assert False, "Don't know how to get %s from a GValue" % gtype
self.b(' user_data,')
self.b(' weak_object);')
self.b('')
+
+ if len(args) > 0:
+ self.b(' g_value_array_free (args);')
+ else:
+ self.b(' if (args != NULL)')
+ self.b(' g_value_array_free (args);')
+ self.b('')
+
self.b(' g_object_unref (tpproxy);')
self.b('}')
@@ -223,32 +301,32 @@ class Generator(object):
self.b(' GDestroyNotify destroy,')
self.b(' GObject *weak_object)')
self.b('{')
- self.b(' TpProxySignalConnection *data;')
- self.b(' DBusGProxy *iface;')
+ self.b(' GType expected_types[%d] = {' % (len(args) + 1))
+
+ for arg in args:
+ name, info, tp_type, elt = arg
+ ctype, gtype, marshaller, pointer = info
+
+ self.b(' %s,' % gtype)
+
+ self.b(' G_TYPE_INVALID };')
self.b('')
self.b(' g_return_val_if_fail (%s (proxy), NULL);'
% self.proxy_assert)
- self.b('')
- self.b(' iface = tp_proxy_borrow_interface_by_id (')
- self.b(' (TpProxy *) proxy,')
- self.b(' TP_IFACE_QUARK_%s,' % iface_lc.upper())
- self.b(' NULL);')
- self.b('')
self.b(' g_return_val_if_fail (callback != NULL, NULL);')
self.b('')
- self.b(' if (iface == NULL)')
- self.b(' return NULL;')
- self.b('')
- self.b(' data = tp_proxy_signal_connection_new ((TpProxy *) proxy,')
+ self.b(' return tp_proxy_signal_connection_v0_new ((TpProxy *) proxy,')
self.b(' TP_IFACE_QUARK_%s, \"%s\",' % (iface_lc.upper(), member))
+ self.b(' expected_types,')
+
+ if args:
+ self.b(' G_CALLBACK (%s),' % collect_name)
+ else:
+ self.b(' NULL, /* no args => no collector function */')
+
+ self.b(' %s,' % invoke_name)
self.b(' G_CALLBACK (callback), user_data, destroy,')
- self.b(' weak_object, G_CALLBACK (_%s));' % callback_name)
- self.b('')
- self.b(' dbus_g_proxy_connect_signal (iface, \"%s\",' % member)
- self.b(' G_CALLBACK (_%s), data,' % callback_name)
- self.b(' tp_proxy_signal_connection_free_closure);')
- self.b('')
- self.b(' return data;')
+ self.b(' weak_object);')
self.b('}')
self.b('')
@@ -576,6 +654,7 @@ class Generator(object):
self.b(' callback ((%s) self,' % self.proxy_cls)
+ # FIXME: factor out into a function
for i, arg in enumerate(out_args):
name, info, tp_type, elt = arg
ctype, gtype, marshaller, pointer = info