From 9475873dd9c6cac351a8e6abe96f36027eddd8d3 Mon Sep 17 00:00:00 2001 From: mguessan Date: Mon, 17 Sep 2012 08:03:56 +0000 Subject: [PATCH] IMAP: implement generic FLAGS mapping to Outlook categories git-svn-id: http://svn.code.sf.net/p/davmail/code/trunk@2023 3d1905a2-6b24-0410-a738-b14d5a86fcbd --- .../exchange/dav/DavExchangeSession.java | 10 +++++- .../exchange/ews/EwsExchangeSession.java | 2 ++ .../exchange/ews/ExtendedFieldURI.java | 2 +- src/java/davmail/imap/ImapConnection.java | 33 ++++++++++++++++++- 4 files changed, 44 insertions(+), 3 deletions(-) diff --git a/src/java/davmail/exchange/dav/DavExchangeSession.java b/src/java/davmail/exchange/dav/DavExchangeSession.java index a2bda7ad..44a3a2a8 100644 --- a/src/java/davmail/exchange/dav/DavExchangeSession.java +++ b/src/java/davmail/exchange/dav/DavExchangeSession.java @@ -1929,7 +1929,13 @@ public class DavExchangeSession extends ExchangeSession { if (buffer.length() > 0) { buffer.append(','); } - buffer.append(((Node) node).getTextContent()); + if (node instanceof Node) { + // jackrabbit + buffer.append(((Node) node).getTextContent()); + } else { + // ExchangeDavMethod + buffer.append(node); + } } return buffer.toString(); } else { @@ -2488,6 +2494,8 @@ public class DavExchangeSession extends ExchangeSession { list.add(Field.createDavProperty("deleted", entry.getValue())); } else if ("datereceived".equals(entry.getKey())) { list.add(Field.createDavProperty("datereceived", entry.getValue())); + } else if ("keywords".equals(entry.getKey())) { + list.add(Field.createDavProperty("keywords", entry.getValue())); } } } diff --git a/src/java/davmail/exchange/ews/EwsExchangeSession.java b/src/java/davmail/exchange/ews/EwsExchangeSession.java index 396c9f03..16dbad5d 100644 --- a/src/java/davmail/exchange/ews/EwsExchangeSession.java +++ b/src/java/davmail/exchange/ews/EwsExchangeSession.java @@ -428,6 +428,8 @@ public class EwsExchangeSession extends ExchangeSession { list.add(Field.createFieldUpdate("deleted", entry.getValue())); } else if ("datereceived".equals(entry.getKey())) { list.add(Field.createFieldUpdate("datereceived", entry.getValue())); + } else if ("keywords".equals(entry.getKey())) { + list.add(Field.createFieldUpdate("keywords", entry.getValue())); } } return list; diff --git a/src/java/davmail/exchange/ews/ExtendedFieldURI.java b/src/java/davmail/exchange/ews/ExtendedFieldURI.java index 9571801d..702ba012 100644 --- a/src/java/davmail/exchange/ews/ExtendedFieldURI.java +++ b/src/java/davmail/exchange/ews/ExtendedFieldURI.java @@ -128,7 +128,7 @@ public class ExtendedFieldURI implements FieldURI { appendTo(buffer); if (propertyType == PropertyType.StringArray) { buffer.append(""); - String[] values = value.split("\n"); + String[] values = value.split(","); for (final String singleValue : values) { buffer.append(""); buffer.append(StringUtil.xmlEncode(singleValue)); diff --git a/src/java/davmail/imap/ImapConnection.java b/src/java/davmail/imap/ImapConnection.java index c88be68c..049d18cd 100644 --- a/src/java/davmail/imap/ImapConnection.java +++ b/src/java/davmail/imap/ImapConnection.java @@ -228,7 +228,7 @@ public class ImapConnection extends AbstractConnection { sendClient("* OK [UIDNEXT " + currentFolder.getUidNext() + ']'); } sendClient("* FLAGS (\\Answered \\Deleted \\Draft \\Flagged \\Seen $Forwarded Junk)"); - sendClient("* OK [PERMANENTFLAGS (\\Answered \\Deleted \\Draft \\Flagged \\Seen $Forwarded Junk)]"); + sendClient("* OK [PERMANENTFLAGS (\\Answered \\Deleted \\Draft \\Flagged \\Seen $Forwarded Junk \\*)]"); if ("select".equalsIgnoreCase(command)) { sendClient(commandId + " OK [READ-WRITE] " + command + " completed"); } else { @@ -1408,6 +1408,16 @@ public class ImapConnection extends AbstractConnection { } else if ("\\Answered".equalsIgnoreCase(flag) && message.answered) { properties.put("answered", null); message.answered = false; + } else if (message.keywords != null) { + String[] keywords = message.keywords.split(","); + HashSet keywordSet = new HashSet(); + for (String value : keywords) { + if (!value.equals(flag)) { + keywordSet.add(value); + } + } + message.keywords = StringUtil.join(keywordSet, ","); + properties.put("keywords", message.keywords); } } } else if ("+Flags".equalsIgnoreCase(action) || "+FLAGS.SILENT".equalsIgnoreCase(action)) { @@ -1432,6 +1442,17 @@ public class ImapConnection extends AbstractConnection { } else if ("Junk".equalsIgnoreCase(flag) && !message.junk) { properties.put("junk", "1"); message.junk = true; + } else { + HashSet keywordSet = new HashSet(); + if (message.keywords != null) { + String[] keywords = message.keywords.split(","); + for (String value : keywords) { + keywordSet.add(value); + } + } + keywordSet.add(flag); + message.keywords = StringUtil.join(keywordSet, ","); + properties.put("keywords", message.keywords); } } } else if ("FLAGS".equalsIgnoreCase(action) || "FLAGS.SILENT".equalsIgnoreCase(action)) { @@ -1442,6 +1463,7 @@ public class ImapConnection extends AbstractConnection { boolean flagged = false; boolean answered = false; boolean forwarded = false; + HashSet keywords = null; // set flags from new flag list StringTokenizer flagtokenizer = new StringTokenizer(flags); while (flagtokenizer.hasMoreTokens()) { @@ -1458,8 +1480,17 @@ public class ImapConnection extends AbstractConnection { forwarded = true; } else if ("Junk".equalsIgnoreCase(flag)) { junk = true; + } else { + if (keywords == null) { + keywords = new HashSet(); + } + keywords.add(flag); } } + if (keywords != null) { + message.keywords = StringUtil.join(keywords, ","); + properties.put("keywords", message.keywords); + } if (read != message.read) { message.read = read; if (message.read) {