diff options
Diffstat (limited to 'examples/imapresource/imapresource.cpp')
-rw-r--r-- | examples/imapresource/imapresource.cpp | 47 |
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 |
81 | static QHash<QString, QByteArray> sSpecialPurposeNames = specialPurposeNames(); | 82 | static QHash<QString, QByteArray> sSpecialPurposeNames = specialPurposeNames(); |
82 | 83 | ||
83 | class DraftsProcessor : public Sink::Preprocessor | 84 | class SpecialPurposeProcessor : public Sink::Preprocessor |
84 | { | 85 | { |
85 | public: | 86 | public: |
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 | ||