Example #1
0
  private Set<String> listFolders(ImapConnection connection, boolean subscribedOnly)
      throws IOException, MessagingException {
    String commandResponse = subscribedOnly ? "LSUB" : "LIST";

    List<ImapResponse> responses =
        connection.executeSimpleCommand(
            String.format(
                "%s \"\" %s",
                commandResponse, ImapUtility.encodeString(getCombinedPrefix() + "*")));

    List<ListResponse> listResponses =
        (subscribedOnly) ? ListResponse.parseLsub(responses) : ListResponse.parseList(responses);

    Set<String> folderNames = new HashSet<>(listResponses.size());

    for (ListResponse listResponse : listResponses) {
      boolean includeFolder = true;

      String decodedFolderName;
      try {
        decodedFolderName = folderNameCodec.decode(listResponse.getName());
      } catch (CharacterCodingException e) {
        Log.w(
            LOG_TAG,
            "Folder name not correctly encoded with the UTF-7 variant "
                + "as defined by RFC 3501: "
                + listResponse.getName(),
            e);

        // TODO: Use the raw name returned by the server for all commands that require
        //      a folder name. Use the decoded name only for showing it to the user.

        // We currently just skip folders with malformed names.
        continue;
      }

      String folder = decodedFolderName;

      if (pathDelimiter == null) {
        pathDelimiter = listResponse.getHierarchyDelimiter();
        combinedPrefix = null;
      }

      if (folder.equalsIgnoreCase(mStoreConfig.getInboxFolderName())) {
        continue;
      } else if (folder.equals(mStoreConfig.getOutboxFolderName())) {
        /*
         * There is a folder on the server with the same name as our local
         * outbox. Until we have a good plan to deal with this situation
         * we simply ignore the folder on the server.
         */
        continue;
      } else {
        int prefixLength = getCombinedPrefix().length();
        if (prefixLength > 0) {
          // Strip prefix from the folder name
          if (folder.length() >= prefixLength) {
            folder = folder.substring(prefixLength);
          }
          if (!decodedFolderName.equalsIgnoreCase(getCombinedPrefix() + folder)) {
            includeFolder = false;
          }
        }
      }

      if (listResponse.hasAttribute("\\NoSelect")) {
        includeFolder = false;
      }

      if (includeFolder) {
        folderNames.add(folder);
      }
    }

    folderNames.add(mStoreConfig.getInboxFolderName());

    return folderNames;
  }