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 ---
- To: submit@bugs.debian.org
- Subject: unblock: evolution-rss/0.2.0-1
- From: Josselin Mouette <joss@debian.org>
- Date: Sat, 18 Sep 2010 00:04:13 +0200
- Message-id: <[🔎] 1284761053.25124.11.camel@tomoyo>
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 ---
- To: Josselin Mouette <joss@debian.org>, 597240-done@bugs.debian.org
- Subject: Re: Bug#597240: unblock: evolution-rss/0.2.0-1
- From: Mehdi Dogguy <mehdi@dogguy.org>
- Date: Sat, 18 Sep 2010 13:11:00 +0200
- Message-id: <4C949E44.6080806@dogguy.org>
- In-reply-to: <[🔎] 1284761053.25124.11.camel@tomoyo>
- References: <[🔎] 1284761053.25124.11.camel@tomoyo>
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 ---