evolution-rss r336 - in trunk: . src



Author: lucilanga
Date: Mon Jul 14 04:58:05 2008
New Revision: 336
URL: http://svn.gnome.org/viewvc/evolution-rss?rev=336&view=rev

Log:
2008-07-14  Lucian Langa  <lucilanga gnome org>

* src/rss-config-factory.c: suppport
for foaf importing
* src/rss.c: add status icon

Modified:
   trunk/ChangeLog
   trunk/TODO
   trunk/src/Makefile.am
   trunk/src/Makefile.in
   trunk/src/rss-config-factory.c
   trunk/src/rss.c

Modified: trunk/TODO
==============================================================================
--- trunk/TODO	(original)
+++ trunk/TODO	Mon Jul 14 04:58:05 2008
@@ -31,7 +31,6 @@
 	* hook feed properties in folder properties
 	* clist hint should be the folder name not the feed name
 	* strip html tags from title
-	* implement foaf and other possible blogrolls type file
 	* if necessary implement config code for evo 2.12
 	* notify in status bar, no of feeds
 	* fix recursivity on layer_find_pos

Modified: trunk/src/Makefile.am
==============================================================================
--- trunk/src/Makefile.am	(original)
+++ trunk/src/Makefile.am	Mon Jul 14 04:58:05 2008
@@ -20,7 +20,7 @@
 
  
 #if ! HAVE_XPCOM_GLUE
-#INCLUDES += -DGECKO_HOME=\""$(GECKO_HOME)"\"
+INCLUDES += -DGECKO_HOME=\""$(GECKO_HOME)"\"
 #endif
 
 RSS_MENU = \

Modified: trunk/src/Makefile.in
==============================================================================
--- trunk/src/Makefile.in	(original)
+++ trunk/src/Makefile.in	Mon Jul 14 04:58:05 2008
@@ -318,28 +318,20 @@
 target_alias = @target_alias@
 top_builddir = @top_builddir@
 top_srcdir = @top_srcdir@
-INCLUDES = \
-	-I$(EVOLUTION_SOURCE)					\
-	-I$(top_srcdir)						\
-	$(RENDER_CFLAGS)					\
-	$(DBUS_CFLAGS)						\
-	-DGETTEXT_PACKAGE="\"$(GETTEXT_PACKAGE)\""		\
-	-DLOCALEDIR="\"$(LOCALEDIR)\""				\
-	-DEVOLUTION_VERSION_STRING=\"$(EVOLUTION_EXEC_VERSION)\"\
-	-DEVOLUTION_VERSION=$(evolution_exec_int)		\
-	-DEVOLUTION_GLADEDIR=\""$(gladedir)"\"            	\
-	-DEVOLUTION_ICONDIR=\""$(ICON_DIR)"\"            	\
-	-DGTK_VERSION="$(GTK_VERSION)"	          	  	\
-	-DLIBSOUP_VERSION="$(SOUP_VERSION)"	            	\
-	-DRENDER=\""$(RENDER)"\"				\
-	-DRENDER_N=$(RENDER_N)					\
-	-DHAVE_DBUS=$(DBD)					\
-	-DDBUS_API_SUBJECT_TO_CHANGE				\
-	$(EVOLUTION_RSS_EPLUGIN_CFLAGS)
-
 
 #if ! HAVE_XPCOM_GLUE
-#INCLUDES += -DGECKO_HOME=\""$(GECKO_HOME)"\"
+INCLUDES = -I$(EVOLUTION_SOURCE) -I$(top_srcdir) $(RENDER_CFLAGS) \
+	$(DBUS_CFLAGS) -DGETTEXT_PACKAGE="\"$(GETTEXT_PACKAGE)\"" \
+	-DLOCALEDIR="\"$(LOCALEDIR)\"" \
+	-DEVOLUTION_VERSION_STRING=\"$(EVOLUTION_EXEC_VERSION)\" \
+	-DEVOLUTION_VERSION=$(evolution_exec_int) \
+	-DEVOLUTION_GLADEDIR=\""$(gladedir)"\" \
+	-DEVOLUTION_ICONDIR=\""$(ICON_DIR)"\" \
+	-DGTK_VERSION="$(GTK_VERSION)" \
+	-DLIBSOUP_VERSION="$(SOUP_VERSION)" -DRENDER=\""$(RENDER)"\" \
+	-DRENDER_N=$(RENDER_N) -DHAVE_DBUS=$(DBD) \
+	-DDBUS_API_SUBJECT_TO_CHANGE $(EVOLUTION_RSS_EPLUGIN_CFLAGS) \
+	-DGECKO_HOME=\""$(GECKO_HOME)"\"
 #endif
 RSS_MENU = \
 	<hook class=\"org.gnome.evolution.mail.bonobomenu:1.0\">\n		\

