Re: [evolution-patches] NNTP one-liners



Meilof wrote:

Hello,

Some minor changes to NNTP-related code, basically just what Not Zed and Jeffrey suggested, and a small bugfix for a problem I found myself.

... and a fix for a nntp get folder info crash as well.


Meilof
-- meilof wanadoo nl

--- /home/meilof/tmp/evolution//camel/ChangeLog	2004-01-14 00:41:49.000000000 +0100
+++ camel/ChangeLog	2004-01-14 15:01:49.000000000 +0100
@@ -1,3 +1,18 @@
+2004-01-14  Meilof Veeningen  <meilof wanadoo nl>
+
+	* providers/nntp/camel-nntp-folder.c: support for working without a
+	cache, object state files
+
+	* providers/nntp/camel-nntp-store.c: support for working without a
+	cache, support for looking up non-root subscribed folders, support for
+	recursive unsubscribed folder listings, fix for folder info crash
+
+	* providers/nntp/camel-nntp-store-summary.[ch]: removed some
+	imap-specific code
+
+	* providers/nntp/camel-nntp-summary.c: work without cache
+
+
 2004-01-12  Meilof Veeningen  <meilof wanadoo nl>
 
 	* providers/nntp/camel-nntp-folder.[ch]: now based on discofolder,
--- /home/meilof/tmp/evolution//mail/ChangeLog	2004-01-14 00:39:54.000000000 +0100
+++ mail/ChangeLog	2004-01-14 14:21:43.000000000 +0100
@@ -1,3 +1,12 @@
+2004-01-14  Meilof Veeningen  <meilof wanadoo nl>
+
+	* em-folder-selection-button.c
+	(em_folder_selection_button_set_selection_mult): use gstring rather
+	than char*
+
+	* em-folder-tree.c (em_folder_tree_set_selected): use "" rather than
+	NULL for get_folder_info top (needed for check in folder_info__got)
+
 2004-01-12  Meilof Veeningen  <meilof wanadoo nl>
 
 	* em-composer-utils.c: support for posting both to mail and to
--- /home/meilof/tmp/evolution//composer/ChangeLog	2004-01-14 00:40:05.000000000 +0100
+++ composer/ChangeLog	2004-01-14 14:24:33.000000000 +0100
@@ -1,3 +1,9 @@
+2004-01-14  Meilof Veeningen  <meilof wanadoo nl>
+
+	* e-msg-composer-hdrs.c: fix to make relative folder names work
+	if the store url does not end with a slash, use gstring rather
+	than char* in some places.
+
 2004-01-12  JP Rosevear  <jpr ximian com>
 
 	* e-msg-composer-hdrs.c (e_msg_composer_hdrs_set_post_to): fix
--- /home/meilof/tmp/evolution//camel/providers/nntp/camel-nntp-folder.c	2004-01-14 00:39:27.000000000 +0100
+++ camel/providers/nntp/camel-nntp-folder.c	2004-01-14 14:08:17.000000000 +0100
@@ -79,7 +79,9 @@
 	
 	if (camel_nntp_summary_check ((CamelNNTPSummary *) folder->summary, nntp_folder->changes, ex) != -1)
 		camel_folder_summary_save (folder->summary);
-	
+
+	camel_object_state_write (folder);
+
 	if (camel_folder_change_info_changed(nntp_folder->changes)) {
 		changes = nntp_folder->changes;
 		nntp_folder->changes = camel_folder_change_info_new();
@@ -96,6 +98,7 @@
 static void
 nntp_folder_sync_offline (CamelFolder *folder, CamelException *ex)
 {
+	camel_object_state_write (folder);
 	camel_folder_summary_save (folder->summary);
 }
 
@@ -112,17 +115,18 @@
 	CamelStream *stream = NULL;
 	int ret;
 	char *line;
-	
+
 	if (camel_nntp_store_set_folder (nntp_store, (CamelFolder *) nntp_folder, nntp_folder->changes, ex) == -1)
 		return NULL;
-	
+
 	ret = camel_nntp_command (nntp_store, &line, "article %s", msgid);
 	if (ret == -1)
 		goto fail;
-	
+
 	if (ret == 220) {
-		stream = camel_data_cache_add (nntp_store->cache, "cache", msgid, NULL);
-		if (stream) {
+
+		if (nntp_store->cache &&
+		    (stream = camel_data_cache_add (nntp_store->cache, "cache", msgid, NULL)) != NULL) {
 			if (camel_stream_write_to_stream ((CamelStream *) nntp_store->stream, stream) == -1)
 				goto fail;
 			if (camel_stream_reset (stream) == -1)
@@ -132,15 +136,15 @@
 			camel_object_ref (stream);
 		}
 	}
-	
+
 	return stream;
-	
+
  fail:
 	if (errno == EINTR)
 		camel_exception_setv (ex, CAMEL_EXCEPTION_USER_CANCEL, _("User cancelled"));
 	else
 		camel_exception_setv (ex, CAMEL_EXCEPTION_SYSTEM, _("Cannot get message %s: %s"), msgid, g_strerror (errno));
-	
+
 	return NULL;
 }
 
@@ -151,16 +155,16 @@
 	CamelNNTPStore *nntp_store = (CamelNNTPStore *)((CamelFolder *) disco_folder)->parent_store;
 	CamelStream *stream;
 	const char *msgid;
-	
+
 	if (!(msgid = strchr (uid, ','))) {
 		camel_exception_setv (ex, CAMEL_EXCEPTION_SYSTEM,
 				      _("Internal error: uid in invalid format: %s"), uid);
 		return;
 	}
 	msgid++;
-	
+
 	CAMEL_NNTP_STORE_LOCK(nntp_store, command_lock);
-	
+
 	stream = nntp_folder_download_message ((CamelNNTPFolder *) disco_folder, msgid, ex);
 	if (stream) {
 		camel_object_unref (stream);
@@ -169,7 +173,7 @@
 		camel_exception_setv (ex, CAMEL_EXCEPTION_SERVICE_UNAVAILABLE,
 				      _("Could not get article %s from NNTP server"), uid);
 	}
-	
+
 	CAMEL_NNTP_STORE_UNLOCK(nntp_store, command_lock);
 }
 
