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.
k9copy/k9devices/k9halconnection.cpp

160 lines
4.3 KiB

//
// C++ Implementation: k9halconnection
//
// Description:
//
//
// Author: Jean-Michel PETIT <k9copy@free.fr>, (C) 2007
//
// Copyright: See COPYING file that comes with this distribution
//
//
#include "k9common.h"
#ifdef HAVE_HAL
#include "k9halconnection.h"
#define DBUS_API_SUBJECT_TO_CHANGE
#include "k9haldevice.h"
#include <dbus/dbus.h>
#include <hal/libhal.h>
k9HalConnection *Hinstance=NULL;
void halDeviceAdded (LibHalContext *ctx, const char *udi) {
Hinstance->addDevice(udi);
Hinstance->testVolumeChanged( udi);
}
void halDeviceRemoved (LibHalContext *ctx, const char *udi) {
Hinstance->removeDevice( udi);
Hinstance->testVolumeChanged( udi);
}
k9HalConnection::k9HalConnection(TQObject *parent, const char *name)
: TQObject(parent, name)
{
m_devices.setAutoDelete(true);
m_context =(void*) libhal_ctx_new();
DBusError error;
dbus_error_init( &error );
m_dbusConnect = dbus_bus_get( DBUS_BUS_SYSTEM, &error );
if( dbus_error_is_set(&error) ) {
tqDebug("%s", (TQString("Error connecting to DBUS : %1").arg(error.message)).ascii());
return;
}
m_dbusDispatch=new K9DBusDispatch(this,0);
m_dbusDispatch->setConnection(m_dbusConnect);
libhal_ctx_set_dbus_connection((LibHalContext*) m_context,m_dbusConnect );
libhal_ctx_set_device_added( (LibHalContext*)m_context, halDeviceAdded );
libhal_ctx_set_device_removed( (LibHalContext*)m_context, halDeviceRemoved );
if( !libhal_ctx_init((LibHalContext*) m_context, 0 ) ) {
tqDebug("HAL init failed");
return;
}
int numDevices;
char** halDeviceList = libhal_get_all_devices((LibHalContext*) m_context, &numDevices, 0 );
for( int i = 0; i < numDevices; ++i )
//tqDebug(halDeviceList[i]);
addDevice( halDeviceList[i] );
}
void k9HalConnection::removeDevice( const char* udi ) {
k9HalDevice *device=findDevice( udi);
if (device !=NULL) {
emit deviceRemoved( device);
m_devices.remove(device);
}
}
void k9HalConnection::addDevice( const char* udi )
{
// ignore devices that have no property "info.capabilities" to suppress error messages
if( !libhal_device_property_exists( (LibHalContext*) m_context, udi, "info.capabilities", 0 ) )
return;
if( libhal_device_query_capability( (LibHalContext*) m_context, udi, "storage.cdrom", 0 ) ) {
char* dev = libhal_device_get_property_string( (LibHalContext*) m_context, udi, "block.device", 0 );
if( dev ) {
TQString s( dev );
libhal_free_string( dev );
if( !s.isEmpty() ) {
k9HalDevice *device=new k9HalDevice(this,udi);
m_devices.append( device);
emit deviceAdded( device);
}
}
}
}
void k9HalConnection::testVolumeChanged( const char * udi) {
// ignore devices that have no property "info.capabilities" to suppress error messages
if( !libhal_device_property_exists( (LibHalContext*) m_context, udi, "info.capabilities", 0 ) ){
k9HalDevice *device=findDeviceByVolume( udi);
if (device != NULL)
device->updateVolumeName();
}
else
if( libhal_device_query_capability( (LibHalContext*) m_context, udi, "volume", 0 ) ) {
char* udiParent = libhal_device_get_property_string( (LibHalContext*) m_context, udi, "info.parent", 0 );
if( udiParent ) {
k9HalDevice *device=findDevice( udiParent);
libhal_free_string( udiParent );
if (device)
device->updateVolumeName();
}
}
}
k9HalConnection::~k9HalConnection()
{
libhal_ctx_shutdown((LibHalContext*)m_context, 0 );
libhal_ctx_free ((LibHalContext*)m_context);
#ifdef DBUS_QT3
//TQDBusConnection::closeConnection("sbus");
#else
//delete m_dBusTQtConnect;
#endif
}
k9HalConnection * k9HalConnection::getInstance() {
if (Hinstance==NULL)
Hinstance=new k9HalConnection(NULL,NULL);
return Hinstance;
}
k9HalDevice *k9HalConnection::findDevice( const char *udi) {
for (k9HalDevice *dev= m_devices.first();dev;dev=m_devices.next()) {
if (dev->name()==TQString(udi))
return dev;
}
return NULL;
}
k9HalDevice *k9HalConnection::findDeviceByVolume( const char *udi) {
for (k9HalDevice *dev= m_devices.first();dev;dev=m_devices.next()) {
if (dev->getVolumeUdi()==TQString(udi))
return dev;
}
return NULL;
}
void k9HalConnection::end() {
if (Hinstance !=NULL){
delete Hinstance;
}
Hinstance=NULL;
}
#include "k9halconnection.moc"
#endif