From 7abd447ee1b9b5dcfaa60e1e94f79b81aaeab444 Mon Sep 17 00:00:00 2001 From: Christian Mollekopf Date: Sun, 8 May 2016 12:15:47 +0200 Subject: Create a drafts folder on start, and then move any draft in there. --- examples/maildirresource/maildirresource.cpp | 58 ++++++++++++++++++++++++++-- examples/maildirresource/maildirresource.h | 1 + 2 files changed, 55 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 @@ #undef DEBUG_AREA #define DEBUG_AREA "resource.maildir" +class FolderUpdater : public Sink::Preprocessor +{ +public: + FolderUpdater(const QByteArray &drafts) : mDraftsFolder(drafts) {} + + void newEntity(const QByteArray &uid, qint64 revision, Sink::ApplicationDomain::BufferAdaptor &newEntity, Sink::Storage::Transaction &transaction) Q_DECL_OVERRIDE + { + if (newEntity.getProperty("draft").toBool()) { + newEntity.setProperty("folder", mDraftsFolder); + } + } + + void modifiedEntity(const QByteArray &uid, qint64 revision, const Sink::ApplicationDomain::BufferAdaptor &oldEntity, Sink::ApplicationDomain::BufferAdaptor &newEntity, + Sink::Storage::Transaction &transaction) Q_DECL_OVERRIDE + { + } + + void deletedEntity(const QByteArray &uid, qint64 revision, const Sink::ApplicationDomain::BufferAdaptor &oldEntity, Sink::Storage::Transaction &transaction) Q_DECL_OVERRIDE + { + } + QByteArray mDraftsFolder; +}; + MaildirResource::MaildirResource(const QByteArray &instanceIdentifier, const QSharedPointer &pipeline) : Sink::GenericResource(instanceIdentifier, pipeline), mMailAdaptorFactory(QSharedPointer::create()), mFolderAdaptorFactory(QSharedPointer::create()) { - addType(ENTITY_TYPE_MAIL, mMailAdaptorFactory, - QVector() << new DefaultIndexUpdater); - addType(ENTITY_TYPE_FOLDER, mFolderAdaptorFactory, - QVector() << new DefaultIndexUpdater); auto config = ResourceConfig::getConfiguration(instanceIdentifier); mMaildirPath = QDir::cleanPath(QDir::fromNativeSeparators(config.value("path").toString())); //Chop a trailing slash if necessary if (mMaildirPath.endsWith("/")) { mMaildirPath.chop(1); } + + auto folderUpdater = new FolderUpdater(QByteArray()); + addType(ENTITY_TYPE_MAIL, mMailAdaptorFactory, + QVector() << new DefaultIndexUpdater << folderUpdater); + addType(ENTITY_TYPE_FOLDER, mFolderAdaptorFactory, + QVector() << new DefaultIndexUpdater); + + KPIM::Maildir dir(mMaildirPath, true); + mDraftsFolder = dir.addSubFolder("drafts"); Trace() << "Started maildir resource for maildir: " << mMaildirPath; + auto mainStore = QSharedPointer::create(Sink::storageLocation(), mResourceInstanceIdentifier, Sink::Storage::ReadOnly); + auto syncStore = QSharedPointer::create(Sink::storageLocation(), mResourceInstanceIdentifier + ".synchronization", Sink::Storage::ReadWrite); + auto transaction = mainStore->createTransaction(Sink::Storage::ReadOnly); + auto synchronizationTransaction = syncStore->createTransaction(Sink::Storage::ReadWrite); + + auto folderPath = mDraftsFolder; + auto remoteId = folderPath.toUtf8(); + auto bufferType = ENTITY_TYPE_FOLDER; + KPIM::Maildir md(folderPath, folderPath == mMaildirPath); + Sink::ApplicationDomain::Folder folder; + folder.setProperty("name", md.name()); + folder.setProperty("icon", "folder"); + + if (!md.isRoot()) { + folder.setProperty("parent", resolveRemoteId(ENTITY_TYPE_FOLDER, md.parent().path().toUtf8(), synchronizationTransaction)); + } + createOrModify(transaction, synchronizationTransaction, *mFolderAdaptorFactory, bufferType, remoteId, folder); + + auto draftsFolderLocalId = resolveRemoteId(ENTITY_TYPE_FOLDER, mDraftsFolder.toUtf8(), synchronizationTransaction); + synchronizationTransaction.commit(); + + folderUpdater->mDraftsFolder = draftsFolderLocalId; } static QStringList listRecursive( const QString &root, const KPIM::Maildir &dir ) diff --git a/examples/maildirresource/maildirresource.h b/examples/maildirresource/maildirresource.h index 32eb88c..2afd0ed 100644 --- a/examples/maildirresource/maildirresource.h +++ b/examples/maildirresource/maildirresource.h @@ -56,6 +56,7 @@ private: void synchronizeMails(Sink::Storage::Transaction &transaction, Sink::Storage::Transaction &synchronizationTransaction, const QString &folder); QStringList listAvailableFolders(); QString mMaildirPath; + QString mDraftsFolder; QSharedPointer mMailAdaptorFactory; QSharedPointer mFolderAdaptorFactory; }; -- cgit v1.2.3