[evolution-rss] setup feeds async
- From: Lucian Langa <lucilanga src gnome org>
- To: svn-commits-list gnome org
- Cc:
- Subject: [evolution-rss] setup feeds async
- Date: Tue, 19 Jan 2010 20:53:28 +0000 (UTC)
commit 8ccebbaec9f624f663bc172b78ae06629dd25fea
Author: Lucian Langa <lucilanga gnome org>
Date: Tue Jan 19 22:52:26 2010 +0200
setup feeds async
src/debug.h | 23 ++-
src/notification.c | 352 ++++++++++++++++++++++++++++++++++
src/notification.h | 20 ++
src/rss-config-factory.c | 49 ++---
src/rss-config-factory.h | 2 +-
src/rss.c | 473 ++++++++++++----------------------------------
src/rss.h | 3 +-
7 files changed, 536 insertions(+), 386 deletions(-)
---
diff --git a/src/debug.h b/src/debug.h
index 2a80610..98f2a78 100644
--- a/src/debug.h
+++ b/src/debug.h
@@ -1,14 +1,29 @@
+/* Evoution RSS Reader Plugin
+ * Copyright (C) 2007-2009 Lucian Langa <cooly gnome eu org>
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
#ifndef __DEBUG_H__
#define __DEBUG_H__ 1
#define d(f, x...) if (rss_verbose_debug) { g_print("%s(%d) %s():", __FILE__, __LINE__, __FUNCTION__);\
- g_print(f, ## x);\
- g_print("\n");}
+ g_print(f, ## x);}
#define dp(f, x...) { g_print("%s(%d) %s():", __FILE__, __LINE__, __FUNCTION__);\
- g_print(f, ## x);\
- g_print("\n");}
+ g_print(f, ## x);}
#endif /*__DEBUG_H__*/
diff --git a/src/notification.c b/src/notification.c
new file mode 100644
index 0000000..84d16ba
--- /dev/null
+++ b/src/notification.c
@@ -0,0 +1,352 @@
+/* Evoution RSS Reader Plugin
+ * Copyright (C) 2007-2009 Lucian Langa <cooly gnome eu org>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ */
+
+#include <glib.h>
+#include <gtk/gtk.h>
+#include <glib/gi18n.h>
+
+#include <e-util/e-alert-dialog.h>
+#include <mail/em-utils.h>
+#include <shell/e-shell-taskbar.h>
+#include <shell/e-shell-view.h>
+
+#include "notification.h"
+#include "rss.h"
+#include "network-soup.h"
+
+extern EShellView *rss_shell_view;
+extern rssfeed *rf;
+
+static void
+dialog_key_destroy (GtkWidget *widget, gpointer data)
+{
+ if (data)
+ g_hash_table_remove(rf->error_hash, data);
+}
+
+void
+err_destroy (GtkWidget *widget, guint response, gpointer data)
+{
+ gtk_widget_destroy(widget);
+ rf->errdialog = NULL;
+}
+
+void
+rss_error(gpointer key, gchar *name, gchar *error, gchar *emsg)
+{
+ GtkWidget *ed;
+ gchar *msg;
+ gpointer newkey;
+#if (EVOLUTION_VERSION >= 22900) //kb//
+ EShell *shell;
+ GtkWindow *parent;
+ GList *windows;
+#else
+ EActivityHandler *activity_handler;
+ guint id;
+#endif
+
+ if (name)
+ msg = g_strdup_printf("\n%s\n%s", name, emsg);
+ else
+ msg = g_strdup(emsg);
+
+#if (EVOLUTION_VERSION >= 22200)
+ if (key) {
+ if (!g_hash_table_lookup(rf->error_hash, key)) {
+// guint activity_id = g_hash_table_lookup(rf->activity, key);
+#if (EVOLUTION_VERSION >= 22900) //kb//
+ EShell *shell;
+ GtkWindow *parent;
+ GList *windows;
+
+ shell = e_shell_get_default ();
+ windows = e_shell_get_watched_windows (shell);
+ parent = (windows != NULL) ? GTK_WINDOW (windows->data) : NULL;
+
+ ed = e_alert_dialog_new_for_args(parent,
+ "org-gnome-evolution-rss:feederr",
+ error, msg, NULL);
+#else
+ ed = e_error_new(NULL, "org-gnome-evolution-rss:feederr",
+ error, msg, NULL);
+#endif
+ newkey = g_strdup(key);
+ g_signal_connect(
+ ed, "response",
+ G_CALLBACK(err_destroy),
+ NULL);
+ g_object_set_data (
+ (GObject *)ed, "response-handled",
+ GINT_TO_POINTER (TRUE));
+ g_signal_connect(ed,
+ "destroy",
+ G_CALLBACK(dialog_key_destroy),
+ newkey);
+ //lame widget destruction, seems e_activity timeout does not destroy it
+ g_timeout_add_seconds(60, (GSourceFunc)gtk_widget_destroy, ed);
+
+#if (EVOLUTION_VERSION >= 22900) //kb//
+ em_utils_show_error_silent(ed);
+ g_hash_table_insert(
+ rf->error_hash,
+ newkey,
+ GINT_TO_POINTER(1));
+
+#else
+ activity_handler = mail_component_peek_activity_handler (mail_component_peek());
+#if (EVOLUTION_VERSION >= 22203)
+ id = e_activity_handler_make_error (
+ activity_handler,
+ (char *)mail_component_peek(),
+ E_LOG_ERROR,
+ ed);
+#else
+ id = e_activity_handler_make_error (
+ activity_handler,
+ (char *)mail_component_peek(),
+ (gchar *)msg,
+ ed);
+#endif
+ g_hash_table_insert(rf->error_hash, newkey, GINT_TO_POINTER(id));
+#endif
+ }
+ goto out;
+ }
+#endif
+
+ if (!rf->errdialog) {
+#if (EVOLUTION_VERSION >= 22900) //kb//
+ shell = e_shell_get_default ();
+ windows = e_shell_get_watched_windows (shell);
+ parent = (windows != NULL) ? GTK_WINDOW (windows->data) : NULL;
+
+ ed = e_alert_dialog_new_for_args(parent,
+ "org-gnome-evolution-rss:feederr",
+ error, msg, NULL);
+#else
+ ed = e_error_new(NULL, "org-gnome-evolution-rss:feederr",
+ error, msg, NULL);
+#endif
+ g_signal_connect(ed, "response", G_CALLBACK(err_destroy), NULL);
+ gtk_widget_show(ed);
+ rf->errdialog = ed;
+ }
+
+out: g_free(msg);
+}
+
+
+void
+taskbar_push_message(gchar *message)
+{
+#if EVOLUTION_VERSION < 22900 //kb//
+ EActivityHandler *activity_handler = mail_component_peek_activity_handler (mail_component_peek ());
+ e_activity_handler_set_message(activity_handler, message);
+#else
+ EShellTaskbar *shell_taskbar;
+ shell_taskbar = e_shell_view_get_shell_taskbar (rss_shell_view);
+ e_shell_taskbar_set_message (shell_taskbar, message);
+#endif
+}
+
+void
+taskbar_pop_message(void)
+{
+#if EVOLUTION_VERSION < 22900 //kb//
+ EActivityHandler *activity_handler = mail_component_peek_activity_handler (mail_component_peek ());
+ e_activity_handler_unset_message(activity_handler);
+#else
+ EShellTaskbar *shell_taskbar;
+ shell_taskbar = e_shell_view_get_shell_taskbar (rss_shell_view);
+ e_shell_taskbar_set_message (shell_taskbar, "");
+#endif
+}
+
+void
+taskbar_op_abort(gpointer key)
+{
+#if EVOLUTION_VERSION < 22900 //kb//
+ EActivityHandler *activity_handler = mail_component_peek_activity_handler (mail_component_peek ());
+ guint activity_key = GPOINTER_TO_INT(g_hash_table_lookup(rf->activity, key));
+ if (activity_key)
+ e_activity_handler_operation_finished(activity_handler, activity_key);
+#endif
+ g_hash_table_remove(rf->activity, key);
+ abort_all_soup();
+}
+
+#if EVOLUTION_VERSION >= 22900 //kb//
+EActivity *
+#else
+guint
+#endif
+#if (EVOLUTION_VERSION >= 22200)
+taskbar_op_new(gchar *message, gpointer key);
+#else
+taskbar_op_new(gchar *message);
+#endif
+
+#if EVOLUTION_VERSION >= 22900 //kb//
+EActivity *
+#else
+guint
+#endif
+#if (EVOLUTION_VERSION >= 22200)
+taskbar_op_new(gchar *message, gpointer key)
+#else
+taskbar_op_new(gchar *message)
+#endif
+{
+#if EVOLUTION_VERSION >= 22900 //kb//
+ EShell *shell;
+ EShellBackend *shell_backend;
+ EActivity *activity;
+#else
+ EActivityHandler *activity_handler;
+ char *mcp;
+ guint activity_id;
+#endif
+#if EVOLUTION_VERSION < 22306
+ GdkPixbuf *progress_icon;
+#endif
+
+#if EVOLUTION_VERSION >= 22900 //kb//
+
+ shell = e_shell_get_default ();
+ shell_backend = e_shell_get_backend_by_name (shell, "mail");
+
+ activity = e_activity_new (message);
+ e_activity_set_allow_cancel (activity, TRUE);
+ e_activity_set_percent (activity, 0.0);
+ e_shell_backend_add_activity (shell_backend, activity);
+
+ g_signal_connect (
+ activity, "cancelled",
+ G_CALLBACK (taskbar_op_abort),
+ key);
+ return activity;
+#else
+ activity_handler = mail_component_peek_activity_handler (mail_component_peek ());
+ mcp = g_strdup_printf("%p", mail_component_peek());
+#if (EVOLUTION_VERSION >= 22306)
+ activity_id = e_activity_handler_cancelable_operation_started(activity_handler, "evolution-mail",
+ message, TRUE,
+ (void (*) (gpointer))taskbar_op_abort,
+ key);
+#else
+ progress_icon = e_icon_factory_get_icon ("mail-unread", E_ICON_SIZE_MENU);
+#if (EVOLUTION_VERSION >= 22200)
+ activity_id = e_activity_handler_cancelable_operation_started(activity_handler, "evolution-mail",
+ progress_icon, message, TRUE,
+ (void (*) (gpointer))taskbar_op_abort,
+ key);
+#else
+ e_activity_handler_operation_started(activity_handler, mcp,
+ progress_icon, message, FALSE);
+#endif
+#endif
+ g_free(mcp);
+ return activity_id;
+#endif //kb//
+}
+
+void
+taskbar_op_set_progress(gchar *key, gchar *msg, gdouble progress)
+{
+#if (EVOLUTION_VERSION < 22900) //kb//
+ EActivityHandler *activity_handler = mail_component_peek_activity_handler (mail_component_peek ());
+ guint activity_id = GPOINTER_TO_INT(g_hash_table_lookup(rf->activity, key));
+#else
+ EActivity *activity_id = g_hash_table_lookup(rf->activity, key);
+#endif
+
+ if (activity_id) {
+#if (EVOLUTION_VERSION < 22900) //kb//
+ e_activity_handler_operation_progressing(activity_handler,
+ activity_id,
+ g_strdup(msg),
+ progress);
+#else
+ e_activity_set_percent (activity_id, progress);
+#endif
+ }
+}
+
+void
+taskbar_op_finish(gchar *key)
+{
+#if EVOLUTION_VERSION < 22900 //kb//
+ EActivityHandler *activity_handler = mail_component_peek_activity_handler (mail_component_peek ());
+#endif
+ if (rf->activity) {
+#if EVOLUTION_VERSION < 22900 //kb//
+ guint activity_key = GPOINTER_TO_INT(g_hash_table_lookup(rf->activity, key));
+#else
+ EActivity *activity_key = g_hash_table_lookup(rf->activity, key);
+#endif
+ g_print("activity_key:%p\n", activity_key);
+ if (activity_key)
+#if EVOLUTION_VERSION < 22900 //kb//
+ e_activity_handler_operation_finished(activity_handler, activity_key);
+#else
+ e_activity_complete (activity_key);
+#endif
+ g_hash_table_remove(rf->activity, key);
+ }
+}
+
+void
+taskbar_op_message(gchar *msg)
+{
+ gchar *tmsg;
+#if (EVOLUTION_VERSION >= 22900) //kb//
+ EActivity *activity_id;
+#else
+#if (EVOLUTION_VERSION >= 22200)
+ guint activity_id;
+#endif
+#endif
+ if (!msg)
+ tmsg = g_strdup_printf(_("Fetching Feeds (%d enabled)"), g_hash_table_size(rf->hrname));
+ else
+ tmsg = g_strdup(msg);
+
+#if (EVOLUTION_VERSION >= 22900) //kb//
+// if (!msg)
+ activity_id = (EActivity *)taskbar_op_new(tmsg, (gchar *)"main");
+// else
+// activity_id = (EActivity *)taskbar_op_new(tmsg, msg);
+#else
+#if (EVOLUTION_VERSION >= 22200)
+// if (!msg)
+ activity_id = taskbar_op_new(tmsg, (gchar *)"main");
+// else
+// activity_id = taskbar_op_new(tmsg, msg);
+#else
+ activity_id = taskbar_op_new(tmsg);
+#endif
+#endif
+// if (!tmsg)
+ g_hash_table_insert(rf->activity, (gchar *)"main", GUINT_TO_POINTER(activity_id));
+// else
+// g_hash_table_insert(rf->activity, msg, GUINT_TO_POINTER(activity_id));
+ g_free(tmsg);
+ return activity_id;
+}
+
diff --git a/src/notification.h b/src/notification.h
new file mode 100644
index 0000000..6a9bccb
--- /dev/null
+++ b/src/notification.h
@@ -0,0 +1,20 @@
+/* Evoution RSS Reader Plugin
+ * Copyright (C) 2007-2009 Lucian Langa <cooly gnome eu org>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ */
+
+void taskbar_op_message(gchar *msg);
+void taskbar_op_abort(gpointer key);
diff --git a/src/rss-config-factory.c b/src/rss-config-factory.c
index 4c32b51..6188e92 100644
--- a/src/rss-config-factory.c
+++ b/src/rss-config-factory.c
@@ -36,8 +36,9 @@
#include <mail/em-config.h>
#if EVOLUTION_VERSION < 22900 //kb//
-#include <shell/evolution-config-control.h>
#include <bonobo/bonobo-shlib-factory.h>
+#include <e-util/e-error.h>
+#include <shell/evolution-config-control.h>
#else
#include <e-util/e-alert-dialog.h>
#include <misc/e-preferences-window.h>
@@ -45,7 +46,6 @@
#include <shell/e-shell.h>
#endif
-#include <e-util/e-error.h>
#ifdef HAVE_LIBSOUP_GNOME
#include <libsoup/soup-gnome.h>
@@ -203,6 +203,7 @@ enable_toggle_cb(GtkCellRendererToggle *cell,
gchar *name;
gboolean fixed;
+g_print("enable_toggle_cb()\n");
gtk_tree_model_get_iter (model, &iter, path);
gtk_tree_model_get (model, &iter, 0, &fixed, -1);
gtk_tree_model_get (model, &iter, 3, &name, -1);
@@ -569,9 +570,9 @@ build_dialog_add(gchar *url, gchar *feed_text)
g_signal_connect(useauth, "toggled", G_CALLBACK(disable_widget_cb), gui);
ok = GTK_WIDGET (gtk_builder_get_object(gui, "ok_button"));
- /*Gtk-CRITICAL **: gtk_box_pack: assertion `child->parent == NULL' failed*/
- gtk_dialog_add_action_widget (GTK_DIALOG (dialog1), ok, GTK_RESPONSE_OK);
GTK_WIDGET_SET_FLAGS (ok, GTK_CAN_DEFAULT);
+ dp("/*Gtk-CRITICAL **: gtk_box_pack: assertion `child->parent == NULL' failed*/");
+ gtk_dialog_add_action_widget (GTK_DIALOG (dialog1), ok, GTK_RESPONSE_OK);
cancel = GTK_WIDGET (gtk_builder_get_object(gui, "cancel_button"));
gtk_dialog_add_action_widget (GTK_DIALOG (dialog1), cancel, GTK_RESPONSE_CANCEL);
@@ -750,7 +751,7 @@ feeds_dialog_add(GtkDialog *d, gpointer data)
gtk_progress_bar_set_fraction((GtkProgressBar *)progress, 0);
/* xgettext:no-c-format */
gtk_progress_bar_set_text((GtkProgressBar *)progress, _("0% done"));
- feed->progress=progress;
+ feed->progress = progress;
gtk_window_set_keep_above(GTK_WINDOW(msg_feeds), TRUE);
g_signal_connect(
msg_feeds,
@@ -772,11 +773,10 @@ feeds_dialog_add(GtkDialog *d, gpointer data)
goto out;
}
setup_feed(feed);
- store_redraw((GtkTreeView *)data);
- save_gconf_feed();
}
-out: gtk_widget_destroy(msg_feeds);
- g_free(feed);
+out: dp("msg_feeds destroy\n");
+ gtk_widget_destroy(msg_feeds);
+ feed->progress = NULL;
}
static void
@@ -1248,10 +1248,9 @@ import_dialog_response(GtkWidget *selector, guint response, gpointer user_data)
rf->cancel = 1;
}
-gboolean
+void
import_one_feed(gchar *url, gchar *title, gchar *prefix)
{
- guint res;
add_feed *feed = g_new0(add_feed, 1);
feed->changed=0;
feed->add=1;
@@ -1260,7 +1259,7 @@ import_one_feed(gchar *url, gchar *title, gchar *prefix)
feed->enabled = feed_enabled;
feed->feed_url = g_strdup(url);
feed->feed_name = decode_html_entities(title);
- feed->prefix = prefix;
+ feed->prefix = g_strdup(prefix);
/* we'll get rid of this as soon as we fetch unblocking */
if (g_hash_table_find(rf->hr,
check_if_match,
@@ -1269,12 +1268,7 @@ import_one_feed(gchar *url, gchar *title, gchar *prefix)
_("Feed already exists!"));
return FALSE;
}
- res = setup_feed(feed);
- d("feed imported:%d\n", res);
- g_free(feed->feed_url);
- g_free(feed->feed_name);
- g_free(feed);
- return res;
+ setup_feed(feed);
}
/*
@@ -1491,11 +1485,10 @@ import_opml(gchar *file)
gtk_label_set_ellipsize (GTK_LABEL (import_label), PANGO_ELLIPSIZE_START);
#endif
gtk_label_set_justify(GTK_LABEL(import_label), GTK_JUSTIFY_CENTER);
-
- g_print("rssprefix:%s\n", rssprefix);
- g_print("rssurl:%s\n", rssurl);
- g_print("rsstitle:%s\n", rsstitle);
+
+ dp("rssprefix:%s rssurl:%s rsstitle:%s\n", rssprefix, rssurl, rsstitle);
import_one_feed(rssurl, rsstitle, rssprefix);
+ dp("import done\n");
if (rssurl) xmlFree(rssurl);
if (rsstitle) xmlFree(rsstitle);
fail: while (gtk_events_pending ())
@@ -1508,10 +1501,6 @@ fail: while (gtk_events_pending ())
gtk_progress_bar_set_text((GtkProgressBar *)import_progress, what);
g_free(what);
g_free(rssprefix);
- while (gtk_events_pending ())
- gtk_main_iteration ();
- store_redraw(GTK_TREE_VIEW(rf->treeview));
- save_gconf_feed();
}
xmlFree(prop);
// }
@@ -1547,8 +1536,6 @@ fail: while (gtk_events_pending ())
g_free(what);
while (gtk_events_pending ())
gtk_main_iteration ();
- store_redraw(GTK_TREE_VIEW(rf->treeview));
- save_gconf_feed();
}
}
while (gtk_events_pending ())
@@ -2429,8 +2416,9 @@ void rss_folder_factory_commit (EPlugin *epl, EConfigTarget *target)
GtkWidget *ttl_value, *feed_name_entry;
GtkWidget *authuser, *authpass, *useauth;
gchar *feed_name;
- gboolean fhtml, auth_enabled;
+ gboolean fhtml, auth_enabled, found;
guint i=0;
+ gchar *key = NULL;
add_feed *feed = (add_feed *)g_object_get_data((GObject *)epl, "add-feed");
gchar *url = (gchar *)g_object_get_data((GObject *)epl, "url");
@@ -2445,6 +2433,9 @@ void rss_folder_factory_commit (EPlugin *epl, EConfigTarget *target)
|| !g_ascii_strcasecmp(folder, main_folder))
return;
+ key = lookup_key(ofolder);
+ if (!key) return;
+
gtk_widget_set_sensitive(target->config->widget, FALSE);
entry1 = GTK_WIDGET (gtk_builder_get_object(feed->gui, "url_entry"));
diff --git a/src/rss-config-factory.h b/src/rss-config-factory.h
index 47b7ac1..fc7c989 100644
--- a/src/rss-config-factory.h
+++ b/src/rss-config-factory.h
@@ -41,7 +41,7 @@ void feeds_dialog_disable(GtkDialog *d, gpointer data);
GtkWidget *remove_feed_dialog(gchar *msg);
void feeds_dialog_delete(GtkDialog *d, gpointer data);
void process_dialog_edit(add_feed *feed, gchar *url, gchar *feed_name);
-gboolean import_one_feed(gchar *url, gchar *title, gchar *prefix);
+void import_one_feed(gchar *url, gchar *title, gchar *prefix);
xmlNode *iterate_import_file(xmlNode *src, gchar **url, xmlChar **title, guint type);
#if LIBSOUP_VERSION >= 2026000
SoupCookieJar *import_cookies(gchar *file);
diff --git a/src/rss.c b/src/rss.c
index 60bfce6..aff37b8 100644
--- a/src/rss.c
+++ b/src/rss.c
@@ -36,7 +36,6 @@ int rss_verbose_debug = 0;
#include <camel/camel-stream-fs.h>
#include <camel/camel-text-index.h>
-#include <e-util/e-error.h>
#include <e-util/e-icon-factory.h>
#include <e-util/e-mktemp.h>
#include <e-util/e-util.h>
@@ -50,6 +49,7 @@ int rss_verbose_debug = 0;
#include <mail/em-folder-tree.h>
#if EVOLUTION_VERSION < 22900 //kb//
+#include <e-util/e-error.h>
#include <mail/em-popup.h>
#include <mail/em-folder-view.h>
#include <mail/em-format.h>
@@ -57,12 +57,11 @@ int rss_verbose_debug = 0;
#include <misc/e-activity-handler.h>
#include <bonobo/bonobo-shlib-factory.h>
#else
-#include <e-util/e-alert-dialog.h>
+#include <e-util/e-alert-dialog.h> //remove//
#include <glib/gi18n.h>
#include <mail/e-mail-local.h>
#include <mail/mail-session.h>
#include <shell/e-shell.h>
-#include <shell/e-shell-taskbar.h>
#include <shell/e-shell-view.h>
#include <misc/e-popup-menu.h>
#include <misc/e-gui-utils.h>
@@ -143,6 +142,7 @@ int rss_verbose_debug = 0;
#include "rss.h"
#include "parser.h"
#include "network-soup.h"
+#include "notification.h"
#include "file-gio.h"
#include "fetch.h"
#include "misc.h"
@@ -254,8 +254,6 @@ gboolean fetch_feed(gpointer key, gpointer value, gpointer user_data);
gboolean custom_fetch_feed(gpointer key, gpointer value, gpointer user_data);
void fetch_comments(gchar *url, EMFormatHTML *stream);
-static void
-dialog_key_destroy (GtkWidget *widget, gpointer data);
guint fallback_engine(void);
gchar *print_comments(gchar *url, gchar *stream);
@@ -332,110 +330,6 @@ void error_response(GtkObject *o, int button, void *data)
gtk_widget_destroy((GtkWidget *)o);
}
-void
-rss_error(gpointer key, gchar *name, gchar *error, gchar *emsg)
-{
- GtkWidget *ed;
- gchar *msg;
- gpointer newkey;
-#if (EVOLUTION_VERSION >= 22900) //kb//
- EShell *shell;
- GtkWindow *parent;
- GList *windows;
-#else
- EActivityHandler *activity_handler;
- guint id;
-#endif
-
- if (name)
- msg = g_strdup_printf("\n%s\n%s", name, emsg);
- else
- msg = g_strdup(emsg);
-
-#if (EVOLUTION_VERSION >= 22200)
- if (key) {
- if (!g_hash_table_lookup(rf->error_hash, key)) {
-// guint activity_id = g_hash_table_lookup(rf->activity, key);
-#if (EVOLUTION_VERSION >= 22900) //kb//
- EShell *shell;
- GtkWindow *parent;
- GList *windows;
-
- shell = e_shell_get_default ();
- windows = e_shell_get_watched_windows (shell);
- parent = (windows != NULL) ? GTK_WINDOW (windows->data) : NULL;
-
- ed = e_alert_dialog_new_for_args(parent,
- "org-gnome-evolution-rss:feederr",
- error, msg, NULL);
-#else
- ed = e_error_new(NULL, "org-gnome-evolution-rss:feederr",
- error, msg, NULL);
-#endif
- newkey = g_strdup(key);
- g_signal_connect(
- ed, "response",
- G_CALLBACK(err_destroy),
- NULL);
- g_object_set_data (
- (GObject *)ed, "response-handled",
- GINT_TO_POINTER (TRUE));
- g_signal_connect(ed,
- "destroy",
- G_CALLBACK(dialog_key_destroy),
- newkey);
- //lame widget destruction, seems e_activity timeout does not destroy it
- g_timeout_add_seconds(60, (GSourceFunc)gtk_widget_destroy, ed);
-
-#if (EVOLUTION_VERSION >= 22900) //kb//
- em_utils_show_error_silent(ed);
- g_hash_table_insert(
- rf->error_hash,
- newkey,
- GINT_TO_POINTER(1));
-
-#else
- activity_handler = mail_component_peek_activity_handler (mail_component_peek());
-#if (EVOLUTION_VERSION >= 22203)
- id = e_activity_handler_make_error (
- activity_handler,
- (char *)mail_component_peek(),
- E_LOG_ERROR,
- ed);
-#else
- id = e_activity_handler_make_error (
- activity_handler,
- (char *)mail_component_peek(),
- (gchar *)msg,
- ed);
-#endif
- g_hash_table_insert(rf->error_hash, newkey, GINT_TO_POINTER(id));
-#endif
- }
- goto out;
- }
-#endif
-
- if (!rf->errdialog) {
-#if (EVOLUTION_VERSION >= 22900) //kb//
- shell = e_shell_get_default ();
- windows = e_shell_get_watched_windows (shell);
- parent = (windows != NULL) ? GTK_WINDOW (windows->data) : NULL;
-
- ed = e_alert_dialog_new_for_args(parent,
- "org-gnome-evolution-rss:feederr",
- error, msg, NULL);
-#else
- ed = e_error_new(NULL, "org-gnome-evolution-rss:feederr",
- error, msg, NULL);
-#endif
- g_signal_connect(ed, "response", G_CALLBACK(err_destroy), NULL);
- gtk_widget_show(ed);
- rf->errdialog = ed;
- }
-
-out: g_free(msg);
-}
void
cancel_active_op(gpointer key)
@@ -446,195 +340,6 @@ cancel_active_op(gpointer key)
cancel_soup_sess(key_session, value, NULL);
}
-void
-taskbar_push_message(gchar *message)
-{
-#if EVOLUTION_VERSION < 22900 //kb//
- EActivityHandler *activity_handler = mail_component_peek_activity_handler (mail_component_peek ());
- e_activity_handler_set_message(activity_handler, message);
-#else
- EShellTaskbar *shell_taskbar;
- shell_taskbar = e_shell_view_get_shell_taskbar (rss_shell_view);
- e_shell_taskbar_set_message (shell_taskbar, message);
-#endif
-}
-
-void
-taskbar_pop_message(void)
-{
-#if EVOLUTION_VERSION < 22900 //kb//
- EActivityHandler *activity_handler = mail_component_peek_activity_handler (mail_component_peek ());
- e_activity_handler_unset_message(activity_handler);
-#else
- EShellTaskbar *shell_taskbar;
- shell_taskbar = e_shell_view_get_shell_taskbar (rss_shell_view);
- e_shell_taskbar_set_message (shell_taskbar, "");
-#endif
-}
-
-void
-taskbar_op_abort(gpointer key)
-{
-#if EVOLUTION_VERSION < 22900 //kb//
- EActivityHandler *activity_handler = mail_component_peek_activity_handler (mail_component_peek ());
- guint activity_key = GPOINTER_TO_INT(g_hash_table_lookup(rf->activity, key));
- if (activity_key)
- e_activity_handler_operation_finished(activity_handler, activity_key);
-#endif
- g_hash_table_remove(rf->activity, key);
- abort_all_soup();
-}
-
-#if EVOLUTION_VERSION >= 22900 //kb//
-EActivity *
-#else
-guint
-#endif
-#if (EVOLUTION_VERSION >= 22200)
-taskbar_op_new(gchar *message, gpointer key);
-#else
-taskbar_op_new(gchar *message);
-#endif
-
-#if EVOLUTION_VERSION >= 22900 //kb//
-EActivity *
-#else
-guint
-#endif
-#if (EVOLUTION_VERSION >= 22200)
-taskbar_op_new(gchar *message, gpointer key)
-#else
-taskbar_op_new(gchar *message)
-#endif
-{
-#if EVOLUTION_VERSION >= 22900 //kb//
- EShell *shell;
- EShellBackend *shell_backend;
- EActivity *activity;
-#else
- EActivityHandler *activity_handler;
- char *mcp;
- guint activity_id;
-#endif
-#if EVOLUTION_VERSION < 22306
- GdkPixbuf *progress_icon;
-#endif
-
-#if EVOLUTION_VERSION >= 22900 //kb//
-
- shell = e_shell_get_default ();
- shell_backend = e_shell_get_backend_by_name (shell, "mail");
-
- activity = e_activity_new (message);
- e_activity_set_allow_cancel (activity, TRUE);
- e_activity_set_percent (activity, 0.0);
- e_shell_backend_add_activity (shell_backend, activity);
-
- g_signal_connect (
- activity, "cancelled",
- G_CALLBACK (taskbar_op_abort),
- key);
- return activity;
-#else
- activity_handler = mail_component_peek_activity_handler (mail_component_peek ());
- mcp = g_strdup_printf("%p", mail_component_peek());
-#if (EVOLUTION_VERSION >= 22306)
- activity_id = e_activity_handler_cancelable_operation_started(activity_handler, "evolution-mail",
- message, TRUE,
- (void (*) (gpointer))taskbar_op_abort,
- key);
-#else
- progress_icon = e_icon_factory_get_icon ("mail-unread", E_ICON_SIZE_MENU);
-#if (EVOLUTION_VERSION >= 22200)
- activity_id = e_activity_handler_cancelable_operation_started(activity_handler, "evolution-mail",
- progress_icon, message, TRUE,
- (void (*) (gpointer))taskbar_op_abort,
- key);
-#else
- e_activity_handler_operation_started(activity_handler, mcp,
- progress_icon, message, FALSE);
-#endif
-#endif
- g_free(mcp);
- return activity_id;
-#endif //kb//
-}
-
-void
-taskbar_op_set_progress(gchar *key, gchar *msg, gdouble progress)
-{
-#if (EVOLUTION_VERSION < 22900) //kb//
- EActivityHandler *activity_handler = mail_component_peek_activity_handler (mail_component_peek ());
- guint activity_id = GPOINTER_TO_INT(g_hash_table_lookup(rf->activity, key));
-#else
- EActivity *activity_id = g_hash_table_lookup(rf->activity, key);
-#endif
-
- if (activity_id) {
-#if (EVOLUTION_VERSION < 22900) //kb//
- e_activity_handler_operation_progressing(activity_handler,
- activity_id,
- g_strdup(msg),
- progress);
-#else
- e_activity_set_percent (activity_id, progress);
-#endif
- }
-}
-
-void
-taskbar_op_finish(gchar *key)
-{
-#if EVOLUTION_VERSION < 22900 //kb//
- EActivityHandler *activity_handler = mail_component_peek_activity_handler (mail_component_peek ());
-#endif
- if (rf->activity) {
-#if EVOLUTION_VERSION < 22900 //kb//
- guint activity_key = GPOINTER_TO_INT(g_hash_table_lookup(rf->activity, key));
-#else
- EActivity *activity_key = g_hash_table_lookup(rf->activity, key);
-#endif
- g_print("activity_key:%p\n", activity_key);
- if (activity_key)
-#if EVOLUTION_VERSION < 22900 //kb//
- e_activity_handler_operation_finished(activity_handler, activity_key);
-#else
- e_activity_complete (activity_key);
-#endif
- g_hash_table_remove(rf->activity, key);
- }
-}
-
-void
-taskbar_op_message(gchar *msg)
-{
- gchar *tmsg;
-#if (EVOLUTION_VERSION >= 22900) //kb//
- EActivity *activity_id;
-#else
-#if (EVOLUTION_VERSION >= 22200)
- guint activity_id;
-#endif
-#endif
-
- if (!msg)
- tmsg = g_strdup_printf(_("Fetching Feeds (%d enabled)"), g_hash_table_size(rf->hrname));
- else
- tmsg = g_strdup(msg);
-
-#if (EVOLUTION_VERSION >= 22900) //kb//
- activity_id = (EActivity *)taskbar_op_new(tmsg, (gchar *)"main");
-#else
-#if (EVOLUTION_VERSION >= 22200)
- activity_id = taskbar_op_new(tmsg, (gchar *)"main");
-#else
- activity_id = taskbar_op_new(tmsg);
-#endif
-#endif
- g_hash_table_insert(rf->activity, (gchar *)"main", GUINT_TO_POINTER(activity_id));
- g_free(tmsg);
-}
-
static void
statuscb(NetStatusType status, gpointer statusdata, gpointer data)
{
@@ -1203,20 +908,6 @@ rss_select_folder(gchar *folder_name)
#endif
}
-static void
-dialog_key_destroy (GtkWidget *widget, gpointer data)
-{
- if (data)
- g_hash_table_remove(rf->error_hash, data);
-}
-
-void
-err_destroy (GtkWidget *widget, guint response, gpointer data)
-{
- gtk_widget_destroy(widget);
- rf->errdialog = NULL;
-}
-
static gboolean
xml_set_content (xmlNodePtr node, char **val)
{
@@ -2961,21 +2652,27 @@ prepare_hashes(void)
NULL);
}
-gboolean
-setup_feed(add_feed *feed)
+void
+finish_setup_feed(SoupSession *soup_sess,
+ SoupMessage *msg,
+ add_feed *user_data);
+
+void
+finish_setup_feed(SoupSession *soup_sess, SoupMessage *msg, add_feed *user_data)
{
guint ret = 0;
guint ttl;
+ add_feed *feed = (add_feed *)user_data;
RDF *r = NULL;
- GString *post = NULL, *content = NULL;
- GError *err = NULL;
+ GString *content = NULL;
gchar *chn_name = NULL, *tmp_chn_name = NULL, *tmp = NULL;
gchar *real_name, *rssurl, *tmpkey, *ver;
- xmlDocPtr doc;
- xmlNodePtr root;
+ xmlDocPtr doc = NULL;
+ xmlNodePtr root = NULL;
gpointer crc_feed;
-
- check_folders();
+ gchar *tmsgkey;
+ GError *err = NULL;
+ gchar *tmsg = feed->tmsg;
r = g_new0 (RDF, 1);
r->shown = TRUE;
@@ -2983,34 +2680,36 @@ setup_feed(add_feed *feed)
prepare_hashes();
rf->pending = TRUE;
+ tmsgkey = tmsg;
+// taskbar_op_set_progress(tmsgkey, tmsg, 0.4);
- if (!feed->validate)
- goto add;
-
-top: d("adding feed->feed_url:%s\n", feed->feed_url);
- content = fetch_blocking(
- feed->feed_url,
- NULL,
- post,
- textcb,
- rf,
- &err);
- if (err) {
- g_print("setup_feed() -> err:%s\n", err->message);
+ if (msg->status_code != SOUP_STATUS_OK &&
+ msg->status_code != SOUP_STATUS_CANCELLED) {
+ g_set_error(&err, NET_ERROR, NET_ERROR_GENERIC, "%s",
+ soup_status_get_phrase(msg->status_code));
tmpkey = gen_md5(feed->feed_url);
rss_error(tmpkey,
feed->feed_name ? feed->feed_name: _("Unamed feed"),
- _("Error while fetching feed."),
+ _("Error while setting up feed."),
err->message);
g_free(tmpkey);
goto out;
- }
- doc = NULL;
- root = NULL;
+ }
+
+ if (!msg->response_body->length)
+ goto out;
+
+ if (msg->status_code == SOUP_STATUS_CANCELLED)
+ goto out;
+
+ content = g_string_new_len((gchar *)(msg->response_body->data),
+ msg->response_body->length);
+
xmlSubstituteEntitiesDefaultValue = 0;
doc = xml_parse_sux (content->str, content->len);
d("content:\n%s\n", content->str);
root = xmlDocGetRootElement(doc);
+// taskbar_op_set_progress(tmsgkey, tmsg, 0.5);
if ((doc != NULL && root != NULL)
&& (strcasestr((char *)root->name, "rss")
@@ -3024,6 +2723,8 @@ top: d("adding feed->feed_url:%s\n", feed->feed_url);
//and later display the actual feed (once rf-> structure is
//properly populated
chn_name = process_feed(r);
+// taskbar_op_set_progress(tmsgkey, tmsg, 0.6);
+
add:
//feed name can only come from an import so we rather prefer
//resulted channel name instead of supplied one
@@ -3041,6 +2742,9 @@ add:
tmp = chn_name;
chn_name = generate_safe_chn_name(chn_name);
+// tmsg = g_strdup_printf(_("Adding feed %s"), chn_name);
+// taskbar_op_set_progress(tmsgkey, tmsg, 0.7);
+
crc_feed = gen_md5(feed->feed_url);
g_hash_table_insert(rf->hrname,
g_strdup(chn_name),
@@ -3081,6 +2785,7 @@ add:
g_hash_table_insert(rf->hrupdate,
g_strdup(crc_feed),
GINT_TO_POINTER(feed->update));
+// taskbar_op_set_progress(tmsgkey, tmsg, 0.8);
ver = NULL;
if (r->type && r->version)
@@ -3115,22 +2820,30 @@ add:
feed->feed_name,
NULL);
gchar *b = g_build_path("/", r->title, NULL);
+ g_print("update_feed_folder\n");
update_feed_folder(b, a, 0);
+ g_print("update_feed_folder done\n");
g_free(a);
g_free(b);
}
-
- if (feed->validate)
- display_feed(r);
-
+ if (rf->treeview)
+ store_redraw(GTK_TREE_VIEW(rf->treeview));
+ save_gconf_feed();
real_name = g_strdup_printf(
"%s/%s",
lookup_main_folder(),
lookup_feed_folder(chn_name));
+ d("select folder:%s\n", real_name);
rss_select_folder(real_name);
g_free(real_name);
+ if (feed->validate)
+ display_feed(r);
+
+// taskbar_op_set_progress(tmsgkey, tmsg, 0.9);
+
+
g_free(tmp_chn_name);
g_free(tmp);
g_free(chn_name);
@@ -3151,8 +2864,9 @@ add:
goto out;
}
+ /* <SEARCH FOR FEED> */
//search for a feed entry
- rssurl = search_rss(content->str, content->len);
+/* rssurl = search_rss(content->str, content->len);
if (rssurl) {
if (doc)
xmlFreeDoc(doc);
@@ -3171,15 +2885,68 @@ add:
goto out;
}
goto top;
- }
+ }*/
+ /* <SEARCH FOR FEED> */
- rss_error(NULL, NULL,
+ dp("general error\n");
+ tmpkey = gen_md5(feed->feed_url);
+ rss_error(tmpkey, NULL,
_("Error while fetching feed."),
_("Invalid Feed"));
- ret = 0;
+ g_free(tmpkey);
out: rf->pending = FALSE;
- return ret;
+// taskbar_op_finish(tmsgkey);
+ g_free(feed->feed_url);
+ if (feed->feed_name) g_free(feed->feed_name);
+ if (feed->prefix) g_free(feed->prefix);
+ g_free(feed->tmsg);
+ g_free(feed);
+}
+
+gboolean
+setup_feed(add_feed *feed)
+{
+ RDF *r = NULL;
+ GError *err = NULL;
+ gchar *tmsg, *tmpkey;
+
+ tmsg = g_strdup_printf(_("Adding feed %s"),
+ feed->feed_name ? feed->feed_name :"unnamed");
+ feed->tmsg = tmsg;
+// taskbar_op_message(tmsg);
+
+ check_folders();
+
+ r = g_new0 (RDF, 1);
+ r->shown = TRUE;
+
+ prepare_hashes();
+
+ rf->pending = TRUE;
+
+// if (!feed->validate)
+// goto add;
+
+ d("adding feed->feed_url:%s\n", feed->feed_url);
+ fetch_unblocking(
+ feed->feed_url,
+ textcb,
+ NULL,
+ (gpointer)finish_setup_feed,
+ feed, // we need to dupe key here
+ 1,
+ &err); // because we might lose it if
+ if (err) {
+ g_print("setup_feed() -> err:%s\n", err->message);
+ tmpkey = gen_md5(feed->feed_url);
+ rss_error(tmpkey,
+ feed->feed_name ? feed->feed_name: _("Unamed feed"),
+ _("Error while fetching feed."),
+ err->message);
+ g_free(tmpkey);
+ }
+ return TRUE;
}
void
@@ -3269,8 +3036,11 @@ generic_finish_feed(rfMessage *msg, gpointer user_data)
if (rf->feed_queue) {
rf->feed_queue--;
- tmsg = g_strdup_printf(_("Fetching Feeds (%d enabled)"), rss_find_enabled());
- taskbar_op_set_progress((gchar *)"main", tmsg, rf->feed_queue ? 1-(gdouble)((rf->feed_queue*100/rss_find_enabled()))/100: 1);
+ tmsg = g_strdup_printf(_("Fetching Feeds (%d enabled)"),
+ rss_find_enabled());
+ taskbar_op_set_progress((gchar *)"main",
+ tmsg,
+ rf->feed_queue ? 1-(gdouble)((rf->feed_queue*100/rss_find_enabled()))/100 : 1);
g_free(tmsg);
}
@@ -5235,7 +5005,10 @@ create_mail(create_feed *CF)
camel_folder_append_message(mail_folder, new, info, &appended_uid, ex);
- if (appended_uid != NULL) {
+ /* no point in filtering mails at import time as it just
+ * wastes time, user can setup his own afterwards
+ */
+ if (appended_uid != NULL && !rf->import) {
filter_uids = g_ptr_array_sized_new(1);
g_ptr_array_add(filter_uids, appended_uid);
mail_filter_on_demand (mail_folder, filter_uids);
@@ -5512,7 +5285,6 @@ display_folder_icon(GtkTreeStore *tree_store, gchar *key)
rss_folder = camel_store_get_folder (store, full_name, 0, NULL);
if (!rss_folder) {
g_free(full_name);
- camel_object_unref(rss_folder);
result = FALSE;
goto out;
}
@@ -5532,6 +5304,7 @@ display_folder_icon(GtkTreeStore *tree_store, gchar *key)
si = em_folder_tree_model_lookup_store_info (
EM_FOLDER_TREE_MODEL (mod), store);
#endif
+dp("full_name:%s\n", full_name);
row = g_hash_table_lookup (si->full_hash, full_name);
path = gtk_tree_row_reference_get_path (row);
gtk_tree_model_get_iter ((GtkTreeModel *)tree_store, &iter, path);
diff --git a/src/rss.h b/src/rss.h
index ba395d1..b678fa7 100644
--- a/src/rss.h
+++ b/src/rss.h
@@ -207,6 +207,7 @@ typedef struct ADD_FEED {
gchar *feed_url;
gchar *feed_name;
gchar *prefix;
+ gchar *tmsg; //status bar message
gboolean fetch_html; //show webpage instead of summary
gboolean add; //ok button
gboolean changed;
@@ -321,8 +322,6 @@ guint rss_find_enabled(void);
void error_destroy(GtkObject *o, void *data);
void error_response(GtkObject *o, int button, void *data);
void cancel_active_op(gpointer key);
-void taskbar_op_message(gchar *msg);
-void taskbar_op_abort(gpointer key);
void browser_write(gchar *string, gint length, gchar *base);
void user_pass_cb(RSS_AUTH *auth_info, gint response, GtkDialog *dialog);
gboolean proxy_auth_dialog(gchar *title, gchar *user, gchar *pass);
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]