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.
amarok/amarok/src/mediadevicemanager.cpp

175 lines
6.1 KiB

//
// C++ Implementation: mediadevicemanager
//
// Description: Controls device/medium object handling, providing
// helper functions for other objects
//
//
// Author: Jeff Mitchell <kde-dev@emailgoeshere.com>, (C) 2006
//
// Copyright: See COPYING file that comes with this distribution
//
//
#include "amarok.h"
#include "amarokconfig.h"
#include "debug.h"
#include "devicemanager.h"
#include "mediadevicemanager.h"
#include "medium.h"
#include <tqptrlist.h>
#include <tqtimer.h>
#include <dcopclient.h>
#include <dcopobject.h>
#include <kapplication.h>
typedef Medium::List MediumList;
MediaDeviceManager* MediaDeviceManager::instance()
{
static MediaDeviceManager dw;
return &dw;
}
MediaDeviceManager::MediaDeviceManager()
{
DEBUG_BLOCK
connect( DeviceManager::instance(), TQT_SIGNAL( mediumAdded( const Medium*, TQString ) ), TQT_SLOT( slotMediumAdded( const Medium*, TQString ) ) );
connect( DeviceManager::instance(), TQT_SIGNAL( mediumChanged( const Medium*, TQString ) ), TQT_SLOT( slotMediumChanged( const Medium*, TQString ) ) );
connect( DeviceManager::instance(), TQT_SIGNAL( mediumRemoved( const Medium*, TQString ) ), TQT_SLOT( slotMediumRemoved( const Medium*, TQString ) ) );
Medium::List mediums = DeviceManager::instance()->getDeviceList();
foreachType( Medium::List, mediums )
{
slotMediumAdded( &(*it), (*it).id() );
}
if( !mediums.count() )
{
debug() << "DeviceManager didn't return any devices, we are probably running on a non-KDE system. Trying to reinit media devices later" << endl;
TQTimer::singleShot( 4000, this, TQT_SLOT( reinitDevices() ) );
}
//load manual devices
TQStringList manualDevices;
KConfig *config = Amarok::config( "MediaBrowser" );
TQMap<TQString,TQString> savedDevices = config->entryMap( "MediaBrowser" );
TQMap<TQString,TQString>::Iterator qit;
TQString curr, currMountPoint, currName;
for( qit = savedDevices.begin(); qit != savedDevices.end(); ++qit )
{
//only handle manual devices, autodetected devices should be added on the fly
if( qit.key().startsWith( "manual|" ) )
{
curr = qit.key();
curr = curr.remove( "manual|" );
currName = curr.left( curr.find( '|' ) );
currMountPoint = curr.remove( currName + '|' );
manualDevices.append( "false" ); //autodetected
manualDevices.append( qit.key() ); //id
manualDevices.append( currName ); //name
manualDevices.append( currName ); //label
manualDevices.append( TQString::null ); //userLabel
manualDevices.append( "unknown" ); //mountable?
manualDevices.append( TQString::null ); //device node
manualDevices.append( currMountPoint ); //mountPoint
manualDevices.append( "manual" ); //fsType
manualDevices.append( "unknown" ); //mounted
manualDevices.append( TQString::null ); //baseURL
manualDevices.append( TQString::null ); //MIMEtype
manualDevices.append( TQString::null ); //iconName
manualDevices.append( "false" ); //encrypted
manualDevices.append( TQString::null ); //clearDeviceUdi
manualDevices.append( "---" ); //separator
}
}
Medium::List manualMediums = Medium::createList( manualDevices );
foreachType( Medium::List, manualMediums )
{
slotMediumAdded( &(*it), (*it).id() );
}
}
MediaDeviceManager::~MediaDeviceManager()
{
}
void
MediaDeviceManager::addManualDevice( Medium* added )
{
m_mediumMap[added->name()] = added;
added->setFsType( "manual" );
emit mediumAdded( added, added->name() );
}
void
MediaDeviceManager::removeManualDevice( Medium* removed )
{
emit mediumRemoved( removed, removed->name() );
if( m_mediumMap.contains( removed->name() ) )
m_mediumMap.remove( removed->name() );
}
void MediaDeviceManager::slotMediumAdded( const Medium *m, TQString id)
{
DEBUG_BLOCK
if ( m )
{
if ( m->fsType() == "manual" ||
( !m->deviceNode().startsWith( "/dev/hd" ) &&
(m->fsType() == "vfat" || m->fsType() == "hfsplus" || m->fsType() == "msdosfs" ) ) )
// add other fsTypes that should be auto-detected here later
{
if ( m_mediumMap.contains( m->name() ) )
{
Medium *tempMedium = m_mediumMap[m->name()];
m_mediumMap.remove( m->name() );
delete tempMedium;
}
m_mediumMap[m->name()] = new Medium( m );
emit mediumAdded( m, id );
}
}
}
void MediaDeviceManager::slotMediumChanged( const Medium *m, TQString id )
{
//nothing to do here
emit mediumChanged( m, id);
}
void MediaDeviceManager::slotMediumRemoved( const Medium* , TQString id )
{
DEBUG_BLOCK
Medium* removedMedium = 0;
if ( m_mediumMap.contains(id) )
removedMedium = m_mediumMap[id];
if ( removedMedium )
debug() << "[MediaDeviceManager::slotMediumRemoved] Obtained medium name is " << id << ", id is: " << removedMedium->id() << endl;
else
debug() << "[MediaDeviceManager::slotMediumRemoved] Medium was unknown and is null; name was " << id << endl;
//if you get a null pointer from this signal, it means we did not know about the device
//before it was removed, i.e. the removal was the first event for the device received while amarok
//has been running
//There is no point in calling getDevice, since it will not be in the list anyways
emit mediumRemoved( removedMedium, id );
if ( m_mediumMap.contains(id) )
m_mediumMap.remove(id);
delete removedMedium;
}
Medium* MediaDeviceManager::getDevice( TQString name )
{
return DeviceManager::instance()->getDevice( name );
}
void MediaDeviceManager::reinitDevices( )
{
Medium::List mediums = DeviceManager::instance()->getDeviceList();
foreachType( Medium::List, mediums )
{
slotMediumAdded( &(*it), (*it).id() );
}
}
#include "mediadevicemanager.moc"