summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--dvddrive.cpp72
-rw-r--r--dvddrive.h27
2 files changed, 99 insertions, 0 deletions
diff --git a/dvddrive.cpp b/dvddrive.cpp
new file mode 100644
index 0000000..b81fca2
--- /dev/null
+++ b/dvddrive.cpp
@@ -0,0 +1,72 @@
+#include "dvddrive.h"
+#include <QDBusConnection>
+#include <QDBusInterface>
+#include <QDBusReply>
+#include <QDebug>
+#include <QStringList>
+
+DVDDrive::DVDDrive(QObject *parent)
+ : QObject(parent)
+{
+ m_halManager = new QDBusInterface(QLatin1String("org.freedesktop.Hal"), QLatin1String("/org/freedesktop/Hal/Manager"), QLatin1String("org.freedesktop.Hal.Manager"), QDBusConnection::systemBus(), this);
+ QStringList devices = m_halManager->call(QLatin1String("FindDeviceByCapability"), QLatin1String("volume.disc")).arguments().at(0).toStringList();
+ m_halDisc = 0;
+ foreach (QString device, devices) {
+ if (deviceAdded(device))
+ break;
+ }
+ connect(m_halManager, SIGNAL(DeviceAdded(QString)), this, SLOT(deviceAdded(const QString&)));
+ connect(m_halManager, SIGNAL(DeviceRemoved(QString)), this, SLOT(deviceRemoved(const QString&)));
+}
+bool DVDDrive::deviceAdded(const QString &device)
+{
+ QDBusInterface *old = m_halDisc;
+ m_halDisc = new QDBusInterface(QLatin1String("org.freedesktop.Hal"), device, QLatin1String("org.freedesktop.Hal.Device"), QDBusConnection::systemBus(), this);
+ if (m_halDisc->call(QLatin1String("GetPropertyBoolean"), QLatin1String("volume.disc.is_videodvd")).arguments().at(0).toBool()) {
+ if (old)
+ delete old;
+ emit dvdAdded();
+ return true;
+ } else {
+ delete m_halDisc;
+ m_halDisc = old;
+ return false;
+ }
+}
+void DVDDrive::deviceRemoved(const QString &device)
+{
+ if (m_halDisc && m_halDisc->path() == device) {
+ delete m_halDisc;
+ m_halDisc = 0;
+ emit dvdRemoved();
+ }
+}
+QString DVDDrive::dvdName() const
+{
+ if (m_halDisc)
+ return m_halDisc->call(QLatin1String("GetPropertyString"), QLatin1String("volume.label")).arguments().at(0).toString();
+ else
+ return QString();
+}
+QString DVDDrive::dvdDevice() const
+{
+ if (m_halDisc)
+ return m_halDisc->call(QLatin1String("GetPropertyString"), QLatin1String("block.device")).arguments().at(0).toString();
+ else
+ return QString();
+}
+bool DVDDrive::dvdInserted() const
+{
+ return m_halDisc != 0;
+}
+void DVDDrive::eject()
+{
+ if (m_halDisc) {
+ QString path = m_halDisc->path();
+ deviceRemoved(path);
+ m_halDisc = new QDBusInterface(QLatin1String("org.freedesktop.Hal"), path, QLatin1String("org.freedesktop.Hal.Device.Volume"), QDBusConnection::systemBus(), this);
+ m_halDisc->call(QLatin1String("Eject"), QStringList());
+ delete m_halDisc;
+ m_halDisc = 0;
+ }
+}
diff --git a/dvddrive.h b/dvddrive.h
new file mode 100644
index 0000000..a400ae3
--- /dev/null
+++ b/dvddrive.h
@@ -0,0 +1,27 @@
+#ifndef DVDDRIVE_H
+#define DVDDRIVE_H
+
+#include <QObject>
+class QDBusInterface;
+
+class DVDDrive : public QObject
+{
+ Q_OBJECT
+public:
+ DVDDrive(QObject *parent = 0);
+ QString dvdName() const;
+ QString dvdDevice() const;
+ bool dvdInserted() const;
+ void eject();
+private:
+ QDBusInterface *m_halManager;
+ QDBusInterface *m_halDisc;
+private slots:
+ bool deviceAdded(const QString &device);
+ void deviceRemoved(const QString &device);
+signals:
+ void dvdAdded();
+ void dvdRemoved();
+};
+
+#endif // DVDDRIVE_H