summaryrefslogtreecommitdiffstats
path: root/common/specialpurposepreprocessor.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'common/specialpurposepreprocessor.cpp')
-rw-r--r--common/specialpurposepreprocessor.cpp49
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
49SpecialPurposeProcessor::SpecialPurposeProcessor(const QByteArray &resourceType, const QByteArray &resourceInstanceIdentifier) : mResourceType(resourceType), mResourceInstanceIdentifier(resourceInstanceIdentifier) {} 49SpecialPurposeProcessor::SpecialPurposeProcessor(const QByteArray &resourceType, const QByteArray &resourceInstanceIdentifier) : mResourceType(resourceType), mResourceInstanceIdentifier(resourceInstanceIdentifier) {}
50 50
51QByteArray SpecialPurposeProcessor::ensureFolder(const QByteArray &specialPurpose) 51QByteArray 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
75bool SpecialPurposeProcessor::isSpecialPurposeFolder(const QByteArray &folder) const
76{
77 return mSpecialPurposeFolders.values().contains(folder);
78}
79
75void SpecialPurposeProcessor::moveToFolder(Sink::ApplicationDomain::ApplicationDomainType &newEntity) 80void 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
100void SpecialPurposeProcessor::modifiedEntity(const Sink::ApplicationDomain::ApplicationDomainType &oldEntity, Sink::ApplicationDomain::ApplicationDomainType &newEntity) 110void 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}