Modified: trunk/src/rss-config-factory.c
==============================================================================
--- trunk/src/rss-config-factory.c	(original)
+++ trunk/src/rss-config-factory.c	Mon Jul 14 04:58:05 2008
@@ -26,6 +26,10 @@
 
 #include "rss.h"
 
+static guint feed_enabled = 0;
+static guint feed_validate = 0;
+static guint feed_html = 0;
+
 #define RSS_CONTROL_ID  "OAFIID:GNOME_Evolution_RSS:" EVOLUTION_VERSION_STRING
 #define FACTORY_ID      "OAFIID:GNOME_Evolution_RSS_Factory:" EVOLUTION_VERSION_STRING
 
@@ -1000,6 +1004,9 @@
         add_feed *feed = g_new0(add_feed, 1);
         feed->changed=0;
         feed->add=1;
+        feed->fetch_html = feed_html;
+        feed->validate = feed_validate;
+	feed->enabled = feed_enabled;
 	feed->feed_url = g_strdup(url);
 	feed->feed_name = decode_html_entities(title);
 	/* we'll get rid of this as soon as we fetch unblocking */
@@ -1019,13 +1026,41 @@
 	return res;
 }
 
+/*
+ * type 0/1 - opml/foaf
+ */
+
+xmlNode*
+iterate_import_file(xmlNode *src, gchar **url, xmlChar **title, guint type)
+{
+	*url = NULL;
+	*title = NULL;
+
+	if (type == 0) {
+        	src = html_find(src, "outline");
+        	*url = xmlGetProp(src, "xmlUrl");
+		*title = xmlGetProp(src, "title");
+	} else if (type == 1) {
+		xmlNode *my;
+		src = html_find(src, "member");
+		my = layer_find_pos(src, "member", "Agent");
+		*title = xmlCharStrdup(layer_find(my, "name", NULL));
+		my =  html_find(my, "channel");
+		*url =  xmlGetProp(my, "about");
+	}
+	return src;
+	
+}
+
 void
