summaryrefslogtreecommitdiffstats
path: root/examples/imapresource/imapresource.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'examples/imapresource/imapresource.cpp')
-rw-r--r--examples/imapresource/imapresource.cpp47
1 files changed, 27 insertions, 20 deletions
diff --git a/examples/imapresource/imapresource.cpp b/examples/imapresource/imapresource.cpp
index b3aafed..1e2c0df 100644
--- a/examples/imapresource/imapresource.cpp
+++ b/examples/imapresource/imapresource.cpp
@@ -63,6 +63,7 @@ static QHash<QByteArray, QString> specialPurposeFolders()
63 QHash<QByteArray, QString> hash; 63 QHash<QByteArray, QString> hash;
64 //FIXME localize 64 //FIXME localize
65 hash.insert("drafts", "Drafts"); 65 hash.insert("drafts", "Drafts");
66 hash.insert("trash", "Trash");
66 return hash; 67 return hash;
67} 68}
68 69
@@ -80,51 +81,57 @@ static QHash<QByteArray, QString> sSpecialPurposeFolders = specialPurposeFolders
80//Lowercase-name, specialpurpose 81//Lowercase-name, specialpurpose
81static QHash<QString, QByteArray> sSpecialPurposeNames = specialPurposeNames(); 82static QHash<QString, QByteArray> sSpecialPurposeNames = specialPurposeNames();
82 83
83class DraftsProcessor : public Sink::Preprocessor 84class SpecialPurposeProcessor : public Sink::Preprocessor
84{ 85{
85public: 86public:
86 DraftsProcessor(const QByteArray &resourceType, const QByteArray &resourceInstanceIdentifier) : mResourceType(resourceType), mResourceInstanceIdentifier(resourceInstanceIdentifier) {} 87 SpecialPurposeProcessor(const QByteArray &resourceType, const QByteArray &resourceInstanceIdentifier) : mResourceType(resourceType), mResourceInstanceIdentifier(resourceInstanceIdentifier) {}
87 88
88 QByteArray ensureDraftsFolder(Sink::Storage::Transaction &transaction) 89 QByteArray ensureFolder(Sink::Storage::Transaction &transaction, const QByteArray &specialPurpose)
89 { 90 {
90 if (mDraftsFolder.isEmpty()) { 91 if (!mSpecialPurposeFolders.contains(specialPurpose)) {
91 //Try to find an existing drafts folder 92 //Try to find an existing drafts folder
92 Sink::EntityReader<ApplicationDomain::Folder> reader(mResourceType, mResourceInstanceIdentifier, transaction); 93 Sink::EntityReader<ApplicationDomain::Folder> reader(mResourceType, mResourceInstanceIdentifier, transaction);
93 reader.query(Sink::Query().filter<ApplicationDomain::Folder::SpecialPurpose>(Query::Comparator("drafts", Query::Comparator::Contains)), 94 reader.query(Sink::Query().filter<ApplicationDomain::Folder::SpecialPurpose>(Query::Comparator("drafts", Query::Comparator::Contains)),
94 [this](const ApplicationDomain::Folder &f) -> bool{ 95 [this, specialPurpose](const ApplicationDomain::Folder &f) -> bool{
95 mDraftsFolder = f.identifier(); 96 mSpecialPurposeFolders.insert(specialPurpose, f.identifier());
96 return false; 97 return false;
97 }); 98 });
98 if (mDraftsFolder.isEmpty()) { 99 if (!mSpecialPurposeFolders.contains(specialPurpose)) {
99 Trace() << "Failed to find a drafts folder, creating a new one"; 100 Trace() << "Failed to find a drafts folder, creating a new one";
100 auto folder = ApplicationDomain::Folder::create(mResourceInstanceIdentifier); 101 auto folder = ApplicationDomain::Folder::create(mResourceInstanceIdentifier);
101 folder.setSpecialPurpose(QByteArrayList() << "drafts"); 102 folder.setSpecialPurpose(QByteArrayList() << specialPurpose);
102 folder.setName(sSpecialPurposeFolders.value("drafts")); 103 folder.setName(sSpecialPurposeFolders.value(specialPurpose));
103 folder.setIcon("folder"); 104 folder.setIcon("folder");
104 //This processes the pipeline synchronously 105 //This processes the pipeline synchronously
105 createEntity(folder); 106 createEntity(folder);
106 mDraftsFolder = folder.identifier(); 107 mSpecialPurposeFolders.insert(specialPurpose, folder.identifier());
107 } 108 }
108 } 109 }
109 return mDraftsFolder; 110 return mSpecialPurposeFolders.value(specialPurpose);
110 } 111 }
111 112
112 void newEntity(const QByteArray &uid, qint64 revision, Sink::ApplicationDomain::BufferAdaptor &newEntity, Sink::Storage::Transaction &transaction) Q_DECL_OVERRIDE 113 void moveToFolder(Sink::ApplicationDomain::BufferAdaptor &newEntity, Sink::Storage::Transaction &transaction)
113 { 114 {
115 if (newEntity.getProperty("trash").toBool()) {
116 newEntity.setProperty("folder", ensureFolder(transaction, "trash"));
117 return;
118 }
114 if (newEntity.getProperty("draft").toBool()) { 119 if (newEntity.getProperty("draft").toBool()) {
115 newEntity.setProperty("folder", ensureDraftsFolder(transaction)); 120 newEntity.setProperty("folder", ensureFolder(transaction, "drafts"));
116 } 121 }
117 } 122 }
118 123
119 void modifiedEntity(const QByteArray &uid, qint64 revision, const Sink::ApplicationDomain::BufferAdaptor &oldEntity, Sink::ApplicationDomain::BufferAdaptor &newEntity, 124 void newEntity(const QByteArray &uid, qint64 revision, Sink::ApplicationDomain::BufferAdaptor &newEntity, Sink::Storage::Transaction &transaction) Q_DECL_OVERRIDE
120 Sink::Storage::Transaction &transaction) Q_DECL_OVERRIDE
121 { 125 {
122 if (newEntity.getProperty("draft").toBool()) { 126 moveToFolder(newEntity, transaction);
123 newEntity.setProperty("folder", ensureDraftsFolder(transaction)); 127 }
124 } 128
129 void modifiedEntity(const QByteArray &uid, qint64 revision, const Sink::ApplicationDomain::BufferAdaptor &oldEntity, Sink::ApplicationDomain::BufferAdaptor &newEntity, Sink::Storage::Transaction &transaction) Q_DECL_OVERRIDE
130 {
131 moveToFolder(newEntity, transaction);
125 } 132 }
126 133
127 QByteArray mDraftsFolder; 134 QHash<QByteArray, QByteArray> mSpecialPurposeFolders;
128 QByteArray mResourceType; 135 QByteArray mResourceType;
129 QByteArray mResourceInstanceIdentifier; 136 QByteArray mResourceInstanceIdentifier;
130}; 137};
@@ -647,7 +654,7 @@ ImapResource::ImapResource(const QByteArray &instanceIdentifier, const QSharedPo
647 changereplay->mPassword = mPassword; 654 changereplay->mPassword = mPassword;
648 setupChangereplay(changereplay); 655 setupChangereplay(changereplay);
649 656
650 setupPreprocessors(ENTITY_TYPE_MAIL, QVector<Sink::Preprocessor*>() << new DraftsProcessor(mResourceType, mResourceInstanceIdentifier) << new MimeMessageMover(mResourceInstanceIdentifier) << new MailPropertyExtractor << new DefaultIndexUpdater<Sink::ApplicationDomain::Mail>); 657 setupPreprocessors(ENTITY_TYPE_MAIL, QVector<Sink::Preprocessor*>() << new SpecialPurposeProcessor(mResourceType, mResourceInstanceIdentifier) << new MimeMessageMover(mResourceInstanceIdentifier) << new MailPropertyExtractor << new DefaultIndexUpdater<Sink::ApplicationDomain::Mail>);
651 setupPreprocessors(ENTITY_TYPE_FOLDER, QVector<Sink::Preprocessor*>() << new DefaultIndexUpdater<Sink::ApplicationDomain::Folder>); 658 setupPreprocessors(ENTITY_TYPE_FOLDER, QVector<Sink::Preprocessor*>() << new DefaultIndexUpdater<Sink::ApplicationDomain::Folder>);
652} 659}
653 660