google expunge all deleted flagged messages automatically but some server keep them and EXPUNGE has to be executed explicit. Add the infrastructure for expunge but don't use it for now. The problem is that with each expunge all messages are deleted and calling expunge each time when a mail is deleted would delete messages in a virtual trash folder on other clients. Have to think about how to deal with it first. So it might be that you delete a message and the message will be downloaded again when you sync the next time (but the message is flagged as deleted).

git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@40736 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
Clemens Zeidler
2011-02-28 08:27:23 +00:00
parent 093a895c3f
commit 78e0108c39
5 changed files with 60 additions and 17 deletions
@@ -512,11 +512,10 @@ IMAPInboundProtocol::DeleteMessage(const entry_ref& ref)
Connect(fServer, fUsername, fPassword, fUseSSL);
fIMAPMailboxThread->StopWatchingMailbox();
int32 uid = fStorage.RefToUID(ref);
int32 flags = fStorage.GetFlags(uid);
flags |= kDeleted;
status_t status = fIMAPMailbox.SetFlags(
fIMAPMailbox.UIDToMessageNumber(uid), flags);
status_t status = fIMAPMailbox.DeleteMessage(uid, false);
fIMAPMailboxThread->SyncAndStartWatchingMailbox();
return status;
}
@@ -576,11 +575,10 @@ IMAPInboundProtocol::DeleteMessage(node_ref& node)
fIMAPMailboxThread->SyncAndStartWatchingMailbox();
return B_BAD_VALUE;
}
int32 uid = entry->uid;
int32 flags = fStorage.GetFlags(uid);
flags |= kDeleted;
status_t status = fIMAPMailbox.SetFlags(
fIMAPMailbox.UIDToMessageNumber(uid), flags);
status_t status = fIMAPMailbox.DeleteMessage(uid, false);
fIMAPMailboxThread->SyncAndStartWatchingMailbox();
return status;
}
@@ -628,6 +628,27 @@ ExistsHandler::Handle(const BString& response)
}
ExpungeCommmand::ExpungeCommmand(IMAPMailbox& mailbox)
:
IMAPMailboxCommand(mailbox)
{
}
BString
ExpungeCommmand::Command()
{
return "EXPUNGE";
}
bool
ExpungeCommmand::Handle(const BString& response)
{
return false;
}
ExpungeHandler::ExpungeHandler(IMAPMailbox& mailbox)
:
IMAPMailboxCommand(mailbox)
@@ -645,7 +666,15 @@ ExpungeHandler::Handle(const BString& response)
if (!IMAPParser::ExtractUntagedFromLeft(response, "EXPUNGE", expunge))
return false;
fIMAPMailbox.DeleteMessage(expunge);
// remove from storage
IMAPStorage& storage = fIMAPMailbox.GetStorage();
storage.DeleteMessage(fIMAPMailbox.MessageNumberToUID(expunge));
// remove from min message list
MinMessageList& messageList = const_cast<MinMessageList&>(
fIMAPMailbox.GetMessageList());
messageList.erase(messageList.begin() + expunge - 1);
TRACE("EXPUNGE %i\n", (int)expunge);
// the watching loop restarts again, we need to watch again to because
@@ -197,6 +197,18 @@ public:
};
/*! Just send a expunge command to delete kDeleted flagged messages. The
response is handled by the unsolicited ExpungeHandler which is installed all
the time. */
class ExpungeCommmand : public IMAPMailboxCommand {
public:
ExpungeCommmand(IMAPMailbox& mailbox);
BString Command();
bool Handle(const BString& response);
};
class ExpungeHandler : public IMAPMailboxCommand {
public:
ExpungeHandler(IMAPMailbox& mailbox);
@@ -289,14 +289,18 @@ IMAPMailbox::MessageNumberToUID(int32 messageNumber)
status_t
IMAPMailbox::DeleteMessage(int32 messageNumber)
IMAPMailbox::DeleteMessage(int32 uid, bool permanently)
{
int32 index = messageNumber - 1;
if (index < 0 || index >= (int32)fMessageList.size())
return B_BAD_VALUE;
status_t status = fStorage.DeleteMessage(MessageNumberToUID(messageNumber));
fMessageList.erase(fMessageList.begin() + index);
return status;
int32 flags = fStorage.GetFlags(uid);
flags |= kDeleted;
status_t status = SetFlags(UIDToMessageNumber(uid), flags);
if (!permanently || status != B_OK)
return status;
// delete permanently by invoking expunge
ExpungeCommmand expungeCommand(*this);
return ProcessCommand(&expungeCommand);
}
@@ -72,7 +72,7 @@ public:
int32 UIDToMessageNumber(int32 uid);
int32 MessageNumberToUID(int32 messageNumber);
status_t DeleteMessage(int32 messageNumber);
status_t DeleteMessage(int32 uid, bool permanently);
private:
void _InstallUnsolicitedHandler(bool install);