provider.cpp

00001 /*
00002     This file is part of KOrganizer.
00003     Copyright (c) 2002 Cornelius Schumacher <schumacher@kde.org>
00004 
00005     This library is free software; you can redistribute it and/or
00006     modify it under the terms of the GNU Library General Public
00007     License as published by the Free Software Foundation; either
00008     version 2 of the License, or (at your option) any later version.
00009 
00010     This library is distributed in the hope that it will be useful,
00011     but WITHOUT ANY WARRANTY; without even the implied warranty of
00012     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
00013     Library General Public License for more details.
00014 
00015     You should have received a copy of the GNU Library General Public License
00016     along with this library; see the file COPYING.LIB.  If not, write to
00017     the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
00018     Boston, MA 02110-1301, USA.
00019 */
00020 
00021 #include <kconfig.h>
00022 #include <kdebug.h>
00023 #include <kio/job.h>
00024 #include <kglobal.h>
00025 #include <kmessagebox.h>
00026 #include <klocale.h>
00027 
00028 #include <qptrdict.h>
00029 #include <qwindowdefs.h>
00030 
00031 #include "provider.h"
00032 #include "provider.moc"
00033 
00034 using namespace KNS;
00035 
00036 // BCI for KDE 3.5 only
00037 
00038 class ProviderPrivate
00039 {
00040   public:
00041   ProviderPrivate(){}
00042   KURL mDownloadUrlLatest;
00043   KURL mDownloadUrlScore;
00044   KURL mDownloadUrlDownloads;
00045 };
00046 
00047 static QPtrDict<ProviderPrivate> *d_ptr_prov = 0;
00048 
00049 static void cleanup_d_ptr_prov()
00050 {
00051   delete d_ptr_prov;
00052   d_ptr_prov = 0; // not in BIC guide - add there
00053 }
00054 
00055 static ProviderPrivate *d_prov(const Provider *p)
00056 {
00057   if(!d_ptr_prov)
00058   {
00059     d_ptr_prov = new QPtrDict<ProviderPrivate>();
00060     qAddPostRoutine(cleanup_d_ptr_prov);
00061   }
00062   ProviderPrivate *ret = d_ptr_prov->find((void*)p);
00063   if(!ret)
00064   {
00065     ret = new ProviderPrivate();
00066     d_ptr_prov->replace((void*)p, ret);
00067   }
00068   return ret;
00069 }
00070 
00071 KURL Provider::downloadUrlVariant( QString variant ) const
00072 {
00073   if((variant == "latest") && (d_prov(this)->mDownloadUrlLatest.isValid()))
00074     return d_prov(this)->mDownloadUrlLatest;
00075   if((variant == "score") && (d_prov(this)->mDownloadUrlScore.isValid()))
00076     return d_prov(this)->mDownloadUrlScore;
00077   if((variant == "downloads") && (d_prov(this)->mDownloadUrlDownloads.isValid()))
00078     return d_prov(this)->mDownloadUrlDownloads;
00079 
00080   return mDownloadUrl;
00081 }
00082 
00083 // BCI part ends here
00084 
00085 Provider::Provider() : mNoUpload( false )
00086 {
00087 }
00088 
00089 Provider::Provider( const QDomElement &e ) : mNoUpload( false )
00090 {
00091   parseDomElement( e );
00092 }
00093 
00094 Provider::~Provider()
00095 {
00096 }
00097 
00098 
00099 void Provider::setName( const QString &name )
00100 {
00101   mName = name;
00102 }
00103 
00104 QString Provider::name() const
00105 {
00106   return mName;
00107 }
00108 
00109 
00110 void Provider::setIcon( const KURL &url )
00111 {
00112   mIcon = url;
00113 }
00114 
00115 KURL Provider::icon() const
00116 {
00117   return mIcon;
00118 }
00119 
00120 
00121 void Provider::setDownloadUrl( const KURL &url )
00122 {
00123   mDownloadUrl = url;
00124 }
00125 
00126 KURL Provider::downloadUrl() const
00127 {
00128   return mDownloadUrl;
00129 }
00130 
00131 
00132 void Provider::setUploadUrl( const KURL &url )
00133 {
00134   mUploadUrl = url;
00135 }
00136 
00137 KURL Provider::uploadUrl() const
00138 {
00139   return mUploadUrl;
00140 }
00141 
00142 
00143 void Provider::setNoUploadUrl( const KURL &url )
00144 {
00145   mNoUploadUrl = url;
00146 }
00147 
00148 KURL Provider::noUploadUrl() const
00149 {
00150   return mNoUploadUrl;
00151 }
00152 
00153 
00154 void Provider::setNoUpload( bool enabled )
00155 {
00156   mNoUpload = enabled;
00157 }
00158 
00159 bool Provider::noUpload() const
00160 {
00161   return mNoUpload;
00162 }
00163 
00164 
00165 void Provider::parseDomElement( const QDomElement &element )
00166 {
00167   if ( element.tagName() != "provider" ) return;
00168 
00169   setDownloadUrl( KURL( element.attribute("downloadurl") ) );
00170   setUploadUrl( KURL( element.attribute("uploadurl") ) );
00171   setNoUploadUrl( KURL( element.attribute("nouploadurl") ) );
00172 
00173   d_prov(this)->mDownloadUrlLatest = KURL( element.attribute("downloadurl-latest") );
00174   d_prov(this)->mDownloadUrlScore = KURL( element.attribute("downloadurl-score") );
00175   d_prov(this)->mDownloadUrlDownloads = KURL( element.attribute("downloadurl-downloads") );
00176 
00177   KURL iconurl( element.attribute("icon") );
00178   if(!iconurl.isValid()) iconurl.setPath( element.attribute("icon") );
00179   setIcon( iconurl );
00180 
00181   QDomNode n;
00182   for ( n = element.firstChild(); !n.isNull(); n = n.nextSibling() ) {
00183     QDomElement p = n.toElement();
00184     
00185     if ( p.tagName() == "noupload" ) setNoUpload( true );
00186     if ( p.tagName() == "title" ) setName( p.text().stripWhiteSpace() );
00187   }
00188 }
00189 
00190 QDomElement Provider::createDomElement( QDomDocument &doc, QDomElement &parent )
00191 {
00192   QDomElement entry = doc.createElement( "stuff" );
00193   parent.appendChild( entry );
00194 
00195   QDomElement n = doc.createElement( "name" );
00196   n.appendChild( doc.createTextNode( name() ) );
00197   entry.appendChild( n );
00198   
00199   return entry;
00200 }
00201 
00202 
00203 ProviderLoader::ProviderLoader( QWidget *parentWidget ) :
00204   mParentWidget( parentWidget )
00205 {
00206   mProviders.setAutoDelete( true );
00207 }
00208 
00209 void ProviderLoader::load( const QString &type, const QString &providersList )
00210 {
00211   kdDebug(5850) << "ProviderLoader::load()" << endl;
00212 
00213   mProviders.clear();
00214   mJobData = "";
00215 
00216   KConfig *cfg = KGlobal::config();
00217   cfg->setGroup("KNewStuff");
00218 
00219   QString providersUrl = providersList;
00220   if( providersUrl.isEmpty() )
00221     providersUrl = cfg->readEntry( "ProvidersUrl" );
00222 
00223   if ( providersUrl.isEmpty() ) {
00224     // TODO: Replace the default by the real one.
00225     QString server = cfg->readEntry( "MasterServer",
00226                                      "http://korganizer.kde.org" );
00227   
00228     providersUrl = server + "/knewstuff/" + type + "/providers.xml";
00229   }
00230 
00231   kdDebug(5850) << "ProviderLoader::load(): providersUrl: " << providersUrl << endl;
00232   
00233   KIO::TransferJob *job = KIO::get( KURL( providersUrl ), false, false );
00234   connect( job, SIGNAL( result( KIO::Job * ) ),
00235            SLOT( slotJobResult( KIO::Job * ) ) );
00236   connect( job, SIGNAL( data( KIO::Job *, const QByteArray & ) ),
00237            SLOT( slotJobData( KIO::Job *, const QByteArray & ) ) );
00238 
00239 //  job->dumpObjectInfo();
00240 }
00241 
00242 void ProviderLoader::slotJobData( KIO::Job *, const QByteArray &data )
00243 {
00244   kdDebug(5850) << "ProviderLoader::slotJobData()" << endl;
00245 
00246   if ( data.size() == 0 ) return;
00247 
00248   QCString str( data, data.size() + 1 );
00249 
00250   mJobData.append( QString::fromUtf8( str ) );
00251 }
00252 
00253 void ProviderLoader::slotJobResult( KIO::Job *job )
00254 {
00255   if ( job->error() ) {
00256     job->showErrorDialog( mParentWidget );
00257   }
00258 
00259   kdDebug(5850) << "--PROVIDERS-START--" << endl << mJobData << "--PROV_END--"
00260             << endl;
00261 
00262   QDomDocument doc;
00263   if ( !doc.setContent( mJobData ) ) {
00264     KMessageBox::error( mParentWidget, i18n("Error parsing providers list.") );
00265     return;
00266   }
00267 
00268   QDomElement providers = doc.documentElement();
00269 
00270   if ( providers.isNull() ) {
00271     kdDebug(5850) << "No document in Providers.xml." << endl;
00272   }
00273 
00274   QDomNode n;
00275   for ( n = providers.firstChild(); !n.isNull(); n = n.nextSibling() ) {
00276     QDomElement p = n.toElement();
00277  
00278     if ( p.tagName() == "provider" ) {
00279       mProviders.append( new Provider( p ) );
00280     }
00281   }
00282   
00283   emit providersLoaded( &mProviders );
00284 }
KDE Home | KDE Accessibility Home | Description of Access Keys