[telepathy-gabble/master] Make search-state a read-only property.

Will Thompson will.thompson at collabora.co.uk
Wed Aug 26 09:21:54 PDT 2009


I think this works out cleaner.
---
 src/search-channel.c |  166 +++++++++++++++++++++++---------------------------
 1 files changed, 76 insertions(+), 90 deletions(-)

diff --git a/src/search-channel.c b/src/search-channel.c
index 2bd414b..70637d7 100644
--- a/src/search-channel.c
+++ b/src/search-channel.c
@@ -68,10 +68,6 @@ struct _GabbleSearchChannelPrivate
   gchar **available_search_keys;
   gchar *server;
 
-  /* An error in the TP_ERRORS domain if the search has failed; NULL otherwise.
-   */
-  GError *failure_reason;
-
   gboolean xforms;
 
   TpHandleSet *result_handles;
@@ -335,6 +331,75 @@ request_search_fields (GabbleSearchChannel *chan)
 
 /* Search implementation */
 
+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;
+}
+
+/**
+ * change_search_state:
+ * @chan: a search channel
+ * @state: the new state for the channel
+ * @reason: an error in the TP_ERRORS domain if the search has failed; NULL
+ *          otherwise.
+ */
+static void
+change_search_state (GabbleSearchChannel *chan,
+                     GabbleChannelContactSearchState state,
+                     const GError *reason)
+{
+  GabbleSearchChannelPrivate *priv = chan->priv;
+  GHashTable *details = g_hash_table_new (g_str_hash, g_str_equal);
+  gchar *error_name = NULL;
+  GValue v = { 0, };
+
+  switch (state)
+    {
+    case GABBLE_CHANNEL_CONTACT_SEARCH_STATE_NOT_STARTED:
+      g_assert_not_reached ();
+      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;
+    }
+
+  if (state == GABBLE_CHANNEL_CONTACT_SEARCH_STATE_FAILED)
+    {
+      g_assert (reason != NULL);
+      error_name = get_error_name (reason->code);
+
+      g_value_init (&v, G_TYPE_STRING);
+      g_value_set_static_string (&v, reason->message);
+      g_hash_table_insert (details, "debug-message", &v);
+    }
+  else
+    {
+      g_assert (reason == 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);
+}
+
 /**
  * make_field:
  * @field_name: name of a vCard field; must be a static string.
@@ -569,19 +634,16 @@ search_reply_cb (GabbleConnection *conn,
     {
       DEBUG ("Searching failed: %s", err->message);
 
-      g_assert (chan->priv->failure_reason == NULL);
-      chan->priv->failure_reason = err;
+      change_search_state (chan, GABBLE_CHANNEL_CONTACT_SEARCH_STATE_FAILED,
+          err);
 
-      g_object_set (chan,
-          "search-state", GABBLE_CHANNEL_CONTACT_SEARCH_STATE_FAILED,
-          NULL);
+      g_error_free (err);
     }
   else
     {
       parse_search_results (chan, query_node);
 
-      g_object_set (chan,
-          "search-state", GABBLE_CHANNEL_CONTACT_SEARCH_STATE_COMPLETED,
+      change_search_state (chan, GABBLE_CHANNEL_CONTACT_SEARCH_STATE_COMPLETED,
           NULL);
     }
 
@@ -672,9 +734,8 @@ do_search (GabbleSearchChannel *chan,
           search_reply_cb, (GObject *) chan, NULL, error))
     {
       ret = TRUE;
-      g_object_set (chan,
-          "search-state", GABBLE_CHANNEL_CONTACT_SEARCH_STATE_IN_PROGRESS,
-          NULL);
+      change_search_state (chan,
+          GABBLE_CHANNEL_CONTACT_SEARCH_STATE_IN_PROGRESS, NULL);
     }
   else
     {
@@ -749,9 +810,6 @@ gabble_search_channel_finalize (GObject *obj)
 
   tp_handle_set_destroy (priv->result_handles);
 
-  if (priv->failure_reason != NULL)
-    g_error_free (priv->failure_reason);
-
   if (G_OBJECT_CLASS (gabble_search_channel_parent_class)->finalize)
     G_OBJECT_CLASS (gabble_search_channel_parent_class)->finalize (obj);
 }
@@ -796,75 +854,6 @@ 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,
@@ -875,9 +864,6 @@ gabble_search_channel_set_property (GObject *object,
 
   switch (property_id)
     {
-      case PROP_SEARCH_STATE:
-        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);
@@ -916,7 +902,7 @@ gabble_search_channel_class_init (GabbleSearchChannelClass *klass)
       GABBLE_CHANNEL_CONTACT_SEARCH_STATE_NOT_STARTED,
       GABBLE_CHANNEL_CONTACT_SEARCH_STATE_FAILED,
       GABBLE_CHANNEL_CONTACT_SEARCH_STATE_NOT_STARTED,
-      G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS);
+      G_PARAM_READABLE | G_PARAM_STATIC_STRINGS);
   g_object_class_install_property (object_class, PROP_SEARCH_STATE,
       param_spec);
 
-- 
1.5.6.5




More information about the telepathy-commits mailing list