• 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
35using namespace KNS;
36
37// BCI for KDE 3.5 only
38
39class ProviderPrivate
40{
41 public:
42 ProviderPrivate(){}
43 KURL mDownloadUrlLatest;
44 KURL mDownloadUrlScore;
45 KURL mDownloadUrlDownloads;
46};
47
48static TQPtrDict<ProviderPrivate> *d_ptr_prov = 0;
49
50static 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
66KURL 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
80Provider::Provider( TQString type, TQWidget* parent ) : mNoUpload( false ), mParent( parent ), mLoaded( false ), mContentType( type )
81{
82}
83
84Provider::Provider( const TQDomElement &e, TQString type, TQWidget* parent ) : mNoUpload( false ), mParent( parent ), mLoaded( false ), mContentType( type )
85{
86 parseDomElement( e );
87}
88
89Provider::~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
105bool Provider::loaded()
106{
107 return mLoaded;
108}
109
110void Provider::setName( const TQString &name )
111{
112 mName = name;
113}
114
115TQString Provider::name() const
116{
117 return mName;
118}
119
120
121void Provider::setIcon( const KURL &url )
122{
123 mIcon = url;
124}
125
126KURL Provider::icon() const
127{
128 return mIcon;
129}
130
131
132void Provider::setDownloadUrl( const KURL &url )
133{
134 mDownloadUrl = url;
135}
136
137KURL Provider::downloadUrl() const
138{
139 return mDownloadUrl;
140}
141
142
143void Provider::setUploadUrl( const KURL &url )
144{
145 mUploadUrl = url;
146}
147
148KURL Provider::uploadUrl() const
149{
150 return mUploadUrl;
151}
152
153
154void Provider::setNoUploadUrl( const KURL &url )
155{
156 mNoUploadUrl = url;
157}
158
159KURL Provider::noUploadUrl() const
160{
161 return mNoUploadUrl;
162}
163
164
165void Provider::setNoUpload( bool enabled )
166{
167 mNoUpload = enabled;
168}
169
170bool Provider::noUpload() const
171{
172 return mNoUpload;
173}
174
175void 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
223TQDomElement 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
235void 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
246void 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
337ProviderLoader::ProviderLoader( TQWidget *parentWidget ) :
338 TQObject( parentWidget )
339{
340 mProviders.setAutoDelete( true );
341}
342
343void 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
378void 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
389void 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
427void 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::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.4
This website is maintained by Timothy Pearson.