diff --git a/src/kits/mail/MailProtocol.cpp b/src/kits/mail/MailProtocol.cpp index 18980ce542..0f571ecc6b 100644 --- a/src/kits/mail/MailProtocol.cpp +++ b/src/kits/mail/MailProtocol.cpp @@ -193,6 +193,10 @@ BMailProtocol::BMailProtocol(BMessage *settings, BMailChainRunner *run) fido.PushAttr("MAIL:chain"); fido.PushInt32(settings->FindInt32("chain")); fido.PushOp(B_EQ); + fido.PushAttr("MAIL:pending_chain"); + fido.PushInt32(settings->FindInt32("chain")); + fido.PushOp(B_EQ); + fido.PushOp(B_OR); if (!settings->FindBool("delete_remote_when_local")) { fido.PushAttr("BEOS:type"); fido.PushString("text/x-partial-email"); @@ -307,6 +311,10 @@ void BMailProtocol::CheckForDeletedMessages() { fido.PushAttr("MAIL:chain"); fido.PushInt32(settings->FindInt32("chain")); fido.PushOp(B_EQ); + fido.PushAttr("MAIL:pending_chain"); + fido.PushInt32(settings->FindInt32("chain")); + fido.PushOp(B_EQ); + fido.PushOp(B_OR); fido.Fetch(); BString uid; diff --git a/src/kits/mail/RemoteStorageProtocol.cpp b/src/kits/mail/RemoteStorageProtocol.cpp index fd014fccba..aa1cf48508 100644 --- a/src/kits/mail/RemoteStorageProtocol.cpp +++ b/src/kits/mail/RemoteStorageProtocol.cpp @@ -12,6 +12,7 @@ class _EXPORT BRemoteMailStorageProtocol; #include #include +#include namespace { @@ -325,8 +326,21 @@ void BRemoteMailStorageProtocol::SyncMailbox(const char *mailbox) { if (snoodle.ReadAttr("MAIL:chain",B_INT32_TYPE,0,&chain,sizeof(chain)) < B_OK) append = true; - if (chain != runner->Chain()->ID()) - append = true; + if (chain != runner->Chain()->ID()) { + int32 pending_chain(-1), flags(0); + snoodle.ReadAttr("MAIL:pending_chain",B_INT32_TYPE,0,&chain,sizeof(chain)); + snoodle.ReadAttr("MAIL:flags",B_INT32_TYPE,0,&flags,sizeof(flags)); + + if ((pending_chain == runner->Chain()->ID()) && (BMailChain(chain).ChainDirection() == outbound) && (flags & B_MAIL_PENDING)) + continue; //--- Ignore this message, recode the chain attribute at the next SyncMailbox() + + if (pending_chain == runner->Chain()->ID()) { + chain = runner->Chain()->ID(); + snoodle.WriteAttr("MAIL:chain",B_INT32_TYPE,0,&chain,sizeof(chain)); + append = false; + } else + append = true; + } if (snoodle.ReadAttrString("MAIL:unique_id",&string) < B_OK) append = true; @@ -351,7 +365,14 @@ void BRemoteMailStorageProtocol::SyncMailbox(const char *mailbox) { /*snoodle.RemoveAttr("MAIL:unique_id"); snoodle.RemoveAttr("MAIL:chain");*/ chain = runner->Chain()->ID(); - snoodle.WriteAttr("MAIL:chain",B_INT32_TYPE,0,&chain,sizeof(chain)); + + int32 flags = 0; + snoodle.ReadAttr("MAIL:flags",B_INT32_TYPE,0,&flags,sizeof(flags)); + + if (flags & B_MAIL_PENDING) + snoodle.WriteAttr("MAIL:pending_chain",B_INT32_TYPE,0,&chain,sizeof(chain)); + else + snoodle.WriteAttr("MAIL:chain",B_INT32_TYPE,0,&chain,sizeof(chain)); snoodle.WriteAttrString("MAIL:unique_id",&string); (*manifest) += string.String(); (*unique_ids) += string.String(); diff --git a/src/servers/mail/main.cpp b/src/servers/mail/main.cpp index 8a4754e843..a1d35deacd 100644 --- a/src/servers/mail/main.cpp +++ b/src/servers/mail/main.cpp @@ -618,7 +618,7 @@ makeIndices() fs_create_index(device,B_MAIL_ATTR_WHEN,B_INT32_TYPE,0); fs_create_index(device,B_MAIL_ATTR_FLAGS,B_INT32_TYPE,0); fs_create_index(device,"MAIL:chain",B_INT32_TYPE,0); - //fs_create_index(device,"MAIL:fullsize",B_UINT32_TYPE,0); + fs_create_index(device,"MAIL:pending_chain",B_INT32_TYPE,0); } }