package com.fsck.k9.mail.store.imap; import com.fsck.k9.mail.Folder; import static com.fsck.k9.mail.store.imap.ImapResponseParser.equalsIgnoreCase; class SelectOrExamineResponse { private final Boolean readWriteMode; private SelectOrExamineResponse(Boolean readWriteMode) { this.readWriteMode = readWriteMode; } public static SelectOrExamineResponse parse(ImapResponse response) { if (!response.isTagged() || !equalsIgnoreCase(response.get(0), Responses.OK)) { return null; } if (!response.isList(1)) { return noOpenModeInResponse(); } ImapList responseTextList = response.getList(1); if (!responseTextList.isString(0)) { return noOpenModeInResponse(); } String responseCode = responseTextList.getString(0); if ("READ-ONLY".equalsIgnoreCase(responseCode)) { return new SelectOrExamineResponse(false); } else if ("READ-WRITE".equalsIgnoreCase(responseCode)) { return new SelectOrExamineResponse(true); } return noOpenModeInResponse(); } private static SelectOrExamineResponse noOpenModeInResponse() { return new SelectOrExamineResponse(null); } public boolean hasOpenMode() { return readWriteMode != null; } public int getOpenMode() { if (!hasOpenMode()) { throw new IllegalStateException("Called getOpenMode() despite hasOpenMode() returning false"); } return readWriteMode ? Folder.OPEN_MODE_RW : Folder.OPEN_MODE_RO; } }