X-Git-Url: https://code.citadel.org/?a=blobdiff_plain;f=citadel%2Fmodules%2Fimap%2Fimap_misc.c;h=b8e50c2aa36d52db0200c502262a48e4f1129412;hb=484502117fc2ce04627e3cc7c0efa40e6c18d272;hp=d75db8a34448c19bfb8255a9f9af6d51c0d2dc7c;hpb=a605e70c6ecfccfe650a85ef4a32ebbf9cd4385f;p=citadel.git diff --git a/citadel/modules/imap/imap_misc.c b/citadel/modules/imap/imap_misc.c index d75db8a34..b8e50c2aa 100644 --- a/citadel/modules/imap/imap_misc.c +++ b/citadel/modules/imap/imap_misc.c @@ -144,6 +144,35 @@ int imap_do_copy(char *destination_folder) { } +/* + * Output the [COPYUID xxx yyy] response code required by RFC2359 + * to tell the client the UID's of the messages that were copied (if any). + * We are assuming that the IMAP_SELECTED flag is still set on any relevant + * messages in our source room. Since the Citadel system uses UID's that + * are both globally unique and persistent across a room-to-room copy, we + * can get this done quite easily. + */ +void imap_output_copyuid_response(void) { + int i; + int num_output = 0; + + for (i = 0; i < IMAP->num_msgs; ++i) { + if (IMAP->flags[i] & IMAP_SELECTED) { + ++num_output; + if (num_output == 1) { + cprintf("[COPYUID "); + } + else if (num_output > 1) { + cprintf(","); + } + cprintf("%ld", IMAP->msgids[i]); + } + } + if (num_output > 0) { + cprintf("] "); + } +} + /* * This function is called by the main command loop. @@ -166,7 +195,9 @@ void imap_copy(int num_parms, char *parms[]) { ret = imap_do_copy(parms[3]); if (!ret) { - cprintf("%s OK COPY completed\r\n", parms[0]); + cprintf("%s OK ", parms[0]); + imap_output_copyuid_response(); + cprintf("COPY completed\r\n"); } else { cprintf("%s NO COPY failed (error %d)\r\n", parms[0], ret); @@ -192,7 +223,9 @@ void imap_uidcopy(int num_parms, char *parms[]) { } if (imap_do_copy(parms[4]) == 0) { - cprintf("%s OK UID COPY completed\r\n", parms[0]); + cprintf("%s OK ", parms[0]); + imap_output_copyuid_response(); + cprintf("UID COPY completed\r\n"); } else { cprintf("%s NO UID COPY failed\r\n", parms[0]);