@@ -198,19 +202,19 @@
 	msgid++;
 	
 	/* Lookup in cache, NEWS is global messageid's so use a global cache path */
-	stream = camel_data_cache_get (nntp_store->cache, "cache", msgid, NULL);
-	if (stream == NULL) {
+	if (nntp_store->cache == NULL ||
+	    (stream = camel_data_cache_get (nntp_store->cache, "cache", msgid, NULL)) == NULL) {
 		if (camel_disco_store_status ((CamelDiscoStore *) nntp_store) == CAMEL_DISCO_STORE_OFFLINE) {
 			camel_exception_set (ex, CAMEL_EXCEPTION_SERVICE_UNAVAILABLE,
 					     _("This message is not currently available"));
 			goto fail;
 		}
-		
+
 		stream = nntp_folder_download_message (nntp_folder, msgid, ex);
 		if (stream == NULL)
 			goto fail;
 	}
-	
+
 	if (stream) {
 		message = camel_mime_message_new ();
 		if (camel_data_wrapper_construct_from_stream ((CamelDataWrapper *) message, stream) == -1)
@@ -292,7 +296,7 @@
 	summary = g_ptr_array_new ();
 	for (i = 0; i < uids->len; i++) {
 		CamelMessageInfo *info;
-		
+
 		if ((info = camel_folder_get_message_info (folder, uids->pdata[i])))
 			g_ptr_array_add (summary, info);
 	}
@@ -577,7 +581,7 @@
 {
 	CamelFolder *folder;
 	CamelNNTPFolder *nntp_folder;
-	char *root;
+	char *filename;
 	CamelService *service;
 #ifdef ASYNC_SUMMARY
 	struct _folder_check_msg *m;
@@ -586,22 +590,27 @@
 	gboolean subscribed = TRUE;
 	
 	service = (CamelService *) parent;
-	root = camel_session_get_storage_path (service->session, service, ex);
-	if (root == NULL)
+	filename = camel_session_get_storage_path (service->session, service, ex);
+	if (filename == NULL)
 		return NULL;
-	
+
 	/* If this doesn't work, stuff wont save, but let it continue anyway */
-	camel_mkdir (root, 0777);
-	
+	camel_mkdir (filename, 0777);
+
 	folder = (CamelFolder *) camel_object_new (CAMEL_NNTP_FOLDER_TYPE);
 	nntp_folder = (CamelNNTPFolder *)folder;
-	
+
 	camel_folder_construct (folder, parent, folder_name, folder_name);
 	folder->folder_flags |= CAMEL_FOLDER_HAS_SUMMARY_CAPABILITY|CAMEL_FOLDER_HAS_SEARCH_CAPABILITY;
 	
-	nntp_folder->storage_path = g_build_filename (root, folder->full_name, NULL);
-	g_free (root);
-	
+	nntp_folder->storage_path = g_build_filename (filename, folder->full_name, NULL);
+	g_free (filename);
+
+	filename = g_strdup_printf ("%s.cmeta", nntp_folder->storage_path);
+	camel_object_set (folder, NULL, CAMEL_OBJECT_STATE_FILE, filename, NULL);
+	camel_object_state_read (folder);
+	g_free (filename);
+
 	folder->summary = (CamelFolderSummary *) camel_nntp_summary_new (nntp_folder);
 	camel_folder_summary_load (folder->summary);
 	
--- /home/meilof/tmp/evolution//camel/providers/nntp/camel-nntp-store.c	2004-01-14 00:39:28.000000000 +0100
+++ camel/providers/nntp/camel-nntp-store.c	2004-01-14 14:58:28.000000000 +0100
@@ -102,22 +102,23 @@
 	/* setup store-wide cache */
 	if (store->cache == NULL) {
 		if (store->storage_path == NULL)
-			goto fail;
-		
+			goto cache_done;
+
 		store->cache = camel_data_cache_new (store->storage_path, 0, ex);
 		if (store->cache == NULL)
-			goto fail;
-		
+			goto cache_done;
+
 		/* Default cache expiry - 2 weeks old, or not visited in 5 days */
 		camel_data_cache_set_expire_age (store->cache, 60*60*24*14);
 		camel_data_cache_set_expire_access (store->cache, 60*60*24*5);
 	}
-	
+
+ cache_done:
 	if (!(h = camel_service_gethost (service, ex)))
 		goto fail;
-	
+
 	port = service->url->port ? service->url->port : NNTP_PORT;
-	
+
 #ifdef HAVE_SSL
 	if (ssl_mode != USE_SSL_NEVER) {
 		port = service->url->port ? service->url->port : NNTPS_PORT;
@@ -128,7 +129,7 @@
 #else
 	tcp_stream = camel_tcp_stream_raw_new ();
 #endif /* HAVE_SSL */
-	
+
 	ret = camel_tcp_stream_connect (CAMEL_TCP_STREAM (tcp_stream), h, port);
 	camel_free_host (h);
 	if (ret == -1) {
@@ -139,15 +140,15 @@
 			camel_exception_setv (ex, CAMEL_EXCEPTION_SERVICE_UNAVAILABLE,
 					      _("Could not connect to %s (port %d): %s"),
 					      service->url->host, port, g_strerror (errno));
-		
+
 		camel_object_unref (tcp_stream);
-		
+
 		goto fail;
 	}
-	
+
 	store->stream = (CamelNNTPStream *) camel_nntp_stream_new (tcp_stream);
 	camel_object_unref (tcp_stream);
-	
+
 	/* Read the greeting, if any. */
 	if (camel_nntp_stream_line (store->stream, &buf, &len) == -1) {
 		if (errno == EINTR)
@@ -172,14 +173,14 @@
 		
 		camel_object_unref (store->stream);
 		store->stream = NULL;
-		
+
 		goto fail;
 	}
 	
 	/* set 'reader' mode & ignore return code */
 	if (camel_nntp_command (store, (char **) &buf, "mode reader") < 0 ||
 	/* hack: inn seems to close connections if nothing is done within
-	   the first ten seconds. a non-existent command is enough though */
+	   the first ten seconds, so we do some pseudo-useful command */
 	    camel_nntp_command (store, (char **) &buf, "date") < 0)
 	    goto fail;
 	
@@ -259,18 +260,18 @@
 	/* setup store-wide cache */
 	if (nntp_store->cache == NULL) {
 		nntp_store->cache = camel_data_cache_new (nntp_store->storage_path, 0, ex);
-		if (nntp_store->cache == NULL)
-			return FALSE;
-		
-		/* Default cache expiry - 2 weeks old, or not visited in 5 days */
-		camel_data_cache_set_expire_age (nntp_store->cache, 60*60*24*14);
-		camel_data_cache_set_expire_access (nntp_store->cache, 60*60*24*5);
-	}	
-	
+
+		if (nntp_store->cache != NULL) {
+			/* Default cache expiry - 2 weeks old, or not visited in 5 days */
+			camel_data_cache_set_expire_age (nntp_store->cache, 60*60*24*14);
+			camel_data_cache_set_expire_access (nntp_store->cache, 60*60*24*5);
+		}
+	}
+
 	path = g_build_filename (nntp_store->storage_path, ".ev-journal", NULL);
 	disco_store->diary = camel_disco_diary_new (disco_store, path, ex);
 	g_free (path);
-	
+
 	if (!disco_store->diary)
 		return FALSE;
 	
@@ -308,7 +309,7 @@
 	
 	if (!service_class->disconnect (service, clean, ex))
 		return FALSE;
-	
+
 	if (disco->diary) {
 		camel_object_unref (disco->diary);
 		disco->diary = NULL;
@@ -466,12 +467,31 @@
 {
 	int i;
 	CamelStoreInfo *si;
-	CamelFolderInfo *first = NULL, *last = NULL, *fi = NULL;
-	
-	/* since we do not do a tree, any request that is not for root is sure to give no results */
-	if (top != NULL && top[0] != 0)
+	CamelFolderInfo *root, *first = NULL, *last = NULL, *fi = NULL;
+
+	if (flags & CAMEL_STORE_FOLDER_INFO_RECURSIVE) {
+		/* for recursive queries, the item itself should be added */
+		if (top && top[0] != 0) {
+			si = (CamelStoreInfo *) camel_nntp_store_summary_full_name (store->summary, top);
+			if (si) {
+				if (si->flags & CAMEL_STORE_INFO_FOLDER_SUBSCRIBED)
+					root = nntp_folder_info_from_store_info (store, store->do_short_folder_notation, si);
+				camel_store_summary_info_free ((CamelStoreSummary *) store->summary, si);
+			}
+		}
+
+		if (!root) {
+			root = nntp_folder_info_from_name (store, store->do_short_folder_notation, top ? top : "");
+			root->flags |= CAMEL_FOLDER_NOSELECT;
+		}
+	}
+
+	if (top != NULL && top[0] != 0) {
+		/* no subitems for sure */
 		return NULL;
-	
+	}
+
+
 	for (i=0;(si = camel_store_summary_index ((CamelStoreSummary *) store->summary, i));i++) {
 		if (si->flags & CAMEL_STORE_INFO_FOLDER_SUBSCRIBED) {
 			fi = nntp_folder_info_from_store_info (store, store->do_short_folder_notation, si);
@@ -486,8 +506,42 @@
 		}
 		camel_store_summary_info_free ((CamelStoreSummary *) store->summary, si);
 	}
-	
-	return first;
+
+	if (!(flags & CAMEL_STORE_FOLDER_INFO_RECURSIVE))
+		return first;
+
+	root->child = first;
+	return root;
+}
+
+static CamelFolderInfo *
+nntp_folder_list_hierarchical (CamelNNTPStore *store, CamelFolderInfo *first, char *top)
+{
+	GPtrArray *arr = g_ptr_array_new();
+	CamelFolderInfo *cur;
+	CamelStoreInfo *si;
+
+	if (top != NULL) {
+		/* check to see whether top exists */
+		cur = nntp_folder_info_from_name (store, FALSE,
+		         (store->folder_hierarchy_relative || top == NULL) ? "" : top);
+		si = (CamelStoreInfo *) camel_nntp_store_summary_full_name (store->summary, top);
+		if (si)
+			camel_store_summary_info_free ((CamelStoreSummary *) store->summary, si);
+		else
+			cur->flags |= CAMEL_FOLDER_NOSELECT;
+		g_ptr_array_add (arr, cur);
+	}
+
+	while (first) {
+		g_ptr_array_add (arr, first);
+		first = first->sibling;
+	}
+
+	cur = camel_folder_info_build (arr, NULL, '.', store->folder_hierarchy_relative);
+	g_ptr_array_free (arr, FALSE);
+
+	return cur;
 }
 
 /*
@@ -522,9 +576,9 @@
 				/* apparently, this is an indirect subitem. if it's not a subitem of
 				   the item we added last, we need to add a portion of this item to
 				   the list as a placeholder */
-				len = strlen (last->full_name);
+				len = last ? strlen (last->full_name) : 0;
 				if (!last ||
-				    g_ascii_strncasecmp(si->path, last->full_name, len) != 0 || 
+				    g_ascii_strncasecmp(si->path, last->full_name, len) != 0 ||
 				    si->path[len] != '.') {
 					tmpname = g_strdup(si->path);
 					*(strchr(tmpname + toplen, '.')) = '\0';
@@ -551,9 +605,15 @@
 		}
 		camel_store_summary_info_free((CamelStoreSummary *)store->summary, si);
 	}
-	
-	g_free(top);
-	return first;
+
+	if (recursive_flag) {
+		last = nntp_folder_list_hierarchical (store, first, top);
+		g_free(top);
+		return last;
+	} else {
+		g_free(top);
+		return first;
+	}
 }
 
 /* retrieves the date from the NNTP server */
@@ -1057,8 +1117,11 @@
 			;
 	}
 	camel_nntp_stream_set_mode(store->stream, CAMEL_NNTP_STREAM_LINE);
-	
- command_begin_send:
+
+	camel_stream_reset ((CamelStream *) store->mem);
+	/* FIXME: hack */
+	g_byte_array_set_size (store->mem->buffer, 0);
+
 	va_start(ap, fmt);
 	ps = p = fmt;
 	while ((c = *p++)) {
@@ -1098,47 +1161,46 @@
 			}
 		}
 	}
