diff options
Diffstat (limited to 'kbugbuster/backend/htmlparser.cpp')
-rw-r--r-- | kbugbuster/backend/htmlparser.cpp | 294 |
1 files changed, 294 insertions, 0 deletions
diff --git a/kbugbuster/backend/htmlparser.cpp b/kbugbuster/backend/htmlparser.cpp new file mode 100644 index 00000000..7e53c1bd --- /dev/null +++ b/kbugbuster/backend/htmlparser.cpp @@ -0,0 +1,294 @@ +/* + This file is part of KBugBuster. + + Copyright (c) 2003 Cornelius Schumacher <schumacher@kde.org> + + 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. + + This program 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 General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + + As a special exception, permission is given to link this program + with any edition of Qt, and distribute the resulting executable, + without including the source code for Qt in the source distribution. +*/ + +#include "htmlparser.h" +#include "bugimpl.h" +#include "packageimpl.h" + +#include <kdebug.h> + +#include <qbuffer.h> +#include <qregexp.h> +#include <qtextstream.h> + +KBB::Error HtmlParser::parseBugList( const QByteArray &data, Bug::List &bugs ) +{ + QBuffer buffer( data ); + if ( !buffer.open( IO_ReadOnly ) ) { + return KBB::Error( "Can't open buffer" ); + } + + QTextStream ts( &buffer ); + + mState = Idle; + + QString line; + while ( !( line = ts.readLine() ).isNull() ) { + KBB::Error err = parseLine( line, bugs ); + if ( err ) return err; + } + + return KBB::Error(); +} + +KBB::Error HtmlParser::parsePackageList( const QByteArray &data, + Package::List &packages ) +{ + init(); + + QBuffer buffer( data ); + if ( !buffer.open( IO_ReadOnly ) ) { + return KBB::Error( "Can't open buffer" ); + } + + QTextStream ts( &buffer ); + + QString line; + while ( !( line = ts.readLine() ).isNull() ) { + KBB::Error err = parseLine( line, packages ); + if ( err ) return err; + } + + processResult( packages ); + + return KBB::Error(); +} + +void HtmlParser::init() +{ +} + +void HtmlParser::setPackageListQuery( KURL &url ) +{ + url.setFileName( "query.cgi" ); +} + +KBB::Error HtmlParser::parseLine( const QString &, Bug::List & ) +{ + return KBB::Error(); +} + +KBB::Error HtmlParser::parseLine( const QString &, Package::List & ) +{ + return KBB::Error(); +} + +void HtmlParser::processResult( Package::List & ) +{ +} + +QString HtmlParser::getAttribute( const QString &line, const QString &name ) +{ + int pos1 = line.find( name + "=\"" ); + if ( pos1 < 1 ) return QString::null; + pos1 += name.length() + 2; + int pos2 = line.find( "\"", pos1 ); + if ( pos2 < 1 ) return QString::null; + return line.mid( pos1, pos2 - pos1 ); +} + +bool HtmlParser::getCpts( const QString &line, QString &key, + QStringList &values ) +{ + if ( !line.contains( QRegExp( "\\s*cpts" ) ) ) return false; + +// kdDebug() << "LINE: " << line << endl; + int pos1 = line.find( "[" ); + if ( pos1 < 0 ) return false; + int pos2 = line.find( "]", ++pos1 ); + if ( pos2 < 0 ) return false; + + key = line.mid( pos1, pos2 - pos1 ); + int pos3 = key.find( "'" ); + if ( pos3 >= 0 ) { + int pos4 = key.find( "'", ++pos3 ); + if ( pos4 >= 0 ) key = key.mid( pos3, pos4 - pos3 ); + } +// kdDebug() << " KEY: " << key << endl; + + pos1 = line.find( "'", ++pos2 ); + if ( pos1 >= 0 ) pos2 = line.find( "'", ++pos1 ); + + while ( pos1 >= 0 && pos2 >= 0 ) { + QString value = line.mid( pos1, pos2 - pos1 ); +// kdDebug() << " VALUE: " << value << endl; + + values.append( value ); + + pos1 = line.find( "'", ++pos2 ); + if ( pos1 >= 0 ) pos2 = line.find( "'", ++pos1 ); + } + + return true; +} + +KBB::Error HtmlParser_2_10::parseLine( const QString &line, Bug::List &bugs ) +{ + if ( line.startsWith( "<TR VALIGN" ) ) { +// kdDebug() << "LINE: " << line << endl; + QRegExp re( "show_bug\\.cgi\\?id=(\\d+)" ); + re.search( line ); + QString number = re.cap( 1 ); +// kdDebug() << " NUMBER: " << number << endl; + + QString summary; + int pos = line.findRev( "summary>" ); + if ( pos >= 0 ) summary = line.mid( pos + 8 ); + + Bug bug( new BugImpl( summary, Person(), number, 0xFFFFFFFF, Bug::SeverityUndefined, + Person(), Bug::StatusUndefined, + Bug::BugMergeList() ) ); + + if ( !bug.isNull() ) { + bugs.append( bug ); + } + } + + return KBB::Error(); +} + +KBB::Error HtmlParser_2_10::parseLine( const QString &line, + Package::List &packages ) +{ + QString package; + QStringList components; + + if ( getCpts( line, package, components ) ) { + packages.append( Package( new PackageImpl( package, "", 0, Person(), + components ) ) ); + } + + return KBB::Error(); +} + + +void HtmlParser_2_14_2::init() +{ + mComponentsMap.clear(); + + mState = Idle; +} + +KBB::Error HtmlParser_2_14_2::parseLine( const QString &line, + Package::List & ) +{ + switch ( mState ) { + case Idle: + if ( line.startsWith( "tms[" ) ) mState = Components; + break; + case Components: { + if ( line.startsWith( "function" ) ) mState = Finished; + QString key; + QStringList values; + if ( getCpts( line, key, values ) ) { +// kdDebug() << "KEY: " << key << " VALUES: " << values.join(",") << endl; + if ( values.count() == 2 ) { + mComponentsMap[ values.last() ].append( key ); + } + } + } + default: + break; + } + + return KBB::Error(); +} + +void HtmlParser_2_14_2::processResult( Package::List &packages ) +{ + QMap<QString,QStringList>::ConstIterator it; + for ( it = mComponentsMap.begin(); it != mComponentsMap.end(); ++it ) { + packages.append( Package( new PackageImpl( it.key(), "", 0, Person(), + it.data() ) ) ); + } +} + + +void HtmlParser_2_17_1::init() +{ + mProducts.clear(); + mComponents.clear(); + + mState = Idle; +} + +KBB::Error HtmlParser_2_17_1::parseBugList( const QByteArray &data, Bug::List &bugs ) +{ + return RdfProcessor::parseBugList( data, bugs ); +} + +KBB::Error HtmlParser_2_17_1::parseLine( const QString & /*line*/, Bug::List &/*bugs*/ ) +{ + return KBB::Error( "Not implemented" ); +} + +KBB::Error HtmlParser_2_17_1::parseLine( const QString &line, Package::List & ) +{ + switch ( mState ) { + case Idle: + case SearchComponents: + if ( line.contains( "var cpts" ) ) mState = Components; + break; + case SearchProducts: + if ( line.contains( "onchange=\"selectProduct" ) ) mState = Products; + break; + case Components: { + if ( line.contains( QRegExp( "\\s*function" ) ) ) { + mState = SearchProducts; + } + QString key; + QStringList components; + if ( getCpts( line, key, components ) ) { + mComponents.append( components ); + } + } + case Products: { + if ( line.contains( "</select>" ) ) mState = Finished; + QString product = getAttribute( line, "value" ); + if ( !product.isEmpty() ) { + kdDebug() << "PRODUCT: " << product << endl; + mProducts.append( product ); + } + break; + } + case Finished: + default: + break; + } + + return KBB::Error(); +} + +void HtmlParser_2_17_1::processResult( Package::List &packages ) +{ + QStringList::ConstIterator itProduct = mProducts.begin(); + QValueList<QStringList>::ConstIterator itComponents = mComponents.begin(); + + while( itProduct != mProducts.end() && itComponents != mComponents.end() ) { + packages.append( Package( new PackageImpl( *itProduct, "", 0, Person(), + *itComponents ) ) ); + ++itProduct; + ++itComponents; + } +} |