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 }