-	
+
 	camel_stream_write ((CamelStream *) store->mem, ps, p-ps-1);
 	dd(printf("NNTP_COMMAND: '%.*s'\n", (int)store->mem->buffer->len, store->mem->buffer->data));
 	camel_stream_write ((CamelStream *) store->mem, "\r\n", 2);
-	
-	if (camel_stream_write ((CamelStream *) store->stream, store->mem->buffer->data, store->mem->buffer->len) == -1 && errno != EINTR) {
-		camel_stream_reset ((CamelStream *) store->mem);
-		/* FIXME: hack */
-		g_byte_array_set_size (store->mem->buffer, 0);
-		
-	reconnect:
-		/* some error, re-connect */
-		camel_service_disconnect (CAMEL_SERVICE (store), FALSE, NULL);
-		
-		if (!nntp_connected (store, NULL))
+
+	while (1) {
+		dd(printf("NNTP_COMMAND: '%.*s'\n", (int)store->mem->buffer->len, store->mem->buffer->data));
+		if (camel_stream_write ((CamelStream *) store->stream, store->mem->buffer->data, store->mem->buffer->len) == -1
+		    && errno != EINTR) {
+reconnect:
+			/* some error, re-connect */
+			camel_service_disconnect (CAMEL_SERVICE (store), FALSE, NULL);
+
+			if (!nntp_connected (store, NULL))
+				return -1;
+
+			continue;
+		}
+
+		if (camel_nntp_stream_line (store->stream, (unsigned char **) line, &u) == -1)
 			return -1;
-		
-		goto command_begin_send;
+
+		u = strtoul (*line, NULL, 10);
+
+		/* Check for 'authentication required' codes */
+		if (u == NNTP_AUTH_REQUIRED &&
+		    camel_nntp_try_authenticate (store))
+			continue;
+
+		/* the server doesn't like us anymore, but we still like her! */
+		if (u == 401 || u == 503)
+			goto reconnect;
+
+		/* success */
+		break;
 	}
-	
-	camel_stream_reset ((CamelStream *) store->mem);
-	/* FIXME: hack */
-	g_byte_array_set_size (store->mem->buffer, 0);
-	
-	if (camel_nntp_stream_line (store->stream, (unsigned char **) line, &u) == -1)
-		return -1;
-	
-	u = strtoul (*line, NULL, 10);
-	
-	/* Check for 'authentication required' codes */
-	if (u == NNTP_AUTH_REQUIRED &&
-	    camel_nntp_try_authenticate(store))
-		goto command_begin_send;
-	
-	/* the server doesn't like us anymore, but we still like her! */
-	if (u == 401 || u == 503)
-		goto reconnect;
-	
+
 	/* Handle all switching to data mode here, to make callers job easier */
 	if (u == 215 || (u >= 220 && u <=224) || (u >= 230 && u <= 231))
 		camel_nntp_stream_set_mode(store->stream, CAMEL_NNTP_STREAM_DATA);
-	
+
 	return u;
 }
