• Skip to content
  • Skip to link menu
Trinity API Reference
  • Trinity API Reference
  • tdenewstuff
 

tdenewstuff

provider.cpp

00001 /*
00002     This file is part of KOrganizer.
00003     Copyright (c) 2002 Cornelius Schumacher <schumacher@kde.org>
00004     Copyright (c) 2014 Timothy Pearson <kb9vqf@pearsoncomputing.net>
00005 
00006     This library is free software; you can redistribute it and/or
00007     modify it under the terms of the GNU Library General Public
00008     License as published by the Free Software Foundation; either
00009     version 2 of the License, or (at your option) any later version.
00010 
00011     This library is distributed in the hope that it will be useful,
00012     but WITHOUT ANY WARRANTY; without even the implied warranty of
00013     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
00014     Library General Public License for more details.
00015 
00016     You should have received a copy of the GNU Library General Public License
00017     along with this library; see the file COPYING.LIB.  If not, write to
00018     the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
00019     Boston, MA 02110-1301, USA.
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 // BCI for KDE 3.5 only
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 // BCI part ends here
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     // Load content type list
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   // int maxEntries = 10;
00316   //int maxEntries = 50;
00317   int maxEntries = 100;
00318 
00319   // FIXME
00320   // The download URL assumes no more than 100 entries will be present on the remote server
00321   // Any more and assembly of the list from multiple fetched pages will be required; the TDENewStuff Engine class does not have support for paging at this time
00322   setDownloadUrl( KURL( mBaseURL + "content/data?categories=" + desiredCategories + "&search=&sortmode=alpha&page=0&pagesize=" + TQString("%1").arg(maxEntries) ) );
00323   // FIXME
00324   // Uploading is not implemented at this time
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 //  job->dumpObjectInfo();
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 }

tdenewstuff

Skip menu "tdenewstuff"
  • Main Page
  • Namespace List
  • Class Hierarchy
  • Alphabetical List
  • Class List
  • File List
  • Class Members
  • Related Pages

tdenewstuff

Skip menu "tdenewstuff"
  • arts
  • dcop
  • dnssd
  • interfaces
  •   kspeech
  •     interface
  •     library
  •   tdetexteditor
  • kate
  • kded
  • kdoctools
  • kimgio
  • kjs
  • libtdemid
  • libtdescreensaver
  • tdeabc
  • tdecmshell
  • tdecore
  • tdefx
  • tdehtml
  • tdeinit
  • tdeio
  •   bookmarks
  •   httpfilter
  •   kpasswdserver
  •   kssl
  •   tdefile
  •   tdeio
  •   tdeioexec
  • tdeioslave
  •   http
  • tdemdi
  •   tdemdi
  • tdenewstuff
  • tdeparts
  • tdeprint
  • tderandr
  • tderesources
  • tdespell2
  • tdesu
  • tdeui
  • tdeunittest
  • tdeutils
  • tdewallet
Generated for tdenewstuff by doxygen 1.7.1
This website is maintained by Timothy Pearson.