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:
parent
4789993fb9
commit
2227622a9f
@ -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;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -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);
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user