summaryrefslogtreecommitdiffstats
path: root/kbugbuster/backend/bugserver.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'kbugbuster/backend/bugserver.cpp')
-rw-r--r--kbugbuster/backend/bugserver.cpp412
1 files changed, 412 insertions, 0 deletions
diff --git a/kbugbuster/backend/bugserver.cpp b/kbugbuster/backend/bugserver.cpp
new file mode 100644
index 00000000..0e6a70e6
--- /dev/null
+++ b/kbugbuster/backend/bugserver.cpp
@@ -0,0 +1,412 @@
+/*
+ This file is part of KBugBuster.
+ Copyright (c) 2002,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 "bugserver.h"
+#include "kbbprefs.h"
+#include "rdfprocessor.h"
+#include "bugcache.h"
+#include "bugcommand.h"
+#include "mailsender.h"
+#include "bugserverconfig.h"
+#include "htmlparser.h"
+
+#include <kstandarddirs.h>
+#include <ksimpleconfig.h>
+#include <kdebug.h>
+
+BugServer::BugServer()
+{
+ init();
+}
+
+BugServer::BugServer( const BugServerConfig &cfg )
+ : mServerConfig( cfg )
+{
+ init();
+}
+
+void BugServer::init()
+{
+ mCache = new BugCache( identifier() );
+
+ QString commandsFile = locateLocal( "appdata", identifier() + "commands" );
+ mCommandsFile = new KSimpleConfig( commandsFile );
+
+ QString bugzilla = mServerConfig.bugzillaVersion();
+
+ if ( bugzilla == "KDE" ) mProcessor = new DomProcessor( this );
+ else if ( bugzilla == "2.10" ) mProcessor = new HtmlParser_2_10( this );
+ else if ( bugzilla == "2.14.2" ) mProcessor = new HtmlParser_2_14_2( this );
+ else if ( bugzilla == "2.17.1" ) mProcessor = new HtmlParser_2_17_1( this );
+ else mProcessor = new HtmlParser( this );
+
+ loadCommands();
+}
+
+BugServer::~BugServer()
+{
+ saveCommands();
+
+ delete mProcessor;
+ delete mCommandsFile;
+ delete mCache;
+}
+
+void BugServer::setServerConfig( const BugServerConfig &cfg )
+{
+ mServerConfig = cfg;
+}
+
+BugServerConfig &BugServer::serverConfig()
+{
+ return mServerConfig;
+}
+
+QString BugServer::identifier()
+{
+ QString id = mServerConfig.baseUrl().host();
+ return id;
+}
+
+Processor *BugServer::processor() const
+{
+ return mProcessor;
+}
+
+KURL BugServer::packageListUrl()
+{
+ KURL url = mServerConfig.baseUrl();
+
+ mProcessor->setPackageListQuery( url );
+
+ return url;
+}
+
+KURL BugServer::bugListUrl( const Package &product, const QString &component )
+{
+ KURL url = mServerConfig.baseUrl();
+
+ mProcessor->setBugListQuery( url, product, component );
+
+ return url;
+}
+
+KURL BugServer::bugDetailsUrl( const Bug &bug )
+{
+ KURL url = mServerConfig.baseUrl();
+
+ mProcessor->setBugDetailsQuery( url, bug );
+
+ return url;
+}
+
+KURL BugServer::bugLink( const Bug &bug )
+{
+ KURL url = mServerConfig.baseUrl();
+
+ url.setFileName( "show_bug.cgi" );
+ url.setQuery( "id=" + bug.number() );
+
+ kdDebug() << "URL: " << url.url() << endl;
+
+ return url;
+}
+
+KURL BugServer::attachmentViewLink( const QString &id )
+{
+ KURL url = mServerConfig.baseUrl();
+
+ url.setFileName( "attachment.cgi" );
+ url.setQuery( "id=" + id + "&action=view" );
+
+ return url;
+}
+
+KURL BugServer::attachmentEditLink( const QString &id )
+{
+ KURL url = mServerConfig.baseUrl();
+
+ url.setFileName( "attachment.cgi" );
+ url.setQuery( "id=" + id + "&action=edit" );
+
+ return url;
+}
+
+Bug::Status BugServer::bugStatus( const QString &str )
+{
+ if ( str == "UNCONFIRMED" ) {
+ return Bug::Unconfirmed;
+ } else if ( str == "NEW" ) {
+ return Bug::New;
+ } else if ( str == "ASSIGNED" ) {
+ return Bug::Assigned;
+ } else if ( str == "REOPENED" ) {
+ return Bug::Reopened;
+ } else if ( str == "RESOLVED" ) {
+ return Bug::Closed;
+ } else if ( str == "VERIFIED" ) {
+ return Bug::Closed;
+ } else if ( str == "CLOSED" ) {
+ return Bug::Closed;
+ } else {
+ return Bug::StatusUndefined;
+ }
+}
+
+Bug::Severity BugServer::bugSeverity( const QString &str )
+{
+ if ( str == "critical" ) {
+ return Bug::Critical;
+ } else if ( str == "grave" ) {
+ return Bug::Grave;
+ } else if ( str == "major" ) {
+ return Bug::Major;
+ } else if ( str == "crash" ) {
+ return Bug::Crash;
+ } else if ( str == "normal" ) {
+ return Bug::Normal;
+ } else if ( str == "minor" ) {
+ return Bug::Minor;
+ } else if ( str == "wishlist" ) {
+ return Bug::Wishlist;
+ } else {
+ return Bug::SeverityUndefined;
+ }
+}
+
+void BugServer::readConfig( KConfig * /*config*/ )
+{
+}
+
+void BugServer::writeConfig( KConfig * /*config*/ )
+{
+}
+
+bool BugServer::queueCommand( BugCommand *cmd )
+{
+ // mCommands[bug] is a QPtrList. Get or create, set to autodelete, then append command.
+ mCommands[cmd->bug().number()].setAutoDelete( true );
+ QPtrListIterator<BugCommand> cmdIt( mCommands[cmd->bug().number()] );
+ for ( ; cmdIt.current(); ++cmdIt )
+ if ( cmdIt.current()->type() == cmd->type() )
+ return false;
+ mCommands[cmd->bug().number()].append( cmd );
+ return true;
+}
+
+QPtrList<BugCommand> BugServer::queryCommands( const Bug &bug ) const
+{
+ CommandsMap::ConstIterator it = mCommands.find( bug.number() );
+ if (it == mCommands.end()) return QPtrList<BugCommand>();
+ else return *it;
+}
+
+bool BugServer::hasCommandsFor( const Bug &bug ) const
+{
+ CommandsMap::ConstIterator it = mCommands.find( bug.number() );
+ return it != mCommands.end();
+}
+
+void BugServer::sendCommands( MailSender *mailer, const QString &senderName,
+ const QString &senderEmail, bool sendBCC,
+ const QString &recipient )
+{
+ // Disable mail commands for non-KDE servers
+ if ( mServerConfig.baseUrl() != KURL( "http://bugs.kde.org" ) ) return;
+
+ QString controlText;
+
+ // For each bug that has commands.....
+ CommandsMap::ConstIterator it;
+ for(it = mCommands.begin(); it != mCommands.end(); ++it ) {
+ Bug bug;
+ Package pkg;
+ // And for each command....
+ QPtrListIterator<BugCommand> cmdIt( *it );
+ for ( ; cmdIt.current() ; ++cmdIt ) {
+ BugCommand* cmd = cmdIt.current();
+ bug = cmd->bug();
+ if (!cmd->package().isNull())
+ pkg = cmd->package();
+ if (!cmd->controlString().isNull()) {
+ kdDebug() << "control@bugs.kde.org: " << cmd->controlString() << endl;
+ controlText += cmd->controlString() + "\n";
+ } else {
+ kdDebug() << cmd->mailAddress() << ": " << cmd->mailText() << endl;
+ // ### hm, should probably re-use the existing mailer instance and
+ // implement message queueing for smtp
+ MailSender *directMailer = mailer->clone();
+#if 0
+ connect( directMailer, SIGNAL( status( const QString & ) ),
+ this, SIGNAL( infoMessage( const QString & ) ) );
+#endif
+ if (!directMailer->send( senderName, senderEmail, cmd->mailAddress(),
+ cmd->bug().title().prepend( "Re: " ),
+ cmd->mailText(), sendBCC, recipient )) {
+ delete mailer;
+ return;
+ }
+ }
+ }
+ if (!bug.isNull()) {
+ mCommandsFile->deleteGroup( bug.number(), true ); // done, remove command
+ mCache->invalidateBugDetails( bug );
+ if ( !pkg.isNull() ) {
+ mCache->invalidateBugList( pkg, QString::null ); // the status of the bug comes from the buglist...
+
+ QStringList::ConstIterator it2;
+ for (it2 = pkg.components().begin();it2 != pkg.components().end();++it2) {
+ mCache->invalidateBugList( pkg, (*it2) ); // the status of the bug comes from the buglist...
+ }
+ }
+ }
+ }
+
+ if (!controlText.isEmpty()) {
+ kdDebug() << "control@bugs.kde.org doesn't work anymore" << endl;
+#if 0
+ if ( !mailer->send( senderName, senderEmail, "control@bugs.kde.org",
+ i18n("Mail generated by KBugBuster"), controlText,
+ sendBCC, recipient ))
+ return;
+#endif
+ } else {
+ delete mailer;
+ }
+
+ mCommands.clear();
+}
+
+void BugServer::clearCommands( const QString &bug )
+{
+ mCommands.remove( bug );
+ mCommandsFile->deleteGroup( bug, true );
+}
+
+bool BugServer::commandsPending() const
+{
+ if ( mCommands.count() > 0 ) return true;
+ else return false;
+}
+
+QStringList BugServer::listCommands() const
+{
+ QStringList result;
+ CommandsMap::ConstIterator it;
+ for(it = mCommands.begin(); it != mCommands.end(); ++it ) {
+ QPtrListIterator<BugCommand> cmdIt( *it );
+ for ( ; cmdIt.current() ; ++cmdIt ) {
+ BugCommand* cmd = cmdIt.current();
+ if (!cmd->controlString().isNull())
+ result.append( i18n("Control command: %1").arg(cmd->controlString()) );
+ else
+ result.append( i18n("Mail to %1").arg(cmd->mailAddress()) );
+ }
+ }
+ return result;
+}
+
+QStringList BugServer::bugsWithCommands() const
+{
+ QStringList bugs;
+
+ CommandsMap::ConstIterator it;
+ for(it = mCommands.begin(); it != mCommands.end(); ++it ) {
+ bugs.append( it.key() );
+ }
+
+ return bugs;
+}
+
+void BugServer::saveCommands() const
+{
+ CommandsMap::ConstIterator it;
+ for(it = mCommands.begin(); it != mCommands.end(); ++it ) {
+ mCommandsFile->setGroup( it.key() );
+ QPtrListIterator<BugCommand> cmdIt( *it );
+ for ( ; cmdIt.current() ; ++cmdIt ) {
+ BugCommand* cmd = cmdIt.current();
+ cmd->save( mCommandsFile );
+ }
+ }
+
+ mCommandsFile->sync();
+}
+
+void BugServer::loadCommands()
+{
+ mCommands.clear();
+
+ QStringList bugs = mCommandsFile->groupList();
+ QStringList::ConstIterator it;
+ for( it = bugs.begin(); it != bugs.end(); ++it ) {
+ mCommandsFile->setGroup( *it );
+ QMap<QString, QString> entries = mCommandsFile->entryMap ( *it );
+ QMap<QString, QString>::ConstIterator it;
+ for( it = entries.begin(); it != entries.end(); ++it ) {
+ QString type = it.key();
+ BugCommand *cmd = BugCommand::load( mCommandsFile, type );
+ if ( cmd ) {
+ mCommands[cmd->bug().number()].setAutoDelete(true);
+ mCommands[cmd->bug().number()].append(cmd);
+ }
+ }
+ }
+}
+
+void BugServer::setPackages( const Package::List &packages )
+{
+ mPackages = packages;
+}
+
+const Package::List &BugServer::packages() const
+{
+ return mPackages;
+}
+
+void BugServer::setBugs( const Package &pkg, const QString &component,
+ const Bug::List &bugs )
+{
+ QPair<Package, QString> pkg_key = QPair<Package, QString>(pkg, component);
+ mBugs[ pkg_key ] = bugs;
+}
+
+const Bug::List &BugServer::bugs( const Package &pkg, const QString &component )
+{
+ QPair<Package, QString> pkg_key = QPair<Package, QString>(pkg, component);
+ return mBugs[ pkg_key ];
+}
+
+void BugServer::setBugDetails( const Bug &bug, const BugDetails &details )
+{
+ mBugDetails[ bug ] = details;
+}
+
+const BugDetails &BugServer::bugDetails( const Bug &bug )
+{
+ return mBugDetails[ bug ];
+}
+
+/*
+ * vim:sw=4:ts=4:et
+ */