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:
@@ -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);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user