I've had this sitting in my tree for almost 2 weeks now... -- Jeffrey Stedfast Evolution Hacker - Novell, Inc. fejj ximian com - www.novell.com
? 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),
Attachment:
smime.p7s
Description: S/MIME cryptographic signature