}
static gboolean
-flush_buffered_messages_to_list_store (GtkTreeModel *pause_buffer,
+copy_buffered_messages (GtkTreeModel *buffer,
GtkTreePath *path,
GtkTreeIter *iter,
gpointer data)
gchar *domain, *category, *message, *level_string;
guint level;
- gtk_tree_model_get (pause_buffer, iter,
+ gtk_tree_model_get (buffer, iter,
COL_DEBUG_TIMESTAMP, ×tamp,
COL_DEBUG_DOMAIN, &domain,
COL_DEBUG_CATEGORY, &category,
COL_DEBUG_MESSAGE, &message,
COL_DEBUG_LEVEL_VALUE, &level,
-1);
- gtk_list_store_append (active_buffer, &active_buffer_iter);
- gtk_list_store_set (active_buffer, &active_buffer_iter,
+ gtk_list_store_insert_with_values (active_buffer, &active_buffer_iter, -1,
COL_DEBUG_TIMESTAMP, timestamp,
COL_DEBUG_DOMAIN, domain,
COL_DEBUG_CATEGORY, category,
return FALSE;
}
+static void
+insert_values_in_buffer (GtkListStore *store,
+ gdouble timestamp,
+ const gchar *domain,
+ const gchar *category,
+ guint level,
+ const gchar *string)
+{
+ GtkTreeIter iter;
+
+ gtk_list_store_insert_with_values (store, &iter, -1,
+ COL_DEBUG_TIMESTAMP, timestamp,
+ COL_DEBUG_DOMAIN, domain,
+ COL_DEBUG_CATEGORY, category,
+ COL_DEBUG_LEVEL_STRING, log_level_to_string (level),
+ COL_DEBUG_MESSAGE, string,
+ COL_DEBUG_LEVEL_VALUE, level,
+ -1);
+}
+
static void
debug_window_add_message (EmpathyDebugWindow *debug_window,
TpProxy *proxy,
{
EmpathyDebugWindowPriv *priv = GET_PRIV (debug_window);
gchar *domain, *category;
- GtkTreeIter iter;
gchar *string;
GtkListStore *active_buffer, *pause_buffer;
pause_buffer = g_object_get_data (G_OBJECT (proxy), "pause-buffer");
active_buffer = g_object_get_data (G_OBJECT (proxy), "active-buffer");
- gtk_list_store_append (priv->paused ? pause_buffer : active_buffer,
- &iter);
- gtk_list_store_set (priv->paused ? pause_buffer : active_buffer, &iter,
- COL_DEBUG_TIMESTAMP, timestamp,
- COL_DEBUG_DOMAIN, domain,
- COL_DEBUG_CATEGORY, category,
- COL_DEBUG_LEVEL_STRING, log_level_to_string (level),
- COL_DEBUG_MESSAGE, string,
- COL_DEBUG_LEVEL_VALUE, level,
- -1);
+ if (priv->paused)
+ {
+ insert_values_in_buffer (pause_buffer, timestamp,
+ domain, category, level,
+ string);
+ }
+ else
+ {
+ /* Append 'this' message to this service's and All's active-buffers */
+ insert_values_in_buffer (active_buffer, timestamp,
+ domain, category, level,
+ string);
+
+ insert_values_in_buffer (priv->all_active_buffer, timestamp,
+ domain, category, level,
+ string);
+ }
g_free (string);
g_free (domain);
return valid_iter;
}
+static void refresh_all_buffer (EmpathyDebugWindow *debug_window);
+
static void
proxy_invalidated_cb (TpProxy *proxy,
guint domain,
gchar *msg,
gpointer user_data)
{
- /* Proxy has been invalidated so we destroy it */
- tp_clear_object (&proxy);
+ EmpathyDebugWindow *self = (EmpathyDebugWindow *) user_data;
+ EmpathyDebugWindowPriv *priv = GET_PRIV (self);
+ GtkTreeModel *service_store = GTK_TREE_MODEL (priv->service_store);
+ TpProxy *stored_proxy;
+ GtkTreeIter iter;
+ gboolean valid_iter;
+
+ /* Proxy has been invalidated so we find and set it to NULL
+ * in service store */
+ gtk_tree_model_get_iter_first (service_store, &iter);
+ for (valid_iter = gtk_tree_model_iter_next (service_store, &iter);
+ valid_iter;
+ valid_iter = gtk_tree_model_iter_next (service_store, &iter))
+ {
+ gtk_tree_model_get (service_store, &iter,
+ COL_PROXY, &stored_proxy,
+ -1);
+
+ if (proxy == stored_proxy)
+ gtk_list_store_set (priv->service_store, &iter,
+ COL_PROXY, NULL,
+ -1);
+ }
+
+ /* Also, we refresh "All" selection's active buffer since it should not
+ * show messages obtained from the proxy getting destroyed above */
+ refresh_all_buffer (self);
}
static void
{
EmpathyDebugWindow *debug_window = (EmpathyDebugWindow *) user_data;
EmpathyDebugWindowPriv *priv = GET_PRIV (debug_window);
- gchar *name;
+ gchar *active_service_name;
guint i;
GtkListStore *active_buffer;
gboolean valid_iter;
GtkTreeIter iter;
+ gchar *proxy_service_name;
active_buffer = g_object_get_data (G_OBJECT (proxy), "active-buffer");
valid_iter = debug_window_get_iter_for_active_buffer (active_buffer, &iter,
debug_window);
+ gtk_tree_model_get (GTK_TREE_MODEL (priv->service_store), &iter,
+ COL_NAME, &proxy_service_name,
+ -1);
+ active_service_name = get_active_service_name (debug_window);
if (error != NULL)
{
DEBUG ("GetMessages failed: %s", error->message);
- debug_window_set_toolbar_sensitivity (debug_window, FALSE);
+
+ /* We want to set the window sensitivity to false only when proxy for the
+ * selected service is unable to fetch debug messages */
+ if (!tp_strdiff (active_service_name, proxy_service_name))
+ debug_window_set_toolbar_sensitivity (debug_window, FALSE);
/* We created the proxy for GetMessages call. Now destroy it. */
tp_clear_object (&proxy);
return;
}
- name = get_active_service_name (debug_window);
- DEBUG ("Retrieved debug messages for %s", name);
- g_free (name);
+ DEBUG ("Retrieved debug messages for %s", active_service_name);
+ g_free (active_service_name);
+ debug_window_set_toolbar_sensitivity (debug_window, TRUE);
+
for (i = 0; i < messages->len; i++)
{
/* Now we save this precious proxy in the service_store along its service */
if (valid_iter)
{
- gchar *proxy_service_name;
-
- gtk_tree_model_get (GTK_TREE_MODEL (priv->service_store), &iter,
- COL_NAME, &proxy_service_name,
- -1);
-
DEBUG ("Proxy for service: %s was successful in fetching debug"
" messages. Saving it.", proxy_service_name);
- g_free (proxy_service_name);
gtk_list_store_set (priv->service_store, &iter,
COL_PROXY, proxy,
-1);
}
+ g_free (proxy_service_name);
+
/* Connect to "invalidated" signal */
g_signal_connect (proxy, "invalidated",
- G_CALLBACK (proxy_invalidated_cb), NULL);
+ G_CALLBACK (proxy_invalidated_cb), debug_window);
/* Connect to NewDebugMessage */
emp_cli_debug_connect_to_new_debug_message (
g_object_unref (pause_buffer);
}
+static GtkListStore*
+new_list_store_for_service (void)
+{
+ return gtk_list_store_new (NUM_DEBUG_COLS,
+ G_TYPE_DOUBLE, /* COL_DEBUG_TIMESTAMP */
+ G_TYPE_STRING, /* COL_DEBUG_DOMAIN */
+ G_TYPE_STRING, /* COL_DEBUG_CATEGORY */
+ G_TYPE_STRING, /* COL_DEBUG_LEVEL_STRING */
+ G_TYPE_STRING, /* COL_DEBUG_MESSAGE */
+ G_TYPE_UINT); /* COL_DEBUG_LEVEL_VALUE */
+}
+
static gboolean
debug_window_visible_func (GtkTreeModel *model,
GtkTreeIter *iter,
return ret;
}
+static void
+update_store_filter (EmpathyDebugWindow *debug_window,
+ GtkListStore *active_buffer)
+{
+ EmpathyDebugWindowPriv *priv = GET_PRIV (debug_window);
+ debug_window_set_toolbar_sensitivity (debug_window, FALSE);
+
+ tp_clear_object (&priv->store_filter);
+ priv->store_filter = gtk_tree_model_filter_new (
+ GTK_TREE_MODEL (active_buffer), NULL);
+
+ gtk_tree_model_filter_set_visible_func (
+ GTK_TREE_MODEL_FILTER (priv->store_filter),
+ debug_window_visible_func, debug_window, NULL);
+ gtk_tree_view_set_model (GTK_TREE_VIEW (priv->view),
+ priv->store_filter);
+
+ /* Since view's model has changed, reset the search column and
+ * search_equal_func */
+ gtk_tree_view_set_search_column (GTK_TREE_VIEW (priv->view),
+ COL_DEBUG_MESSAGE);
+ gtk_tree_view_set_search_equal_func (GTK_TREE_VIEW (priv->view),
+ tree_view_search_equal_func_cb, NULL, NULL);
+
+ debug_window_set_toolbar_sensitivity (debug_window, TRUE);
+}
+
+static void
+refresh_all_buffer (EmpathyDebugWindow *debug_window)
+{
+ EmpathyDebugWindowPriv *priv = GET_PRIV (debug_window);
+ gboolean valid_iter;
+ GtkTreeIter iter;
+ GtkTreeModel *service_store = GTK_TREE_MODEL (priv->service_store);
+
+ /* Clear All's active-buffer */
+ gtk_list_store_clear (priv->all_active_buffer);
+
+ /* Skipping the first service store iter which is reserved for "All" */
+ gtk_tree_model_get_iter_first (service_store, &iter);
+ for (valid_iter = gtk_tree_model_iter_next (service_store, &iter);
+ valid_iter;
+ valid_iter = gtk_tree_model_iter_next (service_store, &iter))
+ {
+ TpProxy *proxy = NULL;
+ GtkListStore *service_active_buffer;
+ gboolean gone;
+
+ gtk_tree_model_get (service_store, &iter,
+ COL_GONE, &gone,
+ COL_PROXY, &proxy,
+ COL_ACTIVE_BUFFER, &service_active_buffer,
+ -1);
+
+ if (gone)
+ {
+ gtk_tree_model_foreach (GTK_TREE_MODEL (service_active_buffer),
+ copy_buffered_messages, priv->all_active_buffer);
+ }
+ else
+ {
+ if (proxy != NULL)
+ {
+ if (service_active_buffer == NULL)
+ break;
+
+ /* Copy the debug messages to all_active_buffer */
+ gtk_tree_model_foreach (GTK_TREE_MODEL (service_active_buffer),
+ copy_buffered_messages, priv->all_active_buffer);
+ }
+ else
+ {
+ GError *error = NULL;
+ TpDBusDaemon *dbus = tp_dbus_daemon_dup (&error);
+
+ if (error != NULL)
+ {
+ DEBUG ("Failed at duping the dbus daemon: %s", error->message);
+ g_error_free (error);
+ }
+
+ create_proxy_to_get_messages (debug_window, &iter, dbus);
+
+ g_object_unref (dbus);
+ }
+ }
+
+ g_object_unref (service_active_buffer);
+ tp_clear_object (&proxy);
+ }
+}
+
static void
debug_window_service_chooser_changed_cb (GtkComboBox *chooser,
EmpathyDebugWindow *debug_window)
DEBUG ("Service chosen: %s", name);
- if (stored_active_buffer == NULL)
+ if (tp_strdiff (name, "All") && stored_active_buffer == NULL)
{
DEBUG ("No list store assigned to service %s", name);
goto finally;
}
- tp_clear_object (&priv->store_filter);
- priv->store_filter = gtk_tree_model_filter_new (
- GTK_TREE_MODEL (stored_active_buffer), NULL);
-
- gtk_tree_model_filter_set_visible_func (
- GTK_TREE_MODEL_FILTER (priv->store_filter),
- debug_window_visible_func, debug_window, NULL);
-
- gtk_tree_view_set_model (GTK_TREE_VIEW (priv->view), priv->store_filter);
+ if (!tp_strdiff (name, "All"))
+ {
+ update_store_filter (debug_window, priv->all_active_buffer);
+ goto finally;
+ }
- /* Since view's model has changed, reset the search column and
- * search_equal_func */
- gtk_tree_view_set_search_column (GTK_TREE_VIEW (priv->view),
- COL_DEBUG_MESSAGE);
- gtk_tree_view_set_search_equal_func (GTK_TREE_VIEW (priv->view),
- tree_view_search_equal_func_cb, NULL, NULL);
+ update_store_filter (debug_window, stored_active_buffer);
dbus = tp_dbus_daemon_dup (&error);
g_slice_free (FillServiceChooserData, data);
}
-static GtkListStore*
-new_list_store_for_service (void)
-{
- return gtk_list_store_new (NUM_DEBUG_COLS,
- G_TYPE_DOUBLE, /* COL_DEBUG_TIMESTAMP */
- G_TYPE_STRING, /* COL_DEBUG_DOMAIN */
- G_TYPE_STRING, /* COL_DEBUG_CATEGORY */
- G_TYPE_STRING, /* COL_DEBUG_LEVEL_STRING */
- G_TYPE_STRING, /* COL_DEBUG_MESSAGE */
- G_TYPE_UINT); /* COL_DEBUG_LEVEL_VALUE */
-}
-
static void
debug_window_get_name_owner_cb (TpDBusDaemon *proxy,
const gchar *out,
active_buffer = new_list_store_for_service ();
pause_buffer = new_list_store_for_service ();
- gtk_list_store_append (priv->service_store, &iter);
- gtk_list_store_set (priv->service_store, &iter,
+ gtk_list_store_insert_with_values (priv->service_store, &iter, -1,
COL_NAME, name,
COL_UNIQUE_NAME, out,
COL_GONE, FALSE,
if (priv->services_detected == priv->name_owner_cb_count)
{
/* Time to add "All" selection to service_store */
- gtk_list_store_prepend (priv->service_store, &iter);
- gtk_list_store_set (priv->service_store, &iter,
+ gtk_list_store_insert_with_values (priv->service_store, &iter, 0,
COL_NAME, "All",
COL_ACTIVE_BUFFER, NULL,
-1);
priv->all_active_buffer = new_list_store_for_service ();
+ /* Populate active buffers for all services */
+ refresh_all_buffer (self);
+
gtk_combo_box_set_active (GTK_COMBO_BOX (priv->chooser), 0);
}
active_buffer = new_list_store_for_service ();
pause_buffer = new_list_store_for_service ();
- gtk_list_store_append (priv->service_store, &iter);
- gtk_list_store_set (priv->service_store, &iter,
+ gtk_list_store_insert_with_values (priv->service_store, &iter, -1,
COL_NAME, display_name,
COL_UNIQUE_NAME, arg2,
COL_GONE, FALSE,
(GTK_COMBO_BOX (priv->chooser), user_data);
}
+ /* If a new service arrives when "All" is selected, the view will
+ * not show its messages which we do not want. So we refresh All's
+ * active buffer.
+ * Similarly for when a service with an already seen service name
+ * appears. */
+ refresh_all_buffer (self);
+
g_free (display_name);
}
else if (!EMP_STR_EMPTY (arg1) && EMP_STR_EMPTY (arg2))
iter, COL_GONE, TRUE, -1);
gtk_tree_iter_free (iter);
}
+
+ /* Refresh all's active buffer */
+ refresh_all_buffer (self);
}
}
active_buffer= new_list_store_for_service ();
pause_buffer = new_list_store_for_service ();
- gtk_list_store_append (priv->service_store, &iter);
- gtk_list_store_set (priv->service_store, &iter,
+ gtk_list_store_insert_with_values (priv->service_store, &iter, -1,
COL_NAME, "mission-control",
COL_UNIQUE_NAME, "org.freedesktop.Telepathy.MissionControl5",
COL_GONE, FALSE,
if (!priv->paused)
{
/* Pause has been released - flush all pause buffers */
+ GtkTreeModel *service_store = GTK_TREE_MODEL (priv->service_store);
- for (valid_iter = gtk_tree_model_get_iter_first (model, &iter);
+ /* Skipping the first iter which is reserved for "All" */
+ gtk_tree_model_get_iter_first (model, &iter);
+ for (valid_iter = gtk_tree_model_iter_next (model, &iter);
valid_iter;
valid_iter = gtk_tree_model_iter_next (model, &iter))
{
- GtkTreeModel *service_store = GTK_TREE_MODEL (priv->service_store);
GtkListStore *pause_buffer, *active_buffer;
gtk_tree_model_get (service_store, &iter,
-1);
gtk_tree_model_foreach (GTK_TREE_MODEL (pause_buffer),
- flush_buffered_messages_to_list_store, active_buffer);
+ copy_buffered_messages, active_buffer);
+ gtk_tree_model_foreach (GTK_TREE_MODEL (pause_buffer),
+ copy_buffered_messages, priv->all_active_buffer);
+
gtk_list_store_clear (pause_buffer);
g_object_unref (active_buffer);
g_object_unref (pause_buffer);
- }
+ }
}
}
gtk_combo_box_set_model (GTK_COMBO_BOX (priv->level_filter),
GTK_TREE_MODEL (level_store));
- gtk_list_store_append (level_store, &iter);
- gtk_list_store_set (level_store, &iter,
+ gtk_list_store_insert_with_values (level_store, &iter, -1,
COL_LEVEL_NAME, _("Debug"),
COL_LEVEL_VALUE, TP_DEBUG_LEVEL_DEBUG,
-1);
- gtk_list_store_append (level_store, &iter);
- gtk_list_store_set (level_store, &iter,
+ gtk_list_store_insert_with_values (level_store, &iter, -1,
COL_LEVEL_NAME, _("Info"),
COL_LEVEL_VALUE, TP_DEBUG_LEVEL_INFO,
-1);
- gtk_list_store_append (level_store, &iter);
- gtk_list_store_set (level_store, &iter,
+ gtk_list_store_insert_with_values (level_store, &iter, -1,
COL_LEVEL_NAME, _("Message"),
COL_LEVEL_VALUE, TP_DEBUG_LEVEL_MESSAGE,
-1);
- gtk_list_store_append (level_store, &iter);
- gtk_list_store_set (level_store, &iter,
+ gtk_list_store_insert_with_values (level_store, &iter, -1,
COL_LEVEL_NAME, _("Warning"),
COL_LEVEL_VALUE, TP_DEBUG_LEVEL_WARNING,
-1);
- gtk_list_store_append (level_store, &iter);
- gtk_list_store_set (level_store, &iter,
+ gtk_list_store_insert_with_values (level_store, &iter, -1,
COL_LEVEL_NAME, _("Critical"),
COL_LEVEL_VALUE, TP_DEBUG_LEVEL_CRITICAL,
-1);
- gtk_list_store_append (level_store, &iter);
- gtk_list_store_set (level_store, &iter,
+ gtk_list_store_insert_with_values (level_store, &iter, -1,
COL_LEVEL_NAME, _("Error"),
COL_LEVEL_VALUE, TP_DEBUG_LEVEL_ERROR,
-1);