예제 #1
0
파일: ImapStore.java 프로젝트: k9mail/k-9
  void autoconfigureFolders(final ImapConnection connection)
      throws IOException, MessagingException {
    if (!connection.hasCapability(Capabilities.SPECIAL_USE)) {
      if (K9MailLib.isDebug()) {
        Log.d(LOG_TAG, "No detected folder auto-configuration methods.");
      }
      return;
    }

    if (K9MailLib.isDebug()) {
      Log.d(LOG_TAG, "Folder auto-configuration: Using RFC6154/SPECIAL-USE.");
    }

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

    List<ListResponse> listResponses = ListResponse.parseList(responses);

    for (ListResponse listResponse : listResponses) {
      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);
        // We currently just skip folders with malformed names.
        continue;
      }

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

      if (listResponse.hasAttribute("\\Archive") || listResponse.hasAttribute("\\All")) {
        mStoreConfig.setArchiveFolderName(decodedFolderName);
        if (K9MailLib.isDebug()) {
          Log.d(LOG_TAG, "Folder auto-configuration detected Archive folder: " + decodedFolderName);
        }
      } else if (listResponse.hasAttribute("\\Drafts")) {
        mStoreConfig.setDraftsFolderName(decodedFolderName);
        if (K9MailLib.isDebug()) {
          Log.d(LOG_TAG, "Folder auto-configuration detected Drafts folder: " + decodedFolderName);
        }
      } else if (listResponse.hasAttribute("\\Sent")) {
        mStoreConfig.setSentFolderName(decodedFolderName);
        if (K9MailLib.isDebug()) {
          Log.d(LOG_TAG, "Folder auto-configuration detected Sent folder: " + decodedFolderName);
        }
      } else if (listResponse.hasAttribute("\\Junk")) {
        mStoreConfig.setSpamFolderName(decodedFolderName);
        if (K9MailLib.isDebug()) {
          Log.d(LOG_TAG, "Folder auto-configuration detected Spam folder: " + decodedFolderName);
        }
      } else if (listResponse.hasAttribute("\\Trash")) {
        mStoreConfig.setTrashFolderName(decodedFolderName);
        if (K9MailLib.isDebug()) {
          Log.d(LOG_TAG, "Folder auto-configuration detected Trash folder: " + decodedFolderName);
        }
      }
    }
  }
예제 #2
0
파일: ImapStore.java 프로젝트: k9mail/k-9
  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;
  }