IMAP: fix regression on imap uid restore

git-svn-id: http://svn.code.sf.net/p/davmail/code/trunk@1131 3d1905a2-6b24-0410-a738-b14d5a86fcbd
This commit is contained in:
mguessan 2010-07-05 16:28:10 +00:00
parent 6ed9845497
commit e1b12c63ef
4 changed files with 24 additions and 6 deletions

View File

@ -541,6 +541,7 @@ public abstract class ExchangeSession {
protected static final Set<String> IMAP_MESSAGE_ATTRIBUTES = new HashSet<String>();
static {
IMAP_MESSAGE_ATTRIBUTES.add("permanenturl");
IMAP_MESSAGE_ATTRIBUTES.add("uid");
IMAP_MESSAGE_ATTRIBUTES.add("messageSize");
IMAP_MESSAGE_ATTRIBUTES.add("imapUid");
@ -1108,7 +1109,7 @@ public abstract class ExchangeSession {
/**
* Permanent uid (PR_SEARCH_KEY) to IMAP UID map.
*/
private final HashMap<String, Long> uidToImapUidMap = new HashMap<String, Long>();
private final HashMap<String, Long> permanentUrlToImapUidMap = new HashMap<String, Long>();
/**
* Get IMAP folder flags.
@ -1156,16 +1157,16 @@ public abstract class ExchangeSession {
protected void fixUids(MessageList messages) {
boolean sortNeeded = false;
for (Message message : messages) {
if (uidToImapUidMap.containsKey(message.getUid())) {
long previousUid = uidToImapUidMap.get(message.getUid());
if (permanentUrlToImapUidMap.containsKey(message.permanentUrl)) {
long previousUid = permanentUrlToImapUidMap.get(message.permanentUrl);
if (message.getImapUid() != previousUid) {
LOGGER.debug("Restoring IMAP uid " + message.getImapUid() + " -> " + previousUid + " for message uid " + message.getUid());
LOGGER.debug("Restoring IMAP uid " + message.getImapUid() + " -> " + previousUid + " for message " + message.permanentUrl);
message.setImapUid(previousUid);
sortNeeded = true;
}
} else {
// add message to uid map
uidToImapUidMap.put(message.getUid(), message.getImapUid());
permanentUrlToImapUidMap.put(message.permanentUrl, message.getImapUid());
}
}
if (sortNeeded) {

View File

@ -238,6 +238,8 @@ public class EwsExchangeSession extends ExchangeSession {
// get item id
message.itemId = new ItemId(response.get("ItemId"), response.get("ChangeKey"));
message.permanentUrl = response.get(Field.get("permanenturl").getResponseName());
message.size = response.getInt(Field.get("messageSize").getResponseName());
message.uid = response.get(Field.get("uid").getResponseName());
message.imapUid = response.getLong(Field.get("imapUid").getResponseName());

View File

@ -28,6 +28,8 @@ public class Field {
protected static final Map<String, FieldURI> FIELD_MAP = new HashMap<String, FieldURI>();
static {
FIELD_MAP.put("permanenturl", new ExtendedFieldURI(0x670E, ExtendedFieldURI.PropertyType.String)); //PR_FLAT_URL_NAME
FIELD_MAP.put("uid", new ExtendedFieldURI(0x300b, ExtendedFieldURI.PropertyType.Binary));
FIELD_MAP.put("messageFlags", new ExtendedFieldURI(0x0e07, ExtendedFieldURI.PropertyType.Integer));//PR_MESSAGE_FLAGS
FIELD_MAP.put("imapUid", new ExtendedFieldURI(0x0e23, ExtendedFieldURI.PropertyType.Integer));

View File

@ -51,11 +51,24 @@ public class TestExchangeSessionMessage extends AbstractExchangeSessionTestCase
assertFalse(message.draft);
assertTrue(message.size > 0);
assertFalse(message.deleted);
// TODO
assertFalse(message.read);
assertNotNull(message.date);
}
public void testFlagMessage() throws IOException, MessagingException {
ExchangeSession.Folder testFolder = session.getFolder("testfolder");
testFolder.loadMessages();
HashMap<String,String> properties = new HashMap<String,String>();
properties.put("flagged", "2");
session.updateMessage(message, properties);
// refresh folder
testFolder.loadMessages();
assertNotNull(testFolder.get(0));
assertTrue(testFolder.get(0).flagged);
assertEquals(message.getImapUid(), testFolder.get(0).getImapUid());
}
public void testGetContent() throws IOException, MessagingException {
byte[] content = session.getContent(message);
assertNotNull(content);