From 34b1491ec910a89c109f0b65cd0c6fb5a05df3b1 Mon Sep 17 00:00:00 2001 From: mguessan Date: Wed, 21 Jul 2010 10:18:46 +0000 Subject: [PATCH] IMAP: fix flag handling in createMessage git-svn-id: http://svn.code.sf.net/p/davmail/code/trunk@1243 3d1905a2-6b24-0410-a738-b14d5a86fcbd --- .../exchange/dav/DavExchangeSession.java | 66 +++++++------------ src/java/davmail/exchange/dav/Field.java | 4 +- src/java/davmail/imap/ImapConnection.java | 18 ++++- .../TestExchangeSessionMessageFlags.java | 3 +- 4 files changed, 43 insertions(+), 48 deletions(-) diff --git a/src/java/davmail/exchange/dav/DavExchangeSession.java b/src/java/davmail/exchange/dav/DavExchangeSession.java index 6008a49c..4b5a7e02 100644 --- a/src/java/davmail/exchange/dav/DavExchangeSession.java +++ b/src/java/davmail/exchange/dav/DavExchangeSession.java @@ -589,7 +589,7 @@ public class DavExchangeSession extends ExchangeSession { super(folderPath, itemName, properties, etag, noneMatch); } - protected List buildProperties() { + protected List buildProperties() { ArrayList list = new ArrayList(); for (Map.Entry entry : entrySet()) { String key = entry.getKey(); @@ -1077,7 +1077,7 @@ public class DavExchangeSession extends ExchangeSession { } - protected Message buildMessage(MultiStatusResponse responseEntity) throws URIException { + protected Message buildMessage(MultiStatusResponse responseEntity) throws URIException, DavMailException { Message message = new Message(); message.messageUrl = URIUtil.decode(responseEntity.getHref()); DavPropertySet properties = responseEntity.getProperties(HttpStatus.SC_OK); @@ -1089,11 +1089,11 @@ public class DavExchangeSession extends ExchangeSession { message.read = "1".equals(getPropertyIfExists(properties, "read")); message.junk = "1".equals(getPropertyIfExists(properties, "junk")); message.flagged = "2".equals(getPropertyIfExists(properties, "flagStatus")); - message.draft = "9".equals(getPropertyIfExists(properties, "messageFlags")) || "8".equals(getPropertyIfExists(properties, "messageFlags")); + message.draft = (getIntPropertyIfExists(properties, "messageFlags") & 8) != 0; String lastVerbExecuted = getPropertyIfExists(properties, "lastVerbExecuted"); message.answered = "102".equals(lastVerbExecuted) || "103".equals(lastVerbExecuted); message.forwarded = "104".equals(lastVerbExecuted); - message.date = getPropertyIfExists(properties, "date"); + message.date = convertDateFromExchange(getPropertyIfExists(properties, "date")); message.deleted = "1".equals(getPropertyIfExists(properties, "deleted")); if (LOGGER.isDebugEnabled()) { @@ -1310,7 +1310,7 @@ public class DavExchangeSession extends ExchangeSession { // retrieve Contact properties List contacts = searchContacts(itemPath.substring(0, itemPath.lastIndexOf('/')), CONTACT_ATTRIBUTES, equals("urlcompname", urlcompname)); if (contacts.isEmpty()) { - throw new DavMailException("EXCEPTION_ITEM_NOT_FOUND"); + throw new DavMailException("EXCEPTION_ITEM_NOT_FOUND"); } return contacts.get(0); } else if ("urn:content-classes:appointment".equals(contentClass) @@ -1462,9 +1462,6 @@ public class DavExchangeSession extends ExchangeSession { } } else if ("bcc".equals(entry.getKey())) { list.add(Field.createDavProperty("bcc", entry.getValue())); - } else if ("draft".equals(entry.getKey())) { - // note: draft is readonly after create - list.add(Field.createDavProperty("messageFlags", entry.getValue())); } else if ("deleted".equals(entry.getKey())) { list.add(Field.createDavProperty("writedeleted", entry.getValue())); } else if ("datereceived".equals(entry.getKey())) { @@ -1477,7 +1474,7 @@ public class DavExchangeSession extends ExchangeSession { /** * Create message in specified folder. - * Will overwrite an existing message with same subject in the same folder + * Will overwrite an existing message with same messageName in the same folder * * @param folderPath Exchange folder path * @param messageName message name @@ -1490,26 +1487,26 @@ public class DavExchangeSession extends ExchangeSession { String messageUrl = URIUtil.encodePathQuery(getFolderPath(folderPath) + '/' + messageName); PropPatchMethod patchMethod; List davProperties = buildProperties(properties); - if (properties != null) { - if (!properties.containsKey("read")) { - // force unread - davProperties.add(Field.createDavProperty("read", "0")); - } - // create the message first as draft - if (properties.containsKey("draft")) { - patchMethod = new PropPatchMethod(messageUrl, davProperties); - try { - // update message with blind carbon copy and other flags - int statusCode = httpClient.executeMethod(patchMethod); - if (statusCode != HttpStatus.SC_MULTI_STATUS) { - throw new DavMailException("EXCEPTION_UNABLE_TO_CREATE_MESSAGE", messageUrl, statusCode, ' ', patchMethod.getStatusLine()); - } - } finally { - patchMethod.releaseConnection(); + if (properties.containsKey("draft")) { + // note: draft is readonly after create, create the message first with requested messageFlags + davProperties.add(Field.createDavProperty("messageFlags", properties.get("draft"))); + } + if (!davProperties.isEmpty()) { + patchMethod = new PropPatchMethod(messageUrl, davProperties); + try { + // update message with blind carbon copy and other flags + int statusCode = httpClient.executeMethod(patchMethod); + if (statusCode != HttpStatus.SC_MULTI_STATUS) { + throw new DavMailException("EXCEPTION_UNABLE_TO_CREATE_MESSAGE", messageUrl, statusCode, ' ', patchMethod.getStatusLine()); } + + } finally { + patchMethod.releaseConnection(); } } + + // update message body PutMethod putmethod = new PutMethod(messageUrl); putmethod.setRequestHeader("Translate", "f"); try { @@ -1523,21 +1520,6 @@ public class DavExchangeSession extends ExchangeSession { } finally { putmethod.releaseConnection(); } - - // add bcc and other properties - if (!davProperties.isEmpty()) { - patchMethod = new PropPatchMethod(messageUrl, davProperties); - try { - // update message with blind carbon copy and other flags - int statusCode = httpClient.executeMethod(patchMethod); - if (statusCode != HttpStatus.SC_MULTI_STATUS) { - throw new DavMailException("EXCEPTION_UNABLE_TO_PATCH_MESSAGE", messageUrl, statusCode, ' ', patchMethod.getStatusLine()); - } - - } finally { - patchMethod.releaseConnection(); - } - } } /** @@ -1576,9 +1558,9 @@ public class DavExchangeSession extends ExchangeSession { */ @Override public void sendMessage(byte[] messageBody) throws IOException { - String messageName = UUID.randomUUID().toString()+".EML"; + String messageName = UUID.randomUUID().toString() + ".EML"; - createMessage("Drafts", messageName, null, messageBody); + createMessage(DRAFTS, messageName, null, messageBody); String tempUrl = draftsUrl + '/' + messageName + ".EML"; MoveMethod method = new MoveMethod(URIUtil.encodePath(tempUrl), URIUtil.encodePath(sendmsgUrl), true); diff --git a/src/java/davmail/exchange/dav/Field.java b/src/java/davmail/exchange/dav/Field.java index 81dfb68a..6beb1e12 100644 --- a/src/java/davmail/exchange/dav/Field.java +++ b/src/java/davmail/exchange/dav/Field.java @@ -134,8 +134,8 @@ public class Field { //createField("read", 0x0e69, PropertyType.Boolean);//PR_READ createField("deleted", DistinguishedPropertySetType.Common, 0x8570, "deleted", PropertyType.Boolean); - createField(URN_SCHEMAS_HTTPMAIL, "date");//PR_CLIENT_SUBMIT_TIME, 0x0039 - //createField("date", 0x0e06, PropertyType.SystemTime);//PR_MESSAGE_DELIVERY_TIME + //createField(URN_SCHEMAS_HTTPMAIL, "date");//PR_CLIENT_SUBMIT_TIME, 0x0039 + createField("date", 0x0e06, PropertyType.SystemTime);//PR_MESSAGE_DELIVERY_TIME createField(URN_SCHEMAS_MAILHEADER, "bcc");//PS_INTERNET_HEADERS/bcc createField(URN_SCHEMAS_HTTPMAIL, "datereceived");//PR_MESSAGE_DELIVERY_TIME, 0x0E06 diff --git a/src/java/davmail/imap/ImapConnection.java b/src/java/davmail/imap/ImapConnection.java index 02338d2e..8beb0f54 100644 --- a/src/java/davmail/imap/ImapConnection.java +++ b/src/java/davmail/imap/ImapConnection.java @@ -390,11 +390,19 @@ public class ImapConnection extends AbstractConnection { } if (flags != null) { + // parse flags, on create read and draft flags are on the + // same messageFlags property, 8 means draft and 1 means read StringTokenizer flagtokenizer = new StringTokenizer(flags); while (flagtokenizer.hasMoreTokens()) { String flag = flagtokenizer.nextToken(); if ("\\Seen".equals(flag)) { - properties.put("read", "1"); + if (properties.containsKey("draft")) { + // draft message, add read flag + properties.put("draft", "9"); + } else { + // not (yet) draft, set read flag + properties.put("draft", "1"); + } } else if ("\\Flagged".equals(flag)) { properties.put("flagged", "2"); } else if ("\\Answered".equals(flag)) { @@ -402,7 +410,13 @@ public class ImapConnection extends AbstractConnection { } else if ("$Forwarded".equals(flag)) { properties.put("forwarded", "104"); } else if ("\\Draft".equals(flag)) { - properties.put("draft", "9"); + if (properties.containsKey("draft")) { + // read message, add draft flag + properties.put("draft", "9"); + } else { + // not (yet) read, set draft flag + properties.put("draft", "8"); + } } else if ("Junk".equals(flag)) { properties.put("junk", "1"); } diff --git a/src/test/davmail/exchange/TestExchangeSessionMessageFlags.java b/src/test/davmail/exchange/TestExchangeSessionMessageFlags.java index 5989728e..6390e480 100644 --- a/src/test/davmail/exchange/TestExchangeSessionMessageFlags.java +++ b/src/test/davmail/exchange/TestExchangeSessionMessageFlags.java @@ -59,7 +59,6 @@ public class TestExchangeSessionMessageFlags extends AbstractExchangeSessionTest String messageName = UUID.randomUUID().toString(); HashMap properties = new HashMap(); properties.put("draft", "9"); - properties.put("read", "1"); session.createMessage("testfolder", messageName, properties, getMimeBody(mimeMessage)); ExchangeSession.MessageList messageList = session.searchMessages("testfolder"); assertNotNull(messageList); @@ -72,7 +71,7 @@ public class TestExchangeSessionMessageFlags extends AbstractExchangeSessionTest MimeMessage mimeMessage = createMimeMessage(); String messageName = UUID.randomUUID().toString(); HashMap properties = new HashMap(); - properties.put("read", "1"); + properties.put("draft", "1"); session.createMessage("testfolder", messageName, properties, getMimeBody(mimeMessage)); ExchangeSession.MessageList messageList = session.searchMessages("testfolder"); assertNotNull(messageList);