Re: [evolution-patches] XGWMOVE for imap4




On Tue, 2005-02-15 at 16:25 -0500, Jeffrey Stedfast wrote:
I've had this sitting in my tree for almost 2 weeks now...
I think i didn't review it 'cause i wondered why you sent it to the list since i missed the patch review mode on mail.

I would recommend only adding flags to the end of existing ones, not moving the utf8 search ones/etc to the end of the list/changing their values.  Although it doesn't matter in this case so much, if you ever wrote those flags to disk you'd just have corrupted all of the flags/it breaks binary compatability for no reason, etc.

I also think it's redundant having to add another table AND function just to parse the groupwise extensions, since you can just pass it to the normal extension parser again without any ill effects.  Its 20 lines of code you could do without having to maintain separately.


text/plain attachment (imap4-XGWMOVE.patch)
? imap4-XGWMOVE.patch
? imap4.patch
Index: ChangeLog
===================================================================
RCS file: /cvs/gnome/evolution-data-server/camel/providers/imap4/ChangeLog,v
retrieving revision 1.11
diff -u -r1.11 ChangeLog
--- ChangeLog	15 Feb 2005 21:11:52 -0000	1.11
+++ ChangeLog	15 Feb 2005 21:12:38 -0000
@@ -1,3 +1,14 @@
+2005-02-03  Jeffrey Stedfast  <fejj novell com>
+
+	* camel-imap4-engine.c (camel_imap4_engine_handle_untagged_1):
+	Handle XGWMOVE untagged events as EXPUNGE events.
+
+	* camel-imap4-folder.c (imap4_transfer_messages_to): Optionally
+	use XGWMOVE if the extension is available.
+
+	* camel-imap4-engine.c (camel_imap4_engine_capability): Query for
+	the XGWEXTENSIONS as well if the server supports it.
+
 2005-02-14  Jeffrey Stedfast  <fejj novell com>
 
 	* camel-imap4-store-summary.c (store_info_to_folder_info):
Index: camel-imap4-engine.c
===================================================================
RCS file: /cvs/gnome/evolution-data-server/camel/providers/imap4/camel-imap4-engine.c,v
retrieving revision 1.21
diff -u -r1.21 camel-imap4-engine.c
--- camel-imap4-engine.c	1 Feb 2005 16:30:04 -0000	1.21
+++ camel-imap4-engine.c	15 Feb 2005 21:12:38 -0000
@@ -1,6 +1,8 @@
 /* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/*  Camel
- *  Copyright (C) 1999-2004 Jeffrey Stedfast
+/*
+ *  Authors: Jeffrey Stedfast <fejj novell com>
+ *
+ *  Copyright 2005 Novell, Inc. (www.novell.com)
  *
  *  This program is free software; you can redistribute it and/or modify
  *  it under the terms of the GNU General Public License as published by
@@ -15,6 +17,7 @@
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Street #330, Boston, MA 02111-1307, USA.
+ *
  */
 

@@ -45,6 +48,9 @@
 static void camel_imap4_engine_init (CamelIMAP4Engine *engine, CamelIMAP4EngineClass *klass);
 static void camel_imap4_engine_finalize (CamelObject *object);
 
+static int parse_xgwextensions (CamelIMAP4Engine *engine, CamelIMAP4Command *ic, guint32 index,
+				camel_imap4_token_t *token, CamelException *ex);
+
 
 static CamelObjectClass *parent_class = NULL;
 
@@ -260,6 +266,22 @@
 	
 	camel_imap4_command_unref (ic);
 	
+	if (retval == -1 || !(engine->capa & CAMEL_IMAP4_CAPABILITY_XGWEXTENSIONS))
+		return retval;
+	
+	ic = camel_imap4_engine_prequeue (engine, NULL, "XGWEXTENSIONS\r\n");
+	camel_imap4_command_register_untagged (ic, "XGWEXTENSIONS", parse_xgwextensions);
+	
+	while ((id = camel_imap4_engine_iterate (engine)) < ic->id && id != -1)
+		;
+	
+	if (id == -1 || ic->status != CAMEL_IMAP4_COMMAND_COMPLETE) {
+		camel_exception_xfer (ex, &ic->ex);
+		retval = -1;
+	}
+	
+	camel_imap4_command_unref (ic);
+	
 	return retval;
 }
 
