evolution-rss r469 - in trunk: . src



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]