[evolution-rss] handle blocking soup_session in web authentication; fix writting of favicons timestamp files



commit 85355b2bb2dd5e3e8f41930bc45033f7f5719921
Author: Lucian Langa <lucilanga gnome org>
Date:   Wed Jul 8 23:57:40 2009 +0300

    handle blocking soup_session in web authentication; fix writting of favicons timestamp files

 src/network-soup.c |   26 ++++++++------------------
 src/parser.c       |    6 +++---
 src/parser.h       |    2 +-
 src/rss.c          |   42 ++++++++++++++++++++++--------------------
 4 files changed, 34 insertions(+), 42 deletions(-)
---
diff --git a/src/network-soup.c b/src/network-soup.c
index 6ddca9a..86b236a 100644
--- a/src/network-soup.c
+++ b/src/network-soup.c
@@ -359,8 +359,6 @@ authenticate (SoupSession *session,
 	g_object_get (G_OBJECT(session),
 				"proxy-uri", &proxy_uri,
 				NULL);
-	g_print("user:%s\n", proxy_uri->user);
-	g_print("pass:%s\n", proxy_uri->password);
 	//proxy_auth_dialog("Proxy Authentication", proxy_uri->user, proxy_uri->password);
 	//g_object_set (G_OBJECT (session), SOUP_SESSION_PROXY_URI, proxy_uri, NULL);
 	return;
@@ -376,19 +374,22 @@ authenticate (SoupSession *session,
 #else
 	if (!retrying)
 		soup_auth_authenticate (auth, user, pass);
+	else {
+		if (!rf->autoupdate)
+			goto authpop;
+	}
 #endif
 	} else {
-		if (rf->soup_auth_retry) {
-		//means we're already tested once and probably
-		//won't try again
-		rf->soup_auth_retry = FALSE;
 		//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) {
 			//we will continue after user has made a decision on 
 			//web auth dialog
-			soup_session_pause_message(session, msg);
+			//Bug 522147 â?? need to be able to pause synchronous I/O
+authpop:		if (G_OBJECT_TYPE(session) == SOUP_TYPE_SESSION_ASYNC) {
+				soup_session_pause_message(session, msg);
+			}
 			RSS_AUTH *auth_info = g_new0(RSS_AUTH, 1);
 			auth_info->url = data;
 			auth_info->soup_auth = auth;
@@ -396,17 +397,6 @@ authenticate (SoupSession *session,
 			auth_info->session = session;
 			auth_info->message = msg;
 			web_auth_dialog(auth_info);
-			return;
-		}
-#if LIBSOUP_VERSION < 2003000
-		*username = g_strdup(g_hash_table_lookup(rf->hruser, data));
-		*password = g_strdup(g_hash_table_lookup(rf->hrpass, data));
-#else
-	user = g_hash_table_lookup(rf->hruser, data);
-	pass = g_hash_table_lookup(rf->hrpass, data);
-	if (!retrying)
-		soup_auth_authenticate (auth, user, pass);
-#endif
 		}
 	}
 }
diff --git a/src/parser.c b/src/parser.c
index 807d6e2..f63911f 100644
--- a/src/parser.c
+++ b/src/parser.c
@@ -55,10 +55,10 @@ rss_html_url_decode(const char *html, int len)
 
         doc = src;
 
