evolution-rss r469 - in trunk: . src
- From: lucilanga svn gnome org
- To: svn-commits-list gnome org
- Subject: evolution-rss r469 - in trunk: . src
- Date: Mon, 23 Mar 2009 13:08:42 +0000 (UTC)
Author: lucilanga
Date: Mon Mar 23 13:08:42 2009
New Revision: 469
URL: http://svn.gnome.org/viewvc/evolution-rss?rev=469&view=rev
Log:
2009-03-23 Lucian Langa <lucilanga gnome org>
* src/parser.c, src/rss.c: implement several methods of fetching
feeds icon (feed icon + favicon)
Modified:
trunk/ChangeLog
trunk/src/network-soup.c
trunk/src/parser.c
trunk/src/rss.c
Modified: trunk/src/network-soup.c
==============================================================================
--- trunk/src/network-soup.c (original)
+++ trunk/src/network-soup.c Mon Mar 23 13:08:42 2009
@@ -397,6 +397,77 @@
g_main_loop_quit (data);
}
+guint
+net_get_status(const char *url, GError **err)
+{
+#if LIBSOUP_VERSION < 2003000
+ SoupUri *suri = NULL;
+#else
+ SoupURI *suri = NULL;
+#endif
+ SoupMessage *req = NULL;
+ guint response = NULL;
+ SoupSession *soup_sess = NULL;
+ GSList *headers;
+
+ if (!rf->b_session)
+ rf->b_session = soup_sess =
+ soup_session_sync_new_with_options(SOUP_SESSION_TIMEOUT, SS_TIMEOUT, NULL);
+ else
+ soup_sess = rf->b_session;
+
+ req = soup_message_new(SOUP_METHOD_GET, url);
+ if (!req)
+ {
+ g_set_error(err, NET_ERROR, NET_ERROR_GENERIC,
+ soup_status_get_phrase(2)); //invalid url
+ goto out;
+ }
+ for (; headers; headers = headers->next) {
+ char *header = headers->data;
+ /* soup wants the key and value separate, so we have to munge this
+ * a bit. */
+ char *colonpos = strchr(header, ':');
+ *colonpos = 0;
+#if LIBSOUP_VERSION < 2003000
+ soup_message_add_header(req->request_headers, header, colonpos+1);
+#else
+ soup_message_headers_append(req->request_headers, header, colonpos+1);
+#endif
+ *colonpos = ':';
+ }
+ gchar *agstr = g_strdup_printf("Evolution/%s; Evolution-RSS/%s",
+ EVOLUTION_VERSION_STRING, VERSION);
+#if LIBSOUP_VERSION < 2003000
+ soup_message_add_header (req->request_headers, "User-Agent",
+ agstr);
+#else
+ soup_message_headers_append (req->request_headers, "User-Agent",
+ agstr);
+#endif
+ g_free(agstr);
+
+ rf->b_session = soup_sess;
+ rf->b_msg_session = req;
+ soup_session_send_message(soup_sess, req);
+
+ if (req->status_code != SOUP_STATUS_OK) {
+ //might not be a good ideea
+ soup_session_abort(soup_sess);
+ g_object_unref(soup_sess);
+ rf->b_session = NULL;
+ g_set_error(err, NET_ERROR, NET_ERROR_GENERIC,
+ soup_status_get_phrase(req->status_code));
+ goto out;
+ }
+
+out:
+ if (suri) soup_uri_free(suri);
+ response = req->status_code;
+ if (req) g_object_unref(G_OBJECT(req));
+
+ return response;
+}
gboolean
net_get_unblocking(const char *url,
Modified: trunk/src/parser.c
==============================================================================
--- trunk/src/parser.c (original)
+++ trunk/src/parser.c Mon Mar 23 13:08:42 2009
@@ -813,14 +813,16 @@
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);
+// gchar *server = get_server_from_uri(r->uri);
+// gchar *fav = g_strconcat(server, "/favicon.ico", NULL);
+// g_free(server);
if (image != NULL)
- r->image = layer_find(image->children, "url", fav);
- else
- r->image = fav;
+ r->image = 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);
Modified: trunk/src/rss.c
==============================================================================
--- trunk/src/rss.c (original)
+++ trunk/src/rss.c Mon Mar 23 13:08:42 2009
@@ -1636,7 +1636,6 @@
"Subject"), NULL);
gchar *f = camel_header_decode_string(camel_medium_get_header (CAMEL_MEDIUM (message),
"From"), NULL);
- gchar *ff = camel_header_encode_string("Dag WieÃrs");
gpointer is_html = NULL;
if (feedid)
@@ -2725,19 +2724,91 @@
return chn_name;
}
+
+void
+#if LIBSOUP_VERSION < 2003000
+finish_update_feed_image (SoupMessage *msg, gpointer user_data)
+#else
+finish_update_feed_image (SoupSession *soup_sess, SoupMessage *msg, gpointer user_data)
+#endif
+{
+ xmlChar *icon = NULL;
+ gchar *icon_url = NULL;
+ gchar *feed_dir = rss_component_peek_base_directory(mail_component_peek());
+ gchar *feed_file = g_strdup_printf("%s/%s.img", feed_dir, user_data);
+ g_free(feed_dir);
+ gchar *url = g_hash_table_lookup(rf->hr, user_data);
+ gchar *server = get_server_from_uri(url);
+ rfMessage *rfmsg = g_new0(rfMessage, 1);
+ rfmsg->status_code = msg->status_code;
+#if LIBSOUP_VERSION < 2003000
+ rfmsg->body = msg->response.body;
+ rfmsg->length = msg->response.length;
+#else
+ rfmsg->body = (gchar *)(msg->response_body->data);
+ rfmsg->length = msg->response_body->length;
+#endif
+ xmlNode *app;
+ xmlNode *doc = (xmlNode *)parse_html_sux (rfmsg->body, rfmsg->length);
+ while (doc) {
+ doc = html_find(doc, "link");
+ if (app = xmlGetProp(doc, "rel")) {
+ if (!g_ascii_strcasecmp(app, "shorcut icon")
+ || !g_ascii_strcasecmp(app, "icon")) {
+ icon = xmlGetProp(doc, "href");
+ exit;
+ }
+
+ }
+ xmlFree(app);
+ }
+ g_free(rfmsg);
+ if (icon) {
+ gchar *icon_url = g_strconcat(server, "/", icon, NULL);
+ CamelStream *feed_fs = camel_stream_fs_new_with_name(feed_file,
+ O_RDWR|O_CREAT, 0666);
+ fetch_unblocking(
+ icon_url,
+ textcb,
+ NULL,
+ (gpointer)finish_image,
+ feed_fs, // we need to dupe key here
+ 0,
+// &err); // because we might lose it if
+ NULL);
+ } else {
+ // r->image = NULL;
+ gchar *icon_url = g_strconcat(server, "/favicon.ico", NULL);
+ if (404 != net_get_status(icon_url, NULL)) {
+ CamelStream *feed_fs = camel_stream_fs_new_with_name(feed_file,
+ O_RDWR|O_CREAT, 0666);
+ fetch_unblocking(
+ icon_url,
+ textcb,
+ NULL,
+ (gpointer)finish_image,
+ feed_fs, // we need to dupe key here
+ 0,
+// &err); // because we might lose it if
+ NULL);
+ }
+ }
+}
+
void
update_feed_image(gchar *image, gchar *key)
{
GError *err = NULL;
- if (!image)
- return;
- g_return_if_fail (image != NULL);
+// if (!image)
+// return;
+ // g_return_if_fail (image != NULL);
gchar *feed_dir = rss_component_peek_base_directory(mail_component_peek());
if (!g_file_test(feed_dir, G_FILE_TEST_EXISTS))
g_mkdir_with_parents (feed_dir, 0755);
gchar *feed_file = g_strdup_printf("%s/%s.img", feed_dir, key);
g_free(feed_dir);
if (!g_file_test(feed_file, G_FILE_TEST_EXISTS)) {
+ if (image) {
CamelStream *feed_fs = camel_stream_fs_new_with_name(feed_file,
O_RDWR|O_CREAT, 0666);
net_get_unblocking(image,
@@ -2752,7 +2823,21 @@
g_free(feed_file);
return;
}
+ } else {
+
+
+ gchar *url = g_hash_table_lookup(rf->hr, key);
+ gchar *server = get_server_from_uri(url);
+ fetch_unblocking(
+ server,
+ textcb,
+ NULL,
+ (gpointer)finish_update_feed_image,
+ key, // we need to dupe key here
+ 0,
+ &err); // because we might lose it if
}
+ }
}
void
@@ -3931,6 +4016,13 @@
#endif
{
if (user_data) {
+ g_print("finish_image(): status:%d\n", msg->status_code);
+ if (404 == msg->status_code) {
+ camel_stream_close(user_data);
+ unlink(user_data);
+ camel_object_unref(user_data);
+ return;
+ }
#if LIBSOUP_VERSION < 2003000
if (msg->response.body) {
camel_stream_write(user_data, msg->response.body, msg->response.length);
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]