1
0
mirror of https://github.com/moparisthebest/k-9 synced 2025-02-15 06:30:17 -05:00

Keep the sync state of a remote EasFolder in sync with its local counterpart when synchronizing the folder.

This commit is contained in:
Kris Wong 2012-01-02 19:41:38 -05:00
parent 474780cbf4
commit a212965b99
5 changed files with 48 additions and 41 deletions

View File

@ -64,7 +64,6 @@ import com.fsck.k9.mail.store.UnavailableStorageException;
import com.fsck.k9.mail.store.LocalStore.LocalFolder;
import com.fsck.k9.mail.store.LocalStore.LocalMessage;
import com.fsck.k9.mail.store.LocalStore.PendingCommand;
import com.fsck.k9.mail.store.EasStore.EasFolder;
/**
@ -503,28 +502,21 @@ public class MessagingController implements Runnable {
private void syncLocalFoldersWithRemoteFolders(List<? extends Folder> localFolders,
List<? extends Folder> remoteFolders, final Account account) throws MessagingException {
HashSet<String> remoteFolderNames = new HashSet<String>();
HashMap<String, Folder> localFolderNames = new HashMap<String, Folder>();
HashSet<String> localFolderNames = new HashSet<String>();
List<LocalFolder> foldersToCreate = new LinkedList<LocalFolder>();
LocalStore localStore = account.getLocalStore();
for (Folder localFolder : localFolders) {
localFolderNames.put(localFolder.getRemoteName(), localFolder);
localFolderNames.add(localFolder.getRemoteName());
}
// Add any new folders in the remote store to the local store.
for (Folder remoteFolder : remoteFolders) {
LocalFolder localFolder = (LocalFolder)localFolderNames.get(remoteFolder.getRemoteName());
if (localFolder == null) {
localFolder = localStore.getFolder(remoteFolder.getRemoteName(),
remoteFolder.getName());
foldersToCreate.add(localFolder);
if (!localFolderNames.contains(remoteFolder.getRemoteName())) {
foldersToCreate.add(localStore.getFolder(remoteFolder.getRemoteName(), remoteFolder.getName()));
}
remoteFolderNames.add(remoteFolder.getRemoteName());
if (remoteFolder instanceof EasFolder) {
((EasFolder)remoteFolder).setLocalFolder(localFolder, false);
}
}
localStore.createFolders(foldersToCreate, account.getDisplayCount());
@ -849,7 +841,9 @@ public class MessagingController implements Runnable {
* TODO Break this method up into smaller chunks.
* @param providedRemoteFolder TODO
*/
private void synchronizeMailboxSynchronous(final Account account, final String folder, final MessagingListener listener, Folder providedRemoteFolder) {
private void synchronizeMailboxSynchronous(final Account account, final String folder,
final MessagingListener listener, Folder providedRemoteFolder) {
Store remoteStore = null;
Folder remoteFolder = null;
LocalFolder tLocalFolder = null;
@ -859,6 +853,7 @@ public class MessagingController implements Runnable {
for (MessagingListener l : getListeners(listener)) {
l.synchronizeMailboxStarted(account, folder);
}
/*
* We don't ever sync the Outbox or errors folder
*/
@ -907,14 +902,14 @@ public class MessagingController implements Runnable {
Log.v(K9.LOG_TAG, "SYNC: using providedRemoteFolder " + folder);
remoteFolder = providedRemoteFolder;
} else {
Store remoteStore = account.getRemoteStore();
remoteStore = account.getRemoteStore();
if (K9.DEBUG)
Log.v(K9.LOG_TAG, "SYNC: About to get remote folder " + folder);
remoteFolder = remoteStore.getFolder(folder);
remoteFolder = remoteStore.getFolder(folder);
if (remoteFolder == null) {
throw new Exception("Store returned null remote folder for " + folder);
throw new Exception("Attempted to synchronize a local-only folder " + folder);
}
if (!verifyOrCreateRemoteSpecialFolder(account, folder, remoteFolder, listener)) {
@ -951,7 +946,6 @@ public class MessagingController implements Runnable {
Log.d(K9.LOG_TAG, "SYNC: Expunging folder " + account.getDescription() + ":" + folder);
remoteFolder.expunge();
}
}
/*
@ -975,7 +969,6 @@ public class MessagingController implements Runnable {
Log.v(K9.LOG_TAG, "SYNC: Remote message count for folder " + folder + " is " + remoteMessageCount);
final Date earliestDate = account.getEarliestPollDate();
if (remoteMessageCount > 0 || syncMode) {
/* Message numbers start at 1. */
int remoteStart;
@ -994,7 +987,6 @@ public class MessagingController implements Runnable {
l.synchronizeMailboxHeadersStarted(account, folder);
}
remoteMessageArray = remoteFolder.getMessages(remoteStart, remoteEnd, earliestDate, null);
int messageCount = remoteMessageArray.length;
@ -1042,7 +1034,6 @@ public class MessagingController implements Runnable {
}
}
localFolder.destroyMessages(destroyMessages.toArray(EMPTY_MESSAGE_ARRAY));
for (Message destroyMessage : destroyMessages) {
@ -1061,7 +1052,6 @@ public class MessagingController implements Runnable {
int unreadMessageCount = setLocalUnreadCountToRemote(localFolder, remoteFolder, newMessages);
setLocalFlaggedCountToRemote(localFolder, remoteFolder);
for (MessagingListener l : getListeners()) {
l.folderStatusChanged(account, folder, unreadMessageCount);
}
@ -1079,7 +1069,6 @@ public class MessagingController implements Runnable {
l.synchronizeMailboxFinished(account, folder, remoteMessageCount, newMessages);
}
if (commandException != null) {
String rootMessage = getRootCauseMessage(commandException);
Log.e(K9.LOG_TAG, "Root cause failure in " + account.getDescription() + ":" +
@ -1115,13 +1104,25 @@ public class MessagingController implements Runnable {
Log.e(K9.LOG_TAG, "Failed synchronizing folder " + account.getDescription() + ":" + folder + " @ " + new Date());
} finally {
// For certain store types, we need to make sure to keep the push state of the local
// and remote folder in sync.
if (remoteStore.keepPushStateInSync()) {
if (remoteFolder != null && tLocalFolder != null) {
try {
tLocalFolder.setPushState(remoteFolder.getPushState());
}
catch (MessagingException e) {
Log.e(K9.LOG_TAG, "Unable to update the local push state for folder " + tLocalFolder.getName(), e);
}
}
}
if (providedRemoteFolder == null) {
closeFolder(remoteFolder);
}
closeFolder(tLocalFolder);
}
}

View File

@ -223,4 +223,8 @@ public abstract class Folder {
public boolean isSyncMode() {
return false;
}
public String getPushState() {
return null;
}
}

View File

@ -176,6 +176,10 @@ public abstract class Store {
return false;
}
public boolean keepPushStateInSync() {
return false;
}
public void sendMessages(Message[] messages) throws MessagingException {
}

View File

@ -62,7 +62,6 @@ import com.fsck.k9.mail.ServerSettings;
import com.fsck.k9.mail.Store;
import com.fsck.k9.mail.filter.EOLConvertingOutputStream;
import com.fsck.k9.mail.internet.MimeMessage;
import com.fsck.k9.mail.store.LocalStore.LocalFolder;
import com.fsck.k9.mail.store.exchange.Eas;
import com.fsck.k9.mail.store.exchange.adapter.EasEmailSyncParser;
import com.fsck.k9.mail.store.exchange.adapter.FolderSyncParser;
@ -802,6 +801,7 @@ public class EasStore extends Store {
throw new MessagingException("io", e);
}
// EASTODO: This needs to preserve the sync key for each folder.
synchronized (mFolderList) {
mFolderList.clear();
for (Folder folder : folderList) {
@ -868,7 +868,7 @@ public class EasStore extends Store {
EasFolder remoteFolder = new EasFolder(folder.getName(), folder.getRemoteName(), type);
mFolderList.put(folder.getRemoteName(), remoteFolder);
remoteFolder.setLocalFolder((LocalFolder)folder, true);
remoteFolder.setSyncKey(folder.getPushState());
}
}
}
@ -909,6 +909,11 @@ public class EasStore extends Store {
return true;
}
@Override
public boolean keepPushStateInSync() {
return true;
}
@Override
public void sendMessages(Message[] messages) throws MessagingException {
for (int i = 0; i < messages.length; i++) {
@ -999,7 +1004,6 @@ public class EasStore extends Store {
private int mType;
private boolean mIsOpen = false;
private String mSyncKey = null;
private LocalFolder mLocalFolder = null;
protected EasStore getStore() {
return EasStore.this;
@ -1012,16 +1016,6 @@ public class EasStore extends Store {
mType = type;
}
public void setLocalFolder(LocalFolder folder, boolean setSyncKey) {
mLocalFolder = folder;
if (setSyncKey && mLocalFolder != null) {
if (mSyncKey != null && !mSyncKey.equals(INITIAL_SYNC_KEY)) {
Log.d(K9.LOG_TAG, "Overriding non-default SyncKey: " + mSyncKey);
}
mSyncKey = mLocalFolder.getPushState();
}
}
public String getSyncKey() throws MessagingException {
if (mSyncKey == null) {
Log.d(K9.LOG_TAG, "Reset SyncKey to 0");
@ -1032,9 +1026,6 @@ public class EasStore extends Store {
public void setSyncKey(String key) throws MessagingException {
mSyncKey = key;
if (mLocalFolder != null) {
mLocalFolder.setPushState(mSyncKey);
}
}
@Override
@ -1451,9 +1442,14 @@ public class EasStore extends Store {
}
@Override
public String getNewPushState(String oldPushState, Message message) {
public String getPushState() {
return mSyncKey;
}
@Override
public String getNewPushState(String oldPushState, Message message) {
return getPushState();
}
}
/**

View File

@ -1419,9 +1419,11 @@ public class LocalStore extends Store implements Serializable {
}
}
@Override
public String getPushState() {
return mPushState;
}
@Override
public FolderClass getDisplayClass() {
return mDisplayClass;