001    /**
002     * Licensed to the Apache Software Foundation (ASF) under one or more
003     * contributor license agreements.  See the NOTICE file distributed with
004     * this work for additional information regarding copyright ownership.
005     * The ASF licenses this file to You under the Apache License, Version 2.0
006     * (the "License"); you may not use this file except in compliance with
007     * the License.  You may obtain a copy of the License at
008     *
009     *     http://www.apache.org/licenses/LICENSE-2.0
010     *
011     * Unless required by applicable law or agreed to in writing, software
012     * distributed under the License is distributed on an "AS IS" BASIS,
013     * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
014     * See the License for the specific language governing permissions and
015     * limitations under the License.
016     */
017    
018    package org.apache.geronimo.javamail.store.imap.connection;
019    import java.util.ArrayList;
020    import java.util.List;
021    
022    import javax.mail.MessagingException;
023    
024    import org.apache.geronimo.mail.util.Base64;
025    
026    /**
027     * Util class to represent a response from a IMAP server
028     *
029     * @version $Rev: 594520 $ $Date: 2007-11-13 07:57:39 -0500 (Tue, 13 Nov 2007) $
030     */
031    public class IMAPTaggedResponse extends IMAPResponse {
032    
033        // the reply state
034        protected String status;
035        // the tag associated with a reply.
036        protected String tag;
037        // the message associated with the completion response 
038        protected String message;
039    
040        /**
041         * Create a command completion response for a 
042         * submitted command.  The tag prefix identifies 
043         * the command this response is for. 
044         * 
045         * @param tag      The command tag value.
046         * @param status   The Status response (OK, BAD, or NO).
047         * @param message  The remainder of the response, as a string.
048         * @param response The response data used to create the reply object.
049         */
050        public IMAPTaggedResponse(String tag, String status, String message, byte [] response) {
051            super(response); 
052            this.tag = tag; 
053            this.status = status;
054            this.message = message; 
055        }
056    
057    
058        /**
059         * Create a continuation response for a 
060         * submitted command.  
061         * 
062         * @param response The response data used to create the reply object.
063         */
064        public IMAPTaggedResponse(byte [] response) {
065            super(response); 
066            this.tag = "";  
067            this.status = "CONTINUATION";
068            this.message = message; 
069        }
070    
071        /**
072         * Test if the response code was "OK".
073         *
074         * @return True if the response status was OK, false for any other status.
075         */
076        public boolean isOK() {
077            return status.equals("OK");
078        }
079    
080        /**
081         * Test for an error return from a command.
082         *
083         * @return True if the response status was BAD.
084         */
085        public boolean isBAD() {
086            return status.equals("BAD"); 
087        }
088    
089        /**
090         * Test for an error return from a command.
091         *
092         * @return True if the response status was NO.
093         */
094        public boolean isNO() {
095            return status.equals("NO"); 
096        }
097        
098        /**
099         * Get the message included on the tagged response. 
100         * 
101         * @return The String message data. 
102         */
103        public String getMessage() {
104            return message; 
105        }
106        
107        /**
108         * Decode the message portion of a continuation challenge response.
109         * 
110         * @return The byte array containing the decoded data. 
111         */
112        public byte[] decodeChallengeResponse() 
113        {
114            // we're passed back a challenge value, Base64 encoded.  Decode that portion of the 
115            // response data. 
116            return Base64.decode(response, 2, response.length - 2);
117        }
118        
119        
120        /**
121         * Test if this is a continuation response. 
122         * 
123         * @return True if this a continuation.  false for a normal tagged response. 
124         */
125        public boolean isContinuation() {
126            return status.equals("CONTINUATION"); 
127        }
128        
129        
130        /**
131         * Test if the untagged response includes a given 
132         * status indicator.  Mostly used for checking 
133         * READ-ONLY or READ-WRITE status after selecting a 
134         * mail box.
135         * 
136         * @param name   The status name to check.
137         * 
138         * @return true if this is found in the "[" "]" delimited
139         *         section of the response message.
140         */
141        public boolean hasStatus(String name) {
142            // see if we have the status bits at all 
143            int statusStart = message.indexOf('['); 
144            if (statusStart == -1) {
145                return false; 
146            }
147            
148            int statusEnd = message.indexOf(']'); 
149            String statusString = message.substring(statusStart, statusEnd).toUpperCase(); 
150            // just search for the status token. 
151            return statusString.indexOf(name) != -1; 
152        }
153    }
154    
155