1
0
mirror of https://github.com/moparisthebest/davmail synced 2025-02-28 09:21:49 -05:00

IMAP: Keep a single message in MessageList cache to handle chunked fetch, reenable maxSize in ImapConnection.

git-svn-id: http://svn.code.sf.net/p/davmail/code/trunk@990 3d1905a2-6b24-0410-a738-b14d5a86fcbd
This commit is contained in:
mguessan 2010-04-06 09:20:09 +00:00
parent 4789993fb9
commit 2227622a9f
2 changed files with 50 additions and 12 deletions

View File

@ -909,6 +909,7 @@ public class ExchangeSession {
for (MultiStatusResponse response : responses) { for (MultiStatusResponse response : responses) {
Message message = buildMessage(response); Message message = buildMessage(response);
message.messageList = messages;
messages.add(message); messages.add(message);
} }
Collections.sort(messages); Collections.sort(messages);
@ -1457,18 +1458,20 @@ public class ExchangeSession {
/** /**
* Calendar folder flag. * Calendar folder flag.
*
* @return true if this is a calendar folder * @return true if this is a calendar folder
*/ */
public boolean isCalendar() { public boolean isCalendar() {
return "urn:content-classes:calendarfolder".equals(contentClass); return "urn:content-classes:calendarfolder".equals(contentClass);
} }
/** /**
* Contact folder flag. * Contact folder flag.
*
* @return true if this is a calendar folder * @return true if this is a calendar folder
*/ */
public boolean isContact() { public boolean isContact() {
return "urn:content-classes:contactfolder".equals(contentClass); return "urn:content-classes:contactfolder".equals(contentClass);
} }
} }
@ -1476,8 +1479,17 @@ public class ExchangeSession {
* Exchange message. * Exchange message.
*/ */
public class Message implements Comparable<Message> { public class Message implements Comparable<Message> {
/**
* enclosing message list
*/
protected MessageList messageList;
/**
* Message url.
*/
protected String messageUrl; protected String messageUrl;
/**
* Message permanent url (does not change on message move).
*/
protected String permanentUrl; protected String permanentUrl;
/** /**
* Message uid. * Message uid.
@ -1604,7 +1616,7 @@ public class ExchangeSession {
/** /**
* Write MIME message to os * Write MIME message to os
* *
* @param os output stream * @param os output stream
* @param doubleDot replace '.' lines with '..' (POP protocol) * @param doubleDot replace '.' lines with '..' (POP protocol)
* @throws IOException on error * @throws IOException on error
*/ */
@ -1677,17 +1689,31 @@ public class ExchangeSession {
*/ */
public MimeMessage getMimeMessage() throws IOException, MessagingException { public MimeMessage getMimeMessage() throws IOException, MessagingException {
if (mimeMessage == null) { if (mimeMessage == null) {
ByteArrayOutputStream baos = new ByteArrayOutputStream(); // try to get message content from cache
write(baos, false); if (this.imapUid == messageList.cachedMessageImapUid) {
mimeMessage = new MimeMessage(null, new ByteArrayInputStream(baos.toByteArray())); mimeMessage = messageList.cachedMimeMessage;
LOGGER.debug("Got message content for "+imapUid+" from cache");
} else {
// load message
ByteArrayOutputStream baos = new ByteArrayOutputStream();
write(baos, false);
mimeMessage = new MimeMessage(null, new ByteArrayInputStream(baos.toByteArray()));
LOGGER.debug("Dowloaded message content for "+imapUid+" ("+baos.size()+")");
}
} }
return mimeMessage; return mimeMessage;
} }
/** /**
* Drop mime message to avoid keeping message content in memory. * Drop mime message to avoid keeping message content in memory,
* keep a single message in MessageList cache to handle chunked fetch.
*/ */
public void dropMimeMessage() { public void dropMimeMessage() {
// update single message cache
if (mimeMessage != null) {
messageList.cachedMessageImapUid = imapUid;
messageList.cachedMimeMessage = mimeMessage;
}
mimeMessage = null; mimeMessage = null;
} }
@ -1754,9 +1780,18 @@ public class ExchangeSession {
} }
/** /**
* Message list * Message list, includes a single messsage cache
*/ */
public static class MessageList extends ArrayList<Message> { public static class MessageList extends ArrayList<Message> {
/**
* Cached message content parsed in a MIME message.
*/
protected MimeMessage cachedMimeMessage;
/**
* Cached message uid.
*/
protected long cachedMessageImapUid;
} }
/** /**

View File

@ -575,8 +575,7 @@ public class ImapConnection extends AbstractConnection {
int dotIndex = param.indexOf('.', ltIndex); int dotIndex = param.indexOf('.', ltIndex);
if (dotIndex >= 0) { if (dotIndex >= 0) {
startIndex = Integer.parseInt(param.substring(ltIndex + 1, dotIndex)); startIndex = Integer.parseInt(param.substring(ltIndex + 1, dotIndex));
// do not implement maxSize to avoid downloading message multiple times maxSize = Integer.parseInt(param.substring(dotIndex + 1, param.indexOf('>')));
//maxSize = Integer.parseInt(param.substring(dotIndex + 1, param.indexOf('>')));
} }
} }
@ -610,7 +609,11 @@ public class ImapConnection extends AbstractConnection {
Object mimeBody = bodyPart.getContent(); Object mimeBody = bodyPart.getContent();
if (mimeBody instanceof MimeMultipart) { if (mimeBody instanceof MimeMultipart) {
MimeMultipart multiPart = (MimeMultipart) mimeBody; MimeMultipart multiPart = (MimeMultipart) mimeBody;
bodyPart = (MimePart) multiPart.getBodyPart(subPartIndex - 1); if (subPartIndex - 1 < multiPart.getCount()) {
bodyPart = (MimePart) multiPart.getBodyPart(subPartIndex - 1);
} else {
throw new DavMailException("EXCEPTION_INVALID_PARAMETER", param);
}
} else if (subPartIndex != 1) { } else if (subPartIndex != 1) {
throw new DavMailException("EXCEPTION_INVALID_PARAMETER", param); throw new DavMailException("EXCEPTION_INVALID_PARAMETER", param);
} }