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.voicemail.impl.mail.store;
18
19import android.content.Context;
20import android.net.Network;
21import com.android.voicemail.impl.imap.ImapHelper;
22import com.android.voicemail.impl.mail.MailTransport;
23import com.android.voicemail.impl.mail.Message;
24import com.android.voicemail.impl.mail.MessagingException;
25import com.android.voicemail.impl.mail.internet.MimeMessage;
26import java.io.IOException;
27import java.io.InputStream;
28import org.apache.james.mime4j.MimeException;
29
30public class ImapStore {
31  /**
32   * A global suggestion to Store implementors on how much of the body should be returned on
33   * FetchProfile.Item.BODY_SANE requests. We'll use 125k now.
34   */
35  public static final int FETCH_BODY_SANE_SUGGESTED_SIZE = (125 * 1024);
36
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  /** Contains all the information necessary to log into an imap server */
52  public ImapStore(
53      Context context,
54      ImapHelper helper,
55      String username,
56      String password,
57      int port,
58      String serverName,
59      int flags,
60      Network network) {
61    mContext = context;
62    mHelper = helper;
63    mUsername = username;
64    mPassword = password;
65    mTransport = new MailTransport(context, this.getImapHelper(), network, serverName, port, flags);
66  }
67
68  public Context getContext() {
69    return mContext;
70  }
71
72  public ImapHelper getImapHelper() {
73    return mHelper;
74  }
75
76  public String getUsername() {
77    return mUsername;
78  }
79
80  public String getPassword() {
81    return mPassword;
82  }
83
84  /** Returns a clone of the transport associated with this store. */
85  MailTransport cloneTransport() {
86    return mTransport.clone();
87  }
88
89  /** Returns UIDs of Messages joined with "," as the separator. */
90  static String joinMessageUids(Message[] messages) {
91    StringBuilder sb = new StringBuilder();
92    boolean notFirst = false;
93    for (Message m : messages) {
94      if (notFirst) {
95        sb.append(',');
96      }
97      sb.append(m.getUid());
98      notFirst = true;
99    }
100    return sb.toString();
101  }
102
103  static class ImapMessage extends MimeMessage {
104    private ImapFolder mFolder;
105
106    ImapMessage(String uid, ImapFolder folder) {
107      mUid = uid;
108      mFolder = folder;
109    }
110
111    public void setSize(int size) {
112      mSize = size;
113    }
114
115    @Override
116    public void parse(InputStream in) throws IOException, MessagingException, MimeException {
117      super.parse(in);
118    }
119
120    public void setFlagInternal(String flag, boolean set) throws MessagingException {
121      super.setFlag(flag, set);
122    }
123
124    @Override
125    public void setFlag(String flag, boolean set) throws MessagingException {
126      super.setFlag(flag, set);
127      mFolder.setFlags(new Message[] {this}, new String[] {flag}, set);
128    }
129  }
130
131  static class ImapException extends MessagingException {
132    private static final long serialVersionUID = 1L;
133
134    private final String mStatus;
135    private final String mStatusMessage;
136    private final String mAlertText;
137    private final String mResponseCode;
138
139    public ImapException(
140        String message,
141        String status,
142        String statusMessage,
143        String alertText,
144        String responseCode) {
145      super(message);
146      mStatus = status;
147      mStatusMessage = statusMessage;
148      mAlertText = alertText;
149      mResponseCode = responseCode;
150    }
151
152    public String getStatus() {
153      return mStatus;
154    }
155
156    public String getStatusMessage() {
157      return mStatusMessage;
158    }
159
160    public String getAlertText() {
161      return mAlertText;
162    }
163
164    public String getResponseCode() {
165      return mResponseCode;
166    }
167  }
168
169  public void closeConnection() {
170    if (mConnection != null) {
171      mConnection.close();
172      mConnection = null;
173    }
174  }
175
176  public ImapConnection getConnection() {
177    if (mConnection == null) {
178      mConnection = new ImapConnection(this);
179    }
180    return mConnection;
181  }
182}
183