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 + -
显示快捷键?