From 373d6162d7ea73fa09d3737a5264bf77a41b8e38 Mon Sep 17 00:00:00 2001 From: nowrep Date: Fri, 23 Mar 2012 13:58:31 +0100 Subject: [PATCH] Improved suggesting file name when downloading page / links. - it now appends .html ONLY when you are attempting to download the whole page and when there is no suffix set in url --- src/lib/app/qupzilla.cpp | 6 +++++- src/lib/downloads/downloadfilehelper.cpp | 26 +++++------------------- src/lib/downloads/downloadfilehelper.h | 2 +- src/lib/downloads/downloadmanager.cpp | 12 +++++------ src/lib/downloads/downloadmanager.h | 5 +++-- src/lib/tools/globalfunctions.cpp | 10 +++++++-- src/lib/webview/webview.cpp | 25 +++++++++++++++++------ src/lib/webview/webview.h | 3 ++- 8 files changed, 49 insertions(+), 40 deletions(-) diff --git a/src/lib/app/qupzilla.cpp b/src/lib/app/qupzilla.cpp index 204d565fe..02007ec08 100644 --- a/src/lib/app/qupzilla.cpp +++ b/src/lib/app/qupzilla.cpp @@ -1504,9 +1504,13 @@ void QupZilla::fullScreen(bool make) void QupZilla::savePage() { QNetworkRequest request(weView()->url()); + QString suggestedFileName = qz_getFileNameFromUrl(weView()->url()); + if (!suggestedFileName.contains(".")) { + suggestedFileName.append(".html"); + } DownloadManager* dManager = mApp->downManager(); - dManager->download(request, weView()->webPage(), false); + dManager->download(request, weView()->webPage(), false, suggestedFileName); } void QupZilla::sendLink() diff --git a/src/lib/downloads/downloadfilehelper.cpp b/src/lib/downloads/downloadfilehelper.cpp index f8d347b17..7f454dd71 100644 --- a/src/lib/downloads/downloadfilehelper.cpp +++ b/src/lib/downloads/downloadfilehelper.cpp @@ -57,11 +57,11 @@ DownloadFileHelper::DownloadFileHelper(const QString &lastDownloadPath, const QS //// on Windows working properly ) ////////////////////////////////////////////////////// -void DownloadFileHelper::handleUnsupportedContent(QNetworkReply* reply, bool askWhatToDo) +void DownloadFileHelper::handleUnsupportedContent(QNetworkReply* reply, bool askWhatToDo, const QString &suggestedFileName) { m_timer = new QTime(); m_timer->start(); - m_h_fileName = getFileName(reply); + m_h_fileName = suggestedFileName.isEmpty() ? getFileName(reply) : suggestedFileName; m_reply = reply; QFileInfo info(m_h_fileName); @@ -196,22 +196,8 @@ void DownloadFileHelper::fileNameChoosed(const QString &name, bool fileNameAutoG m_fileName = m_userFileName.right(size - pos - 1); } - if (fileNameAutoGenerated && QFile::exists(m_userFileName)) { - QString _tmpFileName = m_fileName; - int i = 1; - while (QFile::exists(m_path + "/" + _tmpFileName)) { - _tmpFileName = m_fileName; - int index = _tmpFileName.lastIndexOf("."); - - if (index == -1) { - _tmpFileName.append("(" + QString::number(i) + ")"); - } - else { - _tmpFileName = _tmpFileName.mid(0, index) + "(" + QString::number(i) + ")" + _tmpFileName.mid(index); - } - i++; - } - m_fileName = _tmpFileName; + if (fileNameAutoGenerated) { + m_fileName = qz_ensureUniqueFilename(m_fileName); } if (!m_path.contains(QDir::tempPath())) { @@ -279,9 +265,7 @@ QString DownloadFileHelper::getFileName(QNetworkReply* reply) name.remove("\";"); } - name = qz_filterCharsFromFilename(name); - - return name; + return qz_filterCharsFromFilename(name); } DownloadFileHelper::~DownloadFileHelper() diff --git a/src/lib/downloads/downloadfilehelper.h b/src/lib/downloads/downloadfilehelper.h index 2b5cfb957..550a10bb4 100644 --- a/src/lib/downloads/downloadfilehelper.h +++ b/src/lib/downloads/downloadfilehelper.h @@ -43,7 +43,7 @@ public: void setDownloadManager(DownloadManager* m) { m_manager = m; } void setLastDownloadOption(const DownloadManager::DownloadOption &option) { m_lastDownloadOption = option; } - void handleUnsupportedContent(QNetworkReply* reply, bool askWhatToDo); + void handleUnsupportedContent(QNetworkReply* reply, bool askWhatToDo, const QString &suggestedFileName); signals: void itemCreated(QListWidgetItem* item, DownloadItem* downItem); diff --git a/src/lib/downloads/downloadmanager.cpp b/src/lib/downloads/downloadmanager.cpp index f99f0d161..bff1f6f86 100644 --- a/src/lib/downloads/downloadmanager.cpp +++ b/src/lib/downloads/downloadmanager.cpp @@ -190,7 +190,7 @@ void DownloadManager::clearList() qDeleteAll(items); } -void DownloadManager::download(const QNetworkRequest &request, WebPage* page, bool askWhatToDo) +void DownloadManager::download(const QNetworkRequest &request, WebPage* page, bool fromPageDownload, const QString &suggestedFileName) { if (!page) { return; @@ -201,16 +201,16 @@ void DownloadManager::download(const QNetworkRequest &request, WebPage* page, bo req.setAttribute((QNetworkRequest::Attribute)(QNetworkRequest::User + 100), 0); req.setAttribute((QNetworkRequest::Attribute)(QNetworkRequest::User + 101), 0); - handleUnsupportedContent(m_networkManager->get(req), page, askWhatToDo); + handleUnsupportedContent(m_networkManager->get(req), page, fromPageDownload, suggestedFileName); } -void DownloadManager::handleUnsupportedContent(QNetworkReply* reply, WebPage* page, bool askWhatToDo) +void DownloadManager::handleUnsupportedContent(QNetworkReply *reply, WebPage *page, bool fromPageDownload, const QString &suggestedFileName) { - if (reply->url().scheme() == "qupzilla") { + if (!page || reply->url().scheme() == "qupzilla") { return; } - if (m_useExternalManager) { + if (!fromPageDownload && m_useExternalManager) { startExternalManager(reply->url()); reply->abort(); reply->deleteLater(); @@ -225,7 +225,7 @@ void DownloadManager::handleUnsupportedContent(QNetworkReply* reply, WebPage* pa h->setLastDownloadOption(m_lastDownloadOption); h->setDownloadManager(this); h->setListWidget(ui->list); - h->handleUnsupportedContent(reply, askWhatToDo); + h->handleUnsupportedContent(reply, fromPageDownload, suggestedFileName); } void DownloadManager::itemCreated(QListWidgetItem* item, DownloadItem* downItem) diff --git a/src/lib/downloads/downloadmanager.h b/src/lib/downloads/downloadmanager.h index d53f8e3d1..deeda287e 100644 --- a/src/lib/downloads/downloadmanager.h +++ b/src/lib/downloads/downloadmanager.h @@ -49,8 +49,9 @@ public: void loadSettings(); - void download(const QNetworkRequest &request, WebPage* page, bool askWhatToDo = true); - void handleUnsupportedContent(QNetworkReply* reply, WebPage* page, bool askWhatToDo = true); + void download(const QNetworkRequest &request, WebPage* page, bool fromPageDownload = true, const QString &suggestedFileName = QString()); + void handleUnsupportedContent(QNetworkReply* reply, WebPage* page, bool fromPageDownload = true, const QString &suggestedFileName = QString()); + bool canClose(); void setLastDownloadPath(const QString &lastPath) { m_lastDownloadPath = lastPath; } void setLastDownloadOption(const DownloadOption &option) { m_lastDownloadOption = option; } diff --git a/src/lib/tools/globalfunctions.cpp b/src/lib/tools/globalfunctions.cpp index 9540ed1dd..a7319c46c 100644 --- a/src/lib/tools/globalfunctions.cpp +++ b/src/lib/tools/globalfunctions.cpp @@ -210,14 +210,20 @@ QString qz_getFileNameFromUrl(const QUrl &url) fileName.remove("/"); } - return qz_filterCharsFromFilename(fileName); + fileName = qz_filterCharsFromFilename(fileName); + + if (fileName.isEmpty()) { + fileName = qz_filterCharsFromFilename(url.host().replace(".", "-")); + } + + return fileName; } QString qz_filterCharsFromFilename(const QString &name) { QString value = name; + value.replace("/", "-"); value.remove("\\"); - value.remove("/"); value.remove(":"); value.remove("*"); value.remove("?"); diff --git a/src/lib/webview/webview.cpp b/src/lib/webview/webview.cpp index 02b2465fb..40bb82703 100644 --- a/src/lib/webview/webview.cpp +++ b/src/lib/webview/webview.cpp @@ -338,11 +338,24 @@ void WebView::copyLinkToClipboard() } } -void WebView::downloadLinkToDisk() +void WebView::downloadPage() +{ + QNetworkRequest request(url()); + QString suggestedFileName = qz_getFileNameFromUrl(url()); + if (!suggestedFileName.contains(".")) { + suggestedFileName.append(".html"); + } + + DownloadManager* dManager = mApp->downManager(); + dManager->download(request, qobject_cast(page()), false, suggestedFileName); +} + +void WebView::downloadUrlToDisk() { if (QAction* action = qobject_cast(sender())) { - DownloadManager* dManager = mApp->downManager(); QNetworkRequest request(action->data().toUrl()); + + DownloadManager* dManager = mApp->downManager(); dManager->download(request, qobject_cast(page()), false); } } @@ -662,7 +675,7 @@ void WebView::createPageContextMenu(QMenu* menu, const QPoint &pos) menu->addSeparator(); menu->addAction(IconProvider::fromTheme("user-bookmarks"), tr("Book&mark page"), this, SLOT(bookmarkLink())); - menu->addAction(QIcon::fromTheme("document-save"), tr("&Save page as..."), this, SLOT(downloadLinkToDisk()))->setData(url()); + menu->addAction(QIcon::fromTheme("document-save"), tr("&Save page as..."), this, SLOT(downloadPage())); menu->addAction(QIcon::fromTheme("edit-copy"), tr("&Copy page link"), this, SLOT(copyLinkToClipboard()))->setData(url()); menu->addAction(QIcon::fromTheme("mail-message-new"), tr("Send page link..."), this, SLOT(sendLinkByMail()))->setData(url()); menu->addAction(QIcon::fromTheme("document-print"), tr("&Print page"), this, SLOT(printPage())); @@ -691,7 +704,7 @@ void WebView::createLinkContextMenu(QMenu* menu, const QWebHitTestResult &hitTes menu->addAction(QIcon::fromTheme("window-new"), tr("Open link in new &window"), this, SLOT(openUrlInNewWindow()))->setData(hitTest.linkUrl()); menu->addSeparator(); menu->addAction(IconProvider::fromTheme("user-bookmarks"), tr("B&ookmark link"), this, SLOT(bookmarkLink()))->setData(hitTest.linkUrl()); - menu->addAction(QIcon::fromTheme("document-save"), tr("&Save link as..."), this, SLOT(downloadLinkToDisk()))->setData(hitTest.linkUrl()); + menu->addAction(QIcon::fromTheme("document-save"), tr("&Save link as..."), this, SLOT(downloadUrlToDisk()))->setData(hitTest.linkUrl()); menu->addAction(QIcon::fromTheme("mail-message-new"), tr("Send link..."), this, SLOT(sendLinkByMail()))->setData(hitTest.linkUrl()); menu->addAction(QIcon::fromTheme("edit-copy"), tr("&Copy link address"), this, SLOT(copyLinkToClipboard()))->setData(hitTest.linkUrl()); menu->addSeparator(); @@ -713,7 +726,7 @@ void WebView::createImageContextMenu(QMenu* menu, const QWebHitTestResult &hitTe menu->addAction(tr("Copy im&age"), this, SLOT(copyImageToClipboard()))->setData(hitTest.imageUrl()); menu->addAction(QIcon::fromTheme("edit-copy"), tr("Copy image ad&dress"), this, SLOT(copyLinkToClipboard()))->setData(hitTest.imageUrl()); menu->addSeparator(); - menu->addAction(QIcon::fromTheme("document-save"), tr("&Save image as..."), this, SLOT(downloadLinkToDisk()))->setData(hitTest.imageUrl()); + menu->addAction(QIcon::fromTheme("document-save"), tr("&Save image as..."), this, SLOT(downloadUrlToDisk()))->setData(hitTest.imageUrl()); menu->addAction(QIcon::fromTheme("mail-message-new"), tr("Send image..."), this, SLOT(sendLinkByMail()))->setData(hitTest.imageUrl()); menu->addSeparator(); @@ -797,7 +810,7 @@ void WebView::createMediaContextMenu(QMenu* menu, const QWebHitTestResult &hitTe menu->addSeparator(); menu->addAction(QIcon::fromTheme("edit-copy"), tr("&Copy Media Address"), this, SLOT(copyLinkToClipboard()))->setData(videoUrl); menu->addAction(QIcon::fromTheme("mail-message-new"), tr("&Send Media Address"), this, SLOT(sendLinkByMail()))->setData(videoUrl); - menu->addAction(QIcon::fromTheme("document-save"), tr("Save Media To &Disk"), this, SLOT(downloadLinkToDisk()))->setData(videoUrl); + menu->addAction(QIcon::fromTheme("document-save"), tr("Save Media To &Disk"), this, SLOT(downloadUrlToDisk()))->setData(videoUrl); } void WebView::pauseMedia() diff --git a/src/lib/webview/webview.h b/src/lib/webview/webview.h index 919422896..e7ad20533 100644 --- a/src/lib/webview/webview.h +++ b/src/lib/webview/webview.h @@ -83,7 +83,8 @@ protected slots: void openUrlInNewWindow(); void sendLinkByMail(); void copyLinkToClipboard(); - void downloadLinkToDisk(); + void downloadPage(); + void downloadUrlToDisk(); void copyImageToClipboard(); void openActionUrl(); void showSource(QWebFrame* frame = 0, const QString &selectedHtml = QString());