genericmediadevice.cpp
来自「Amarok是一款在LINUX或其他类UNIX操作系统中运行的音频播放器软件。 」· C++ 代码 · 共 1,094 行 · 第 1/3 页
CPP
1,094 行
/**************************************************************************** * copyright :(C) 2006 Roel Meeuws <r.j.meeuws+amarok@gmail.com * * (C) 2005 Jeff Mitchell <kde-dev@emailgoeshere.com> * * (C) 2005 Seb Ruiz <me@sebruiz.net> * * * * With some code helpers from KIO_VFAT * * (c) 2004 Thomas Loeber <vfat@loeber1.de> * ***************************************************************************//*************************************************************************** * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * ***************************************************************************/#define DEBUG_PREFIX "GenericMediaDevice"#include "genericmediadevice.h"AMAROK_EXPORT_PLUGIN( GenericMediaDevice )#include "amarok.h"#include "debug.h"#include "medium.h"#include "metabundle.h"#include "collectiondb.h"#include "collectionbrowser.h"#include "k3bexporter.h"#include "playlist.h"#include "podcastbundle.h"#include "statusbar/statusbar.h"#include "transferdialog.h"#include "genericmediadeviceconfigdialog.h"#include <kapplication.h>#include <kconfig.h> //download saveLocation#include <kdiskfreesp.h>#include <kiconloader.h> //smallIcon#include <kio/job.h>#include <kio/jobclasses.h>#include <kio/netaccess.h>#include <kmessagebox.h>#include <kmountpoint.h>#include <kpopupmenu.h>#include <kurlrequester.h> //downloadSelectedItems()#include <kurlrequesterdlg.h> //downloadSelectedItems()#include <taglib/audioproperties.h>#include <unistd.h> //usleep()#include <qcstring.h>#include <qfile.h>#include <qstringx.h>#include <qstringlist.h>#include <qcombobox.h>#include <qlistbox.h>#include <qlineedit.h>typedef QPtrList<GenericMediaFile> MediaFileList;typedef QPtrListIterator<GenericMediaFile> MediaFileListIterator;/** * GenericMediaItem Class */class GenericMediaItem : public MediaItem{ public: GenericMediaItem( QListView *parent, QListViewItem *after = 0 ) : MediaItem( parent, after ) { } GenericMediaItem( QListViewItem *parent, QListViewItem *after = 0 ) : MediaItem( parent, after ) { } // List directories first, always int compare( QListViewItem *i, int col, bool ascending ) const { #define i static_cast<GenericMediaItem *>(i) switch( type() ) { case MediaItem::DIRECTORY: if( i->type() == MediaItem::DIRECTORY ) break; return -1; default: if( i->type() == MediaItem::DIRECTORY ) return 1; } #undef i return MediaItem::compare(i, col, ascending); } private: bool m_dir;};class GenericMediaFile{ public: GenericMediaFile( GenericMediaFile *parent, QString basename, GenericMediaDevice *device ) : m_parent( parent ) , m_device( device ) { m_listed = false; m_children = new MediaFileList(); if( m_parent ) { if( m_parent == m_device->getInitialFile() ) m_viewItem = new GenericMediaItem( m_device->view() ); else m_viewItem = new GenericMediaItem( m_parent->getViewItem() ); setNamesFromBase( basename ); m_viewItem->setText( 0, m_baseName ); m_parent->getChildren()->append( this ); } else { m_viewItem = 0; setNamesFromBase( basename ); } m_device->getItemMap()[m_viewItem] = this; if( m_device->getFileMap()[m_fullName] ) { debug() << "Trying to create two GenericMediaFile items with same fullName!" << endl; debug() << "name already existing: " << m_device->getFileMap()[m_fullName]->getFullName() << endl; delete this; } else { m_device->getFileMap()[m_fullName] = this; } } ~GenericMediaFile() { if( m_parent ) m_parent->removeChild( this ); m_device->getItemMap().erase( m_viewItem ); m_device->getFileMap().erase( m_fullName ); if ( m_children ) delete m_children; if ( m_viewItem ) delete m_viewItem; } GenericMediaFile* getParent() { return m_parent; } void setParent( GenericMediaFile* parent ) { m_device->getFileMap().erase( m_fullName ); m_parent->getChildren()->remove( this ); m_parent = parent; if( m_parent ) m_parent->getChildren()->append( this ); setNamesFromBase( m_baseName ); m_device->getFileMap()[m_fullName] = this; } void removeChild( GenericMediaFile* childToDelete ) { m_children->remove( childToDelete ); } GenericMediaItem* getViewItem() { return m_viewItem; } bool getListed() { return m_listed; } void setListed( bool listed ) { m_listed = listed; } QString getFullName() { return m_fullName; } QString getBaseName() { return m_baseName; } //always follow this function with setNamesFromBase() void setBaseName( QString &name ) { m_baseName = name; } void setNamesFromBase( const QString &name = QString::null ) { if( name != QString::null ) m_baseName = name; if( m_parent ) m_fullName = m_parent->getFullName() + '/' + m_baseName; else m_fullName = m_baseName; if( m_viewItem ) m_viewItem->setBundle( new MetaBundle( KURL::fromPathOrURL( m_fullName ), true, TagLib::AudioProperties::Fast ) ); } MediaFileList* getChildren() { return m_children; } void deleteAll( bool onlyChildren ) { GenericMediaFile *vmf; if( m_children && !m_children->isEmpty() ) { MediaFileListIterator it( *m_children ); while( ( vmf = it.current() ) != 0 ) { ++it; vmf->deleteAll( true ); } } if( onlyChildren ) delete this; } void renameAllChildren() { GenericMediaFile *vmf; if( m_children && !m_children->isEmpty() ) { for( vmf = m_children->first(); vmf; vmf = m_children->next() ) vmf->renameAllChildren(); } setNamesFromBase(); } private: QString m_fullName; QString m_baseName; GenericMediaFile *m_parent; MediaFileList *m_children; GenericMediaItem *m_viewItem; GenericMediaDevice* m_device; bool m_listed;};QStringGenericMediaDevice::fileName( const MetaBundle &bundle ){ QString result = cleanPath( bundle.artist() ); if( !result.isEmpty() ) { if( m_spacesToUnderscores ) result += "_-_"; else result += " - "; } if( bundle.track() ) { result.sprintf( "%02d", bundle.track() ); if( m_spacesToUnderscores ) result += '_'; else result += ' '; } result += cleanPath( bundle.title() + '.' + bundle.type() ); return result;}/** * GenericMediaDevice Class */GenericMediaDevice::GenericMediaDevice() : MediaDevice() , m_kBSize( 0 ) , m_kBAvail( 0 ) , m_connected( false ){ DEBUG_BLOCK m_name = i18n("Generic Audio Player"); m_dirLister = new KDirLister(); m_dirLister->setNameFilter( "*.mp3 *.wav *.asf *.flac *.wma *.ogg *.aac *.m4a *.mp4 *.mp2 *.ac3" ); m_dirLister->setAutoUpdate( false ); m_spacesToUnderscores = false; m_ignoreThePrefix = false; m_asciiTextOnly = false; m_songLocation = QString::null; m_podcastLocation = QString::null; m_supportedFileTypes.clear(); m_configDialog = 0; connect( m_dirLister, SIGNAL( newItems(const KFileItemList &) ), this, SLOT( newItems(const KFileItemList &) ) ); connect( m_dirLister, SIGNAL( completed() ), this, SLOT( dirListerCompleted() ) ); connect( m_dirLister, SIGNAL( clear() ), this, SLOT( dirListerClear() ) ); connect( m_dirLister, SIGNAL( clear(const KURL &) ), this, SLOT( dirListerClear(const KURL &) ) ); connect( m_dirLister, SIGNAL( deleteItem(KFileItem *) ), this, SLOT( dirListerDeleteItem(KFileItem *) ) );}voidGenericMediaDevice::init( MediaBrowser* parent ){ MediaDevice::init( parent );}GenericMediaDevice::~GenericMediaDevice(){ closeDevice();}voidGenericMediaDevice::applyConfig(){ if( m_configDialog != 0) { m_supportedFileTypes.clear(); for( uint i = 0; i < m_configDialog->m_supportedListBox->count(); i++ ) { QString currentText = m_configDialog->m_supportedListBox->item( i )->text(); if( currentText == m_configDialog->m_convertComboBox->currentText() ) m_supportedFileTypes.prepend( currentText ); else m_supportedFileTypes.append( currentText ); } m_spacesToUnderscores = m_configDialog->m_spaceCheck->isChecked(); m_asciiTextOnly = m_configDialog->m_asciiCheck->isChecked(); m_vfatTextOnly = m_configDialog->m_vfatCheck->isChecked(); m_ignoreThePrefix = m_configDialog->m_ignoreTheCheck->isChecked(); m_songLocation = m_configDialog->m_songLocationBox->text(); m_podcastLocation = m_configDialog->m_podcastLocationBox->text(); } setConfigString( "songLocation" , m_songLocation ); setConfigString( "podcastLocation" , m_podcastLocation ); setConfigBool( "spacesToUnderscores", m_spacesToUnderscores ); setConfigBool( "ignoreThePrefix" , m_ignoreThePrefix ); setConfigBool( "asciiTextOnly" , m_asciiTextOnly ); setConfigBool( "vfatTextOnly" , m_vfatTextOnly ); setConfigString( "supportedFiletypes" , m_supportedFileTypes.join( ", " ) );}voidGenericMediaDevice::loadConfig(){
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?