Search in sources :

Example 46 with FetchProfile

use of com.fsck.k9.mail.FetchProfile in project k-9 by k9mail.

the class MessagingController method loadMessageMetadata.

public LocalMessage loadMessageMetadata(Account account, long folderId, String uid) throws MessagingException {
    LocalStore localStore = localStoreProvider.getInstance(account);
    LocalFolder localFolder = localStore.getFolder(folderId);
    localFolder.open();
    LocalMessage message = localFolder.getMessage(uid);
    if (message == null || message.getDatabaseId() == 0) {
        String folderName = localFolder.getName();
        throw new IllegalArgumentException("Message not found: folder=" + folderName + ", uid=" + uid);
    }
    FetchProfile fp = new FetchProfile();
    fp.add(FetchProfile.Item.ENVELOPE);
    localFolder.fetch(Collections.singletonList(message), fp, null);
    return message;
}
Also used : LocalFolder(com.fsck.k9.mailstore.LocalFolder) LocalMessage(com.fsck.k9.mailstore.LocalMessage) FetchProfile(com.fsck.k9.mail.FetchProfile) LocalStore(com.fsck.k9.mailstore.LocalStore)

Example 47 with FetchProfile

use of com.fsck.k9.mail.FetchProfile in project k-9 by k9mail.

the class LocalStore method loadLocalMessageByMessageId.

@Nullable
private LocalMessage loadLocalMessageByMessageId(long messageId) throws MessagingException {
    Map<Long, List<String>> folderIdsAndUids = getFolderIdsAndUids(Collections.singletonList(messageId), false);
    if (folderIdsAndUids.isEmpty()) {
        return null;
    }
    Map.Entry<Long, List<String>> entry = folderIdsAndUids.entrySet().iterator().next();
    long folderId = entry.getKey();
    String uid = entry.getValue().get(0);
    LocalFolder folder = getFolder(folderId);
    LocalMessage localMessage = folder.getMessage(uid);
    FetchProfile fp = new FetchProfile();
    fp.add(Item.BODY);
    folder.fetch(Collections.singletonList(localMessage), fp, null);
    return localMessage;
}
Also used : FetchProfile(com.fsck.k9.mail.FetchProfile) List(java.util.List) ArrayList(java.util.ArrayList) LinkedList(java.util.LinkedList) Map(java.util.Map) HashMap(java.util.HashMap) Nullable(androidx.annotation.Nullable)

Example 48 with FetchProfile

use of com.fsck.k9.mail.FetchProfile in project k-9 by k9mail.

the class Pop3Sync method downloadSaneBody.

private void downloadSaneBody(SyncConfig syncConfig, Pop3Folder remoteFolder, BackendFolder backendFolder, Pop3Message message) throws MessagingException {
    /*
         * The provider was unable to get the structure of the message, so
         * we'll download a reasonable portion of the messge and mark it as
         * incomplete so the entire thing can be downloaded later if the user
         * wishes to download it.
         */
    FetchProfile fp = new FetchProfile();
    fp.add(FetchProfile.Item.BODY_SANE);
    /*
         *  TODO a good optimization here would be to make sure that all Stores set
         *  the proper size after this fetch and compare the before and after size. If
         *  they equal we can mark this SYNCHRONIZED instead of PARTIALLY_SYNCHRONIZED
         */
    int maxDownloadSize = syncConfig.getMaximumAutoDownloadMessageSize();
    remoteFolder.fetch(Collections.singletonList(message), fp, null, maxDownloadSize);
    boolean completeMessage = false;
    // Certain (POP3) servers give you the whole message even when you ask for only the first x Kb
    if (!message.isSet(Flag.X_DOWNLOADED_FULL)) {
        /*
             * Mark the message as fully downloaded if the message size is smaller than
             * the account's autodownload size limit, otherwise mark as only a partial
             * download.  This will prevent the system from downloading the same message
             * twice.
             *
             * If there is no limit on autodownload size, that's the same as the message
             * being smaller than the max size
             */
        if (syncConfig.getMaximumAutoDownloadMessageSize() == 0 || message.getSize() < syncConfig.getMaximumAutoDownloadMessageSize()) {
            completeMessage = true;
        }
    }
    // Store the updated message locally
    if (completeMessage) {
        backendFolder.saveMessage(message, MessageDownloadState.FULL);
    } else {
        backendFolder.saveMessage(message, MessageDownloadState.PARTIAL);
    }
}
Also used : FetchProfile(com.fsck.k9.mail.FetchProfile)

