aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGuillaume Desmottes <guillaume.desmottes@collabora.co.uk>2012-02-21 21:11:57 +0800
committerGuillaume Desmottes <guillaume.desmottes@collabora.co.uk>2012-02-21 21:11:57 +0800
commit109e8dda543685f0ef6be6bc24e76ffce7e8e9f2 (patch)
treecd62db97068a525af6acc4a05f9fa27e9e5ca543
parent421b66326367a0cec07ca233ada0d675078f73bb (diff)
parentefbdd30a2d83aa2ae03fd2cb678448e8f9ea83f5 (diff)
downloadgsoc2013-empathy-109e8dda543685f0ef6be6bc24e76ffce7e8e9f2.tar
gsoc2013-empathy-109e8dda543685f0ef6be6bc24e76ffce7e8e9f2.tar.gz
gsoc2013-empathy-109e8dda543685f0ef6be6bc24e76ffce7e8e9f2.tar.bz2
gsoc2013-empathy-109e8dda543685f0ef6be6bc24e76ffce7e8e9f2.tar.lz
gsoc2013-empathy-109e8dda543685f0ef6be6bc24e76ffce7e8e9f2.tar.xz
gsoc2013-empathy-109e8dda543685f0ef6be6bc24e76ffce7e8e9f2.tar.zst
gsoc2013-empathy-109e8dda543685f0ef6be6bc24e76ffce7e8e9f2.zip
Merge remote-tracking branch 'glassrose/debug-window-send-to-pastebin-button-658724'
-rw-r--r--PASTEBIN-API-KEY.txt110
-rw-r--r--src/empathy-debug-window.c194
2 files changed, 283 insertions, 21 deletions
diff --git a/PASTEBIN-API-KEY.txt b/PASTEBIN-API-KEY.txt
new file mode 100644
index 000000000..71c8e9c36
--- /dev/null
+++ b/PASTEBIN-API-KEY.txt
@@ -0,0 +1,110 @@
+MIME-Version: 1.0
+Received: by 10.231.11.1 with HTTP; Tue, 11 Oct 2011 22:59:10 -0700 (PDT)
+In-Reply-To:
+<CADttZZpfye8-Pi9=UDK3OUq8NmsagYV5AF_oewVNEUMRp7joFg@mail.gmail.com>
+References: <CADttZZoDLnv+aoZBPLcHT43-yKCH8LB+3objC-ST1qRp3P3Lnw@mail.gmail.com>
+ <CACuygeBuekJwr3t+7GxLA8Ft+A-Q6QmZUhe_2VU2LozSYduYxQ@mail.gmail.com>
+ <CADttZZqadJP3441etHxd2JFmNCqqHxDhg-uiCqqV=Qs3hUCynA@mail.gmail.com>
+ <CADttZZrWAw7hjQb1+qN+4z42d10FEWwOvLG-P_s85Htf_fwbEg@mail.gmail.com>
+ <CACuygeCOpAmYBogzay2VOb7SGnEhLsKfeaU-07QXQG=mj-ZRfg@mail.gmail.com>
+ <CADttZZrmrz5Dr7d9THQsSPJtWvy_P_-vkAx=UDcUEo_c+RE2nQ@mail.gmail.com>
+ <CADttZZqGfRUjcr8Cppz5oWniXwmreomd3wshCBzwx1E32A=Kdw@mail.gmail.com>
+ <CACuygeDDcW1NZYGCzTuxAUrJ92BgEnG+0ewME-yhR03Pwvd02A@mail.gmail.com>
+ <CADttZZpfye8-Pi9=UDK3OUq8NmsagYV5AF_oewVNEUMRp7joFg@mail.gmail.com>
+Date: Wed, 12 Oct 2011 11:29:10 +0530
+Delivered-To: chandniverma2112@gmail.com
+Message-ID: <CADttZZrP+XkPtNgAzxM56WkQAT72hjcQD0Z1UcFj8=q86Cpxeg@mail.gmail.com>
+Subject: Re: API issues
+From: Chandni Verma <chandniverma2112@gmail.com>
+To: Pastebin Support <admin@pastebin.com>
+Content-Type: multipart/alternative; boundary=001636ef068e08c10c04af13b9e5
+
+--001636ef068e08c10c04af13b9e5
+Content-Type: text/plain; charset=ISO-8859-1
+
+Hi Admin,
+
+One thing which I want to ask you since it it not answered anywhere on the
+pastebin.com website is that who is allowed to use the API developer key in
+their codes. Are there any licences to keep in mind?
+It's crucial to the open source project I have used the pastebin API for.
+
+Can we publish a member's (my) key in the open source code?
+
+Regards,
+Chandni
+
+_______
+
+Delivered-To: chandniverma2112@gmail.com
+Received: by 10.231.11.1 with SMTP id r1cs44531ibr;
+ Wed, 12 Oct 2011 02:27:32 -0700 (PDT)
+Return-Path: <godius@gmail.com>
+Received-SPF: pass (google.com: domain of godius@gmail.com designates
+10.182.187.100 as permitted sender) client-ip=10.182.187.100;
+Authentication-Results: mr.google.com; spf=pass (google.com: domain of
+godius@gmail.com designates 10.182.187.100 as permitted sender)
+smtp.mail=godius@gmail.com; dkim=pass header.i=godius@gmail.com
+Received: from mr.google.com ([10.182.187.100])
+ by 10.182.187.100 with SMTP id fr4mr13834663obc.79.1318411651457
+(num_hops = 1);
+ Wed, 12 Oct 2011 02:27:31 -0700 (PDT)
+DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed;
+ d=gmail.com; s=gamma;
+ h=mime-version:sender:in-reply-to:references:date
+ :x-google-sender-auth:message-id:subject:from:to:content-type;
+ bh=pv3X2ILKj91U9H2lw/fwrkHPzZRFCaB8pPO2Y6pBzSA=;
+ b=T2XQR8CcrP3jF/9wJPYJxBQPToZp2ckFMelfmdRFd7akc6f8iEQRXUjEsYXvRPbuzS
+ 6TWaTHiT0QLBZaqh1D6AifP2E4m84H+h8LwEkYXXAN4dJyTIbAM8rQ5KfbTiaoKzuv48
+ 7dS26KA2YOB1bWTlhEm0zW4bdPCGSBxsCW67Y=
+MIME-Version: 1.0
+Received: by 10.182.187.100 with SMTP id fr4mr13834663obc.79.1318411651452;
+ Wed, 12 Oct 2011 02:27:31 -0700 (PDT)
+Sender: godius@gmail.com
+Received: by 10.182.118.36 with HTTP; Wed, 12 Oct 2011 02:27:31 -0700 (PDT)
+In-Reply-To:
+<CADttZZrP+XkPtNgAzxM56WkQAT72hjcQD0Z1UcFj8=q86Cpxeg@mail.gmail.com>
+References: <CADttZZoDLnv+aoZBPLcHT43-yKCH8LB+3objC-ST1qRp3P3Lnw@mail.gmail.com>
+ <CACuygeBuekJwr3t+7GxLA8Ft+A-Q6QmZUhe_2VU2LozSYduYxQ@mail.gmail.com>
+ <CADttZZqadJP3441etHxd2JFmNCqqHxDhg-uiCqqV=Qs3hUCynA@mail.gmail.com>
+ <CADttZZrWAw7hjQb1+qN+4z42d10FEWwOvLG-P_s85Htf_fwbEg@mail.gmail.com>
+ <CACuygeCOpAmYBogzay2VOb7SGnEhLsKfeaU-07QXQG=mj-ZRfg@mail.gmail.com>
+ <CADttZZrmrz5Dr7d9THQsSPJtWvy_P_-vkAx=UDcUEo_c+RE2nQ@mail.gmail.com>
+ <CADttZZqGfRUjcr8Cppz5oWniXwmreomd3wshCBzwx1E32A=Kdw@mail.gmail.com>
+ <CACuygeDDcW1NZYGCzTuxAUrJ92BgEnG+0ewME-yhR03Pwvd02A@mail.gmail.com>
+ <CADttZZpfye8-Pi9=UDK3OUq8NmsagYV5AF_oewVNEUMRp7joFg@mail.gmail.com>
+ <CADttZZrP+XkPtNgAzxM56WkQAT72hjcQD0Z1UcFj8=q86Cpxeg@mail.gmail.com>
+Date: Wed, 12 Oct 2011 11:27:31 +0200
+X-Google-Sender-Auth: cXD_1Zj39UiHBWVSdEJRk04LVC8
+Message-ID: <CACuygeDAqGCP+=KsV+ZyxNuLoy9L0CTQ63NpRhrig-9bzeFp6A@mail.gmail.com>
+Subject: Re: API issues
+From: Pastebin Support <admin@pastebin.com>
+To: Chandni Verma <chandniverma2112@gmail.com>
+Content-Type: multipart/alternative; boundary=14dae9398ea5270f6904af16a25e
+
+--14dae9398ea5270f6904af16a25e
+Content-Type: text/plain; charset=ISO-8859-1
+
+Hello,
+
+Yes you can use your api developer key in the open for your project.
+Regards,
+
+Pastebin
+
+
+On Wed, Oct 12, 2011 at 7:59 AM, Chandni Verma
+<chandniverma2112@gmail.com>wrote:
+
+> Hi Admin,
+>
+> One thing which I want to ask you since it it not answered anywhere on the
+> pastebin.com website is that who is allowed to use the API developer key
+> in their codes. Are there any licences to keep in mind?
+> It's crucial to the open source project I have used the pastebin API for.
+>
+> Can we publish a member's (my) key in the open source code?
+>
+> Regards,
+> Chandni
+>
diff --git a/src/empathy-debug-window.c b/src/empathy-debug-window.c
index 3aa8c1502..448c06f69 100644
--- a/src/empathy-debug-window.c
+++ b/src/empathy-debug-window.c
@@ -21,10 +21,13 @@
#include "config.h"
+#include <string.h>
+
#include <glib/gi18n.h>
#include <gtk/gtk.h>
#include <gio/gio.h>
#include <gdk/gdkkeysyms.h>
+#include <libsoup/soup.h>
#define DEBUG_FLAG EMPATHY_DEBUG_OTHER
#include <libempathy/empathy-debug.h>
@@ -88,6 +91,7 @@ typedef struct
/* Toolbar items */
GtkWidget *chooser;
GtkToolItem *save_button;
+ GtkToolItem *send_to_pastebin;
GtkToolItem *copy_button;
GtkToolItem *clear_button;
GtkToolItem *pause_button;
@@ -223,7 +227,7 @@ insert_values_in_buffer (GtkListStore *store,
COL_DEBUG_LEVEL_STRING, log_level_to_string (level),
COL_DEBUG_MESSAGE, string,
COL_DEBUG_LEVEL_VALUE, level,
- -1);
+ -1);
}
static void
@@ -322,6 +326,7 @@ debug_window_set_toolbar_sensitivity (EmpathyDebugWindow *debug_window,
GtkWidget *vbox = gtk_bin_get_child (GTK_BIN (debug_window));
gtk_widget_set_sensitive (GTK_WIDGET (priv->save_button), sensitive);
+ gtk_widget_set_sensitive (GTK_WIDGET (priv->send_to_pastebin), sensitive);
gtk_widget_set_sensitive (GTK_WIDGET (priv->copy_button), sensitive);
gtk_widget_set_sensitive (GTK_WIDGET (priv->clear_button), sensitive);
gtk_widget_set_sensitive (GTK_WIDGET (priv->pause_button), sensitive);
@@ -600,7 +605,6 @@ static gboolean
tree_view_search_equal_func_cb (GtkTreeModel *model,
gint column,
const gchar *key,
-
GtkTreeIter *iter,
gpointer search_data)
{
@@ -1482,12 +1486,10 @@ debug_window_store_filter_foreach (GtkTreeModel *model,
GtkTreeIter *iter,
gpointer user_data)
{
- GFileOutputStream *output_stream = (GFileOutputStream *) user_data;
+ gchar **debug_data = (gchar **)user_data;
gchar *domain, *category, *message, *level_str, *level_upper;
gdouble timestamp;
- gchar *line, *time_str;
- GError *error = NULL;
- gboolean out = FALSE;
+ gchar *line, *time_str, *tmp;
gtk_tree_model_get (model, iter,
COL_DEBUG_TIMESTAMP, &timestamp,
@@ -1507,15 +1509,14 @@ debug_window_store_filter_foreach (GtkTreeModel *model,
g_free (time_str);
- g_output_stream_write (G_OUTPUT_STREAM (output_stream), line,
- strlen (line), NULL, &error);
+ /* Compact all message lines in the out parameter debug_data */
+ if (!tp_str_empty (*debug_data))
+ tmp = g_strconcat (*debug_data, line, NULL);
+ else
+ tmp = g_strdup (line);
- if (error != NULL)
- {
- DEBUG ("Failed to write to file: %s", error->message);
- g_error_free (error);
- out = TRUE;
- }
+ g_free (*debug_data);
+ *debug_data = tmp;
g_free (line);
g_free (level_upper);
@@ -1524,7 +1525,7 @@ debug_window_store_filter_foreach (GtkTreeModel *model,
g_free (category);
g_free (message);
- return out;
+ return FALSE;
}
static void
@@ -1535,8 +1536,10 @@ debug_window_save_file_chooser_response_cb (GtkDialog *dialog,
EmpathyDebugWindowPriv *priv = GET_PRIV (debug_window);
gchar *filename = NULL;
GFile *gfile = NULL;
+ gchar *debug_data = NULL;
GFileOutputStream *output_stream = NULL;
- GError *error = NULL;
+ GError *file_open_error = NULL;
+ GError *file_write_error = NULL;
if (response_id != GTK_RESPONSE_ACCEPT)
goto OUT;
@@ -1547,17 +1550,27 @@ debug_window_save_file_chooser_response_cb (GtkDialog *dialog,
gfile = g_file_new_for_path (filename);
output_stream = g_file_replace (gfile, NULL, FALSE,
- G_FILE_CREATE_NONE, NULL, &error);
+ G_FILE_CREATE_NONE, NULL, &file_open_error);
- if (error != NULL)
+ if (file_open_error != NULL)
{
- DEBUG ("Failed to open file for writing: %s", error->message);
- g_error_free (error);
+ DEBUG ("Failed to open file for writing: %s", file_open_error->message);
+ g_error_free (file_open_error);
goto OUT;
}
gtk_tree_model_foreach (priv->store_filter,
- debug_window_store_filter_foreach, output_stream);
+ debug_window_store_filter_foreach, &debug_data);
+
+ g_output_stream_write (G_OUTPUT_STREAM (output_stream), debug_data,
+ strlen (debug_data), NULL, &file_write_error);
+ g_free (debug_data);
+
+ if (file_write_error != NULL)
+ {
+ DEBUG ("Failed to write to file: %s", file_write_error->message);
+ g_error_free (file_write_error);
+ }
OUT:
if (gfile != NULL)
@@ -1619,6 +1632,135 @@ debug_window_save_clicked_cb (GtkToolButton *tool_button,
gtk_widget_show (file_chooser);
}
+static void
+debug_window_pastebin_response_dialog_closed_cb (GtkDialog *dialog,
+ gint response_id,
+ SoupBuffer *buffer)
+{
+ soup_buffer_free (buffer);
+
+ gtk_widget_destroy (GTK_WIDGET (dialog));
+}
+
+static void
+debug_window_pastebin_callback (SoupSession *session,
+ SoupMessage *msg,
+ gpointer debug_window)
+{
+ GtkWidget *dialog;
+ SoupBuffer *buffer;
+
+ buffer = soup_message_body_flatten (msg->response_body);
+ if (g_str_has_prefix (buffer->data, "http://pastebin.com/"))
+ {
+ dialog = gtk_message_dialog_new (GTK_WINDOW (debug_window),
+ GTK_DIALOG_DESTROY_WITH_PARENT, GTK_MESSAGE_INFO, GTK_BUTTONS_CLOSE,
+ _("Pastebin link"));
+
+ gtk_message_dialog_format_secondary_markup (GTK_MESSAGE_DIALOG (dialog),
+ "<a href=\"%s\">%s</a>", buffer->data, buffer->data);
+ }
+ else
+ {
+ dialog = gtk_message_dialog_new (GTK_WINDOW (debug_window),
+ GTK_DIALOG_DESTROY_WITH_PARENT, GTK_MESSAGE_INFO, GTK_BUTTONS_CLOSE,
+ _("Pastebin response"));
+
+ if (!tp_str_empty (buffer->data))
+ gtk_message_dialog_format_secondary_markup (GTK_MESSAGE_DIALOG (dialog),
+ _("%s"), buffer->data);
+ else
+ gtk_message_dialog_format_secondary_text (GTK_MESSAGE_DIALOG (dialog),
+ _("Data too large for a single paste. Please save logs to file."));
+ }
+
+ g_object_unref (session);
+
+ gtk_window_set_transient_for (GTK_WINDOW (dialog), debug_window);
+
+ gtk_widget_show_all (GTK_WIDGET (dialog));
+
+ g_signal_connect_after (dialog, "response", G_CALLBACK (
+ debug_window_pastebin_response_dialog_closed_cb), buffer);
+}
+
+static void
+debug_window_message_dialog (EmpathyDebugWindow *debug_window,
+ const gchar *primary_text,
+ const gchar *secondary_text)
+{
+ GtkWidget *dialog;
+
+ dialog = gtk_message_dialog_new (GTK_WINDOW (debug_window),
+ GTK_DIALOG_DESTROY_WITH_PARENT, GTK_MESSAGE_INFO, GTK_BUTTONS_OK,
+ "%s", _(primary_text));
+ gtk_message_dialog_format_secondary_text (GTK_MESSAGE_DIALOG (dialog),
+ "%s", _(secondary_text));
+ gtk_window_set_transient_for (GTK_WINDOW (dialog),
+ GTK_WINDOW (debug_window));
+
+ gtk_dialog_run (GTK_DIALOG (dialog));
+ gtk_widget_destroy (dialog);
+}
+
+static void
+debug_window_send_to_pastebin (EmpathyDebugWindow *debug_window,
+ gchar *debug_data)
+{
+ SoupSession *session;
+ SoupMessage *msg;
+ gchar *api_dev_key, *api_paste_code, *api_paste_name, *formdata;
+
+ if (tp_str_empty (debug_data))
+ {
+ debug_window_message_dialog (debug_window, "Error", "No data to send");
+ return;
+ }
+
+ /* Constructing a valid URL for http post. See http://pastebin.com/api#2 */
+
+ /* The api_dev_key is the author's developer key to access the Pastebin API
+ * This developer key is published here with the autorization of pastebin;
+ * see PASTEBIN-API-KEY.txt */
+ api_dev_key = soup_uri_encode ("f6ccfabfdcd4b77b825ee38a30d11d52", NULL);
+ api_paste_code = soup_uri_encode (debug_data, NULL);
+ api_paste_name = soup_uri_encode ("Empathy debug data", NULL);
+ formdata = g_strdup_printf ("api_dev_key=%s&api_paste_code=%s"
+ "&api_paste_name=%s&api_paste_format=text&api_option=paste",
+ api_dev_key, api_paste_code, api_paste_name);
+
+ session = soup_session_async_new ();
+
+ msg = soup_message_new ("POST", "http://pastebin.com/api/api_post.php");
+ soup_message_set_request (msg,
+ "application/x-www-form-urlencoded;charset=UTF-8", SOUP_MEMORY_COPY,
+ formdata, strlen (formdata));
+
+ g_free (api_dev_key);
+ g_free (api_paste_code);
+ g_free (api_paste_name);
+ g_free (formdata);
+
+ soup_session_queue_message (session, msg, debug_window_pastebin_callback,
+ debug_window);
+}
+
+static void
+debug_window_send_to_pastebin_cb (GtkToolButton *tool_button,
+ EmpathyDebugWindow *debug_window)
+{
+ EmpathyDebugWindowPriv *priv = GET_PRIV (debug_window);
+ gchar *debug_data = NULL;
+
+ DEBUG ("Preparing debug data for sending to pastebin.");
+
+ gtk_tree_model_foreach (priv->store_filter,
+ debug_window_store_filter_foreach, &debug_data);
+
+ debug_window_send_to_pastebin (debug_window, debug_data);
+ g_free (debug_data);
+}
+
static gboolean
debug_window_copy_model_foreach (GtkTreeModel *model,
GtkTreePath *path,
@@ -1813,6 +1955,16 @@ am_prepared_cb (GObject *am,
gtk_tool_item_set_is_important (GTK_TOOL_ITEM (priv->save_button), TRUE);
gtk_toolbar_insert (GTK_TOOLBAR (toolbar), priv->save_button, -1);
+ /* Send to pastebin */
+ priv->send_to_pastebin = gtk_tool_button_new_from_stock (GTK_STOCK_PASTE);
+ gtk_tool_button_set_label (GTK_TOOL_BUTTON (priv->send_to_pastebin),
+ _("Send to pastebin"));
+ g_signal_connect (priv->send_to_pastebin, "clicked",
+ G_CALLBACK (debug_window_send_to_pastebin_cb), object);
+ gtk_widget_show (GTK_WIDGET (priv->send_to_pastebin));
+ gtk_tool_item_set_is_important (GTK_TOOL_ITEM (priv->send_to_pastebin), TRUE);
+ gtk_toolbar_insert (GTK_TOOLBAR (toolbar), priv->send_to_pastebin, -1);
+
/* Copy */
priv->copy_button = gtk_tool_button_new_from_stock (GTK_STOCK_COPY);
g_signal_connect (priv->copy_button, "clicked",