evolution-rss r282 - in trunk: . src
- From: lucilanga svn gnome org
- To: svn-commits-list gnome org
- Subject: evolution-rss r282 - in trunk: . src
- Date: Mon, 2 Jun 2008 05:13:19 +0000 (UTC)
Author: lucilanga
Date: Mon Jun 2 05:13:18 2008
New Revision: 282
URL: http://svn.gnome.org/viewvc/evolution-rss?rev=282&view=rev
Log:
2008-06-02 Lucian Langa <lucilanga gnome org>
* implement prefectching of image and persistent
storage
Modified:
trunk/ChangeLog
trunk/TODO
trunk/src/rss.c
Modified: trunk/TODO
==============================================================================
--- trunk/TODO (original)
+++ trunk/TODO Mon Jun 2 05:13:18 2008
@@ -24,7 +24,6 @@
* offline storage for article's home page
* implement web controls for diferent redering <Webkits> or <Gecko>
* force soup to follow redirects (304) test on fedora weekly news
- * check loading of images in certain feeds
* search in the content of page for feed
* obey ttl entity
* check rename feed when evo 2.24 x86_64
@@ -32,3 +31,4 @@
* add debug points for showing steps of current operation (group operations)
* when adding a feed as opml file offer to import (file detection)
* possibly make network timeout customizable
+ * run-time migration function from text/evolution-rss-feed -> x-evolution/evolution-rss-feed
Modified: trunk/src/rss.c
==============================================================================
--- trunk/src/rss.c (original)
+++ trunk/src/rss.c Mon Jun 2 05:13:18 2008
@@ -69,6 +69,10 @@
#include <fcntl.h>
#include <stdlib.h>
+#ifndef O_BINARY
+#define O_BINARY 0
+#endif
+
#include <gdk/gdkkeysyms.h>
#include <gtk/gtk.h>
@@ -227,6 +231,7 @@
static void
dialog_key_destroy (GtkWidget *widget, gpointer data);
guint fallback_engine(void);
+gchar *fetch_image(gchar *url);
/*======================================================================*/
@@ -1799,6 +1804,9 @@
CamelMimePart *message = CAMEL_IS_MIME_MESSAGE(t->part) ?
t->part :
(CamelMimePart *)t->format->message;
+
+/// camel_folder_append_message (new_folder, message, info, NULL, ex);
+
const char *website = camel_medium_get_header (CAMEL_MEDIUM (message), "Website");
if (!website)
goto fmerror;
@@ -1914,33 +1922,8 @@
buffer2 = g_malloc(utf8len);
UTF8ToHtml(buffer2, &utf8len, buffer->data, &inlen);
g_byte_array_free (buffer, 1);
- xmlDoc *src = (xmlDoc *)parse_html_sux(buffer2, strlen(buffer2));
- if (src)
- {
- xmlNode *doc = (xmlNode *)src;
-
- while (doc = html_find(doc, "img"))
- {
- xmlChar *url = xmlGetProp(doc, "src");
- if (url)
- {
- gchar *str = strplchr((gchar *)url);
- xmlFree(url);
- xmlSetProp(doc, "src", str);
- g_free(str);
- }
- }
- xmlDocDumpMemory(src, &buff, &size);
- }
- else goto out;
- char *tmp = decode_html_entities(buff);
- g_free(buff);
- buff = tmp;
+ char *buff = decode_html_entities(buffer2);
-//#endif
-#ifdef RSS_DEBUG
- g_print("%s\n", buff);
-#endif
camel_stream_printf (fstream,
"<table border=1 width=\"100%%\" cellpadding=0 cellspacing=0><tr><td bgcolor=#ffffff>");
camel_stream_printf(fstream,
@@ -1959,6 +1942,7 @@
camel_object_unref(dw);
camel_object_unref(part);
camel_object_unref(fstream);
+ g_free(buff);
out: if (addr)
g_free(addr);
@@ -2240,7 +2224,7 @@
void
update_sr_message(void)
{
- if (flabel)
+ if (flabel && farticle)
{
gchar *fmsg = g_strdup_printf(_("Getting message %d of %d"), farticle, ftotal);
gtk_label_set_text (GTK_LABEL (flabel), fmsg);
@@ -2424,8 +2408,8 @@
if (!deleted)
{
- if (g_hash_table_lookup(rf->hrdel_feed, lookup_key(user_data)))
- get_feed_age(user_data, lookup_key(user_data));
+// if (g_hash_table_lookup(rf->hrdel_feed, lookup_key(user_data)))
+// get_feed_age(user_data, lookup_key(user_data));
}
//tout:
@@ -2534,10 +2518,10 @@
/* http://bugzilla.gnome.org/show_bug.cgi?id=513951 */
#if (EVOLUTION_VERSION >= 22300) // include devel too
return g_strdup_printf("%s/rss",
- mail_component_peek_base_directory (component));
+ mail_component_peek_base_directory (component));
#else
return g_strdup_printf("%s/mail/rss",
- mail_component_peek_base_directory (component));
+ mail_component_peek_base_directory (component));
#endif
}
@@ -3327,7 +3311,7 @@
char *match)
{
#ifdef RDF_DEBUG
-g_print("parser error 3_1!!!\n");
+g_print("parser entry 3_1!!!\n");
#endif
while (node) {
#ifdef RDF_DEBUG
@@ -3860,6 +3844,62 @@
free_cf(user_data);
}
+static void
+#if LIBSOUP_VERSION < 2003000
+finish_image (SoupMessage *msg, gchar *user_data)
+#else
+finish_image (SoupSession *soup_sess, SoupMessage *msg, gchar *user_data)
+#endif
+{
+ FILE *f;
+ f = fopen(user_data, "wb+");
+ if (f)
+ {
+#if LIBSOUP_VERSION < 2003000
+ fwrite(msg->response.body, msg->response.length, 1, f);
+#else
+ fwrite(msg->response_body->data, msg->response_body->length, 1, f);
+#endif
+ fclose(f);
+ }
+ g_free(user_data);
+}
+
+gchar *
+fetch_image(gchar *url)
+{
+ GError *err = NULL;
+ gchar *tmpdir = NULL;
+ gchar *name = NULL;
+ gchar *feed_dir = g_build_path("/", rss_component_peek_base_directory(mail_component_peek()), "static", NULL);
+ if (!g_file_test(feed_dir, G_FILE_TEST_EXISTS))
+ g_mkdir_with_parents (feed_dir, 0755);
+ gchar *template = g_build_path("/", feed_dir, "evo-rss-XXXXXX", NULL);
+ g_free(feed_dir);
+#ifdef HAVE_MKDTEMP
+ tmpdir = mkdtemp (template);
+#else
+ tmpdir = mktemp (template);
+ if (tmpdir) {
+ if (g_mkdir (tmpdir, S_IRWXU) == -1)
+ tmpdir = NULL;
+ }
+#endif
+ if ( tmpdir == NULL)
+ return NULL;
+ name = g_build_filename(tmpdir, g_path_get_basename(url), NULL);
+ g_free(template);
+
+ net_get_unblocking(url,
+ textcb,
+ NULL,
+ (gpointer)finish_image,
+ name,
+ &err);
+ if (err) return NULL;
+ return name;
+}
+
//migrates old feed data files from crc naming
//to md5 naming while preserving content
//
@@ -3967,6 +4007,8 @@
gchar *feed = NULL;
gboolean freeb = 0; //if b needs to be freed or not
gchar *encl, *encl_file;
+ xmlChar *buff = NULL;
+ int size = 0;
migrate_crc_md5(chn_name, url);
@@ -3980,13 +4022,10 @@
g_free(feed_dir);
FILE *fr = fopen(feed_name, "r");
- FILE *fw = fopen(feed_name, "a+");
-
- ftotal+=item->len;
+ int fw = g_open (feed_name, O_WRONLY | O_CREAT| O_APPEND | O_BINARY, 0666);
for (i=0; NULL != (el = g_array_index(item, xmlNodePtr, i)); i++)
{
- farticle++;
update_sr_message();
if (rf->cancel) goto out;
@@ -4074,30 +4113,26 @@
}
}
- encl = layer_find_innerelement(el->children, "enclosure", "url", // RSS 2.0 Enclosure
+ encl = layer_find_innerelement(el->children, "enclosure", "url", // RSS 2.0 Enclosure
layer_find_innerelement(el->children, "link", "enclosure", NULL)); // ATOM Enclosure
//we have to free this some how
- char *link = g_strdup(layer_find (el->children, "link", NULL)); //RSS,
+ char *link = g_strdup(layer_find (el->children, "link", NULL)); //RSS,
if (!link)
link = layer_find_innerelement(el->children, "link", "href", g_strdup(_("No Information"))); //ATOM
char *id = layer_find (el->children, "id", //ATOM
layer_find (el->children, "guid", NULL)); //RSS 2.0
feed = g_strdup_printf("%s\n", id ? id : link);
d(g_print("link:%s\n", link));
-// d(g_print("body:%s\n", b));
d(g_print("author:%s\n", q));
d(g_print("sender:%s\n", sender));
d(g_print("title:%s\n", p));
d(g_print("date:%s\n", d));
d(g_print("date:%s\n", d2));
- p = decode_html_entities (p);
- gchar *tmp = decode_html_entities(b);
- g_free(b);
- b = tmp;
gchar rfeed[513];
memset(rfeed, 0, 512);
int occ = 0;
+
while (gtk_events_pending())
gtk_main_iteration ();
@@ -4119,6 +4154,35 @@
if (!occ)
{
+ ftotal++;
+ p = decode_html_entities (p);
+ gchar *tmp = decode_html_entities(b);
+ g_free(b);
+ b = tmp;
+
+ xmlDoc *src = (xmlDoc *)parse_html_sux(b, strlen(b));
+ if (src)
+ {
+ xmlNode *doc = (xmlNode *)src;
+
+ while (doc = html_find(doc, "img"))
+ {
+ xmlChar *url = xmlGetProp(doc, "src");
+ gchar *name;
+ if (name = fetch_image(url))
+ {
+ xmlFree(url);
+ xmlSetProp(doc, "src", name);
+ }
+ }
+ xmlDocDumpMemory(src, &buff, &size);
+ }
+ g_free(b);
+ b=buff;
+
+ while (gtk_events_pending())
+ gtk_main_iteration ();
+
create_feed *CF = g_new0(create_feed, 1);
/* pack all data */
CF->full_path = g_strdup(chn_name);
@@ -4131,8 +4195,8 @@
CF->website = g_strdup(link);
CF->feedid = g_strdup(buf);
CF->encl = g_strdup(encl);
- CF->feed_fname = g_strdup(feed_name); //feed file name
- CF->feed_uri = g_strdup(feed); //feed file url (to be checked/written to feed file)
+ CF->feed_fname = g_strdup(feed_name); //feed file name
+ CF->feed_uri = g_strdup(feed); //feed file url (to be checked/written to feed file)
if (encl)
{
@@ -4147,15 +4211,22 @@
}
else
{
- if (fw) fputs(feed, fw);
+ if (fw)
+ {
+ //fputs(feed, fw);
+ write(fw,feed, strlen(feed));
+ fsync(fw);
+ }
create_mail(CF);
free_cf(CF);
}
+ farticle++;
+ g_free(p);
}
d(g_print("put success()\n"));
tout: if (q) g_free(q);
g_free(b);
- g_free(p);
+// g_free(p);
if (feed) g_free(feed);
if (encl) g_free(encl);
g_free(link);
@@ -4163,7 +4234,7 @@
out: g_free(sender);
if (fr) fclose(fr);
- if (fw) fclose(fw);
+ if (fw) close(fw);
g_free(feed_name);
return buf;
@@ -4230,8 +4301,11 @@
}
// camel_folder_freeze(folder);
if (min_date)
+ {
+ g_print("delete uid %d\n", imax);
camel_folder_delete_message (folder, uids->pdata[imax]);
- // camel_folder_sync (folder, TRUE, NULL);
+ }
+ // camel_folder_sync (folder, TRUE, NULL);
// camel_folder_expunge (folder, NULL);
// camel_folder_thaw(folder);
while (gtk_events_pending())
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]