-import_opml(gchar *file, add_feed *feed)
+import_opml(gchar *file)
 {
-	gchar *url;
+	gchar *url = NULL;
+	xmlChar *name = NULL;
         xmlChar *buff = NULL;
         guint total = 0;
         guint current = 0;
+	guint type = 0; //file type
         gchar *what = NULL;
         GtkWidget *import_dialog;
         GtkWidget *import_label;
@@ -1033,6 +1068,7 @@
 
         xmlNode *src = (xmlNode *)xmlParseFile (file);
         xmlNode *doc = src;
+	xmlNode *my = src;
         gchar *msg = g_strdup(_("Importing feeds..."));
         import_dialog = e_error_new((GtkWindow *)rf->preferences, "shell:importing", msg, NULL);
         gtk_window_set_keep_above(GTK_WINDOW(import_dialog), TRUE);
@@ -1053,63 +1089,75 @@
         g_free(msg);
 	if (src=src->children)
 	{
-		g_print("found %s\n", src->name);
+		d(g_print("found %s\n", src->name));
 		if (!g_ascii_strcasecmp(src->name, "rdf")) {
 			while (src) {
 				g_print("my cont:%s\n", src->content);
 				src=src->children;
 				src = src->next;
 				g_print("found %s\n", src->name);
-				g_print("my cont:%s\n", src->content);
-				src=src->children;
+				src = src->children;
+				d(g_print("group name:%s\n", layer_find(src, "name", NULL)));
 				src = src->next;
-				xmlNode *my = src;
-				while (src = html_find(src, "member")) {
-					my = layer_find_pos(src, "member", "Agent");
-					g_print("my:%s\n", layer_find(my, "name", NULL));
-					my =  html_find(my, "Document");
-					g_print("my:%s\n", xmlGetProp(my, "about"));
+				while (src = iterate_import_file(src, &url, &name, 1)) {
+                			if (url) {
+                        			total++;
+                        			xmlFree(url);
+                			}
+					if (name) xmlFree(name);
 				}
+			g_print("total:%d\n", total);
+			type = 1;
 			}
 		}
 		else if (!g_ascii_strcasecmp(src->name, "opml")) {
 			
-        		while (src = html_find(src, "outline")) {
-                		url = xmlGetProp((xmlNode *)src, "xmlUrl");
-                		if (url) {
+			while (src = iterate_import_file(src, &url, &name, 0)) {
+                		if (url && strlen(url)) {
                         		total++;
                         		xmlFree(url);
                 		}
+				if (name) xmlFree(name);
         		}
+			type = 0;
 			g_print("total:%d\n", total);
 		}
 	}	
         src = doc;
-	//force out for now
-	goto out;
+//	//force out for now
+//	goto out;
         //we'll be safer this way
         rf->import = 1;
+	name = NULL;
         while (gtk_events_pending ())
                 gtk_main_iteration ();
-        while (src = html_find(src, "outline"))
-        {
-                url = xmlGetProp((xmlNode *)src, "xmlUrl");
-                if (url && strlen(url))
-                {
+	if (type == 1) {
+		src=src->children;
+		g_print("my cont:%s\n", src->content);
+		src=src->children;
+		src = src->next;
+		g_print("found %s\n", src->name);
+		src = src->children;
+		d(g_print("group name:%s\n", layer_find(src, "name", NULL)));
+		src = src->next;
+	}
+	while (src = iterate_import_file(src, &url, &name, type)) {
+                if (url && strlen(url)) {
+		g_print("url:%s\n", url);
                         if (rf->cancel)
                         {
                                 if (src) xmlFree(src);
                                 rf->cancel = 0;
                                 goto out;
                         }
-                        gchar *name = xmlGetProp((xmlNode *)src, "title");
                         gtk_label_set_text(GTK_LABEL(import_label), name);
 #if GTK_VERSION >= 2006000
                         gtk_label_set_ellipsize (GTK_LABEL (import_label), PANGO_ELLIPSIZE_START);
 #endif
                         gtk_label_set_justify(GTK_LABEL(import_label), GTK_JUSTIFY_CENTER);
 			import_one_feed(url, name);
-                        xmlFree(name);
+			if (name) xmlFree(name);
+			if (url) xmlFree(url);
 
                         while (gtk_events_pending ())
                                 gtk_main_iteration ();
@@ -1147,7 +1195,7 @@
                 if (name)
                 {
                         gtk_widget_hide(selector);
-                        import_opml(name, user_data);
+                        import_opml(name);
                         g_free(name);
                 }
         }
@@ -1156,27 +1204,26 @@
 }
 
 static void
-import_toggle_cb_html (GtkWidget *widget, add_feed *data)
+import_toggle_cb_html (GtkWidget *widget, gpointer data)
 {
-        data->fetch_html  = 1-gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (widget));
+        feed_html  = 1-gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (widget));
 }
 
 static void
-import_toggle_cb_valid (GtkWidget *widget, add_feed *data)
+import_toggle_cb_valid (GtkWidget *widget, gpointer data)
 {
-        data->validate  = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (widget));
+        feed_validate  = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (widget));
 }
 
 static void
-import_toggle_cb_ena (GtkWidget *widget, add_feed *data)
+import_toggle_cb_ena (GtkWidget *widget, gpointer data)
 {
-        data->enabled  = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (widget));
+        feed_enabled  = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (widget));
 }
 
 static void
 decorate_import_fs (gpointer data)
 {
-        add_feed *feed = g_new0(add_feed, 1);
         gtk_file_chooser_set_do_overwrite_confirmation (GTK_FILE_CHOOSER (data), TRUE);
         gtk_dialog_set_default_response (GTK_DIALOG (data), GTK_RESPONSE_OK);
         gtk_file_chooser_set_local_only (data, FALSE);
@@ -1234,22 +1281,22 @@
         gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (checkbutton3), 1);
 
         gtk_file_chooser_set_extra_widget(data, vbox1);
