From d05ae65cdfd6429867b505afd42cc8bbbc03bfd9 Mon Sep 17 00:00:00 2001 From: mguessan Date: Tue, 1 Dec 2009 10:14:59 +0000 Subject: [PATCH] IMAP: implement EXPUNGE untagged response on NOOP to avoid NO message not found on Exchange message message uid change git-svn-id: http://svn.code.sf.net/p/davmail/code/trunk@867 3d1905a2-6b24-0410-a738-b14d5a86fcbd --- .../davmail/exchange/ExchangeSession.java | 16 +++++++------ src/java/davmail/imap/ImapConnection.java | 24 +++++++++++++++---- 2 files changed, 29 insertions(+), 11 deletions(-) diff --git a/src/java/davmail/exchange/ExchangeSession.java b/src/java/davmail/exchange/ExchangeSession.java index d45e7ef2..ba1deafa 100644 --- a/src/java/davmail/exchange/ExchangeSession.java +++ b/src/java/davmail/exchange/ExchangeSession.java @@ -1115,22 +1115,24 @@ public class ExchangeSession { * Check folder ctag and reload messages as needed. * * @param currentFolder current folder - * @return current folder or new refreshed folder + * @return true if folder changed * @throws IOException on error - * @deprecated no longer used: breaks Outlook IMAP */ - @Deprecated - public Folder refreshFolder(Folder currentFolder) throws IOException { + public boolean refreshFolder(Folder currentFolder) throws IOException { Folder newFolder = getFolder(currentFolder.folderName); if (currentFolder.contenttag == null || !currentFolder.contenttag.equals(newFolder.contenttag)) { if (LOGGER.isDebugEnabled()) { LOGGER.debug("Contenttag changed on " + currentFolder.folderName + ' ' + currentFolder.contenttag + " => " + newFolder.contenttag + ", reloading messages"); } - newFolder.loadMessages(); - return newFolder; + currentFolder.hasChildren = newFolder.hasChildren; + currentFolder.noInferiors = newFolder.noInferiors; + currentFolder.unreadCount = newFolder.unreadCount; + currentFolder.contenttag = newFolder.contenttag; + currentFolder.loadMessages(); + return true; } else { - return currentFolder; + return false; } } diff --git a/src/java/davmail/imap/ImapConnection.java b/src/java/davmail/imap/ImapConnection.java index 0aad80c6..9aca3ca8 100644 --- a/src/java/davmail/imap/ImapConnection.java +++ b/src/java/davmail/imap/ImapConnection.java @@ -399,10 +399,26 @@ public class ImapConnection extends AbstractConnection { } else if ("noop".equalsIgnoreCase(command) || "check".equalsIgnoreCase(command)) { if (currentFolder != null) { DavGatewayTray.debug(new BundleMessage("LOG_IMAP_COMMAND", command, currentFolder.folderName)); - currentFolder = session.getFolder(currentFolder.folderName); - currentFolder.loadMessages(); - sendClient("* " + currentFolder.count() + " EXISTS"); - sendClient("* " + currentFolder.count() + " RECENT"); + ExchangeSession.MessageList currentMessages = currentFolder.messages; + if (session.refreshFolder(currentFolder)) { + // build new uid set + HashSet uidSet = new HashSet(); + for (ExchangeSession.Message message : currentFolder.messages) { + uidSet.add(message.getImapUid()); + } + // send expunge untagged response for removed IMAP message uids + // note: some STORE commands trigger a uid change in Exchange, + // thus those messages are expunged and reappear with a new uid + int index = 1; + for (ExchangeSession.Message message : currentMessages) { + if (!uidSet.contains(message.getImapUid())) { + sendClient("* " + index + " EXPUNGE"); + } + index++; + } + sendClient("* " + currentFolder.count() + " EXISTS"); + sendClient("* " + currentFolder.count() + " RECENT"); + } } sendClient(commandId + " OK " + command + " completed"); } else if ("subscribe".equalsIgnoreCase(command) || "unsubscribe".equalsIgnoreCase(command)) {