diff options
author | Christian Mollekopf <chrigi_1@fastmail.fm> | 2017-01-03 22:38:09 +0100 |
---|---|---|
committer | Christian Mollekopf <chrigi_1@fastmail.fm> | 2017-01-03 22:38:09 +0100 |
commit | a6c3e00395d40b1daeccd6ca8335e6419c147ee0 (patch) | |
tree | 0b8ba1ed22c4e04628b0c12e307dc5b498afdf2e /common/specialpurposepreprocessor.cpp | |
parent | 7c8422653051baead5ed17ffc055b4d9e23a2e72 (diff) | |
download | sink-a6c3e00395d40b1daeccd6ca8335e6419c147ee0.tar.gz sink-a6c3e00395d40b1daeccd6ca8335e6419c147ee0.zip |
Move the mail between folders and update specialpurpose accordingly.
Diffstat (limited to 'common/specialpurposepreprocessor.cpp')
-rw-r--r-- | common/specialpurposepreprocessor.cpp | 49 |
1 files changed, 36 insertions, 13 deletions
diff --git a/common/specialpurposepreprocessor.cpp b/common/specialpurposepreprocessor.cpp index e73e4ce..be5fa50 100644 --- a/common/specialpurposepreprocessor.cpp +++ b/common/specialpurposepreprocessor.cpp | |||
@@ -48,7 +48,7 @@ QByteArray getSpecialPurposeType(const QString &name) | |||
48 | 48 | ||
49 | SpecialPurposeProcessor::SpecialPurposeProcessor(const QByteArray &resourceType, const QByteArray &resourceInstanceIdentifier) : mResourceType(resourceType), mResourceInstanceIdentifier(resourceInstanceIdentifier) {} | 49 | SpecialPurposeProcessor::SpecialPurposeProcessor(const QByteArray &resourceType, const QByteArray &resourceInstanceIdentifier) : mResourceType(resourceType), mResourceInstanceIdentifier(resourceInstanceIdentifier) {} |
50 | 50 | ||
51 | QByteArray SpecialPurposeProcessor::ensureFolder(const QByteArray &specialPurpose) | 51 | QByteArray SpecialPurposeProcessor::findFolder(const QByteArray &specialPurpose, bool createIfMissing) |
52 | { | 52 | { |
53 | if (!mSpecialPurposeFolders.contains(specialPurpose)) { | 53 | if (!mSpecialPurposeFolders.contains(specialPurpose)) { |
54 | //Try to find an existing drafts folder | 54 | //Try to find an existing drafts folder |
@@ -58,7 +58,7 @@ QByteArray SpecialPurposeProcessor::ensureFolder(const QByteArray &specialPurpos | |||
58 | mSpecialPurposeFolders.insert(specialPurpose, r.entity.identifier()); | 58 | mSpecialPurposeFolders.insert(specialPurpose, r.entity.identifier()); |
59 | }); | 59 | }); |
60 | 60 | ||
61 | if (!mSpecialPurposeFolders.contains(specialPurpose)) { | 61 | if (!mSpecialPurposeFolders.contains(specialPurpose) && createIfMissing) { |
62 | SinkTrace() << "Failed to find a " << specialPurpose << " folder, creating a new one"; | 62 | SinkTrace() << "Failed to find a " << specialPurpose << " folder, creating a new one"; |
63 | auto folder = ApplicationDomain::Folder::create(mResourceInstanceIdentifier); | 63 | auto folder = ApplicationDomain::Folder::create(mResourceInstanceIdentifier); |
64 | folder.setSpecialPurpose(QByteArrayList() << specialPurpose); | 64 | folder.setSpecialPurpose(QByteArrayList() << specialPurpose); |
@@ -72,23 +72,33 @@ QByteArray SpecialPurposeProcessor::ensureFolder(const QByteArray &specialPurpos | |||
72 | return mSpecialPurposeFolders.value(specialPurpose); | 72 | return mSpecialPurposeFolders.value(specialPurpose); |
73 | } | 73 | } |
74 | 74 | ||
75 | bool SpecialPurposeProcessor::isSpecialPurposeFolder(const QByteArray &folder) const | ||
76 | { | ||
77 | return mSpecialPurposeFolders.values().contains(folder); | ||
78 | } | ||
79 | |||
75 | void SpecialPurposeProcessor::moveToFolder(Sink::ApplicationDomain::ApplicationDomainType &newEntity) | 80 | void SpecialPurposeProcessor::moveToFolder(Sink::ApplicationDomain::ApplicationDomainType &newEntity) |
76 | { | 81 | { |
82 | //If we remove the draft folder move back to inbox | ||
83 | //If we remove the trash property, move back to other specialpurpose folder or inbox | ||
84 | //If a folder is set explicitly, clear specialpurpose flags. | ||
77 | using namespace Sink::ApplicationDomain; | 85 | using namespace Sink::ApplicationDomain; |
78 | auto mail = newEntity.cast<Mail>(); | 86 | auto mail = newEntity.cast<Mail>(); |
79 | if (mail.getTrash()) { | 87 | if (mail.getTrash()) { |
80 | auto f = ensureFolder(ApplicationDomain::SpecialPurpose::Mail::trash); | 88 | auto f = findFolder(ApplicationDomain::SpecialPurpose::Mail::trash, true); |
81 | SinkTrace() << "Setting trash folder: " << f; | 89 | SinkTrace() << "Setting trash folder: " << f; |
82 | mail.setFolder(f); | 90 | mail.setFolder(f); |
83 | return; | 91 | } else if (mail.getDraft()) { |
84 | } | 92 | SinkTrace() << "Setting drafts folder: "; |
85 | if (mail.getDraft()) { | 93 | mail.setFolder(findFolder(ApplicationDomain::SpecialPurpose::Mail::drafts, true)); |
86 | mail.setFolder(ensureFolder(ApplicationDomain::SpecialPurpose::Mail::drafts)); | 94 | } else if (mail.getSent()) { |
87 | return; | 95 | SinkTrace() << "Setting sent folder: "; |
88 | } | 96 | mail.setFolder(findFolder(ApplicationDomain::SpecialPurpose::Mail::sent, true)); |
89 | if (mail.getSent()) { | 97 | } else { |
90 | mail.setFolder(ensureFolder(ApplicationDomain::SpecialPurpose::Mail::sent)); | 98 | //No longer a specialpurpose mail, so move to inbox |
91 | return; | 99 | if (isSpecialPurposeFolder(mail.getFolder()) || mail.getFolder().isEmpty()) { |
100 | mail.setFolder(findFolder(ApplicationDomain::SpecialPurpose::Mail::inbox, true)); | ||
101 | } | ||
92 | } | 102 | } |
93 | } | 103 | } |
94 | 104 | ||
@@ -99,5 +109,18 @@ void SpecialPurposeProcessor::newEntity(Sink::ApplicationDomain::ApplicationDoma | |||
99 | 109 | ||
100 | void SpecialPurposeProcessor::modifiedEntity(const Sink::ApplicationDomain::ApplicationDomainType &oldEntity, Sink::ApplicationDomain::ApplicationDomainType &newEntity) | 110 | void SpecialPurposeProcessor::modifiedEntity(const Sink::ApplicationDomain::ApplicationDomainType &oldEntity, Sink::ApplicationDomain::ApplicationDomainType &newEntity) |
101 | { | 111 | { |
102 | moveToFolder(newEntity); | 112 | using namespace Sink::ApplicationDomain; |
113 | auto mail = newEntity.cast<Mail>(); | ||
114 | //If we moved the mail to a non-specialpurpose folder explicitly, also clear the flags. | ||
115 | if (mail.changedProperties().contains(Mail::Folder::name)) { | ||
116 | auto folder = mail.getFolder(); | ||
117 | bool isDraft = findFolder(ApplicationDomain::SpecialPurpose::Mail::drafts) == folder; | ||
118 | bool isSent = findFolder(ApplicationDomain::SpecialPurpose::Mail::sent) == folder; | ||
119 | bool isTrash = findFolder(ApplicationDomain::SpecialPurpose::Mail::trash) == folder; | ||
120 | mail.setDraft(isDraft); | ||
121 | mail.setTrash(isSent); | ||
122 | mail.setSent(isTrash); | ||
123 | } else { | ||
124 | moveToFolder(newEntity); | ||
125 | } | ||
103 | } | 126 | } |