[telepathy-gabble/master] Include failure reason in SearchStateChanged
Will Thompson
will.thompson at collabora.co.uk
Wed Aug 26 09:21:54 PDT 2009
---
src/search-channel.c | 92 ++++++++++++++++++++++++++++++++++++++-----------
1 files changed, 71 insertions(+), 21 deletions(-)
diff --git a/src/search-channel.c b/src/search-channel.c
index 55de724..2bd414b 100644
--- a/src/search-channel.c
+++ b/src/search-channel.c
@@ -796,6 +796,75 @@ gabble_search_channel_get_property (GObject *object,
}
}
+static gchar *
+get_error_name (TpError e)
+{
+ gpointer tp_error_tc = g_type_class_ref (TP_TYPE_ERROR);
+ GEnumClass *tp_error_ec = G_ENUM_CLASS (tp_error_tc);
+ GEnumValue *e_value = g_enum_get_value (tp_error_ec, e);
+ const gchar *error_suffix = e_value->value_nick;
+ gchar *error_name = g_strdup_printf ("%s.%s", TP_ERROR_PREFIX, error_suffix);
+
+ g_type_class_unref (tp_error_tc);
+ return error_name;
+}
+
+static void
+set_search_state (GabbleSearchChannel *chan,
+ GabbleChannelContactSearchState state)
+{
+ GabbleSearchChannelPrivate *priv = chan->priv;
+ GHashTable *details;
+ GError *error = priv->failure_reason;
+ gchar *error_name = NULL;
+ GValue v = { 0, };
+
+ switch (state)
+ {
+ case GABBLE_CHANNEL_CONTACT_SEARCH_STATE_NOT_STARTED:
+ g_assert (priv->state == state);
+ return;
+ case GABBLE_CHANNEL_CONTACT_SEARCH_STATE_IN_PROGRESS:
+ g_assert (priv->state ==
+ GABBLE_CHANNEL_CONTACT_SEARCH_STATE_NOT_STARTED);
+ break;
+ case GABBLE_CHANNEL_CONTACT_SEARCH_STATE_COMPLETED:
+ case GABBLE_CHANNEL_CONTACT_SEARCH_STATE_FAILED:
+ g_assert (priv->state ==
+ GABBLE_CHANNEL_CONTACT_SEARCH_STATE_IN_PROGRESS);
+ break;
+ default:
+ g_assert_not_reached ();
+ }
+
+ details = g_hash_table_new (g_str_hash, g_str_equal);
+
+ if (state == GABBLE_CHANNEL_CONTACT_SEARCH_STATE_FAILED)
+ {
+ g_assert (error != NULL);
+
+ error_name = get_error_name (error->code);
+
+ g_value_init (&v, G_TYPE_STRING);
+ g_value_set_static_string (&v, error->message);
+ g_hash_table_insert (details, "debug-message", &v);
+ }
+ else
+ {
+ g_assert (error == NULL);
+ }
+
+ DEBUG ("moving from %s to %s for reason '%s'", states[priv->state],
+ states[state], error_name == NULL ? "" : error_name);
+ priv->state = state;
+
+ gabble_svc_channel_type_contact_search_emit_search_state_changed (
+ chan, state, (error_name == NULL ? "" : error_name), details);
+
+ g_free (error_name);
+ g_hash_table_unref (details);
+}
+
static void
gabble_search_channel_set_property (GObject *object,
guint property_id,
@@ -803,31 +872,12 @@ gabble_search_channel_set_property (GObject *object,
GParamSpec *pspec)
{
GabbleSearchChannel *chan = GABBLE_SEARCH_CHANNEL (object);
- GabbleSearchChannelPrivate *priv = chan->priv;
switch (property_id)
{
case PROP_SEARCH_STATE:
- {
- GabbleChannelContactSearchState state = g_value_get_uint (value);
- GHashTable *details;
-
- g_return_if_fail (state < NUM_GABBLE_CHANNEL_CONTACT_SEARCH_STATES);
- /* The search state can only go forward because it can't find
- * reverse
- */
- g_return_if_fail (state > priv->state);
-
- DEBUG ("moving from %s to %s", states[priv->state], states[state]);
- priv->state = state;
-
- details = g_hash_table_new_full (g_str_hash, g_str_equal, NULL,
- (GDestroyNotify) tp_g_value_slice_free);
- gabble_svc_channel_type_contact_search_emit_search_state_changed (
- chan, state, "", details);
- g_hash_table_unref (details);
- break;
- }
+ set_search_state (chan, g_value_get_uint (value));
+ break;
case PROP_SERVER:
chan->priv->server = g_value_dup_string (value);
g_assert (chan->priv->server != NULL);
--
1.5.6.5
More information about the telepathy-commits
mailing list