File indexing completed on 2024-05-19 05:37:58

0001 /*
0002     SPDX-FileCopyrightText: 2022 Kai Uwe Broulik <kde@broulik.de>
0003 
0004     SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-only OR LicenseRef-KDE-Accepted-GPL
0005 */
0006 
0007 #pragma once
0008 
0009 #include <QHash>
0010 #include <QList>
0011 #include <QSocketNotifier>
0012 #include <QString>
0013 
0014 #include <KDEDModule>
0015 
0016 #include <libudev.h>
0017 
0018 class UdevDevice
0019 {
0020 public:
0021     explicit UdevDevice(struct udev_device *device);
0022     ~UdevDevice();
0023     UdevDevice &operator=(const UdevDevice &other);
0024 
0025     static UdevDevice fromDevice(struct udev_device *device);
0026 
0027     udev_device *handle() const;
0028 
0029     QString action() const;
0030     QString name() const;
0031     QString sysfsPath() const;
0032     QString subsystem() const;
0033     QString type() const;
0034 
0035     QString deviceProperty(const char *name) const;
0036     QString sysfsProperty(const char *name) const;
0037 
0038     QString model() const;
0039     QString vendor() const;
0040     QString displayName() const;
0041 
0042     bool isRemovable() const;
0043 
0044 private:
0045     UdevDevice(struct udev_device *device, bool ref);
0046 
0047     QString getDeviceString(const char *(*getter)(struct udev_device *)) const;
0048 
0049     struct udev_device *m_device = nullptr;
0050 };
0051 
0052 class Udev : public QObject
0053 {
0054     Q_OBJECT
0055 
0056 public:
0057     Udev(QObject *parent = nullptr);
0058     ~Udev() override;
0059 
0060 Q_SIGNALS:
0061     void deviceAdded(const UdevDevice &device);
0062     void deviceRemoved(const UdevDevice &device);
0063 
0064 private:
0065     void onSocketActivated();
0066 
0067     struct udev *m_udev = nullptr;
0068     struct udev_monitor *m_monitor = nullptr;
0069     QSocketNotifier *m_notifier = nullptr;
0070 };
0071 
0072 class KdedDeviceNotifications : public KDEDModule
0073 {
0074     Q_OBJECT
0075 
0076 public:
0077     KdedDeviceNotifications(QObject *parent, const QVariantList &args);
0078     ~KdedDeviceNotifications() override;
0079 
0080 private:
0081     void onDeviceAdded(const UdevDevice &device);
0082     void onDeviceRemoved(const UdevDevice &device);
0083 
0084     Udev m_udev;
0085     QHash<QString, QString> m_displayNames;
0086     QList<QString> m_removableDevices;
0087 };