Example 49 with FetchProfile

use of com.fsck.k9.mail.FetchProfile in project k-9 by k9mail.

the class Pop3Sync method downloadLargeMessages.

private void downloadLargeMessages(final SyncConfig syncConfig, final Pop3Folder remoteFolder, final BackendFolder backendFolder, List<Pop3Message> largeMessages, final AtomicInteger progress, final AtomicInteger newMessages, final int todo, FetchProfile fp, SyncListener listener) throws MessagingException {
    final String folder = remoteFolder.getServerId();
    Timber.d("SYNC: Fetching large messages for folder %s", folder);
    int maxDownloadSize = syncConfig.getMaximumAutoDownloadMessageSize();
    remoteFolder.fetch(largeMessages, fp, null, maxDownloadSize);
    for (Pop3Message message : largeMessages) {
        downloadSaneBody(syncConfig, remoteFolder, backendFolder, message);
        String messageServerId = message.getUid();
        Timber.v("About to notify listeners that we got a new large message %s:%s:%s", accountName, folder, messageServerId);
        // Update the listener with what we've found
        progress.incrementAndGet();
        // TODO do we need to re-fetch this here?
        Set<Flag> flags = backendFolder.getMessageFlags(messageServerId);
        // not marked as read.
        if (!flags.contains(Flag.SEEN)) {
            newMessages.incrementAndGet();
        }
        listener.syncProgress(folder, progress.get(), todo);
        boolean isOldMessage = isOldMessage(backendFolder, message);
        listener.syncNewMessage(folder, messageServerId, isOldMessage);
    }
    Timber.d("SYNC: Done fetching large messages for folder %s", folder);
}
Also used : Pop3Message(com.fsck.k9.mail.store.pop3.Pop3Message) Flag(com.fsck.k9.mail.Flag)

Example 50 with FetchProfile

use of com.fsck.k9.mail.FetchProfile in project k-9 by k9mail.

the class Pop3Sync method downloadMessages.

