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

tdenewstuff

  • tdenewstuff
provider.cpp
1 /*
2  This file is part of KOrganizer.
3  Copyright (c) 2002 Cornelius Schumacher <schumacher@kde.org>
4  Copyright (c) 2014 Timothy Pearson <kb9vqf@pearsoncomputing.net>
5 
6  This library is free software; you can redistribute it and/or
7  modify it under the terms of the GNU Library General Public
8  License as published by the Free Software Foundation; either
9  version 2 of the License, or (at your option) any later version.
10 
11  This library is distributed in the hope that it will be useful,
12  but WITHOUT ANY WARRANTY; without even the implied warranty of
13  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14  Library General Public License for more details.
15 
16  You should have received a copy of the GNU Library General Public License
17  along with this library; see the file COPYING.LIB. If not, write to
18  the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
19  Boston, MA 02110-1301, USA.
20 */
21 
22 #include <tdeconfig.h>
23 #include <kdebug.h>
24 #include <tdeio/job.h>
25 #include <tdeglobal.h>
26 #include <tdemessagebox.h>
27 #include <tdelocale.h>
28 
29 #include <tqptrdict.h>
30 #include <tqwindowdefs.h>
31 
32 #include "provider.h"
33 #include "provider.moc"
34 
35 using namespace KNS;
36 
37 // BCI for KDE 3.5 only
38 
39 class ProviderPrivate
40 {
41  public:
42  ProviderPrivate(){}
43  KURL mDownloadUrlLatest;
44  KURL mDownloadUrlScore;
45  KURL mDownloadUrlDownloads;
46 };
47 
48 static TQPtrDict<ProviderPrivate> *d_ptr_prov = 0;
49 
50 static ProviderPrivate *d_prov(const Provider *p)
51 {
52  if(!d_ptr_prov)
53  {
54  d_ptr_prov = new TQPtrDict<ProviderPrivate>();
55  d_ptr_prov->setAutoDelete(true);
56  }
57  ProviderPrivate *ret = d_ptr_prov->find((void*)p);
58  if(!ret)
59  {
60  ret = new ProviderPrivate();
61  d_ptr_prov->replace((void*)p, ret);
62  }
63  return ret;
64 }
65 
66 KURL Provider::downloadUrlVariant( TQString variant ) const
67 {
68  if((variant == "latest") && (d_prov(this)->mDownloadUrlLatest.isValid()))
69  return d_prov(this)->mDownloadUrlLatest;
70  if((variant == "score") && (d_prov(this)->mDownloadUrlScore.isValid()))
71  return d_prov(this)->mDownloadUrlScore;
72  if((variant == "downloads") && (d_prov(this)->mDownloadUrlDownloads.isValid()))
73  return d_prov(this)->mDownloadUrlDownloads;
74 
75  return mDownloadUrl;
76 }
77 
78 // BCI part ends here
79 
80 Provider::Provider( TQString type, TQWidget* parent ) : mNoUpload( false ), mParent( parent ), mLoaded( false ), mContentType( type )
81 {
82 }
83 
84 Provider::Provider( const TQDomElement &e, TQString type, TQWidget* parent ) : mNoUpload( false ), mParent( parent ), mLoaded( false ), mContentType( type )
85 {
86  parseDomElement( e );
87 }
88 
89 Provider::~Provider()
90 {
91  if (d_ptr_prov)
92  {
93  ProviderPrivate *p = d_ptr_prov->find(this);
94  if (p)
95  d_ptr_prov->remove(p);
96 
97  if (d_ptr_prov->isEmpty())
98  {
99  delete d_ptr_prov;
100  d_ptr_prov = 0L;
101  }
102  }
103 }
104 
105 bool Provider::loaded()
106 {
107  return mLoaded;
108 }
109 
110 void Provider::setName( const TQString &name )
111 {
112  mName = name;
113 }
114 
115 TQString Provider::name() const
116 {
117  return mName;
118 }
119 
120 
121 void Provider::setIcon( const KURL &url )
122 {
123  mIcon = url;
124 }
125 
126 KURL Provider::icon() const
127 {
128  return mIcon;
129 }
130 
131 
132 void Provider::setDownloadUrl( const KURL &url )
133 {
134  mDownloadUrl = url;
135 }
136 
137 KURL Provider::downloadUrl() const
138 {
139  return mDownloadUrl;
140 }
141 
142 
143 void Provider::setUploadUrl( const KURL &url )
144 {
145  mUploadUrl = url;
146 }
147 
148 KURL Provider::uploadUrl() const
149 {
150  return mUploadUrl;
151 }
152 
153 
154 void Provider::setNoUploadUrl( const KURL &url )
155 {
156  mNoUploadUrl = url;
157 }
158 
159 KURL Provider::noUploadUrl() const
160 {
161  return mNoUploadUrl;
162 }
163 
164 
165 void Provider::setNoUpload( bool enabled )
166 {
167  mNoUpload = enabled;
168 }
169 
170 bool Provider::noUpload() const
171 {
172  return mNoUpload;
173 }
174 
175 void Provider::parseDomElement( const TQDomElement &element )
176 {
177  bool contentAvailable = false;
178 
179  if ( element.tagName() != "provider" ) return;
180 
181  TQDomNode n;
182  for ( n = element.firstChild(); !n.isNull(); n = n.nextSibling() ) {
183  TQDomElement p = n.toElement();
184 
185  if ( p.tagName() == "location" ) mBaseURL = p.text();
186  if ( p.tagName() == "icon" ) {
187  KURL iconurl( p.text() );
188  if(!iconurl.isValid()) iconurl.setPath( p.text() );
189  setIcon( iconurl );
190  }
191 
192  if ( p.tagName() == "noupload" ) setNoUpload( true );
193  if ( p.tagName() == "name" ) setName( p.text().stripWhiteSpace() );
194 
195  if ( p.tagName() == "services" ) {
196  TQDomNode n2;
197  for ( n2 = p.firstChild(); !n2.isNull(); n2 = n2.nextSibling() ) {
198  TQDomElement p = n2.toElement();
199 
200  if ( p.tagName() == "content" ) contentAvailable = true;
201  }
202  }
203  }
204 
205  if (!mBaseURL.endsWith("/")) {
206  mBaseURL.append("/");
207  }
208 
209  if (contentAvailable) {
210  // Load content type list
211  KURL contentTypeUrl( mBaseURL + "content/categories" );
212 
213  kdDebug() << "Provider::parseDomElement(): contentTypeUrl: " << contentTypeUrl << endl;
214 
215  TDEIO::TransferJob *job = TDEIO::get( KURL( contentTypeUrl ), false, false );
216  connect( job, TQ_SIGNAL( result( TDEIO::Job * ) ),
217  TQ_SLOT( slotJobResult( TDEIO::Job * ) ) );
218  connect( job, TQ_SIGNAL( data( TDEIO::Job *, const TQByteArray & ) ),
219  TQ_SLOT( slotJobData( TDEIO::Job *, const TQByteArray & ) ) );
220  }
221 }
222 
223 TQDomElement Provider::createDomElement( TQDomDocument &doc, TQDomElement &parent )
224 {
225  TQDomElement entry = doc.createElement( "stuff" );
226  parent.appendChild( entry );
227 
228  TQDomElement n = doc.createElement( "name" );
229  n.appendChild( doc.createTextNode( name() ) );
230  entry.appendChild( n );
231 
232  return entry;
233 }
234 
235 void Provider::slotJobData( TDEIO::Job *, const TQByteArray &data )
236 {
237  kdDebug() << "Provider::slotJobData()" << endl;
238 
239  if ( data.size() == 0 ) return;
240 
241  TQCString str( data, data.size() + 1 );
242 
243  mJobData.append( TQString::fromUtf8( str ) );
244 }
245 
246 void Provider::slotJobResult( TDEIO::Job *job )
247 {
248  if ( job->error() ) {
249  if (mParent) {
250  job->showErrorDialog( mParent );
251  }
252  return;
253  }
254 
255  kdDebug() << "--CONTENT-START--" << endl << mJobData << "--CONT_END--"
256  << endl;
257 
258  TQDomDocument doc;
259  if ( !doc.setContent( mJobData ) ) {
260  if (mParent) {
261  KMessageBox::error( mParent, i18n("Error parsing category list.") );
262  }
263  return;
264  }
265 
266  TQDomElement categories = doc.documentElement();
267 
268  if ( categories.isNull() ) {
269  kdDebug() << "No document in Content.xml." << endl;
270  }
271 
272  TQStringList desiredCategoryList;
273  TQString desiredCategories;
274 
275  TQDomNode n;
276  for ( n = categories.firstChild(); !n.isNull(); n = n.nextSibling() ) {
277  TQDomElement p = n.toElement();
278 
279  if ( p.tagName() == "data" ) {
280  TQDomNode n2;
281  for ( n2 = p.firstChild(); !n2.isNull(); n2 = n2.nextSibling() ) {
282  TQDomElement p = n2.toElement();
283 
284  if ( p.tagName() == "category" ) {
285  TQDomNode n3;
286  TQString id;
287  TQString name;
288  for ( n3 = p.firstChild(); !n3.isNull(); n3 = n3.nextSibling() ) {
289  TQDomElement p = n3.toElement();
290 
291  if ( p.tagName() == "id" ) {
292  id = p.text();
293  }
294 
295  if ( p.tagName() == "name" ) {
296  name = p.text();
297  }
298  }
299 
300  if (mContentType == "") {
301  desiredCategoryList.append(id);
302  }
303  else {
304  if (name.lower().contains(mContentType.lower())) {
305  desiredCategoryList.append(id);
306  }
307  }
308  }
309  }
310  }
311  }
312 
313  desiredCategories = desiredCategoryList.join("x");
314 
315  // int maxEntries = 10;
316  //int maxEntries = 50;
317  int maxEntries = 100;
318 
319  // FIXME
320  // The download URL assumes no more than 100 entries will be present on the remote server
321  // 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
322  setDownloadUrl( KURL( mBaseURL + "content/data?categories=" + desiredCategories + "&search=&sortmode=alpha&page=0&pagesize=" + TQString("%1").arg(maxEntries) ) );
323  // FIXME
324  // Uploading is not implemented at this time
325  setUploadUrl( KURL( mBaseURL ) );
326  setNoUploadUrl( KURL( mBaseURL ) );
327 
328  d_prov(this)->mDownloadUrlLatest = KURL( mBaseURL + "content/data?categories=" + desiredCategories + "&search=&sortmode=new&page=0&pagesize=" + TQString("%1").arg(maxEntries) );
329  d_prov(this)->mDownloadUrlScore = KURL( mBaseURL + "content/data?categories=" + desiredCategories + "&search=&sortmode=high&page=0&pagesize=" + TQString("%1").arg(maxEntries) );
330  d_prov(this)->mDownloadUrlDownloads = KURL( mBaseURL + "content/data?categories=" + desiredCategories + "&search=&sortmode=down&page=0&pagesize=" + TQString("%1").arg(maxEntries) );
331 
332  mLoaded = true;
333  emit providerLoaded();
334 }
335 
336 
337 ProviderLoader::ProviderLoader( TQWidget *parentWidget ) :
338  TQObject( parentWidget )
339 {
340  mProviders.setAutoDelete( true );
341 }
342 
343 void ProviderLoader::load( const TQString &type, const TQString &providersList )
344 {
345  kdDebug() << "ProviderLoader::load()" << endl;
346 
347  mProviders.clear();
348  mJobData = "";
349  mContentType = type;
350 
351  TDEConfig *cfg = TDEGlobal::config();
352  cfg->setGroup("TDENewStuff");
353 
354  TQString providersUrl = providersList;
355  if( providersUrl.isEmpty() ) {
356  providersUrl = cfg->readEntry( "ProvidersUrl" );
357  }
358 
359  if ( providersUrl.isEmpty() ) {
360  TQString server = cfg->readEntry( "MasterServer",
361  "https://www.trinitydesktop.org" );
362  providersUrl = server + "/ocs/providers.xml";
363  }
364 
365  kdDebug() << "ProviderLoader::load(): providersUrl: " << providersUrl << endl;
366 
367  TDEIO::TransferJob *job = TDEIO::get( KURL( providersUrl ), false, false );
368  connect( job, TQ_SIGNAL( result( TDEIO::Job * ) ),
369  TQ_SLOT( slotJobResult( TDEIO::Job * ) ) );
370  connect( job, TQ_SIGNAL( data( TDEIO::Job *, const TQByteArray & ) ),
371  TQ_SLOT( slotJobData( TDEIO::Job *, const TQByteArray & ) ) );
372  connect( job, TQ_SIGNAL( percent (TDEIO::Job *, unsigned long) ),
373  TQ_SIGNAL( percent (TDEIO::Job *, unsigned long) ) );
374 
375 // job->dumpObjectInfo();
376 }
377 
378 void ProviderLoader::slotJobData( TDEIO::Job *, const TQByteArray &data )
379 {
380  kdDebug() << "ProviderLoader::slotJobData()" << endl;
381 
382  if ( data.size() == 0 ) return;
383 
384  TQCString str( data, data.size() + 1 );
385 
386  mJobData.append( TQString::fromUtf8( str ) );
387 }
388 
389 void ProviderLoader::slotJobResult( TDEIO::Job *job )
390 {
391  if ( job->error() ) {
392  job->showErrorDialog( static_cast<TQWidget*>(parent()) );
393  emit error();
394  return;
395  }
396 
397  kdDebug() << "--PROVIDERS-START--" << endl << mJobData << "--PROV_END--"
398  << endl;
399 
400  TQDomDocument doc;
401  if ( !doc.setContent( mJobData ) ) {
402  KMessageBox::error( static_cast<TQWidget*>(parent()), i18n("Error parsing providers list.") );
403  emit error();
404  return;
405  }
406 
407  TQDomElement providers = doc.documentElement();
408 
409  if ( providers.isNull() ) {
410  kdDebug() << "No document in Providers.xml." << endl;
411  emit error();
412  return;
413  }
414 
415  TQDomNode n;
416  for ( n = providers.firstChild(); !n.isNull(); n = n.nextSibling() ) {
417  TQDomElement p = n.toElement();
418 
419  if ( p.tagName() == "provider" ) {
420  Provider* prov = new Provider( p, mContentType, static_cast<TQWidget*>(parent()) );
421  mProviders.append( prov );
422  connect( prov, TQ_SIGNAL( providerLoaded() ), this, TQ_SLOT( providerLoaded() ) );
423  }
424  }
425 }
426 
427 void ProviderLoader::providerLoaded() {
428  Provider* prov = NULL;
429  bool allLoaded = true;
430  for ( prov = mProviders.first(); prov; prov = mProviders.next() ) {
431  if (!prov->loaded()) {
432  allLoaded = false;
433  break;
434  }
435  }
436 
437  if (allLoaded) {
438  emit providersLoaded( &mProviders );
439  }
440 }
KNS::ProviderLoader::ProviderLoader
ProviderLoader(TQWidget *parentWidget)
Constructor.
Definition: provider.cpp:337
KNS::ProviderLoader::providersLoaded
void providersLoaded(Provider::List *)
Indicates that the list of providers has been successfully loaded.
KNS::ProviderLoader::load
void load(const TQString &type, const TQString &providerList=TQString::null)
Starts asynchronously loading the list of providers of the specified type.
Definition: provider.cpp:343
KNS::Provider
TDENewStuff provider container.
Definition: provider.h:48
KNS::Provider::downloadUrl
KURL downloadUrl() const
Retrieves the download URL.
Definition: provider.cpp:137
KNS::Provider::name
TQString name() const
Retrieves the common name of the provider.
Definition: provider.cpp:115
KNS::Provider::setNoUpload
void setNoUpload(bool)
Indicate whether provider supports uploads.
Definition: provider.cpp:165
KNS::Provider::uploadUrl
KURL uploadUrl() const
Retrieves the upload URL.
Definition: provider.cpp:148
KNS::Provider::setIcon
void setIcon(const KURL &)
Sets the URL for an icon for this provider.
Definition: provider.cpp:121
KNS::Provider::Provider
Provider(TQString type=TQString::null, TQWidget *parent=0)
Constructor.
Definition: provider.cpp:80
KNS::Provider::noUpload
bool noUpload() const
Query whether provider supports uploads.
Definition: provider.cpp:170
KNS::Provider::icon
KURL icon() const
Retrieves the icon URL for this provider.
Definition: provider.cpp:126
KNS::Provider::noUploadUrl
KURL noUploadUrl() const
Retrieves the URL where a user is led if the provider does not support uploads.
Definition: provider.cpp:159
KNS::Provider::loaded
bool loaded()
Definition: provider.cpp:105
KNS::Provider::~Provider
virtual ~Provider()
Destructor.
Definition: provider.cpp:89
KNS::Provider::setNoUploadUrl
void setNoUploadUrl(const KURL &)
Sets the URL where a user is led if the provider does not support uploads.
Definition: provider.cpp:154
KNS::Provider::downloadUrlVariant
KURL downloadUrlVariant(TQString variant) const
Variant to retrieve 'tagged' download URLs.
Definition: provider.cpp:66
KNS::Provider::setName
void setName(const TQString &)
Sets the common name of the provider.
Definition: provider.cpp:110
KNS::Provider::setUploadUrl
void setUploadUrl(const KURL &)
Sets the upload URL.
Definition: provider.cpp:143
KNS::Provider::setDownloadUrl
void setDownloadUrl(const KURL &)
Sets the download URL.
Definition: provider.cpp:132
KNS
Handles security releated issues, like signing, verifying.
Definition: downloaddialog.h:37

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.9.1
This website is maintained by Timothy Pearson.