From a6ef003dd4c1b6ad08eca4f5adaa4679bbc20bce Mon Sep 17 00:00:00 2001 From: Andrea Diamantini Date: Sat, 20 Mar 2010 22:54:21 +0100 Subject: Downloads Page This commit implements the downloads history page. While it is in an horrible shape, its slots seem working well It needs just some love.. --- src/history/historymanager.cpp | 53 ++++++++++++++++++++ src/history/historymanager.h | 32 +++++++++++- src/newtabpage.cpp | 51 +++++++++++++++++++ src/newtabpage.h | 7 +-- src/protocolhandler.cpp | 2 + src/settings/settings_general.ui | 7 ++- src/webpage.cpp | 105 ++++++++++++++++++++++++--------------- 7 files changed, 213 insertions(+), 44 deletions(-) diff --git a/src/history/historymanager.cpp b/src/history/historymanager.cpp index 362fe340..39c128f4 100644 --- a/src/history/historymanager.cpp +++ b/src/history/historymanager.cpp @@ -451,3 +451,56 @@ KCompletion * HistoryManager::completionObject() const { return m_completion; } + + +void HistoryManager::addDownload(const QString &srcUrl, const QString &destUrl) +{ + QString downloadFilePath = KStandardDirs::locateLocal("appdata" , "downloads"); + QFile downloadFile(downloadFilePath); + if ( !downloadFile.open(QFile::WriteOnly | QFile::Append) ) + { + kDebug() << "azz..."; + return; + } + QDataStream out(&downloadFile); + out << srcUrl; + out << destUrl; + out << QDateTime::currentDateTime(); + downloadFile.close(); +} + + +DownloadList HistoryManager::downloads() +{ + DownloadList list; + + QString downloadFilePath = KStandardDirs::locateLocal("appdata" , "downloads"); + QFile downloadFile(downloadFilePath); + if ( !downloadFile.open(QFile::ReadOnly) ) + { + kDebug() << "azz..."; + return list; + } + + QDataStream in(&downloadFile); + while(!in.atEnd()) + { + QString srcUrl; + in >> srcUrl; + QString destUrl; + in >> destUrl; + QDateTime dt; + in >> dt; + DownloadItem item(srcUrl, destUrl, dt); + list << item; + } + return list; +} + + +bool HistoryManager::clearDownloadsHistory() +{ + QString downloadFilePath = KStandardDirs::locateLocal("appdata" , "downloads"); + QFile downloadFile(downloadFilePath); + return downloadFile.remove(); +} diff --git a/src/history/historymanager.h b/src/history/historymanager.h index e744ca4b..8fc5c30e 100644 --- a/src/history/historymanager.h +++ b/src/history/historymanager.h @@ -57,7 +57,10 @@ public: const QDateTime &d = QDateTime(), const QString &t = QString() ) - : title(t), url(u), dateTime(d) {} + : title(t) + , url(u), + dateTime(d) + {} inline bool operator==(const HistoryItem &other) const { @@ -77,6 +80,29 @@ public: }; +// --------------------------------------------------------------------------------------------------------------- + + +class DownloadItem +{ +public: + DownloadItem() {} + explicit DownloadItem(const QString &srcUrl, + const QString &destUrl, + const QDateTime &d + ) + : srcUrlString(srcUrl) + , destUrlString(destUrl) + , dateTime(d) + {} + + QString srcUrlString; + QString destUrlString; + QDateTime dateTime; +}; + + +typedef QList DownloadList; // --------------------------------------------------------------------------------------------------------------- @@ -131,6 +157,10 @@ public: */ KCompletion *completionObject() const; + void addDownload(const QString &srcUrl, const QString &destUrl); + DownloadList downloads(); + bool clearDownloadsHistory(); + public slots: void clear(); void loadSettings(); diff --git a/src/newtabpage.cpp b/src/newtabpage.cpp index 69a80b29..36ddafed 100644 --- a/src/newtabpage.cpp +++ b/src/newtabpage.cpp @@ -53,6 +53,9 @@ // Qt Includes #include +// Defines +#define QL1S(x) QLatin1String(x) + NewTabPage::NewTabPage(QWebFrame *frame) : m_root(frame->documentElement()) @@ -124,6 +127,11 @@ void NewTabPage::generate(const KUrl &url) bookmarksPage(); title = i18n("Bookmarks"); } + else if(url == KUrl("about:downloads")) + { + downloadsPage(); + title = i18n("Downloads"); + } m_root.document().findFirst("title").setPlainText(title); } @@ -315,6 +323,13 @@ void NewTabPage::browsingMenu(const KUrl ¤tUrl) nav.findFirst("a").appendInside(i18n("History")); navItems.append(nav); + nav = markup(".link"); // History + nav.findFirst("a").setAttribute("href", "about:downloads"); + nav.findFirst("img").setAttribute("src" , QString("file:///" + + loader->iconPath("download", KIconLoader::Desktop ||KIconLoader::SizeSmall))); + nav.findFirst("a").appendInside(i18n("Downloads")); + navItems.append(nav); + QWebElement it; foreach(it, navItems) { @@ -442,3 +457,39 @@ QString NewTabPage::checkTitle(const QString &title) } return t; } + + +void NewTabPage::downloadsPage() +{ + m_root.addClass("downloads"); + + DownloadList list = Application::historyManager()->downloads(); + + foreach(const DownloadItem &item, list) + { + m_root.appendInside(markup("h3")); + m_root.lastChild().setPlainText(""); + + KUrl u = KUrl(item.destUrlString); + QString fName = u.fileName(); + QString dir = QL1S("file://") + u.directory(); + + m_root.appendInside( item.dateTime.toString("dddd") ); + m_root.appendInside("
"); + m_root.appendInside( item.dateTime.toString("dd MMMM yyyy") ); + m_root.appendInside(", "); + m_root.appendInside( item.dateTime.toString("hh:mm:ss") ); + m_root.appendInside("
"); + + m_root.appendInside(fName); + m_root.appendInside("
"); + + m_root.appendInside(item.srcUrlString); + m_root.appendInside("
"); + + m_root.appendInside(markup("a")); + m_root.lastChild().setAttribute("href" , dir); + m_root.lastChild().setPlainText("browse dir"); + m_root.appendInside("
"); + } +} diff --git a/src/newtabpage.h b/src/newtabpage.h index 6d3a7ea9..6604e4df 100644 --- a/src/newtabpage.h +++ b/src/newtabpage.h @@ -63,8 +63,8 @@ public: private: - // these are the "high-level" functions to build the new tab page - // basically, you call browsingMenu + one the the *Page methods + // these are the "high-level" functions to build the new tab page. + // Basically, you call browsingMenu + one of the *Page methods // to load a page void browsingMenu(const KUrl ¤tUrl); @@ -72,7 +72,8 @@ private: void historyPage(); void bookmarksPage(); void closedTabsPage(); - + void downloadsPage(); + // -------------------------------------------------------------------------- // "low-level" functions // we use these to create the pages over diff --git a/src/protocolhandler.cpp b/src/protocolhandler.cpp index 9d1560ed..faba894b 100644 --- a/src/protocolhandler.cpp +++ b/src/protocolhandler.cpp @@ -142,6 +142,8 @@ bool ProtocolHandler::preHandling(const QNetworkRequest &request, QWebFrame *fra case 3: // history _url = KUrl("about:history"); break; + case 4: // downloads + _url = KUrl("about:downloads"); default: // unuseful break; } diff --git a/src/settings/settings_general.ui b/src/settings/settings_general.ui index a4503d4a..98a56591 100644 --- a/src/settings/settings_general.ui +++ b/src/settings/settings_general.ui @@ -262,6 +262,11 @@ History + + + Downloads + + @@ -284,7 +289,7 @@ If enabled, rekonq will display an additional context menu entry, which, when selected, lists all available links of the current website in KGet. - + List links with KGet diff --git a/src/webpage.cpp b/src/webpage.cpp index 42193ed0..0e7b3d8a 100644 --- a/src/webpage.cpp +++ b/src/webpage.cpp @@ -71,6 +71,9 @@ #include #include +// Defines +#define QL1S(x) QLatin1String(x) + WebPage::WebPage(QWidget *parent) : KWebPage(parent, KWalletIntegration) @@ -292,55 +295,76 @@ QString WebPage::errorPage(QNetworkReply *reply) } +// WARNING +// this code is actually copied from KWebPage::downloadRequest to save +// downloads data before. If you have some better ideas about, +// feel free to let us know about :) void WebPage::downloadRequest(const QNetworkRequest &request) { - if (ReKonfig::kgetDownload()) - { - //*Copy of kwebpage code (Shouldn't be done in kwebpage ?) - - KUrl destUrl; - KUrl srcUrl (request.url()); - int result = KIO::R_OVERWRITE; - - do - { - destUrl = KFileDialog::getSaveFileName(srcUrl.fileName(), QString(), view()); - - if (destUrl.isLocalFile()) - { - QFileInfo finfo (destUrl.toLocalFile()); - if (finfo.exists()) - { - QDateTime now = QDateTime::currentDateTime(); - QPointer dlg = new KIO::RenameDialog( view(), i18n("Overwrite File?"), srcUrl, destUrl, - KIO::RenameDialog_Mode(KIO::M_OVERWRITE | KIO::M_SKIP), - -1, finfo.size(), - now.toTime_t(), finfo.created().toTime_t(), - now.toTime_t(), finfo.lastModified().toTime_t()); - result = dlg->exec(); - delete dlg; - } - } - } - while (result == KIO::R_CANCEL && destUrl.isValid()); - - if (result == KIO::R_OVERWRITE && destUrl.isValid()) + KUrl destUrl; + KUrl srcUrl (request.url()); + int result = KIO::R_OVERWRITE; + + do + { + destUrl = KFileDialog::getSaveFileName(srcUrl.fileName(), QString(), view()); + + if (destUrl.isLocalFile()) + { + QFileInfo finfo( destUrl.toLocalFile() ); + if ( finfo.exists() ) + { + QDateTime now = QDateTime::currentDateTime(); + QPointer dlg = new KIO::RenameDialog( view(), + i18n("Overwrite File?"), + srcUrl, + destUrl, + KIO::RenameDialog_Mode(KIO::M_OVERWRITE | KIO::M_SKIP), + -1, + finfo.size(), + now.toTime_t(), + finfo.created().toTime_t(), + now.toTime_t(), + finfo.lastModified().toTime_t() + ); + result = dlg->exec(); + delete dlg; + } + } + } + while ( result == KIO::R_CANCEL && destUrl.isValid() ); + + // now store data + // now, destUrl, srcUrl + Application::historyManager()->addDownload( srcUrl.pathOrUrl() , destUrl.pathOrUrl() ); + + if ( result == KIO::R_OVERWRITE && destUrl.isValid() ) + { + if ( ReKonfig::kgetDownload() ) { - //*End of copy code - //KGet integration: if(!QDBusConnection::sessionBus().interface()->isServiceRegistered("org.kde.kget")) { KToolInvocation::kdeinitExecWait("kget"); } QDBusInterface kget("org.kde.kget", "/KGet", "org.kde.kget.main"); - kget.call("addTransfer", srcUrl.prettyUrl(), destUrl.prettyUrl(), true); + if( kget.isValid() ) + { + kget.call("addTransfer", srcUrl.prettyUrl(), destUrl.prettyUrl(), true); + return; + } } - return; - } - - KWebPage::downloadRequest(request); + // else, use KIO or fallback to it + KIO::Job *job = KIO::file_copy(srcUrl, destUrl, -1, KIO::Overwrite); + QVariant attr = request.attribute(static_cast(KIO::AccessManager::MetaData)); + if (attr.isValid() && attr.type() == QVariant::Map) + job->setMetaData(KIO::MetaData(attr.toMap())); + + job->addMetaData(QL1S("MaxCacheSize"), QL1S("0")); // Don't store in http cache. + job->addMetaData(QL1S("cache"), QL1S("cache")); // Use entry from cache if available. + job->uiDelegate()->setAutoErrorHandlingEnabled(true); + } } @@ -369,5 +393,8 @@ void WebPage::downloadAllContentsWithKGet() KToolInvocation::kdeinitExecWait("kget"); } QDBusInterface kget("org.kde.kget", "/KGet", "org.kde.kget.main"); - kget.call("importLinks", QVariant(contents.toList())); + if( kget.isValid() ) + { + kget.call("importLinks", QVariant(contents.toList())); + } } -- cgit v1.2.1