2 This file is part of Faster Application Manager.
4 Faster Application Manager is free software: you can redistribute it and/or modify
5 it under the terms of the GNU General Public License as published by
6 the Free Software Foundation, either version 3 of the License, or
7 (at your option) any later version.
9 Faster Application Manager is distributed in the hope that it will be useful,
10 but WITHOUT ANY WARRANTY; without even the implied warranty of
11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 GNU General Public License for more details.
14 You should have received a copy of the GNU General Public License
15 along with Faster Application Manager. If not, see <http://www.gnu.org/licenses/>.
17 (C) Heikki Holstila 2010
21 #include <QDBusConnection>
22 #include <QDBusInterface>
24 #include "packageselector.h"
25 #include "ui_packageselector.h"
27 #include "packageview.h"
28 #include "repository.h"
29 #include "blacklistselect.h"
30 #include "aaptinterface.h"
33 PackageSelector::PackageSelector(Package* pkg, AAptInterface* apt, Settings* set, QWidget *parent) :
35 ui(new Ui::PackageSelector)
41 iNetworkAccessManager = 0;
42 iChangelogFetched = false;
43 iFetchInProgress = false;
46 ui->pushButton_website->setIcon(QPixmap("/usr/share/icons/hicolor/48x48/hildon/general_web.png"));
47 if( getMaemoOrgUrl(pkg).isEmpty() && getMaemoOrgUrl(pkg->availablePackage()).isEmpty() ) {
48 ui->pushButton_website->setEnabled(false);
50 if( pkg->isMarkedForOperation() )
51 ui->pushButton_blacklist->setEnabled(false);
53 if( pkg->icon() && !pkg->icon()->isNull() ) {
54 ui->label_appicon->setPixmap( *pkg->icon() );
56 ui->label_appicon->setPixmap( QPixmap(":/icons/icons/appdefault.png") );
58 this->setWindowTitle( pkg->name() );
60 if( pkg->maemoDisplayName() != "" )
61 ui->label_header->setText("<b>" + pkg->maemoDisplayName() + "</b>");
63 ui->label_header->setText("<b>" + pkg->name() + "</b>");
65 ui->radioTabBasic->setChecked(true);
68 // switch to shorter button labels for portait mode
69 if( QApplication::desktop()->width() < QApplication::desktop()->height() )
71 ui->radioTabBasic->setText("Info");
72 ui->radioTabChanges->setText("Chgs");
73 ui->radioTabDepends->setText("Deps");
76 Package* upg_pkg = iPkg->availablePackage();
79 if( (!pkg->isUpgradeable() || (upg_pkg && upg_pkg->upgradeDescription().isEmpty())) && (getMaemoOrgUrl(upg_pkg).isEmpty()) )
80 ui->radioTabChanges->hide();
82 if( pkg->isUpgradeable() )
83 ui->radioInstall->setText("Upgrade");
85 ui->radioInstall->setText("Install");
87 if( pkg->markedOperation() == Package::PkgOpNone )
89 if( pkg->isInstalled() && pkg->isUpgradeable() )
90 ui->label_statusicon->setPixmap(QPixmap(":/icons/icons/pkg_nop_instupgr.png"));
91 else if( pkg->isInstalled() )
92 ui->label_statusicon->setPixmap(QPixmap(":/icons/icons/pkg_nop_installed.png"));
93 else if( !pkg->isInstalled() )
94 ui->label_statusicon->setPixmap(QPixmap(":/icons/icons/pkg_nop_notinstalled.png"));
96 ui->radioNothing->setChecked(true);
97 } else if( pkg->markedOperation() == Package::PkgOpInstallUpgrade ) {
98 if( pkg->isUpgradeable() )
99 ui->label_statusicon->setPixmap(QPixmap(":/icons/icons/pkg_upgrade.png"));
101 ui->label_statusicon->setPixmap(QPixmap(":/icons/icons/pkg_install.png"));
102 ui->radioInstall->setChecked(true);
103 } else if( pkg->markedOperation() == Package::PkgOpRemove ) {
104 ui->label_statusicon->setPixmap(QPixmap(":/icons/icons/pkg_remove.png"));
105 ui->radioRemove->setChecked(true);
108 if( !getMaemoOrgUrl(upg_pkg).isEmpty() && !iChangelogFetched && !iFetchInProgress &&
109 iSettings->qsettings()->value("always_fetch_changes",false).toBool() )
115 PackageSelector::~PackageSelector()
117 if( iNetworkAccessManager ) {
118 delete iNetworkAccessManager;
119 iNetworkAccessManager = 0;
124 void PackageSelector::changeEvent(QEvent *e)
126 QDialog::changeEvent(e);
128 case QEvent::LanguageChange:
129 ui->retranslateUi(this);
136 Package::operation PackageSelector::selectedOperation()
138 if( ui->radioInstall->isChecked() )
139 return Package::PkgOpInstallUpgrade;
140 if( ui->radioRemove->isChecked() )
141 return Package::PkgOpRemove;
143 return Package::PkgOpNone;
146 void PackageSelector::on_pushButton_blacklist_clicked()
149 /*if( iPkg->isUpgradeable() && iPkg->availablePackage() )
150 pkg = iPkg->availablePackage();*/
152 if( pkg->isInstalled() && pkg->isUpgradeable() )
154 Package* upg = pkg->availablePackage();
159 BlacklistSelect s(pkg, this);
160 BlacklistSelect::blackList old = pkg->blacklisted();
162 if( old != pkg->blacklisted() ) {
163 Package* p1 = iAptInterface->packagesInstalled()->value(pkg->name(),0);
164 Package* p2 = iAptInterface->packagesAvailable()->value(pkg->name(),0);
166 iAptInterface->removeFromBlacklist(p1,old);
167 if( pkg->blacklisted()==BlacklistSelect::BlacklistAll || pkg->blacklisted()==BlacklistSelect::BlacklistNone )
168 p1->setBlacklisted( pkg->blacklisted() );
169 else if( pkg->blacklisted()==BlacklistSelect::BlacklistThis && pkg->version()==p1->version() )
170 p1->setBlacklisted( pkg->blacklisted() );
172 p1->setBlacklisted( BlacklistSelect::BlacklistNone );
175 iAptInterface->removeFromBlacklist(p2,old);
176 if( pkg->blacklisted()==BlacklistSelect::BlacklistAll || pkg->blacklisted()==BlacklistSelect::BlacklistNone )
177 p2->setBlacklisted( pkg->blacklisted() );
178 else if( pkg->blacklisted()==BlacklistSelect::BlacklistThis && pkg->version()==p2->version() )
179 p2->setBlacklisted( pkg->blacklisted() );
181 p2->setBlacklisted( BlacklistSelect::BlacklistNone );
183 iAptInterface->writeBlacklist();
189 QString PackageSelector::getMaemoOrgUrl(Package* pkg)
196 if( pkg->repositories().count() == 0 )
199 for( int i=0; i<pkg->repositories().count(); i++ )
201 if( pkg->repositories().at(i) && pkg->repositories().at(i)->url().startsWith("http://repository.maemo.org") )
202 url = "http://maemo.org/packages/view/" + pkg->name() + "/";
207 void PackageSelector::updateInfo()
209 if( ui->radioTabBasic->isChecked() )
210 on_radioTabBasic_clicked();
211 else if( ui->radioTabChanges->isChecked() )
212 on_radioTabChanges_clicked();
213 else if( ui->radioTabDepends->isChecked() )
214 on_radioTabDepends_clicked();
216 ui->radioInstall->setEnabled(true);
217 ui->radioRemove->setEnabled(true);
218 ui->radioInstall->show();
219 ui->radioRemove->show();
221 Package* upg_pkg = iPkg->availablePackage();
223 if( iPkg->isInstalled() && !iPkg->isUpgradeable() )
225 ui->radioInstall->setEnabled(false);
226 ui->radioInstall->hide();
227 } else if( !iPkg->isInstalled() ) {
228 ui->radioRemove->setEnabled(false);
229 ui->radioRemove->hide();
232 if( iPkg->isBlacklisted() ) {
233 ui->radioInstall->setEnabled(false);
234 //ui->radioRemove->setEnabled(false);
236 if( iPkg->isInstalled() && upg_pkg && upg_pkg->isBlacklisted() ) {
237 ui->radioInstall->setEnabled(false);
241 void PackageSelector::on_pushButton_website_clicked()
243 QString url = getMaemoOrgUrl(iPkg);
245 url = getMaemoOrgUrl(iPkg->availablePackage());
250 QDBusConnection conn = QDBusConnection::connectToBus(QDBusConnection::SessionBus, "faster_application_manager");
252 QString service = "com.nokia.osso_browser";
253 QString path = "/com/nokia/osso_browser/request";
254 QString method = "open_new_window";
256 QDBusInterface browser(service, path, service, conn, this);
257 browser.call(method, url);
260 void PackageSelector::on_radioTabBasic_clicked()
262 ui->label_header2->show();
265 Package* upg_pkg = iPkg->availablePackage();
267 if( iPkg->isInstalled() ) {
268 header2 += "Installed, version <b>" + iPkg->version() + "</b>";
270 header2 += "Not installed";
274 if( iPkg->markedOperation() == Package::PkgOpInstallUpgrade )
276 if( iPkg->isUpgradeable() )
277 header2 += "Marked for <b>upgrade</b><br>";
279 header2 += "Marked for <b>installation</b><br>";
280 } else if(iPkg->markedOperation() == Package::PkgOpRemove)
282 header2 += "Marked for <b>removal</b><br>";
285 if( iPkg->isBlacklisted() && !iPkg->isUpgradeable() ) {
286 header2 += "BLACKLISTED";
287 if( iPkg->blacklisted() == BlacklistSelect::BlacklistAll )
289 else if( iPkg->blacklisted() == BlacklistSelect::BlacklistThis )
290 header2 += " (this)";
291 iPkg->setMarkedForOperation(Package::PkgOpNone);
293 } else if( upg_pkg && upg_pkg->isBlacklisted() ) {
294 header2 += "BLACKLISTED";
295 if( upg_pkg->blacklisted() == BlacklistSelect::BlacklistAll )
297 else if( upg_pkg->blacklisted() == BlacklistSelect::BlacklistThis )
298 header2 += " (" + upg_pkg->version() + ")";
299 iPkg->setMarkedForOperation(Package::PkgOpNone);
300 upg_pkg->setMarkedForOperation(Package::PkgOpNone);
304 ui->label_header2->setText(header2);
308 longtext += "Category: " + iPkg->section() + "<br>";
310 if( iPkg->isInstalled() ) {
311 longtext += "Installation date: ";
312 if( iPkg->date().isValid() )
313 longtext += iPkg->date().toString("yyyy-MM-dd hh:mm");
315 longtext += "Unknown";
319 if( iPkg->isInstalled() && iPkg->installedSize() > 0 )
320 longtext += QString("Size: %L1 kB<br>").arg(iPkg->installedSize() );
323 if( !iPkg->isInstalled() ){
324 longtext += "Available version <b>" + iPkg->version() + "</b>";
325 if( iPkg->size() > 0 )
326 longtext += QString(" (%L1 kB)").arg(iPkg->size()/1024 );
329 else if( iPkg->isUpgradeable() ){
330 longtext += "Available version <b>" + iPkg->upgradeableVersion() + "</b>";
331 if( iPkg->size() > 0 )
332 longtext += QString(" (%L1 kB)").arg(iPkg->size()/1024 );
336 if( !iPkg->isInstalled() ) {
337 longtext += "Available package date: ";
338 if( iPkg->date().isValid() )
339 longtext += iPkg->date().toString("yyyy-MM-dd hh:mm");
341 longtext += "Unknown";
343 } else if( iPkg->isUpgradeable() ) {
344 longtext += "Available package date: ";
345 if( iPkg->availablePackage() && iPkg->availablePackage()->date().isValid() )
346 longtext += iPkg->availablePackage()->date().toString("yyyy-MM-dd hh:mm");
348 longtext += "Unknown";
352 if( !iPkg->isInstalled() )
354 longtext += "Repositories: ";
355 if( iPkg->repositories().count()>0 ) {
356 for(int i=0; i<iPkg->repositories().count(); i++ ) {
357 if( iPkg->repositories().at(i) )
358 longtext += iPkg->repositories().at(i)->name();
360 longtext += "unknown";
361 if( i<iPkg->repositories().count()-1 )
366 longtext += "unknown<br>";
370 if( iPkg->isUpgradeable() )
372 longtext += "Repositories: ";
373 if( upg_pkg && upg_pkg->repositories().count()>0 ) {
374 for(int i=0; i<upg_pkg->repositories().count(); i++ ) {
375 if( upg_pkg->repositories().at(i) )
376 longtext += upg_pkg->repositories().at(i)->name();
378 longtext += "unknown";
379 if( i<upg_pkg->repositories().count()-1 )
384 longtext += "unknown<br>";
388 longtext += "<br>" + iPkg->descShort();
389 QString descLong = iPkg->descLong();
390 if( descLong.length()>0 ) {
391 descLong.replace('\n',"<br>");
392 longtext += "<font size=\"-1\"><br><br>" + descLong + "</font>";
395 ui->label_text->setText( longtext );
398 void PackageSelector::on_radioTabChanges_clicked()
400 ui->label_header2->hide();
401 ui->label_header2->setText("");
405 Package* upg_pkg = iPkg->availablePackage();
409 if( iPkg->isUpgradeable() && upg_pkg && !upg_pkg->upgradeDescription().isEmpty() )
411 text += "<u><b>Upgrade description:</b></u>";
412 text += "<font size=\"-1\"><br>";
413 text += upg_pkg->upgradeDescription();
414 text += "</font><br>";
415 text.replace('\n',"<br>");
419 if( !getMaemoOrgUrl(upg_pkg).isEmpty() && !iChangelogFetched && !iFetchInProgress ) {
421 changelog = "Fetching changelog...";
423 changelog = iChangelog;
424 if( iFetchInProgress )
425 changelog = "Fetching changelog...";
426 else if( changelog == "" )
427 changelog = "Not available";
430 text += "<u><b>Debian changelog:</b></u><font size=\"-1\"><br>";
434 ui->label_text->setText(text);
437 void PackageSelector::on_radioTabDepends_clicked()
439 ui->label_header2->hide();
440 ui->label_header2->setText("");
441 ui->label_text->setText("");
443 QStringList deps = Package::toTrimmedRichTextList( iPkg->depends() );
444 QStringList confl = Package::toTrimmedRichTextList( iPkg->conflicts() );
445 QStringList predeps = Package::toTrimmedRichTextList( iPkg->preDepends() );
446 QStringList repl = Package::toTrimmedRichTextList( iPkg->replaces() );
447 QStringList prov = Package::toTrimmedRichTextList( iPkg->provides() );
448 QStringList brks = Package::toTrimmedRichTextList( iPkg->breaks() );
449 QStringList recs = Package::toTrimmedRichTextList( iPkg->recommends() );
450 QStringList sugs = Package::toTrimmedRichTextList( iPkg->suggests() );
456 text += "<b><u>Depends:</u></b><br><font size=\"-1\">";
457 text += deps.join(", ");
458 text += "</font><br>";
461 if( predeps.count()>0 )
463 text += "<b><u>Pre-Depends:</u></b><br><font size=\"-1\">";
464 text += predeps.join(", ");
465 text += "</font><br>";
468 if( confl.count()>0 )
470 text += "<b><u>Conflicts:</u></b><br><font size=\"-1\">";
471 text += confl.join(", ");
472 text += "</font><br>";
477 text += "<b><u>Provides:</u></b><br><font size=\"-1\">";
478 text += prov.join(", ");
479 text += "</font><br>";
484 text += "<b><u>Replaces:</u></b><br><font size=\"-1\">";
485 text += repl.join(", ");
486 text += "</font><br>";
491 text += "<b><u>Breaks:</u></b><br><font size=\"-1\">";
492 text += brks.join(", ");
493 text += "</font><br>";
498 text += "<b><u>Recommends:</u></b><br><font size=\"-1\">";
499 text += recs.join(", ");
500 text += "</font><br>";
505 text += "<b><u>Suggests:</u></b><br><font size=\"-1\">";
506 text += sugs.join(", ");
507 text += "</font><br>";
510 if( deps.count()==0 && predeps.count()==0 && confl.count()==0 && prov.count()==0 &&
511 repl.count()==0 && brks.count()==0 && recs.count()==0 && sugs.count()==0 )
513 text = "Package has no dependencies listed";
516 ui->label_text->setText(text);
519 void PackageSelector::queryChangelog()
521 if( iChangelogFetched || iFetchInProgress )
524 iChangelogFetched = false;
525 iFetchInProgress = true;
528 Package* pkg = iPkg->availablePackage();
532 if( getMaemoOrgUrl(pkg) == "" ) {
533 iChangelogFetched = true;
537 if( !iNetworkAccessManager ) {
538 iNetworkAccessManager = new QNetworkAccessManager(this);
539 connect(iNetworkAccessManager,SIGNAL(finished(QNetworkReply*)),this,SLOT(changelogFetchNetworkReply(QNetworkReply*)));
541 if( iSettings->qsettings()->value("use_proxies").toBool() && !iSettings->qsettings()->value("http_proxy").toString().isEmpty() )
543 QNetworkProxy proxy = Settings::createProxyFromString( iSettings->qsettings()->value("http_proxy").toString() );
544 iNetworkAccessManager->setProxy(proxy);
548 QUrl url( getMaemoOrgUrl(pkg) );
549 QNetworkRequest req(url);
551 qDebug() << "fetching changelog";
553 iNetworkAccessManager->get(req);
556 void PackageSelector::changelogFetchNetworkReply(QNetworkReply* reply)
558 if( reply->error() == QNetworkReply::NoError ) {
559 QByteArray data = reply->readAll();
561 int pos = data.indexOf("<div class=\"changelog\">");
562 int pos2 = data.indexOf("</div>", pos);
564 if( pos!=-1 && pos2!=-1 ) {
565 iChangelog = parseChangeTable( QString::fromUtf8( data.mid(pos,pos2-pos+6) ) );
570 qDebug() << "changelog fetched";
572 iChangelog = "Not available (Network error)";
573 qDebug() << "changelog fetch error:" << reply->error() << reply->errorString();
576 reply->deleteLater();
577 iFetchInProgress = false;
578 iChangelogFetched = true;
580 if( this->isVisible() && ui->radioTabChanges->isChecked() )
581 on_radioTabChanges_clicked();
584 QString PackageSelector::parseChangeTable(QString tabledata)
586 tabledata.remove("<strong>");
587 tabledata.remove("</strong>");
588 tabledata.remove('\n');
590 //qDebug() << tabledata;
592 QString newdata = "<table><tbody>";
594 int pos = tabledata.indexOf("<tr>", tabledata.indexOf("<tbody>") );
596 int pos2 = tabledata.indexOf("</td>",pos);
597 pos2 = tabledata.indexOf("</td>",pos2+5);
600 newdata += tabledata.mid(pos, pos2-pos+5) + "</tr>";
602 pos = tabledata.indexOf("<tr>",pos+4);
605 newdata += "</tbody></table>";
607 //qDebug() << newdata;