[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Bug#597240: unblock: evolution-rss/0.2.0-1



Package: release.debian.org
Severity: normal
User: release.debian.org@packages.debian.org
Usertags: freeze-exception

Please unblock evolution-rss for squeeze.

evolution-rss (0.2.0-1) unstable; urgency=low

  * New upstream stable release.

The changes are fairly large but it allows to stick with a stable
release instead of a git snapshot. Furthermore it’s not an important
package so you can just drop if from the release if it’s not suitable
anymore. 

Cheers,
-- 
 .''`.      Josselin Mouette
: :' :
`. `'  “If you behave this way because you are blackmailed by someone,
  `-    […] I will see what I can do for you.”  -- Jörg Schilling


--- evolution-rss-0.1.9//src/dbus.c	2010-05-19 10:58:13.000000000 +0200
+++ evolution-rss-0.2.0//src/dbus.c	2010-07-09 17:01:15.000000000 +0200
@@ -141,6 +141,7 @@ filter_function (DBusConnection *connect
 			g_print("Feed received, but error getting message: %s\n", error.message);
 			dbus_error_free (&error);
 		}
+		g_free(feed);
 		return DBUS_HANDLER_RESULT_HANDLED;
 	}
 	else if (dbus_message_is_signal (message, DBUS_INTERFACE, "ping")) {
--- evolution-rss-0.1.9//src/misc.c	2010-05-19 10:58:13.000000000 +0200
+++ evolution-rss-0.2.0//src/misc.c	2010-07-10 11:39:45.000000000 +0200
@@ -135,6 +135,8 @@ dup_auth_data(gchar *origurl, gchar *url
 {
 	gchar *user = g_hash_table_lookup(rf->hruser, origurl);
 	gchar *pass = g_hash_table_lookup(rf->hrpass, origurl);
+	d("origurl / url:%s / %s\n", origurl, url);
+	d("user / pass:%s / %s\n", user, pass);
 	if (user && pass) {
 		g_hash_table_insert(rf->hruser, url, g_strdup(user));
 		g_hash_table_insert(rf->hrpass, url, g_strdup(pass));
@@ -580,10 +582,10 @@ feed_remove_status_line(gchar *file_name
 			}
 		}
 		fclose(fr);
-		fclose(fw);
 		g_unlink(file_name);
 		g_rename(tmp, file_name);
 	}
+	fclose(fw);
 	g_free(tmpneedle);
 }
 
--- evolution-rss-0.1.9//src/misc.h	2010-05-19 10:58:13.000000000 +0200
+++ evolution-rss-0.2.0//src/misc.h	2010-06-03 15:35:36.000000000 +0200
@@ -51,8 +51,5 @@ void feed_remove_status_line(gchar *file
 void write_feed_status_line(gchar *file, gchar *needle);
 void dup_auth_data(gchar *origurl, gchar *url);
 void sanitize_path_separator(gchar *);
-#ifdef _WIN32
-char *strcasestr(const char *a, const char *b);
-#endif
 
 #endif
--- evolution-rss-0.1.9//src/network-soup.c	2010-05-19 10:58:13.000000000 +0200
+++ evolution-rss-0.2.0//src/network-soup.c	2010-06-03 22:24:04.000000000 +0200
@@ -319,9 +319,9 @@ read_up(gpointer data)
 	feed_dir = rss_component_peek_base_directory();
 	if (!g_file_test(feed_dir, G_FILE_TEST_EXISTS))
 		g_mkdir_with_parents (feed_dir, 0755);
-	feed_name = g_strdup_printf(
-			"%s" G_DIR_SEPARATOR_S "%s", feed_dir, buf);
+	feed_name = g_build_path(G_DIR_SEPARATOR_S, feed_dir, buf, NULL);
 	g_free(feed_dir);
+	d("reading auth info:%s\n", feed_name);
 
 	fr = fopen(feed_name, "r");
 	if (fr) {
@@ -421,6 +421,7 @@ authenticate (SoupSession *session,
 
 	user = g_hash_table_lookup(rf->hruser, data);
 	pass = g_hash_table_lookup(rf->hrpass, data);
+	d("data:%s, user:%s, pass:%s\n", (gchar *)data, user, pass);
 
 	if (user && pass) {
 #if LIBSOUP_VERSION < 2003000
@@ -435,10 +436,23 @@ authenticate (SoupSession *session,
 	}
 #endif
 	} else {
+		read_up(data);
+		user = g_hash_table_lookup(rf->hruser, data);
+		pass = g_hash_table_lookup(rf->hrpass, data);
+		if (user && pass) {
+#if LIBSOUP_VERSION < 2003000
+			*username = g_strdup(user);
+			*password = g_strdup(pass);
+#else
+			if (!retrying)
+				soup_auth_authenticate (auth, user, pass);
+			return;
+#endif
+		}
 		//we test for autofetching in progresss because it seems
 		//preety annoying to pop the authentication popup in front
 		//of the user every time feeds are automatically fetched
-		if (!read_up(data) && !rf->autoupdate) {
+		if (!rf->autoupdate) {
 			//we will continue after user has made a decision on
 			//web auth dialog
 			//Bug 522147 â?? need to be able to pause synchronous I/O
@@ -451,6 +465,7 @@ authpop:		if (G_OBJECT_TYPE(session) ==
 			auth_info->session = session;
 			auth_info->message = msg;
 			web_auth_dialog(auth_info);
+			return;
 		}
 	}
 }
@@ -592,16 +607,6 @@ net_get_unblocking(gchar *url,
 		info->total = 0;
 	}
 
-	if (!rf->session)
-		rf->session = g_hash_table_new(
-				g_direct_hash, g_direct_equal);
-	if (!rf->abort_session)
-		rf->abort_session = g_hash_table_new(
-					g_direct_hash, g_direct_equal);
-	if (!rf->key_session)
-		rf->key_session = g_hash_table_new(
-					g_direct_hash, g_direct_equal);
-
 	g_signal_connect (soup_sess, "authenticate",
 		G_CALLBACK (authenticate), (gpointer)url);
 #if LIBSOUP_VERSION < 2003000
@@ -692,16 +697,6 @@ download_unblocking(
 		info->total = 0;
 	}
 
-	if (!rf->session)
-		rf->session = g_hash_table_new(
-				g_direct_hash, g_direct_equal);
-	if (!rf->abort_session)
-		rf->abort_session = g_hash_table_new(
-					g_direct_hash, g_direct_equal);
-	if (!rf->key_session)
-		rf->key_session = g_hash_table_new(
-					g_direct_hash, g_direct_equal);
-
 	g_signal_connect (soup_sess, "authenticate",
 		G_CALLBACK (authenticate), (gpointer)url);
 #if LIBSOUP_VERSION < 2003000
@@ -1005,8 +1000,8 @@ rss_soup_init(void)
 		}
 		g_free(cookie_path);
 		g_free(moz_cookie_path);
-		if (!rf->stqueue)
-			rf->stqueue = g_queue_new();
 	}
 #endif
+	if (!rf->stqueue)
+		rf->stqueue = g_queue_new();
 }
--- evolution-rss-0.1.9//src/notification.c	2010-05-19 10:58:13.000000000 +0200
+++ evolution-rss-0.2.0//src/notification.c	2010-06-08 16:32:44.000000000 +0200
@@ -29,9 +29,16 @@
 #include <e-util/e-error.h>
 #endif
 
-#include "notification.h"
+#if EVOLUTION_VERSION <= 22203
+#include <misc/e-activity-handler.h>
+#include <e-util/e-icon-factory.h>
+#endif
+
+extern int rss_verbose_debug;
+
 #include "rss.h"
 #include "network-soup.h"
+#include "notification.h"
 
 #if (EVOLUTION_VERSION >= 22900) //kb//
 extern EShellView *rss_shell_view;
@@ -183,7 +190,7 @@ void
 taskbar_pop_message(void)
 {
 #if EVOLUTION_VERSION < 22900 //kb//
-	EActivityHandler *activity_handler = 
+	EActivityHandler *activity_handler =
 		mail_component_peek_activity_handler (mail_component_peek ());
 	e_activity_handler_unset_message(activity_handler);
 #else
@@ -198,9 +205,9 @@ void
 taskbar_op_abort(gpointer key)
 {
 #if EVOLUTION_VERSION < 22900 //kb//
-	EActivityHandler *activity_handler = 
+	EActivityHandler *activity_handler =
 		mail_component_peek_activity_handler (mail_component_peek ());
-	guint activity_key = 
+	guint activity_key =
 		GPOINTER_TO_INT(g_hash_table_lookup(rf->activity, key));
 	if (activity_key)
 		e_activity_handler_operation_finished(
@@ -262,11 +269,11 @@ taskbar_op_new(gchar *message)
 		key);
 	return activity;
 #else
-	activity_handler = 
+	activity_handler =
 		mail_component_peek_activity_handler (mail_component_peek ());
 	mcp = g_strdup_printf("%p", mail_component_peek());
 #if (EVOLUTION_VERSION >= 22306)
-	activity_id = 
+	activity_id =
 		e_activity_handler_cancelable_operation_started(
 			activity_handler,
 			"evolution-mail",
@@ -275,12 +282,12 @@ taskbar_op_new(gchar *message)
 			(void (*) (gpointer))taskbar_op_abort,
 			key);
 #else
-	progress_icon = 
+	progress_icon =
 		e_icon_factory_get_icon (
 			"mail-unread",
 			E_ICON_SIZE_MENU);
 #if (EVOLUTION_VERSION >= 22200)
-	activity_id = 
+	activity_id =
 		e_activity_handler_cancelable_operation_started(
 			activity_handler,
 			"evolution-mail",
@@ -336,37 +343,49 @@ taskbar_op_set_progress(gchar *key, gcha
 	}
 }
 
-#if (EVOLUTION_VERSION >= 22900) //kb//
 void
-taskbar_op_finish(EActivity *id)
+taskbar_op_finish(gchar *key)
 {
+#if (EVOLUTION_VERSION >= 22900) //kb//
+	EActivity *aid = NULL;
 	EActivity *activity_key;
-	if (id == NULL) {
+#else
+	guint aid = 0;
+	guint activity_key;
+	EActivityHandler *activity_handler = mail_component_peek_activity_handler (
+						mail_component_peek ());
+#endif
+	if (key) {
+#if (EVOLUTION_VERSION >= 22900) //kb//
+		aid = (EActivity *)g_hash_table_lookup(rf->activity, key);
+#else
+		aid = (guint)g_hash_table_lookup(rf->activity, key);
+#endif
+	}
+	if (aid == NULL) {
+#if (EVOLUTION_VERSION >= 22900) //kb//
 		activity_key = g_hash_table_lookup(rf->activity, "main");
+#else
+		activity_key = GPOINTER_TO_INT(g_hash_table_lookup(rf->activity, "main"));
+#endif
 		if (activity_key) {
-			dp("activity_key:%p\n", activity_key);
+			d("activity_key:%p\n", (gpointer)activity_key);
+#if (EVOLUTION_VERSION >= 22900) //kb//
 			e_activity_complete (activity_key);
+#else
+			e_activity_handler_operation_finished(activity_handler, activity_key);
+#endif
 			g_hash_table_remove(rf->activity, "main");
 		}
 	} else {
-		e_activity_complete (id);
-		g_hash_table_remove(rf->activity, id);
-	}
-}
+#if (EVOLUTION_VERSION >= 22900) //kb//
+		e_activity_complete (aid);
 #else
-void
-taskbar_op_finish(gchar *key)
-{
-	EActivityHandler *activity_handler = mail_component_peek_activity_handler (mail_component_peek ());
-	if (rf->activity) {
-		guint activity_key = GPOINTER_TO_INT(g_hash_table_lookup(rf->activity, key));
-		g_print("activity_key:%p\n", activity_key);
-		if (activity_key)
-			e_activity_handler_operation_finished(activity_handler, activity_key);
+		e_activity_handler_operation_finished(activity_handler, aid);
+#endif
 		g_hash_table_remove(rf->activity, key);
 	}
 }
-#endif
 
 #if (EVOLUTION_VERSION >= 22900) //kb//
 EActivity*
@@ -392,12 +411,12 @@ taskbar_op_message(gchar *msg, gchar *un
 
 #if (EVOLUTION_VERSION >= 22900) //kb//
 		if (!msg)
-			activity_id = 
+			activity_id =
 				(EActivity *)taskbar_op_new(
-					tmsg, 
+					tmsg,
 					(gchar *)"main");
 		else
-			activity_id = 
+			activity_id =
 				(EActivity *)taskbar_op_new(tmsg, msg);
 #else
 #if (EVOLUTION_VERSION >= 22200)
--- evolution-rss-0.1.9//src/notification.h	2010-05-19 10:58:13.000000000 +0200
+++ evolution-rss-0.2.0//src/notification.h	2010-06-03 16:44:40.000000000 +0200
@@ -25,11 +25,7 @@ taskbar_op_message(gchar *msg, gchar *un
 #endif
 void taskbar_op_abort(gpointer key);
 void taskbar_op_set_progress(gchar *key, gchar *msg, gdouble progress);
-#if (EVOLUTION_VERSION >= 22900) //kb//
-void taskbar_op_finish(EActivity *id);
-#else
 void taskbar_op_finish(gchar *key);
-#endif
 void taskbar_push_message(gchar *message);
 void taskbar_pop_message(void);
 
--- evolution-rss-0.1.9//src/parser.c	2010-05-19 10:58:13.000000000 +0200
+++ evolution-rss-0.2.0//src/parser.c	2010-07-01 20:33:13.000000000 +0200
@@ -37,6 +37,7 @@ extern int rss_verbose_debug;
 #include "fetch.h"
 #include "rss.h"
 #include "rss-config.h"
+#include "rss-image.h"
 #include "parser.h"
 #include "misc.h"
 #include "network-soup.h"
@@ -44,7 +45,6 @@ extern int rss_verbose_debug;
 /************ RDF Parser *******************/
 
 guint rsserror = FALSE;
-gchar *rssstrerror = NULL;
 extern rssfeed *rf;
 extern gboolean feed_new;
 
@@ -163,7 +163,6 @@ static void
 my_xml_perror_handler (void *ctx, const char *msg, ...)
 {
 	rsserror = TRUE;
-//	rssstrerror
 	g_print("xml_parse_sux(): ERROR:%s\n", msg);
 }
 
@@ -178,54 +177,54 @@ xml_parse_sux (const char *buf, int len)
 {
 	static xmlSAXHandler *sax;
 	xmlParserCtxtPtr ctxt;
-	xmlDoc *doc;
+	xmlDoc *doc = NULL;
+	gchar *mime_type;
+
 	rsserror = FALSE;
-	rssstrerror = NULL;
 
 	g_return_val_if_fail (buf != NULL, NULL);
+	mime_type = g_content_type_guess(NULL, (guchar *)buf, len, NULL);
+	//feeding parsed anything other than xml results in blocking delays
+	//it's possible we can relax parser by using xmlErrorFunc
+	if (!g_ascii_strncasecmp (mime_type, "application/", 12)) {
+		if (!sax) {
+			xmlInitParser();
+			sax = xmlMalloc (sizeof (xmlSAXHandler));
+			xmlSAXVersion (sax, 2);
+			sax->warning = my_xml_parser_error_handler;
+			sax->error = my_xml_perror_handler;
+		}
+
+		if (len == -1)
+			len = strlen (buf);
+		ctxt = xmlCreateMemoryParserCtxt (buf, len);
+		if (!ctxt)
+			return NULL;
+
+		xmlFree (ctxt->sax);
+		ctxt->sax = sax;
+		ctxt->sax2 = 1;
+		ctxt->str_xml = xmlDictLookup (ctxt->dict, BAD_CAST "xml", 3);
+		ctxt->str_xmlns = xmlDictLookup (ctxt->dict, BAD_CAST "xmlns", 5);
+		ctxt->str_xml_ns = xmlDictLookup (ctxt->dict, XML_XML_NAMESPACE, 36);
+
+		ctxt->recovery = TRUE;
+		ctxt->vctxt.error = my_xml_parser_error_handler;
+		ctxt->vctxt.warning = my_xml_parser_error_handler;
 
-	if (!sax) {
-		xmlInitParser();
-		sax = xmlMalloc (sizeof (xmlSAXHandler));
-//#if LIBXML_VERSION > 20600 
-		xmlSAXVersion (sax, 2);
-//#else
-//              memcpy (sax, &xmlDefaultSAXHandler, sizeof (xmlSAXHandler));
-//#endif
-		sax->warning = my_xml_parser_error_handler;
-		sax->error = my_xml_perror_handler;
-	}
 
-	if (len == -1)
-		len = strlen (buf);
-	ctxt = xmlCreateMemoryParserCtxt (buf, len);
-	if (!ctxt)
-		return NULL;
-
-	xmlFree (ctxt->sax);
-	ctxt->sax = sax;
-//#if LIBXML_VERSION > 20600
-	ctxt->sax2 = 1;
-	ctxt->str_xml = xmlDictLookup (ctxt->dict, BAD_CAST "xml", 3);
-	ctxt->str_xmlns = xmlDictLookup (ctxt->dict, BAD_CAST "xmlns", 5);
-	ctxt->str_xml_ns = xmlDictLookup (ctxt->dict, XML_XML_NAMESPACE, 36);
-//#endif
-
-	ctxt->recovery = TRUE;
-	ctxt->vctxt.error = my_xml_parser_error_handler;
-	ctxt->vctxt.warning = my_xml_parser_error_handler;
-
-	xmlCtxtUseOptions(ctxt, XML_PARSE_DTDLOAD
+		xmlCtxtUseOptions(ctxt, XML_PARSE_DTDLOAD
 				| XML_PARSE_NOENT);
 
-//                                | XML_PARSE_NOCDATA);
-
-	xmlParseDocument (ctxt);
-
-	doc = ctxt->myDoc;
-	ctxt->sax = NULL;
-	xmlFreeParserCtxt (ctxt);
+		xmlParseDocument (ctxt);
 
+		doc = ctxt->myDoc;
+		ctxt->sax = NULL;
+		xmlFreeParserCtxt (ctxt);
+	} else {
+		rsserror = TRUE;
+	}
+	g_free(mime_type);
 	return doc;
 }
 
@@ -711,20 +710,22 @@ tree_walk (xmlNodePtr root, RDF *r)
 {
 	xmlNodePtr walk;
 	xmlNodePtr rewalk = root;
-	xmlNodePtr channel = NULL;
-	xmlNodePtr image = NULL;
+	xmlNodePtr channel = NULL, image = NULL, link = NULL;
 	GArray *item = g_array_new (TRUE, TRUE, sizeof (xmlNodePtr));
 	gchar *t;
 	gchar *charset;
 	gchar *md2, *tmp, *ver;
 
-	/* check in-memory encoding first, fallback to transport encoding, which may or may not be correct */
+	/* check in-memory encoding first,
+	 * fallback to transport encoding, which may or may not be correct
+	 */
 	if (r->cache->charset == XML_CHAR_ENCODING_UTF8
 	    || r->cache->charset == XML_CHAR_ENCODING_ASCII) {
 		charset = NULL;
 	} else {
 		/* bad/missing encoding, fallback to latin1 (locale?) */
-		charset = r->cache->encoding ? (gchar *)r->cache->encoding : (gchar *)"iso-8859-1";
+		charset = r->cache->encoding ?
+			(gchar *)r->cache->encoding : (gchar *)"iso-8859-1";
 	}
 
 	do {
@@ -736,18 +737,15 @@ tree_walk (xmlNodePtr root, RDF *r)
 			printf ("%p, %s\n", walk, walk->name);
 #endif
 			if (strcasecmp ((char *)walk->name, "rdf") == 0) {
-//				xmlNode *node = walk;
 				rewalk = walk->children;
 				walk = walk->next;
 				if (!r->type)
 					r->type = g_strdup("RDF");
 				r->type_id = RDF_FEED;
-//				gchar *ver = xmlGetProp(node, "version");
 				if (r->version)
 					g_free(r->version);
 				r->version = g_strdup("(RSS 1.0)");
-//				if (ver)
-//					xmlFree(ver);
+				r->base = (gchar *)xmlGetProp(walk, (xmlChar *)"base");
 				continue;
 			}
 			if (strcasecmp ((char *)walk->name, "rss") == 0){
@@ -763,6 +761,7 @@ tree_walk (xmlNodePtr root, RDF *r)
 				r->version = g_strdup(ver);
 				if (ver)
 					xmlFree(ver);
+				r->base = (gchar *)xmlGetProp(node, (xmlChar *)"base");
 				continue;
 			}
 			if (strcasecmp ((char *)walk->name, "feed") == 0) {
@@ -781,6 +780,7 @@ tree_walk (xmlNodePtr root, RDF *r)
 						g_free(r->version);
 					r->version = g_strdup("1.0");
 				}
+				r->base = (gchar *)xmlGetProp(walk, (xmlChar *)"base");
 			}
 
 			/* This is the channel top level */
@@ -810,19 +810,10 @@ tree_walk (xmlNodePtr root, RDF *r)
 		fprintf(stderr, "ERROR:No channel definition.\n");
 		return NULL;
 	}
-//	gchar *server = get_server_from_uri(r->uri);
-//	gchar *fav = g_strconcat(server, "/favicon.ico", NULL);
-//	g_free(server);
 
 	if (image != NULL)
 		r->image = (gchar *)layer_find(image->children, "url", NULL);
 
-//	g_print("status image:%d\n", net_get_status(r->image, NULL));
-//	if (404 == net_get_status(r->image, NULL))
-//		r->image = NULL;
-
-//	g_free(fav);
-
 	t = g_strdup(get_real_channel_name(r->uri, NULL));
 	//feed might be added with no validation
 	//so it could be named Untitled channel
@@ -859,10 +850,11 @@ tree_walk (xmlNodePtr root, RDF *r)
 }
 
 gchar *
-process_images(gchar *text, gchar *link, EMFormatHTML *format)
+process_images(gchar *text, gchar *link, gboolean decode, EMFormatHTML *format)
 {
 	xmlChar *buff = NULL;
 	guint size = 0;
+	gchar *tname;
 	xmlDoc *src = (xmlDoc *)parse_html_sux (text, strlen(text));
 	if (src) {
 		xmlNode *doc = (xmlNode *)src;
@@ -871,14 +863,20 @@ process_images(gchar *text, gchar *link,
 			xmlChar *url = xmlGetProp(doc, (xmlChar *)"src");
 			if (url) {
 				if ((name = fetch_image_redraw((gchar *)url, link, format))) {
-					gchar *tmp = g_strconcat(
-							"file://",
-							name, NULL);
-					g_free(name);
+					if (decode) {
+						tname = decode_image_cache_filename(name);
+#if (EVOLUTION_VERSION >= 23000)
+						g_free(name);
+						name = g_filename_to_uri (tname, NULL, NULL);
+						g_free(tname);
+#else
+						name = tname;
+#endif
+					}
 					xmlSetProp(
 						doc, (xmlChar *)"src",
-						(xmlChar *)tmp);
-					g_free(tmp);
+						(xmlChar *)name);
+					g_free(name);
 				}
 				xmlFree(url);
 			}
@@ -891,7 +889,7 @@ process_images(gchar *text, gchar *link,
 }
 
 create_feed *
-parse_channel_line(xmlNode *top, gchar *feed_name, char *main_date, gchar **article_uid)
+parse_channel_line(xmlNode *top, gchar *feed_name, RDF *r, gchar **article_uid)
 {
 	char *q = NULL;
 	char *b = NULL;
@@ -906,6 +904,12 @@ parse_channel_line(xmlNode *top, gchar *
 	GList *category = NULL;
 	create_feed *CF;
 	GList *attachments = NULL;
+	gchar *base = NULL, *main_date = NULL;
+
+	if (r) {
+		base = r->base;
+		main_date = r->maindate;
+	}
 
 	//we have to free this somehow
 	//<link></link>
@@ -1053,7 +1057,7 @@ parse_channel_line(xmlNode *top, gchar *
 		g_free(b);
 
 		if (feed_name) {
-			gchar *buff = process_images(tmp, link, NULL);
+			gchar *buff = process_images(tmp, base ? base : link, FALSE, NULL);
 			g_free(tmp);
 			b = buff;
 		} else
@@ -1107,7 +1111,6 @@ update_channel(RDF *r)
 	create_feed *CF;
 	gchar *chn_name = r->title;
 	gchar *url = r->uri;
-	gchar *main_date = r->maindate;
 	GArray *item = r->item;
 	GtkWidget *progress = r->progress;
 	gchar *buf, *safes, *feed_dir, *feed_name;
@@ -1153,8 +1156,8 @@ update_channel(RDF *r)
 			r->uids = g_array_new(TRUE, TRUE, sizeof(gpointer));
 		}
 
-		CF = parse_channel_line(el->children,
-			feed_name, main_date, &article_uid);
+		CF = parse_channel_line(el->children, feed_name,
+			r, &article_uid);
 		g_array_append_val(r->uids, article_uid);
 		if (!CF) continue;
 		CF->feedid = g_strdup(buf);
@@ -1200,7 +1203,8 @@ update_channel(RDF *r)
 	if (mail_folder) {
 		if ((rf->import || feed_new)
 		&& (!rf->cancel && !rf->cancel_all && !rf->display_cancel)) {
-			rss_select_folder((gchar *)camel_folder_get_full_name(mail_folder));
+			rss_select_folder(
+				(gchar *)camel_folder_get_full_name(mail_folder));
 			if (feed_new) feed_new = FALSE;
 		}
 #if (DATASERVER_VERSION >= 2031001)
--- evolution-rss-0.1.9//src/parser.h	2010-05-19 10:58:13.000000000 +0200
+++ evolution-rss-0.2.0//src/parser.h	2010-06-29 21:01:02.000000000 +0200
@@ -47,7 +47,7 @@ xmlDoc *parse_html_sux (const char *buf,
 xmlDoc *xml_parse_sux (const char *buf, int len);
 create_feed *parse_channel_line(xmlNode *top,
 				gchar *feed_name,
-				char *main_date,
+				RDF *r,
 				gchar **article_uid);
 gchar *tree_walk (xmlNodePtr root, RDF *r);
 xmlNode *html_find (xmlNode *node, gchar *match);
@@ -57,7 +57,7 @@ gchar *media_rss(xmlNode *node, gchar *s
 gchar *dublin_core_rss(xmlNode *node, gchar *fail);
 void syndication_rss(void);
 gchar *wfw_rss(xmlNode *node, gchar *fail);
-gchar *process_images(gchar *text, gchar *link, EMFormatHTML *format);
+gchar *process_images(gchar *text, gchar *link, gboolean decode, EMFormatHTML *format);
 
 #endif /*__RSS_H__*/
 
--- evolution-rss-0.1.9//src/rss.c	2010-05-19 10:58:13.000000000 +0200
+++ evolution-rss-0.2.0//src/rss.c	2010-07-20 22:32:03.000000000 +0200
@@ -219,9 +219,9 @@ SoupCookieJar *rss_soup_jar;
 #endif
 extern guint rsserror;
 gboolean single_pending = FALSE;
-//#if EVOLUTION_VERSION >= 22900
-//extern CamelSession *session;
-//#endif
+#if EVOLUTION_VERSION < 22900
+extern CamelSession *session;
+#endif
 
 rssfeed *rf = NULL;
 guint upgrade = 0;	// set to 2 when initailization successfull
@@ -263,7 +263,9 @@ guint fallback_engine(void);
 gchar *print_comments(gchar *url, gchar *stream, EMFormatHTML *format);
 static void refresh_cb (GtkWidget *button, EMFormatHTMLPObject *pobject);
 
+#ifdef HAVE_WEBKIT
 void webkit_set_history(gchar *base);
+#endif
 gboolean show_webkit(GtkWidget *webkit);
 void sync_folders(void);
 
@@ -496,19 +498,30 @@ browser_stream_write(CamelStream *stream
 		g_free(tmp);
 		line = NULL;
 	}
+#ifdef HAVE_WEBKIT
+#if (WEBKIT_VERSION >= 1001001)
 	webkit_web_view_load_string(
 		WEBKIT_WEB_VIEW(rf->mozembed),
 		str->str,
 		"text/html",
 		NULL,
 		base);
+#else
+	webkit_web_view_load_html_string(
+		WEBKIT_WEB_VIEW(rf->mozembed),
+		str->str,
+		base);
+#endif
+#endif
 	g_string_free(str, 1);
 #if (DATASERVER_VERSION >= 2031001)
 	g_object_unref(in);
 #else
 	camel_object_unref(in);
 #endif
+#ifdef HAVE_WEBKIT
 	webkit_set_history(base);
+#endif
 }
 
 static void
@@ -541,7 +554,7 @@ textcb(NetStatusType status, gpointer st
 		progress = (NetStatusProgress*)statusdata;
 		if (progress->current > 0 && progress->total > 0) {
 			fraction = (float)progress->current / progress->total;
-			g_print("%.2f%% ", fraction*100);
+			g_print("%.2f%% ", fraction);
 		}
 		while (gtk_events_pending())
 			gtk_main_iteration ();
@@ -581,13 +594,13 @@ user_pass_cb(RSS_AUTH *auth_info, gint r
 			g_hash_table_remove(rf->hruser, auth_info->url);
 
 		g_hash_table_insert(
-			rf->hruser, auth_info->url,
+			rf->hruser, g_strdup(auth_info->url),
 			g_strdup(gtk_entry_get_text (GTK_ENTRY (auth_info->username))));
 
 		if (auth_info->pass)
 			g_hash_table_remove(rf->hrpass, auth_info->url);
 
-		g_hash_table_insert(rf->hrpass, auth_info->url,
+		g_hash_table_insert(rf->hrpass, g_strdup(auth_info->url),
 			g_strdup(gtk_entry_get_text (GTK_ENTRY (auth_info->password))));
 
 		if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (auth_info->rememberpass)))
@@ -607,12 +620,14 @@ user_pass_cb(RSS_AUTH *auth_info, gint r
 		break;
 	default:
 		rf->soup_auth_retry = TRUE;
-		break;
+			soup_session_abort(auth_info->session);
+		goto out;
 	}
-	if (soup_session_get_async_context(auth_info->session))
+	if (G_OBJECT_TYPE(auth_info->session) == SOUP_TYPE_SESSION_ASYNC) {
 		soup_session_unpause_message(
 			auth_info->session, auth_info->message);
-	gtk_widget_destroy(GTK_WIDGET(dialog));
+	}
+out:	gtk_widget_destroy(GTK_WIDGET(dialog));
 	g_free(auth_info);
 
 }
@@ -787,13 +802,16 @@ web_auth_dialog(RSS_AUTH *auth_info)
 
 	if (!rf->hruser)
 		rf->hruser = g_hash_table_new_full(
-				g_str_hash, g_str_equal, NULL, g_free);
+				g_str_hash, g_str_equal, g_free, g_free);
 	if (!rf->hrpass)
 		rf->hrpass = g_hash_table_new_full(
-				g_str_hash, g_str_equal, NULL, g_free);
+				g_str_hash, g_str_equal, g_free, g_free);
 
+	d("auth url:%s\n", auth_info->url);
 	auth_info->user = g_hash_table_lookup(rf->hruser, auth_info->url);
 	auth_info->pass = g_hash_table_lookup(rf->hrpass, auth_info->url);
+	d("auth user:%s\n", auth_info->user);
+	d("auth pass:%s\n", auth_info->pass);
 	dialog = create_user_pass_dialog(auth_info);
 	//Bug 522147 â?? need to be able to pause synchronous I/O
 	if (G_OBJECT_TYPE(auth_info->session) != SOUP_TYPE_SESSION_ASYNC) {
@@ -817,6 +835,7 @@ proxy_auth_dialog(gchar *title, gchar *u
 	auth_info->pass = pass;
 	dialog = create_user_pass_dialog(auth_info);
 	result = gtk_dialog_run(GTK_DIALOG(dialog));
+	/*LEAK g_free(auth_info);*/
 	return TRUE;
 }
 
@@ -1003,7 +1022,11 @@ reload_cb (GtkWidget *button, gpointer d
 		break;
 		case 1:
 #ifdef	HAVE_WEBKIT
+#if (WEBKIT_VERSION >= 1000003)
 	webkit_web_view_reload_bypass_cache(WEBKIT_WEB_VIEW(rf->mozembed));
+#else
+	webkit_web_view_reload(WEBKIT_WEB_VIEW(rf->mozembed));
+#endif
 #endif
 		break;
 	}
@@ -1021,7 +1044,11 @@ rss_browser_set_hsize (GtkAdjustment *ad
 void
 rss_browser_set_hsize (GtkAdjustment *adj, gpointer data)
 {
+#if GTK_VERSION >= 2014000
 	resize_pane_hsize = gtk_adjustment_get_page_size(adj);
+#else
+	resize_pane_hsize = (adj->page_size);
+#endif
 }
 
 void rss_browser_update_content (
@@ -1056,7 +1083,7 @@ rss_browser_update_content (
 					fi = g_new0(UB, 1);
 					stream = rss_cache_get(po->website);
 					if (!stream) {
-						dp("HTTP cache miss\n");
+						d("HTTP cache miss\n");
 						stream = rss_cache_add(po->website);
 						fi->create = 1;
 					fi->stream = stream;
@@ -1071,7 +1098,7 @@ rss_browser_update_content (
 						NULL);
 					/*FIXME free fi*/
 					} else {
-						g_print("cache read\n");
+						d("cache read\n");
 						fi->create = 0;
 						browser_stream_write(stream, po->website);
 						camel_stream_close(stream);
@@ -1124,6 +1151,12 @@ webkit_set_preferences(void)
 	g_object_set (settings, "enable-plugins",
 		gconf_client_get_bool(rss_gconf, GCONF_KEY_EMBED_PLUGIN, NULL),
 		NULL);
+	g_object_set (settings, "enable-java-applet",
+		gconf_client_get_bool(rss_gconf, GCONF_KEY_HTML_JAVA, NULL),
+		NULL);
+	g_object_set (settings, "enable-scripts",
+		gconf_client_get_bool(rss_gconf, GCONF_KEY_HTML_JS, NULL),
+		NULL);
 #endif
 	webkit_web_view_set_full_content_zoom(
 		(WebKitWebView *)rf->mozembed, TRUE);
@@ -1322,9 +1355,12 @@ webkit_set_history(gchar *base)
 		webkit_web_view_get_back_forward_list (WEBKIT_WEB_VIEW(rf->mozembed));
 	WebKitWebHistoryItem *item =
 		webkit_web_history_item_new_with_data(base, "Untitled");
+#if (WEBKIT_VERSION >= 1001001)
 	webkit_web_back_forward_list_add_item(back_forward_list, item);
+#endif
 }
 
+#if (WEBKIT_VERSION >= 1001007)
 static void
 webkit_history_status (WebKitWebView *view,
 		GParamSpec *spec,
@@ -1347,6 +1383,7 @@ webkit_history_status (WebKitWebView *vi
 		break;
 	}
 }
+#endif
 
 gboolean
 webkit_over_link(WebKitWebView *web_view,
@@ -1364,21 +1401,21 @@ webkit_over_link(WebKitWebView *web_view
 }
 
 static void
-embed_zoom_in_cb (EShellView *shell,
+embed_zoom_in_cb (GtkWidget *w,
 			gpointer *data)
 {
 	webkit_web_view_zoom_in((WebKitWebView*)rf->mozembed);
 }
 
 static void
-embed_zoom_out_cb (EShellView *shell,
+embed_zoom_out_cb (GtkWidget *w,
 			gpointer *data)
 {
 	webkit_web_view_zoom_out((WebKitWebView *)rf->mozembed);
 }
 
 static void
-embed_zoom_100_cb (EShellView *shell,
+embed_zoom_100_cb (GtkWidget *w,
 			gpointer *data)
 {
 	webkit_web_view_set_zoom_level((WebKitWebView *)rf->mozembed, 1);
@@ -1422,6 +1459,7 @@ void webkit_hook_actions(void);
 void
 webkit_hook_actions(void)
 {
+#if EVOLUTION_VERSION >= 22900
 	EShellWindow *shell_window;
 	GtkAction *action;
 	const char *action_name;
@@ -1443,6 +1481,7 @@ webkit_hook_actions(void)
 	g_signal_connect (
 		action, "activate",
 		G_CALLBACK (embed_zoom_100_cb), NULL);
+#endif
 }
 
 #if 0
@@ -1621,7 +1660,7 @@ org_gnome_rss_browser (EMFormatHTML *efh
 	EMFormat *myf = (EMFormat *)efh;
 	gint width, height;
 	GtkAdjustment *adj;
-
+	gboolean online;
 	guint engine = fallback_engine();
 
 #ifdef HAVE_WEBKIT
@@ -1648,12 +1687,14 @@ org_gnome_rss_browser (EMFormatHTML *efh
 			po->stopbut);
 #endif
 	}
+#if (WEBKIT_VERSION >= 1001007)
 		g_signal_connect (
 			rf->mozembed,
 			"notify::load-status",
 			G_CALLBACK(webkit_history_status),
 			po);
 #endif
+#endif
 
 #ifdef HAVE_GECKO
 	if (engine == 2) {
@@ -1691,12 +1732,16 @@ org_gnome_rss_browser (EMFormatHTML *efh
 	}
 #endif
 
-	po->container = rf->mozembed;
+#if (DATASERVER_VERSION >= 2031002)
+	online =  camel_session_get_online (session);
+#else
+	online =  camel_session_is_online (session);
+#endif
 
 #ifdef HAVE_WEBKIT
 	if (engine == 1) {
 		d("Render engine Webkit\n");
-		if (!rf->online)
+		if (!online)
 			webkit_web_view_open(
 				WEBKIT_WEB_VIEW(rf->mozembed),
 				"about:blank");
@@ -1706,7 +1751,7 @@ org_gnome_rss_browser (EMFormatHTML *efh
 #ifdef HAVE_GECKO
 	if (engine == 2) {
 		d("Render engine Gecko\n");
-		if (!rf->online) {
+		if (!online) {
 			gtk_moz_embed_stop_load(
 				(GtkMozEmbed *)rf->mozembed);
 			gtk_moz_embed_load_url (
@@ -1725,15 +1770,31 @@ org_gnome_rss_browser (EMFormatHTML *efh
 		gtk_widget_show_all(rf->mozembed);
 
 	gtk_container_add ((GtkContainer *) eb, rf->mozembed);
-	g_object_ref(rf->mozembed);
+	//appears distroying webkit's parent window results in crash
+	g_object_ref(eb);
+	po->container = eb;
 	rf->headers_mode = myf->mode;
+
+#if EVOLUTION_VERSION >= 23103
+	po->html = (GtkWidget *)em_format_html_get_web_view (efh);
+#else
 	po->html = GTK_WIDGET(efh->html);
+#endif
+
 	adj = gtk_scrolled_window_get_vadjustment(
-		(GtkScrolledWindow *)gtk_widget_get_parent(GTK_WIDGET(efh->html)));
+		(GtkScrolledWindow *)gtk_widget_get_parent(po->html));
+#if GTK_VERSION >= 2014000
 	height = (int)gtk_adjustment_get_page_size(adj);
+#else
+	height = (int)(adj->page_size);
+#endif
 	adj = gtk_scrolled_window_get_hadjustment(
-		(GtkScrolledWindow *)gtk_widget_get_parent(GTK_WIDGET(efh->html)));
+		(GtkScrolledWindow *)gtk_widget_get_parent(po->html));
+#if GTK_VERSION >= 2014000
 	width = (int)gtk_adjustment_get_page_size(adj);
+#else
+	width = (int)(adj->page_size);
+#endif
 	gtk_widget_set_size_request(rf->mozembed, width-32, height);
 	po->sh_handler = g_signal_connect(adj,
 		"changed",
@@ -1780,6 +1841,7 @@ org_gnome_rss_controls (EMFormatHTML *ef
 	GtkWidget *hbox2 = gtk_hbox_new (FALSE, 0);
 	GtkWidget *label3 = gtk_label_new ("");
 	GtkWidget *button, *button2, *button3, *button4, *button5;
+	gboolean online;
 
 	gchar *mem = g_strdup_printf(" <b>%s: </b>", _("Feed view"));
 	gtk_label_set_markup_with_mnemonic(GTK_LABEL(label3), mem);
@@ -1800,6 +1862,13 @@ org_gnome_rss_controls (EMFormatHTML *ef
 	g_signal_connect (button, "clicked", G_CALLBACK(summary_cb), efh);
 	gtk_box_pack_start (GTK_BOX (hbox2), button, TRUE, TRUE, 0);
 	gtk_widget_show_all (button);
+
+#if (DATASERVER_VERSION >= 2031002)
+	online =  camel_session_get_online (session);
+#else
+	online =  camel_session_is_online (session);
+#endif
+
 	if (rf->cur_format) {
 		button4 = po->backbut;
 		g_signal_connect (
@@ -1808,7 +1877,7 @@ org_gnome_rss_controls (EMFormatHTML *ef
 			G_CALLBACK(back_cb),
 			efh);
 		gtk_button_set_relief(GTK_BUTTON(button4), GTK_RELIEF_HALF);
-		gtk_widget_set_sensitive (button4, rf->online);
+		gtk_widget_set_sensitive (button4, online);
 		gtk_widget_show (button4);
 		gtk_box_pack_start (
 			GTK_BOX (hbox2),
@@ -1821,7 +1890,7 @@ org_gnome_rss_controls (EMFormatHTML *ef
 			G_CALLBACK(forward_cb),
 			efh);
 		gtk_button_set_relief(GTK_BUTTON(button5), GTK_RELIEF_HALF);
-		gtk_widget_set_sensitive (button5, rf->online);
+		gtk_widget_set_sensitive (button5, online);
 		gtk_widget_show (button5);
 		gtk_box_pack_start (GTK_BOX (hbox2), button5, TRUE, TRUE, 0);
 		button2 = po->stopbut;
@@ -1831,7 +1900,7 @@ org_gnome_rss_controls (EMFormatHTML *ef
 			G_CALLBACK(stop_cb),
 			efh);
 		gtk_button_set_relief(GTK_BUTTON(button2), GTK_RELIEF_HALF);
-		gtk_widget_set_sensitive (button2, rf->online);
+		gtk_widget_set_sensitive (button2, online);
 		gtk_widget_show (button2);
 		gtk_box_pack_start (GTK_BOX (hbox2), button2, TRUE, TRUE, 0);
 		button3 = gtk_button_new_from_stock (GTK_STOCK_REFRESH);
@@ -1841,7 +1910,7 @@ org_gnome_rss_controls (EMFormatHTML *ef
 			G_CALLBACK(reload_cb),
 			po->website);
 		gtk_button_set_relief(GTK_BUTTON(button3), GTK_RELIEF_HALF);
-		gtk_widget_set_sensitive (button3, rf->online);
+		gtk_widget_set_sensitive (button3, online);
 		gtk_widget_show (button3);
 		gtk_box_pack_start (GTK_BOX (hbox2), button3, TRUE, TRUE, 0);
 	}
@@ -1898,6 +1967,9 @@ free_rss_browser(EMFormatHTMLPObject *o)
 	gpointer key = g_hash_table_lookup(rf->key_session, po->website);
 	guint engine;
 	GtkAdjustment *adj;
+#if EVOLUTION_VERSION >= 23103
+	EWebView *web_view;
+#endif
 
 	d("key sess:%p\n", key);
 	if (key) {
@@ -1917,11 +1989,19 @@ free_rss_browser(EMFormatHTMLPObject *o)
 			gtk_widget_destroy(rf->mozembed);
 		rf->mozembed = NULL;
 	}
+
+#if EVOLUTION_VERSION >= 23103
+	web_view = em_format_html_get_web_view (po->format);
+	adj = gtk_scrolled_window_get_hadjustment(
+		(GtkScrolledWindow *)gtk_widget_get_parent(
+					GTK_WIDGET(web_view)));
+#else
 	adj = gtk_scrolled_window_get_hadjustment(
 		(GtkScrolledWindow *)gtk_widget_get_parent(
 					GTK_WIDGET(po->format->html)));
+#endif
 	g_signal_handler_disconnect(adj, po->sh_handler);
-	gtk_widget_destroy(po->container);
+	g_object_unref(po->container);
 	g_free(po->website);
 	browser_fetching = 0;
 }
@@ -2185,6 +2265,18 @@ void org_gnome_cooly_format_rss(void *ep
 
 		g_string_free(content, 1);
 	} else {
+		gchar *wids;
+		xmlDoc *src;
+		guint width;
+		GtkWidget *obj;
+#if EVOLUTION_VERSION >= 23103
+		EWebView *web_view;
+		web_view = em_format_html_get_web_view (emfh);
+		obj = (GtkWidget *)web_view;
+#else
+		obj = (GtkWidget *)emfh->html;
+#endif
+
 		d("normal html rendering\n");
 		buffer = g_byte_array_new ();
 		camel_stream_mem_set_byte_array (stream, buffer);
@@ -2208,45 +2300,41 @@ void org_gnome_cooly_format_rss(void *ep
 		} else
 			tmp = g_strdup((gchar *)(buffer->data));
 
-		if (gconf_client_get_bool (rss_gconf,
-					GCONF_KEY_IMAGE_RESIZE,
-					NULL)) {
-			gchar *wids;
-			xmlDoc *src;
-			guint width;
-
-			GtkWidget *obj = (GtkWidget *)emfh->html;
-			gtk_widget_get_allocation(obj, &alloc);
-			width = alloc.width - 56;
-			wids = g_strdup_printf("%d", width);
-			src = (xmlDoc *)parse_html_sux(
-					tmp,
-					strlen(tmp));
-			if (src) {
-				xmlNode *doc = (xmlNode *)src;
-				while ((doc = html_find(doc, (gchar *)"img"))) {
-					int real_width = 0;
-					xmlChar *url = xmlGetProp(
-							doc,
-							(xmlChar *)"src");
-					//FIXME: this should run even if image_resize is not on
-					gchar *real_image = verify_image(
-								(gchar *)url,
-								emfh);
-					if (real_image) {
-						xmlSetProp(
-							doc,
-							(xmlChar *)"src",
-							(xmlChar *)real_image);
-						g_free(real_image);
-					}
+#if GTK_VERSION >= 2018000
+		gtk_widget_get_allocation(obj, &alloc);
+#else
+		alloc.width = obj->allocation.width;;
+#endif
+		width = alloc.width - 56;
+		wids = g_strdup_printf("%d", width);
+		src = (xmlDoc *)parse_html_sux(
+				tmp,
+				strlen(tmp));
+		if (src) {
+			xmlNode *doc = (xmlNode *)src;
+			while ((doc = html_find(doc, (gchar *)"img"))) {
+				int real_width = 0;
+				xmlChar *url = xmlGetProp(
+						doc,
+						(xmlChar *)"src");
+				gchar *real_image = verify_image(
+							(gchar *)url,
+							emfh);
+				if (real_image) {
+					xmlSetProp(
+						doc,
+						(xmlChar *)"src",
+						(xmlChar *)real_image);
+				}
+				if (gconf_client_get_bool (rss_gconf,
+					GCONF_KEY_IMAGE_RESIZE, NULL) && real_image) {
 					pix = gdk_pixbuf_new_from_file(
-						(const char *)url,
+						(const char *)real_image+7, //skip scheme part
 						(GError **)NULL);
 					if (pix)
 						real_width = gdk_pixbuf_get_width(pix);
 
-					d("url:%s\n", url);
+					d("real_image:%s\n", real_image);
 					d("width:%d\n", width);
 					d("real_width:%d\n", real_width);
 
@@ -2267,14 +2355,13 @@ void org_gnome_cooly_format_rss(void *ep
 							(xmlChar *)"width",
 							(xmlChar *)wids);
 					}
-pixdone:			g_free(url);
+pixdone:			g_free(real_image);
 				}
-				xmlDocDumpMemory(src, &buff, (int*)&size);
-				xmlFree(src);
 			}
-			g_free(wids);
-		} else
-			buff=(xmlChar *)tmp;
+			xmlDocDumpMemory(src, &buff, (int*)&size);
+			xmlFree(src);
+		}
+		g_free(wids);
 
 		g_byte_array_free (buffer, 1);
 #if (DATASERVER_VERSION >= 2031001)
@@ -2451,6 +2538,7 @@ void org_gnome_cooly_folder_refresh(void
 	gchar *folder_name;
 	gchar *main_folder = get_main_folder();
 	gchar *ofolder, *name, *fname, *key, *rss_folder;
+	gboolean online;
 #if EVOLUTION_VERSION > 22900 //kb//
 	CamelFolder *folder;
 	EMFolderTree *folder_tree;
@@ -2458,7 +2546,6 @@ void org_gnome_cooly_folder_refresh(void
 					shell_view);
 	EActivity *taskid;
 
-
 	g_object_get (shell_sidebar, "folder-tree", &folder_tree, NULL);
 	folder = em_folder_tree_get_selected_folder (folder_tree);
 	g_return_if_fail (folder != NULL);
@@ -2489,16 +2576,22 @@ void org_gnome_cooly_folder_refresh(void
 		_("Fetching feed"),
 		(gchar *)g_hash_table_lookup(rf->hrname_r, key));
 
+#if (DATASERVER_VERSION >= 2031002)
+	online =  camel_session_get_online (session);
+#else
+	online =  camel_session_is_online (session);
+#endif
+
 	if (g_hash_table_lookup(rf->hre, key)
 	  && !rf->pending && !rf->feed_queue
-	  && !single_pending && rf->online) {
+	  && !single_pending && online) {
 		single_pending = TRUE;
 		check_folders();
 		rf->err = NULL;
 		taskid = taskbar_op_message(name, key);
 		network_timeout();
 		if (!fetch_one_feed(fname, key, statuscb))
-			taskbar_op_finish(taskid);
+			taskbar_op_finish(key);
 		single_pending = FALSE;
 	}
 	g_free(name);
@@ -2547,8 +2640,8 @@ void org_gnome_cooly_folder_icon(void *e
 #endif
 		if (gconf_client_get_bool (rss_gconf, GCONF_KEY_FEED_ICON, NULL)) {
 //			if (g_file_test(feed_file, G_FILE_TEST_EXISTS)) {
-					// unfortunately e_icon_factory_get_icon return broken image in case of error
-					// we use gdk_pixbuf_new_from_file to test the validity of the image file
+			// unfortunately e_icon_factory_get_icon return broken image in case of error
+			// we use gdk_pixbuf_new_from_file to test the validity of the image file
 #if (EVOLUTION_VERSION >= 22703)
 			if (display_folder_icon(t->store, key))
 				goto out;
@@ -2705,12 +2798,12 @@ prepare_hashes(void)
 	if (rf->hruser == NULL)
 		rf->hruser = g_hash_table_new_full(g_str_hash,
 				g_str_equal,
-				NULL,
+				g_free,
 				g_free);
 	if (rf->hrpass == NULL)
 		rf->hrpass = g_hash_table_new_full(g_str_hash,
 				g_str_equal,
-				NULL,
+				g_free,
 				g_free);
 	if (rf->hrname == NULL)
 		rf->hrname = g_hash_table_new_full(g_str_hash,
@@ -2766,6 +2859,27 @@ prepare_hashes(void)
 				g_str_equal,
 				g_free,
 				NULL);
+
+	if (!rf->activity)	//keeping track of taskbar operations
+		rf->activity = g_hash_table_new_full(
+					g_str_hash,
+					g_str_equal,
+					NULL, NULL);
+	if (!rf->error_hash)	//keeping trask of taskbar errors
+		rf->error_hash = g_hash_table_new_full(
+					g_str_hash,
+					g_str_equal,
+					g_free, NULL);
+
+	if (!rf->session)
+		rf->session = g_hash_table_new(
+				g_direct_hash, g_direct_equal);
+	if (!rf->abort_session)
+		rf->abort_session = g_hash_table_new(
+					g_direct_hash, g_direct_equal);
+	if (!rf->key_session)
+		rf->key_session = g_hash_table_new(
+					g_direct_hash, g_direct_equal);
 }
 
 void
@@ -2791,11 +2905,6 @@ finish_setup_feed(
 	gchar *tmsgkey;
 	GError *err = NULL;
 	gchar *tmsg = feed->tmsg;
-#if (EVOLUTION_VERSION >= 22900) //kb//
-	EActivity *aid;
-#else
-	guint aid;
-#endif
 	gpointer crc_feed = gen_md5(feed->feed_url);
 
 	if (rf->cancel_all || rf->import_cancel)
@@ -2972,22 +3081,6 @@ add:
 		if (rf->cancel_all || rf->import_cancel)
 			goto out;
 
-		if (rf->import) {
-			rf->import--;
-			d("IMPORT:%d, chn:%s\n", rf->import, chn_name);
-			progress++;
-			update_progress_bar(rf->import);
-		}
-
-		if (!rf->import) {
-			gtk_widget_destroy(rf->progress_dialog);
-			rf->progress_bar = NULL;
-			rf->progress_dialog = NULL;
-			progress = 0;
-			rf->display_cancel = 0;
-			rf->import_cancel = 0;
-			rf->cancel_all = 0;
-		}
 
 		taskbar_op_set_progress(tmsgkey, tmsg, 0.9);
 
@@ -3047,6 +3140,23 @@ add:
 		_("Invalid Feed"));
 
 out:	rf->pending = FALSE;
+	if (rf->import) {
+		rf->import--;
+		d("IMPORT queue size:%d\n", rf->import);
+		progress++;
+		update_progress_bar(rf->import);
+	}
+
+	if (!rf->import) {
+		if (rf->progress_dialog)
+			gtk_widget_destroy(rf->progress_dialog);
+		rf->progress_bar = NULL;
+		rf->progress_dialog = NULL;
+		progress = 0;
+		rf->display_cancel = 0;
+		rf->import_cancel = 0;
+		rf->cancel_all = 0;
+	}
 	if (!rf->setup && feed->cancelable != NULL) {
 		void (*f)() = (GFunc)feed->cancelable;
 		f(feed->cancelable_arg);
@@ -3054,8 +3164,7 @@ out:	rf->pending = FALSE;
 		void (*f)() = (GFunc)feed->ok;
 		f(feed->ok_arg);
 	}
-	aid = g_hash_table_lookup(rf->activity, crc_feed);
-	taskbar_op_finish(aid);
+	taskbar_op_finish(crc_feed);
 	g_free(crc_feed);
 	g_free(feed->feed_url);
 	if (feed->feed_name) g_free(feed->feed_name);
@@ -3076,7 +3185,6 @@ setup_feed(add_feed *feed)
 	taskbar_op_message(tmsg, gen_md5(feed->feed_url));
 
 	check_folders();
-	prepare_hashes();
 
 	rf->setup = 0;
 	rf->pending = TRUE;
@@ -3088,7 +3196,7 @@ setup_feed(add_feed *feed)
 	fetch_unblocking(
 		feed->feed_url,
 		textcb,
-		NULL,
+		g_strdup(feed->feed_url),
 		(gpointer)finish_setup_feed,
 		feed,	// we need to dupe key here
 		1,
@@ -3172,10 +3280,7 @@ generic_finish_feed(rfMessage *msg, gpoi
 	gboolean deleted = 0;
 	GString *response;
 	RDF *r;
-#if (EVOLUTION_VERSION >= 22900) //kb//
-	EActivity *aid;
-#else
-	guint aid;
+#if (EVOLUTION_VERSION < 22900)
 	MailComponent *mc = mail_component_peek ();
 #endif
 
@@ -3208,8 +3313,7 @@ generic_finish_feed(rfMessage *msg, gpoi
 
 	if (rf->feed_queue == 0) {
 		d("taskbar_op_finish()\n");
-		aid = g_hash_table_lookup(rf->activity, key);
-		taskbar_op_finish(aid);
+		taskbar_op_finish(key);
 		taskbar_op_finish(NULL);
 		rf->autoupdate = FALSE;
 		farticle=0;
@@ -3287,8 +3391,7 @@ generic_finish_feed(rfMessage *msg, gpoi
 			if (rf->info->data->gd)
 				gtk_widget_destroy((GtkWidget *)rf->info->data->gd);
 		}
-		aid = g_hash_table_lookup(rf->activity, key);
-		taskbar_op_finish(aid);
+		taskbar_op_finish(key);
 		taskbar_op_finish(NULL);
 		//clean data that might hang on rf struct
 		rf->sr_feed = NULL;
@@ -3323,21 +3426,21 @@ generic_finish_feed(rfMessage *msg, gpoi
 		xmlError *err = xmlGetLastError();
 		gchar *tmsg = g_strdup_printf("\n%s\nInvalid feed: %s",
 				(gchar *)user_data,
-				err->message);
+				err ? err->message : _("illegal content type!"));
 		rss_error(user_data,
 			NULL,
 			_("Error while parsing feed."),
 			tmsg);
 		g_free(tmsg);
-		goto out;
+		goto cleanup;
 	}
 
 	if (msg->status_code == SOUP_STATUS_CANCELLED)
-		goto out;
+		goto cleanup;
 
 	if (!deleted) {
 		if (!user_data || !lookup_key(user_data))
-			goto out;
+			goto cleanup;
 		r->uri =  g_hash_table_lookup(
 				rf->hr, lookup_key(user_data));
 
@@ -3364,18 +3467,9 @@ generic_finish_feed(rfMessage *msg, gpoi
 			if (g_hash_table_lookup(rf->hrdel_feed, lookup_key(user_data)))
 				get_feed_age(r, user_data);
 		}
-		if (r->cache)
-			xmlFreeDoc(r->cache);
-		if (r->type)
-			g_free(r->type);
-		if (r->version)
-			g_free(r->version);
-		if (r->uids)
-			g_array_free(r->uids, TRUE);
 	}
 	//ftotal+=r->total;
 	update_sr_message();
-	g_free(r);
 	g_string_free(response, 1);
 
 //tout:
@@ -3404,8 +3498,7 @@ generic_finish_feed(rfMessage *msg, gpoi
 			if (rf->info->data->gd)
 				gtk_widget_destroy((GtkWidget *)rf->info->data->gd);
 		}
-		aid = g_hash_table_lookup(rf->activity, key);
-		taskbar_op_finish(aid);
+		taskbar_op_finish(key);
 		taskbar_op_finish(NULL);
 		//clean data that might hang on rf struct
 		rf->sr_feed = NULL;
@@ -3415,8 +3508,16 @@ generic_finish_feed(rfMessage *msg, gpoi
 		rf->info = NULL;
 	}
 #endif
-out:
-	if (chn_name) { //user_data
+cleanup:if (r->cache)
+		xmlFreeDoc(r->cache);
+	if (r->type)
+		g_free(r->type);
+	if (r->version)
+		g_free(r->version);
+	if (r->uids)
+		g_array_free(r->uids, TRUE);
+	g_free(r);
+out:	if (chn_name) { //user_data
 		//not sure why it dies here
 		if (!rf->cancel && !rf->cancel_all)
 			g_free(chn_name); //user_data
@@ -3667,6 +3768,11 @@ fetch_comments(gchar *url, EMFormatHTML
 gboolean
 update_articles(gboolean disabler)
 {
+#if (DATASERVER_VERSION >= 2031002)
+	gboolean online =  camel_session_get_online (session);
+#else
+	gboolean online =  camel_session_is_online (session);
+#endif
 #if EVOLUTION_VERSION < 22900 //kb//
 	MailComponent *mc = mail_component_peek ();
 #if EVOLUTION_VERSION > 22801
@@ -3677,7 +3783,7 @@ update_articles(gboolean disabler)
 		rf->cancel=1;
 #endif
 
-	if (!rf->pending && !rf->feed_queue && !rf->cancel_all && rf->online) {
+	if (!rf->pending && !rf->feed_queue && !rf->cancel_all && online) {
 		g_print("Reading RSS articles...\n");
 		rf->autoupdate = TRUE;
 		rf->pending = TRUE;
@@ -3882,12 +3988,11 @@ sync_folders(void)
 		return;
 
 	if (!g_hash_table_size(rf->feed_folders))
-		return;
+		goto exit;
 
 	g_hash_table_foreach(rf->feed_folders,
 		(GHFunc)write_feeds_folder_line,
 		(gpointer *)f);
-	fclose(f);
 	g_free(feed_file);
 	g_hash_table_destroy(rf->reversed_feed_folders);
 	rf->reversed_feed_folders = g_hash_table_new_full(g_str_hash,
@@ -3897,6 +4002,8 @@ sync_folders(void)
 	g_hash_table_foreach(rf->feed_folders,
 			(GHFunc)populate_reversed,
 			rf->reversed_feed_folders);
+exit:	fclose(f);
+	return;
 }
 
 /*construct feed_folders file with rename allocation
@@ -4115,8 +4222,13 @@ custom_update_articles(CDATA *cdata)
 {
 	GError *err = NULL;
 	gchar *msg;
-	//if (!rf->pending && !rf->feed_queue && rf->online)
-	if (rf->online) {
+#if (DATASERVER_VERSION >= 2031002)
+	gboolean online =  camel_session_get_online (session);
+#else
+	gboolean online =  camel_session_is_online (session);
+#endif
+	//if (!rf->pending && !rf->feed_queue && online)
+	if (online) {
 		g_print("Fetch (custom) RSS articles...\n");
 		check_folders();
 		rf->err = NULL;
@@ -4126,7 +4238,8 @@ custom_update_articles(CDATA *cdata)
 		// check if we're enabled and no cancelation signal pending
 		// and no imports pending
 		dp("cdata->key:%s\n", (gchar *)cdata->key);
-		if (g_hash_table_lookup(rf->hre, lookup_key(cdata->key)) && !rf->cancel && !rf->import) {
+		if (g_hash_table_lookup(rf->hre, lookup_key(cdata->key))
+		&& !rf->cancel && !rf->import) {
 			d("\nFetching: %s..%s\n",
 				(char *)g_hash_table_lookup(rf->hr,
 					lookup_key(cdata->key)),
@@ -4216,7 +4329,11 @@ custom_fetch_feed(gpointer key, gpointer
 void evo_window_popup(GtkWidget *win)
 {
 	gint x, y, sx, sy, new_x, new_y;
+#if GTK_VERSION >= 2014000
 	GdkWindow *window = gtk_widget_get_window(win);
+#else
+	GdkWindow *window = win->window;
+#endif
 
 	g_return_if_fail(win != NULL);
 	g_return_if_fail(window != NULL);
@@ -4359,17 +4476,6 @@ custom_feed_timeout(void)
 		statuscb);
 }
 
-static void
-rss_online(CamelSession *o, void *event_data, void *data)
-{
-	d("Apoc, are we online?... Almost.\n");
-#if (DATASERVER_VERSION >= 2031002)
-	rf->online =  camel_session_get_online (o);
-#else
-	rf->online =  camel_session_is_online (o);
-#endif
-}
-
 #if EVOLUTION_VERSION < 22900 //KB//
 struct __EShellPrivate {
 	/* IID for registering the object on OAF.  */
@@ -4440,27 +4546,11 @@ void org_gnome_cooly_rss_startup(void *e
 		G_CALLBACK(store_folder_renamed), NULL);
 	g_signal_connect(store, "folder_deleted",
 		G_CALLBACK(store_folder_deleted), NULL);
-	g_signal_connect(
-#if EVOLUTION_VERSION < 22900 //kb//
-			mail_component_peek_session(NULL),
-#else
-			session,
-#endif
-			"online", G_CALLBACK(rss_online), NULL);
 #else
 	camel_object_hook_event(store, "folder_renamed",
 		(CamelObjectEventHookFunc)store_folder_renamed, NULL);
 	camel_object_hook_event(store, "folder_deleted",
 		(CamelObjectEventHookFunc)store_folder_deleted, NULL);
-	camel_object_hook_event(
-#if EVOLUTION_VERSION < 22900 //kb//
-			mail_component_peek_session(NULL),
-#else
-			session,
-#endif
-			"online",
-			(CamelObjectEventHookFunc)rss_online,
-			NULL);
 #endif
 }
 
@@ -4944,16 +5034,7 @@ e_plugin_lib_enable(EPlugin *ep, int ena
 			/*D-BUS init*/
 			rf->bus = init_dbus ();
 #endif
-			if (!rf->activity)	//keeping track of taskbar operations
-				rf->activity = g_hash_table_new_full(
-						g_str_hash,
-						g_str_equal,
-						NULL, NULL);
-			if (!rf->error_hash)	//keeping trask of taskbar errors
-				rf->error_hash = g_hash_table_new_full(
-							g_str_hash,
-							g_str_equal,
-							g_free, NULL);
+			prepare_hashes();
 			//there is no shutdown for e-plugin yet.
 			atexit(rss_finalize);
 			render = GPOINTER_TO_INT(
@@ -5048,6 +5129,7 @@ create_mail(create_feed *CF)
 	tmp = decode_entities(CF->subj);
 	tmp2 = markup_decode(tmp);
 	safe_subj = camel_header_encode_string((unsigned char *)tmp2);
+	g_strdelimit(safe_subj, "\n", ' ');
 	camel_mime_message_set_subject(new, safe_subj);
 	g_free(tmp);
 	g_free(tmp2);
@@ -5238,10 +5320,10 @@ create_mail(create_feed *CF)
 		&& !rf->import
 		&& !CF->encl
 		&& !g_list_length(CF->attachments)) {	//do not filter enclosure at this time nor media files
-		g_warning("FILTER DISABLED\n");
-/*		filter_uids = g_ptr_array_sized_new(1);
+//		g_warning("FILTER DISABLED\n");
+		filter_uids = g_ptr_array_sized_new(1);
 		g_ptr_array_add(filter_uids, appended_uid);
-		mail_filter_on_demand (mail_folder, filter_uids);*/
+		mail_filter_on_demand (mail_folder, filter_uids);
 /* FIXME do not know how to free this */
 //		g_object_weak_ref((GObject *)filter_uids, free_filter_uids, NULL);
 	}
@@ -5389,6 +5471,8 @@ process_attachments(create_feed *CF)
 	do {
 		gchar *tmpdir, *name;
 
+		if (!strlen(l->data))
+			continue;
 		if (g_list_find_custom(rf->enclist, l->data,
 			(GCompareFunc)strcmp))
 			continue;
@@ -5584,7 +5668,7 @@ display_comments (RDF *r, EMFormatHTML *
 	xmlNodePtr root = xmlDocGetRootElement (r->cache);
 	if (tree_walk (root, r)) {
 		gchar *comments = update_comments(r);
-		tmp = process_images(comments, r->uri, format);
+		tmp = process_images(comments, r->uri, TRUE, format);
 		g_free(comments);
 		if (r->maindate)
 			g_free(r->maindate);
@@ -5732,32 +5816,33 @@ get_feed_age(RDF *r, gpointer name)
 		uids = camel_folder_get_uids (folder);
 		camel_folder_freeze(folder);
 		for (i = 0; i < uids->len; i++) {
-		g_print("notpresent\n");
 			el = NULL;
 			match = FALSE;
 			message = camel_folder_get_message(folder, uids->pdata[i], NULL);
-				g_print("got message\n");
 			if (message == NULL)
 				break;
-				g_print("got message\n");
 			feedid  = (gchar *)camel_medium_get_header (
 					CAMEL_MEDIUM(message),
 					"X-Evolution-Rss-Feed-id");
-			g_print("got header\n");
-			if (!r->uids)
+			if (!r->uids) {
+#if (DATASERVER_VERSION >= 2031001)
+				g_object_unref (message);
+#else
+				camel_object_unref (message);
+#endif
 				break;
+			}
 
 			for (j=0; NULL != (el = g_array_index(r->uids, gpointer, j)); j++) {
 				if (!g_ascii_strcasecmp(g_strstrip(feedid), g_strstrip(el))) {
 					match = TRUE;
-					g_object_unref(message);
 					break;
 				}
 			}
 			if (!match) {
-				g_print("info\n");
+//				g_print("info\n");
 				info = camel_folder_get_message_info(folder, uids->pdata[i]);
-				g_print("info done\n");
+//				g_print("info done\n");
 				flags = camel_message_info_flags(info);
 				if ((del_unread) && !(flags & CAMEL_MESSAGE_FLAGGED)) {
 					gchar *feed_dir, *feed_name;
@@ -5772,24 +5857,26 @@ get_feed_age(RDF *r, gpointer name)
 				}
 				camel_folder_free_message_info(folder, info);
 			}
-			g_object_unref(message);
+#if (DATASERVER_VERSION >= 2031001)
+			g_object_unref (message);
+#else
+			camel_object_unref (message);
+#endif
 		}
 		camel_folder_free_uids (folder, uids);
 		camel_folder_sync (folder, TRUE, NULL);
 		camel_folder_thaw(folder);
 		camel_folder_expunge (folder, NULL);
-		g_print("notpresent done\n");
 	}
 	if (del_feed == 2) {
 		guint del_days = GPOINTER_TO_INT(g_hash_table_lookup(rf->hrdel_days, key));
-		g_print("feed ==2\n");
 		uids = camel_folder_get_uids (folder);
 		camel_folder_freeze(folder);
 		for (i = 0; i < uids->len; i++) {
-			g_print("get info\n");
 			info = camel_folder_get_message_info(folder, uids->pdata[i]);
-			g_print("got info\n");
-			if (info && rf->current_uid && strcmp(rf->current_uid, uids->pdata[i])) {
+			if (info == NULL)
+				continue;
+			if (rf->current_uid && strcmp(rf->current_uid, uids->pdata[i])) {
 				date = camel_message_info_date_sent(info);
 				if (date < now - del_days * 86400) {
 					flags = camel_message_info_flags(info);
@@ -5804,19 +5891,17 @@ get_feed_age(RDF *r, gpointer name)
 							camel_folder_delete_message(folder, uids->pdata[i]);
 						}
 				}
-				camel_folder_free_message_info(folder, info);
 			}
+			camel_folder_free_message_info(folder, info);
 		}
 		camel_folder_free_uids (folder, uids);
 		camel_folder_sync (folder, TRUE, NULL);
 		camel_folder_thaw(folder);
 		camel_folder_expunge (folder, NULL);
-		g_print("feed ==2 done\n");
 	}
 	if (del_feed == 1) {
 		guint del_messages = GPOINTER_TO_INT(g_hash_table_lookup(rf->hrdel_messages, key));
 		guint total = camel_folder_get_message_count(folder);
-	g_print("del?\n");
 		i=1;
 		while (del_messages < camel_folder_get_message_count(folder)
 			- camel_folder_get_deleted_message_count(folder) && i <= total) {
--- evolution-rss-0.1.9//src/rss-cache.c	2010-05-19 10:58:13.000000000 +0200
+++ evolution-rss-0.2.0//src/rss-cache.c	2010-06-08 16:32:44.000000000 +0200
@@ -99,10 +99,41 @@ rss_cache_get(gchar *url)
 	return camel_data_cache_get(cache, HTTP_CACHE_PATH, url, NULL);
 }
 
+#if DATASERVER_VERSION <= 2025004
+#define CAMEL_DATA_CACHE_BITS (6)
+#define CAMEL_DATA_CACHE_MASK ((1<<CAMEL_DATA_CACHE_BITS)-1)
+
+static char *
+data_cache_path(
+	CamelDataCache *cdc, int create, const char *path, const char *key)
+{
+	char *dir, *real;
+	char *tmp = NULL;
+	guint32 hash;
+
+	hash = g_str_hash(key);
+	hash = (hash>>5)&CAMEL_DATA_CACHE_MASK;
+	dir = alloca(strlen(cdc->path) + strlen(path) + 8);
+	sprintf(dir, "%s/%s/%02x", cdc->path, path, hash);
+	tmp = camel_file_util_safe_filename(key);
+	if (!tmp)
+		return NULL;
+	real = g_strdup_printf("%s/%s", dir, tmp);
+	g_free(tmp);
+
+	return real;
+}
+#endif
+
+
 gchar*
 rss_cache_get_filename(gchar *url)
 {
+#if DATASERVER_VERSION <= 2025004
+	return data_cache_path(cache, FALSE, HTTP_CACHE_PATH, url);
+#else
 	return camel_data_cache_get_filename(cache, HTTP_CACHE_PATH, url, NULL);
+#endif
 }
 
 CamelStream*
--- evolution-rss-0.1.9//src/rss-config.c	2010-05-19 10:58:13.000000000 +0200
+++ evolution-rss-0.2.0//src/rss-config.c	2010-07-09 17:01:15.000000000 +0200
@@ -17,6 +17,7 @@
  */
 
 #include <gconf/gconf.h>
+#include <gconf/gconf-client.h>
 #include <glib.h>
 #include <glib/gi18n-lib.h>
 #include <stdio.h>
@@ -558,13 +559,12 @@ get_main_folder(void)
 	g_free(feed_dir);
 	if (g_file_test(feed_file, G_FILE_TEST_EXISTS)) {
 		FILE *f = fopen(feed_file, "r");
-		if (f) {
-			if (fgets(mf, 511, f) != NULL) {
-				fclose(f);
-				g_free(feed_file);
-				return g_strdup(mf);
-			}
+		if (f && fgets(mf, 511, f) != NULL) {
+			fclose(f);
+			g_free(feed_file);
+			return g_strdup(mf);
 		}
+		fclose(f);
 	}
 	g_free(feed_file);
 	return g_strdup(DEFAULT_FEEDS_FOLDER);
@@ -640,10 +640,10 @@ migrate_crc_md5(const char *name, gchar
 				(void)fseek(fw, 0L, SEEK_SET);
 				fwrite(rfeed, strlen(rfeed), 1, fw);
 			}
-			fclose(fw);
 			unlink(feed_name);
 		}
-		fclose(fr);
+		if (fr) fclose(fr);
+		if (fw)	fclose(fw);
 	}
 	g_free(feed_name);
 	feed_name = g_build_path(G_DIR_SEPARATOR_S, feed_dir, crc2, NULL);
@@ -658,11 +658,10 @@ migrate_crc_md5(const char *name, gchar
 				(void)fseek(fw, 0L, SEEK_SET);
 				fwrite(rfeed, strlen(rfeed), 1, fw);
 			}
-			fclose(fw);
 			unlink(feed_name);
 		}
-		fclose(fr);
-
+		if (fr) fclose(fr);
+		if (fw)	fclose(fw);
 	}
 
 	g_free(feed_name);
--- evolution-rss-0.1.9//src/rss-config-factory.c	2010-05-19 10:58:13.000000000 +0200
+++ evolution-rss-0.2.0//src/rss-config-factory.c	2010-07-20 22:32:03.000000000 +0200
@@ -65,6 +65,7 @@ extern int rss_verbose_debug;
 #include "network-soup.h"
 #include "notification.h"
 
+GHashTable *tmphash = NULL;
 static guint feed_enabled = 0;
 static guint feed_validate = 0;
 static guint feed_html = 0;
@@ -557,7 +558,7 @@ build_dialog_add(gchar *url, gchar *feed
 	checkbutton1 = GTK_WIDGET (gtk_builder_get_object(gui, "html_check"));
 	gtk_toggle_button_set_active (
 		GTK_TOGGLE_BUTTON (checkbutton1),
-		1-fhtml);
+		fhtml);
 
 	checkbutton2 = GTK_WIDGET (gtk_builder_get_object(gui, "enabled_check"));
 	gtk_toggle_button_set_active (
@@ -705,7 +706,13 @@ build_dialog_add(gchar *url, gchar *feed
 
 	ok = GTK_WIDGET (
 		gtk_builder_get_object(gui, "ok_button"));
+#if GTK_VERSION < 2018000
+	GTK_WIDGET_SET_FLAGS (
+		ok,
+		GTK_CAN_DEFAULT);
+#else
 	gtk_widget_set_can_default (ok, TRUE);
+#endif
 	d("/*Gtk-CRITICAL **: gtk_box_pack: assertion `child->parent == NULL' failed*/");
 	gtk_dialog_add_action_widget (
 		(GtkDialog *)dialog1,
@@ -718,7 +725,13 @@ build_dialog_add(gchar *url, gchar *feed
 		GTK_DIALOG (dialog1),
 		cancel,
 		GTK_RESPONSE_CANCEL);
+#if GTK_VERSION < 2018000
+	GTK_WIDGET_SET_FLAGS (
+		cancel,
+		GTK_CAN_DEFAULT);
+#else
 	gtk_widget_set_can_default (cancel, TRUE);
+#endif
 
 	gtk_widget_add_accelerator (
 		ok,
@@ -780,7 +793,6 @@ actions_dialog_add(add_feed *feed, gchar
 				gtk_entry_get_text(GTK_ENTRY(entry1)));
 		fhtml = gtk_toggle_button_get_active (
 			GTK_TOGGLE_BUTTON (checkbutton1));
-		fhtml ^= 1;
 		feed->fetch_html = fhtml;
 		feed->enabled = gtk_toggle_button_get_active(
 			GTK_TOGGLE_BUTTON(checkbutton2));
@@ -899,12 +911,21 @@ feeds_dialog_add(GtkDialog *d, gpointer
 		NULL);
 #endif
 	progress = gtk_progress_bar_new();
+#if GTK_VERSION >= 2014000
 	gtk_box_pack_start(
 		GTK_BOX(gtk_dialog_get_content_area(GTK_DIALOG(msg_feeds))),
 		progress,
 		FALSE,
 		FALSE,
 		0);
+#else
+	gtk_box_pack_start(
+		GTK_BOX(GTK_DIALOG(msg_feeds)->vbox),
+		progress,
+		FALSE,
+		FALSE,
+		0);
+#endif
 	gtk_progress_bar_set_fraction(
 		(GtkProgressBar *)progress,
 		0);
@@ -1292,7 +1313,11 @@ remove_feed_dialog(gchar *msg)
 #endif
 	gtk_window_set_keep_above(GTK_WINDOW(dialog1), TRUE);
 
+#if GTK_VERSION >= 2014000
 	dialog_vbox1 = gtk_dialog_get_content_area(GTK_DIALOG (dialog1));
+#else
+	dialog_vbox1 = GTK_DIALOG (dialog1)->vbox;
+#endif
 	gtk_widget_show (dialog_vbox1);
 
 	vbox1 = gtk_vbox_new (FALSE, 10);
@@ -1327,7 +1352,11 @@ remove_feed_dialog(gchar *msg)
 		FALSE,
 		0);
 
+#if GTK_VERSION >= 2014000
 	dialog_action_area1 = gtk_dialog_get_action_area(GTK_DIALOG (dialog1));
+#else
+	dialog_action_area1 = GTK_DIALOG (dialog1)->action_area;
+#endif
 	gtk_widget_show (dialog_action_area1);
 	gtk_button_box_set_layout (
 		GTK_BUTTON_BOX (dialog_action_area1),
@@ -1396,12 +1425,21 @@ process_dialog_edit(add_feed *feed, gcha
 		NULL);
 #endif
 	progress = gtk_progress_bar_new();
+#if GTK_VERSION >= 2014000
 	gtk_box_pack_start(
 		GTK_BOX(gtk_dialog_get_content_area(GTK_DIALOG(msg_feeds))),
 		progress,
 		FALSE,
 		FALSE,
 		0);
+#else
+	gtk_box_pack_start(
+		GTK_BOX(GTK_DIALOG(msg_feeds)->vbox),
+		progress,
+		FALSE,
+		FALSE,
+		0);
+#endif
 	gtk_progress_bar_set_fraction((GtkProgressBar *)progress, 0);
 	/* xgettext:no-c-format */
 	gtk_progress_bar_set_text((GtkProgressBar *)progress, _("0% done"));
@@ -1554,7 +1592,7 @@ feeds_dialog_edit(GtkDialog *d, gpointer
 				gtk_widget_destroy(feed->dialog);
 			process_dialog_edit(feed, name, feed_name);
 		}
-		if (feed->feed_url)
+		if (feed && feed->feed_url)
 			store_redraw(GTK_TREE_VIEW(rf->treeview));
 	}
 }
@@ -1589,18 +1627,20 @@ import_one_feed(gchar *url, gchar *title
 	feed->prefix = g_strdup(prefix);
 	rf->progress_bar = import_progress;
 	rf->progress_dialog = import_dialog;
-	if (g_hash_table_find(
-		rf->hr,
-		check_if_match,
-		feed->feed_url)) {
+	if ((g_hash_table_find(rf->hr, check_if_match,feed->feed_url))
+	   || (g_hash_table_find(tmphash, check_if_match, feed->feed_url))) {
 		rss_error(
 			title,
 			feed->feed_name,
 			_("Error adding feed."),
 			_("Feed already exists!"));
 		rf->import--;
-	} else
+	} else {
 		setup_feed(feed);
+		g_hash_table_insert(tmphash,
+			g_strdup(url),
+			g_strdup(url));
+	}
 
 	/* this allows adding feeds somewhat synchronous way
 	 * it is very convenient to be able to cancel importing
@@ -1664,7 +1704,9 @@ error:		rss_error(NULL,
 		goto out;
 	}
 	doc = src;
-	msg = g_strdup(_("Importing feeds..."));
+	tmp = g_path_get_basename(file);
+	msg = g_strdup_printf("%s: %s", _("Importing"), tmp);
+	g_free(tmp);
 #if EVOLUTION_VERSION < 22904
 	import_dialog = e_error_new(
 		GTK_WINDOW(rf->preferences),
@@ -1688,6 +1730,7 @@ error:		rss_error(NULL,
 		NULL);
 	import_label = gtk_label_new(_("Please wait"));
 	import_progress = gtk_progress_bar_new();
+#if GTK_VERSION >= 2014000
 	gtk_box_pack_start(
 		GTK_BOX(gtk_dialog_get_content_area(GTK_DIALOG(import_dialog))),
 		import_label,
@@ -1700,6 +1743,20 @@ error:		rss_error(NULL,
 		FALSE,
 		FALSE,
 		0);
+#else
+	gtk_box_pack_start(
+		GTK_BOX(GTK_DIALOG(import_dialog)->vbox),
+		import_label,
+		FALSE,
+		FALSE,
+		0);
+	gtk_box_pack_start(
+		GTK_BOX(GTK_DIALOG(import_dialog)->vbox),
+		import_progress,
+		FALSE,
+		FALSE,
+		0);
+#endif
 	gtk_widget_show_all(import_dialog);
 	g_free(msg);
 	if ((src = src->children)) {
@@ -1767,6 +1824,12 @@ error:		rss_error(NULL,
 	src = src->children;
 	maintitle = (gchar *)layer_find(src, "title", NULL);
 	rf->import=2;
+	if (!tmphash)
+		tmphash = g_hash_table_new_full(
+				g_str_hash,
+				g_str_equal,
+				g_free,
+				g_free);
 	progress = 0;
 	rf->display_cancel=0; //clean this signal - as by this time we already cancel all displaying feed
 	while (src) {
@@ -1877,6 +1940,7 @@ fail:					g_free(rssprefix);
 	}
 		goto out;
 	}
+	g_print("MARK #1\n");
 
 	while ((src = iterate_import_file(src, &url, &name, type))) {
 		if (url && strlen(url)) {
@@ -1906,7 +1970,9 @@ fail:					g_free(rssprefix);
 	}
 	while (gtk_events_pending ())
 		gtk_main_iteration ();
-out:	//prevent reseting queue before its time dues do async operations
+out:	g_hash_table_destroy(tmphash);
+	tmphash=NULL;
+	//prevent reseting queue before its time dues do async operations
 	if (rf->import) rf->import -= 2;
 	rf->import_cancel = 0;
 	if (maintitle) xmlFree(maintitle);
@@ -2114,11 +2180,20 @@ create_import_dialog (void)
 		GTK_WINDOW (import_file_select),
 		GDK_WINDOW_TYPE_HINT_DIALOG);
 
+#if GTK_VERSION >= 2014000
 	dialog_vbox5 = gtk_dialog_get_content_area(GTK_DIALOG (import_file_select));
+#else
+	dialog_vbox5 = GTK_DIALOG (import_file_select)->vbox;
+#endif
 	gtk_widget_show (dialog_vbox5);
 
+#if GTK_VERSION >= 2014000
 	dialog_action_area5 = gtk_dialog_get_action_area(
 				GTK_DIALOG (import_file_select));
+#else
+	dialog_action_area5 = GTK_DIALOG (import_file_select)->action_area;
+#endif
+
 	gtk_widget_show (dialog_action_area5);
 	gtk_button_box_set_layout (
 		GTK_BUTTON_BOX (dialog_action_area5),
@@ -2130,9 +2205,15 @@ create_import_dialog (void)
 		GTK_DIALOG (import_file_select),
 		button1,
 		GTK_RESPONSE_CANCEL);
+#if GTK_VERSION < 2018000
+	GTK_WIDGET_SET_FLAGS (
+		button1,
+		GTK_CAN_DEFAULT);
+#else
 	gtk_widget_set_can_default (
 		button1,
 		TRUE);
+#endif
 
 	button2 = gtk_button_new_from_stock ("gtk-open");
 	gtk_widget_show (button2);
@@ -2140,7 +2221,13 @@ create_import_dialog (void)
 		GTK_DIALOG (import_file_select),
 		button2,
 		GTK_RESPONSE_OK);
+#if GTK_VERSION < 2018000
+	GTK_WIDGET_SET_FLAGS (
+		button2,
+		GTK_CAN_DEFAULT);
+#else
 	gtk_widget_set_can_default(button2, TRUE);
+#endif
 
 	gtk_widget_grab_default (button2);
 	return import_file_select;
@@ -2183,11 +2270,19 @@ create_export_dialog (void)
 		GTK_WINDOW (export_file_select),
 		GDK_WINDOW_TYPE_HINT_DIALOG);
 
+#if GTK_VERSION >= 2014000
 	vbox26 = gtk_dialog_get_content_area(GTK_DIALOG (export_file_select));
+#else
+	vbox26 = GTK_DIALOG (export_file_select)->vbox;
+#endif
 	gtk_widget_show (vbox26);
 
+#if GTK_VERSION >= 2014000
 	hbuttonbox1 = gtk_dialog_get_action_area(
 			GTK_DIALOG (export_file_select));
+#else
+	hbuttonbox1 = GTK_DIALOG (export_file_select)->action_area;
+#endif
 	gtk_widget_show (hbuttonbox1);
 	gtk_button_box_set_layout (
 		GTK_BUTTON_BOX (hbuttonbox1),
@@ -2199,14 +2294,25 @@ create_export_dialog (void)
 		GTK_DIALOG (export_file_select),
 		button3,
 		GTK_RESPONSE_CANCEL);
+#if GTK_VERSION < 2018000
+	GTK_WIDGET_SET_FLAGS (
+		button3,
+		GTK_CAN_DEFAULT);
+#else
 	gtk_widget_set_can_default(button3, TRUE);
-
+#endif
 	button4 = gtk_button_new_from_stock ("gtk-save");
 	gtk_widget_show (button4);
 	gtk_dialog_add_action_widget (
 		GTK_DIALOG (export_file_select),
 		button4, GTK_RESPONSE_OK);
+#if GTK_VERSION < 2018000
+	GTK_WIDGET_SET_FLAGS (
+		button4,
+		GTK_CAN_DEFAULT);
+#else
 	gtk_widget_set_can_default(button4, TRUE);
+#endif
 
 	gtk_widget_grab_default (button4);
 	return export_file_select;
@@ -2491,7 +2597,11 @@ export_opml(gchar *file)
 //        g_signal_connect(import_dialog, "response", G_CALLBACK(import_dialog_response), NULL);
 	import_label = gtk_label_new(_("Please wait"));
 	import_progress = gtk_progress_bar_new();
+#if GTK_VERSION >= 2014000
 	content_area = gtk_dialog_get_content_area(GTK_DIALOG(import_dialog));
+#else
+	content_area = GTK_DIALOG(import_dialog)->vbox;
+#endif
 	gtk_box_pack_start(
 		GTK_BOX(content_area),
 		import_label,
@@ -2948,10 +3058,17 @@ e_plugin_lib_get_configure_widget (EPlug
 		"rss-html-rendering.ui",
 		NULL);
 	ui->xml = gtk_builder_new ();
+#if GTK_VERSION >= 2014000
 	if (!gtk_builder_add_objects_from_file (ui->xml, uifile, toplevel, &error)) {
 		g_warning ("Couldn't load builder file: %s", error->message);
 		g_error_free (error);
 	}
+#else
+	g_warning("gtk too old! cannot create ui file. need >= 2.14\n");
+	g_free(ui);
+	// and not very interesed to back port this
+	return NULL;
+#endif
 	g_free (uifile);
 
 	ui->combobox = GTK_WIDGET (gtk_builder_get_object(ui->xml, "hbox1"));
@@ -3192,9 +3309,9 @@ void rss_folder_factory_commit (EPlugin
 	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");
-	gchar *ofolder = (gchar *)g_object_get_data((GObject *)epl, "ofolder");
+	add_feed *feed = (add_feed *)g_object_get_data((GObject *)target->config->widget, "add-feed");
+	gchar *url = (gchar *)g_object_get_data((GObject *)target->config->widget, "url");
+	gchar *ofolder = (gchar *)g_object_get_data((GObject *)target->config->widget, "ofolder");
 
 	EMConfigTargetFolder *targetfolder =
 		(EMConfigTargetFolder *)target->config->target;
@@ -3238,7 +3355,6 @@ void rss_folder_factory_commit (EPlugin
 	feed->feed_url = g_strdup(gtk_entry_get_text(GTK_ENTRY(entry1)));
 	fhtml = gtk_toggle_button_get_active (
 			GTK_TOGGLE_BUTTON (checkbutton1));
-	fhtml ^= 1;
 	feed->fetch_html = fhtml;
 	feed->enabled = gtk_toggle_button_get_active(
 		GTK_TOGGLE_BUTTON(checkbutton2));
@@ -3305,9 +3421,9 @@ void rss_folder_factory_commit (EPlugin
 		g_hash_table_remove(rf->hrpass, url);
 
 	if (auth_enabled) {
-		g_hash_table_insert(rf->hruser, url,
+		g_hash_table_insert(rf->hruser, g_strdup(url),
 			g_strdup(gtk_entry_get_text (GTK_ENTRY (authuser))));
-		g_hash_table_insert(rf->hrpass, url,
+		g_hash_table_insert(rf->hrpass, g_strdup(url),
 			g_strdup(gtk_entry_get_text (GTK_ENTRY (authpass))));
 		save_up(url);
 	} else
@@ -3370,12 +3486,12 @@ rss_folder_factory (EPlugin *epl, EConfi
 			NULL,
 			0);
 		g_object_set_data_full (
-			G_OBJECT (epl),
+			G_OBJECT (data->parent),
 			"add-feed",
 			feed,
 			NULL);
-		g_object_set_data_full (G_OBJECT (epl), "url", url, NULL);
-		g_object_set_data_full (G_OBJECT (epl), "ofolder", ofolder, NULL);
+		g_object_set_data_full (G_OBJECT (data->parent), "url", url, NULL);
+		g_object_set_data_full (G_OBJECT (data->parent), "ofolder", ofolder, NULL);
 		ok = GTK_WIDGET (
 			gtk_builder_get_object(feed->gui, "ok_button"));
 
--- evolution-rss-0.1.9//src/rss.h	2010-05-19 10:58:13.000000000 +0200
+++ evolution-rss-0.2.0//src/rss.h	2010-06-29 21:01:02.000000000 +0200
@@ -68,6 +68,7 @@
 #define NETWORK_TIMEOUT (180000)
 
 typedef struct _RDF {
+	gchar		*base;
 	char		*uri;
 	char		*html;
 	xmlDocPtr	cache;
--- evolution-rss-0.1.9//src/rss-image.c	2010-05-19 10:58:13.000000000 +0200
+++ evolution-rss-0.2.0//src/rss-image.c	2010-07-20 22:32:03.000000000 +0200
@@ -88,6 +88,7 @@ update_feed_image(RDF *r)
 		dup_auth_data(r->uri, image);
 		fi->feed_fs = feed_fs;
 		fi->key = g_strdup(key);
+		d("call finish_create_icon_stream\n");
 		fetch_unblocking(image,
 			textcb,
 			NULL,
@@ -103,6 +104,7 @@ update_feed_image(RDF *r)
 		gchar *server = get_server_from_uri(r->uri);
 		//authentication data might be different
 		dup_auth_data(r->uri, server);
+		d("call finish_update_feed_image\n");
 		fetch_unblocking(
 			server,
 			textcb,
@@ -450,6 +452,50 @@ out:	g_free(img_file);
 }
 #endif
 
+gchar *
+decode_image_cache_filename(gchar *name)
+{
+	gsize size;
+	gchar *csum, *tname;
+	gchar *tmp;
+	tmp = (gchar *)g_base64_decode(name+4, &size);
+	csum = g_compute_checksum_for_string(G_CHECKSUM_SHA1,
+			tmp, -1);
+	g_free(tmp);
+	tname = rss_cache_get_filename(csum);
+	g_free(csum);
+	return tname;
+}
+
+gboolean image_is_valid(gchar *image);
+
+gboolean
+file_is_image(gchar *image)
+{
+	gchar *mime_type, *contents;
+	gsize length;
+	gboolean result = TRUE;
+
+	g_return_val_if_fail(image != NULL, FALSE);
+
+	/*need to get mime type via file contents or else mime type is
+	 * bound to be wrong, especially on files fetched from the web
+	 * this is very important as we might get quite a few images
+	 * missing otherwise */
+	g_file_get_contents (image,
+		&contents,
+		&length,
+		NULL);
+	mime_type = g_content_type_guess(NULL,
+			(guchar *)contents, length, NULL);
+	/*FIXME mime type here could be wrong */
+	if (g_ascii_strncasecmp (mime_type, "image/", 6))
+		result = FALSE;
+	g_free(mime_type);
+	g_free(contents);
+	return result;
+}
+
 /* validates if image is indeed an image file
  * if image file is not found it tries to fetch it
  * we need to check mime time against content
@@ -458,15 +504,22 @@ out:	g_free(img_file);
 gchar *
 verify_image(gchar *uri, EMFormatHTML *format)
 {
-	gchar *mime_type, *contents;
-	gsize length;
 	gchar *nurl, *turl;
 	gchar *base_dir, *feed_dir, *name;
-	gchar *scheme, *result;
+	gchar *scheme, *tname;
+	gchar *result = NULL;
+	gchar *duri = NULL;
 
 	g_return_val_if_fail(uri != NULL, NULL);
 
-	if (!g_file_test((gchar *)uri, G_FILE_TEST_EXISTS)) {
+	if (strstr(uri, "img:"))
+		duri = decode_image_cache_filename(uri);
+	else {
+		if (!(duri = g_filename_from_uri(uri, NULL, NULL)))
+			duri = g_strdup(uri);
+	}
+
+	if (!g_file_test(duri, G_FILE_TEST_EXISTS)) {
 			camel_url_decode((gchar *)uri);
 			//FIXME lame method of extracting data cache path
 			//there must be a function in camel for getting data cache path
@@ -484,46 +537,58 @@ verify_image(gchar *uri, EMFormatHTML *f
 			if (!scheme) {
 				nurl = strextr((gchar *)uri, feed_dir);
 				g_free(feed_dir);
-				turl = nurl + 4;
+				turl = nurl + 4; // skip cache directory
 				name = fetch_image_redraw(turl, NULL, format);
 				g_free(nurl);
 			} else {
+				if (!strcmp(scheme, "file"))
+					goto fail;
 				turl = uri;
 				name = fetch_image_redraw(uri, NULL, format);
 				g_free(scheme);
 			}
 			g_free(base_dir);
-			result = g_filename_to_uri (name, NULL, NULL);
-			g_free(name);
+			if (name) {
+				tname = decode_image_cache_filename(name);
+				g_free(name);
+#if (EVOLUTION_VERSION >= 23000)
+				result = g_filename_to_uri (tname, NULL, NULL);
+#else
+				result = g_strdup(tname);
+#endif
+				if (!file_is_image(tname)) {
+					g_free(tname);
+					goto fail;
+				}
+				g_free(tname);
+			}
+
+			if (duri)
+				g_free(duri);
 			return result;
 	} else {
-		/*need to get mime type via file contents or else mime type is
-		 * bound to be wrong, especially on files fetched from the web
-		 * this is very important as we might get quite a few images
-		 * missing otherwise */
-		g_file_get_contents (uri,
-			&contents,
-			&length,
-			NULL);
-		mime_type = g_content_type_guess(NULL, (guchar *)contents, length, NULL);
-		/*FIXME mime type here could be wrong */
-		if (g_ascii_strncasecmp (mime_type, "image/", 6)) {
-			result = g_filename_to_uri (pixfile, NULL, NULL);
-			return result;
-		}
-		g_free(mime_type);
-		g_free(contents);
+		if (!file_is_image(duri))
+			goto fail;
 /*
  * appears the default has changed in efh_url_requested
  * the new default is file://
  * http://git.gnome.org/browse/evolution/commit/?id=d9deaf9bbc7fd9d0c72d5cf9b1981e3a56ed1162
  */
 #if (EVOLUTION_VERSION >= 23000)
-		return g_filename_to_uri(uri, NULL, NULL);
+		return g_filename_to_uri(duri?duri:uri, NULL, NULL);
 #else
-		return NULL;
+		return duri?duri:uri;
 #endif
 	}
+fail:
+#if (EVOLUTION_VERSION >= 23000)
+			result = g_filename_to_uri (pixfile, NULL, NULL);
+#else
+			result = g_strdup(pixfile);
+#endif
+			if (duri)
+				g_free(duri);
+			return result;
 }
 
 // constructs url from @base in case url is relative
@@ -533,10 +598,16 @@ fetch_image_redraw(gchar *url, gchar *li
 	GError *err = NULL;
 	gchar *tmpurl = NULL;
 	FEED_IMAGE *fi = NULL;
-	gchar *result, *safe, *cache_file;
+	gchar *result, *cache_file;
+	gchar *intern, *burl;
+	gsize size;
 
 	g_return_val_if_fail(url != NULL, NULL);
 
+	if (strstr(url, "img:"))
+		tmpurl = (gchar *)g_base64_decode(url+4, &size);
+	else {
+
 	if (strstr(url, "://") == NULL) {
 		if (*url == '.') //test case when url begins with ".."
 			tmpurl = g_strconcat(
@@ -558,21 +629,23 @@ fetch_image_redraw(gchar *url, gchar *li
 
 	if (!tmpurl)
 		return NULL;
+	}
 
-	safe = g_compute_checksum_for_string (
-			G_CHECKSUM_SHA1, tmpurl, -1);
+	intern = g_compute_checksum_for_string(G_CHECKSUM_SHA1,
+			tmpurl, -1);
 	if (g_hash_table_find(rf->key_session,
 			check_key_match,
 			tmpurl)) {
 		goto working;
 	}
-	d("fetch_image_redraw() tmpurl:%s, safe url:%s\n", tmpurl, safe);
-	cache_file = rss_cache_get_filename(safe);
+	cache_file = rss_cache_get_filename(intern);
+	d("fetch_image_redraw() tmpurl:%s, intern: %s\n",
+		tmpurl, cache_file);
 	if (!g_file_test (cache_file, G_FILE_TEST_EXISTS)) {
 		d("image cache MISS\n");
 		if (data) {
 			fi = g_new0(FEED_IMAGE, 1);
-			fi->url = g_strdup(safe);
+			fi->url = g_strdup(intern);
 			fi->data = data;
 			fetch_unblocking(tmpurl,
 				textcb,
@@ -582,7 +655,7 @@ fetch_image_redraw(gchar *url, gchar *li
 				1,
 				&err);
 		} else {
-			CamelStream *stream = rss_cache_add(safe);
+			CamelStream *stream = rss_cache_add(intern);
 			fetch_unblocking(tmpurl,
 				textcb,
 				NULL,
@@ -601,9 +674,10 @@ fetch_image_redraw(gchar *url, gchar *li
 	}
 	g_free(cache_file);
 
-working:result = rss_cache_get_path(FALSE, safe);
+working:burl = (gchar *)g_base64_encode((guchar *)tmpurl, strlen(tmpurl));
+	result = g_strdup_printf("img:%s", burl);
+	g_free(burl);
 error:	g_free(tmpurl);
-	g_free(safe);
 	return result;
 }
 
--- evolution-rss-0.1.9//src/rss-image.h	2010-05-19 10:58:13.000000000 +0200
+++ evolution-rss-0.2.0//src/rss-image.h	2010-05-26 16:36:59.000000000 +0200
@@ -26,6 +26,7 @@ typedef struct _FEED_IMAGE {
 
 void rss_load_images(void);
 gboolean display_folder_icon(GtkTreeStore *store, gchar *key);
+gchar *decode_image_cache_filename(gchar *name);
 void
 #if LIBSOUP_VERSION < 2003000
 finish_create_icon (SoupMessage *msg, FEED_IMAGE *user_data);
--- evolution-rss-0.1.9//src/strptime.c	2010-05-19 10:58:13.000000000 +0200
+++ evolution-rss-0.2.0//src/strptime.c	2010-06-03 15:35:36.000000000 +0200
@@ -1094,6 +1094,8 @@ __strptime_internal (const char *rp, con
   return (char *) rp;
 }
 
+char *
+strptime (const char *buf, const char *format, struct tm *tm);
 
 char *
 strptime (const char *buf, const char *format, struct tm *tm)

Attachment: signature.asc
Description: This is a digitally signed message part


Reply to: