Home | History | Annotate | Download | only in store
      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 
     17 package com.android.voicemail.impl.mail.store;
     18 
     19 import android.content.Context;
     20 import android.net.Network;
     21 import com.android.voicemail.impl.imap.ImapHelper;
     22 import com.android.voicemail.impl.mail.MailTransport;
     23 import com.android.voicemail.impl.mail.Message;
     24 import com.android.voicemail.impl.mail.MessagingException;
     25 import com.android.voicemail.impl.mail.internet.MimeMessage;
     26 import java.io.IOException;
     27 import java.io.InputStream;
     28 import org.apache.james.mime4j.MimeException;
     29 
     30 public 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