1/*
2 * Copyright (C) 2015 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 *      http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17package com.android.phone.common.mail.store;
18
19import android.content.Context;
20import android.net.Network;
21
22import com.android.phone.common.mail.MailTransport;
23import com.android.phone.common.mail.Message;
24import com.android.phone.common.mail.MessagingException;
25import com.android.phone.common.mail.internet.MimeMessage;
26import com.android.phone.vvm.omtp.imap.ImapHelper;
27
28import java.io.IOException;
29import java.io.InputStream;
30
31public class ImapStore {
32    /**
33     * A global suggestion to Store implementors on how much of the body
34     * should be returned on FetchProfile.Item.BODY_SANE requests. We'll use 125k now.
35     */
36    public static final int FETCH_BODY_SANE_SUGGESTED_SIZE = (125 * 1024);
37    private final Context mContext;
38    private final ImapHelper mHelper;
39    private final String mUsername;
40    private final String mPassword;
41    private final MailTransport mTransport;
42    private ImapConnection mConnection;
43
44    public static final int FLAG_NONE         = 0x00;    // No flags
45    public static final int FLAG_SSL          = 0x01;    // Use SSL
46    public static final int FLAG_TLS          = 0x02;    // Use TLS
47    public static final int FLAG_AUTHENTICATE = 0x04;    // Use name/password for authentication
48    public static final int FLAG_TRUST_ALL    = 0x08;    // Trust all certificates
49    public static final int FLAG_OAUTH        = 0x10;    // Use OAuth for authentication
50
51    /**
52     * Contains all the information necessary to log into an imap server
53     */
54    public ImapStore(Context context, ImapHelper helper, String username, String password, int port,
55            String serverName, int flags, Network network) {
56        mContext = context;
57        mHelper = helper;
58        mUsername = username;
59        mPassword = password;
60        mTransport = new MailTransport(context, this.getImapHelper(),
61                network, serverName, port, flags);
62    }
63
64    public Context getContext() {
65        return mContext;
66    }
67
68    public ImapHelper getImapHelper() {
69        return mHelper;
70    }
71
72    public String getUsername() {
73        return mUsername;
74    }
75
76    public String getPassword() {
77        return mPassword;
78    }
79
80    /** Returns a clone of the transport associated with this store. */
81    MailTransport cloneTransport() {
82        return mTransport.clone();
83    }
84
85    /**
86     * Returns UIDs of Messages joined with "," as the separator.
87     */
88    static String joinMessageUids(Message[] messages) {
89        StringBuilder sb = new StringBuilder();
90        boolean notFirst = false;
91        for (Message m : messages) {
92            if (notFirst) {
93                sb.append(',');
94            }
95            sb.append(m.getUid());
96            notFirst = true;
97        }
98        return sb.toString();
99    }
100
101    static class ImapMessage extends MimeMessage {
102        private ImapFolder mFolder;
103
104        ImapMessage(String uid, ImapFolder folder) {
105            mUid = uid;
106            mFolder = folder;
107        }
108
109        public void setSize(int size) {
110            mSize = size;
111        }
112
113        @Override
114        public void parse(InputStream in) throws IOException, MessagingException {
115            super.parse(in);
116        }
117
118        public void setFlagInternal(String flag, boolean set) throws MessagingException {
119            super.setFlag(flag, set);
120        }
121
122        @Override
123        public void setFlag(String flag, boolean set) throws MessagingException {
124            super.setFlag(flag, set);
125            mFolder.setFlags(new Message[] { this }, new String[] { flag }, set);
126        }
127    }
128
129    static class ImapException extends MessagingException {
130        private static final long serialVersionUID = 1L;
131
132        private final String mStatus;
133        private final String mAlertText;
134        private final String mResponseCode;
135
136        public ImapException(String message, String status, String alertText,
137                String responseCode) {
138            super(message);
139            mStatus = status;
140            mAlertText = alertText;
141            mResponseCode = responseCode;
142        }
143
144        public String getStatus() {
145            return mStatus;
146        }
147
148        public String getAlertText() {
149            return mAlertText;
150        }
151
152        public String getResponseCode() {
153            return mResponseCode;
154        }
155    }
156
157    public void closeConnection() {
158        if (mConnection != null) {
159            mConnection.close();
160            mConnection = null;
161        }
162    }
163
164    public ImapConnection getConnection() {
165        if (mConnection == null) {
166            mConnection = new ImapConnection(this);
167        }
168        return mConnection;
169    }
170}