File indexing completed on 2024-06-16 04:50:15

0001 /*
0002     SPDX-FileCopyrightText: 2006-2007 Volker Krause <vkrause@kde.org>
0003 
0004     SPDX-License-Identifier: LGPL-2.0-or-later
0005 */
0006 
0007 #include "monitor.h"
0008 #include "monitor_p.h"
0009 
0010 #include "changemediator_p.h"
0011 #include "collectionfetchscope.h"
0012 #include "session.h"
0013 
0014 #include "shared/akranges.h"
0015 
0016 #include <QMetaMethod>
0017 
0018 using namespace Akonadi;
0019 using namespace AkRanges;
0020 
0021 Monitor::Monitor(QObject *parent)
0022     : QObject(parent)
0023     , d_ptr(new MonitorPrivate(nullptr, this))
0024 {
0025     d_ptr->init();
0026     d_ptr->connectToNotificationManager();
0027 
0028     ChangeMediator::registerMonitor(this);
0029 }
0030 
0031 /// @cond PRIVATE
0032 Monitor::Monitor(MonitorPrivate *d, QObject *parent)
0033     : QObject(parent)
0034     , d_ptr(d)
0035 {
0036     d_ptr->init();
0037     d_ptr->connectToNotificationManager();
0038 
0039     ChangeMediator::registerMonitor(this);
0040 }
0041 /// @endcond
0042 
0043 Monitor::~Monitor()
0044 {
0045     ChangeMediator::unregisterMonitor(this);
0046 }
0047 
0048 void Monitor::setCollectionMonitored(const Collection &collection, bool monitored)
0049 {
0050     Q_D(Monitor);
0051     if (!d->collections.contains(collection) && monitored) {
0052         d->collections << collection;
0053         d->pendingModification.startMonitoringCollection(collection.id());
0054         d->scheduleSubscriptionUpdate();
0055     } else if (!monitored) {
0056         if (d->collections.removeAll(collection)) {
0057             d->pendingModification.stopMonitoringCollection(collection.id());
0058             d->scheduleSubscriptionUpdate();
0059         }
0060     }
0061 
0062     Q_EMIT collectionMonitored(collection, monitored); // NOLINT(readability-misleading-indentation): false positive
0063 }
0064 
0065 void Monitor::setItemMonitored(const Item &item, bool monitored)
0066 {
0067     Q_D(Monitor);
0068     if (!d->items.contains(item.id()) && monitored) {
0069         d->items.insert(item.id());
0070         d->pendingModification.startMonitoringItem(item.id());
0071         d->scheduleSubscriptionUpdate();
0072     } else if (!monitored) {
0073         if (d->items.remove(item.id())) {
0074             d->pendingModification.stopMonitoringItem(item.id());
0075             d->scheduleSubscriptionUpdate();
0076         }
0077     }
0078 
0079     Q_EMIT itemMonitored(item, monitored); // NOLINT(readability-misleading-indentation): false positive
0080 }
0081 
0082 void Monitor::setResourceMonitored(const QByteArray &resource, bool monitored)
0083 {
0084     Q_D(Monitor);
0085     if (!d->resources.contains(resource) && monitored) {
0086         d->resources.insert(resource);
0087         d->pendingModification.startMonitoringResource(resource);
0088         d->scheduleSubscriptionUpdate();
0089     } else if (!monitored) {
0090         if (d->resources.remove(resource)) {
0091             d->pendingModification.stopMonitoringResource(resource);
0092             d->scheduleSubscriptionUpdate();
0093         }
0094     }
0095 
0096     Q_EMIT resourceMonitored(resource, monitored); // NOLINT(readability-misleading-indentation): false positive
0097 }
0098 
0099 void Monitor::setMimeTypeMonitored(const QString &mimetype, bool monitored)
0100 {
0101     Q_D(Monitor);
0102     if (!d->mimetypes.contains(mimetype) && monitored) {
0103         d->mimetypes.insert(mimetype);
0104         d->pendingModification.startMonitoringMimeType(mimetype);
0105         d->scheduleSubscriptionUpdate();
0106     } else if (!monitored) {
0107         if (d->mimetypes.remove(mimetype)) {
0108             d->pendingModification.stopMonitoringMimeType(mimetype);
0109             d->scheduleSubscriptionUpdate();
0110         }
0111     }
0112 
0113     Q_EMIT mimeTypeMonitored(mimetype, monitored); // NOLINT(readability-misleading-indentation): false positive
0114 }
0115 
0116 void Monitor::setTagMonitored(const Akonadi::Tag &tag, bool monitored)
0117 {
0118     Q_D(Monitor);
0119     if (!d->tags.contains(tag.id()) && monitored) {
0120         d->tags.insert(tag.id());
0121         d->pendingModification.startMonitoringTag(tag.id());
0122         d->scheduleSubscriptionUpdate();
0123     } else if (!monitored) {
0124         if (d->tags.remove(tag.id())) {
0125             d->pendingModification.stopMonitoringTag(tag.id());
0126             d->scheduleSubscriptionUpdate();
0127         }
0128     }
0129 
0130     Q_EMIT tagMonitored(tag, monitored); // NOLINT(readability-misleading-indentation): false positive
0131 }
0132 
0133 void Monitor::setTypeMonitored(Monitor::Type type, bool monitored)
0134 {
0135     Q_D(Monitor);
0136     if (!d->types.contains(type) && monitored) {
0137         d->types.insert(type);
0138         d->pendingModification.startMonitoringType(MonitorPrivate::monitorTypeToProtocol(type));
0139         d->scheduleSubscriptionUpdate();
0140     } else if (!monitored) {
0141         if (d->types.remove(type)) {
0142             d->pendingModification.stopMonitoringType(MonitorPrivate::monitorTypeToProtocol(type));
0143             d->scheduleSubscriptionUpdate();
0144         }
0145     }
0146 
0147     Q_EMIT typeMonitored(type, monitored); // NOLINT(readability-misleading-indentation): false positive
0148 }
0149 
0150 void Akonadi::Monitor::setAllMonitored(bool monitored)
0151 {
0152     Q_D(Monitor);
0153     if (d->monitorAll == monitored) {
0154         return;
0155     }
0156 
0157     d->monitorAll = monitored;
0158 
0159     d->pendingModification.setAllMonitored(monitored);
0160     d->scheduleSubscriptionUpdate();
0161 
0162     Q_EMIT allMonitored(monitored);
0163 }
0164 
0165 void Monitor::setExclusive(bool exclusive)
0166 {
0167     Q_D(Monitor);
0168     d->exclusive = exclusive;
0169     d->pendingModification.setIsExclusive(exclusive);
0170     d->scheduleSubscriptionUpdate();
0171 }
0172 
0173 bool Monitor::exclusive() const
0174 {
0175     Q_D(const Monitor);
0176     return d->exclusive;
0177 }
0178 
0179 void Monitor::ignoreSession(Session *session)
0180 {
0181     Q_D(Monitor);
0182 
0183     if (!d->sessions.contains(session->sessionId())) {
0184         d->sessions << session->sessionId();
0185         connect(session, &Session::destroyed, this, [d](QObject *o) {
0186             d->slotSessionDestroyed(o);
0187         });
0188         d->pendingModification.startIgnoringSession(session->sessionId());
0189         d->scheduleSubscriptionUpdate();
0190     }
0191 }
0192 
0193 void Monitor::fetchCollection(bool enable)
0194 {
0195     Q_D(Monitor);
0196     d->fetchCollection = enable;
0197 }
0198 
0199 void Monitor::fetchCollectionStatistics(bool enable)
0200 {
0201     Q_D(Monitor);
0202     d->fetchCollectionStatistics = enable;
0203 }
0204 
0205 void Monitor::setItemFetchScope(const ItemFetchScope &fetchScope)
0206 {
0207     Q_D(Monitor);
0208     d->mItemFetchScope = fetchScope;
0209     d->pendingModificationChanges |= Protocol::ModifySubscriptionCommand::ItemFetchScope;
0210     d->scheduleSubscriptionUpdate();
0211 }
0212 
0213 ItemFetchScope &Monitor::itemFetchScope()
0214 {
0215     Q_D(Monitor);
0216     d->pendingModificationChanges |= Protocol::ModifySubscriptionCommand::ItemFetchScope;
0217     d->scheduleSubscriptionUpdate();
0218     return d->mItemFetchScope;
0219 }
0220 
0221 void Monitor::fetchChangedOnly(bool enable)
0222 {
0223     Q_D(Monitor);
0224     d->mFetchChangedOnly = enable;
0225 }
0226 
0227 void Monitor::setCollectionFetchScope(const CollectionFetchScope &fetchScope)
0228 {
0229     Q_D(Monitor);
0230     d->mCollectionFetchScope = fetchScope;
0231     d->pendingModificationChanges |= Protocol::ModifySubscriptionCommand::CollectionFetchScope;
0232     d->scheduleSubscriptionUpdate();
0233 }
0234 
0235 CollectionFetchScope &Monitor::collectionFetchScope()
0236 {
0237     Q_D(Monitor);
0238     d->pendingModificationChanges |= Protocol::ModifySubscriptionCommand::CollectionFetchScope;
0239     d->scheduleSubscriptionUpdate();
0240     return d->mCollectionFetchScope;
0241 }
0242 
0243 void Monitor::setTagFetchScope(const TagFetchScope &fetchScope)
0244 {
0245     Q_D(Monitor);
0246     d->mTagFetchScope = fetchScope;
0247     d->pendingModificationChanges |= Protocol::ModifySubscriptionCommand::TagFetchScope;
0248     d->scheduleSubscriptionUpdate();
0249 }
0250 
0251 TagFetchScope &Monitor::tagFetchScope()
0252 {
0253     Q_D(Monitor);
0254     d->pendingModificationChanges |= Protocol::ModifySubscriptionCommand::TagFetchScope;
0255     d->scheduleSubscriptionUpdate();
0256     return d->mTagFetchScope;
0257 }
0258 
0259 Akonadi::Collection::List Monitor::collectionsMonitored() const
0260 {
0261     Q_D(const Monitor);
0262     return d->collections;
0263 }
0264 
0265 QList<Item::Id> Monitor::itemsMonitoredEx() const
0266 {
0267     Q_D(const Monitor);
0268     QList<Item::Id> result;
0269     result.reserve(d->items.size());
0270     std::copy(d->items.begin(), d->items.end(), std::back_inserter(result));
0271     return result;
0272 }
0273 
0274 int Monitor::numItemsMonitored() const
0275 {
0276     Q_D(const Monitor);
0277     return d->items.size();
0278 }
0279 
0280 QList<Tag::Id> Monitor::tagsMonitored() const
0281 {
0282     Q_D(const Monitor);
0283     QList<Tag::Id> result;
0284     result.reserve(d->tags.size());
0285     std::copy(d->tags.begin(), d->tags.end(), std::back_inserter(result));
0286     return result;
0287 }
0288 
0289 QList<Monitor::Type> Monitor::typesMonitored() const
0290 {
0291     Q_D(const Monitor);
0292     QList<Monitor::Type> result;
0293     result.reserve(d->types.size());
0294     std::copy(d->types.begin(), d->types.end(), std::back_inserter(result));
0295     return result;
0296 }
0297 
0298 QStringList Monitor::mimeTypesMonitored() const
0299 {
0300     Q_D(const Monitor);
0301     return d->mimetypes | Actions::toQList;
0302 }
0303 
0304 int Monitor::numMimeTypesMonitored() const
0305 {
0306     Q_D(const Monitor);
0307     return d->mimetypes.count();
0308 }
0309 
0310 QList<QByteArray> Monitor::resourcesMonitored() const
0311 {
0312     Q_D(const Monitor);
0313     return d->resources | Actions::toQList;
0314 }
0315 
0316 int Monitor::numResourcesMonitored() const
0317 {
0318     Q_D(const Monitor);
0319     return d->resources.count();
0320 }
0321 
0322 bool Monitor::isAllMonitored() const
0323 {
0324     Q_D(const Monitor);
0325     return d->monitorAll;
0326 }
0327 
0328 void Monitor::setSession(Akonadi::Session *session)
0329 {
0330     Q_D(Monitor);
0331     if (session == d->session) {
0332         return;
0333     }
0334 
0335     if (!session) {
0336         d->session = Session::defaultSession();
0337     } else {
0338         d->session = session;
0339     }
0340 
0341     d->itemCache->setSession(d->session);
0342     d->collectionCache->setSession(d->session);
0343     d->tagCache->setSession(d->session);
0344 
0345     // Reconnect with a new session
0346     d->connectToNotificationManager();
0347 }
0348 
0349 Session *Monitor::session() const
0350 {
0351     Q_D(const Monitor);
0352     return d->session;
0353 }
0354 
0355 void Monitor::setCollectionMoveTranslationEnabled(bool enabled)
0356 {
0357     Q_D(Monitor);
0358     d->collectionMoveTranslationEnabled = enabled;
0359 }
0360 
0361 void Monitor::connectNotify(const QMetaMethod &signal)
0362 {
0363     Q_D(Monitor);
0364     d->updateListeners(signal, MonitorPrivate::AddListener);
0365 }
0366 
0367 void Monitor::disconnectNotify(const QMetaMethod &signal)
0368 {
0369     Q_D(Monitor);
0370     d->updateListeners(signal, MonitorPrivate::RemoveListener);
0371 }
0372 
0373 #include "moc_monitor.cpp"