[Telepathy-commits] [telepathy-mission-control/master] Dispatcher: match_property: use tp_asv* API
Alban Crequy
alban.crequy at collabora.co.uk
Mon Nov 24 07:25:44 PST 2008
---
src/mcd-dispatcher.c | 249 ++++++++++++++++++-------------------------------
1 files changed, 92 insertions(+), 157 deletions(-)
diff --git a/src/mcd-dispatcher.c b/src/mcd-dispatcher.c
index 93e3400..9ca7b6c 100644
--- a/src/mcd-dispatcher.c
+++ b/src/mcd-dispatcher.c
@@ -223,8 +223,6 @@ static void mcd_dispatcher_leave_state_machine (McdDispatcherContext *context);
static void on_operation_finished (McdDispatchOperation *operation,
McdDispatcherContext *context);
-static gboolean channel_property_equals (GValue *value1, GValue *value2);
-
typedef void (*tp_ch_handle_channel_reply) (DBusGProxy *proxy, GError *error, gpointer userdata);
static inline void
@@ -888,20 +886,103 @@ match_property (GHashTable *channel_properties,
gchar *property_name,
GValue *filter_value)
{
- GValue *channel_value;
+ GType filter_type = G_VALUE_TYPE (filter_value);
+
+ g_assert (G_IS_VALUE (filter_value));
- channel_value = g_hash_table_lookup (channel_properties,
- property_name);
- if (channel_value == NULL)
+ if (filter_type == G_TYPE_STRING)
{
- /* the channel does not even have this property */
- return FALSE;
+ const gchar *string;
+
+ string = tp_asv_get_string (channel_properties, property_name);
+ if (!string)
+ return FALSE;
+
+ return !tp_strdiff (string, g_value_get_string (filter_value));
}
- g_assert (G_IS_VALUE (filter_value));
- g_assert (G_IS_VALUE (channel_value));
+ if (filter_type == DBUS_TYPE_G_OBJECT_PATH)
+ {
+ const gchar *path;
+
+ path = tp_asv_get_object_path (channel_properties, property_name);
+ if (!path)
+ return FALSE;
+
+ return !tp_strdiff (path, g_value_get_boxed (filter_value));
+ }
+
+ if (filter_type == G_TYPE_BOOLEAN)
+ {
+ gboolean valid;
+ gboolean b;
+
+ b = tp_asv_get_boolean (channel_properties, property_name, &valid);
+ if (!valid)
+ return FALSE;
+
+ return !!b == !!g_value_get_boolean (filter_value);
+ }
+
+ if (filter_type == G_TYPE_UCHAR || filter_type == G_TYPE_UINT ||
+ filter_type == G_TYPE_UINT64)
+ {
+ gboolean valid;
+ guint64 i;
+
+ i = tp_asv_get_uint64 (channel_properties, property_name, &valid);
+ if (!valid)
+ return FALSE;
+
+ if (filter_type == G_TYPE_UCHAR)
+ return i == g_value_get_uchar (filter_value);
+ else if (filter_type == G_TYPE_UINT)
+ return i == g_value_get_uint (filter_value);
+ else
+ return i == g_value_get_uint64 (filter_value);
+ }
+
+ if (filter_type == G_TYPE_INT || filter_type == G_TYPE_INT64)
+ {
+ gboolean valid;
+ gint64 i;
+
+ i = tp_asv_get_int64 (channel_properties, property_name, &valid);
+ if (!valid)
+ return FALSE;
- return channel_property_equals (filter_value, channel_value);
+ if (filter_type == G_TYPE_INT)
+ return i == g_value_get_int (filter_value);
+ else
+ return i == g_value_get_int64 (filter_value);
+ }
+
+ g_warning ("%s: Invalid type: %s",
+ G_STRFUNC, g_type_name (filter_type));
+ return FALSE;
+}
+
+/* return TRUE if the two channel classes are equals
+ */
+static gboolean
+channel_classes_equals (GHashTable *channel_class1, GHashTable *channel_class2)
+{
+ GHashTableIter iter;
+ gchar *property_name;
+ GValue *property_value;
+
+ if (g_hash_table_size (channel_class1) !=
+ g_hash_table_size (channel_class2))
+ return FALSE;
+
+ g_hash_table_iter_init (&iter, channel_class1);
+ while (g_hash_table_iter_next (&iter, (gpointer *) &property_name,
+ (gpointer *) &property_value))
+ {
+ if (!match_property (channel_class2, property_name, property_value))
+ return FALSE;
+ }
+ return TRUE;
}
/* returns TRUE if the channel matches one of the channel filters
@@ -2731,152 +2812,6 @@ 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 &&
- !tp_strdiff (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 &&
- !tp_strdiff (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_signed_integer (value1) ==
- get_signed_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;
-}
-
-/* return TRUE if the two channel classes are equals
- */
-static gboolean
-channel_classes_equals (GHashTable *channel_class1, GHashTable *channel_class2)
-{
- GHashTableIter iter;
- gchar *property_name;
- GValue *property_value1;
-
- if (g_hash_table_size (channel_class1) !=
- g_hash_table_size (channel_class2))
- return FALSE;
-
- g_hash_table_iter_init (&iter, channel_class1);
- while (g_hash_table_iter_next (&iter, (gpointer *) &property_name,
- (gpointer *) &property_value1))
- {
- GValue *property_value2;
- property_value2 = g_hash_table_lookup (channel_class2, property_name);
- if (property_value2 == NULL)
- return FALSE;
-
- if (!channel_property_equals (property_value1, property_value2))
- return FALSE;
- }
- return TRUE;
-}
-
GPtrArray *
mcd_dispatcher_get_channel_enhanced_capabilities (McdDispatcher * dispatcher)
{
--
1.5.6.5
More information about the Telepathy-commits
mailing list