X-Git-Url: https://git.0d.be/?p=empathy.git;a=blobdiff_plain;f=src%2Fempathy-debug-window.c;h=e4f5e21d646b2f00b41abb7289445604267d299d;hp=677a9ed2680777f684049601ceb2f787dcebb3ea;hb=d121d6a9b9d4d3a654dfd2b0e900be216f161dba;hpb=60e7f9f68bbcb287e8df3aac35a0ee5b5cf01b94 diff --git a/src/empathy-debug-window.c b/src/empathy-debug-window.c index 677a9ed2..e4f5e21d 100644 --- a/src/empathy-debug-window.c +++ b/src/empathy-debug-window.c @@ -20,32 +20,18 @@ */ #include "config.h" - -#include +#include "empathy-debug-window.h" #include -#include -#include -#include #include +#include -#define DEBUG_FLAG EMPATHY_DEBUG_OTHER -#include -#include - -#include -#include -#include - -#include -#include -#include -#include -#include - -#include "extensions/extensions.h" +#include "empathy-geometry.h" +#include "empathy-ui-utils.h" +#include "empathy-utils.h" -#include "empathy-debug-window.h" +#define DEBUG_FLAG EMPATHY_DEBUG_OTHER +#include "empathy-debug.h" G_DEFINE_TYPE (EmpathyDebugWindow, empathy_debug_window, GTK_TYPE_WINDOW) @@ -58,12 +44,7 @@ typedef enum enum { - COL_DEBUG_TIMESTAMP = 0, - COL_DEBUG_DOMAIN, - COL_DEBUG_CATEGORY, - COL_DEBUG_LEVEL_STRING, - COL_DEBUG_MESSAGE, - COL_DEBUG_LEVEL_VALUE, + COL_DEBUG_MESSAGE = 0, NUM_DEBUG_COLS }; @@ -181,52 +162,28 @@ copy_buffered_messages (GtkTreeModel *buffer, { GtkListStore *active_buffer = data; GtkTreeIter active_buffer_iter; - gdouble timestamp; - gchar *domain, *category, *message, *level_string; - guint level; + TpDebugMessage *msg; gtk_tree_model_get (buffer, iter, - COL_DEBUG_TIMESTAMP, ×tamp, - COL_DEBUG_DOMAIN, &domain, - COL_DEBUG_CATEGORY, &category, - COL_DEBUG_LEVEL_STRING, &level_string, - COL_DEBUG_MESSAGE, &message, - COL_DEBUG_LEVEL_VALUE, &level, + COL_DEBUG_MESSAGE, &msg, -1); gtk_list_store_insert_with_values (active_buffer, &active_buffer_iter, -1, - COL_DEBUG_TIMESTAMP, timestamp, - COL_DEBUG_DOMAIN, domain, - COL_DEBUG_CATEGORY, category, - COL_DEBUG_LEVEL_STRING, level_string, - COL_DEBUG_MESSAGE, message, - COL_DEBUG_LEVEL_VALUE, level, + COL_DEBUG_MESSAGE, msg, -1); - g_free (domain); - g_free (category); - g_free (level_string); - g_free (message); + g_object_unref (msg); return FALSE; } static void insert_values_in_buffer (GtkListStore *store, - gdouble timestamp, - const gchar *domain, - const gchar *category, - GLogLevelFlags level, - const gchar *string) + TpDebugMessage *msg) { 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, + COL_DEBUG_MESSAGE, msg, -1); } @@ -235,64 +192,22 @@ debug_window_add_message (EmpathyDebugWindow *self, TpDebugClient *debug, TpDebugMessage *msg) { - gchar *domain, *category; - gchar *string; GtkListStore *active_buffer, *pause_buffer; - gdouble timestamp; - const gchar *domain_category, *message; - GLogLevelFlags level; - GDateTime *t; - - t = tp_debug_message_get_time (msg); - /* FIME: we loose the microseconds */ - timestamp = (gdouble) g_date_time_to_unix (t); - - domain_category = tp_debug_message_get_domain (msg); - level = tp_debug_message_get_level (msg); - message = tp_debug_message_get_message (msg); - - if (g_strrstr (domain_category, "/")) - { - gchar **parts = g_strsplit (domain_category, "/", 2); - domain = g_strdup (parts[0]); - category = g_strdup (parts[1]); - g_strfreev (parts); - } - else - { - domain = g_strdup (domain_category); - category = g_strdup (""); - } - - if (g_str_has_suffix (message, "\n")) - string = g_strchomp (g_strdup (message)); - else - string = g_strdup (message); pause_buffer = g_object_get_data (G_OBJECT (debug), "pause-buffer"); active_buffer = g_object_get_data (G_OBJECT (debug), "active-buffer"); if (self->priv->paused) { - insert_values_in_buffer (pause_buffer, timestamp, - domain, category, level, - string); + insert_values_in_buffer (pause_buffer, msg); } 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 (active_buffer, msg); - insert_values_in_buffer (self->priv->all_active_buffer, timestamp, - domain, category, level, - string); + insert_values_in_buffer (self->priv->all_active_buffer, msg); } - - g_free (string); - g_free (domain); - g_free (category); } static void @@ -461,7 +376,7 @@ debug_window_get_messages_cb (GObject *object, messages = tp_debug_client_get_messages_finish (debug, result, &error); if (messages == NULL) { - DEBUG ("Failed to get debug messsages: %s", error->message); + DEBUG ("Failed to get debug messages: %s", error->message); g_error_free (error); /* We want to set the window sensitivity to false only when proxy for the @@ -495,6 +410,7 @@ debug_window_get_messages_cb (GObject *object, COL_PROXY, debug, -1); } + g_ptr_array_unref (messages); g_free (proxy_service_name); @@ -585,12 +501,7 @@ 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 */ + TP_TYPE_DEBUG_MESSAGE); /* COL_DEBUG_MESSAGE */ } static gboolean @@ -599,23 +510,25 @@ debug_window_visible_func (GtkTreeModel *model, gpointer user_data) { EmpathyDebugWindow *self = user_data; - guint filter_value, level; + GLogLevelFlags filter_value; GtkTreeModel *filter_model; GtkTreeIter filter_iter; + TpDebugMessage *msg; + gboolean result; filter_model = gtk_combo_box_get_model ( GTK_COMBO_BOX (self->priv->level_filter)); gtk_combo_box_get_active_iter (GTK_COMBO_BOX (self->priv->level_filter), &filter_iter); - gtk_tree_model_get (model, iter, COL_DEBUG_LEVEL_VALUE, &level, -1); + gtk_tree_model_get (model, iter, COL_DEBUG_MESSAGE, &msg, -1); gtk_tree_model_get (filter_model, &filter_iter, COL_LEVEL_VALUE, &filter_value, -1); - if (level <= filter_value) - return TRUE; + result = (tp_debug_message_get_level (msg) <= filter_value); + g_object_unref (msg); - return FALSE; + return result; } static gboolean @@ -869,21 +782,21 @@ get_cm_display_name (EmpathyDebugWindow *self, GList *accounts, *ptr; char *retval; - accounts = tp_account_manager_get_valid_accounts (self->priv->am); + accounts = tp_account_manager_dup_valid_accounts (self->priv->am); for (ptr = accounts; ptr != NULL; ptr = ptr->next) { TpAccount *account = TP_ACCOUNT (ptr->data); - if (!tp_strdiff (tp_account_get_connection_manager (account), cm_name)) + if (!tp_strdiff (tp_account_get_cm_name (account), cm_name)) { g_hash_table_insert (protocols, - (char *) tp_account_get_protocol (account), + (char *) tp_account_get_protocol_name (account), GUINT_TO_POINTER (TRUE)); } } - g_list_free (accounts); + g_list_free_full (accounts, g_object_unref); if (g_hash_table_size (protocols) > 0) { @@ -1093,7 +1006,7 @@ debug_window_name_owner_changed_cb (TpDBusDaemon *proxy, return; } - if (EMP_STR_EMPTY (arg1) && !EMP_STR_EMPTY (arg2)) + if (TPAW_STR_EMPTY (arg1) && !TPAW_STR_EMPTY (arg2)) { GtkTreeIter *found_at_iter = NULL; gchar *display_name; @@ -1173,7 +1086,7 @@ debug_window_name_owner_changed_cb (TpDBusDaemon *proxy, g_free (display_name); } - else if (!EMP_STR_EMPTY (arg1) && EMP_STR_EMPTY (arg2)) + else if (!TPAW_STR_EMPTY (arg1) && TPAW_STR_EMPTY (arg2)) { /* A service died */ GtkTreeIter *iter = NULL; @@ -1364,7 +1277,8 @@ debug_window_menu_copy_activate_cb (GtkMenuItem *menu_item, GtkTreePath *path; GtkTreeViewColumn *focus_column; GtkTreeIter iter; - gchar *message; + TpDebugMessage *msg; + const gchar *message; GtkClipboard *clipboard; gtk_tree_view_get_cursor (GTK_TREE_VIEW (self->priv->view), @@ -1379,10 +1293,12 @@ debug_window_menu_copy_activate_cb (GtkMenuItem *menu_item, gtk_tree_model_get_iter (self->priv->store_filter, &iter, path); gtk_tree_model_get (self->priv->store_filter, &iter, - COL_DEBUG_MESSAGE, &message, + COL_DEBUG_MESSAGE, &msg, -1); - if (EMP_STR_EMPTY (message)) + message = tp_debug_message_get_message (msg); + + if (TPAW_STR_EMPTY (message)) { DEBUG ("Log message is empty"); return; @@ -1394,7 +1310,7 @@ debug_window_menu_copy_activate_cb (GtkMenuItem *menu_item, gtk_clipboard_set_text (clipboard, message, -1); - g_free (message); + g_object_unref (msg); } typedef struct @@ -1452,25 +1368,20 @@ debug_window_button_press_event_cb (GtkTreeView *view, } static gchar * -debug_window_format_timestamp (gdouble timestamp) +debug_window_format_timestamp (TpDebugMessage *msg) { - struct tm *tstruct; - char time_str[32]; + GDateTime *t; + gchar *time_str, *text; gint ms; - time_t sec; - gchar *text; - ms = (int) ((timestamp - (int) timestamp)*1e6); - sec = (long) timestamp; - tstruct = localtime ((time_t *) &sec); - if (!strftime (time_str, sizeof (time_str), "%x %T", tstruct)) - { - DEBUG ("Failed to format timestamp: %e", timestamp); - time_str[0] = '\0'; - } + t = tp_debug_message_get_time (msg); + + time_str = g_date_time_format (t, "%x %T"); + ms = g_date_time_get_microsecond (t); text = g_strdup_printf ("%s.%d", time_str, ms); + g_free (time_str); return text; } @@ -1481,16 +1392,88 @@ debug_window_time_formatter (GtkTreeViewColumn *tree_column, GtkTreeIter *iter, gpointer data) { - gdouble timestamp; + TpDebugMessage *msg; gchar *time_str; - gtk_tree_model_get (tree_model, iter, COL_DEBUG_TIMESTAMP, ×tamp, -1); + gtk_tree_model_get (tree_model, iter, COL_DEBUG_MESSAGE, &msg, -1); - time_str = debug_window_format_timestamp (timestamp); + time_str = debug_window_format_timestamp (msg); g_object_set (G_OBJECT (cell), "text", time_str, NULL); - g_free (time_str); + g_object_unref (msg); +} + +static void +debug_window_domain_formatter (GtkTreeViewColumn *tree_column, + GtkCellRenderer *cell, + GtkTreeModel *tree_model, + GtkTreeIter *iter, + gpointer data) +{ + TpDebugMessage *msg; + + gtk_tree_model_get (tree_model, iter, COL_DEBUG_MESSAGE, &msg, -1); + + g_object_set (G_OBJECT (cell), "text", tp_debug_message_get_domain (msg), + NULL); + + g_object_unref (msg); +} + +static void +debug_window_category_formatter (GtkTreeViewColumn *tree_column, + GtkCellRenderer *cell, + GtkTreeModel *tree_model, + GtkTreeIter *iter, + gpointer data) +{ + TpDebugMessage *msg; + const gchar *category; + + gtk_tree_model_get (tree_model, iter, COL_DEBUG_MESSAGE, &msg, -1); + + category = tp_debug_message_get_category (msg); + + g_object_set (G_OBJECT (cell), "text", category ? category : "", NULL); + + g_object_unref (msg); +} + +static void +debug_window_message_formatter (GtkTreeViewColumn *tree_column, + GtkCellRenderer *cell, + GtkTreeModel *tree_model, + GtkTreeIter *iter, + gpointer data) +{ + TpDebugMessage *msg; + + gtk_tree_model_get (tree_model, iter, COL_DEBUG_MESSAGE, &msg, -1); + + g_object_set (G_OBJECT (cell), "text", + tp_debug_message_get_message (msg), NULL); + + g_object_unref (msg); +} + +static void +debug_window_level_formatter (GtkTreeViewColumn *tree_column, + GtkCellRenderer *cell, + GtkTreeModel *tree_model, + GtkTreeIter *iter, + gpointer data) +{ + TpDebugMessage *msg; + const gchar *level; + + gtk_tree_model_get (tree_model, iter, COL_DEBUG_MESSAGE, &msg, -1); + + level = log_level_to_string (tp_debug_message_get_level (msg)); + + g_object_set (G_OBJECT (cell), "text", level, NULL); + + g_object_unref (msg); } static gboolean @@ -1501,28 +1484,28 @@ debug_window_copy_model_foreach (GtkTreeModel *model, { gchar **text = (gchar **) user_data; gchar *tmp; - gchar *domain, *category, *message, *level_str, *level_upper; - gdouble timestamp; + gchar *level_upper; + const gchar *level_str, *category; gchar *line, *time_str; + TpDebugMessage *msg; if (*text == NULL) *text = g_strdup (""); gtk_tree_model_get (model, iter, - COL_DEBUG_TIMESTAMP, ×tamp, - COL_DEBUG_DOMAIN, &domain, - COL_DEBUG_CATEGORY, &category, - COL_DEBUG_LEVEL_STRING, &level_str, - COL_DEBUG_MESSAGE, &message, + COL_DEBUG_MESSAGE, &msg, -1); + level_str = log_level_to_string (tp_debug_message_get_level (msg)); level_upper = g_ascii_strup (level_str, -1); - time_str = debug_window_format_timestamp (timestamp); + time_str = debug_window_format_timestamp (msg); + category = tp_debug_message_get_category (msg); line = g_strdup_printf ("%s%s%s-%s: %s: %s\n", - domain, EMP_STR_EMPTY (category) ? "" : "/", - category, level_upper, time_str, message); + tp_debug_message_get_domain (msg), + category ? "" : "/", category ? category : "", + level_upper, time_str, tp_debug_message_get_message (msg)); g_free (time_str); @@ -1531,10 +1514,7 @@ debug_window_copy_model_foreach (GtkTreeModel *model, g_free (*text); g_free (line); g_free (level_upper); - g_free (level_str); - g_free (domain); - g_free (category); - g_free (message); + g_object_unref (msg); *text = tmp; @@ -1855,6 +1835,7 @@ am_prepared_cb (GObject *am, GtkListStore *level_store; GtkTreeIter iter; GError *error = NULL; + GtkWidget *infobar, *content; if (!tp_proxy_prepare_finish (am, res, &error)) { @@ -1862,6 +1843,8 @@ am_prepared_cb (GObject *am, g_clear_error (&error); } + empathy_set_css_provider (GTK_WIDGET (object)); + gtk_window_set_title (GTK_WINDOW (object), _("Debug Window")); gtk_window_set_default_size (GTK_WINDOW (object), 800, 400); empathy_geometry_bind (GTK_WINDOW (object), "debug-window"); @@ -2030,6 +2013,32 @@ am_prepared_cb (GObject *am, g_signal_connect (self->priv->level_filter, "changed", G_CALLBACK (debug_window_filter_changed_cb), object); + /* Info bar */ + infobar = gtk_info_bar_new (); + gtk_info_bar_set_message_type (GTK_INFO_BAR (infobar), GTK_MESSAGE_INFO); + + label = gtk_label_new ( + _("Even if they don't display passwords, logs can contain sensitive " + "information such as your list of contacts or the messages you " + "recently sent or received.\nIf you don't want to see such " + "information available in a public bug report, you " + "can choose to limit the visibility of your bug to " + "Empathy developers when reporting it by displaying " + "the advanced fields in the " + "" + "bug report.")); + gtk_label_set_use_markup (GTK_LABEL (label), TRUE); + gtk_label_set_line_wrap (GTK_LABEL (label), TRUE); + gtk_style_context_add_class (gtk_widget_get_style_context (label), + GTK_STYLE_CLASS_DIM_LABEL); + + content = gtk_info_bar_get_content_area (GTK_INFO_BAR (infobar)); + gtk_box_pack_start (GTK_BOX (content), label, FALSE, FALSE, 0); + + gtk_widget_show (infobar); + gtk_widget_show (label); + gtk_box_pack_start (GTK_BOX (vbox), infobar, FALSE, FALSE, 0); + /* Debug treeview */ self->priv->view = gtk_tree_view_new (); gtk_tree_view_set_rules_hint (GTK_TREE_VIEW (self->priv->view), TRUE); @@ -2038,22 +2047,31 @@ am_prepared_cb (GObject *am, G_CALLBACK (debug_window_button_press_event_cb), object); renderer = gtk_cell_renderer_text_new (); - g_object_set (renderer, "yalign", 0, NULL); + g_object_set (renderer, "yalign", (gfloat) 0, NULL); gtk_tree_view_insert_column_with_data_func (GTK_TREE_VIEW (self->priv->view), -1, _("Time"), renderer, (GtkTreeCellDataFunc) debug_window_time_formatter, NULL, NULL); - gtk_tree_view_insert_column_with_attributes (GTK_TREE_VIEW (self->priv->view), - -1, _("Domain"), renderer, "text", COL_DEBUG_DOMAIN, NULL); - gtk_tree_view_insert_column_with_attributes (GTK_TREE_VIEW (self->priv->view), - -1, _("Category"), renderer, "text", COL_DEBUG_CATEGORY, NULL); - gtk_tree_view_insert_column_with_attributes (GTK_TREE_VIEW (self->priv->view), - -1, _("Level"), renderer, "text", COL_DEBUG_LEVEL_STRING, NULL); + gtk_tree_view_insert_column_with_data_func (GTK_TREE_VIEW (self->priv->view), + -1, _("Domain"), renderer, + (GtkTreeCellDataFunc) debug_window_domain_formatter, NULL, NULL); + gtk_tree_view_insert_column_with_data_func (GTK_TREE_VIEW (self->priv->view), + -1, _("Category"), renderer, + (GtkTreeCellDataFunc) debug_window_category_formatter, NULL, NULL); + gtk_tree_view_insert_column_with_data_func (GTK_TREE_VIEW (self->priv->view), + -1, _("Level"), renderer, + (GtkTreeCellDataFunc) debug_window_level_formatter, NULL, NULL); renderer = gtk_cell_renderer_text_new (); - g_object_set (renderer, "family", "Monospace", NULL); - gtk_tree_view_insert_column_with_attributes (GTK_TREE_VIEW (self->priv->view), - -1, _("Message"), renderer, "text", COL_DEBUG_MESSAGE, NULL); + + g_object_set (renderer, + "family", "Monospace", + "ellipsize", PANGO_ELLIPSIZE_END, + NULL); + + gtk_tree_view_insert_column_with_data_func (GTK_TREE_VIEW (self->priv->view), + -1, _("Message"), renderer, + (GtkTreeCellDataFunc) debug_window_message_formatter, NULL, NULL); self->priv->store_filter = NULL;