-        feed->fetch_html = 0;
-        feed->validate = feed->enabled = 1;
+        feed_html = 0;
+        feed_validate = feed_enabled = 1;
 
         g_signal_connect(checkbutton1,
                         "toggled",
                         G_CALLBACK(import_toggle_cb_html),
-                        feed);
+                        NULL);
         g_signal_connect(checkbutton2,
                         "toggled",
                         G_CALLBACK(import_toggle_cb_ena),
-                        feed);
+                        NULL);
         g_signal_connect(checkbutton3,
                         "toggled",
                         G_CALLBACK(import_toggle_cb_valid),
-                        feed);
-        g_signal_connect(data, "response", G_CALLBACK(select_file_response), feed);
+                        NULL);
+        g_signal_connect(data, "response", G_CALLBACK(select_file_response), NULL);
         g_signal_connect(data, "destroy", G_CALLBACK(gtk_widget_destroy), data);
 }
 

Modified: trunk/src/rss.c
==============================================================================
--- trunk/src/rss.c	(original)
+++ trunk/src/rss.c	Mon Jul 14 04:58:05 2008
@@ -138,6 +138,7 @@
 guint nettime_id = 0;
 guint force_update = 0;
 GHashTable *custom_timeout;
+GtkStatusIcon *status_icon = NULL;
 
 #define DEFAULT_FEEDS_FOLDER "News&Blogs"
 #define DEFAULT_NO_CHANNEL "Untitled channel"
@@ -2856,25 +2857,55 @@
 	{
 		d(g_print("custom key:%s\n", key));
 		guint ttl = GPOINTER_TO_INT(g_hash_table_lookup(rf->hrttl, lookup_key(key)));
-		CDATA *cdata = g_new0(CDATA, 1);
-		cdata->key = key;
-		cdata->value = value;
-		cdata->user_data = user_data;
-		time_id = GPOINTER_TO_INT(g_hash_table_lookup(custom_timeout,
+		if (ttl) {
+			CDATA *cdata = g_new0(CDATA, 1);
+			cdata->key = key;
+			cdata->value = value;
+			cdata->user_data = user_data;
+			time_id = GPOINTER_TO_INT(g_hash_table_lookup(custom_timeout,
 							lookup_key(key)));
-		if (time_id)
-			g_source_remove(time_id);
-		time_id = g_timeout_add (ttl * 60 * 1000,
+			if (time_id)
+				g_source_remove(time_id);
+			time_id = g_timeout_add (4*60*1000, //ttl * 60 * 1000,
                            (GtkFunction) custom_update_articles,
                            cdata);
-		g_hash_table_replace(custom_timeout, 
+			g_hash_table_replace(custom_timeout, 
 				g_strdup(lookup_key(key)), 
 				GINT_TO_POINTER(time_id));
+		}
 	}
 	
 }
 
 static void
+icon_activated (GtkStatusIcon *icon, gpointer pnotify)
+{
+        gtk_status_icon_set_visible (status_icon, FALSE);
+        g_object_unref (status_icon);
+
+        status_icon = NULL;
+}
+
+gboolean
+flicker_stop(gpointer user_data)
+{
+        gtk_status_icon_set_blinking (status_icon, FALSE);
+	return FALSE;
+}
+
+static void
+flicker_status_icon(void)
+{
+	gchar *total = g_strdup_printf("Feeds: %d articles", farticle);
+	gtk_status_icon_set_tooltip (status_icon, total);
+        gtk_status_icon_set_visible (status_icon, TRUE);
+        gtk_status_icon_set_blinking (status_icon, TRUE);
+	g_signal_connect (G_OBJECT (status_icon), "activate", G_CALLBACK (icon_activated), NULL);
+	g_timeout_add(30*1000, flicker_stop, NULL);
+        g_free(total);
+}
+
+static void
 custom_feed_timeout(void)
 {
 	g_hash_table_foreach(rf->hrname, custom_fetch_feed, statuscb);
@@ -2914,6 +2945,15 @@
 	}
 	custom_feed_timeout();
         
+
+	gchar *iconfile = g_build_filename (EVOLUTION_ICONDIR,
+	                                    "rss-24.png",
+                                            NULL);
+
+	status_icon = gtk_status_icon_new ();
+        gtk_status_icon_set_from_file (status_icon, iconfile);
+        gtk_status_icon_set_visible (status_icon, FALSE);
+        
         /* hook in rename event to catch feeds folder rename */
 	CamelStore *store = mail_component_peek_local_store(NULL);
 	camel_object_hook_event(store, "folder_renamed",
@@ -4464,6 +4504,7 @@
 				free_cf(CF);
 			}
 			farticle++;
+			flicker_status_icon();
 		g_free(p);
 		}
 		d(g_print("put success()\n"));



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]