--- /home/meilof/tmp/evolution//camel/providers/nntp/camel-nntp-store-summary.c	2004-01-12 23:20:40.000000000 +0100
+++ camel/providers/nntp/camel-nntp-store-summary.c	2004-01-14 13:42:07.000000000 +0100
@@ -87,10 +87,6 @@
 static void
 camel_nntp_store_summary_init (CamelNNTPStoreSummary *s)
 {
-	/*struct _CamelNNTPStoreSummaryPrivate *p;
-
-	  p = _PRIVATE(s) = g_malloc0(sizeof(*p));*/
-
 	((CamelStoreSummary *) s)->store_info_size = sizeof (CamelNNTPStoreInfo);
 	s->version = CAMEL_NNTP_STORE_SUMMARY_VERSION;
 	memset (&s->last_newslist, 0, sizeof (s->last_newslist));
@@ -99,11 +95,6 @@
 static void
 camel_nntp_store_summary_finalise (CamelObject *obj)
 {
-	/*struct _CamelNNTPStoreSummaryPrivate *p;*/
-	/*CamelNNTPStoreSummary *s = (CamelNNTPStoreSummary *)obj;*/
-
-	/*p = _PRIVATE(obj);
-	  g_free(p);*/
 }
 
 CamelType
@@ -121,7 +112,7 @@
 					   (CamelObjectInitFunc) camel_nntp_store_summary_init,
 					   (CamelObjectFinalizeFunc) camel_nntp_store_summary_finalise);
 	}
