provider.cpp00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
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
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;
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
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
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
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 }
|