@@ -439,14 +461,56 @@
 	{ "UIDPLUS",       CAMEL_IMAP4_CAPABILITY_UIDPLUS       }, /* rfc2359 */
 	{ "LITERAL+",      CAMEL_IMAP4_CAPABILITY_LITERALPLUS   }, /* rfc2088 */
 	{ "LOGINDISABLED", CAMEL_IMAP4_CAPABILITY_LOGINDISABLED },
-	{ "STARTTLS",      CAMEL_IMAP4_CAPABILITY_STARTTLS      },
+	{ "STARTTLS",      CAMEL_IMAP4_CAPABILITY_STARTTLS      }, /* rfc3501 */
 	{ "QUOTA",         CAMEL_IMAP4_CAPABILITY_QUOTA         }, /* rfc2087 */
 	{ "ACL",           CAMEL_IMAP4_CAPABILITY_ACL           }, /* rfc2086 */
 	{ "IDLE",          CAMEL_IMAP4_CAPABILITY_IDLE          }, /* rfc2177 */
 	{ "MULTIAPPEND",   CAMEL_IMAP4_CAPABILITY_MULTIAPPEND   }, /* rfc3502 */
+	{ "UNSELECT",      CAMEL_IMAP4_CAPABILITY_UNSELECT      },
+	{ "XGWEXTENSIONS", CAMEL_IMAP4_CAPABILITY_XGWEXTENSIONS }, /* GroupWise extensions */
 	{ NULL,            0                                    }
 };
 