-	
+
 	return type;
 }
 
@@ -157,7 +148,7 @@
 {
 	int count, i;
 	CamelNNTPStoreInfo *info;
-	
+
 	count = camel_store_summary_count ((CamelStoreSummary *) s);
 	for (i = 0; i < count; i++) {
 		info = (CamelNNTPStoreInfo *)camel_store_summary_index ((CamelStoreSummary *) s, i);
@@ -167,150 +158,8 @@
 			camel_store_summary_info_free ((CamelStoreSummary *) s, (CamelStoreInfo *)info);
 		}
 	}
-	
-	return NULL;
-}
 
-char *
-camel_nntp_store_summary_full_to_path (CamelNNTPStoreSummary *s, const char *full_name, char dir_sep)
-{
-	char *path, *p;
-	int c;
-	const char *f;
-
-	if (dir_sep != '/') {
-		p = path = g_alloca (strlen (full_name) * 3 + 1);
-		f = full_name;
-		while ((c = *f++ & 0xff)) {
-			if (c == dir_sep)
-				*p++ = '/';
-			else if (c == '/' || c == '%')
-				p += sprintf (p, "%%%02X", c);
-			else
-				*p++ = c;
-		}
-		*p = 0;
-	} else
-		path = (char *) full_name;
-	
-	return camel_utf7_utf8 (path);
-}
-
-static guint32
-hexnib (guint32 c)
-{
-	if (c >= '0' && c <= '9')
-		return c-'0';
-	else if (c >= 'A' && c <= 'Z')
-		return c - 'A' + 10;
-	else
-		return 0;
-}
-
-char *
-camel_nntp_store_summary_path_to_full (CamelNNTPStoreSummary *s, const char *path, char dir_sep)
-{
-	unsigned char *full, *f;
-	guint32 c, v = 0;
-	const char *p;
-	int state=0;
-	char *subpath, *last = NULL;
-	CamelStoreInfo *si;
-	
-	/* check to see if we have a subpath of path already defined */
-	subpath = g_alloca (strlen (path) + 1);
-	strcpy (subpath, path);
-	do {
-		si = camel_store_summary_path ((CamelStoreSummary *) s, subpath);
-		if (si == NULL) {
-			last = strrchr (subpath, '/');
-			if (last)
-				*last = 0;
-		}
-	} while (si == NULL && last);
-	
-	/* path is already present, use the raw version we have */
-	if (si && strlen (subpath) == strlen (path)) {
-		f = g_strdup (camel_nntp_store_info_full_name (s, si));
-		camel_store_summary_info_free ((CamelStoreSummary *) s, si);
-		return f;
-	}
-	
-	f = full = g_alloca (strlen (path)*2+1);
-	if (si)
-		p = path + strlen (subpath);
-	else
-		p = path;
-	
-	while ((c = camel_utf8_getc ((const unsigned char **) &p))) {
-		switch (state) {
-		case 0:
-			if (c == '%') {
-				state = 1;
-			} else {
-				if (c == '/')
-					c = dir_sep;
-				camel_utf8_putc(&f, c);
-			}
-			break;
-		case 1:
-			state = 2;
-			v = hexnib (c) << 4;
-			break;
-		case 2:
-			state = 0;
-			v |= hexnib (c);
-			camel_utf8_putc (&f, v);
-			break;
-		}
-	}
-	camel_utf8_putc (&f, c);
-	
-	/* merge old path part if required */
-	f = camel_utf8_utf7 (full);
-	if (si) {
-		full = g_strdup_printf ("%s%s", camel_nntp_store_info_full_name (s, si), f);
-		g_free (f);
-		camel_store_summary_info_free ((CamelStoreSummary *) s, si);
-		f = full;
-	}
-	
-	return f;
-}
-
-CamelNNTPStoreInfo *
-camel_nntp_store_summary_add_from_full (CamelNNTPStoreSummary *s, const char *full, char dir_sep)
-{
-	CamelNNTPStoreInfo *info;
-	char *pathu8;
-	int len;
-	char *full_name;
-	
-	d(printf("adding full name '%s' '%c'\n", full, dir_sep));
-	
-	len = strlen (full);
-	full_name = g_alloca (len+1);
-	strcpy(full_name, full);
-	if (full_name[len-1] == dir_sep)
-		full_name[len-1] = 0;
-	
-	info = camel_nntp_store_summary_full_name (s, full_name);
-	if (info) {
-		camel_store_summary_info_free ((CamelStoreSummary *) s, (CamelStoreInfo *) info);
-		d(printf("  already there\n"));
-		return info;
-	}
-	
-	pathu8 = camel_nntp_store_summary_full_to_path (s, full_name, dir_sep);
-	
-	info = (CamelNNTPStoreInfo *) camel_store_summary_add_from_path ((CamelStoreSummary *) s, pathu8);
-	if (info) {
-		d(printf("  '%s' -> '%s'\n", pathu8, full_name));
-		camel_store_info_set_string((CamelStoreSummary *)s, (CamelStoreInfo *)info, CAMEL_NNTP_STORE_INFO_FULL_NAME, full_name);
-	} else
-		d(printf("  failed\n"));
-	
-	return info;
+	return NULL;
 }
 
 static int
