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

tdenewstuff

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\">&nbsp;<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 }

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