xmlloader.cpp

来自「Amarok是一款在LINUX或其他类UNIX操作系统中运行的音频播放器软件。 」· C++ 代码 · 共 223 行

CPP
223
字号
/*  Copyright (c) 2006 Gábor Lehel <illissius@gmail.com>  This library is free software; you can redistribute it and/or  modify it under the terms of the GNU Library General Public  License as published by the Free Software Foundation; either  version 2 of the License, or (at your option) any later version.  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.*/#include <qapplication.h>#include "xmlloader.h"#include "xmlloader_p.h"#include "xmlloader_p.moc"MetaBundle::XmlLoader::XmlLoader(): m_aborted( false ), m_target( 0 ){    m_reader.setContentHandler( this );    m_reader.setErrorHandler( this );}MetaBundle::XmlLoader::~XmlLoader() {}bool MetaBundle::XmlLoader::load( QXmlInputSource *source, QObject *target ){    m_target = target;    return m_reader.parse( source, false );}void MetaBundle::XmlLoader::abort(){    m_aborted = true;}QString MetaBundle::XmlLoader::lastError() const{    return m_lastError;}BundleList MetaBundle::XmlLoader::loadBundles( QXmlInputSource *source, bool *ok ) //static{    return SimpleLoader( source, ok ).bundles;}void MetaBundle::XmlLoader::loadInThread( QXmlInputSource *source, QObject *target ) //static{    ( new ThreadedLoader( source, target ) )->start();}void MetaBundle::XmlLoader::newAttribute( const QString &key, const QString &value ){    if( key == "url" )        m_bundle.setUrl( value );    else if( key == "uniqueid" )        m_bundle.setUniqueId( value );    else if( key == "compilation" )        m_bundle.setCompilation( MetaBundle::CompilationYes );    else        m_attributes << QPair<QString, QString>( key, value );}void MetaBundle::XmlLoader::newTag( const QString &name, const QString &value ){    static int start = 0; //most of the time, the columns should be in order    for( int i = start; i < NUM_COLUMNS; ++i )        if( name == exactColumnName( i ) )        {            switch( i )            {                case Artist:                case Composer:                case AlbumArtist:                case Year:                case Album:                case DiscNumber:                case Track:                case Bpm:                case Title:                case Genre:                case Comment:                case Length:                case Bitrate:                case Filesize:                case Type:                case SampleRate:                    m_bundle.setExactText( i, value );                    continue;                default:                    continue;            }            start = i+1;            return;        }    for( int i = 0; i < start; ++i )        if( m_currentElement == exactColumnName( i ) )        {            switch( i )            {                case Artist:                case Composer:                case AlbumArtist:                case Year:                case Album:                case DiscNumber:                case Track:                case Bpm:                case Title:                case Genre:                case Comment:                case Length:                case Bitrate:                case Filesize:                case Type:                case SampleRate:                    m_bundle.setExactText( i, value );                    continue;                default:                    continue;            }            start = i+1;            return;        }}void MetaBundle::XmlLoader::bundleLoaded(){    m_bundle.checkExists();    emit newBundle( m_bundle, m_attributes );    if( m_target )    {        BundleLoadedEvent e( m_bundle, m_attributes );        QApplication::sendEvent( m_target, &e );    }}void MetaBundle::XmlLoader::errorEncountered( const QString &, int, int ){    emit error( m_lastError );    if( m_target )    {        BundleLoadedEvent e( m_lastError );        QApplication::sendEvent( m_target, &e );    }}bool MetaBundle::XmlLoader::startElement( const QString &, const QString &localName, const QString &, const QXmlAttributes &atts ){    if( localName == "item" )    {        m_bundle.clear();        m_attributes.clear();        for( int i = 0, n = atts.count(); i < n; ++i )            newAttribute( atts.localName( i ), atts.value( i ) );        m_currentElement = QString::null;    }    else        m_currentElement = localName;    return true;}bool MetaBundle::XmlLoader::endElement( const QString &, const QString &localName, const QString & ){    if( localName == "item" )    {        bundleLoaded();        m_bundle.clear();        m_attributes.clear();        if( m_aborted )            return false;    }    m_currentElement = QString::null;    return true;}bool MetaBundle::XmlLoader::characters( const QString &ch ){    if( m_currentElement.isNull() )        return true;    newTag( m_currentElement, ch );    return true;}bool MetaBundle::XmlLoader::endDocument(){    if( !m_bundle.isEmpty() )        bundleLoaded();    return !m_aborted;}bool MetaBundle::XmlLoader::fatalError( const QXmlParseException &e ){    if( !m_bundle.isEmpty() )        bundleLoaded();    m_lastError = QString( "Error loading XML: \"%1\", at line %2, column %3." )                  .arg( e.message(), QString::number( e.lineNumber() ), QString::number( e.columnNumber() ) );    errorEncountered( e.message(), e.lineNumber(), e.columnNumber() );    return false;}#include "xmlloader.moc"

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?