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

Bug#597240: marked as done (unblock: evolution-rss/0.2.0-1)



Your message dated Sat, 18 Sep 2010 13:11:00 +0200
with message-id <4C949E44.6080806@dogguy.org>
and subject line Re: Bug#597240: unblock: evolution-rss/0.2.0-1
has caused the Debian Bug report #597240,
regarding unblock: evolution-rss/0.2.0-1
to be marked as done.

This means that you claim that the problem has been dealt with.
If this is not the case it is now your responsibility to reopen the
Bug report if necessary, and/or fix the problem forthwith.

(NB: If you are a system administrator and have no idea what this
message is talking about, this may indicate a serious mail system
misconfiguration somewhere. Please contact owner@bugs.debian.org
immediately.)


-- 
597240: http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=597240
Debian Bug Tracking System
Contact owner@bugs.debian.org with problems
--- Begin Message ---
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


--- End Message ---
--- Begin Message ---
On 09/18/2010 12:04 AM, Josselin Mouette wrote:
> 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.
> 

Unblocked.

Regards,

-- 
Mehdi Dogguy مهدي الدڤي
http://dogguy.org/


--- End Message ---

Reply to: