File indexing completed on 2024-05-12 05:10:40

0001 /*
0002     SPDX-FileCopyrightText: 2022 Volker Krause <vkrause@kde.org>
0003     SPDX-License-Identifier: LGPL-2.0-or-later
0004 */
0005 
0006 #include "singlecollectioncalendar.h"
0007 
0008 #include "../src/calendarbase_p.h"
0009 
0010 #include <Akonadi/CalendarUtils>
0011 #include <Akonadi/ItemFetchJob>
0012 #include <Akonadi/ItemFetchScope>
0013 #include <Akonadi/Monitor>
0014 
0015 SingleCollectionCalendar::SingleCollectionCalendar(const Akonadi::Collection &col, QObject *parent)
0016     : Akonadi::CalendarBase(parent)
0017 {
0018     setCollection(col);
0019 
0020     incidenceChanger()->setDefaultCollection(col);
0021     incidenceChanger()->setGroupwareCommunication(false);
0022     incidenceChanger()->setDestinationPolicy(Akonadi::IncidenceChanger::DestinationPolicyNeverAsk);
0023     setIsLoading(true);
0024 
0025     // here and below for monitoring: ensure items have a parent collection
0026     // before calling internalInsert to prevent an extra collection fetch job
0027     auto job = new Akonadi::ItemFetchJob(col, this);
0028     job->fetchScope().fetchFullPayload();
0029     connect(job, &Akonadi::ItemFetchJob::finished, this, [this, job]() {
0030         Q_D(Akonadi::CalendarBase);
0031         const auto items = job->items();
0032         for (auto item : items) {
0033             item.setParentCollection(m_collection);
0034             d->internalInsert(item);
0035         }
0036         setIsLoading(false);
0037     });
0038 
0039     auto monitor = new Akonadi::Monitor(this);
0040     monitor->setCollectionMonitored(m_collection, true);
0041     monitor->setItemFetchScope(job->fetchScope());
0042     connect(monitor, &Akonadi::Monitor::itemAdded, this, [this](Akonadi::Item item) {
0043         Q_D(Akonadi::CalendarBase);
0044         item.setParentCollection(m_collection);
0045         d->internalInsert(item);
0046     });
0047     connect(monitor, &Akonadi::Monitor::itemChanged, this, [this](Akonadi::Item item) {
0048         Q_D(Akonadi::CalendarBase);
0049         item.setParentCollection(m_collection);
0050         d->internalInsert(item);
0051     });
0052     connect(monitor, &Akonadi::Monitor::itemRemoved, this, [this](const Akonadi::Item &item) {
0053         Q_D(Akonadi::CalendarBase);
0054         d->internalRemove(item);
0055     });
0056 }
0057 
0058 SingleCollectionCalendar::~SingleCollectionCalendar() = default;
0059 
0060 Akonadi::Collection SingleCollectionCalendar::collection() const
0061 {
0062     return m_collection;
0063 }
0064 
0065 void SingleCollectionCalendar::setCollection(const Akonadi::Collection &c)
0066 {
0067     Q_ASSERT(c.id() == m_collection.id() || !m_collection.isValid());
0068     m_collection = c;
0069 
0070     setName(Akonadi::CalendarUtils::displayName(m_collection));
0071     setAccessMode((m_collection.rights() & (Akonadi::Collection::CanCreateItem | Akonadi::Collection::CanChangeItem)) ? KCalendarCore::ReadWrite
0072                                                                                                                       : KCalendarCore::ReadOnly);
0073 }
0074 
0075 bool SingleCollectionCalendar::addEvent(const KCalendarCore::Event::Ptr &event)
0076 {
0077     if (m_collection.contentMimeTypes().contains(event->mimeType()) || m_collection.contentMimeTypes().contains(QLatin1StringView("text/calendar"))) {
0078         return CalendarBase::addEvent(event);
0079     }
0080     return false;
0081 }
0082 
0083 bool SingleCollectionCalendar::addTodo(const KCalendarCore::Todo::Ptr &todo)
0084 {
0085     if (m_collection.contentMimeTypes().contains(todo->mimeType()) || m_collection.contentMimeTypes().contains(QLatin1StringView("text/calendar"))) {
0086         return CalendarBase::addTodo(todo);
0087     }
0088     return false;
0089 }
0090 
0091 bool SingleCollectionCalendar::addJournal(const KCalendarCore::Journal::Ptr &journal)
0092 {
0093     if (m_collection.contentMimeTypes().contains(journal->mimeType()) || m_collection.contentMimeTypes().contains(QLatin1StringView("text/calendar"))) {
0094         return CalendarBase::addJournal(journal);
0095     }
0096     return false;
0097 }