/*
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
*
* Copyright 1997-2007 Sun Microsystems, Inc. All rights reserved.
*
* The contents of this file are subject to the terms of either the GNU
* General Public License Version 2 only ("GPL") or the Common Development
* and Distribution License("CDDL") (collectively, the "License"). You
* may not use this file except in compliance with the License. You can obtain
* a copy of the License at https://glassfish.dev.java.net/public/CDDL+GPL.html
* or glassfish/bootstrap/legal/LICENSE.txt. See the License for the specific
* language governing permissions and limitations under the License.
*
* When distributing the software, include this License Header Notice in each
* file and include the License file at glassfish/bootstrap/legal/LICENSE.txt.
* Sun designates this particular file as subject to the "Classpath" exception
* as provided by Sun in the GPL Version 2 section of the License file that
* accompanied this code. If applicable, add the following below the License
* Header, with the fields enclosed by brackets [] replaced by your own
* identifying information: "Portions Copyrighted [year]
* [name of copyright owner]"
*
* Contributor(s):
*
* If you wish your version of this file to be governed by only the CDDL or
* only the GPL Version 2, indicate your decision by adding "[Contributor]
* elects to include this software in this distribution under the [CDDL or GPL
* Version 2] license." If you don't indicate a single choice of license, a
* recipient has the option to distribute your version of this file under
* either the CDDL, the GPL Version 2 or to extend the choice of license to
* its licensees as provided above. However, if you add GPL Version 2 code
* and therefore, elected the GPL Version 2 license, then the option applies
* only if the new code is made subject to such option by the copyright
* holder.
*/
/*
* @(#)FetchResponse.java 1.11 07/05/04
*/
package com.sun.mail.imap.protocol;
import java.io.*;
import java.util.*;
import com.sun.mail.util.*;
import com.sun.mail.iap.*;
/**
* This class represents a response obtained from the input stream
* of an IMAP server.
*
* @version 1.11, 07/05/04
* @author John Mani
*/
public class FetchResponse extends IMAPResponse {
private Item[] items;
public FetchResponse(Protocol p)
throws IOException, ProtocolException {
super(p);
parse();
}
public FetchResponse(IMAPResponse r)
throws IOException, ProtocolException {
super(r);
parse();
}
public int getItemCount() {
return items.length;
}
public Item getItem(int index) {
return items[index];
}
public Item getItem(Class c) {
for (int i = 0; i < items.length; i++) {
if (c.isInstance(items[i]))
return items[i];
}
return null;
}
public static Item getItem(Response[] r, int msgno, Class c) {
if (r == null)
return null;
for (int i = 0; i < r.length; i++) {
if (r[i] == null ||
!(r[i] instanceof FetchResponse) ||
((FetchResponse)r[i]).getNumber() != msgno)
continue;
FetchResponse f = (FetchResponse)r[i];
for (int j = 0; j < f.items.length; j++) {
if (c.isInstance(f.items[j]))
return f.items[j];
}
}
return null;
}
private final static char[] HEADER = {'.','H','E','A','D','E','R'};
private final static char[] TEXT = {'.','T','E','X','T'};
private void parse() throws ParsingException {
skipSpaces();
if (buffer[index] != '(')
throw new ParsingException(
"error in FETCH parsing, missing '(' at index " + index);
Vector v = new Vector();
Item i = null;
do {
index++; // skip '(', or SPACE
if (index >= size)
throw new ParsingException(
"error in FETCH parsing, ran off end of buffer, size " + size);
switch(buffer[index]) {
case 'E':
if (match(ENVELOPE.name)) {
index += ENVELOPE.name.length; // skip "ENVELOPE"
i = new ENVELOPE(this);
}
break;
case 'F':
if (match(FLAGS.name)) {
index += FLAGS.name.length; // skip "FLAGS"
i = new FLAGS((IMAPResponse)this);
}
break;
case 'I':
if (match(INTERNALDATE.name)) {
index += INTERNALDATE.name.length; // skip "INTERNALDATE"
i = new INTERNALDATE(this);
}
break;
case 'B':
if (match(BODY.name)) {
if (buffer[index+4] == '[') {
index += BODY.name.length; // skip "BODY"
i = new BODY(this);
}
else {
if (match(BODYSTRUCTURE.name))
index += BODYSTRUCTURE.name.length;
// skip "BODYSTRUCTURE"
else
index += BODY.name.length; // skip "BODY"
i = new BODYSTRUCTURE(this);
}
}
break;
case 'R':
if (match(RFC822SIZE.name)) {
index += RFC822SIZE.name.length; // skip "RFC822.SIZE"
i = new RFC822SIZE(this);
}
else {
if (match(RFC822DATA.name)) {
index += RFC822DATA.name.length;
if (match(HEADER))
index += HEADER.length; // skip ".HEADER"
else if (match(TEXT))
index += TEXT.length; // skip ".TEXT"
i = new RFC822DATA(this);
}
}
break;
case 'U':
if (match(UID.name)) {
index += UID.name.length;
i = new UID(this);
}
break;
default:
}
if (i != null)
v.addElement(i);
} while (buffer[index] != ')');
index++; // skip ')'
items = new Item[v.size()];
v.copyInto(items);
}
/*
* itemName is the name of the IMAP item to compare against.
* NOTE that itemName *must* be all uppercase.
*/
private boolean match(char[] itemName) {
int len = itemName.length;
for (int i = 0, j = index; i < len;)
// IMAP tokens are case-insensitive. We store itemNames in
// uppercase, so convert operand to uppercase before comparing.
if (Character.toUpperCase((char)buffer[j++]) != itemName[i++])
return false;
return true;
}
}