/* * SPDX-FileCopyrightText: 2024 Bohdan Onofriichuk * * SPDX-License-Identifier: GPL-2.0-or-later */ #include "mountandopenaction.h" #include #include #include #include #include #include MountAndOpenAction::MountAndOpenAction(const QString &udi, QObject *parent) : ActionInterface(udi, parent) , m_stateMonitor(DevicesStateMonitor::instance()) { Solid::Device device(m_udi); m_hasStorageAccess = false; m_isOpticalDisk = false; m_isRoot = false; m_hasPortableMediaPlayer = false; m_hasCamera = false; if (device.is()) { Solid::StorageAccess *storageaccess = device.as(); if (storageaccess) { m_hasStorageAccess = true; m_isRoot = storageaccess->filePath() == u"/"; } if (device.is()) { Solid::OpticalDisc *opticaldisc = device.as(); if (opticaldisc) { m_isOpticalDisk = true; } } } if (device.is()) { Solid::PortableMediaPlayer *mediaplayer = device.as(); if (mediaplayer) { qCDebug(APPLETS::DEVICENOTIFIER) << "MountAndOpenAction: Device " << udi << " has a media player"; m_hasPortableMediaPlayer = true; m_supportedProtocols.append(mediaplayer->supportedProtocols()); qCDebug(APPLETS::DEVICENOTIFIER) << "MountAndOpenAction: Supported protocols: " << m_supportedProtocols; } } if (device.is()) { Solid::Camera *camera = device.as(); if (camera) { qCDebug(APPLETS::DEVICENOTIFIER) << "MountAndOpenAction: Device " << udi << " has a camera"; m_hasCamera = true; m_supportedProtocols.append(camera->supportedProtocols()); qCDebug(APPLETS::DEVICENOTIFIER) << "MountAndOpenAction: Supported protocols: " << m_supportedProtocols; } } connect(m_stateMonitor.get(), &DevicesStateMonitor::stateChanged, this, &MountAndOpenAction::updateAction); updateAction(udi); } MountAndOpenAction::~MountAndOpenAction() { } QString MountAndOpenAction::predicate() const { QString newPredicate; if (!m_hasStorageAccess || !m_stateMonitor->isRemovable(m_udi) || !m_stateMonitor->isMounted(m_udi)) { newPredicate = QLatin1String("openWithFileManager.desktop"); if (!m_hasStorageAccess && (m_hasPortableMediaPlayer || m_hasCamera)) { if (m_supportedProtocols.isEmpty()) { return newPredicate; } for (const QString &protocol : m_supportedProtocols) { if (protocol == QStringLiteral("mtp")) { newPredicate = QLatin1String("solid_mtp.desktop"); // this lives in kio-extras! break; } if (protocol == QStringLiteral("afc")) { newPredicate = QLatin1String("solid_afc.desktop"); // this lives in kio-extras! break; } } } } return newPredicate; } bool MountAndOpenAction::isValid() const { return true; } QString MountAndOpenAction::name() const { return QStringLiteral("MountAndOpen"); } QString MountAndOpenAction::icon() const { return m_icon; } QString MountAndOpenAction::text() const { return m_text; } void MountAndOpenAction::triggered() { qCDebug(APPLETS::DEVICENOTIFIER) << "Mount And Open action triggered"; if (!m_hasStorageAccess || !m_stateMonitor->isRemovable(m_udi) || m_isRoot || !m_stateMonitor->isMounted(m_udi)) { ActionInterface::triggered(); } else { Solid::Device device(m_udi); if (device.is()) { Solid::OpticalDrive *drive = device.as(); if (!drive) { drive = device.parent().as(); } if (drive) { drive->eject(); } return; } if (device.is()) { Solid::StorageAccess *access = device.as(); if (access && access->isAccessible()) { access->teardown(); } } } } void MountAndOpenAction::updateAction(const QString &udi) { if (udi != m_udi) { return; } qCDebug(APPLETS::DEVICENOTIFIER) << "Mount and open action: begin updating action"; if (m_stateMonitor->isRemovable(m_udi)) { m_icon = m_stateMonitor->isMounted(m_udi) ? QStringLiteral("media-eject") : QStringLiteral("document-open-folder"); } else { m_icon = QStringLiteral("document-open-folder"); } // - It's possible for there to be no StorageAccess (e.g. MTP devices don't have one) // - It's possible for the root volume to be on a removable disk if (!m_hasStorageAccess || !m_stateMonitor->isRemovable(m_udi) || m_isRoot) { m_text = i18n("Open in File Manager"); } else { if (!m_stateMonitor->isMounted(m_udi)) { m_text = i18n("Mount and Open"); } else if (m_isOpticalDisk) { m_text = i18n("Eject"); } else { m_text = i18n("Safely remove"); } } qCDebug(APPLETS::DEVICENOTIFIER) << "Mount and open action: action updated! Icon: " << m_icon << ", Text: " << m_text; Q_EMIT iconChanged(m_icon); Q_EMIT textChanged(m_text); } #include "moc_mountandopenaction.cpp"