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