k-9/src/com/fsck/k9/mail/Store.java

146 lines
3.8 KiB
Java

package com.fsck.k9.mail;
import android.app.Application;
import android.content.Context;
import com.fsck.k9.Account;
import com.fsck.k9.mail.store.ImapStore;
import com.fsck.k9.mail.store.LocalStore;
import com.fsck.k9.mail.store.Pop3Store;
import com.fsck.k9.mail.store.WebDavStore;
import com.fsck.k9.mail.store.StorageManager.StorageProvider;
import java.util.HashMap;
import java.util.List;
/**
* Store is the access point for an email message store. It's location can be
* local or remote and no specific protocol is defined. Store is intended to
* loosely model in combination the JavaMail classes javax.mail.Store and
* javax.mail.Folder along with some additional functionality to improve
* performance on mobile devices. Implementations of this class should focus on
* making as few network connections as possible.
*/
public abstract class Store
{
protected static final int SOCKET_CONNECT_TIMEOUT = 30000;
protected static final int SOCKET_READ_TIMEOUT = 60000;
/**
* Remote stores indexed by Uri.
*/
private static HashMap<String, Store> mStores = new HashMap<String, Store>();
/**
* Local stores indexed by UUid because the Uri may change due to migration to/from SD-card.
*/
private static HashMap<String, Store> mLocalStores = new HashMap<String, Store>();
protected final Account mAccount;
protected Store(Account account)
{
mAccount = account;
}
/**
* Get an instance of a remote mail store.
*/
public synchronized static Store getRemoteInstance(Account account) throws MessagingException
{
String uri = account.getStoreUri();
if (uri.startsWith("local"))
{
throw new RuntimeException("Asked to get non-local Store object but given LocalStore URI");
}
Store store = mStores.get(uri);
if (store == null)
{
if (uri.startsWith("imap"))
{
store = new ImapStore(account);
}
else if (uri.startsWith("pop3"))
{
store = new Pop3Store(account);
}
else if (uri.startsWith("webdav"))
{
store = new WebDavStore(account);
}
if (store != null)
{
mStores.put(uri, store);
}
}
if (store == null)
{
throw new MessagingException("Unable to locate an applicable Store for " + uri);
}
return store;
}
/**
* Get an instance of a local mail store.
* @throws UnavailableStorageException if not {@link StorageProvider#isReady(Context)}
*/
public synchronized static LocalStore getLocalInstance(Account account, Application application) throws MessagingException
{
Store store = mLocalStores.get(account.getUuid());
if (store == null)
{
store = new LocalStore(account, application);
mLocalStores.put(account.getUuid(), store);
}
return (LocalStore) store;
}
public abstract Folder getFolder(String name);
public abstract List<? extends Folder> getPersonalNamespaces(boolean forceListAll) throws MessagingException;
public abstract void checkSettings() throws MessagingException;
public boolean isCopyCapable()
{
return false;
}
public boolean isMoveCapable()
{
return false;
}
public boolean isPushCapable()
{
return false;
}
public boolean isSendCapable()
{
return false;
}
public boolean isExpungeCapable()
{
return false;
}
public void sendMessages(Message[] messages) throws MessagingException
{
}
public Pusher getPusher(PushReceiver receiver)
{
return null;
}
public Account getAccount()
{
return mAccount;
}
}