From a3e3555391f0318680f7e31d8a10d77c114960ac Mon Sep 17 00:00:00 2001 From: Ivailo Monev Date: Tue, 8 Jun 2021 22:09:35 +0300 Subject: [PATCH] solid: theoretical optical drive eject implementation Signed-off-by: Ivailo Monev --- solid/solid/CMakeLists.txt | 2 ++ .../solid/backends/udev/udevopticaldrive.cpp | 35 +++++++++++-------- 2 files changed, 22 insertions(+), 15 deletions(-) diff --git a/solid/solid/CMakeLists.txt b/solid/solid/CMakeLists.txt index 6c18ba89..6a996934 100644 --- a/solid/solid/CMakeLists.txt +++ b/solid/solid/CMakeLists.txt @@ -163,6 +163,8 @@ if(UDEV_FOUND AND CMAKE_SYSTEM_NAME MATCHES Linux) backends/udev/udevopticaldrive.cpp ) add_definitions(-DUDEV_CDIO) + include_directories(${LIBCDIO_INCLUDES}) + set(solid_OPTIONAL_LIBS ${solid_OPTIONAL_LIBS} ${LIBCDIO_LIBRARIES}) endif() set(UDEV_DETAILED_OUTPUT OFF CACHE BOOL "provide extended output regarding udev events") diff --git a/solid/solid/backends/udev/udevopticaldrive.cpp b/solid/solid/backends/udev/udevopticaldrive.cpp index 59331ced..621ee6d3 100644 --- a/solid/solid/backends/udev/udevopticaldrive.cpp +++ b/solid/solid/backends/udev/udevopticaldrive.cpp @@ -20,8 +20,12 @@ #include "udevopticaldrive.h" +#include + using namespace Solid::Backends::UDev; +// TODO: Q_CONSTRUCTOR_FUNCTION() for cdio_init()? cdio_open() is supposed to call it + OpticalDrive::OpticalDrive(UDevDevice *device) : StorageDrive(device) { @@ -38,25 +42,26 @@ bool OpticalDrive::eject() { m_device->broadcastActionRequested("eject"); -#if 0 - Solid::DeviceBusy - Solid::OperationFailed - Solid::UserCanceled - Solid::InvalidOption - Solid::MissingDriver - Solid::UnauthorizedOperation - - if (true) { + const QByteArray devicename = m_device->deviceName().toLocal8Bit(); + const driver_return_code_t result = cdio_eject_media_drive(devicename.constData()); + if (result == DRIVER_OP_SUCCESS) { m_device->broadcastActionDone("setup", Solid::NoError, QString()); - } else { - const QString ejecterror; - m_device->broadcastActionDone("eject", Solid::UnauthorizedOperation, ejecterror); + return true; } -#endif - const QString ejecterror; + /* + TODO: check result and emit broadcastActionDone with one of: + UnauthorizedOperation + DeviceBusy + OperationFailed + UserCanceled + InvalidOption + MissingDriver + */ + const QString ejecterror = QString::fromLatin1(cdio_driver_errmsg(result));; m_device->broadcastActionDone("eject", Solid::UnauthorizedOperation, ejecterror); - return false; // TODO: + + return false; } QList OpticalDrive::writeSpeeds() const