00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022 #include <tdeconfig.h>
00023 #include <kdebug.h>
00024 #include <tdeio/job.h>
00025 #include <tdeglobal.h>
00026 #include <tdemessagebox.h>
00027 #include <tdelocale.h>
00028
00029 #include <tqptrdict.h>
00030 #include <tqwindowdefs.h>
00031
00032 #include "provider.h"
00033 #include "provider.moc"
00034
00035 using namespace KNS;
00036
00037
00038
00039 class ProviderPrivate
00040 {
00041 public:
00042 ProviderPrivate(){}
00043 KURL mDownloadUrlLatest;
00044 KURL mDownloadUrlScore;
00045 KURL mDownloadUrlDownloads;
00046 };
00047
00048 static TQPtrDict<ProviderPrivate> *d_ptr_prov = 0;
00049
00050 static ProviderPrivate *d_prov(const Provider *p)
00051 {
00052 if(!d_ptr_prov)
00053 {
00054 d_ptr_prov = new TQPtrDict<ProviderPrivate>();
00055 d_ptr_prov->setAutoDelete(true);
00056 }
00057 ProviderPrivate *ret = d_ptr_prov->find((void*)p);
00058 if(!ret)
00059 {
00060 ret = new ProviderPrivate();
00061 d_ptr_prov->replace((void*)p, ret);
00062 }
00063 return ret;
00064 }
00065
00066 KURL Provider::downloadUrlVariant( TQString variant ) const
00067 {
00068 if((variant == "latest") && (d_prov(this)->mDownloadUrlLatest.isValid()))
00069 return d_prov(this)->mDownloadUrlLatest;
00070 if((variant == "score") && (d_prov(this)->mDownloadUrlScore.isValid()))
00071 return d_prov(this)->mDownloadUrlScore;
00072 if((variant == "downloads") && (d_prov(this)->mDownloadUrlDownloads.isValid()))
00073 return d_prov(this)->mDownloadUrlDownloads;
00074
00075 return mDownloadUrl;
00076 }
00077
00078
00079
00080 Provider::Provider( TQString type, TQWidget* parent ) : mNoUpload( false ), mParent( parent ), mLoaded( false ), mContentType( type )
00081 {
00082 }
00083
00084 Provider::Provider( const TQDomElement &e, TQString type, TQWidget* parent ) : mNoUpload( false ), mParent( parent ), mLoaded( false ), mContentType( type )
00085 {
00086 parseDomElement( e );
00087 }
00088
00089 Provider::~Provider()
00090 {
00091 if (d_ptr_prov)
00092 {
00093 ProviderPrivate *p = d_ptr_prov->find(this);
00094 if (p)
00095 d_ptr_prov->remove(p);
00096
00097 if (d_ptr_prov->isEmpty())
00098 {
00099 delete d_ptr_prov;
00100 d_ptr_prov = 0L;
00101 }
00102 }
00103 }
00104
00105 bool Provider::loaded()
00106 {
00107 return mLoaded;
00108 }
00109
00110 void Provider::setName( const TQString &name )
00111 {
00112 mName = name;
00113 }
00114
00115 TQString Provider::name() const
00116 {
00117 return mName;
00118 }
00119
00120
00121 void Provider::setIcon( const KURL &url )
00122 {
00123 mIcon = url;
00124 }
00125
00126 KURL Provider::icon() const
00127 {
00128 return mIcon;
00129 }
00130
00131
00132 void Provider::setDownloadUrl( const KURL &url )
00133 {
00134 mDownloadUrl = url;
00135 }
00136
00137 KURL Provider::downloadUrl() const
00138 {
00139 return mDownloadUrl;
00140 }
00141
00142
00143 void Provider::setUploadUrl( const KURL &url )
00144 {
00145 mUploadUrl = url;
00146 }
00147
00148 KURL Provider::uploadUrl() const
00149 {
00150 return mUploadUrl;
00151 }
00152
00153
00154 void Provider::setNoUploadUrl( const KURL &url )
00155 {
00156 mNoUploadUrl = url;
00157 }
00158
00159 KURL Provider::noUploadUrl() const
00160 {
00161 return mNoUploadUrl;
00162 }
00163
00164
00165 void Provider::setNoUpload( bool enabled )
00166 {
00167 mNoUpload = enabled;
00168 }
00169
00170 bool Provider::noUpload() const
00171 {
00172 return mNoUpload;
00173 }
00174
00175 void Provider::parseDomElement( const TQDomElement &element )
00176 {
00177 bool contentAvailable = false;
00178
00179 if ( element.tagName() != "provider" ) return;
00180
00181 TQDomNode n;
00182 for ( n = element.firstChild(); !n.isNull(); n = n.nextSibling() ) {
00183 TQDomElement p = n.toElement();
00184
00185 if ( p.tagName() == "location" ) mBaseURL = p.text();
00186 if ( p.tagName() == "icon" ) {
00187 KURL iconurl( p.text() );
00188 if(!iconurl.isValid()) iconurl.setPath( p.text() );
00189 setIcon( iconurl );
00190 }
00191
00192 if ( p.tagName() == "noupload" ) setNoUpload( true );
00193 if ( p.tagName() == "name" ) setName( p.text().stripWhiteSpace() );
00194
00195 if ( p.tagName() == "services" ) {
00196 TQDomNode n2;
00197 for ( n2 = p.firstChild(); !n2.isNull(); n2 = n2.nextSibling() ) {
00198 TQDomElement p = n2.toElement();
00199
00200 if ( p.tagName() == "content" ) contentAvailable = true;
00201 }
00202 }
00203 }
00204
00205 if (!mBaseURL.endsWith("/")) {
00206 mBaseURL.append("/");
00207 }
00208
00209 if (contentAvailable) {
00210
00211 KURL contentTypeUrl( mBaseURL + "content/categories" );
00212
00213 kdDebug() << "Provider::parseDomElement(): contentTypeUrl: " << contentTypeUrl << endl;
00214
00215 TDEIO::TransferJob *job = TDEIO::get( KURL( contentTypeUrl ), false, false );
00216 connect( job, TQT_SIGNAL( result( TDEIO::Job * ) ),
00217 TQT_SLOT( slotJobResult( TDEIO::Job * ) ) );
00218 connect( job, TQT_SIGNAL( data( TDEIO::Job *, const TQByteArray & ) ),
00219 TQT_SLOT( slotJobData( TDEIO::Job *, const TQByteArray & ) ) );
00220 }
00221 }
00222
00223 TQDomElement Provider::createDomElement( TQDomDocument &doc, TQDomElement &parent )
00224 {
00225 TQDomElement entry = doc.createElement( "stuff" );
00226 parent.appendChild( entry );
00227
00228 TQDomElement n = doc.createElement( "name" );
00229 n.appendChild( doc.createTextNode( name() ) );
00230 entry.appendChild( n );
00231
00232 return entry;
00233 }
00234
00235 void Provider::slotJobData( TDEIO::Job *, const TQByteArray &data )
00236 {
00237 kdDebug() << "Provider::slotJobData()" << endl;
00238
00239 if ( data.size() == 0 ) return;
00240
00241 TQCString str( data, data.size() + 1 );
00242
00243 mJobData.append( TQString::fromUtf8( str ) );
00244 }
00245
00246 void Provider::slotJobResult( TDEIO::Job *job )
00247 {
00248 if ( job->error() ) {
00249 if (mParent) {
00250 job->showErrorDialog( mParent );
00251 }
00252 return;
00253 }
00254
00255 kdDebug() << "--CONTENT-START--" << endl << mJobData << "--CONT_END--"
00256 << endl;
00257
00258 TQDomDocument doc;
00259 if ( !doc.setContent( mJobData ) ) {
00260 if (mParent) {
00261 KMessageBox::error( mParent, i18n("Error parsing category list.") );
00262 }
00263 return;
00264 }
00265
00266 TQDomElement categories = doc.documentElement();
00267
00268 if ( categories.isNull() ) {
00269 kdDebug() << "No document in Content.xml." << endl;
00270 }
00271
00272 TQStringList desiredCategoryList;
00273 TQString desiredCategories;
00274
00275 TQDomNode n;
00276 for ( n = categories.firstChild(); !n.isNull(); n = n.nextSibling() ) {
00277 TQDomElement p = n.toElement();
00278
00279 if ( p.tagName() == "data" ) {
00280 TQDomNode n2;
00281 for ( n2 = p.firstChild(); !n2.isNull(); n2 = n2.nextSibling() ) {
00282 TQDomElement p = n2.toElement();
00283
00284 if ( p.tagName() == "category" ) {
00285 TQDomNode n3;
00286 TQString id;
00287 TQString name;
00288 for ( n3 = p.firstChild(); !n3.isNull(); n3 = n3.nextSibling() ) {
00289 TQDomElement p = n3.toElement();
00290
00291 if ( p.tagName() == "id" ) {
00292 id = p.text();
00293 }
00294
00295 if ( p.tagName() == "name" ) {
00296 name = p.text();
00297 }
00298 }
00299
00300 if (mContentType == "") {
00301 desiredCategoryList.append(id);
00302 }
00303 else {
00304 if (name.lower().contains(mContentType.lower())) {
00305 desiredCategoryList.append(id);
00306 }
00307 }
00308 }
00309 }
00310 }
00311 }
00312
00313 desiredCategories = desiredCategoryList.join("x");
00314
00315
00316
00317 int maxEntries = 100;
00318
00319
00320
00321
00322 setDownloadUrl( KURL( mBaseURL + "content/data?categories=" + desiredCategories + "&search=&sortmode=alpha&page=0&pagesize=" + TQString("%1").arg(maxEntries) ) );
00323
00324
00325 setUploadUrl( KURL( mBaseURL ) );
00326 setNoUploadUrl( KURL( mBaseURL ) );
00327
00328 d_prov(this)->mDownloadUrlLatest = KURL( mBaseURL + "content/data?categories=" + desiredCategories + "&search=&sortmode=new&page=0&pagesize=" + TQString("%1").arg(maxEntries) );
00329 d_prov(this)->mDownloadUrlScore = KURL( mBaseURL + "content/data?categories=" + desiredCategories + "&search=&sortmode=high&page=0&pagesize=" + TQString("%1").arg(maxEntries) );
00330 d_prov(this)->mDownloadUrlDownloads = KURL( mBaseURL + "content/data?categories=" + desiredCategories + "&search=&sortmode=down&page=0&pagesize=" + TQString("%1").arg(maxEntries) );
00331
00332 mLoaded = true;
00333 emit providerLoaded();
00334 }
00335
00336
00337 ProviderLoader::ProviderLoader( TQWidget *parentWidget ) :
00338 TQObject( parentWidget )
00339 {
00340 mProviders.setAutoDelete( true );
00341 }
00342
00343 void ProviderLoader::load( const TQString &type, const TQString &providersList )
00344 {
00345 kdDebug() << "ProviderLoader::load()" << endl;
00346
00347 mProviders.clear();
00348 mJobData = "";
00349 mContentType = type;
00350
00351 TDEConfig *cfg = TDEGlobal::config();
00352 cfg->setGroup("TDENewStuff");
00353
00354 TQString providersUrl = providersList;
00355 if( providersUrl.isEmpty() ) {
00356 providersUrl = cfg->readEntry( "ProvidersUrl" );
00357 }
00358
00359 if ( providersUrl.isEmpty() ) {
00360 TQString server = cfg->readEntry( "MasterServer",
00361 "https://www.trinitydesktop.org" );
00362 providersUrl = server + "/ocs/providers.xml";
00363 }
00364
00365 kdDebug() << "ProviderLoader::load(): providersUrl: " << providersUrl << endl;
00366
00367 TDEIO::TransferJob *job = TDEIO::get( KURL( providersUrl ), false, false );
00368 connect( job, TQT_SIGNAL( result( TDEIO::Job * ) ),
00369 TQT_SLOT( slotJobResult( TDEIO::Job * ) ) );
00370 connect( job, TQT_SIGNAL( data( TDEIO::Job *, const TQByteArray & ) ),
00371 TQT_SLOT( slotJobData( TDEIO::Job *, const TQByteArray & ) ) );
00372 connect( job, TQT_SIGNAL( percent (TDEIO::Job *, unsigned long) ),
00373 TQT_SIGNAL( percent (TDEIO::Job *, unsigned long) ) );
00374
00375
00376 }
00377
00378 void ProviderLoader::slotJobData( TDEIO::Job *, const TQByteArray &data )
00379 {
00380 kdDebug() << "ProviderLoader::slotJobData()" << endl;
00381
00382 if ( data.size() == 0 ) return;
00383
00384 TQCString str( data, data.size() + 1 );
00385
00386 mJobData.append( TQString::fromUtf8( str ) );
00387 }
00388
00389 void ProviderLoader::slotJobResult( TDEIO::Job *job )
00390 {
00391 if ( job->error() ) {
00392 job->showErrorDialog( TQT_TQWIDGET(parent()) );
00393 emit error();
00394 return;
00395 }
00396
00397 kdDebug() << "--PROVIDERS-START--" << endl << mJobData << "--PROV_END--"
00398 << endl;
00399
00400 TQDomDocument doc;
00401 if ( !doc.setContent( mJobData ) ) {
00402 KMessageBox::error( TQT_TQWIDGET(parent()), i18n("Error parsing providers list.") );
00403 emit error();
00404 return;
00405 }
00406
00407 TQDomElement providers = doc.documentElement();
00408
00409 if ( providers.isNull() ) {
00410 kdDebug() << "No document in Providers.xml." << endl;
00411 emit error();
00412 return;
00413 }
00414
00415 TQDomNode n;
00416 for ( n = providers.firstChild(); !n.isNull(); n = n.nextSibling() ) {
00417 TQDomElement p = n.toElement();
00418
00419 if ( p.tagName() == "provider" ) {
00420 Provider* prov = new Provider( p, mContentType, TQT_TQWIDGET(parent()) );
00421 mProviders.append( prov );
00422 connect( prov, TQT_SIGNAL( providerLoaded() ), this, TQT_SLOT( providerLoaded() ) );
00423 }
00424 }
00425 }
00426
00427 void ProviderLoader::providerLoaded() {
00428 Provider* prov = NULL;
00429 bool allLoaded = true;
00430 for ( prov = mProviders.first(); prov; prov = mProviders.next() ) {
00431 if (!prov->loaded()) {
00432 allLoaded = false;
00433 break;
00434 }
00435 }
00436
00437 if (allLoaded) {
00438 emit providersLoaded( &mProviders );
00439 }
00440 }