From 00a4b8b6a90539f42334a489e8e44a3d0e5a246c Mon Sep 17 00:00:00 2001 From: Aaron Seigo Date: Wed, 23 Dec 2015 20:21:23 +0100 Subject: some useful common utilities --- akonadi2_cli/akonadish_utils.cpp | 74 ++++++++++++++++++++++++++++++++++++ akonadi2_cli/akonadish_utils.h | 81 ++++++++++++++++++++++++++++++++++++++++ 2 files changed, 155 insertions(+) create mode 100644 akonadi2_cli/akonadish_utils.cpp create mode 100644 akonadi2_cli/akonadish_utils.h diff --git a/akonadi2_cli/akonadish_utils.cpp b/akonadi2_cli/akonadish_utils.cpp new file mode 100644 index 0000000..bfb72ca --- /dev/null +++ b/akonadi2_cli/akonadish_utils.cpp @@ -0,0 +1,74 @@ +/* + * Copyright (C) 2015 Aaron Seigo + * Copyright (C) 2015 Christian Mollekopf + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the + * Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + */ + +#include "akonadish_utils.h" + +#include "common/clientapi.h" + +namespace AkonadishUtils +{ + +bool isValidStoreType(const QString &type) +{ + static const QSet types = QSet() << "folder" << "mail" << "event" << "resource"; + return types.contains(type); +} + +StoreBase &getStore(const QString &type) +{ + if (type == "folder") { + static Store store; + return store; + } else if (type == "mail") { + static Store store; + return store; + } else if (type == "event") { + static Store store; + return store; + } else if (type == "resource") { + static Store store; + return store; + } + + //TODO: reinstate the warning+assert + //Q_ASSERT(false); + //qWarning() << "Trying to get a store that doesn't exist, falling back to event"; + static Store store; + return store; +} + +QSharedPointer loadModel(const QString &type, Akonadi2::Query query) +{ + if (type == "folder") { + query.requestedProperties << "name" << "parent"; + } else if (type == "mail") { + query.requestedProperties << "subject" << "folder" << "date"; + } else if (type == "event") { + query.requestedProperties << "summary"; + } else if (type == "resource") { + query.requestedProperties << "type"; + } + auto model = getStore(type).loadModel(query); + Q_ASSERT(model); + return model; +} + +} + diff --git a/akonadi2_cli/akonadish_utils.h b/akonadi2_cli/akonadish_utils.h new file mode 100644 index 0000000..c15162f --- /dev/null +++ b/akonadi2_cli/akonadish_utils.h @@ -0,0 +1,81 @@ +/* + * Copyright (C) 2015 Aaron Seigo + * Copyright (C) 2015 Christian Mollekopf + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the + * Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + */ + +#pragma once + +#include +#include + +#include "common/query.h" +#include "common/clientapi.h" + +namespace AkonadishUtils +{ + +class StoreBase; + +bool isValidStoreType(const QString &type); +StoreBase &getStore(const QString &type); +QSharedPointer loadModel(const QString &type, Akonadi2::Query query); + +/** + * A small abstraction layer to use the akonadi store with the type available as string. + */ +class StoreBase { +public: + virtual Akonadi2::ApplicationDomain::ApplicationDomainType::Ptr getObject() = 0; + virtual Akonadi2::ApplicationDomain::ApplicationDomainType::Ptr getObject(const QByteArray &resourceInstanceIdentifier, const QByteArray &identifier = QByteArray()) = 0; + virtual KAsync::Job create(const Akonadi2::ApplicationDomain::ApplicationDomainType &type) = 0; + virtual KAsync::Job modify(const Akonadi2::ApplicationDomain::ApplicationDomainType &type) = 0; + virtual KAsync::Job remove(const Akonadi2::ApplicationDomain::ApplicationDomainType &type) = 0; + virtual QSharedPointer loadModel(const Akonadi2::Query &query) = 0; +}; + +template +class Store : public StoreBase { +public: + Akonadi2::ApplicationDomain::ApplicationDomainType::Ptr getObject() Q_DECL_OVERRIDE { + return T::Ptr::create(); + } + + Akonadi2::ApplicationDomain::ApplicationDomainType::Ptr getObject(const QByteArray &resourceInstanceIdentifier, const QByteArray &identifier = QByteArray()) Q_DECL_OVERRIDE { + return T::Ptr::create(resourceInstanceIdentifier, identifier, 0, QSharedPointer::create()); + } + + KAsync::Job create(const Akonadi2::ApplicationDomain::ApplicationDomainType &type) Q_DECL_OVERRIDE { + return Akonadi2::Store::create(*static_cast(&type)); + } + + KAsync::Job modify(const Akonadi2::ApplicationDomain::ApplicationDomainType &type) Q_DECL_OVERRIDE { + return Akonadi2::Store::modify(*static_cast(&type)); + } + + KAsync::Job remove(const Akonadi2::ApplicationDomain::ApplicationDomainType &type) Q_DECL_OVERRIDE { + return Akonadi2::Store::remove(*static_cast(&type)); + } + + QSharedPointer loadModel(const Akonadi2::Query &query) Q_DECL_OVERRIDE { + return Akonadi2::Store::loadModel(query); + } +}; + + +} + -- cgit v1.2.3