+static struct {
+	const char *name;
+	guint32 flag;
+} imap4_xgwextensions[] = {
+	{ "XGWMOVE",       CAMEL_IMAP4_CAPABILITY_XGWMOVE       }, /* GroupWise MOVE command */
+	{ NULL,            0                                    }
+};
+
+static int
+parse_xgwextensions (CamelIMAP4Engine *engine, CamelIMAP4Command *ic, guint32 index, camel_imap4_token_t *token, CamelException *ex)
+{
+	int i;
+	
+	if (camel_imap4_engine_next_token (engine, token, ex) == -1)
+		return -1;
+	
+	while (token->token == CAMEL_IMAP4_TOKEN_ATOM) {
+		for (i = 0; imap4_xgwextensions[i].name; i++) {
+			if (!g_ascii_strcasecmp (imap4_xgwextensions[i].name, token->v.atom))
+				engine->capa |= imap4_xgwextensions[i].flag;
+		}
+		
+		if (camel_imap4_engine_next_token (engine, token, ex) == -1)
+			return -1;
+	}
+	
+	if (token->token != '\n') {
+		d(fprintf (stderr, "expected ')' to close untagged FETCH response\n"));
+		goto unexpected;
+	}
+	
+	return 0;
+	
+ unexpected:
+	
+	camel_imap4_utils_set_unexpected_token_error (ex, engine, token);
+	
+	return -1;
+}
+
 static gboolean
 auth_free (gpointer key, gpointer value, gpointer user_data)
 {
@@ -460,6 +524,7 @@
 	camel_imap4_token_t token;
 	int i;
 	
+	/* we assume UTF8 searches work until proven otherwise */
 	engine->capa = CAMEL_IMAP4_CAPABILITY_utf8_search;
 	engine->level = 0;
 	
@@ -1132,7 +1197,7 @@
 		/* NOTE: these can be over-ridden by a registered untagged response handler */
 		if (!strcmp ("EXISTS", token->v.atom)) {
 			camel_imap4_summary_set_exists (folder->summary, v);
-		} else if (!strcmp ("EXPUNGE", token->v.atom)) {
+		} else if (!strcmp ("EXPUNGE", token->v.atom) || !strcmp ("XGWMOVE", token->v.atom)) {
 			camel_imap4_summary_expunge (folder->summary, (int) v);
 		} else if (!strcmp ("RECENT", token->v.atom)) {
 			camel_imap4_summary_set_recent (folder->summary, v);
Index: camel-imap4-engine.h
===================================================================
RCS file: /cvs/gnome/evolution-data-server/camel/providers/imap4/camel-imap4-engine.h,v
retrieving revision 1.8
diff -u -r1.8 camel-imap4-engine.h
--- camel-imap4-engine.h	2 Dec 2004 08:03:30 -0000	1.8
+++ camel-imap4-engine.h	15 Feb 2005 21:12:38 -0000
@@ -1,6 +1,8 @@
 /* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/*  Camel
- *  Copyright (C) 1999-2004 Jeffrey Stedfast
+/*
+ *  Authors: Jeffrey Stedfast <fejj novell com>
+ *
+ *  Copyright 2005 Novell, Inc. (www.novell.com)
  *
  *  This program is free software; you can redistribute it and/or modify
  *  it under the terms of the GNU General Public License as published by
@@ -15,6 +17,7 @@
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Street #330, Boston, MA 02111-1307, USA.
+ *
  */
 

@@ -78,8 +81,11 @@
 	CAMEL_IMAP4_CAPABILITY_QUOTA            = (1 << 9),
 	CAMEL_IMAP4_CAPABILITY_ACL              = (1 << 10),
 	CAMEL_IMAP4_CAPABILITY_MULTIAPPEND      = (1 << 11),
-	CAMEL_IMAP4_CAPABILITY_useful_lsub      = (1 << 12),
-	CAMEL_IMAP4_CAPABILITY_utf8_search      = (1 << 13),
+	CAMEL_IMAP4_CAPABILITY_UNSELECT         = (1 << 12),
+	CAMEL_IMAP4_CAPABILITY_XGWEXTENSIONS    = (1 << 13),
+	CAMEL_IMAP4_CAPABILITY_XGWMOVE          = (1 << 14),
+	CAMEL_IMAP4_CAPABILITY_useful_lsub      = (1 << 15),
+	CAMEL_IMAP4_CAPABILITY_utf8_search      = (1 << 16),
 };
 
 typedef enum {
Index: camel-imap4-folder.c
===================================================================
RCS file: /cvs/gnome/evolution-data-server/camel/providers/imap4/camel-imap4-folder.c,v
retrieving revision 1.39
diff -u -r1.39 camel-imap4-folder.c
--- camel-imap4-folder.c	25 Jan 2005 16:57:19 -0000	1.39
+++ camel-imap4-folder.c	15 Feb 2005 21:12:38 -0000
@@ -1119,7 +1119,11 @@
 	for (i = 0; i < infos->len; i += n) {
 		n = camel_imap4_get_uid_set (engine, src->summary, infos, i, 10 + dest_namelen, &set);
 		
-		ic = camel_imap4_engine_queue (engine, src, "UID COPY %s %F\r\n", set, dest);
+		if (move && (engine->capa & CAMEL_IMAP4_CAPABILITY_XGWMOVE))
+			ic = camel_imap4_engine_queue (engine, src, "UID XGWMOVE %s %F\r\n", set, dest);
+		else
+			ic = camel_imap4_engine_queue (engine, src, "UID COPY %s %F\r\n", set, dest);
+		
 		while ((id = camel_imap4_engine_iterate (engine)) < ic->id && id != -1)
 			;
 		
@@ -1162,7 +1166,7 @@
 		
 		camel_imap4_command_unref (ic);
 		
-		if (move) {
+		if (move && !(engine->capa & CAMEL_IMAP4_CAPABILITY_XGWMOVE)) {
 			for (j = i; j < n; j++) {
 				info = infos->pdata[j];
 				camel_folder_set_message_flags (src, camel_message_info_uid (info),


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