• Skip to content
  • Skip to link menu
KDE 3.5 API Reference
  • KDE API Reference
  • API Reference
  • Sitemap
  • Contact Us
 

KNewStuff

downloaddialog.cpp

Go to the documentation of this file.
00001 /*
00002     This file is part of KNewStuff.
00003     Copyright (c) 2003 Josef Spillner <spillner@kde.org>
00004 
00005     This library is free software; you can redistribute it and/or
00006     modify it under the terms of the GNU Library General Public
00007     License as published by the Free Software Foundation; either
00008     version 2 of the License, or (at your option) any later version.
00009 
00010     This library is distributed in the hope that it will be useful,
00011     but WITHOUT ANY WARRANTY; without even the implied warranty of
00012     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
00013     Library General Public License for more details.
00014 
00015     You should have received a copy of the GNU Library General Public License
00016     along with this library; see the file COPYING.LIB.  If not, write to
00017     the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
00018     Boston, MA 02110-1301, USA.
00019 */
00020 
00021 #include "downloaddialog.h"
00022 #include "downloaddialog.moc"
00023 
00024 #include <klocale.h>
00025 #include <klistview.h>
00026 #include <kdebug.h>
00027 #include <kio/job.h>
00028 #include <kio/netaccess.h>
00029 #include <kmessagebox.h>
00030 #include <kurl.h>
00031 #include <kconfig.h>
00032 #include <kapplication.h>
00033 #include <kiconloader.h>
00034 
00035 #include <knewstuff/entry.h>
00036 #include <knewstuff/knewstuffgeneric.h>
00037 #include <knewstuff/engine.h>
00038 
00039 #include <qlayout.h>
00040 #include <qpushbutton.h>
00041 #include <qdom.h>
00042 #include <qlabel.h>
00043 #include <qtextbrowser.h>
00044 #include <qtabwidget.h>
00045 #include <qtimer.h> // hack
00046 
00047 using namespace KNS;
00048 
00049 struct DownloadDialog::Private
00050 {
00051     QString m_providerlist;
00052     QWidget *m_page;
00053     KListView *m_lvtmp_r, *m_lvtmp_d, *m_lvtmp_l;
00054     QPtrList<Entry> m_installlist;
00055     QMap<KIO::Job*, Provider*> m_variantjobs;
00056     QMap<KIO::Job*, QStringList> m_variants;
00057     QMap<Provider*, Provider*> m_newproviders;
00058 };
00059 
00060 class NumSortListViewItem : public KListViewItem
00061 {
00062   public:
00063   NumSortListViewItem( QListView * parent, QString label1, QString label2 = QString::null, QString label3 = QString::null, QString label4 = QString::null, QString label5 = QString::null, QString label6 = QString::null, QString label7 = QString::null, QString label8 = QString::null )  :
00064   KListViewItem( parent, label1, label2, label3, label4, label5, label6, label7, label8 )
00065   {
00066   }
00067 
00068   QString key(int col, bool asc) const {
00069     if (col == 2)
00070     {
00071       QString s;
00072       s.sprintf("%08d", text(col).toInt());
00073       return s;
00074     }
00075     return KListViewItem::key( col, asc );
00076   }
00077 };
00078 
00079 class DateSortListViewItem : public KListViewItem
00080 {
00081   public:
00082   DateSortListViewItem( QListView * parent, QString label1, QString label2 = QString::null, QString label3 = QString::null, QString label4 = QString::null, QString label5 = QString::null, QString label6 = QString::null, QString label7 = QString::null, QString label8 = QString::null )  :
00083   KListViewItem( parent, label1, label2, label3, label4, label5, label6, label7, label8 )
00084   {
00085   }
00086 
00087   QString key(int col, bool asc) const {
00088     if (col == 2)
00089     {
00090       QString s;
00091       QDate date = KGlobal::locale()->readDate(text(col));
00092       s.sprintf("%08d", date.year() * 366 + date.dayOfYear());
00093       return s;
00094     }
00095     return KListViewItem::key( col, asc );
00096   }
00097 };
00098 
00099 // BEGIN deprecated for KDE 4
00100 DownloadDialog::DownloadDialog(Engine *engine, QWidget *)
00101 : KDialogBase(KDialogBase::IconList, i18n("Get Hot New Stuff"),
00102   KDialogBase::Close, KDialogBase::Close)
00103 {
00104   init(engine);
00105 }
00106 
00107 DownloadDialog::DownloadDialog(QWidget *)
00108 : KDialogBase(KDialogBase::IconList, i18n("Get Hot New Stuff"),
00109   KDialogBase::Close, KDialogBase::Close)
00110 {
00111   init(0);
00112 }
00113 
00114 void DownloadDialog::open(QString type)
00115 {
00116   DownloadDialog d;
00117   d.setType(type);
00118   d.load();
00119   d.exec();
00120 }
00121 // END deprecated for KDE 4
00122 
00123 DownloadDialog::DownloadDialog(Engine *engine, QWidget *, const QString& caption)
00124 : KDialogBase(KDialogBase::IconList, (caption.isNull() ? i18n("Get Hot New Stuff") : caption),
00125   KDialogBase::Close, KDialogBase::Close)
00126 {
00127   init(engine);
00128 }
00129 
00130 DownloadDialog::DownloadDialog(QWidget *, const QString& caption)
00131 : KDialogBase(KDialogBase::IconList, (caption.isNull() ? i18n("Get Hot New Stuff") : caption),
00132   KDialogBase::Close, KDialogBase::Close)
00133 {
00134   init(0);
00135 }
00136 
00137 void DownloadDialog::init(Engine *engine)
00138 {
00139   resize(700, 400);
00140   d = new Private();
00141 
00142   m_engine = engine;
00143   d->m_page = NULL;
00144 
00145   connect(this, SIGNAL(aboutToShowPage(QWidget*)), SLOT(slotPage(QWidget*)));
00146 
00147   if(!engine)
00148   {
00149     m_loader = new ProviderLoader(this);
00150     connect(m_loader, SIGNAL(providersLoaded(Provider::List*)), SLOT(slotProviders(Provider::List*)));
00151   }
00152 
00153   m_entries.setAutoDelete(true);
00154 }
00155 
00156 DownloadDialog::~DownloadDialog()
00157 {
00158     for (QMap<QWidget *, QValueList<QPushButton *>* >::const_iterator it = m_buttons.constBegin(); it != m_buttons.constEnd(); ++it)
00159         delete it.data();
00160     for (QMap<QWidget *, QValueList<KListView *>* >::const_iterator it = m_map.constBegin(); it != m_map.constEnd(); ++it)
00161         delete it.data();
00162     delete d;
00163 }
00164 
00165 void DownloadDialog::load()
00166 {
00167   m_loader->load(m_filter, d->m_providerlist);
00168 }
00169 
00170 void DownloadDialog::load(QString providerList)
00171 {
00172   m_loader->load(m_filter, providerList);
00173 }
00174 
00175 void DownloadDialog::clear()
00176 {
00177   QMap<QWidget*, QValueList<KListView*>* >::Iterator it;
00178   QMap<QWidget*, QValueList<KListView*>* >::Iterator end(m_map.end());
00179   for(it = m_map.begin(); it != end; ++it)
00180   {
00181     QValueList<KListView*> *v = it.data();
00182     kdDebug() << "clear listviews in " << v << endl;
00183     if(v)
00184     {
00185       (*(v->at(0)))->clear();
00186       (*(v->at(1)))->clear();
00187       (*(v->at(2)))->clear();
00188 
00189       //delete (*it);
00190     }
00191 
00192     delete it.key();
00193   }
00194   m_map.clear();
00195 }
00196 
00197 void DownloadDialog::slotProviders(Provider::List *list)
00198 {
00199   Provider *p;
00200   /*QFrame *frame;*/
00201 
00202   for(p = list->first(); p; p = list->next())
00203   {
00204     kdDebug() << "++ provider ++ " << p->name() << endl;
00205 
00206     if(!m_filter.isEmpty())
00207       loadProvider(p);
00208     else
00209       addProvider(p);
00210     /*if(p == list->getFirst())
00211       slotPage(m_frame);*/ // only if !qtbug
00212   }
00213 }
00214 
00215 void DownloadDialog::addProvider(Provider *p)
00216 {
00217   QFrame *frame;
00218   QTabWidget *ctl;
00219   QWidget *w_d, *w_r, *w_l;
00220   QWidget *w2;
00221   QTextBrowser *rt;
00222   QString tmp;
00223   int ret;
00224   QPixmap pix;
00225 
00226   if(m_map.count() == 0)
00227   {
00228     frame = addPage(i18n("Welcome"), i18n("Welcome"), QPixmap(""));
00229     delete frame;
00230   }
00231 
00232   kdDebug() << "addProvider()/begin" << endl;
00233 
00234   ret = true;
00235   if(p->icon().path().isEmpty()) ret = false;
00236   else
00237   {
00238     if(!p->icon().protocol().isEmpty())
00239     {
00240       ret = KIO::NetAccess::download(p->icon(), tmp, this);
00241       if(ret) pix = QPixmap(tmp);
00242     }
00243     else
00244     {
00245       pix = KGlobal::iconLoader()->loadIcon(p->icon().path(), KIcon::Panel);
00246       ret = true;
00247     }
00248   }
00249   if(!ret) pix = KGlobal::iconLoader()->loadIcon("knewstuff", KIcon::Panel);
00250   frame = addPage(p->name(), p->name(), pix);
00251   m_frame = frame;
00252 
00253   w2 = new QWidget(frame);
00254   w_d = new QWidget(frame);
00255   w_r = new QWidget(frame);
00256   w_l = new QWidget(frame);
00257 
00258   ctl = new QTabWidget(frame);
00259   ctl->addTab(w_r, i18n("Highest Rated"));
00260   ctl->addTab(w_d, i18n("Most Downloads"));
00261   ctl->addTab(w_l, i18n("Latest"));
00262 
00263   m_curtab = 0;
00264   connect(ctl, SIGNAL(currentChanged(QWidget *)), SLOT(slotTab()));
00265 
00266   QHBoxLayout *box = new QHBoxLayout(frame);
00267   box->add(ctl);
00268 
00269   d->m_lvtmp_r = new KListView(w_r);
00270   d->m_lvtmp_r->addColumn(i18n("Name"));
00271   d->m_lvtmp_r->addColumn(i18n("Version"));
00272   d->m_lvtmp_r->addColumn(i18n("Rating"));
00273   d->m_lvtmp_r->setSorting(2, false);
00274 
00275   d->m_lvtmp_d = new KListView(w_d);
00276   d->m_lvtmp_d->addColumn(i18n("Name"));
00277   d->m_lvtmp_d->addColumn(i18n("Version"));
00278   d->m_lvtmp_d->addColumn(i18n("Downloads"));
00279   d->m_lvtmp_d->setSorting(2, false);
00280 
00281   d->m_lvtmp_l = new KListView(w_l);
00282   d->m_lvtmp_l->addColumn(i18n("Name"));
00283   d->m_lvtmp_l->addColumn(i18n("Version"));
00284   d->m_lvtmp_l->addColumn(i18n("Release Date"));
00285   d->m_lvtmp_l->setSorting(2, false);
00286 
00287   connect(d->m_lvtmp_r, SIGNAL(clicked(QListViewItem*)), SLOT(slotSelected()));
00288   connect(d->m_lvtmp_d, SIGNAL(clicked(QListViewItem*)), SLOT(slotSelected()));
00289   connect(d->m_lvtmp_l, SIGNAL(clicked(QListViewItem*)), SLOT(slotSelected()));
00290 
00291   rt = new QTextBrowser(frame);
00292   rt->setMinimumWidth(150);
00293 
00294   QPushButton *in = new QPushButton(i18n("Install"), frame);
00295   QPushButton *de = new QPushButton(i18n("Details"), frame);
00296   in->setEnabled(false);
00297   de->setEnabled(false);
00298 
00299   box->addSpacing(spacingHint());
00300   QVBoxLayout *vbox = new QVBoxLayout(box);
00301   vbox->add(rt);
00302   vbox->addSpacing(spacingHint());
00303   vbox->add(de);
00304   vbox->add(in);
00305 
00306   connect(rt, SIGNAL(linkClicked(const QString&)), SLOT(slotEmail(const QString&)));
00307 
00308   connect(in, SIGNAL(clicked()), SLOT(slotInstall()));
00309   connect(de, SIGNAL(clicked()), SLOT(slotDetails()));
00310 
00311   QVBoxLayout *box2 = new QVBoxLayout(w_r);
00312   box2->add(d->m_lvtmp_r);
00313   QVBoxLayout *box3 = new QVBoxLayout(w_d);
00314   box3->add(d->m_lvtmp_d);
00315   QVBoxLayout *box4 = new QVBoxLayout(w_l);
00316   box4->add(d->m_lvtmp_l);
00317 
00318   QValueList<KListView*> *v = new QValueList<KListView*>;
00319   *v << d->m_lvtmp_r << d->m_lvtmp_d << d->m_lvtmp_l;
00320   m_map[frame] = v;
00321   m_rts[frame] = rt;
00322   QValueList<QPushButton*> *vb = new QValueList<QPushButton*>;
00323   *vb << in << de;
00324   m_buttons[frame] = vb;
00325   m_providers[frame] = p;
00326 
00327   kdDebug() << "addProvider()/end; d->m_lvtmp_r = " << d->m_lvtmp_r << endl;
00328 
00329   if(m_engine) slotPage(frame);
00330 
00331   QTimer::singleShot(100, this, SLOT(slotFinish()));
00332 }
00333 
00334 void DownloadDialog::slotResult(KIO::Job *job)
00335 {
00336   QDomDocument dom;
00337   QDomElement knewstuff;
00338 
00339   kdDebug() << "got data: " << m_data[job] << endl;
00340 
00341   kapp->config()->setGroup("KNewStuffStatus");
00342 
00343   dom.setContent(m_data[job]);
00344   knewstuff = dom.documentElement();
00345 
00346   for(QDomNode pn = knewstuff.firstChild(); !pn.isNull(); pn = pn.nextSibling())
00347   {
00348     QDomElement stuff = pn.toElement();
00349 
00350     kdDebug() << "element: " << stuff.tagName() << endl;
00351 
00352     if(stuff.tagName() == "stuff")
00353     {
00354       Entry *entry = new Entry(stuff);
00355       kdDebug() << "TYPE::" << entry->type() << " FILTER::" << m_filter << endl;
00356       if(!entry->type().isEmpty())
00357       {
00358         if((!m_filter.isEmpty()) && (entry->type() != m_filter)) continue;
00359       }
00360 
00361       /*if((!m_filter.isEmpty()) && (m_jobs[job]))
00362       {
00363         Provider *p = m_jobs[job];
00364         if(d->m_newproviders[p])
00365         {
00366           addProvider(p);
00367           slotPage(m_frame);
00368           d->m_newproviders[p] = 0;
00369         }
00370       }*/
00371       if((!m_filter.isEmpty()) && (d->m_variantjobs[job]))
00372       {
00373         Provider *p = d->m_variantjobs[job];
00374         if(d->m_newproviders[p])
00375         {
00376           addProvider(p);
00377           slotPage(m_frame);
00378           d->m_newproviders[p] = 0;
00379         }
00380       }
00381 
00382       /*if(m_jobs[job]) addEntry(entry);
00383       else*/
00384       if(d->m_variantjobs[job]) addEntry(entry, d->m_variants[job]);
00385     }
00386   }
00387 }
00388 
00389 int DownloadDialog::installStatus(Entry *entry)
00390 {
00391   QDate date;
00392   QString datestring;
00393   int installed;
00394 
00395   QString lang = KGlobal::locale()->language();
00396 
00397   kapp->config()->setGroup("KNewStuffStatus");
00398   datestring = kapp->config()->readEntry(entry->name(lang));
00399   if(datestring.isNull()) installed = 0;
00400   else
00401   {
00402     date = QDate::fromString(datestring, Qt::ISODate);
00403     if(!date.isValid()) installed = 0;
00404     else if(date < entry->releaseDate()) installed = -1;
00405     else installed = 1;
00406   }
00407 
00408   return installed;
00409 }
00410 
00411 void DownloadDialog::addEntry(Entry *entry, const QStringList& variants)
00412 {
00413   QPixmap pix;
00414   int installed;
00415 
00416   installed = installStatus(entry);
00417 
00418   if(installed > 0) pix = KGlobal::iconLoader()->loadIcon("ok", KIcon::Small);
00419   else if(installed < 0) pix = KGlobal::iconLoader()->loadIcon("history", KIcon::Small);
00420   else pix = QPixmap();
00421 
00422   QString lang = KGlobal::locale()->language();
00423 
00424   if(variants.contains("score"))
00425   {
00426     KListViewItem *tmp_r = new NumSortListViewItem(lv_r,
00427       entry->name(lang), entry->version(), QString("%1").arg(entry->rating()));
00428     tmp_r->setPixmap(0, pix);
00429   }
00430   if(variants.contains("downloads"))
00431   {
00432     KListViewItem *tmp_d = new NumSortListViewItem(lv_d,
00433       entry->name(lang), entry->version(), QString("%1").arg(entry->downloads()));
00434     tmp_d->setPixmap(0, pix);
00435   }
00436   if(variants.contains("latest"))
00437   {
00438     KListViewItem *tmp_l = new DateSortListViewItem(lv_l,
00439       entry->name(lang), entry->version(), KGlobal::locale()->formatDate(entry->releaseDate()));
00440     tmp_l->setPixmap(0, pix);
00441   }
00442 
00443   m_entries.append(entry);
00444 
00445   kdDebug() << "added entry " << entry->name() << " for variants " << variants << endl;
00446 }
00447 
00448 void DownloadDialog::addEntry(Entry *entry)
00449 {
00450   QStringList variants;
00451 
00452   variants << "score";
00453   variants << "downloads";
00454   variants << "latest";
00455 
00456   addEntry(entry, variants);
00457 
00458   // not used anymore due to variants (but still used by engine)
00459   kdDebug() << "added entry " << entry->name() << endl;
00460 }
00461 
00462 void DownloadDialog::slotData(KIO::Job *job, const QByteArray &a)
00463 {
00464   QCString tmp(a, a.size() + 1);
00465   m_data[job].append(QString::fromUtf8(tmp));
00466 }
00467 
00468 void DownloadDialog::slotDetails()
00469 {
00470   Entry *e = getEntry();
00471   if(!e) return;
00472 
00473   QString lang = KGlobal::locale()->language();
00474 
00475   QString info = i18n
00476   (
00477     "Name: %1\n"
00478     "Author: %2\n"
00479     "License: %3\n"
00480     "Version: %4\n"
00481     "Release: %5\n"
00482     "Rating: %6\n"
00483     "Downloads: %7\n"
00484     "Release date: %8\n"
00485     "Summary: %9\n"
00486     ).arg(e->name(lang)
00487     ).arg(e->author()
00488     ).arg(e->license()
00489     ).arg(e->version()
00490     ).arg(e->release()
00491     ).arg(e->rating()
00492     ).arg(e->downloads()
00493     ).arg(KGlobal::locale()->formatDate(e->releaseDate())
00494     ).arg(e->summary(lang)
00495   );
00496 
00497   info.append(i18n
00498   (
00499     "Preview: %1\n"
00500     "Payload: %2\n"
00501     ).arg(e->preview().url()
00502     ).arg(e->payload().url()
00503   ));
00504 
00505   KMessageBox::information(this, info, i18n("Details"));
00506 }
00507 
00508 QListViewItem *DownloadDialog::currentEntryItem()
00509 {
00510   if((m_curtab == 0) && (lv_r->selectedItem())) return lv_r->selectedItem();
00511   if((m_curtab == 1) && (lv_d->selectedItem())) return lv_d->selectedItem();
00512   if((m_curtab == 2) && (lv_l->selectedItem())) return lv_l->selectedItem();
00513 
00514   return 0;
00515 }
00516 
00517 void DownloadDialog::slotInstall()
00518 {
00519   Entry *e = getEntry();
00520   if(!e) return;
00521 
00522   d->m_lvtmp_r->setEnabled( false );
00523   d->m_lvtmp_l->setEnabled( false );
00524   d->m_lvtmp_d->setEnabled( false );
00525   m_entryitem = currentEntryItem();
00526   m_entryname = m_entryitem->text(0);
00527 
00528   kdDebug() << "download entry now" << endl;
00529 
00530   if(m_engine)
00531   {
00532     m_engine->download(e);
00533     install(e);
00534   }
00535   else
00536   {
00537     m_s = new KNewStuffGeneric(e->type(), this);
00538     m_entry = e;
00539     KURL source = e->payload();
00540     KURL dest = KURL(m_s->downloadDestination(e));
00541 
00542     KIO::FileCopyJob *job = KIO::file_copy(source, dest, -1, true);
00543     connect(job, SIGNAL(result(KIO::Job*)), SLOT(slotInstalled(KIO::Job*)));
00544   }
00545 }
00546 
00547 void DownloadDialog::install(Entry *e)
00548 {
00549   kapp->config()->setGroup("KNewStuffStatus");
00550   kapp->config()->writeEntry(m_entryname, e->releaseDate().toString(Qt::ISODate));
00551   kapp->config()->sync();
00552 
00553   QPixmap pix = KGlobal::iconLoader()->loadIcon("ok", KIcon::Small);
00554 
00555   QString lang = KGlobal::locale()->language();
00556   
00557   if(m_entryitem)
00558   {
00559     m_entryitem->setPixmap(0, pix);
00560 
00561     QListViewItem *item;
00562     item = lv_r->findItem(e->name(lang), 0);
00563     if(item) item->setPixmap(0, pix);
00564     item = lv_d->findItem(e->name(lang), 0);
00565     if(item) item->setPixmap(0, pix);
00566     item = lv_l->findItem(e->name(lang), 0);
00567     if(item) item->setPixmap(0, pix);
00568   }
00569 
00570   if(currentEntryItem() == m_entryitem)
00571   {
00572     QPushButton *in;
00573     in = *(m_buttons[d->m_page]->at(0));
00574     if(in) in->setEnabled(false);
00575   }
00576 
00577   d->m_installlist.append(e);
00578   d->m_lvtmp_r->setEnabled( true );
00579   d->m_lvtmp_l->setEnabled( true );
00580   d->m_lvtmp_d->setEnabled( true );
00581 }
00582 
00583 void DownloadDialog::slotInstalled(KIO::Job *job)
00584 {
00585   bool ret = job && (job->error() == 0);
00586   if(ret)
00587   {
00588     KIO::FileCopyJob *cjob = ::qt_cast<KIO::FileCopyJob*>(job);
00589     if(cjob)
00590     {
00591       ret = m_s->install(cjob->destURL().path());
00592     }
00593     else ret = false;
00594   }
00595 
00596   if(ret)
00597   {
00598     install(m_entry);
00599 
00600     KMessageBox::information(this, i18n("Installation successful."), i18n("Installation"));
00601   }
00602   else KMessageBox::error(this, i18n("Installation failed."), i18n("Installation"));
00603   d->m_lvtmp_r->setEnabled( true );
00604   d->m_lvtmp_l->setEnabled( true );
00605   d->m_lvtmp_d->setEnabled( true );
00606 
00607   delete m_s;
00608 }
00609 
00610 void DownloadDialog::slotTab()
00611 {
00612   int tab = static_cast<const QTabWidget *>(sender())->currentPageIndex();
00613   kdDebug() << "switch tab to: " << tab << endl;
00614 
00615   Entry *eold = getEntry();
00616   m_curtab = tab;
00617   Entry *e = getEntry();
00618 
00619   if(e == eold) return;
00620 
00621   if(e)
00622   {
00623     slotSelected();
00624   }
00625   else
00626   {
00627     QPushButton *de, *in;
00628     in = *(m_buttons[d->m_page]->at(0));
00629     de = *(m_buttons[d->m_page]->at(1));
00630 
00631     if(in) in->setEnabled(false);
00632     if(de) de->setEnabled(false);
00633 
00634     m_rt->clear();
00635   }
00636 }
00637 
00638 void DownloadDialog::slotSelected()
00639 {
00640   QString tmp;
00641   bool enabled;
00642   Entry *e = getEntry();
00643   QString lang = KGlobal::locale()->language();
00644   bool ret;
00645 
00646   if(e)
00647   {
00648     QString lang = KGlobal::locale()->language();
00649 
00650     QListViewItem *item;
00651     if(m_curtab != 0)
00652     {
00653       lv_r->clearSelection();
00654       item = lv_r->findItem(e->name(lang), 0);
00655       if(item) lv_r->setSelected(item, true);
00656     }
00657     if(m_curtab != 1)
00658     {
00659       lv_d->clearSelection();
00660       item = lv_d->findItem(e->name(lang), 0);
00661       if(item) lv_d->setSelected(item, true);
00662     }
00663     if(m_curtab != 2)
00664     {
00665       lv_l->clearSelection();
00666       item = lv_l->findItem(e->name(lang), 0);
00667       if(item) lv_l->setSelected(item, true);
00668     }
00669 
00670     if(!e->preview(lang).isValid())
00671     {
00672       ret = 0;
00673     }
00674     else
00675     {
00676       ret = KIO::NetAccess::download(e->preview(lang), tmp, this);
00677     }
00678 
00679     QString desc = QString("<b>%1</b><br>").arg(e->name(lang));
00680     if(!e->authorEmail().isNull())
00681     {
00682       desc += QString("<a href='mailto:" + e->authorEmail() + "'>" + e->author() + "</a>");
00683     }
00684     else
00685     {
00686       desc += QString("%1").arg(e->author());
00687     }
00688     desc += QString("<br>%1").arg(KGlobal::locale()->formatDate(e->releaseDate()));
00689     desc += QString("<br><br>");
00690     if(ret)
00691     {
00692       desc += QString("<img src='%1'>").arg(tmp);
00693     }
00694     else
00695     {
00696       desc += i18n("Preview not available.");
00697     }
00698     desc += QString("<br><i>%1</i>").arg(e->summary(lang));
00699     desc += QString("<br>(%1)").arg(e->license());
00700 
00701     m_rt->clear();
00702     m_rt->setText(desc);
00703 
00704     if(installStatus(e) == 1) enabled = false;
00705     else enabled = true;
00706 
00707     QPushButton *de, *in;
00708     in = *(m_buttons[d->m_page]->at(0));
00709     de = *(m_buttons[d->m_page]->at(1));
00710     if(in) in->setEnabled(enabled);
00711     if(de) de->setEnabled(true);
00712   }
00713 }
00714 
00715 void DownloadDialog::slotEmail(const QString& link)
00716 {
00717   kdDebug() << "EMAIL: " << link << endl;
00718   kapp->invokeMailer(link);
00719   slotSelected(); // QTextBrowser oddity workaround as it cannot handle mailto: URLs
00720 }
00721 
00722 Entry *DownloadDialog::getEntry()
00723 {
00724   QListViewItem *entryItem = currentEntryItem();
00725 
00726   if(!entryItem)
00727     return 0;
00728 
00729   QString entryName = entryItem->text(0);
00730 
00731   QString lang = KGlobal::locale()->language();
00732 
00733   for(Entry *e = m_entries.first(); e; e = m_entries.next())
00734     if(e->name(lang) == entryName)
00735       return e;
00736 
00737   return 0;
00738 }
00739 
00740 void DownloadDialog::slotPage(QWidget *w)
00741 {
00742   Provider *p;
00743 
00744   kdDebug() << "changed widget!!!" << endl;
00745 
00746   if(m_map.find(w) == m_map.end()) return;
00747 
00748   d->m_page = w;
00749 
00750   lv_r = *(m_map[w]->at(0));
00751   lv_d = *(m_map[w]->at(1));
00752   lv_l = *(m_map[w]->at(2));
00753   p = m_providers[w];
00754   m_rt = m_rts[w];
00755 
00756   kdDebug() << "valid change!!!; lv_r = " << lv_r << endl;
00757 
00758   if(m_engine) return;
00759 
00760   if(!m_filter.isEmpty()) return;
00761 
00762   lv_r->clear();
00763   lv_d->clear();
00764   lv_l->clear();
00765 
00766   kdDebug() << "-- fetch -- " << p->downloadUrl() << endl;
00767 
00768   loadProvider(p);
00769 }
00770 
00771 void DownloadDialog::loadProvider(Provider *p)
00772 {
00773   QMap<KIO::Job*, Provider*>::Iterator it;
00774 
00775   for(it = d->m_variantjobs.begin(); it != d->m_variantjobs.end(); it++)
00776   {
00777     if(it.data() == p)
00778     {
00779       kdDebug() << "-- found provider data in cache" << endl;
00780       slotResult(it.key());
00781       return;
00782     }
00783   }
00784 
00785   QStringList variants;
00786   variants << "score";
00787   variants << "downloads";
00788   variants << "latest";
00789 
00790   // Optimise URLs so each unique URL only gets fetched once
00791 
00792   QMap<QString, QStringList> urls;
00793 
00794   for(QStringList::Iterator it = variants.begin(); it != variants.end(); it++)
00795   {
00796     QString url = p->downloadUrlVariant((*it)).url();
00797     if(!urls.contains(url))
00798     {
00799       urls[url] = QStringList();
00800     }
00801     urls[url] << (*it);
00802 
00803     it = variants.remove(it);
00804   }
00805 
00806   // Now fetch the URLs while keeping the variant list for each attached
00807 
00808   for(QMap<QString, QStringList>::Iterator it = urls.begin(); it != urls.end(); it++)
00809   {
00810     QString url = it.key();
00811     QStringList urlvariants = it.data();
00812 
00813     KIO::TransferJob *variantjob = KIO::get(url);
00814     d->m_newproviders[p] = p;
00815     d->m_variantjobs[variantjob] = p;
00816     d->m_variants[variantjob] = urlvariants;
00817     m_data[variantjob] = "";
00818 
00819     connect(variantjob, SIGNAL(result(KIO::Job*)), SLOT(slotResult(KIO::Job*)));
00820     connect(variantjob, SIGNAL(data(KIO::Job*, const QByteArray&)),
00821       SLOT(slotData(KIO::Job*, const QByteArray&)));
00822   }
00823 
00824   if(variants.count() == 0) return;
00825 
00826   // If not all variants are given, use default URL for those
00827 
00828   kdDebug() << "-- reached old downloadurl section; variants left: " << variants.count() << endl;
00829 
00830   KIO::TransferJob *job = KIO::get(p->downloadUrl());
00831 
00832   d->m_newproviders[p] = p;
00833   d->m_variantjobs[job] = p;
00834   d->m_variants[job] = variants;
00835   //m_jobs[job] = p; // not used anymore due to variants
00836   m_data[job] = "";
00837 
00838   connect(job, SIGNAL(result(KIO::Job*)), SLOT(slotResult(KIO::Job*)));
00839   connect(job, SIGNAL(data(KIO::Job*, const QByteArray&)),
00840     SLOT(slotData(KIO::Job*, const QByteArray&)));
00841 }
00842 
00843 void DownloadDialog::setType(QString type)
00844 {
00845   m_filter = type;
00846 }
00847 
00848 void DownloadDialog::setProviderList(const QString& providerList)
00849 {
00850   d->m_providerlist = providerList;
00851 }
00852 
00853 void DownloadDialog::slotOk()
00854 {
00855 }
00856 
00857 void DownloadDialog::slotApply()
00858 {
00859 }
00860 
00861 void DownloadDialog::open(const QString& type, const QString& caption)
00862 {
00863   DownloadDialog d(0, caption);
00864   d.setType(type);
00865   d.load();
00866   d.exec();
00867 }
00868 
00869 void DownloadDialog::slotFinish()
00870 {
00871   showPage(1);
00872   //updateBackground();
00873 }
00874 
00875 QPtrList<Entry> DownloadDialog::installedEntries()
00876 {
00877   return d->m_installlist;
00878 }

KNewStuff

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

API Reference

Skip menu "API Reference"
  • dcop
  • DNSSD
  • interfaces
  • Kate
  • kconf_update
  • KDECore
  • KDED
  • kdefx
  • KDEsu
  • kdeui
  • KDocTools
  • KHTML
  • KImgIO
  • KInit
  • kio
  • kioslave
  • KJS
  • KNewStuff
  • KParts
  • KUtils
Generated for API Reference by doxygen 1.5.9
This website is maintained by Adriaan de Groot and Allen Winter.
KDE® and the K Desktop Environment® logo are registered trademarks of KDE e.V. | Legal