15c523858385176c33a7456bb84035de78552d22dMarc Blank/*
25c523858385176c33a7456bb84035de78552d22dMarc Blank * Copyright (C) 2010 The Android Open Source Project
35c523858385176c33a7456bb84035de78552d22dMarc Blank *
45c523858385176c33a7456bb84035de78552d22dMarc Blank * Licensed under the Apache License, Version 2.0 (the "License");
55c523858385176c33a7456bb84035de78552d22dMarc Blank * you may not use this file except in compliance with the License.
65c523858385176c33a7456bb84035de78552d22dMarc Blank * You may obtain a copy of the License at
75c523858385176c33a7456bb84035de78552d22dMarc Blank *
85c523858385176c33a7456bb84035de78552d22dMarc Blank *      http://www.apache.org/licenses/LICENSE-2.0
95c523858385176c33a7456bb84035de78552d22dMarc Blank *
105c523858385176c33a7456bb84035de78552d22dMarc Blank * Unless required by applicable law or agreed to in writing, software
115c523858385176c33a7456bb84035de78552d22dMarc Blank * distributed under the License is distributed on an "AS IS" BASIS,
125c523858385176c33a7456bb84035de78552d22dMarc Blank * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
135c523858385176c33a7456bb84035de78552d22dMarc Blank * See the License for the specific language governing permissions and
145c523858385176c33a7456bb84035de78552d22dMarc Blank * limitations under the License.
155c523858385176c33a7456bb84035de78552d22dMarc Blank */
165c523858385176c33a7456bb84035de78552d22dMarc Blank
175c523858385176c33a7456bb84035de78552d22dMarc Blankpackage com.android.email.mail.store.imap;
185c523858385176c33a7456bb84035de78552d22dMarc Blank
195c523858385176c33a7456bb84035de78552d22dMarc Blank
205c523858385176c33a7456bb84035de78552d22dMarc Blank/**
215c523858385176c33a7456bb84035de78552d22dMarc Blank * Class represents an IMAP response.
225c523858385176c33a7456bb84035de78552d22dMarc Blank */
235c523858385176c33a7456bb84035de78552d22dMarc Blankpublic class ImapResponse extends ImapList {
245c523858385176c33a7456bb84035de78552d22dMarc Blank    private final String mTag;
255c523858385176c33a7456bb84035de78552d22dMarc Blank    private final boolean mIsContinuationRequest;
265c523858385176c33a7456bb84035de78552d22dMarc Blank
275c523858385176c33a7456bb84035de78552d22dMarc Blank    /* package */ ImapResponse(String tag, boolean isContinuationRequest) {
285c523858385176c33a7456bb84035de78552d22dMarc Blank        mTag = tag;
295c523858385176c33a7456bb84035de78552d22dMarc Blank        mIsContinuationRequest = isContinuationRequest;
305c523858385176c33a7456bb84035de78552d22dMarc Blank    }
315c523858385176c33a7456bb84035de78552d22dMarc Blank
325c523858385176c33a7456bb84035de78552d22dMarc Blank    /* package */ static boolean isStatusResponse(String symbol) {
335c523858385176c33a7456bb84035de78552d22dMarc Blank        return     ImapConstants.OK.equalsIgnoreCase(symbol)
345c523858385176c33a7456bb84035de78552d22dMarc Blank                || ImapConstants.NO.equalsIgnoreCase(symbol)
355c523858385176c33a7456bb84035de78552d22dMarc Blank                || ImapConstants.BAD.equalsIgnoreCase(symbol)
365c523858385176c33a7456bb84035de78552d22dMarc Blank                || ImapConstants.PREAUTH.equalsIgnoreCase(symbol)
375c523858385176c33a7456bb84035de78552d22dMarc Blank                || ImapConstants.BYE.equalsIgnoreCase(symbol);
385c523858385176c33a7456bb84035de78552d22dMarc Blank    }
395c523858385176c33a7456bb84035de78552d22dMarc Blank
405c523858385176c33a7456bb84035de78552d22dMarc Blank    /**
415c523858385176c33a7456bb84035de78552d22dMarc Blank     * @return whether it's a tagged response.
425c523858385176c33a7456bb84035de78552d22dMarc Blank     */
435c523858385176c33a7456bb84035de78552d22dMarc Blank    public boolean isTagged() {
445c523858385176c33a7456bb84035de78552d22dMarc Blank        return mTag != null;
455c523858385176c33a7456bb84035de78552d22dMarc Blank    }
465c523858385176c33a7456bb84035de78552d22dMarc Blank
475c523858385176c33a7456bb84035de78552d22dMarc Blank    /**
485c523858385176c33a7456bb84035de78552d22dMarc Blank     * @return whether it's a continuation request.
495c523858385176c33a7456bb84035de78552d22dMarc Blank     */
505c523858385176c33a7456bb84035de78552d22dMarc Blank    public boolean isContinuationRequest() {
515c523858385176c33a7456bb84035de78552d22dMarc Blank        return mIsContinuationRequest;
525c523858385176c33a7456bb84035de78552d22dMarc Blank    }
535c523858385176c33a7456bb84035de78552d22dMarc Blank
545c523858385176c33a7456bb84035de78552d22dMarc Blank    public boolean isStatusResponse() {
555c523858385176c33a7456bb84035de78552d22dMarc Blank        return isStatusResponse(getStringOrEmpty(0).getString());
565c523858385176c33a7456bb84035de78552d22dMarc Blank    }
575c523858385176c33a7456bb84035de78552d22dMarc Blank
585c523858385176c33a7456bb84035de78552d22dMarc Blank    /**
595c523858385176c33a7456bb84035de78552d22dMarc Blank     * @return whether it's an OK response.
605c523858385176c33a7456bb84035de78552d22dMarc Blank     */
615c523858385176c33a7456bb84035de78552d22dMarc Blank    public boolean isOk() {
625c523858385176c33a7456bb84035de78552d22dMarc Blank        return is(0, ImapConstants.OK);
635c523858385176c33a7456bb84035de78552d22dMarc Blank    }
645c523858385176c33a7456bb84035de78552d22dMarc Blank
655c523858385176c33a7456bb84035de78552d22dMarc Blank    /**
665c523858385176c33a7456bb84035de78552d22dMarc Blank     * @return whether it's an BAD response.
675c523858385176c33a7456bb84035de78552d22dMarc Blank     */
685c523858385176c33a7456bb84035de78552d22dMarc Blank    public boolean isBad() {
695c523858385176c33a7456bb84035de78552d22dMarc Blank        return is(0, ImapConstants.BAD);
705c523858385176c33a7456bb84035de78552d22dMarc Blank    }
715c523858385176c33a7456bb84035de78552d22dMarc Blank
725c523858385176c33a7456bb84035de78552d22dMarc Blank    /**
735c523858385176c33a7456bb84035de78552d22dMarc Blank     * @return whether it's an NO response.
745c523858385176c33a7456bb84035de78552d22dMarc Blank     */
755c523858385176c33a7456bb84035de78552d22dMarc Blank    public boolean isNo() {
765c523858385176c33a7456bb84035de78552d22dMarc Blank        return is(0, ImapConstants.NO);
775c523858385176c33a7456bb84035de78552d22dMarc Blank    }
785c523858385176c33a7456bb84035de78552d22dMarc Blank
795c523858385176c33a7456bb84035de78552d22dMarc Blank    /**
805c523858385176c33a7456bb84035de78552d22dMarc Blank     * @return whether it's an {@code responseType} data response.  (i.e. not tagged).
815c523858385176c33a7456bb84035de78552d22dMarc Blank     * @param index where {@code responseType} should appear.  e.g. 1 for "FETCH"
825c523858385176c33a7456bb84035de78552d22dMarc Blank     * @param responseType e.g. "FETCH"
835c523858385176c33a7456bb84035de78552d22dMarc Blank     */
845c523858385176c33a7456bb84035de78552d22dMarc Blank    public final boolean isDataResponse(int index, String responseType) {
855c523858385176c33a7456bb84035de78552d22dMarc Blank        return !isTagged() && getStringOrEmpty(index).is(responseType);
865c523858385176c33a7456bb84035de78552d22dMarc Blank    }
875c523858385176c33a7456bb84035de78552d22dMarc Blank
885c523858385176c33a7456bb84035de78552d22dMarc Blank    /**
895c523858385176c33a7456bb84035de78552d22dMarc Blank     * @return Response code (RFC 3501 7.1) if it's a status response.
905c523858385176c33a7456bb84035de78552d22dMarc Blank     *
915c523858385176c33a7456bb84035de78552d22dMarc Blank     * e.g. "ALERT" for "* OK [ALERT] System shutdown in 10 minutes"
925c523858385176c33a7456bb84035de78552d22dMarc Blank     */
935c523858385176c33a7456bb84035de78552d22dMarc Blank    public ImapString getResponseCodeOrEmpty() {
945c523858385176c33a7456bb84035de78552d22dMarc Blank        if (!isStatusResponse()) {
955c523858385176c33a7456bb84035de78552d22dMarc Blank            return ImapString.EMPTY; // Not a status response.
965c523858385176c33a7456bb84035de78552d22dMarc Blank        }
975c523858385176c33a7456bb84035de78552d22dMarc Blank        return getListOrEmpty(1).getStringOrEmpty(0);
985c523858385176c33a7456bb84035de78552d22dMarc Blank    }
995c523858385176c33a7456bb84035de78552d22dMarc Blank
1005c523858385176c33a7456bb84035de78552d22dMarc Blank    /**
1015c523858385176c33a7456bb84035de78552d22dMarc Blank     * @return Alert message it it has ALERT response code.
1025c523858385176c33a7456bb84035de78552d22dMarc Blank     *
1035c523858385176c33a7456bb84035de78552d22dMarc Blank     * e.g. "System shutdown in 10 minutes" for "* OK [ALERT] System shutdown in 10 minutes"
1045c523858385176c33a7456bb84035de78552d22dMarc Blank     */
1055c523858385176c33a7456bb84035de78552d22dMarc Blank    public ImapString getAlertTextOrEmpty() {
1065c523858385176c33a7456bb84035de78552d22dMarc Blank        if (!getResponseCodeOrEmpty().is(ImapConstants.ALERT)) {
1075c523858385176c33a7456bb84035de78552d22dMarc Blank            return ImapString.EMPTY; // Not an ALERT
1085c523858385176c33a7456bb84035de78552d22dMarc Blank        }
1095c523858385176c33a7456bb84035de78552d22dMarc Blank        // The 3rd element contains all the rest of line.
1105c523858385176c33a7456bb84035de78552d22dMarc Blank        return getStringOrEmpty(2);
1115c523858385176c33a7456bb84035de78552d22dMarc Blank    }
1125c523858385176c33a7456bb84035de78552d22dMarc Blank
1135c523858385176c33a7456bb84035de78552d22dMarc Blank    /**
1145c523858385176c33a7456bb84035de78552d22dMarc Blank     * @return Response text in a status response.
1155c523858385176c33a7456bb84035de78552d22dMarc Blank     */
1165c523858385176c33a7456bb84035de78552d22dMarc Blank    public ImapString getStatusResponseTextOrEmpty() {
1175c523858385176c33a7456bb84035de78552d22dMarc Blank        if (!isStatusResponse()) {
1185c523858385176c33a7456bb84035de78552d22dMarc Blank            return ImapString.EMPTY;
1195c523858385176c33a7456bb84035de78552d22dMarc Blank        }
1205c523858385176c33a7456bb84035de78552d22dMarc Blank        return getStringOrEmpty(getElementOrNone(1).isList() ? 2 : 1);
1215c523858385176c33a7456bb84035de78552d22dMarc Blank    }
1225c523858385176c33a7456bb84035de78552d22dMarc Blank
1235c523858385176c33a7456bb84035de78552d22dMarc Blank    @Override
1245c523858385176c33a7456bb84035de78552d22dMarc Blank    public String toString() {
1255c523858385176c33a7456bb84035de78552d22dMarc Blank        String tag = mTag;
1265c523858385176c33a7456bb84035de78552d22dMarc Blank        if (isContinuationRequest()) {
1275c523858385176c33a7456bb84035de78552d22dMarc Blank            tag = "+";
1285c523858385176c33a7456bb84035de78552d22dMarc Blank        }
1295c523858385176c33a7456bb84035de78552d22dMarc Blank        return "#" + tag + "# " + super.toString();
1305c523858385176c33a7456bb84035de78552d22dMarc Blank    }
1315c523858385176c33a7456bb84035de78552d22dMarc Blank
1325c523858385176c33a7456bb84035de78552d22dMarc Blank    @Override
1335c523858385176c33a7456bb84035de78552d22dMarc Blank    public boolean equalsForTest(ImapElement that) {
1345c523858385176c33a7456bb84035de78552d22dMarc Blank        if (!super.equalsForTest(that)) {
1355c523858385176c33a7456bb84035de78552d22dMarc Blank            return false;
1365c523858385176c33a7456bb84035de78552d22dMarc Blank        }
1375c523858385176c33a7456bb84035de78552d22dMarc Blank        final ImapResponse thatResponse = (ImapResponse) that;
1385c523858385176c33a7456bb84035de78552d22dMarc Blank        if (mTag == null) {
1395c523858385176c33a7456bb84035de78552d22dMarc Blank            if (thatResponse.mTag != null) {
1405c523858385176c33a7456bb84035de78552d22dMarc Blank                return false;
1415c523858385176c33a7456bb84035de78552d22dMarc Blank            }
1425c523858385176c33a7456bb84035de78552d22dMarc Blank        } else {
1435c523858385176c33a7456bb84035de78552d22dMarc Blank            if (!mTag.equals(thatResponse.mTag)) {
1445c523858385176c33a7456bb84035de78552d22dMarc Blank                return false;
1455c523858385176c33a7456bb84035de78552d22dMarc Blank            }
1465c523858385176c33a7456bb84035de78552d22dMarc Blank        }
1475c523858385176c33a7456bb84035de78552d22dMarc Blank        if (mIsContinuationRequest != thatResponse.mIsContinuationRequest) {
1485c523858385176c33a7456bb84035de78552d22dMarc Blank            return false;
1495c523858385176c33a7456bb84035de78552d22dMarc Blank        }
1505c523858385176c33a7456bb84035de78552d22dMarc Blank        return true;
1515c523858385176c33a7456bb84035de78552d22dMarc Blank    }
1525c523858385176c33a7456bb84035de78552d22dMarc Blank}
153