/** * 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); } } }
/** * Fetches and sets the message flags 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. */ private void fetchFlags( List<WebDavMessage> startMessages, MessageRetrievalListener<WebDavMessage> listener) throws MessagingException { HashMap<String, String> headers = new HashMap<String, String>(); String messageBody; List<Message> messages = new ArrayList<Message>(20); String[] uids; if (startMessages == null || startMessages.isEmpty()) { return; } if (startMessages.size() > 20) { List<WebDavMessage> newMessages = new ArrayList<WebDavMessage>(startMessages.size() - 20); for (int i = 0, count = startMessages.size(); i < count; i++) { if (i < 20) { messages.add(startMessages.get(i)); } else { newMessages.add(startMessages.get(i)); } } fetchFlags(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.getMessageFlagsXml(uids); headers.put("Brief", "t"); DataSet dataset = store.processRequest(this.mFolderUrl, "SEARCH", messageBody, headers); if (dataset == null) { throw new MessagingException("Data Set from request was null"); } Map<String, Boolean> uidToReadStatus = dataset.getUidToRead(); for (int i = 0, count = messages.size(); i < count; i++) { if (!(messages.get(i) instanceof WebDavMessage)) { throw new MessagingException("WebDavStore fetch called with non-WebDavMessage"); } WebDavMessage wdMessage = (WebDavMessage) messages.get(i); try { wdMessage.setFlagInternal(Flag.SEEN, uidToReadStatus.get(wdMessage.getUid())); } catch (NullPointerException e) { Log.v( LOG_TAG, "Under some weird circumstances, setting the read status when syncing from webdav threw an NPE. Skipping."); } } }