File indexing completed on 2025-02-02 05:17:49

0001 /*
0002  *   SPDX-FileCopyrightText: 2011, 2012, 2013, 2014 Ivan Cukic <ivan.cukic(at)kde.org>
0003  *
0004  *   SPDX-License-Identifier: GPL-2.0-or-later
0005  */
0006 
0007 #pragma once
0008 
0009 // Qt
0010 #include <QObject>
0011 #include <QSqlQuery>
0012 #include <QTimer>
0013 #include <QRegularExpression>
0014 // STL
0015 #include <memory>
0016 
0017 // Local
0018 #include <Plugin.h>
0019 
0020 class ResourceLinking;
0021 
0022 /**
0023  * Communication with the outer world.
0024  *
0025  * - Handles configuration
0026  * - Filters the events based on the user's configuration.
0027  */
0028 class StatsPlugin : public Plugin
0029 {
0030     Q_OBJECT
0031     // Q_CLASSINFO("D-Bus Interface", "org.kde.ActivityManager.Resources.Scoring")
0032 
0033 public:
0034     explicit StatsPlugin(QObject *parent);
0035 
0036     static StatsPlugin *self();
0037 
0038     bool init(QHash<QString, QObject *> &modules) override;
0039 
0040     QString currentActivity() const;
0041     QStringList listActivities() const;
0042 
0043     inline QObject *activitiesInterface() const
0044     {
0045         return m_activities;
0046     }
0047 
0048     bool isFeatureOperational(const QStringList &feature) const override;
0049     QStringList listFeatures(const QStringList &feature) const override;
0050 
0051     QDBusVariant featureValue(const QStringList &property) const override;
0052     void setFeatureValue(const QStringList &property, const QDBusVariant &value) override;
0053 
0054     //
0055     // D-BUS Interface methods
0056     //
0057 
0058 public Q_SLOTS:
0059     void DeleteRecentStats(const QString &activity, int count, const QString &what);
0060 
0061     void DeleteEarlierStats(const QString &activity, int months);
0062 
0063     void DeleteStatsForResource(const QString &activity, const QString &client, const QString &resource);
0064 
0065 Q_SIGNALS:
0066     void ResourceScoreUpdated(const QString &activity, const QString &client, const QString &resource, double score, uint lastUpdate, uint firstUpdate);
0067     void ResourceScoreDeleted(const QString &activity, const QString &client, const QString &resource);
0068 
0069     void RecentStatsDeleted(const QString &activity, int count, const QString &what);
0070 
0071     void EarlierStatsDeleted(const QString &activity, int months);
0072 
0073     //
0074     // End D-BUS Interface methods
0075     //
0076 
0077 private Q_SLOTS:
0078     void addEvents(const EventList &events);
0079     void loadConfiguration();
0080 
0081     void openResourceEvent(const QString &usedActivity,
0082                            const QString &initiatingAgent,
0083                            const QString &targettedResource,
0084                            const QDateTime &start,
0085                            const QDateTime &end = QDateTime());
0086 
0087     void closeResourceEvent(const QString &usedActivity, const QString &initiatingAgent, const QString &targettedResource, const QDateTime &end);
0088 
0089     void saveResourceTitle(const QString &uri, const QString &title, bool autoTitle = false);
0090     void saveResourceMimetype(const QString &uri, const QString &mimetype, bool autoMimetype = false);
0091     bool insertResourceInfo(const QString &uri);
0092     void detectResourceInfo(const QString &uri);
0093 
0094     void deleteOldEvents();
0095 
0096 private:
0097     inline bool acceptedEvent(const Event &event);
0098     inline Event validateEvent(Event event);
0099 
0100     enum WhatToRemember {
0101         AllApplications = 0,
0102         SpecificApplications = 1,
0103         NoApplications = 2,
0104     };
0105 
0106     QObject *m_activities;
0107     QObject *m_resources;
0108 
0109     QSet<QString> m_apps;
0110     QList<QRegularExpression> m_urlFilters;
0111     QStringList m_otrActivities;
0112 
0113     std::unique_ptr<QSqlQuery> openResourceEventQuery;
0114     std::unique_ptr<QSqlQuery> closeResourceEventQuery;
0115 
0116     std::unique_ptr<QSqlQuery> insertResourceInfoQuery;
0117     std::unique_ptr<QSqlQuery> getResourceInfoQuery;
0118     std::unique_ptr<QSqlQuery> saveResourceTitleQuery;
0119     std::unique_ptr<QSqlQuery> saveResourceMimetypeQuery;
0120 
0121     QTimer m_deleteOldEventsTimer;
0122 
0123     bool m_blockedByDefault : 1;
0124     bool m_blockAll : 1;
0125     WhatToRemember m_whatToRemember : 2;
0126 
0127     ResourceLinking *m_resourceLinking;
0128 
0129     static StatsPlugin *s_instance;
0130 };