package com.fsck.k9.mail.store.imap; import java.util.ArrayList; import java.util.Collections; import java.util.List; import android.support.annotation.Nullable; import static com.fsck.k9.mail.store.imap.ImapResponseParser.equalsIgnoreCase; class ListResponse { private final List<String> attributes; private final String hierarchyDelimiter; private final String name; private ListResponse(List<String> attributes, String hierarchyDelimiter, String name) { this.attributes = Collections.unmodifiableList(attributes); this.hierarchyDelimiter = hierarchyDelimiter; this.name = name; } public static List<ListResponse> parseList(List<ImapResponse> responses) { return parse(responses, Responses.LIST); } public static List<ListResponse> parseLsub(List<ImapResponse> responses) { return parse(responses, Responses.LSUB); } private static List<ListResponse> parse(List<ImapResponse> responses, String commandResponse) { List<ListResponse> listResponses = new ArrayList<>(); for (ImapResponse response : responses) { ListResponse listResponse = parseSingleLine(response, commandResponse); if (listResponse != null) { listResponses.add(listResponse); } } return Collections.unmodifiableList(listResponses); } private static ListResponse parseSingleLine(ImapResponse response, String commandResponse) { if (response.size() < 4 || !equalsIgnoreCase(response.get(0), commandResponse)) { return null; } // We have special support for LIST responses in ImapResponseParser so we can relax the length/type checks here List<String> attributes = extractAttributes(response); if (attributes == null) { return null; } String hierarchyDelimiter = response.getString(2); if (hierarchyDelimiter != null && hierarchyDelimiter.length() != 1) { return null; } String name = response.getString(3); return new ListResponse(attributes, hierarchyDelimiter, name); } private static List<String> extractAttributes(ImapResponse response) { ImapList nameAttributes = response.getList(1); List<String> attributes = new ArrayList<>(nameAttributes.size()); for (Object nameAttribute : nameAttributes) { if (!(nameAttribute instanceof String)) { return null; } String attribute = (String) nameAttribute; attributes.add(attribute); } return attributes; } public List<String> getAttributes() { return attributes; } public boolean hasAttribute(String attribute) { for (String attributeInResponse : attributes) { if (attributeInResponse.equalsIgnoreCase(attribute)) { return true; } } return false; } @Nullable public String getHierarchyDelimiter() { return hierarchyDelimiter; } public String getName() { return name; } }