From 2abfa2ce462d7ca6ca70621c19a4b7f874fd4ef5 Mon Sep 17 00:00:00 2001 From: mguessan Date: Sun, 10 May 2009 14:52:09 +0000 Subject: [PATCH] POP: Defer message list after login phase and load only uid and size attributes git-svn-id: http://svn.code.sf.net/p/davmail/code/trunk@557 3d1905a2-6b24-0410-a738-b14d5a86fcbd --- src/java/davmail/exchange/ExchangeSession.java | 18 +++++++++++------- src/java/davmail/pop/PopConnection.java | 5 ++++- .../davmail/exchange/TestExchangeSession.java | 3 +-- 3 files changed, 16 insertions(+), 10 deletions(-) diff --git a/src/java/davmail/exchange/ExchangeSession.java b/src/java/davmail/exchange/ExchangeSession.java index 102b4d13..e866ce5f 100644 --- a/src/java/davmail/exchange/ExchangeSession.java +++ b/src/java/davmail/exchange/ExchangeSession.java @@ -634,18 +634,22 @@ public class ExchangeSession { } } - public MessageList getAllMessages(String folderName) throws IOException { - return searchMessages(folderName, ""); + public MessageList getAllMessageUidAndSize(String folderName) throws IOException { + return searchMessages(folderName, "\"DAV:uid\", \"http://schemas.microsoft.com/mapi/proptag/x0e080003\"", ""); } public MessageList searchMessages(String folderName, String conditions) throws IOException { - String folderUrl = getFolderPath(folderName); - MessageList messages = new MessageList(); - String searchRequest = "Select \"DAV:uid\", \"http://schemas.microsoft.com/mapi/proptag/x0e080003\"" + + return searchMessages(folderName, "\"DAV:uid\", \"http://schemas.microsoft.com/mapi/proptag/x0e080003\"" + " ,\"http://schemas.microsoft.com/mapi/proptag/x0e230003\"" + " ,\"http://schemas.microsoft.com/mapi/proptag/x10830003\", \"http://schemas.microsoft.com/mapi/proptag/x10900003\"" + " ,\"http://schemas.microsoft.com/mapi/proptag/x0E070003\", \"http://schemas.microsoft.com/mapi/proptag/x10810003\"" + - " ,\"urn:schemas:mailheader:message-id\", \"urn:schemas:httpmail:read\", \"DAV:isdeleted\", \"urn:schemas:mailheader:date\"" + + " ,\"urn:schemas:mailheader:message-id\", \"urn:schemas:httpmail:read\", \"DAV:isdeleted\", \"urn:schemas:mailheader:date\"", conditions); + } + + public MessageList searchMessages(String folderName, String attributes, String conditions) throws IOException { + String folderUrl = getFolderPath(folderName); + MessageList messages = new MessageList(); + String searchRequest = "Select "+ attributes + " FROM Scope('SHALLOW TRAVERSAL OF \"" + folderUrl + "\"')\n" + " WHERE \"DAV:ishidden\" = False AND \"DAV:isfolder\" = False\n"; if (conditions != null) { @@ -980,7 +984,7 @@ public class ExchangeSession { } public void loadMessages() throws IOException { - messages = getAllMessages(folderUrl); + messages = searchMessages(folderUrl, ""); } public int size() { diff --git a/src/java/davmail/pop/PopConnection.java b/src/java/davmail/pop/PopConnection.java index aa630c6b..287e56d1 100644 --- a/src/java/davmail/pop/PopConnection.java +++ b/src/java/davmail/pop/PopConnection.java @@ -108,7 +108,6 @@ public class PopConnection extends AbstractConnection { password = line.substring("PASS".length() + 1); try { session = ExchangeSessionFactory.getInstance(userName, password); - messages = session.getAllMessages("INBOX"); sendOK("PASS"); state = State.AUTHENTICATED; } catch (SocketException e) { @@ -125,6 +124,10 @@ public class PopConnection extends AbstractConnection { } else if (state != State.AUTHENTICATED) { sendERR("Invalid state not authenticated"); } else { + // load messages (once) + if (messages == null) { + messages = session.getAllMessageUidAndSize("INBOX"); + } if ("STAT".equalsIgnoreCase(command)) { sendOK(messages.size() + " " + getTotalMessagesLength()); diff --git a/src/test/davmail/exchange/TestExchangeSession.java b/src/test/davmail/exchange/TestExchangeSession.java index 3b4f0a64..4068eaca 100644 --- a/src/test/davmail/exchange/TestExchangeSession.java +++ b/src/test/davmail/exchange/TestExchangeSession.java @@ -2,7 +2,6 @@ package davmail.exchange; import davmail.Settings; import davmail.http.DavGatewaySSLProtocolSocketFactory; -import org.apache.commons.httpclient.util.URIUtil; /** * @@ -29,7 +28,7 @@ public class TestExchangeSession { ExchangeSession.Folder folder = session.getFolder(argv[currentArg++]); long startTime = System.currentTimeMillis(); - ExchangeSession.MessageList messageList = session.getAllMessages(folder.folderUrl); + ExchangeSession.MessageList messageList = session.getAllMessageUidAndSize(folder.folderUrl); System.out.println("******"); for (ExchangeSession.Message message : messageList) { message.write(System.out);