downloaddialog.cpp
00001 /* 00002 This file is part of TDENewStuff. 00003 Copyright (c) 2003 Josef Spillner <spillner@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 "downloaddialog.h" 00023 #include "downloaddialog.moc" 00024 00025 #include <tdelocale.h> 00026 #include <tdelistview.h> 00027 #include <kdebug.h> 00028 #include <tdeio/job.h> 00029 #include <tdeio/netaccess.h> 00030 #include <tdemessagebox.h> 00031 #include <kurl.h> 00032 #include <tdeconfig.h> 00033 #include <tdeapplication.h> 00034 #include <kiconloader.h> 00035 00036 #include <tdenewstuff/entry.h> 00037 #include <tdenewstuff/knewstuffgeneric.h> 00038 #include <tdenewstuff/engine.h> 00039 00040 #include <tqlayout.h> 00041 #include <tqpushbutton.h> 00042 #include <tqdom.h> 00043 #include <tqlabel.h> 00044 #include <tqtextbrowser.h> 00045 #include <tqtabwidget.h> 00046 #include <tqtimer.h> // hack 00047 00048 #define OPENDESKTOP_REDIRECT_URL "opendesktop.org/content/download.php?content=" 00049 #define OPENDESKTOP_REDIRECT_TEXT "If the download does not start in 3 seconds:</span><span class=\"defaulttext\"> <a href=\"" 00050 00051 using namespace KNS; 00052 00053 struct DownloadDialog::Private 00054 { 00055 TQString m_providerlist; 00056 TQWidget *m_page; 00057 TQFrame *m_loadingFrame; 00058 TQLabel *m_loadingLabel; 00059 TDEListView *m_lvtmp_r, *m_lvtmp_d, *m_lvtmp_l; 00060 TQPtrList<Entry> m_installlist; 00061 TQMap<TDEIO::Job*, Provider*> m_variantjobs; 00062 TQMap<TDEIO::Job*, TQStringList> m_variants; 00063 TQMap<Provider*, Provider*> m_newproviders; 00064 }; 00065 00066 class NumSortListViewItem : public TDEListViewItem 00067 { 00068 public: 00069 NumSortListViewItem( TQListView * parent, TQString label1, TQString label2 = TQString::null, TQString label3 = TQString::null, TQString label4 = TQString::null, TQString label5 = TQString::null, TQString label6 = TQString::null, TQString label7 = TQString::null, TQString label8 = TQString::null ) : 00070 TDEListViewItem( parent, label1, label2, label3, label4, label5, label6, label7, label8 ) 00071 { 00072 } 00073 00074 TQString key(int col, bool asc) const { 00075 if (col == 2) 00076 { 00077 TQString s; 00078 s.sprintf("%08d", text(col).toInt()); 00079 return s; 00080 } 00081 return TDEListViewItem::key( col, asc ); 00082 } 00083 }; 00084 00085 class DateSortListViewItem : public TDEListViewItem 00086 { 00087 public: 00088 DateSortListViewItem( TQListView * parent, TQString label1, TQString label2 = TQString::null, TQString label3 = TQString::null, TQString label4 = TQString::null, TQString label5 = TQString::null, TQString label6 = TQString::null, TQString label7 = TQString::null, TQString label8 = TQString::null ) : 00089 TDEListViewItem( parent, label1, label2, label3, label4, label5, label6, label7, label8 ) 00090 { 00091 } 00092 00093 TQString key(int col, bool asc) const { 00094 if (col == 2) 00095 { 00096 TQString s; 00097 TQDate date = TDEGlobal::locale()->readDate(text(col)); 00098 s.sprintf("%08d", date.year() * 366 + date.dayOfYear()); 00099 return s; 00100 } 00101 return TDEListViewItem::key( col, asc ); 00102 } 00103 }; 00104 00105 // BEGIN deprecated for KDE 4 00106 DownloadDialog::DownloadDialog(Engine *engine, TQWidget *) 00107 : KDialogBase(KDialogBase::IconList, i18n("Get Hot New Stuff"), 00108 KDialogBase::Close, KDialogBase::Close) 00109 { 00110 init(engine); 00111 } 00112 00113 DownloadDialog::DownloadDialog(TQWidget *) 00114 : KDialogBase(KDialogBase::IconList, i18n("Get Hot New Stuff"), 00115 KDialogBase::Close, KDialogBase::Close) 00116 { 00117 init(0); 00118 } 00119 00120 void DownloadDialog::open(TQString type) 00121 { 00122 DownloadDialog d; 00123 d.setType(type); 00124 d.load(); 00125 d.exec(); 00126 } 00127 // END deprecated for KDE 4 00128 00129 DownloadDialog::DownloadDialog(Engine *engine, TQWidget *, const TQString& caption) 00130 : KDialogBase(KDialogBase::IconList, (caption.isNull() ? i18n("Get Hot New Stuff") : caption), 00131 KDialogBase::Close, KDialogBase::Close) 00132 { 00133 init(engine); 00134 } 00135 00136 DownloadDialog::DownloadDialog(TQWidget *, const TQString& caption) 00137 : KDialogBase(KDialogBase::IconList, (caption.isNull() ? i18n("Get Hot New Stuff") : caption), 00138 KDialogBase::Close, KDialogBase::Close) 00139 { 00140 init(0); 00141 } 00142 00143 void DownloadDialog::init(Engine *engine) 00144 { 00145 resize(700, 400); 00146 d = new Private(); 00147 00148 m_engine = engine; 00149 d->m_page = NULL; 00150 00151 // Provide graphical feedback to the user while the intial provider load is taking place 00152 d->m_loadingFrame = addPage(i18n("Welcome"), i18n("Welcome"), TQPixmap(TQString(""))); 00153 d->m_loadingLabel = new TQLabel(d->m_loadingFrame); 00154 d->m_loadingLabel->setText(i18n("Loading data providers...")); 00155 TQVBoxLayout *box = new TQVBoxLayout(d->m_loadingFrame); 00156 box->add(d->m_loadingLabel); 00157 box->addItem(new TQSpacerItem(0, 0, TQSizePolicy::MinimumExpanding, TQSizePolicy::MinimumExpanding)); 00158 00159 connect(this, TQT_SIGNAL(aboutToShowPage(TQWidget*)), TQT_SLOT(slotPage(TQWidget*))); 00160 00161 if(!engine) 00162 { 00163 m_loader = new ProviderLoader(this); 00164 connect(m_loader, TQT_SIGNAL(providersLoaded(Provider::List*)), TQT_SLOT(slotProviders(Provider::List*))); 00165 } 00166 00167 m_entries.setAutoDelete(true); 00168 } 00169 00170 DownloadDialog::~DownloadDialog() 00171 { 00172 for (TQMap<TQWidget *, TQValueList<TQPushButton *>* >::const_iterator it = m_buttons.constBegin(); it != m_buttons.constEnd(); ++it) 00173 delete it.data(); 00174 for (TQMap<TQWidget *, TQValueList<TDEListView *>* >::const_iterator it = m_map.constBegin(); it != m_map.constEnd(); ++it) 00175 delete it.data(); 00176 delete d; 00177 } 00178 00179 void DownloadDialog::load() 00180 { 00181 m_loader->load(m_filter, d->m_providerlist); 00182 } 00183 00184 void DownloadDialog::load(TQString providerList) 00185 { 00186 m_loader->load(m_filter, providerList); 00187 } 00188 00189 void DownloadDialog::clear() 00190 { 00191 TQMap<TQWidget*, TQValueList<TDEListView*>* >::Iterator it; 00192 TQMap<TQWidget*, TQValueList<TDEListView*>* >::Iterator end(m_map.end()); 00193 for(it = m_map.begin(); it != end; ++it) 00194 { 00195 TQValueList<TDEListView*> *v = it.data(); 00196 kdDebug() << "clear listviews in " << v << endl; 00197 if(v) 00198 { 00199 (*(v->at(0)))->clear(); 00200 (*(v->at(1)))->clear(); 00201 (*(v->at(2)))->clear(); 00202 00203 //delete (*it); 00204 } 00205 00206 delete it.key(); 00207 } 00208 m_map.clear(); 00209 } 00210 00211 void DownloadDialog::slotProviders(Provider::List *list) 00212 { 00213 d->m_loadingLabel->setText(i18n("Loading data listings...")); 00214 00215 Provider *p; 00216 /*TQFrame *frame;*/ 00217 00218 for(p = list->first(); p; p = list->next()) 00219 { 00220 kdDebug() << "++ provider ++ " << p->name() << endl; 00221 00222 if(!m_filter.isEmpty()) 00223 loadProvider(p); 00224 else 00225 addProvider(p); 00226 /*if(p == list->getFirst()) 00227 slotPage(m_frame);*/ // only if !qtbug 00228 } 00229 } 00230 00231 void DownloadDialog::addProvider(Provider *p) 00232 { 00233 TQFrame *frame; 00234 TQTabWidget *ctl; 00235 TQWidget *w_d, *w_r, *w_l; 00236 TQTextBrowser *rt; 00237 TQString tmp; 00238 int ret; 00239 TQPixmap pix; 00240 00241 kdDebug() << "addProvider()/begin" << endl; 00242 00243 ret = true; 00244 if(p->icon().path().isEmpty()) ret = false; 00245 else 00246 { 00247 if(!p->icon().protocol().isEmpty()) 00248 { 00249 ret = TDEIO::NetAccess::download(p->icon(), tmp, this); 00250 if(ret) pix = TQPixmap(tmp); 00251 } 00252 else 00253 { 00254 pix = TDEGlobal::iconLoader()->loadIcon(p->icon().path(), TDEIcon::Panel); 00255 ret = true; 00256 } 00257 } 00258 if(!ret) pix = TDEGlobal::iconLoader()->loadIcon("knewstuff", TDEIcon::Panel); 00259 if (d->m_loadingFrame) { 00260 delete d->m_loadingFrame; 00261 d->m_loadingFrame = NULL; 00262 } 00263 frame = addPage(p->name(), p->name(), pix); 00264 m_frame = frame; 00265 00266 w_d = new TQWidget(frame); 00267 w_r = new TQWidget(frame); 00268 w_l = new TQWidget(frame); 00269 00270 ctl = new TQTabWidget(frame); 00271 ctl->addTab(w_r, i18n("Highest Rated")); 00272 ctl->addTab(w_d, i18n("Most Downloads")); 00273 ctl->addTab(w_l, i18n("Latest")); 00274 00275 m_curtab = 0; 00276 connect(ctl, TQT_SIGNAL(currentChanged(TQWidget *)), TQT_SLOT(slotTab())); 00277 00278 TQHBoxLayout *box = new TQHBoxLayout(frame); 00279 box->add(ctl); 00280 00281 d->m_lvtmp_r = new TDEListView(w_r); 00282 d->m_lvtmp_r->addColumn(i18n("Name")); 00283 d->m_lvtmp_r->addColumn(i18n("Version")); 00284 d->m_lvtmp_r->addColumn(i18n("Rating")); 00285 d->m_lvtmp_r->setSorting(2, false); 00286 00287 d->m_lvtmp_d = new TDEListView(w_d); 00288 d->m_lvtmp_d->addColumn(i18n("Name")); 00289 d->m_lvtmp_d->addColumn(i18n("Version")); 00290 d->m_lvtmp_d->addColumn(i18n("Downloads")); 00291 d->m_lvtmp_d->setSorting(2, false); 00292 00293 d->m_lvtmp_l = new TDEListView(w_l); 00294 d->m_lvtmp_l->addColumn(i18n("Name")); 00295 d->m_lvtmp_l->addColumn(i18n("Version")); 00296 d->m_lvtmp_l->addColumn(i18n("Release Date")); 00297 d->m_lvtmp_l->setSorting(2, false); 00298 00299 connect(d->m_lvtmp_r, TQT_SIGNAL(clicked(TQListViewItem*)), TQT_SLOT(slotSelected())); 00300 connect(d->m_lvtmp_d, TQT_SIGNAL(clicked(TQListViewItem*)), TQT_SLOT(slotSelected())); 00301 connect(d->m_lvtmp_l, TQT_SIGNAL(clicked(TQListViewItem*)), TQT_SLOT(slotSelected())); 00302 00303 rt = new TQTextBrowser(frame); 00304 rt->setMinimumWidth(150); 00305 00306 TQPushButton *in = new TQPushButton(i18n("Install"), frame); 00307 TQPushButton *de = new TQPushButton(i18n("Details"), frame); 00308 in->setEnabled(false); 00309 de->setEnabled(false); 00310 00311 box->addSpacing(spacingHint()); 00312 TQVBoxLayout *vbox = new TQVBoxLayout(box); 00313 vbox->add(rt); 00314 vbox->addSpacing(spacingHint()); 00315 vbox->add(de); 00316 vbox->add(in); 00317 00318 connect(rt, TQT_SIGNAL(linkClicked(const TQString&)), TQT_SLOT(slotEmail(const TQString&))); 00319 00320 connect(in, TQT_SIGNAL(clicked()), TQT_SLOT(slotInstall())); 00321 connect(de, TQT_SIGNAL(clicked()), TQT_SLOT(slotDetails())); 00322 00323 TQVBoxLayout *box2 = new TQVBoxLayout(w_r); 00324 box2->add(d->m_lvtmp_r); 00325 TQVBoxLayout *box3 = new TQVBoxLayout(w_d); 00326 box3->add(d->m_lvtmp_d); 00327 TQVBoxLayout *box4 = new TQVBoxLayout(w_l); 00328 box4->add(d->m_lvtmp_l); 00329 00330 TQValueList<TDEListView*> *v = new TQValueList<TDEListView*>; 00331 *v << d->m_lvtmp_r << d->m_lvtmp_d << d->m_lvtmp_l; 00332 m_map[frame] = v; 00333 m_rts[frame] = rt; 00334 TQValueList<TQPushButton*> *vb = new TQValueList<TQPushButton*>; 00335 *vb << in << de; 00336 m_buttons[frame] = vb; 00337 m_providers[frame] = p; 00338 00339 kdDebug() << "addProvider()/end; d->m_lvtmp_r = " << d->m_lvtmp_r << endl; 00340 00341 if(m_engine) slotPage(frame); 00342 00343 TQTimer::singleShot(100, this, TQT_SLOT(slotFinish())); 00344 } 00345 00346 void DownloadDialog::slotResult(TDEIO::Job *job) 00347 { 00348 TQDomDocument dom; 00349 TQDomElement knewstuff; 00350 TQDomElement content; 00351 00352 kdDebug() << "got data: " << m_data[job] << endl; 00353 00354 kapp->config()->setGroup("TDENewStuffStatus"); 00355 00356 dom.setContent(m_data[job]); 00357 knewstuff = dom.documentElement(); 00358 00359 for(TQDomNode pn = knewstuff.firstChild(); !pn.isNull(); pn = pn.nextSibling()) 00360 { 00361 TQDomElement stuff = pn.toElement(); 00362 00363 if(stuff.tagName() == "data") 00364 { 00365 content = pn.toElement(); 00366 } 00367 } 00368 00369 for(TQDomNode pn = content.firstChild(); !pn.isNull(); pn = pn.nextSibling()) 00370 { 00371 TQDomElement stuff = pn.toElement(); 00372 00373 kdDebug() << "element: " << stuff.tagName() << endl; 00374 00375 if(stuff.tagName() == "content") 00376 { 00377 Entry *entry = new Entry(stuff); 00378 kdDebug() << "TYPE::" << entry->type() << " FILTER::" << m_filter << endl; 00379 if(!entry->type().isEmpty()) 00380 { 00381 if((!m_filter.isEmpty()) && (entry->type() != m_filter)) continue; 00382 } 00383 00384 /*if((!m_filter.isEmpty()) && (m_jobs[job])) 00385 { 00386 Provider *p = m_jobs[job]; 00387 if(d->m_newproviders[p]) 00388 { 00389 addProvider(p); 00390 slotPage(m_frame); 00391 d->m_newproviders[p] = 0; 00392 } 00393 }*/ 00394 if((!m_filter.isEmpty()) && (d->m_variantjobs[job])) 00395 { 00396 Provider *p = d->m_variantjobs[job]; 00397 00398 /*bool jobsActive = false; 00399 TQMap<TDEIO::Job*, Provider*>::Iterator it; 00400 for ( it = d->m_variantjobs.begin(); it != d->m_variantjobs.end(); ++it ) { 00401 if (it.data() == p) { 00402 if (it.key() != job) { 00403 jobsActive = true; 00404 } 00405 } 00406 }*/ 00407 00408 if(d->m_newproviders[p]) 00409 { 00410 addProvider(p); 00411 slotPage(m_frame); 00412 d->m_newproviders[p] = 0; 00413 } 00414 } 00415 00416 /*if(m_jobs[job]) addEntry(entry); 00417 else*/ 00418 if(d->m_variantjobs[job]) { 00419 addEntry(entry, d->m_variants[job]); 00420 } 00421 } 00422 } 00423 00424 if(d->m_variantjobs[job]) { 00425 d->m_variantjobs.remove(job); 00426 } 00427 } 00428 00429 int DownloadDialog::installStatus(Entry *entry) 00430 { 00431 TQDate date; 00432 TQString datestring; 00433 int installed; 00434 00435 TQString lang = TDEGlobal::locale()->language(); 00436 00437 kapp->config()->setGroup("TDENewStuffStatus"); 00438 datestring = kapp->config()->readEntry(entry->name(lang)); 00439 if(datestring.isNull()) installed = 0; 00440 else 00441 { 00442 date = TQT_TQDATE_OBJECT(TQDate::fromString(datestring, Qt::ISODate)); 00443 if(!date.isValid()) installed = 0; 00444 else if(date < entry->releaseDate()) installed = -1; 00445 else installed = 1; 00446 } 00447 00448 return installed; 00449 } 00450 00451 void DownloadDialog::addEntry(Entry *entry, const TQStringList& variants) 00452 { 00453 TQPixmap pix; 00454 int installed; 00455 00456 installed = installStatus(entry); 00457 00458 if(installed > 0) pix = TDEGlobal::iconLoader()->loadIcon("ok", TDEIcon::Small); 00459 else if(installed < 0) pix = TDEGlobal::iconLoader()->loadIcon("history", TDEIcon::Small); 00460 else pix = TQPixmap(); 00461 00462 TQString lang = TDEGlobal::locale()->language(); 00463 00464 if(variants.contains("score")) 00465 { 00466 TDEListViewItem *tmp_r = new NumSortListViewItem(lv_r, 00467 entry->name(lang), entry->version(), TQString("%1").arg(entry->rating())); 00468 tmp_r->setPixmap(0, pix); 00469 } 00470 if(variants.contains("downloads")) 00471 { 00472 TDEListViewItem *tmp_d = new NumSortListViewItem(lv_d, 00473 entry->name(lang), entry->version(), TQString("%1").arg(entry->downloads())); 00474 tmp_d->setPixmap(0, pix); 00475 } 00476 if(variants.contains("latest")) 00477 { 00478 TDEListViewItem *tmp_l = new DateSortListViewItem(lv_l, 00479 entry->name(lang), entry->version(), TDEGlobal::locale()->formatDate(entry->releaseDate())); 00480 tmp_l->setPixmap(0, pix); 00481 } 00482 00483 m_entries.append(entry); 00484 00485 kdDebug() << "added entry " << entry->name() << " for variants " << variants << endl; 00486 } 00487 00488 void DownloadDialog::addEntry(Entry *entry) 00489 { 00490 TQStringList variants; 00491 00492 variants << "score"; 00493 variants << "downloads"; 00494 variants << "latest"; 00495 00496 addEntry(entry, variants); 00497 00498 // not used anymore due to variants (but still used by engine) 00499 kdDebug() << "added entry " << entry->name() << endl; 00500 } 00501 00502 void DownloadDialog::slotData(TDEIO::Job *job, const TQByteArray &a) 00503 { 00504 TQCString tmp(a, a.size() + 1); 00505 m_data[job].append(TQString::fromUtf8(tmp)); 00506 } 00507 00508 void DownloadDialog::slotDetails() 00509 { 00510 Entry *e = getEntry(); 00511 if(!e) return; 00512 00513 TQString lang = TDEGlobal::locale()->language(); 00514 00515 TQString info = i18n 00516 ( 00517 "Name: %1\n" 00518 "Author: %2\n" 00519 "License: %3\n" 00520 "Version: %4\n" 00521 "Release: %5\n" 00522 "Rating: %6\n" 00523 "Downloads: %7\n" 00524 "Release date: %8\n" 00525 "Summary: %9\n" 00526 ).arg(e->name(lang) 00527 ).arg(e->author() 00528 ).arg(e->license() 00529 ).arg(e->version() 00530 ).arg(e->release() 00531 ).arg(e->rating() 00532 ).arg(e->downloads() 00533 ).arg(TDEGlobal::locale()->formatDate(e->releaseDate()) 00534 ).arg(e->summary(lang) 00535 ); 00536 00537 info.append(i18n 00538 ( 00539 "Preview: %1\n" 00540 "Payload: %2\n" 00541 ).arg(e->preview().url() 00542 ).arg(e->payload().url() 00543 )); 00544 00545 KMessageBox::information(this, info, i18n("Details")); 00546 } 00547 00548 TQListViewItem *DownloadDialog::currentEntryItem() 00549 { 00550 if((m_curtab == 0) && (lv_r->selectedItem())) return lv_r->selectedItem(); 00551 if((m_curtab == 1) && (lv_d->selectedItem())) return lv_d->selectedItem(); 00552 if((m_curtab == 2) && (lv_l->selectedItem())) return lv_l->selectedItem(); 00553 00554 return 0; 00555 } 00556 00557 void DownloadDialog::slotInstall() 00558 { 00559 Entry *e = getEntry(); 00560 if(!e) return; 00561 00562 TQPushButton *de, *in; 00563 in = *(m_buttons[d->m_page]->at(0)); 00564 de = *(m_buttons[d->m_page]->at(1)); 00565 00566 if(in) in->setEnabled(false); 00567 if(de) de->setEnabled(false); 00568 00569 d->m_lvtmp_r->setEnabled( false ); 00570 d->m_lvtmp_l->setEnabled( false ); 00571 d->m_lvtmp_d->setEnabled( false ); 00572 00573 kdDebug() << "download entry now" << endl; 00574 00575 // OpenDesktop.org broke the basic functionality of TDEHNS by forcing 00576 // downloads though an advertising display page. This in turn forces 00577 // the user to download and manually install the wallpaper, which 00578 // is relatively complex and negates much of the benefit of TDEHNS. 00579 // Therefore, if the download URL contains OPENDESKTOP_REDIRECT_URL 00580 // then download the raw HTML page and extract the real download URL for use below. 00581 // In the future we may want to figure out how to display unobtrusive ads 00582 // during the download process, but OpenDesktop.org would need to add back 00583 // in the direct download ability for this to even be considered. 00584 if (e->payload().url().contains(OPENDESKTOP_REDIRECT_URL)) { 00585 TDEIO::TransferJob *job = TDEIO::get( KURL( e->payload() ), false, false ); 00586 connect( job, TQT_SIGNAL( result( TDEIO::Job * ) ), 00587 TQT_SLOT( slotJobResult( TDEIO::Job * ) ) ); 00588 connect( job, TQT_SIGNAL( data( TDEIO::Job *, const TQByteArray & ) ), 00589 TQT_SLOT( slotJobData( TDEIO::Job *, const TQByteArray & ) ) ); 00590 } 00591 else { 00592 slotInstallPhase2(); 00593 } 00594 } 00595 00596 void DownloadDialog::slotInstallPhase2() 00597 { 00598 Entry *e = getEntry(); 00599 if(!e) return; 00600 00601 m_entryitem = currentEntryItem(); 00602 m_entryname = m_entryitem->text(0); 00603 00604 kdDebug() << "download entry now (phase 2)" << endl; 00605 00606 if(m_engine) 00607 { 00608 m_engine->download(e); 00609 install(e); 00610 } 00611 else 00612 { 00613 m_s = new TDENewStuffGeneric(m_filter, this); 00614 m_entry = e; 00615 KURL source = e->payload(); 00616 KURL dest = KURL(m_s->downloadDestination(e)); 00617 00618 TDEIO::FileCopyJob *job = TDEIO::file_copy(source, dest, -1, true); 00619 connect(job, TQT_SIGNAL(result(TDEIO::Job*)), TQT_SLOT(slotInstalled(TDEIO::Job*))); 00620 } 00621 } 00622 00623 void DownloadDialog::slotJobData( TDEIO::Job *, const TQByteArray &data ) 00624 { 00625 kdDebug() << "DownloadDialog::slotJobData()" << endl; 00626 00627 if ( data.size() == 0 ) return; 00628 00629 TQCString str( data, data.size() + 1 ); 00630 00631 mJobData.append( TQString::fromUtf8( str ) ); 00632 } 00633 00634 void DownloadDialog::slotJobResult( TDEIO::Job *job ) 00635 { 00636 if ( job->error() ) { 00637 job->showErrorDialog( this ); 00638 return; 00639 } 00640 00641 Entry *e = getEntry(); 00642 if(!e) return; 00643 00644 // See previous note regarding OpenDesktop.org 00645 if (e->payload().url().contains(OPENDESKTOP_REDIRECT_URL)) { 00646 int pos = mJobData.find("<a href=\"/CONTENT/content-files/"); 00647 if (pos >= 0) { 00648 TQString realURL = mJobData.mid(pos); 00649 realURL = realURL.mid(0, realURL.find("\">")); 00650 realURL = realURL.mid(strlen("<a href=\"")); 00651 realURL = e->payload().protocol() + "://opendesktop.org" + realURL; 00652 e->setPayload(realURL); 00653 } 00654 else if ((pos = mJobData.find(OPENDESKTOP_REDIRECT_TEXT)) > 0) { 00655 pos = pos + strlen(OPENDESKTOP_REDIRECT_TEXT); 00656 TQString realURL = mJobData.mid(pos); 00657 realURL = realURL.mid(0, realURL.find("\">")); 00658 e->setPayload(realURL); 00659 } 00660 } 00661 00662 // Reset for next load 00663 mJobData = TQString::null; 00664 00665 slotInstallPhase2(); 00666 } 00667 00668 void DownloadDialog::install(Entry *e) 00669 { 00670 kapp->config()->setGroup("TDENewStuffStatus"); 00671 kapp->config()->writeEntry(m_entryname, TQString(e->releaseDate().toString(Qt::ISODate))); 00672 kapp->config()->sync(); 00673 00674 TQPixmap pix = TDEGlobal::iconLoader()->loadIcon("ok", TDEIcon::Small); 00675 00676 TQString lang = TDEGlobal::locale()->language(); 00677 00678 if(m_entryitem) 00679 { 00680 m_entryitem->setPixmap(0, pix); 00681 00682 TQListViewItem *item; 00683 item = lv_r->findItem(e->name(lang), 0); 00684 if(item) item->setPixmap(0, pix); 00685 item = lv_d->findItem(e->name(lang), 0); 00686 if(item) item->setPixmap(0, pix); 00687 item = lv_l->findItem(e->name(lang), 0); 00688 if(item) item->setPixmap(0, pix); 00689 } 00690 00691 if(currentEntryItem() == m_entryitem) 00692 { 00693 TQPushButton *in; 00694 in = *(m_buttons[d->m_page]->at(0)); 00695 if(in) in->setEnabled(false); 00696 } 00697 00698 d->m_installlist.append(e); 00699 d->m_lvtmp_r->setEnabled( true ); 00700 d->m_lvtmp_l->setEnabled( true ); 00701 d->m_lvtmp_d->setEnabled( true ); 00702 } 00703 00704 void DownloadDialog::slotInstalled(TDEIO::Job *job) 00705 { 00706 TQPushButton *de, *in; 00707 in = *(m_buttons[d->m_page]->at(0)); 00708 de = *(m_buttons[d->m_page]->at(1)); 00709 00710 if(in) in->setEnabled(true); 00711 if(de) de->setEnabled(true); 00712 00713 bool ret = job && (job->error() == 0); 00714 if(ret) 00715 { 00716 TDEIO::FileCopyJob *cjob = ::tqqt_cast<TDEIO::FileCopyJob*>(job); 00717 if(cjob) 00718 { 00719 ret = m_s->install(cjob->destURL().path()); 00720 } 00721 else ret = false; 00722 } 00723 00724 if(ret) 00725 { 00726 install(m_entry); 00727 00728 KMessageBox::information(this, i18n("Installation successful."), i18n("Installation")); 00729 } 00730 else KMessageBox::error(this, i18n("Installation failed."), i18n("Installation")); 00731 d->m_lvtmp_r->setEnabled( true ); 00732 d->m_lvtmp_l->setEnabled( true ); 00733 d->m_lvtmp_d->setEnabled( true ); 00734 00735 delete m_s; 00736 } 00737 00738 void DownloadDialog::slotTab() 00739 { 00740 int tab = static_cast<const TQTabWidget *>(sender())->currentPageIndex(); 00741 kdDebug() << "switch tab to: " << tab << endl; 00742 00743 Entry *eold = getEntry(); 00744 m_curtab = tab; 00745 Entry *e = getEntry(); 00746 00747 if(e == eold) return; 00748 00749 if(e) 00750 { 00751 slotSelected(); 00752 } 00753 else 00754 { 00755 TQPushButton *de, *in; 00756 in = *(m_buttons[d->m_page]->at(0)); 00757 de = *(m_buttons[d->m_page]->at(1)); 00758 00759 if(in) in->setEnabled(false); 00760 if(de) de->setEnabled(false); 00761 00762 m_rt->clear(); 00763 } 00764 } 00765 00766 void DownloadDialog::slotSelected() 00767 { 00768 TQString tmp; 00769 bool enabled; 00770 Entry *e = getEntry(); 00771 TQString lang = TDEGlobal::locale()->language(); 00772 bool ret; 00773 00774 if(e) 00775 { 00776 TQString lang = TDEGlobal::locale()->language(); 00777 00778 TQListViewItem *item; 00779 if(m_curtab != 0) 00780 { 00781 lv_r->clearSelection(); 00782 item = lv_r->findItem(e->name(lang), 0); 00783 if(item) lv_r->setSelected(item, true); 00784 } 00785 if(m_curtab != 1) 00786 { 00787 lv_d->clearSelection(); 00788 item = lv_d->findItem(e->name(lang), 0); 00789 if(item) lv_d->setSelected(item, true); 00790 } 00791 if(m_curtab != 2) 00792 { 00793 lv_l->clearSelection(); 00794 item = lv_l->findItem(e->name(lang), 0); 00795 if(item) lv_l->setSelected(item, true); 00796 } 00797 00798 if(!e->preview(lang).isValid()) 00799 { 00800 ret = 0; 00801 } 00802 else 00803 { 00804 ret = TDEIO::NetAccess::download(e->preview(lang), tmp, this); 00805 } 00806 00807 TQString desc = TQString("<b>%1</b><br>").arg(e->name(lang)); 00808 if(!e->authorEmail().isNull()) 00809 { 00810 desc += TQString("<a href='mailto:" + e->authorEmail() + "'>" + e->author() + "</a>"); 00811 } 00812 else 00813 { 00814 desc += TQString("%1").arg(e->author()); 00815 } 00816 desc += TQString("<br>%1").arg(TDEGlobal::locale()->formatDate(e->releaseDate())); 00817 desc += TQString("<br><br>"); 00818 if(ret) 00819 { 00820 desc += TQString("<img src='%1'>").arg(tmp); 00821 } 00822 else 00823 { 00824 desc += i18n("Preview not available."); 00825 } 00826 desc += TQString("<br><i>%1</i>").arg(e->summary(lang)); 00827 desc += TQString("<br>(%1)").arg(e->license()); 00828 00829 m_rt->clear(); 00830 m_rt->setText(desc); 00831 00832 if(installStatus(e) == 1) enabled = false; 00833 else enabled = true; 00834 00835 TQPushButton *de, *in; 00836 in = *(m_buttons[d->m_page]->at(0)); 00837 de = *(m_buttons[d->m_page]->at(1)); 00838 if(in) in->setEnabled(enabled); 00839 if(de) de->setEnabled(true); 00840 } 00841 } 00842 00843 void DownloadDialog::slotEmail(const TQString& link) 00844 { 00845 kdDebug() << "EMAIL: " << link << endl; 00846 kapp->invokeMailer(link); 00847 slotSelected(); // TQTextBrowser oddity workaround as it cannot handle mailto: URLs 00848 } 00849 00850 Entry *DownloadDialog::getEntry() 00851 { 00852 TQListViewItem *entryItem = currentEntryItem(); 00853 00854 if(!entryItem) 00855 return 0; 00856 00857 TQString entryName = entryItem->text(0); 00858 00859 TQString lang = TDEGlobal::locale()->language(); 00860 00861 for(Entry *e = m_entries.first(); e; e = m_entries.next()) 00862 if(e->name(lang) == entryName) 00863 return e; 00864 00865 return 0; 00866 } 00867 00868 void DownloadDialog::slotPage(TQWidget *w) 00869 { 00870 Provider *p; 00871 00872 kdDebug() << "changed widget!!!" << endl; 00873 00874 if(m_map.find(w) == m_map.end()) return; 00875 00876 d->m_page = w; 00877 00878 lv_r = *(m_map[w]->at(0)); 00879 lv_d = *(m_map[w]->at(1)); 00880 lv_l = *(m_map[w]->at(2)); 00881 p = m_providers[w]; 00882 m_rt = m_rts[w]; 00883 00884 kdDebug() << "valid change!!!; lv_r = " << lv_r << endl; 00885 00886 if(m_engine) return; 00887 00888 if(!m_filter.isEmpty()) return; 00889 00890 lv_r->clear(); 00891 lv_d->clear(); 00892 lv_l->clear(); 00893 00894 kdDebug() << "-- fetch -- " << p->downloadUrl() << endl; 00895 00896 loadProvider(p); 00897 } 00898 00899 void DownloadDialog::loadProvider(Provider *p) 00900 { 00901 TQMap<TDEIO::Job*, Provider*>::Iterator it; 00902 00903 for(it = d->m_variantjobs.begin(); it != d->m_variantjobs.end(); it++) 00904 { 00905 if(it.data() == p) 00906 { 00907 kdDebug() << "-- found provider data in cache" << endl; 00908 slotResult(it.key()); 00909 return; 00910 } 00911 } 00912 00913 TQStringList variants; 00914 variants << "score"; 00915 variants << "downloads"; 00916 variants << "latest"; 00917 00918 // Optimise URLs so each unique URL only gets fetched once 00919 00920 TQMap<TQString, TQStringList> urls; 00921 00922 for(TQStringList::Iterator it = variants.begin(); it != variants.end(); it++) 00923 { 00924 TQString url = p->downloadUrlVariant((*it)).url(); 00925 if(!urls.contains(url)) 00926 { 00927 urls[url] = TQStringList(); 00928 } 00929 urls[url] << (*it); 00930 00931 it = variants.remove(it); 00932 } 00933 00934 // Now fetch the URLs while keeping the variant list for each attached 00935 00936 for(TQMap<TQString, TQStringList>::Iterator it = urls.begin(); it != urls.end(); it++) 00937 { 00938 TQString url = it.key(); 00939 TQStringList urlvariants = it.data(); 00940 00941 TDEIO::TransferJob *variantjob = TDEIO::get(url, false, false); 00942 d->m_newproviders[p] = p; 00943 d->m_variantjobs[variantjob] = p; 00944 d->m_variants[variantjob] = urlvariants; 00945 m_data[variantjob] = ""; 00946 00947 connect(variantjob, TQT_SIGNAL(result(TDEIO::Job*)), TQT_SLOT(slotResult(TDEIO::Job*))); 00948 connect(variantjob, TQT_SIGNAL(data(TDEIO::Job*, const TQByteArray&)), 00949 TQT_SLOT(slotData(TDEIO::Job*, const TQByteArray&))); 00950 } 00951 00952 if(variants.count() == 0) return; 00953 00954 // If not all variants are given, use default URL for those 00955 00956 kdDebug() << "-- reached old downloadurl section; variants left: " << variants.count() << endl; 00957 00958 TDEIO::TransferJob *job = TDEIO::get(p->downloadUrl()); 00959 00960 d->m_newproviders[p] = p; 00961 d->m_variantjobs[job] = p; 00962 d->m_variants[job] = variants; 00963 //m_jobs[job] = p; // not used anymore due to variants 00964 m_data[job] = ""; 00965 00966 connect(job, TQT_SIGNAL(result(TDEIO::Job*)), TQT_SLOT(slotResult(TDEIO::Job*))); 00967 connect(job, TQT_SIGNAL(data(TDEIO::Job*, const TQByteArray&)), 00968 TQT_SLOT(slotData(TDEIO::Job*, const TQByteArray&))); 00969 } 00970 00971 void DownloadDialog::setType(TQString type) 00972 { 00973 m_filter = type; 00974 } 00975 00976 void DownloadDialog::setProviderList(const TQString& providerList) 00977 { 00978 d->m_providerlist = providerList; 00979 } 00980 00981 void DownloadDialog::slotOk() 00982 { 00983 } 00984 00985 void DownloadDialog::slotApply() 00986 { 00987 } 00988 00989 void DownloadDialog::open(const TQString& type, const TQString& caption) 00990 { 00991 DownloadDialog d(0, caption); 00992 d.setType(type); 00993 d.load(); 00994 d.exec(); 00995 } 00996 00997 void DownloadDialog::slotFinish() 00998 { 00999 showPage(1); 01000 //updateBackground(); 01001 } 01002 01003 TQPtrList<Entry> DownloadDialog::installedEntries() 01004 { 01005 return d->m_installlist; 01006 }