Пример #1
0
  /**
   * 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.");
      }
    }
  }