Search in sources :

Example 6 with SyncConfig

use of com.fsck.k9.backend.api.SyncConfig in project k-9 by k9mail.

the class WebDavSync method refreshLocalMessageFlags.

private void refreshLocalMessageFlags(final SyncConfig syncConfig, final WebDavFolder remoteFolder, final BackendFolder backendFolder, List<WebDavMessage> syncFlagMessages, final AtomicInteger progress, final int todo, SyncListener listener) throws MessagingException {
    final String folder = remoteFolder.getServerId();
    Timber.d("SYNC: About to sync flags for %d remote messages for folder %s", syncFlagMessages.size(), folder);
    FetchProfile fp = new FetchProfile();
    fp.add(FetchProfile.Item.FLAGS);
    List<WebDavMessage> undeletedMessages = new LinkedList<>();
    for (WebDavMessage message : syncFlagMessages) {
        if (!message.isSet(Flag.DELETED)) {
            undeletedMessages.add(message);
        }
    }
    int maxDownloadSize = syncConfig.getMaximumAutoDownloadMessageSize();
    remoteFolder.fetch(undeletedMessages, fp, null, maxDownloadSize);
    for (WebDavMessage remoteMessage : syncFlagMessages) {
        boolean messageChanged = syncFlags(syncConfig, backendFolder, remoteMessage);
        if (messageChanged) {
            listener.syncFlagChanged(folder, remoteMessage.getUid());
        }
        progress.incrementAndGet();
        listener.syncProgress(folder, progress.get(), todo);
    }
}
Also used : FetchProfile(com.fsck.k9.mail.FetchProfile) WebDavMessage(com.fsck.k9.mail.store.webdav.WebDavMessage) LinkedList(java.util.LinkedList)

Example 7 with SyncConfig

use of com.fsck.k9.backend.api.SyncConfig 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 8 with SyncConfig

use of com.fsck.k9.backend.api.SyncConfig 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 9 with SyncConfig

use of com.fsck.k9.backend.api.SyncConfig 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)

Example 10 with SyncConfig

use of com.fsck.k9.backend.api.SyncConfig in project k-9 by k9mail.

the class Pop3Sync method fetchUnsyncedMessages.

private void fetchUnsyncedMessages(final SyncConfig syncConfig, final Pop3Folder remoteFolder, List<Pop3Message> unsyncedMessages, final List<Pop3Message> smallMessages, final List<Pop3Message> largeMessages, final AtomicInteger progress, final int todo, FetchProfile fp, final SyncListener listener) throws MessagingException {
    final String folder = remoteFolder.getServerId();
    final Date earliestDate = syncConfig.getEarliestPollDate();
    remoteFolder.fetch(unsyncedMessages, fp, new MessageRetrievalListener<Pop3Message>() {

        @Override
        public void messageFinished(Pop3Message message, int number, int ofTotal) {
            try {
                if (message.isSet(Flag.DELETED) || message.olderThan(earliestDate)) {
                    if (message.isSet(Flag.DELETED)) {
                        Timber.v("Newly downloaded message %s:%s:%s was marked deleted on server, " + "skipping", accountName, folder, message.getUid());
                    } else {
                        Timber.d("Newly downloaded message %s is older than %s, skipping", message.getUid(), earliestDate);
                    }
                    progress.incrementAndGet();
                    // TODO: This might be the source of poll count errors in the UI. Is todo always the same as ofTotal
                    listener.syncProgress(folder, progress.get(), todo);
                    return;
                }
                if (syncConfig.getMaximumAutoDownloadMessageSize() > 0 && message.getSize() > syncConfig.getMaximumAutoDownloadMessageSize()) {
                    largeMessages.add(message);
                } else {
                    smallMessages.add(message);
                }
            } catch (Exception e) {
                Timber.e(e, "Error while storing downloaded message.");
            }
        }

        @Override
        public void messageStarted(String uid, int number, int ofTotal) {
        }

        @Override
        public void messagesFinished(int total) {
        // FIXME this method is almost never invoked by various Stores! Don't rely on it unless fixed!!
        }
    }, syncConfig.getMaximumAutoDownloadMessageSize());
}
Also used : Pop3Message(com.fsck.k9.mail.store.pop3.Pop3Message) Date(java.util.Date) MessagingException(com.fsck.k9.mail.MessagingException) AuthenticationFailedException(com.fsck.k9.mail.AuthenticationFailedException)

Aggregations

AuthenticationFailedException (com.fsck.k9.mail.AuthenticationFailedException)6 MessagingException (com.fsck.k9.mail.MessagingException)6 Date (java.util.Date)6 FetchProfile (com.fsck.k9.mail.FetchProfile)5 WebDavMessage (com.fsck.k9.mail.store.webdav.WebDavMessage)5 Pop3Message (com.fsck.k9.mail.store.pop3.Pop3Message)4 ArrayList (java.util.ArrayList)4 AtomicInteger (java.util.concurrent.atomic.AtomicInteger)4 Flag (com.fsck.k9.mail.Flag)3 BackendFolder (com.fsck.k9.backend.api.BackendFolder)2 MoreMessages (com.fsck.k9.backend.api.BackendFolder.MoreMessages)2 SyncConfig (com.fsck.k9.backend.api.SyncConfig)2 CertificateValidationException (com.fsck.k9.mail.CertificateValidationException)2 LocalFolder (com.fsck.k9.mailstore.LocalFolder)2 LocalStore (com.fsck.k9.mailstore.LocalStore)2 HashMap (java.util.HashMap)2 Backend (com.fsck.k9.backend.api.Backend)1 ServerSettings (com.fsck.k9.mail.ServerSettings)1 Pop3Folder (com.fsck.k9.mail.store.pop3.Pop3Folder)1 WebDavFolder (com.fsck.k9.mail.store.webdav.WebDavFolder)1