private int downloadMessages(final SyncConfig syncConfig, final Pop3Folder remoteFolder, final BackendFolder backendFolder, List<Pop3Message> inputMessages, final SyncListener listener) throws MessagingException {
    final Date earliestDate = syncConfig.getEarliestPollDate();
    // now
    Date downloadStarted = new Date();
    if (earliestDate != null) {
        Timber.d("Only syncing messages after %s", earliestDate);
    }
    final String folder = remoteFolder.getServerId();
    List<Pop3Message> syncFlagMessages = new ArrayList<>();
    List<Pop3Message> unsyncedMessages = new ArrayList<>();
    final AtomicInteger newMessages = new AtomicInteger(0);
    List<Pop3Message> messages = new ArrayList<>(inputMessages);
    for (Pop3Message message : messages) {
        evaluateMessageForDownload(message, folder, backendFolder, unsyncedMessages, syncFlagMessages, listener);
    }
    final AtomicInteger progress = new AtomicInteger(0);
    final int todo = unsyncedMessages.size() + syncFlagMessages.size();
    listener.syncProgress(folder, progress.get(), todo);
    Timber.d("SYNC: Have %d unsynced messages", unsyncedMessages.size());
    messages.clear();
    final List<Pop3Message> largeMessages = new ArrayList<>();
    final List<Pop3Message> smallMessages = new ArrayList<>();
    if (!unsyncedMessages.isEmpty()) {
        int visibleLimit = backendFolder.getVisibleLimit();
        int listSize = unsyncedMessages.size();
        if ((visibleLimit > 0) && (listSize > visibleLimit)) {
            unsyncedMessages = unsyncedMessages.subList(0, visibleLimit);
        }
        FetchProfile fp = new FetchProfile();
        fp.add(FetchProfile.Item.ENVELOPE);
        Timber.d("SYNC: About to fetch %d unsynced messages for folder %s", unsyncedMessages.size(), folder);
        fetchUnsyncedMessages(syncConfig, remoteFolder, unsyncedMessages, smallMessages, largeMessages, progress, todo, fp, listener);
        Timber.d("SYNC: Synced unsynced messages for folder %s", folder);
    }
    Timber.d("SYNC: Have %d large messages and %d small messages out of %d unsynced messages", largeMessages.size(), smallMessages.size(), unsyncedMessages.size());
    unsyncedMessages.clear();
    /*
         * Grab the content of the small messages first. This is going to
         * be very fast and at very worst will be a single up of a few bytes and a single
         * download of 625k.
         */
    FetchProfile fp = new FetchProfile();
    // TODO: Only fetch small and large messages if we have some
    fp.add(FetchProfile.Item.BODY);
    // fp.add(FetchProfile.Item.FLAGS);
    // fp.add(FetchProfile.Item.ENVELOPE);
    downloadSmallMessages(remoteFolder, backendFolder, smallMessages, progress, newMessages, todo, fp, listener);
    smallMessages.clear();
    /*
         * Now do the large messages that require more round trips.
         */
    fp = new FetchProfile();
    fp.add(FetchProfile.Item.STRUCTURE);
    downloadLargeMessages(syncConfig, remoteFolder, backendFolder, largeMessages, progress, newMessages, todo, fp, listener);
    largeMessages.clear();
    Timber.d("SYNC: Synced remote messages for folder %s, %d new messages", folder, newMessages.get());
    // If the oldest message seen on this sync is newer than the oldest message seen on the previous sync, then
    // we want to move our high-water mark forward.
    Date oldestMessageTime = backendFolder.getOldestMessageDate();
    if (oldestMessageTime != null) {
        if (oldestMessageTime.before(downloadStarted) && oldestMessageTime.after(getLatestOldMessageSeenTime(backendFolder))) {
            setLatestOldMessageSeenTime(backendFolder, oldestMessageTime);
        }
    }
    return newMessages.get();
}
Also used : FetchProfile(com.fsck.k9.mail.FetchProfile) Pop3Message(com.fsck.k9.mail.store.pop3.Pop3Message) AtomicInteger(java.util.concurrent.atomic.AtomicInteger) ArrayList(java.util.ArrayList) Date(java.util.Date)

Aggregations

FetchProfile (com.fsck.k9.mail.FetchProfile)49 Test (org.junit.Test)27 LocalMessage (com.fsck.k9.mailstore.LocalMessage)15 MessagingException (com.fsck.k9.mail.MessagingException)12 ArrayList (java.util.ArrayList)10 LocalFolder (com.fsck.k9.mailstore.LocalFolder)9 LocalStore (com.fsck.k9.mailstore.LocalStore)9 SQLiteDatabase (android.database.sqlite.SQLiteDatabase)8 Date (java.util.Date)8 Message (com.fsck.k9.mail.Message)7 SuppressLint (android.annotation.SuppressLint)6 MimeMessage (com.fsck.k9.mail.internet.MimeMessage)6 AuthenticationFailedException (com.fsck.k9.mail.AuthenticationFailedException)5 Multipart (com.fsck.k9.mail.Multipart)5 ByteArrayInputStream (java.io.ByteArrayInputStream)5 IOException (java.io.IOException)5 WebDavMessage (com.fsck.k9.mail.store.webdav.WebDavMessage)4 LinkedList (java.util.LinkedList)4 HttpResponse (org.apache.http.HttpResponse)4 StatusLine (org.apache.http.StatusLine)4