--- /home/meilof/tmp/evolution//camel/providers/nntp/camel-nntp-summary.c	2004-01-14 00:39:28.000000000 +0100
+++ camel/providers/nntp/camel-nntp-summary.c	2004-01-14 13:37:16.000000000 +0100
@@ -276,7 +276,7 @@
 					   a cached message that might be in another folder - not that important as
 					   it is a true cache */
 					msgid = strchr(uid, ',');
-					if (msgid)
+					if (msgid && store->cache)
 						camel_data_cache_remove(store->cache, "cache", msgid+1, NULL);
 					camel_folder_change_info_remove_uid(changes, uid);
 					camel_folder_summary_remove(s, mi);
--- /home/meilof/tmp/evolution//camel/providers/nntp/camel-nntp-store-summary.h	2004-01-12 23:20:40.000000000 +0100
+++ camel/providers/nntp/camel-nntp-store-summary.h	2004-01-14 13:41:01.000000000 +0100
@@ -71,27 +71,8 @@
 CamelType			 camel_nntp_store_summary_get_type	(void);
 CamelNNTPStoreSummary      *camel_nntp_store_summary_new	(void);
 
-/* TODO: this api needs some more work, needs to support lists */
-/*CamelNNTPStoreNamespace *camel_nntp_store_summary_namespace_new(CamelNNTPStoreSummary *s, const char *full_name, char dir_sep);*/
-/*void camel_nntp_store_summary_namespace_set(CamelNNTPStoreSummary *s, CamelNNTPStoreNamespace *ns);*/
-/*CamelNNTPStoreNamespace *camel_nntp_store_summary_namespace_find_path(CamelNNTPStoreSummary *s, const char *path);*/
-/*CamelNNTPStoreNamespace *camel_nntp_store_summary_namespace_find_full(CamelNNTPStoreSummary *s, const char *full_name);*/
-
-/* helper macro's */
-#define camel_nntp_store_info_full_name(s, i) (camel_store_info_string((CamelStoreSummary *)s, (const CamelStoreInfo *)i, CAMEL_NNTP_STORE_INFO_FULL_NAME))
-
-/* converts to/from utf8 canonical nasmes */
-char *camel_nntp_store_summary_full_to_path(CamelNNTPStoreSummary *s, const char *full_name, char dir_sep);
-
-char *camel_nntp_store_summary_path_to_full(CamelNNTPStoreSummary *s, const char *path, char dir_sep);
-char *camel_nntp_store_summary_dotted_to_full(CamelNNTPStoreSummary *s, const char *dotted, char dir_sep);
 
 CamelNNTPStoreInfo *camel_nntp_store_summary_full_name(CamelNNTPStoreSummary *s, const char *full_name);
-CamelNNTPStoreInfo *camel_nntp_store_summary_add_from_full(CamelNNTPStoreSummary *s, const char *full_name, char dir_sep);
-
-/* a convenience lookup function. always use this if path known */
-char *camel_nntp_store_summary_full_from_path(CamelNNTPStoreSummary *s, const char *path);
-
 
 #ifdef __cplusplus
 }
--- /home/meilof/tmp/evolution//composer/e-msg-composer-hdrs.c	2004-01-14 00:40:05.000000000 +0100
+++ composer/e-msg-composer-hdrs.c	2004-01-14 14:07:54.000000000 +0100
@@ -650,7 +650,7 @@
 static void
 set_pair_visibility (EMsgComposerHdrs *h, EMsgComposerHdrPair *pair, int visible)
 {
-	if (visible /*& h->visible_mask*/) {
+	if (visible) {
 		gtk_widget_show (pair->label);
 		gtk_widget_show (pair->entry);
 	} else {
@@ -1023,14 +1023,6 @@
 		eab_destination_freev (cc_destv);
 		eab_destination_freev (bcc_destv);
 	}
-	
-#if 0
-	if (hdrs->visible_mask & E_MSG_COMPOSER_VISIBLE_POSTTO) {
-		header = e_msg_composer_hdrs_get_post_to (hdrs);
-		camel_medium_set_header (CAMEL_MEDIUM (msg), "X-Evolution-PostTo", header);
-		g_free (header);
-	}
-#endif
 }
 
 
@@ -1165,12 +1157,12 @@
 				 const char *post_to)
 {
 	GList *list;
-	
+
 	g_return_if_fail (E_IS_MSG_COMPOSER_HDRS (hdrs));
 	g_return_if_fail (post_to != NULL);
-	
+
 	list = g_list_append (NULL, g_strdup (post_to));
-	
+
 	e_msg_composer_hdrs_set_post_to_list (hdrs, list);
 	
 	g_free (list->data);
@@ -1191,7 +1183,7 @@
 		
 		if (tmp[0])
 			lst = g_list_append (lst, g_strdup (tmp));
-		
+
 		cur_ptr++;
 	}
 	
@@ -1205,15 +1197,16 @@
 {
 	CamelURL *url;
 	char *ret = NULL;
-	
+
 	if (hdrs->account->source && hdrs->account->source->url) {
 		url = camel_url_new (hdrs->account->source->url, NULL);
+		camel_url_set_path (url, "/");
 		ret = camel_url_to_string (url, CAMEL_URL_HIDE_ALL);
 		camel_url_free (url);
 	}
-	
+
 	return ret;
-}                                            
+}
 
 static char *
 folder_name_to_string (EMsgComposerHdrs *hdrs, const char *uri)
