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.
295 lines
7.6 KiB
295 lines
7.6 KiB
/*
|
|
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;
|
|
}
|
|
}
|