1345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein/*
2345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein * Copyright (C) 2008 The Android Open Source Project
3345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein *
4345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein * Licensed under the Apache License, Version 2.0 (the "License");
5345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein * you may not use this file except in compliance with the License.
6345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein * You may obtain a copy of the License at
7345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein *
8345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein *      http://www.apache.org/licenses/LICENSE-2.0
9345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein *
10345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein * Unless required by applicable law or agreed to in writing, software
11345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein * distributed under the License is distributed on an "AS IS" BASIS,
12345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein * See the License for the specific language governing permissions and
14345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein * limitations under the License.
15345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein */
16345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein
17345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sappersteinpackage com.android.emailcommon.mail;
18345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein
19345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sappersteinimport java.util.ArrayList;
20345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein
21345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein/**
22345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein * <pre>
23345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein * A FetchProfile is a list of items that should be downloaded in bulk for a set of messages.
24345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein * FetchProfile can contain the following objects:
25345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein *      FetchProfile.Item:      Described below.
26345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein *      Message:                Indicates that the body of the entire message should be fetched.
27345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein *                              Synonymous with FetchProfile.Item.BODY.
28345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein *      Part:                   Indicates that the given Part should be fetched. The provider
29345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein *                              is expected have previously created the given BodyPart and stored
30345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein *                              any information it needs to download the content.
31345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein * </pre>
32345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein */
33345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sappersteinpublic class FetchProfile extends ArrayList<Fetchable> {
34345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein    /**
35345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein     * Default items available for pre-fetching. It should be expected that any
36345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein     * item fetched by using these items could potentially include all of the
37345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein     * previous items.
38345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein     */
39345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein    public enum Item implements Fetchable {
40345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein        /**
41345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein         * Download the flags of the message.
42345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein         */
43345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein        FLAGS,
44345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein
45345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein        /**
46345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein         * Download the envelope of the message. This should include at minimum
47345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein         * the size and the following headers: date, subject, from, content-type, to, cc
48345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein         */
49345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein        ENVELOPE,
50345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein
51345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein        /**
52345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein         * Download the structure of the message. This maps directly to IMAP's BODYSTRUCTURE
53345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein         * and may map to other providers.
54345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein         * The provider should, if possible, fill in a properly formatted MIME structure in
55345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein         * the message without actually downloading any message data. If the provider is not
56345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein         * capable of this operation it should specifically set the body of the message to null
57345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein         * so that upper levels can detect that a full body download is needed.
58345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein         */
59345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein        STRUCTURE,
60345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein
61345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein        /**
62345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein         * A sane portion of the entire message, cut off at a provider determined limit.
63345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein         * This should generaly be around 50kB.
64345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein         */
65345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein        BODY_SANE,
66345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein
67345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein        /**
68345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein         * The entire message.
69345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein         */
70345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein        BODY,
71345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein    }
72345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein
73345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein    /**
74345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein     * @return the first {@link Part} in this collection, or null if it doesn't contain
75345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein     * {@link Part}.
76345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein     */
77345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein    public Part getFirstPart() {
78345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein        for (Fetchable o : this) {
79345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein            if (o instanceof Part) {
80345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein                return (Part) o;
81345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein            }
82345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein        }
83345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein        return null;
84345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein    }
85345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein}
86