@@ -1239,30 +1232,30 @@
 e_msg_composer_hdrs_set_post_to_list (EMsgComposerHdrs *hdrs, GList *urls)
 {
 	/* compile the name */
-	char *caption, *tmp, *tmp2;
+	GString *caption;
+	char *tmp;
 	gboolean post_custom;
-	
+
 	if (hdrs->priv->post_to.entry == NULL)
 		return;
-	
-	caption = g_strdup ("");
-	
+
+	caption = g_string_new("");
+
 	while (urls) {
-		tmp = folder_name_to_string (hdrs, (char *)urls->data);
+		tmp = folder_name_to_string (hdrs, (char *) urls->data);
 		if (tmp) {
-			tmp2 = g_strconcat (caption, ", ", tmp, NULL);
-			g_free (caption);
-			caption = tmp2;
+			g_string_append (caption, ", ");
+			g_string_append (caption, tmp);
 			g_free (tmp);
 		}
-		
 		urls = g_list_next (urls);
 	}
-	
+
 	post_custom = hdrs->priv->post_custom;
-	gtk_entry_set_text (GTK_ENTRY (hdrs->priv->post_to.entry), caption[0] ? caption + 2 : "");
+	gtk_entry_set_text (GTK_ENTRY (hdrs->priv->post_to.entry), caption->str[0] ? caption->str + 2 : "");
 	hdrs->priv->post_custom = post_custom;
-	g_free (caption);
+	g_string_free (caption, TRUE);
+
 }
 
 void
@@ -1270,34 +1263,35 @@
                                       const char *base, const char *post_to)
 {
 	GList *lst, *curlist;
-	char *hdr_copy = g_strdup (post_to), *caption, *tmp, *tmp2;
+	char *hdr_copy = g_strdup (post_to), *tmp, *tmp2;
 	gboolean post_custom;
-	
+	GString *caption;
+
 	/* split to newsgroup names */
 	lst = newsgroups_list_split (hdr_copy);
 	curlist = lst;
-	
+
 	/* compile the name */
-	caption = g_strdup ("");
-	
+	caption = g_string_new("");
+
 	while (curlist) {
-		tmp2 = g_strdup_printf ("%s/%s", base, (char *)curlist->data);
+		tmp2 = g_strdup_printf ("%s/%s", base, (char *) curlist->data);
 		tmp = folder_name_to_string (hdrs, tmp2);
 		g_free (tmp2);
+
 		if (tmp) {
-			tmp2 = g_strconcat (caption, ", ", tmp, NULL);
-			g_free (caption);
-			caption = tmp2;
+			g_string_append (caption, ", ");
+			g_string_append (caption, tmp);
 			g_free (tmp);
 		}
 		curlist = g_list_next (curlist);
 	}
-	
+
 	post_custom = hdrs->priv->post_custom;
-	gtk_entry_set_text (GTK_ENTRY (hdrs->priv->post_to.entry), caption[0] ? caption + 2 : "");
+	gtk_entry_set_text (GTK_ENTRY (hdrs->priv->post_to.entry), caption->str[0] ? caption->str + 2 : "");
 	hdrs->priv->post_custom = post_custom;
-	g_free (caption);
-	
+	g_string_free (caption, TRUE);
+
         g_list_foreach (lst, (GFunc) g_free, NULL);
 	g_list_free (lst);
 	g_free (hdr_copy);
--- /home/meilof/tmp/evolution//mail/em-folder-selection-button.c	2004-01-14 00:39:54.000000000 +0100
+++ mail/em-folder-selection-button.c	2004-01-14 13:53:49.000000000 +0100
@@ -268,43 +268,46 @@
 em_folder_selection_button_set_selection_mult (EMFolderSelectionButton *button, GList *uris)
 {
 	struct _EMFolderSelectionButtonPrivate *priv = button->priv;
-	char *caption, *tmp, *tmp2;
-	
+	char *tmp;
+	GList *uri_next;
+	GString *caption = NULL;
+
+
 	g_return_if_fail (EM_IS_FOLDER_SELECTION_BUTTON (button));
-	
+
 	if (priv->uris) {
 		g_list_foreach (priv->uris, (GFunc) g_free, NULL);
 		g_list_free (priv->uris);
 		priv->uris = NULL;
 	}
-	
+
 	priv->uris = uris;
-	
+
 	/* compile the name */
-	caption = g_strdup ("");
-	
+	caption = g_string_new ("");
+
 	while (uris) {
 		tmp = em_utils_folder_name_from_uri (uris->data);
 		if (tmp) {
-			tmp2 = g_strconcat (caption, ", ", tmp, NULL);
-			g_free (caption);
-			caption = tmp2;
+			g_string_append (caption, ", ");
+			g_string_append (caption, tmp);
 			g_free (tmp);
-			uris = uris->next;
+			uris = g_list_next (uris);
 		} else {
 			/* apparently, we do not know this folder, so we'll just skip it */
 			g_free (uris->data);
-			uris = g_list_next (uris);
-			priv->uris = g_list_remove (priv->uris, uris->data);
+			uri_next = g_list_next (uris);
+			priv->uris = g_list_remove_link (priv->uris, uris);
+			uris = uri_next;
 		}
 	}
-	
-	if (caption[0])
-		gtk_label_set_text (GTK_LABEL (priv->label), caption + 2);
+
+	if (caption->str[0])
+		gtk_label_set_text (GTK_LABEL (priv->label), caption->str + 2);
 	else
 		set_contents_unselected (button);
-	
-	g_free (caption);
+
+	g_string_free (caption, TRUE);
 }
 
 GList *
--- /home/meilof/tmp/evolution//mail/em-folder-tree.c	2004-01-14 00:39:54.000000000 +0100
+++ mail/em-folder-tree.c	2004-01-14 13:59:10.000000000 +0100
@@ -77,7 +77,7 @@
 	GList *lost_folders;
 	
 	guint save_state_id;
-	
+
 	guint loading_row_id;
 };
 
