/** * Fetches and parses the message envelopes for the supplied messages. The idea is to have this be * recursive so that we do a series of medium calls instead of one large massive call or a large * number of smaller calls. Call it a happy balance */ private void fetchEnvelope( List<WebDavMessage> startMessages, MessageRetrievalListener<WebDavMessage> listener) throws MessagingException { Map<String, String> headers = new HashMap<String, String>(); String messageBody; String[] uids; List<WebDavMessage> messages = new ArrayList<WebDavMessage>(10); if (startMessages == null || startMessages.isEmpty()) { return; } if (startMessages.size() > 10) { List<WebDavMessage> newMessages = new ArrayList<WebDavMessage>(startMessages.size() - 10); for (int i = 0, count = startMessages.size(); i < count; i++) { if (i < 10) { messages.add(i, startMessages.get(i)); } else { newMessages.add(i - 10, startMessages.get(i)); } } fetchEnvelope(newMessages, listener); } else { messages.addAll(startMessages); } uids = new String[messages.size()]; for (int i = 0, count = messages.size(); i < count; i++) { uids[i] = messages.get(i).getUid(); } messageBody = store.getMessageEnvelopeXml(uids); headers.put("Brief", "t"); DataSet dataset = store.processRequest(this.mFolderUrl, "SEARCH", messageBody, headers); Map<String, ParsedMessageEnvelope> envelopes = dataset.getMessageEnvelopes(); int count = messages.size(); for (int i = messages.size() - 1; i >= 0; i--) { WebDavMessage message = messages.get(i); if (listener != null) { listener.messageStarted(messages.get(i).getUid(), i, count); } ParsedMessageEnvelope envelope = envelopes.get(message.getUid()); if (envelope != null) { message.setNewHeaders(envelope); message.setFlagInternal(Flag.SEEN, envelope.getReadStatus()); } else { Log.e(LOG_TAG, "Asked to get metadata for a non-existent message: " + message.getUid()); } if (listener != null) { listener.messageFinished(messages.get(i), i, count); } } }