*/
#include "config.h"
+#include "empathy-debug-window.h"
#include <glib/gi18n.h>
#include <libsoup/soup.h>
+#include <tp-account-widgets/tpaw-utils.h>
+#include <telepathy-glib/telepathy-glib-dbus.h>
-#define DEBUG_FLAG EMPATHY_DEBUG_OTHER
-#include <libempathy/empathy-debug.h>
-#include <libempathy/empathy-utils.h>
-
-#include <libempathy-gtk/empathy-geometry.h>
-#include <libempathy-gtk/empathy-ui-utils.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)
{
SERVICE_TYPE_CM = 0,
SERVICE_TYPE_CLIENT,
+ SERVICE_TYPE_MC,
} ServiceType;
enum
gpointer user_data)
{
EmpathyDebugWindow *self = (EmpathyDebugWindow *) user_data;
- GtkTreeModel *service_store = GTK_TREE_MODEL (self->priv->service_store);
+ GtkTreeModel *service_store;
TpProxy *stored_proxy;
GtkTreeIter iter;
gboolean valid_iter;
+ if (self->priv->service_store == NULL)
+ return;
+
+ service_store = GTK_TREE_MODEL (self->priv->service_store);
+
/* Proxy has been invalidated so we find and set it to NULL
* in service store */
gtk_tree_model_get_iter_first (service_store, &iter);
gtk_list_store_set (self->priv->service_store, &iter,
COL_PROXY, NULL,
-1);
+
+ g_object_unref (stored_proxy);
}
/* Also, we refresh "All" selection's active buffer since it should not
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
* selected service is unable to fetch debug messages */
if (!tp_strdiff (active_service_name, proxy_service_name))
debug_window_set_toolbar_sensitivity (self, FALSE);
-
- /* We created the proxy for GetMessages call. Now destroy it. */
- tp_clear_object (&debug);
return;
}
DEBUG ("Proxy for service: %s was successful in fetching debug"
" messages. Saving it.", proxy_service_name);
+ /* The store will take its own ref on the proxy preventing it to be
+ * destroyed when leaving this callback. */
gtk_list_store_set (self->priv->service_store, &iter,
COL_PROXY, debug,
-1);
g_free (proxy_service_name);
/* Connect to "invalidated" signal */
- g_signal_connect (debug, "invalidated",
- G_CALLBACK (proxy_invalidated_cb), self);
+ g_signal_connect_object (debug, "invalidated",
+ G_CALLBACK (proxy_invalidated_cb), self, 0);
/* Connect to NewDebugMessage */
tp_g_signal_connect_object (debug, "new-debug-message",
tp_debug_client_get_messages_async (TP_DEBUG_CLIENT (new_proxy),
debug_window_get_messages_cb, self);
+ g_object_unref (new_proxy);
+
finally:
g_free (name);
tp_clear_object (&stored_proxy);
g_slice_free (FillServiceChooserData, data);
}
+static const gchar *
+service_type_to_string (ServiceType type)
+{
+ switch (type)
+ {
+ case SERVICE_TYPE_CM:
+ return "CM";
+ case SERVICE_TYPE_CLIENT:
+ return "Client";
+ case SERVICE_TYPE_MC:
+ return "MC";
+ }
+
+ return "other";
+}
+
+static gchar *
+service_dup_display_name (EmpathyDebugWindow *self,
+ ServiceType type,
+ const gchar *name)
+{
+ if (type == SERVICE_TYPE_CM)
+ return get_cm_display_name (self, name);
+ else
+ return g_strdup (name);
+}
+
static void
debug_window_get_name_owner_cb (TpDBusDaemon *proxy,
const gchar *out,
GtkListStore *active_buffer, *pause_buffer;
DEBUG ("Adding %s to list: %s at unique name: %s",
- data->type == SERVICE_TYPE_CM? "CM": "Client",
+ service_type_to_string (data->type),
data->name, out);
- if (data->type == SERVICE_TYPE_CM)
- name = get_cm_display_name (self, data->name);
- else
- name = g_strdup (data->name);
+ name = service_dup_display_name (self, data->type, data->name);
active_buffer = new_list_store_for_service ();
pause_buffer = new_list_store_for_service ();
fill_service_chooser_data_free (data);
}
-static void
-debug_window_list_connection_names_cb (const gchar * const *names,
- gsize n,
- const gchar * const *cms,
- const gchar * const *protocols,
- const GError *error,
- gpointer user_data,
- GObject *weak_object)
-{
- EmpathyDebugWindow *self = user_data;
- guint i;
- TpDBusDaemon *dbus;
- GError *error2 = NULL;
-
- if (error != NULL)
- {
- DEBUG ("list_connection_names failed: %s", error->message);
- return;
- }
-
- dbus = tp_dbus_daemon_dup (&error2);
-
- if (error2 != NULL)
- {
- DEBUG ("Failed to dup TpDBusDaemon.");
- g_error_free (error2);
- return;
- }
-
- for (i = 0; cms[i] != NULL; i++)
- {
- FillServiceChooserData *data = fill_service_chooser_data_new (
- self, cms[i], SERVICE_TYPE_CM);
-
- tp_cli_dbus_daemon_call_get_name_owner (dbus, -1,
- names[i], debug_window_get_name_owner_cb,
- data, NULL, NULL);
-
- self->priv->services_detected ++;
- }
-
- g_object_unref (dbus);
-}
-
static void
debug_window_name_owner_changed_cb (TpDBusDaemon *proxy,
const gchar *arg0,
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;
- if (type == SERVICE_TYPE_CM)
- display_name = get_cm_display_name (self, name);
- else
- display_name = g_strdup (name);
+ display_name = service_dup_display_name (self, type, name);
/* A service joined */
if (!debug_window_service_is_in_model (user_data, 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;
}
static void
-add_client (EmpathyDebugWindow *self,
- const gchar *name)
+add_service (EmpathyDebugWindow *self,
+ const gchar *bus_name,
+ const gchar *display_name,
+ ServiceType type)
{
- const gchar *suffix;
FillServiceChooserData *data;
- suffix = name + strlen (TP_CLIENT_BUS_NAME_BASE);
-
- data = fill_service_chooser_data_new (self, suffix, SERVICE_TYPE_CLIENT);
+ data = fill_service_chooser_data_new (self, display_name, type);
tp_cli_dbus_daemon_call_get_name_owner (self->priv->dbus, -1,
- name, debug_window_get_name_owner_cb, data, NULL, NULL);
+ bus_name, debug_window_get_name_owner_cb, data, NULL, NULL);
self->priv->services_detected ++;
}
{
if (g_str_has_prefix (names[i], TP_CLIENT_BUS_NAME_BASE))
{
- add_client (self, names[i]);
+ add_service (self, names[i],
+ names[i] + strlen (TP_CLIENT_BUS_NAME_BASE), SERVICE_TYPE_CLIENT);
+ }
+ else if (g_str_has_prefix (names[i], TP_CM_BUS_NAME_BASE))
+ {
+ add_service (self, names[i],
+ names[i] + strlen (TP_CM_BUS_NAME_BASE), SERVICE_TYPE_CM);
+ }
+ else if (!tp_strdiff (names[i], TP_ACCOUNT_MANAGER_BUS_NAME))
+ {
+ add_service (self, names[i], "Mission-Control", SERVICE_TYPE_MC);
}
}
}
debug_window_fill_service_chooser (EmpathyDebugWindow *self)
{
GError *error = NULL;
- GtkTreeIter iter;
- GtkListStore *active_buffer, *pause_buffer;
self->priv->dbus = tp_dbus_daemon_dup (&error);
self->priv->services_detected = 0;
self->priv->name_owner_cb_count = 0;
- /* Add CMs to list */
- tp_list_connection_names (self->priv->dbus,
- debug_window_list_connection_names_cb, self, NULL, NULL);
-
- /* add Mission Control */
- active_buffer= new_list_store_for_service ();
- pause_buffer = new_list_store_for_service ();
-
- gtk_list_store_insert_with_values (self->priv->service_store, &iter, -1,
- COL_NAME, "mission-control",
- COL_UNIQUE_NAME, "org.freedesktop.Telepathy.MissionControl5",
- COL_GONE, FALSE,
- COL_ACTIVE_BUFFER, active_buffer,
- COL_PAUSE_BUFFER, pause_buffer,
- COL_PROXY, NULL,
- -1);
- g_object_unref (active_buffer);
- g_object_unref (pause_buffer);
-
- /* add clients */
tp_dbus_daemon_list_names (self->priv->dbus, 2000,
list_names_cb, NULL, NULL, G_OBJECT (self));
message = tp_debug_message_get_message (msg);
- if (EMP_STR_EMPTY (message))
+ if (TPAW_STR_EMPTY (message))
{
DEBUG ("Log message is empty");
return;
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);
+ gtk_widget_set_size_request (GTK_WIDGET (object), 600, 300);
empathy_geometry_bind (GTK_WINDOW (object), "debug-window");
g_signal_connect (object, "key-press-event",
(GtkTreeCellDataFunc) debug_window_level_formatter, NULL, NULL);
renderer = gtk_cell_renderer_text_new ();
- g_object_set (renderer, "family", "Monospace", 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);
(G_OBJECT_CLASS (empathy_debug_window_parent_class)->finalize) (object);
}
+static void
+disable_all_debug_clients (EmpathyDebugWindow *self)
+{
+ GtkTreeIter iter;
+ gboolean valid_iter;
+ GtkTreeModel *model;
+
+ if (self->priv->service_store == NULL)
+ return;
+ model = GTK_TREE_MODEL (self->priv->service_store);
+
+ /* Skipping the first service store 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))
+ {
+ TpDebugClient *debug;
+
+ gtk_tree_model_get (model, &iter,
+ COL_PROXY, &debug,
+ -1);
+
+ debug_window_set_enabled (debug, FALSE);
+
+ g_object_unref (debug);
+ }
+}
+
static void
debug_window_dispose (GObject *object)
{
tp_proxy_signal_connection_disconnect (
self->priv->name_owner_changed_signal);
+ /* Disable Debug on all proxies */
+ disable_all_debug_clients (self);
+
g_clear_object (&self->priv->service_store);
g_clear_object (&self->priv->dbus);
g_clear_object (&self->priv->am);