package com.fsck.k9.mail.store.imap;
import java.util.Collections;
import java.util.HashSet;
import java.util.Locale;
import java.util.Set;
import com.fsck.k9.mail.Flag;
import static com.fsck.k9.mail.store.imap.ImapResponseParser.equalsIgnoreCase;
class PermanentFlagsResponse {
private final Set<Flag> flags;
private final boolean canCreateKeywords;
private PermanentFlagsResponse(Set<Flag> flags, boolean canCreateKeywords) {
this.flags = Collections.unmodifiableSet(flags);
this.canCreateKeywords = canCreateKeywords;
}
public static PermanentFlagsResponse parse(ImapResponse response) {
if (response.isTagged() || !equalsIgnoreCase(response.get(0), Responses.OK) || !response.isList(1)) {
return null;
}
ImapList responseTextList = response.getList(1);
if (responseTextList.size() < 2 || !equalsIgnoreCase(responseTextList.get(0), Responses.PERMANENTFLAGS) ||
!responseTextList.isList(1)) {
return null;
}
ImapList permanentFlagsList = responseTextList.getList(1);
int size = permanentFlagsList.size();
Set<Flag> flags = new HashSet<>(size);
boolean canCreateKeywords = false;
for (int i = 0; i < size; i++) {
if (!permanentFlagsList.isString(i)) {
return null;
}
String flag = permanentFlagsList.getString(i);
String compareFlag = flag.toLowerCase(Locale.US);
switch (compareFlag) {
case "\\deleted": {
flags.add(Flag.DELETED);
break;
}
case "\\answered": {
flags.add(Flag.ANSWERED);
break;
}
case "\\seen": {
flags.add(Flag.SEEN);
break;
}
case "\\flagged": {
flags.add(Flag.FLAGGED);
break;
}
case "$forwarded": {
flags.add(Flag.FORWARDED);
break;
}
case "\\*": {
canCreateKeywords = true;
break;
}
}
}
return new PermanentFlagsResponse(flags, canCreateKeywords);
}
public Set<Flag> getFlags() {
return flags;
}
public boolean canCreateKeywords() {
return canCreateKeywords;
}
}