-        while ((doc = html_find((xmlNode *)doc, "img"))) {
-                if ((url = (gchar *)xmlGetProp(doc, (xmlChar *)"src"))) {
+        while ((doc = (xmlDoc *)html_find((xmlNode *)doc, "img"))) {
+                if ((url = (gchar *)xmlGetProp((xmlNodePtr)doc, (xmlChar *)"src"))) {
 			tmpurl = camel_url_decode_path(strstr(url, "http:"));
-			xmlSetProp(doc, (xmlChar *)"src", (xmlChar *)tmpurl);
+			xmlSetProp((xmlNodePtr)doc, (xmlChar *)"src", (xmlChar *)tmpurl);
 			g_free(tmpurl);
 		}
 	}
diff --git a/src/parser.h b/src/parser.h
index d7f0904..f6c9aa1 100644
--- a/src/parser.h
+++ b/src/parser.h
@@ -20,7 +20,7 @@
 #define __PARSER_H__
 
 gchar *update_channel(RDF *r);
-
+xmlDoc *rss_html_url_decode(const char *html, int len);
 char *layer_find (xmlNodePtr node, char *match, char *fail);
 char *layer_find_innerelement (xmlNodePtr node, char *match, char *el, char *fail);
 gchar *layer_find_innerhtml (xmlNodePtr node, char *match, char *submatch, char *fail);
diff --git a/src/rss.c b/src/rss.c
index b51b78f..69df342 100644
--- a/src/rss.c
+++ b/src/rss.c
@@ -595,7 +595,8 @@ user_pass_cb(RSS_AUTH *auth_info, gint response, GtkDialog *dialog)
 		rf->soup_auth_retry = TRUE;
                 break;
         }
-	soup_session_unpause_message(auth_info->session, auth_info->message);
+	if (soup_session_get_async_context(auth_info->session))
+		soup_session_unpause_message(auth_info->session, auth_info->message);
 	gtk_widget_destroy(GTK_WIDGET(dialog));
         g_free(auth_info);
 
@@ -760,6 +761,7 @@ void
 web_auth_dialog(RSS_AUTH *auth_info)
 {
 	GtkDialog *dialog;
+	gint response;
 
 	if (!rf->hruser)
 		rf->hruser = g_hash_table_new_full(g_str_hash, g_str_equal, NULL, g_free);
@@ -767,9 +769,14 @@ web_auth_dialog(RSS_AUTH *auth_info)
 		rf->hrpass = g_hash_table_new_full(g_str_hash, g_str_equal, NULL, g_free);
 
 	auth_info->user = g_hash_table_lookup(rf->hruser, auth_info->url);
-	auth_info->pass = g_hash_table_lookup(rf->hruser, auth_info->url);
+	auth_info->pass = g_hash_table_lookup(rf->hrpass, auth_info->url);
 	dialog = create_user_pass_dialog(auth_info);
-	g_signal_connect_swapped (dialog,
+	//Bug 522147 â?? need to be able to pause synchronous I/O
+	if (G_OBJECT_TYPE(auth_info->session) != SOUP_TYPE_SESSION_ASYNC) {
+		response = gtk_dialog_run(dialog);
+		user_pass_cb(auth_info, response, dialog);
+	} else
+		g_signal_connect_swapped (dialog,
                              "response",
                              G_CALLBACK (user_pass_cb),
                              auth_info);
@@ -794,7 +801,6 @@ timeout_soup(void)
 {
 	d(g_print("Network timeout occured. Cancel active operations.\n"));
 	abort_all_soup();
-	rf->autoupdate = FALSE;
 	return FALSE;
 }
 
@@ -1856,16 +1862,16 @@ pfree(EMFormatHTMLPObject *o)
 void
 org_gnome_evolution_presend (EPlugin *ep, EMEventTargetComposer *t)
 {
-	gchar *tmsg;
 	xmlChar *buff = NULL;
-	gint size, length;
+	gint size;
+	gsize length;
 	gchar *text;
 
 	/* unfortunately e_msg_composer does not have raw get/set text body
 	 * so it is far easier using gtkhtml_editor_* functions rather than
 	 * procesing CamelMimeMessage or GByteArray
 	 */
-	text = gtkhtml_editor_get_text_html (t->composer, &length);
+	text = gtkhtml_editor_get_text_html ((GtkhtmlEditor *)t->composer, &length);
 
 	xmlDoc *doc = rss_html_url_decode(text, strlen(text));
 	if (doc) {
@@ -1873,7 +1879,7 @@ org_gnome_evolution_presend (EPlugin *ep, EMEventTargetComposer *t)
 		xmlFree(doc);
 	}
 
-	gtkhtml_editor_set_text_html(t->composer, buff, size);
+	gtkhtml_editor_set_text_html((GtkhtmlEditor *)t->composer, (gchar *)buff, size);
 }
 
 EMFormat *fom;
@@ -1891,7 +1897,8 @@ void org_gnome_cooly_format_rss(void *ep, EMFormatHookTarget *t)	//camelmimepart
 	gchar *comments = NULL;
 	gchar *category = NULL;
 	GdkPixbuf *pixbuf = NULL;
-	guint engine = 0, size;
+	guint engine = 0;
+	int size;
 	CamelDataWrapper *dw = camel_data_wrapper_new();
 	CamelMimePart *part = camel_mime_part_new();
 	CamelStream *fstream = camel_stream_mem_new();
@@ -2743,10 +2750,8 @@ generic_finish_feed(rfMessage *msg, gpointer user_data)
 #endif
 	}
 
-	if (rf->cancel_all) {
-		rf->autoupdate = FALSE;
+	if (rf->cancel_all)
 		goto out;
-	}
 
 	if (msg->status_code != SOUP_STATUS_OK &&
 	    msg->status_code != SOUP_STATUS_CANCELLED) {
@@ -2762,7 +2767,6 @@ generic_finish_feed(rfMessage *msg, gpointer user_data)
 	if (rf->cancel) {
 #ifdef EVOLUTION_2_12
 		if(rf->label && rf->feed_queue == 0 && rf->info) {
-			rf->autoupdate = FALSE;
 			farticle=0;
 			ftotal=0;
                 	gtk_label_set_markup (GTK_LABEL (rf->label), _("Canceled."));
@@ -2862,7 +2866,6 @@ generic_finish_feed(rfMessage *msg, gpointer user_data)
 		g_free(furl);
 	}
 	if(rf->label && rf->feed_queue == 0 && rf->info) {
-		rf->autoupdate = FALSE;
 		farticle=0;
 		ftotal=0;
 		gtk_label_set_markup (GTK_LABEL (rf->label), _("Complete"));
@@ -2925,7 +2928,6 @@ fetch_one_feed(gpointer key, gpointer value, gpointer user_data)
 		return TRUE;	
 	} else if (rf->cancel && !rf->feed_queue) {
 		rf->cancel = 0;		//all feeds were either procesed or skipped
-		rf->autoupdate = FALSE;
 	}
 	return FALSE;
 }
@@ -3310,15 +3312,18 @@ check_update_feed_image(gchar *key)
 		ret = TRUE;
 		goto out;
 	}
-	if ((f = fopen(fav_file, "r"))) {
+	if ((f = fopen(fav_file, "r+"))) {
 		fgets(rfeed, 50, f);
-               	fclose(f);
 		remain = start.tv_sec - strtoul((const char *)&rfeed, NULL, 10);
 		if (FEED_IMAGE_TTL <= remain) {
+		    	(void)fseek(f, 0L, SEEK_SET);
+			fprintf(f, "%lu", start.tv_sec);	
+               		fclose(f);
 			ret =  TRUE;
 			goto out;
 		} else {
 			d(g_print("next favicon will be fetched in %lu seconds\n", FEED_IMAGE_TTL - remain));
+               		fclose(f);
 			ret = FALSE;
 		}
 	}
@@ -3597,7 +3602,6 @@ custom_update_articles(CDATA *cdata)
                                                                // feed gets deleted
 		} else if (rf->cancel && !rf->feed_queue) {
                 	rf->cancel = 0;         //all feeds where either procesed or skipped
-			rf->autoupdate = FALSE;
 		}
 	}
 	return TRUE;
@@ -3941,7 +3945,6 @@ org_gnome_cooly_rss_refresh(void *ep, EMPopupTargetSelect *t)
                 flabel       = label2;
         }
         if (!rf->pending && !rf->feed_queue) {
-                rf->autoupdate = FALSE;
                 rf->pending = TRUE;
                 check_folders();
 
@@ -4130,7 +4133,6 @@ org_gnome_cooly_rss(void *ep, EMPopupTargetSelect *t)
 	}
 #endif
 	if (!rf->pending && !rf->feed_queue) {
-		rf->autoupdate = FALSE;
 		rf->pending = TRUE;
 		check_folders();
 	



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