You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
tdebase/kioslave/media/mediamanager/halbackend.h

232 lines
6.3 KiB

/* This file is part of the KDE Project
Copyright (c) 2004-2005 Jérôme Lodewyck <jerome dot lodewyck at normalesup dot org>
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.
*/
/**
* This is a media:/ backend for the freedesktop Hardware Abstraction Layer
* Usage : create an instance of HALBackend, then call InitHal(). A false
* result from the later function means that something went wrong and that
* the backend shall not be used.
*
* @author Jérôme Lodewyck <jerome dot lodewyck at normalesup dot org>
* @short media:/ backend for the HAL
*/
#ifndef _HALBACKEND_H_
#define _HALBACKEND_H_
#include "backendbase.h"
#include <qobject.h>
#include <qstringlist.h>
#include <qstring.h>
#include <config.h>
/* We acknowledge the the dbus API is unstable */
#define DBUS_API_SUBJECT_TO_CHANGE
/* DBus-Qt bindings */
#include <dbus/connection.h>
/* HAL libraries */
#include <libhal.h>
#include <libhal-storage.h>
namespace KIO {
class Job;
}
class HALBackend : public QObject, public BackendBase
{
Q_OBJECT
public:
/**
* Constructor
*/
HALBackend(MediaList &list, QObject* parent);
/**
* Destructor
*/
~HALBackend();
/**
* Perform HAL initialization.
*
* @return true if succeded. If not, rely on some other backend
*/
bool InitHal();
/**
* List all devices and append them to the media device list (called only once, at startup).
*
* @return true if succeded, false otherwise
*/
bool ListDevices();
QStringList mountoptions(const QString &id);
bool setMountoptions(const QString &id, const QStringList &options);
QString mount(const QString &id);
QString mount(const Medium *medium);
QString unmount(const QString &id);
QString decrypt(const QString &id, const QString &password);
QString undecrypt(const QString &id);
private:
/**
* Append a device in the media list. This function will check if the device
* is worth listing.
*
* @param udi Universal Device Id
* @param allowNotification Indicates if this event will be notified to the user
*/
void AddDevice(const char* udi, bool allowNotification=true);
/**
* Remove a device from the device list
*
* @param udi Universal Device Id
*/
void RemoveDevice(const char* udi);
/**
* A device has changed, update it
*
* @param udi Universal Device Id
*/
void ModifyDevice(const char *udi, const char* key);
/**
* HAL informed that a special action has occured
* (e.g. device unplugged without unmounting)
*
* @param udi Universal Device Id
*/
void DeviceCondition(const char *udi, const char *condition);
/**
* Integrate the DBus connection within qt main loop
*/
void MainLoopIntegration(DBusConnection *dbusConnection);
/* Set media properties */
private:
/**
* Reset properties for the given medium
*/
void ResetProperties(const char* MediumUdi, bool allowNotification=false);
/**
* Find the medium that is concerned with device udi
*/
const char* findMediumUdiFromUdi(const char* udi);
void setVolumeProperties(Medium* medium);
bool setFloppyProperties(Medium* medium);
void setFloppyMountState( Medium* medium );
bool setFstabProperties(Medium* medium);
void setCameraProperties(Medium* medium);
QString generateName(const QString &devNode);
static QString isInFstab(const Medium *medium);
static QString listUsingProcesses(const Medium *medium);
static QString killUsingProcesses(const Medium *medium);
private slots:
void slotResult(KIO::Job *job);
/* Hal call-backs -- from gvm*/
public:
/** Invoked when a device is added to the Global Device List.
*
* @param ctx LibHal context
* @param udi Universal Device Id
*/
static void hal_device_added(LibHalContext *ctx, const char *udi);
/** Invoked when a device is removed from the Global Device List.
*
* @param ctx LibHal context
* @param udi Universal Device Id
*/
static void hal_device_removed(LibHalContext *ctx, const char *udi);
/** Invoked when a property of a device in the Global Device List is
* changed, and we have we have subscribed to changes for that device.
*
* @param ctx LibHal context
* @param udi Univerisal Device Id
* @param key Key of property
*/
static void hal_device_property_modified(LibHalContext *ctx, const char *udi, const char *key,
dbus_bool_t is_removed, dbus_bool_t is_added);
/** Type for callback when a non-continuos condition occurs on a device
*
* @param udi Univerisal Device Id
* @param condition_name Name of the condition
* @param message D-BUS message with variable parameters depending on condition
*/
static void hal_device_condition(LibHalContext *ctx, const char *udi,
const char *condition_name,
const char* message
);
/* HAL and DBus structures */
private:
/**
* The HAL context connecting the whole application to the HAL
*/
LibHalContext* m_halContext;
/**
* libhal-storage HAL policy, e.g. for icon names
*/
LibHalStoragePolicy* m_halStoragePolicy;
/**
* The DBus-Qt bindings connection for mainloop integration
*/
DBusQt::Connection* m_dBusQtConnection;
/**
* Object for the kded module
*/
QObject* m_parent;
DBusConnection *dbus_connection;
/**
* Data structure for fstab mount/unmount jobs
*/
struct mount_job_data {
// [in] Medium, which is being mounted/unmounted by the job
const Medium* medium;
// [in,out] Should be set to true when the job completes
bool completed;
// [out] KIO::Error if an error occured during operation. Otherwise, 0
int error;
// [out] Error message to be displayed to the user
QString errorMessage;
};
QMap<KIO::Job *, struct mount_job_data*> mount_jobs;
};
#endif /* _HALBACKEND_H_ */