summaryrefslogtreecommitdiffstats
path: root/examples/maildirresource/maildirresource.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'examples/maildirresource/maildirresource.cpp')
-rw-r--r--examples/maildirresource/maildirresource.cpp58
1 files changed, 54 insertions, 4 deletions
diff --git a/examples/maildirresource/maildirresource.cpp b/examples/maildirresource/maildirresource.cpp
index 2ad45cd..7ac4b08 100644
--- a/examples/maildirresource/maildirresource.cpp
+++ b/examples/maildirresource/maildirresource.cpp
@@ -49,22 +49,72 @@
49#undef DEBUG_AREA 49#undef DEBUG_AREA
50#define DEBUG_AREA "resource.maildir" 50#define DEBUG_AREA "resource.maildir"
51 51
52class FolderUpdater : public Sink::Preprocessor
53{
54public:
55 FolderUpdater(const QByteArray &drafts) : mDraftsFolder(drafts) {}
56
57 void newEntity(const QByteArray &uid, qint64 revision, Sink::ApplicationDomain::BufferAdaptor &newEntity, Sink::Storage::Transaction &transaction) Q_DECL_OVERRIDE
58 {
59 if (newEntity.getProperty("draft").toBool()) {
60 newEntity.setProperty("folder", mDraftsFolder);
61 }
62 }
63
64 void modifiedEntity(const QByteArray &uid, qint64 revision, const Sink::ApplicationDomain::BufferAdaptor &oldEntity, Sink::ApplicationDomain::BufferAdaptor &newEntity,
65 Sink::Storage::Transaction &transaction) Q_DECL_OVERRIDE
66 {
67 }
68
69 void deletedEntity(const QByteArray &uid, qint64 revision, const Sink::ApplicationDomain::BufferAdaptor &oldEntity, Sink::Storage::Transaction &transaction) Q_DECL_OVERRIDE
70 {
71 }
72 QByteArray mDraftsFolder;
73};
74
52MaildirResource::MaildirResource(const QByteArray &instanceIdentifier, const QSharedPointer<Sink::Pipeline> &pipeline) 75MaildirResource::MaildirResource(const QByteArray &instanceIdentifier, const QSharedPointer<Sink::Pipeline> &pipeline)
53 : Sink::GenericResource(instanceIdentifier, pipeline), 76 : Sink::GenericResource(instanceIdentifier, pipeline),
54 mMailAdaptorFactory(QSharedPointer<MaildirMailAdaptorFactory>::create()), 77 mMailAdaptorFactory(QSharedPointer<MaildirMailAdaptorFactory>::create()),
55 mFolderAdaptorFactory(QSharedPointer<MaildirFolderAdaptorFactory>::create()) 78 mFolderAdaptorFactory(QSharedPointer<MaildirFolderAdaptorFactory>::create())
56{ 79{
57 addType(ENTITY_TYPE_MAIL, mMailAdaptorFactory,
58 QVector<Sink::Preprocessor*>() << new DefaultIndexUpdater<Sink::ApplicationDomain::Mail>);
59 addType(ENTITY_TYPE_FOLDER, mFolderAdaptorFactory,
60 QVector<Sink::Preprocessor*>() << new DefaultIndexUpdater<Sink::ApplicationDomain::Folder>);
61 auto config = ResourceConfig::getConfiguration(instanceIdentifier); 80 auto config = ResourceConfig::getConfiguration(instanceIdentifier);
62 mMaildirPath = QDir::cleanPath(QDir::fromNativeSeparators(config.value("path").toString())); 81 mMaildirPath = QDir::cleanPath(QDir::fromNativeSeparators(config.value("path").toString()));
63 //Chop a trailing slash if necessary 82 //Chop a trailing slash if necessary
64 if (mMaildirPath.endsWith("/")) { 83 if (mMaildirPath.endsWith("/")) {
65 mMaildirPath.chop(1); 84 mMaildirPath.chop(1);
66 } 85 }
86
87 auto folderUpdater = new FolderUpdater(QByteArray());
88 addType(ENTITY_TYPE_MAIL, mMailAdaptorFactory,
89 QVector<Sink::Preprocessor*>() << new DefaultIndexUpdater<Sink::ApplicationDomain::Mail> << folderUpdater);
90 addType(ENTITY_TYPE_FOLDER, mFolderAdaptorFactory,
91 QVector<Sink::Preprocessor*>() << new DefaultIndexUpdater<Sink::ApplicationDomain::Folder>);
92
93 KPIM::Maildir dir(mMaildirPath, true);
94 mDraftsFolder = dir.addSubFolder("drafts");
67 Trace() << "Started maildir resource for maildir: " << mMaildirPath; 95 Trace() << "Started maildir resource for maildir: " << mMaildirPath;
96 auto mainStore = QSharedPointer<Sink::Storage>::create(Sink::storageLocation(), mResourceInstanceIdentifier, Sink::Storage::ReadOnly);
97 auto syncStore = QSharedPointer<Sink::Storage>::create(Sink::storageLocation(), mResourceInstanceIdentifier + ".synchronization", Sink::Storage::ReadWrite);
98 auto transaction = mainStore->createTransaction(Sink::Storage::ReadOnly);
99 auto synchronizationTransaction = syncStore->createTransaction(Sink::Storage::ReadWrite);
100
101 auto folderPath = mDraftsFolder;
102 auto remoteId = folderPath.toUtf8();
103 auto bufferType = ENTITY_TYPE_FOLDER;
104 KPIM::Maildir md(folderPath, folderPath == mMaildirPath);
105 Sink::ApplicationDomain::Folder folder;
106 folder.setProperty("name", md.name());
107 folder.setProperty("icon", "folder");
108
109 if (!md.isRoot()) {
110 folder.setProperty("parent", resolveRemoteId(ENTITY_TYPE_FOLDER, md.parent().path().toUtf8(), synchronizationTransaction));
111 }
112 createOrModify(transaction, synchronizationTransaction, *mFolderAdaptorFactory, bufferType, remoteId, folder);
113
114 auto draftsFolderLocalId = resolveRemoteId(ENTITY_TYPE_FOLDER, mDraftsFolder.toUtf8(), synchronizationTransaction);
115 synchronizationTransaction.commit();
116
117 folderUpdater->mDraftsFolder = draftsFolderLocalId;
68} 118}
69 119
70static QStringList listRecursive( const QString &root, const KPIM::Maildir &dir ) 120static QStringList listRecursive( const QString &root, const KPIM::Maildir &dir )