summaryrefslogtreecommitdiffstats
path: root/libkcddb/client.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'libkcddb/client.cpp')
-rw-r--r--libkcddb/client.cpp315
1 files changed, 315 insertions, 0 deletions
diff --git a/libkcddb/client.cpp b/libkcddb/client.cpp
new file mode 100644
index 00000000..07e5e089
--- /dev/null
+++ b/libkcddb/client.cpp
@@ -0,0 +1,315 @@
+/*
+ Copyright (C) 2002 Rik Hemsley (rikkus) <rik@kde.org>
+ Copyright (C) 2002 Benjamin Meyer <ben-devel@meyerhome.net>
+ Copyright (C) 2003 Richard Lärkäng <nouseforaname@home.se>
+
+ 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., 59 Temple Place - Suite 330,
+ Boston, MA 02111-1307, USA.
+*/
+
+#include "client.h"
+#include "synccddbplookup.h"
+#include "asynccddbplookup.h"
+#include "synchttplookup.h"
+#include "asynchttplookup.h"
+#include "syncsmtpsubmit.h"
+#include "asyncsmtpsubmit.h"
+#include "synchttpsubmit.h"
+#include "asynchttpsubmit.h"
+#include "cache.h"
+#include "lookup.h"
+
+#include <kdebug.h>
+
+namespace KCDDB
+{
+ class Client::Private
+ {
+ public:
+
+ Private()
+ : block( true )
+ {}
+
+ Config config;
+ CDInfoList cdInfoList;
+ bool block;
+ };
+
+ Client::Client()
+ : QObject(),
+ cdInfoLookup(0),
+ cdInfoSubmit(0)
+ {
+ d = new Private;
+ d->config.readConfig();
+ }
+
+ Client::~Client()
+ {
+ delete d;
+ delete cdInfoLookup;
+ delete cdInfoSubmit;
+ }
+
+ Config &
+ Client::config() const
+ {
+ return d->config;
+ }
+
+ void
+ Client::setBlockingMode( bool enable )
+ {
+ d->block = enable;
+ }
+
+ bool
+ Client::blockingMode() const
+ {
+ return d->block;
+ }
+
+ CDInfoList
+ Client::lookupResponse() const
+ {
+ return d->cdInfoList;
+ }
+
+ CDInfo
+ Client::bestLookupResponse() const
+ {
+ CDInfo info;
+
+ uint maxrev = 0;
+
+ for ( CDInfoList::Iterator it = d->cdInfoList.begin();
+ it != d->cdInfoList.end(); ++it )
+ {
+ if ( ( *it ).revision >= maxrev )
+ {
+ info = *it;
+ maxrev = info.revision;
+ }
+ }
+
+ return info;
+ }
+
+ CDDB::Result
+ Client::lookup(const TrackOffsetList & trackOffsetList)
+ {
+ d->cdInfoList.clear();
+
+ QString cddbId = Lookup::trackOffsetListToId( trackOffsetList );
+
+ if ( cddbId.isNull() )
+ {
+ kdDebug(60010) << "Can't create cddbid from offset list" << endl;
+ return Lookup::NoRecordFound;
+ }
+
+ if ( Cache::Ignore != d->config.cachePolicy() )
+ {
+ d->cdInfoList = Cache::lookup( cddbId );
+
+ kdDebug(60010) << "Found " << d->cdInfoList.count() << " hit(s)" << endl;
+
+ if ( !d->cdInfoList.isEmpty() )
+ {
+ if ( !blockingMode() )
+ emit finished( Lookup::Success );
+
+ return CDDB::Success;
+ }
+ }
+
+ if ( Cache::Only == d->config.cachePolicy() )
+ {
+ kdDebug(60010) << "Only trying cache. Give up now." << endl;
+ if ( !blockingMode() )
+ emit finished( Lookup::NoRecordFound );
+ return CDDB::NoRecordFound;
+ }
+
+ CDDB::Result r;
+ Lookup::Transport t = ( Lookup::Transport )d->config.lookupTransport();
+
+ // just in case we have an info lookup hanging around, prevent mem leakage
+ delete cdInfoLookup;
+
+ if ( blockingMode() )
+ {
+
+ if( Lookup::CDDBP == t )
+ cdInfoLookup = new SyncCDDBPLookup();
+ else
+ cdInfoLookup = new SyncHTTPLookup();
+
+ r = cdInfoLookup->lookup( d->config.hostname(),
+ d->config.port(), trackOffsetList );
+
+ if ( CDDB::Success == r )
+ {
+ d->cdInfoList = cdInfoLookup->lookupResponse();
+ Cache::store( d->cdInfoList );
+ }
+
+ delete cdInfoLookup;
+ cdInfoLookup = 0L;
+ }
+ else
+ {
+ if( Lookup::CDDBP == t )
+ {
+ cdInfoLookup = new AsyncCDDBPLookup();
+
+ connect( static_cast<AsyncCDDBPLookup *>( cdInfoLookup ),
+ SIGNAL( finished( CDDB::Result ) ),
+ SLOT( slotFinished( CDDB::Result ) ) );
+ }
+ else
+ {
+ cdInfoLookup = new AsyncHTTPLookup();
+
+ connect( static_cast<AsyncHTTPLookup *>( cdInfoLookup ),
+ SIGNAL( finished( CDDB::Result ) ),
+ SLOT( slotFinished( CDDB::Result ) ) );
+ }
+
+ r = cdInfoLookup->lookup( d->config.hostname(),
+ d->config.port(), trackOffsetList );
+
+ if ( Lookup::Success != r )
+ {
+ delete cdInfoLookup;
+ cdInfoLookup = 0L;
+ }
+ }
+
+ return r;
+ }
+
+ void
+ Client::slotFinished( CDDB::Result r )
+ {
+ if ( cdInfoLookup && CDDB::Success == r )
+ {
+ d->cdInfoList = cdInfoLookup->lookupResponse();
+ Cache::store( d->cdInfoList );
+ }
+ else
+ d->cdInfoList.clear();
+
+ emit finished( r );
+
+ if ( cdInfoLookup ) // in case someone called lookup() while finished() was being processed, and deleted cdInfoLookup.
+ {
+ cdInfoLookup->deleteLater();
+ cdInfoLookup = 0L;
+ }
+ }
+
+ void
+ Client::slotSubmitFinished( CDDB::Result r )
+ {
+ emit finished( r );
+
+ cdInfoSubmit->deleteLater();
+ cdInfoSubmit=0L;
+ }
+
+ CDDB::Result
+ Client::submit(const CDInfo &cdInfo, const TrackOffsetList& offsetList)
+ {
+ // Check if it's valid
+
+ if (!cdInfo.isValid())
+ return CDDB::CannotSave;
+
+ uint last=0;
+ for (uint i=0; i < (offsetList.count()-2); i++)
+ {
+ if(last >= offsetList[i])
+ return CDDB::CannotSave;
+ last = offsetList[i];
+ }
+
+ //TODO Check that it is edited
+
+ // just in case we have a cdInfoSubmit, prevent memory leakage
+ delete cdInfoSubmit;
+
+ QString from = d->config.emailAddress();
+
+ switch (d->config.submitTransport())
+ {
+ case Submit::HTTP:
+ {
+ QString hostname = d->config.httpSubmitServer();
+ uint port = d->config.httpSubmitPort();
+
+ if ( blockingMode() )
+ cdInfoSubmit = new SyncHTTPSubmit(from, hostname, port);
+ else
+ {
+ cdInfoSubmit = new AsyncHTTPSubmit(from, hostname, port);
+ connect( static_cast<AsyncHTTPSubmit *>( cdInfoSubmit ),
+ SIGNAL(finished( CDDB::Result ) ),
+ SLOT( slotSubmitFinished( CDDB::Result ) ) );
+ }
+
+ break;
+ }
+ case Submit::SMTP:
+ {
+ QString hostname = d->config.smtpHostname();
+ uint port = d->config.smtpPort();
+ QString username = d->config.smtpUsername();
+
+ if ( blockingMode() )
+ cdInfoSubmit = new SyncSMTPSubmit( hostname, port, username, from, d->config.submitAddress() );
+ else
+ {
+ cdInfoSubmit = new AsyncSMTPSubmit( hostname, port, username, from, d->config.submitAddress() );
+ connect( static_cast<AsyncSMTPSubmit *>( cdInfoSubmit ),
+ SIGNAL( finished( CDDB::Result ) ),
+ SLOT( slotSubmitFinished( CDDB::Result ) ) );
+ }
+ break;
+ }
+ default:
+ kdDebug(60010) << k_funcinfo << "Unsupported transport: " << endl;
+// << CDDB::transportToString(d->config.submitTransport()) << endl;
+ return CDDB::UnknownError;
+ break;
+ }
+
+ CDDB::Result r = cdInfoSubmit->submit( cdInfo, offsetList );
+
+ if ( blockingMode() )
+ {
+ delete cdInfoSubmit;
+ cdInfoSubmit = 0L;
+ }
+
+ return r;
+ }
+}
+
+#include "client.moc"
+
+
+// vim:tabstop=2:shiftwidth=2:expandtab:cinoptions=(s,U1,m1