[Telepathy-commits] [telepathy-mission-control/master] Dispatcher: handling GType (work in progress)
Alban Crequy
alban.crequy at collabora.co.uk
Fri Nov 21 04:49:16 PST 2008
---
src/mcd-dispatcher.c | 131 +++++++++++++++++++++++++++++++++++++++++++++++++-
1 files changed, 129 insertions(+), 2 deletions(-)
diff --git a/src/mcd-dispatcher.c b/src/mcd-dispatcher.c
index 6a281e7..2403a5a 100644
--- a/src/mcd-dispatcher.c
+++ b/src/mcd-dispatcher.c
@@ -115,7 +115,13 @@ typedef struct _McdClient
/* Channel filters
* A channel filter is a GHashTable of
* - key: gchar *property_name
- * - value: one of the allowed types on the ObserverChannelFilter spec
+ * - value: GValue of one of the allowed types on the ObserverChannelFilter
+ * spec. The following matching is observed:
+ * * G_TYPE_STRING: 's'
+ * * G_TYPE_BOOLEAN: 'b'
+ * * DBUS_TYPE_G_OBJECT_PATH: 'o'
+ * * G_TYPE_UINT64: 'y' (8b), 'q' (16b), 'u' (32b), 't' (64b)
+ * * G_TYPE_INT64: 'n' (16b), 'i' (32b), 'x' (64b)
*/
GList *approver_filters;
GList *handler_filters;
@@ -2214,7 +2220,6 @@ list_activatable_names_cb (TpDBusDaemon *proxy,
GObject *weak_object)
{
McdDispatcher *self = MCD_DISPATCHER (weak_object);
- McdDispatcherPrivate *priv = MCD_DISPATCHER_PRIV (self);
add_names_cb (self, out0);
}
@@ -2635,6 +2640,128 @@ GPtrArray *mcd_dispatcher_get_channel_capabilities (McdDispatcher * dispatcher,
return args.channel_handler_caps;
}
+static gint64
+get_signed_integer (GValue *value)
+{
+ switch (G_VALUE_TYPE (value))
+ {
+ case G_TYPE_INT:
+ return g_value_get_int (value);
+
+ case G_TYPE_INT64:
+ return g_value_get_int64 (value);
+
+ default:
+ g_assert_not_reached ();
+ }
+}
+
+static guint64
+get_unsigned_integer (GValue *value)
+{
+ switch (G_VALUE_TYPE (value))
+ {
+ case G_TYPE_UCHAR:
+ return g_value_get_uchar (value);
+
+ case G_TYPE_UINT:
+ return g_value_get_uint (value);
+ break;
+
+ case G_TYPE_UINT64:
+ return g_value_get_uint64 (value);
+
+ default:
+ g_assert_not_reached ();
+ }
+}
+
+/* return TRUE if the two GValue are equals
+ * The check is done according to the spec of the ObserverChannelFilter
+ * property
+ */
+static gboolean
+channel_property_equals (GValue *value1, GValue *value2)
+{
+ GType type1 = G_VALUE_TYPE (value1);
+ GType type2 = G_VALUE_TYPE (value2);
+ gboolean value1_is_signed;
+
+ if (type1 == G_TYPE_BOOLEAN)
+ return G_VALUE_TYPE (value2) == G_TYPE_BOOLEAN &&
+ g_value_get_boolean (value1) == g_value_get_boolean (value2);
+
+ if (type1 == G_TYPE_STRING)
+ return G_VALUE_TYPE (value2) == G_TYPE_STRING &&
+ g_strcmp0 (g_value_get_string (value1),
+ g_value_get_string (value2));
+
+ if (type1 == DBUS_TYPE_G_OBJECT_PATH)
+ return G_VALUE_TYPE (value2) == DBUS_TYPE_G_OBJECT_PATH &&
+ g_strcmp0 (g_value_get_boxed (value1),
+ g_value_get_boxed (value2));
+
+ if (type1 == G_TYPE_UCHAR ||
+ type1 == G_TYPE_UINT ||
+ type1 == G_TYPE_UINT64)
+ value1_is_signed = FALSE;
+ else if (type1 == G_TYPE_INT ||
+ type1 == G_TYPE_INT64)
+ value1_is_signed = TRUE;
+ else
+ {
+ g_warning ("%s: Invalid type: %s",
+ G_STRFUNC, g_type_name (G_VALUE_TYPE (value1)));
+ return FALSE;
+ }
+
+ /* integer case */
+
+ if (type2 == G_TYPE_UCHAR ||
+ type2 == G_TYPE_UINT ||
+ type2 == G_TYPE_UINT64)
+ {
+ if (value1_is_signed)
+ {
+ if (get_signed_integer (value1) < 0 ||
+ get_unsigned_integer (value2) > G_MAXINT64)
+ return FALSE;
+
+ return get_signed_integer (value1) ==
+ get_unsigned_integer (value2);
+ }
+ else
+ {
+ return get_unsigned_integer (value1) ==
+ get_unsigned_integer (value2);
+ }
+ }
+ else if (type2 == G_TYPE_INT ||
+ type2 == G_TYPE_INT64)
+ {
+ if (value1_is_signed)
+ {
+ return get_unsigned_integer (value1) ==
+ get_unsigned_integer (value2);
+ }
+ else
+ {
+ if (get_signed_integer (value2) < 0 ||
+ get_unsigned_integer (value1) > G_MAXINT64)
+ return FALSE;
+
+ return get_signed_integer (value1) ==
+ get_unsigned_integer (value2);
+ }
+ }
+ else
+ return FALSE;
+}
+
+static gboolean
+diff_channel_classes (GPtrArray *channel_class1, GPtrArray *channel_class2)
+{
+}
GPtrArray *
mcd_dispatcher_get_channel_enhanced_capabilities (McdDispatcher * dispatcher,
--
1.5.6.5
More information about the Telepathy-commits
mailing list