1 /*
2     SPDX-FileCopyrightText: 2007 Christopher Blauvelt <cblauvelt@gmail.com>
3 
4     SPDX-License-Identifier: LGPL-2.0-only
5 */
6 
7 #pragma once
8 
9 #include <QList>
10 #include <QMap>
11 #include <QObject>
12 #include <QPair>
13 #include <QString>
14 
15 #include <solid/device.h>
16 #include <solid/deviceinterface.h>
17 #include <solid/devicenotifier.h>
18 #include <solid/predicate.h>
19 
20 #include "devicesignalmapmanager.h"
21 #include "devicesignalmapper.h"
22 #include "hddtemp.h"
23 #include <KIO/FileSystemFreeSpaceJob>
24 #include <Plasma/DataEngine>
25 #include <Plasma/Service>
26 
27 enum State {
28     Idle = 0,
29     Mounting = 1,
30     Unmounting = 2,
31 };
32 
33 enum OperationResult {
34     Working = 0,
35     Successful = 1,
36     Unsuccessful = 2,
37 };
38 
39 /**
40  * This class evaluates the basic expressions given in the interface.
41  */
42 class SolidDeviceEngine : public Plasma::DataEngine
43 {
44     Q_OBJECT
45     friend class SolidDeviceService;
46 
47 public:
48     SolidDeviceEngine(QObject *parent, const QVariantList &args);
49     ~SolidDeviceEngine() override;
50     Plasma::Service *serviceForSource(const QString &source) override;
51 
52 protected:
53     bool sourceRequestEvent(const QString &name) override;
54     bool updateSourceEvent(const QString &source) override;
55 
56 private:
57     bool populateDeviceData(const QString &name);
58     bool updateStorageSpace(const QString &udi);
59     bool updateHardDiskTemperature(const QString &udi);
60     bool updateEmblems(const QString &udi);
61     bool updateInUse(const QString &udi);
62     bool forceUpdateAccessibility(const QString &udi);
63     void listenForNewDevices();
64 
65     // predicate in string form, list of devices by udi
66     QMap<QString, QStringList> m_predicatemap;
67     // udi, corresponding device
68     QMap<QString, Solid::Device> m_devicemap;
69     // udi, corresponding encrypted container udi;
70     QMap<QString, QString> m_encryptedContainerMap;
71     // path, for pending file system free space jobs
72     QSet<QString> m_paths;
73     DeviceSignalMapManager *m_signalmanager;
74 
75     HddTemp *m_temperature;
76     Solid::DeviceNotifier *m_notifier;
77 
78 private Q_SLOTS:
79     void deviceAdded(const QString &udi);
80     void deviceRemoved(const QString &udi);
81     void deviceChanged(const QString &udi, const QString &property, const QVariant &value);
82     void sourceWasRemoved(const QString &source);
83     void setMountingState(const QString &udi);
84     void setUnmountingState(const QString &udi);
85     void setIdleState(Solid::ErrorType error, QVariant errorData, const QString &udi);
86     void deviceChanged(const QMap<QString, int> &props);
87 };
88