@@ -148,7 +148,7 @@
 em_folder_tree_get_type (void)
 {
 	static GType type = 0;
-	
+
 	if (!type) {
 		static const GTypeInfo info = {
 			sizeof (EMFolderTreeClass),
@@ -161,10 +161,10 @@
 			0,    /* n_preallocs */
 			(GInstanceInitFunc) em_folder_tree_init,
 		};
-		
+
 		type = g_type_register_static (GTK_TYPE_VBOX, "EMFolderTree", &info, 0);
 	}
-	
+
 	return type;
 }
 
@@ -173,12 +173,12 @@
 {
 	GObjectClass *object_class = G_OBJECT_CLASS (klass);
 	GtkObjectClass *gtk_object_class = GTK_OBJECT_CLASS (klass);
-	
+
 	parent_class = g_type_class_ref (GTK_TYPE_VBOX);
-	
+
 	object_class->finalize = em_folder_tree_finalize;
 	gtk_object_class->destroy = em_folder_tree_destroy;
-	
+
 	signals[FOLDER_SELECTED] =
 		g_signal_new ("folder-selected",
 			      G_OBJECT_CLASS_TYPE (object_class),
@@ -197,20 +197,20 @@
 {
 	unsigned int unread;
 	GtkTreeIter iter;
-	
+
 	if (!gtk_tree_model_iter_children (model, &iter, root))
 		return FALSE;
-	
+
 	do {
 		gtk_tree_model_get (model, &iter, COL_UINT_UNREAD, &unread, -1);
 		if (unread)
 			return TRUE;
-		
+
 		if (gtk_tree_model_iter_has_child (model, &iter))
 			if (subdirs_contain_unread (model, &iter))
 				return TRUE;
 	} while (gtk_tree_model_iter_next (model, &iter));
-	
+
 	return FALSE;
 }
 
@@ -285,7 +285,7 @@
 		display = g_strdup_printf ("%s (%u)", name, unread);
 	else
 		display = g_strdup (name);
-	
+
 	g_object_set (renderer, "text", display,
 		      "weight", bold ? PANGO_WEIGHT_BOLD : PANGO_WEIGHT_NORMAL,
 		      NULL);
@@ -372,7 +372,7 @@
 	
 	selection = gtk_tree_view_get_selection ((GtkTreeView *) tree);
 	gtk_tree_selection_set_mode (selection, GTK_SELECTION_SINGLE);
-	
+
 	gtk_tree_view_set_headers_visible ((GtkTreeView *) tree, FALSE);
 	
 	return (GtkTreeView *) tree;
@@ -659,7 +659,7 @@
 	
 	/* output data */
 	CamelFolderInfo *fi;
-	
+
 	/* uri to select if any after the op is done */
 	char *select_uri;
 };
@@ -1269,7 +1269,7 @@
 emft_selection_get_selected (GtkTreeSelection *selection, GtkTreeModel **model, GtkTreeIter *iter)
 {
 	struct _emft_selection_data dat = { NULL, iter, FALSE };
-	
+
 	if (gtk_tree_selection_get_mode (selection) == GTK_SELECTION_MULTIPLE) {
 		gtk_tree_selection_selected_foreach (selection, selfunc, &dat);
 		if (model)
@@ -1469,7 +1469,7 @@
 		if ((prop_data->argv->argv[i].tag & CAMEL_ARG_TYPE) == CAMEL_ARG_STR)
 			g_free (prop_data->argv->argv[i].ca_str);
 	}
-	
+
 	camel_object_unref (prop_data->object);
 	g_free (prop_data->argv);
 	g_free (prop_data);
@@ -1503,7 +1503,7 @@
 	w = gtk_frame_new (_("Properties"));
 	gtk_widget_show (w);
 	gtk_box_pack_start ((GtkBox *) ((GtkDialog *) dialog)->vbox, w, TRUE, TRUE, 6);
-	
+
 	table = gtk_table_new (g_slist_length (list) + 3, 2, FALSE);
 	gtk_widget_show (table);
 	gtk_container_add ((GtkContainer *) w, table);
@@ -1605,7 +1605,7 @@
 			g_assert_not_reached ();
 			break;
 		}
-		
+
 		row++;
 		l = l->next;
 	}
@@ -1707,7 +1707,7 @@
 	
 	gtk_tree_model_get (model, &iter, COL_STRING_FOLDER_PATH, &path,
 			    COL_STRING_URI, &uri, -1);
-	
+
 	g_free (priv->selected_uri);
 	priv->selected_uri = g_strdup (uri);
 	
@@ -1802,7 +1802,7 @@
 	m->root = gtk_tree_row_reference_copy (row);
 	m->store = store;
 	m->emft = emft;
-	m->top = top ? g_strdup (top) : NULL;
+	m->top = top ? g_strdup (top) : "";
 	m->flags = CAMEL_STORE_FOLDER_INFO_FAST | CAMEL_STORE_FOLDER_INFO_RECURSIVE;
 	m->select_uri = g_strdup (uri);
 	


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