summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorChristian Mollekopf <chrigi_1@fastmail.fm>2016-06-15 18:43:05 +0200
committerChristian Mollekopf <chrigi_1@fastmail.fm>2016-06-15 20:31:43 +0200
commit456b850448bc306e9e1608fd1707ab9ceeb08c1e (patch)
treecccf3cfee29216fba3af182a15b2a9b6f78fb753
parent3a3545ac93e0b310dfb6c6da5f83df1f26dff8a6 (diff)
downloadsink-456b850448bc306e9e1608fd1707ab9ceeb08c1e.tar.gz
sink-456b850448bc306e9e1608fd1707ab9ceeb08c1e.zip
Move to trash
-rw-r--r--common/domain/applicationdomaintype.cpp2
-rw-r--r--common/domain/mail.cpp2
-rw-r--r--examples/imapresource/imapresource.cpp47
3 files changed, 30 insertions, 21 deletions
diff --git a/common/domain/applicationdomaintype.cpp b/common/domain/applicationdomaintype.cpp
index 4db2e3b..df63c35 100644
--- a/common/domain/applicationdomaintype.cpp
+++ b/common/domain/applicationdomaintype.cpp
@@ -275,7 +275,7 @@ namespace ImapResource {
275 auto &&resource = ApplicationDomainType::createEntity<SinkResource>(); 275 auto &&resource = ApplicationDomainType::createEntity<SinkResource>();
276 resource.setProperty("type", "org.kde.imap"); 276 resource.setProperty("type", "org.kde.imap");
277 resource.setProperty("account", account); 277 resource.setProperty("account", account);
278 resource.setProperty("capabilities", QVariant::fromValue(QByteArrayList() << ResourceCapabilities::Mail::storage << ResourceCapabilities::Mail::drafts << ResourceCapabilities::Mail::folderhierarchy)); 278 resource.setProperty("capabilities", QVariant::fromValue(QByteArrayList() << ResourceCapabilities::Mail::storage << ResourceCapabilities::Mail::drafts << ResourceCapabilities::Mail::folderhierarchy << ResourceCapabilities::Mail::trash));
279 return resource; 279 return resource;
280 } 280 }
281} 281}
diff --git a/common/domain/mail.cpp b/common/domain/mail.cpp
index 706e410..dd4eca8 100644
--- a/common/domain/mail.cpp
+++ b/common/domain/mail.cpp
@@ -85,6 +85,7 @@ QSharedPointer<ReadPropertyMapper<TypeImplementation<Mail>::Buffer> > TypeImplem
85 propertyMapper->addMapping<Mail::Folder, Buffer>(&Buffer::folder); 85 propertyMapper->addMapping<Mail::Folder, Buffer>(&Buffer::folder);
86 propertyMapper->addMapping<Mail::MimeMessage, Buffer>(&Buffer::mimeMessage); 86 propertyMapper->addMapping<Mail::MimeMessage, Buffer>(&Buffer::mimeMessage);
87 propertyMapper->addMapping<Mail::Draft, Buffer>(&Buffer::draft); 87 propertyMapper->addMapping<Mail::Draft, Buffer>(&Buffer::draft);
88 propertyMapper->addMapping<Mail::Trash, Buffer>(&Buffer::trash);
88 return propertyMapper; 89 return propertyMapper;
89} 90}
90 91
@@ -102,5 +103,6 @@ QSharedPointer<WritePropertyMapper<TypeImplementation<Mail>::BufferBuilder> > Ty
102 propertyMapper->addMapping<Mail::Folder>(&BufferBuilder::add_folder); 103 propertyMapper->addMapping<Mail::Folder>(&BufferBuilder::add_folder);
103 propertyMapper->addMapping<Mail::MimeMessage>(&BufferBuilder::add_mimeMessage); 104 propertyMapper->addMapping<Mail::MimeMessage>(&BufferBuilder::add_mimeMessage);
104 propertyMapper->addMapping<Mail::Draft>(&BufferBuilder::add_draft); 105 propertyMapper->addMapping<Mail::Draft>(&BufferBuilder::add_draft);
106 propertyMapper->addMapping<Mail::Trash>(&BufferBuilder::add_trash);
105 return propertyMapper; 107 return propertyMapper;
106} 108}
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