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