Sign Up
Log In
Log In
or
Sign Up
Places
All Projects
Status Monitor
Collapse sidebar
home:aualin:kde
kdebase3
kdebase-trident-udisks2-backend.patch
Overview
Repositories
Revisions
Requests
Users
Attributes
Meta
File kdebase-trident-udisks2-backend.patch of Package kdebase3
From 27cc062c6b172fd6e93addb510269b360cb7eb8d Mon Sep 17 00:00:00 2001 From: Serghei Amelian <serghei.amelian@gmail.com> Date: Wed, 30 May 2012 22:46:50 +0300 Subject: [PATCH] [mediamanager] initial support for UDisks2 --- CMakeLists.txt | 4 + kioslave/media/kcmodule/CMakeLists.txt | 21 +- kioslave/media/kcmodule/managermodule.cpp | 13 +- kioslave/media/kcmodule/managermoduleview.ui | 16 +- .../media/libmediacommon/mediamanagersettings.kcfg | 5 + kioslave/media/mediamanager/CMakeLists.txt | 47 +- kioslave/media/mediamanager/mediamanager.cpp | 36 ++ kioslave/media/mediamanager/mediamanager.h | 4 +- kioslave/media/mediamanager/udisks2backend.cpp | 654 ++++++++++++++++++++ kioslave/media/mediamanager/udisks2backend.h | 45 ++ 10 files changed, 800 insertions(+), 45 deletions(-) create mode 100644 kioslave/media/mediamanager/udisks2backend.cpp create mode 100644 kioslave/media/mediamanager/udisks2backend.h diff --git a/kioslave/media/kcmodule/managermodule.cpp b/kioslave/media/kcmodule/managermodule.cpp index e5f493d..e97344b 100644 --- a/kioslave/media/kcmodule/managermodule.cpp +++ b/kioslave/media/kcmodule/managermodule.cpp @@ -35,19 +35,26 @@ addConfig( MediaManagerSettings::self(), view ); +#ifndef COMPILE_UDISKS2BACKEND + QString udisks2_text = view->kcfg_UDisks2BackendEnabled->text(); + udisks2_text += " ("+i18n("No support for UDisks2 on this system")+")"; + view->kcfg_UDisks2BackendEnabled->setText( udisks2_text ); + view->kcfg_UDisks2BackendEnabled->setEnabled( false ); +#endif + #ifndef COMPILE_HALBACKEND QString hal_text = view->kcfg_HalBackendEnabled->text(); hal_text += " ("+i18n("No support for HAL on this system")+")"; view->kcfg_HalBackendEnabled->setText( hal_text ); -#endif view->kcfg_HalBackendEnabled->setEnabled( false ); +#endif #ifndef COMPILE_LINUXCDPOLLING QString poll_text = view->kcfg_CdPollingEnabled->text(); poll_text += " ("+i18n("No support for CD polling on this system")+")"; view->kcfg_CdPollingEnabled->setText( poll_text ); -#endif view->kcfg_CdPollingEnabled->setEnabled( false ); +#endif load(); } diff --git a/kioslave/media/kcmodule/managermoduleview.ui b/kioslave/media/kcmodule/managermoduleview.ui index 5987183..1cca62f 100644 --- a/kioslave/media/kcmodule/managermoduleview.ui +++ b/kioslave/media/kcmodule/managermoduleview.ui @@ -12,12 +12,26 @@ <height>480</height> </rect> </property> + <property name="caption"> + <string>ManagerModuleView</string> + </property> <vbox> <property name="name"> <cstring>unnamed</cstring> </property> <widget class="QCheckBox"> <property name="name"> + <cstring>kcfg_UDisks2BackendEnabled</cstring> + </property> + <property name="text"> + <string>Enable UDisks2 backend</string> + </property> + <property name="whatsThis" stdset="0"> + <string>Select this if you want to enable the UDisks2 (http://www.freedesktop.org/wiki/Software/udisks) support.</string> + </property> + </widget> + <widget class="QCheckBox"> + <property name="name"> <cstring>kcfg_HalBackendEnabled</cstring> </property> <property name="text"> @@ -62,7 +76,7 @@ <property name="sizeHint"> <size> <width>21</width> - <height>360</height> + <height>320</height> </size> </property> </spacer> diff --git a/kioslave/media/libmediacommon/mediamanagersettings.kcfg b/kioslave/media/libmediacommon/mediamanagersettings.kcfg index 4c9615a..5ad1e83 100644 --- a/kioslave/media/libmediacommon/mediamanagersettings.kcfg +++ b/kioslave/media/libmediacommon/mediamanagersettings.kcfg @@ -4,6 +4,11 @@ <kcfg> <kcfgfile name="mediamanagerrc"/> <group name="Global"> + <entry name="UDisks2BackendEnabled" type="Bool"> + <label>Enable UDisks2 backend</label> + <whatsthis>When UDisks2 support is enabled, KDE will use it to gather information on the storage media available in your system.</whatsthis> + <default>true</default> + </entry> <entry name="HalBackendEnabled" type="Bool"> <label>Enable HAL backend</label> <whatsthis>When HAL (Hardware Abstraction Layer) support is enabled, KDE will use it to gather information on the storage media available in your system.</whatsthis> diff --git a/kioslave/media/mediamanager/mediamanager.cpp b/kioslave/media/mediamanager/mediamanager.cpp index ad8f1b4..c52c668 100644 --- a/kioslave/media/mediamanager/mediamanager.cpp +++ b/kioslave/media/mediamanager/mediamanager.cpp @@ -32,6 +32,10 @@ #include "fstabbackend.h" +#ifdef COMPILE_UDISKS2BACKEND +#include "udisks2backend.h" +#endif // COMPILE_UDISKS2BACKEND + #ifdef COMPILE_HALBACKEND #include "halbackend.h" #endif //COMPILE_HALBACKEND @@ -77,9 +81,29 @@ void MediaManager::loadBackends() } mp_removableBackend = 0L; + m_udisks2backend = 0L; m_halbackend = 0L; m_fstabbackend = 0L; +#ifdef COMPILE_UDISKS2BACKEND + if ( MediaManagerSettings::self()->uDisks2BackendEnabled() ) + { + m_udisks2backend = new UDisks2Backend(m_mediaList); + if( m_udisks2backend->initialize() ) + { + m_backends.append( m_udisks2backend ); + // No need to load something else... + m_mediaList.blockSignals(false); + return; + } + else + { + delete m_udisks2backend; + m_udisks2backend = 0; + } + } +#endif // COMPILE_UDISKS2BACKEND + #ifdef COMPILE_HALBACKEND if ( MediaManagerSettings::self()->halBackendEnabled() ) { @@ -208,6 +232,11 @@ bool MediaManager::setMountoptions(const QString &name, const QStringList &optio QString MediaManager::mount(const QString &name) { +#ifdef COMPILE_UDISKS2BACKEND + if (!m_udisks2backend) + return i18n("Feature only available with UDisks2"); + return m_udisks2backend->mount(name); +#else #ifdef COMPILE_HALBACKEND if (!m_halbackend) return i18n("Feature only available with HAL"); @@ -217,10 +246,16 @@ QString MediaManager::mount(const QString &name) return i18n("Feature only available with HAL"); return m_fstabbackend->mount( name ); #endif +#endif } QString MediaManager::unmount(const QString &name) { +#ifdef COMPILE_UDISKS2BACKEND + if (!m_udisks2backend) + return i18n("Feature only available with UDisks2"); + return m_udisks2backend->unmount(name); +#else #ifdef COMPILE_HALBACKEND if (!m_halbackend) return i18n("Feature only available with HAL"); @@ -230,6 +265,7 @@ QString MediaManager::unmount(const QString &name) return i18n("Feature only available with HAL"); return m_fstabbackend->unmount( name ); #endif +#endif } QString MediaManager::nameForLabel(const QString &label) diff --git a/kioslave/media/mediamanager/mediamanager.h b/kioslave/media/mediamanager/mediamanager.h index 1e5aa1d..291ab32 100644 --- a/kioslave/media/mediamanager/mediamanager.h +++ b/kioslave/media/mediamanager/mediamanager.h @@ -28,6 +28,7 @@ #include "removablebackend.h" #include "mediadirnotify.h" +class UDisks2Backend; class HALBackend; class FstabBackend; @@ -82,6 +83,7 @@ class MediaManager : public KDEDModule MediaList m_mediaList; QValueList<BackendBase*> m_backends; RemovableBackend *mp_removableBackend; + UDisks2Backend *m_udisks2backend; HALBackend *m_halbackend; MediaDirNotify m_dirNotify; FstabBackend *m_fstabbackend; diff --git a/kioslave/media/mediamanager/udisks2backend.cpp b/kioslave/media/mediamanager/udisks2backend.cpp new file mode 100644 index 0000000..e2e84a1 --- /dev/null +++ b/kioslave/media/mediamanager/udisks2backend.cpp @@ -0,0 +1,654 @@ +/* + This file is part of the KDE3 Fork Project + Copyright (c) 2012 Serghei Amelian <serghei.amelian@gmail.com> + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public + License version 2 as published by the Free Software Foundation. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public License + along with this library; see the file COPYING.LIB. If not, write to + the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, + Boston, MA 02110-1301, USA. +*/ + +#include <qdict.h> + +#include <dbus/qdbusconnection.h> +#include <dbus/qdbuserror.h> +#include <dbus/qdbusdata.h> +#include <dbus/qdbusdatalist.h> +#include <dbus/qdbusdatamap.h> +#include <dbus/qdbusmessage.h> +#include <dbus/qdbusobjectpath.h> +#include <dbus/qdbusproxy.h> +#include <dbus/qdbusvariant.h> + +#include <klocale.h> +#include <kdebug.h> + +#include "udisks2backend.h" + + +namespace UDisks2 { + + +/***** Class declarations **************************/ + + +class Property { +public: + Property(){} + Property(const QDBusData &data); + + bool toBool() const; + int toInt() const; + QString toString() const; + QStringList toStringList() const; + QDBusObjectPath toObjectPath() const; + +private: + QDBusData m_data; +}; + + +/***************************************************/ + + +class Object : public QDBusProxy { +public: + Object(ObjectManager *objectManager, const QDBusObjectPath &objectPath, const QDBusConnection &dbusConnection); + ~Object(); + + bool isEmpty() const { return m_interfaces.isEmpty(); } + + void addInterfaces(const QDBusDataMap<QString> &interfaces); + void removeInterfaces(const QValueList<QDBusData> &interfaces); + + bool callMethod(const QString &interface, const QString &method, const QValueList<QDBusData> ¶ms, QDBusData &response, QDBusError &error); + +private: + Medium *createMountableMedium(); + Medium *createBlankOrAudioMedium(); + bool checkMediaAvailability(); + void propertiesChanged(const QString &interface, const QDBusDataMap<QString> &properties); + void handleDBusSignal(const QDBusMessage &message); + +private: + ObjectManager *m_objectManager; + QStringList m_interfaces; + + bool m_mediaAvailable; + + // drive interface + bool m_optical; + bool m_opticalBlank; + bool m_opticalAudio; + bool m_removable; + bool m_ejectable; + QString m_media; + + // block device interface + bool m_mountable; + QDBusObjectPath m_drive; + QString m_device; + QString m_label; + QString m_fsType; + + // filesystem interface + bool m_filesystem; + bool m_mounted; + QString m_mountPoint; +}; + + +/***************************************************/ + + +class ObjectManager : public QDBusProxy { + + friend class Object; + +public: + ObjectManager(MediaList &mediaList); + bool initialize(); + + Object *findObject(const QString &path) { return m_objects.find(path); } + +protected: + void handleDBusSignal(const QDBusMessage &message); + +private: + void interfacesAdded(const QDBusObjectPath &objectPath, const QDBusDataMap<QString> &interfaces); + void interfacesRemoved(const QDBusObjectPath &objectPath, const QValueList<QDBusData> &interfaces); + +private: + MediaList &m_mediaList; + QDict<Object> m_objects; + bool allowNotification; +}; + + + +/***** Helpers *************************************/ + + +inline QString qDBusByteListToString(const QDBusData &data) +{ + QValueList<Q_UINT8> byteList = data.toList().toByteList(); + + QString result; + for(QValueList<Q_UINT8>::const_iterator it = byteList.begin(); it != byteList.end() && (*it); ++it) + result.append(*it); + return result; +} + + + +/***** class Property ******************************/ + + +Property::Property(const QDBusData &data) + : m_data(data) +{ +} + + +bool Property::toBool() const +{ + return m_data.toBool(); +} + + +int Property::toInt() const +{ + if(QDBusData::UInt32 == m_data.type()) + return m_data.toUInt32(); + return m_data.toInt32(); +} + + +QString Property::toString() const +{ + if(QDBusData::List == m_data.type()) + return qDBusByteListToString(m_data); + return m_data.toString(); +} + + +QStringList Property::toStringList() const +{ + QStringList stringList; + + QValueList<QDBusData> list = m_data.toList().toQValueList(); + for(QValueList<QDBusData>::const_iterator it = list.begin(); it != list.end(); ++it) + stringList << qDBusByteListToString(*it); + + return stringList; +} + + +QDBusObjectPath Property::toObjectPath() const +{ + return m_data.toObjectPath(); +} + + + +/***** class Object ********************************/ + + +Object::Object(ObjectManager *objectManager, const QDBusObjectPath &objectPath, const QDBusConnection &dbusConnection) + : QDBusProxy(dbusConnection), m_objectManager(objectManager) +{ + setService("org.freedesktop.UDisks2"); + setPath(objectPath); + + m_mediaAvailable = false; + m_optical = false; + m_opticalBlank = false; + m_opticalAudio = false; + m_removable = false; + m_ejectable = false; + m_mountable = false; + m_filesystem = false; + m_mounted = false; +} + + +Object::~Object() +{ +} + + +void Object::addInterfaces(const QDBusDataMap<QString> &interfaces) +{ + for(QDBusDataMap<QString>::const_iterator it = interfaces.begin(); it != interfaces.end(); ++it) { + QString interface = it.key(); + + // add the interface to list + m_interfaces.append(interface); + + // update properties for given interface + propertiesChanged(it.key(), it.data().toStringKeyMap()); + + // filesystem interface was added + if("org.freedesktop.UDisks2.Filesystem" == interface) { + m_filesystem = true; + checkMediaAvailability(); + } + } +} + + +void Object::removeInterfaces(const QValueList<QDBusData> &interfaces) +{ + for(QValueList<QDBusData>::const_iterator it = interfaces.begin(); it != interfaces.end(); ++it) { + QString interface = (*it).toString(); + + // remove interface from list + m_interfaces.remove(interface); + + // filesystem interface was removed + if("org.freedesktop.UDisks2.Filesystem" == interface) { + m_filesystem = false; + checkMediaAvailability(); + } + } +} + + +bool Object::callMethod(const QString &interface, const QString &method, const QValueList<QDBusData> ¶ms, QDBusData &response, QDBusError &error) +{ + QDBusProxy proxy(service(), path(), interface, connection()); + + QDBusMessage reply = proxy.sendWithReply(method, params); + if(reply.count() != 1 || reply.type() != QDBusMessage::ReplyMessage) { + error = proxy.lastError(); + if(QDBusError::InvalidError != error.type()) + return false; + } + + response = reply.front(); + return true; +} + + +Medium *Object::createMountableMedium() +{ + Object *drive = m_objectManager->m_objects.find(m_drive); + Q_ASSERT(drive); + + QString name = (m_label.isEmpty() ? QString(m_device).section('/', -1, -1) : m_label); + + QString mimeType; + QString iconName; + + // optical media + if(drive->m_optical) { + if("optical_cd_r" == drive->m_media.left(12)) + mimeType = "media/cdwriter"; + else if("optical_dvd" == drive->m_media.left(11)) + mimeType = "media/dvd"; + else + mimeType = "media/cdrom"; + } + + // removable media + else if(drive->m_removable) { + mimeType = "media/removable"; + } + + // other media + else { + mimeType = "media/hdd"; + } + + if("thumb" == drive->m_media) + iconName = "usbpendrive"; + else if("flash_cf" == drive->m_media) + iconName = "compact_flash"; + else if("flash_ms" == drive->m_media) + iconName = "memory_stick"; + else if("flash_sm" == drive->m_media) + iconName = "smart_media"; + else if("flash_sd" == drive->m_media.left(8)) + iconName = "sd_mmc"; + else if("flash_mmc" == drive->m_media) + iconName = "sd_mmc"; + else if("floppy" == drive->m_media) + iconName = "3floppy"; + else if("floppy_zip" == drive->m_media) + iconName = "zip"; + + mimeType += (m_mounted ? "_mounted" : "_unmounted"); + + if(!iconName.isEmpty()) + iconName += (m_mounted ? "_mount" : "_unmount"); + + Medium *medium = new Medium(path(), name); + medium->setLabel(name); + medium->mountableState(m_device, m_mountPoint, m_fsType, m_mounted); + medium->setMimeType(mimeType); + medium->setIconName(iconName); + + return medium; +} + + +Medium *Object::createBlankOrAudioMedium() +{ + QString name; + QString mimeType; + QString iconName; + + // blank cd or dvd + if(m_opticalBlank) { + if("optical_dvd" == m_media.left(11)) { + name = i18n("Blank DVD"); + mimeType = "media/blankdvd"; + } else { + name = i18n("Blank CD"); + mimeType = "media/blankcd"; + } + } + + // audio cd + else if(m_opticalAudio) { + name = i18n("Audio CD"); + mimeType = "media/audiocd"; + } + + Medium *medium = new Medium(path(), name); + medium->setLabel(name); + medium->unmountableState(""); + medium->setMimeType(mimeType); + + return medium; +} + + +bool Object::checkMediaAvailability() +{ + bool mediaAvailable = (m_opticalBlank || m_opticalAudio || m_mountable && m_filesystem); + bool availabilityChanged = (m_mediaAvailable != mediaAvailable); + + if(!availabilityChanged) + return false; + + // media become available + if(mediaAvailable) { + Medium *medium = (m_mountable && m_filesystem ? createMountableMedium() : createBlankOrAudioMedium()); + m_objectManager->m_mediaList.addMedium(medium, m_objectManager->allowNotification); + } + + // media is not available anymore + else { + m_objectManager->m_mediaList.removeMedium(path(), true); + } + + m_mediaAvailable = mediaAvailable; + return true; +} + + +void Object::propertiesChanged(const QString &interface, const QDBusDataMap<QString> &properties) +{ + QMap<QString, QDBusVariant> map = properties.toVariantMap(); + + bool mediumNeedUpdate = false; + + for(QMap<QString, QDBusVariant>::Iterator it = map.begin(); it != map.end(); ++it) { + QString propertyName = it.key(); + Property propertyValue(it.data().value); + + // properties of drive + if("org.freedesktop.UDisks2.Drive" == interface) { + if("Optical" == propertyName) + m_optical = propertyValue.toBool(); + else if("OpticalBlank" == propertyName) + m_opticalBlank = propertyValue.toBool(); + else if("OpticalNumAudioTracks" == propertyName) + m_opticalAudio = (0 < propertyValue.toInt()); + else if("Media" == propertyName) + m_media = propertyValue.toString(); + else if("Removable" == propertyName) + m_removable = propertyValue.toBool(); + } + + // properties of block device + else if("org.freedesktop.UDisks2.Block" == interface) { + if("IdUsage" == propertyName) + m_mountable = ("filesystem" == propertyValue.toString()); + else if("Drive" == propertyName) + m_drive = propertyValue.toObjectPath(); + else if("PreferredDevice" == propertyName) + m_device = propertyValue.toString(); + else if("IdLabel" == propertyName) { + m_label = propertyValue.toString(); + mediumNeedUpdate = true; + } + else if("IdType" == propertyName) + m_fsType = propertyValue.toString(); + } + + // properties of filesystem + else if("org.freedesktop.UDisks2.Filesystem" == interface) { + if("MountPoints" == propertyName) { + QStringList mountPoints = propertyValue.toStringList(); + m_mounted = (0 < mountPoints.count()); + m_mountPoint = mountPoints.last(); + mediumNeedUpdate = true; + } + } + } + + // media availability was changed + if(checkMediaAvailability()) + return; + + if(mediumNeedUpdate) { + Medium *medium = (m_mountable && m_filesystem ? createMountableMedium() : createBlankOrAudioMedium()); + m_objectManager->m_mediaList.changeMediumState(*medium, false); + delete medium; + } +} + + +void Object::handleDBusSignal(const QDBusMessage &message) +{ + // the message is not for our object + if(path() != message.path()) + return; + + // the message is not coming from dbus properties interface + if("org.freedesktop.DBus.Properties" != message.interface()) + return; + + // this object haven't this kind of udisks2 interface + QString interface = message[0].toString(); + if(!m_interfaces.contains(interface)) + return; + + QString method = message.member(); + if("PropertiesChanged" == method) + propertiesChanged(interface, message[1].toStringKeyMap()); +} + + + +/***** class ObjectManager *************************/ + + +ObjectManager::ObjectManager(MediaList &mediaList) + : m_mediaList(mediaList) +{ + setService("org.freedesktop.UDisks2"); + setPath("/org/freedesktop/UDisks2"); + setInterface("org.freedesktop.DBus.ObjectManager"); + + m_objects.setAutoDelete(true); + allowNotification = false; +} + + +bool ObjectManager::initialize() +{ + // try to establish a connection to system bus + QDBusConnection dbusConnection = QDBusConnection::systemBus(); + if(!dbusConnection.isConnected()) { + kdDebug() << "UDisks2::ObjectManager: " << dbusConnection.lastError().message() << endl; + return false; + } + + setConnection(dbusConnection); + + // get udisks2 managed objects + QDBusMessage reply = sendWithReply("GetManagedObjects", QValueList<QDBusData>()); + if(reply.count() != 1 || reply.type() != QDBusMessage::ReplyMessage) { + kdDebug() << "UDisks2::ObjectManager: " << lastError().message() << endl; + return false; + } + + // convert dbus reply to array of ObjectPath + QDBusDataMap<QDBusObjectPath> objectPathMap = reply.front().toObjectPathKeyMap(); + + // we need to enumerate the drives first + for(QDBusDataMap<QDBusObjectPath>::const_iterator it = objectPathMap.begin(); it != objectPathMap.end(); ++it) { + if("/org/freedesktop/UDisks2/drives" == it.key().parentNode()) + interfacesAdded(it.key(), it.data().toStringKeyMap()); + } + + // enumerate block devices + for(QDBusDataMap<QDBusObjectPath>::const_iterator it = objectPathMap.begin(); it != objectPathMap.end(); ++it) { + if("/org/freedesktop/UDisks2/block_devices" == it.key().parentNode()) + interfacesAdded(it.key(), it.data().toStringKeyMap()); + } + + allowNotification = true; + + return true; +} + + +void ObjectManager::handleDBusSignal(const QDBusMessage &message) +{ + if((service().startsWith(":") && service() != message.sender()) || path() != message.path() || interface() != message.interface()) + return; + + QString method = message.member(); + QDBusObjectPath objectPath = message[0].toObjectPath(); + + if("InterfacesAdded" == method) + interfacesAdded(objectPath, message[1].toStringKeyMap()); + else if("InterfacesRemoved" == method) + interfacesRemoved(objectPath, message[1].toQValueList()); +} + + +void ObjectManager::interfacesAdded(const QDBusObjectPath &objectPath, const QDBusDataMap<QString> &interfaces) +{ + Object *object = m_objects.find(objectPath); + + if(!object) { + object = new Object(this, objectPath, connection()); + m_objects.insert(objectPath, object); + } + + object->addInterfaces(interfaces); +} + + +void ObjectManager::interfacesRemoved(const QDBusObjectPath &objectPath, const QValueList<QDBusData> &interfaces) +{ + Object *object = m_objects.find(objectPath); + + if(object) { + object->removeInterfaces(interfaces); + + // destroy the object if it have no more interfaces + if(object->isEmpty()) + m_objects.remove(objectPath); + } +} + + +} // namespace UDisks2 + + + +/***** class UDisks2Backend ************************/ + + +UDisks2Backend::UDisks2Backend(MediaList &mediaList) + : BackendBase(mediaList) +{ + d = new UDisks2::ObjectManager(mediaList); +} + + +UDisks2Backend::~UDisks2Backend() +{ + delete d; +} + + +bool UDisks2Backend::initialize() +{ + return d->initialize(); +} + + +QString UDisks2Backend::mount(const QString &name) +{ + const Medium *medium = m_mediaList.findById(name); + if(!medium) + return i18n("No such medium: %1").arg(name); + + UDisks2::Object *obj = d->findObject(name); + if(!obj) + return i18n("No such udisks2 object in cache: %1").arg(name); + + QMap<QString, QDBusVariant> options; + + QValueList<QDBusData> params; + params << QDBusData::fromStringKeyMap(QDBusDataMap<QString>(options)); + + QDBusError error; + QDBusData response; + + if(!obj->callMethod("org.freedesktop.UDisks2.Filesystem", "Mount", params, response, error)) + return i18n("Unable to mount medium \"%1\".\nReason: %2").arg(medium->label()).arg(error.message()); + + return QString::null; +} + + +QString UDisks2Backend::unmount(const QString &name) +{ + const Medium *medium = m_mediaList.findById(name); + if(!medium) + return i18n("No such medium: %1").arg(name); + + UDisks2::Object *obj = d->findObject(name); + if(!obj) + return i18n("No such udisks2 object in cache: %1").arg(name); + + QMap<QString, QDBusVariant> options; + + QValueList<QDBusData> params; + params << QDBusData::fromStringKeyMap(QDBusDataMap<QString>(options)); + + QDBusError error; + QDBusData response; + + if(!obj->callMethod("org.freedesktop.UDisks2.Filesystem", "Unmount", params, response, error)) + return i18n("Unable to unmount medium \"%1\".\nReason: %2").arg(medium->label()).arg(error.message()); + + return QString::null; +} diff --git a/kioslave/media/mediamanager/udisks2backend.h b/kioslave/media/mediamanager/udisks2backend.h new file mode 100644 index 0000000..e02c4aa --- /dev/null +++ b/kioslave/media/mediamanager/udisks2backend.h @@ -0,0 +1,45 @@ +/* This file is part of the KDE3 Fork Project + Copyright (c) 2012 Serghei Amelian <serghei.amelian@gmail.com> + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public + License version 2 as published by the Free Software Foundation. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public License + along with this library; see the file COPYING.LIB. If not, write to + the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, + Boston, MA 02110-1301, USA. +*/ + +#ifndef _UDISKS2BACKEND_H_ +#define _UDISKS2BACKEND_H_ + +#include "backendbase.h" + + +namespace UDisks2 { + class ObjectManager; +} + + +class UDisks2Backend : public BackendBase { +public: + UDisks2Backend(MediaList &mediaList); + ~UDisks2Backend(); + + bool initialize(); + + QString mount(const QString &name); + QString unmount(const QString &name); + +private: + UDisks2::ObjectManager *d; +}; + + +#endif -- 1.7.10
Locations
Projects
Search
Status Monitor
Help
OpenBuildService.org
Documentation
API Documentation
Code of Conduct
Contact
Support
@OBShq
Terms
openSUSE Build Service is sponsored by
The Open Build Service is an
openSUSE project
.
Sign Up
Log In
Places
Places
All Projects
Status Monitor