*/
#include "config.h"
-
-#include <string.h>
+#include "empathy-debug-window.h"
#include <glib/gi18n.h>
-#include <gtk/gtk.h>
-#include <gio/gio.h>
-#include <gdk/gdkkeysyms.h>
#include <libsoup/soup.h>
+#include <tp-account-widgets/tpaw-utils.h>
-#define DEBUG_FLAG EMPATHY_DEBUG_OTHER
-#include <libempathy/empathy-debug.h>
-#include <libempathy/empathy-utils.h>
-
-#include <libempathy-gtk/empathy-account-chooser.h>
-#include <libempathy-gtk/empathy-geometry.h>
-#include <libempathy-gtk/empathy-ui-utils.h>
-
-#include <telepathy-glib/dbus.h>
-#include <telepathy-glib/interfaces.h>
-#include <telepathy-glib/util.h>
-#include <telepathy-glib/proxy-subclass.h>
-#include <telepathy-glib/account-manager.h>
-
-#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)
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
};
{
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);
}
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
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
COL_PROXY, debug,
-1);
}
+ g_ptr_array_unref (messages);
g_free (proxy_service_name);
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
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
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)
{
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;
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;
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),
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;
gtk_clipboard_set_text (clipboard, message, -1);
- g_free (message);
+ g_object_unref (msg);
}
typedef struct
}
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;
}
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
{
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);
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;
GtkListStore *level_store;
GtkTreeIter iter;
GError *error = NULL;
+ GtkWidget *infobar, *content;
if (!tp_proxy_prepare_finish (am, res, &error))
{
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");
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 "
+ "<a href=\"https://bugzilla.gnome.org/enter_bug.cgi?product=empathy\">"
+ "bug report</a>."));
+ 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);
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;