diff options
author | Tamas Zakor <ztamas@inf.u-szeged.hu> | 2019-05-28 13:54:28 +0200 |
---|---|---|
committer | Tamas Zakor <ztamas@inf.u-szeged.hu> | 2019-07-05 08:57:30 +0200 |
commit | 0884fab3b161b62c1e2bb1bac6bbd74560f06232 (patch) | |
tree | ec07c0b9473c5eb05880cd1783ca11dd5bc09aa0 /src/core | |
parent | fbc2700180d97d9c84b079b7c4da9eace19abf23 (diff) |
Add API to change download directory path and file name
Add functions and property to change the download directory and
file name in QWebEngineDownloadItem and QQuickWebEngineDownloadItem
and deprecate the path() and setPath().
Regenerating the uniquifying download filename after
change the download directory.
[ChangeLog][DownloadItem] Add functions and property
to change the download directory and file name in
QWebEngineDownloadItem and QQuickWebEngineDownloadItem
and deprecate the path() and setPath().
Task-number: QTBUG-56978
Change-Id: I6e63da82a187add8bc3206cc80c8bf6865fbdd35
Reviewed-by: Allan Sandfeld Jensen <allan.jensen@qt.io>
Diffstat (limited to 'src/core')
-rw-r--r-- | src/core/download_manager_delegate_qt.cpp | 31 | ||||
-rw-r--r-- | src/core/download_manager_delegate_qt.h | 1 | ||||
-rw-r--r-- | src/core/profile_adapter.cpp | 30 | ||||
-rw-r--r-- | src/core/profile_adapter.h | 3 | ||||
-rw-r--r-- | src/core/profile_adapter_client.h | 2 |
5 files changed, 45 insertions, 22 deletions
diff --git a/src/core/download_manager_delegate_qt.cpp b/src/core/download_manager_delegate_qt.cpp index ba506601f..34e290317 100644 --- a/src/core/download_manager_delegate_qt.cpp +++ b/src/core/download_manager_delegate_qt.cpp @@ -168,22 +168,7 @@ bool DownloadManagerDelegateQt::DetermineDownloadTarget(download::DownloadItem* QDir defaultDownloadDirectory(m_profileAdapter->downloadPath()); - QFileInfo suggestedFile(defaultDownloadDirectory.absoluteFilePath(suggestedFilename)); - QString suggestedFilePath = suggestedFile.absoluteFilePath(); - base::FilePath tmpFilePath(toFilePath(suggestedFilePath).NormalizePathSeparatorsTo('/')); - - int uniquifier = base::GetUniquePathNumber(tmpFilePath, base::FilePath::StringType()); - if (uniquifier > 0) - suggestedFilePath = toQt(tmpFilePath.InsertBeforeExtensionASCII(base::StringPrintf(" (%d)", uniquifier)).AsUTF8Unsafe()); - else if (uniquifier == -1) { - base::Time::Exploded exploded; - item->GetStartTime().LocalExplode(&exploded); - std::string suffix = base::StringPrintf( - " - %04d-%02d-%02dT%02d%02d%02d.%03d", exploded.year, exploded.month, - exploded.day_of_month, exploded.hour, exploded.minute, - exploded.second, exploded.millisecond); - suggestedFilePath = toQt(tmpFilePath.InsertBeforeExtensionASCII(suffix).AsUTF8Unsafe()); - } + QString suggestedFilePath = m_profileAdapter->determineDownloadPath(defaultDownloadDirectory.absolutePath(), suggestedFilename, item->GetStartTime().ToTimeT()); item->AddObserver(this); QList<ProfileAdapterClient*> clients = m_profileAdapter->clients(); @@ -209,7 +194,8 @@ bool DownloadManagerDelegateQt::DetermineDownloadTarget(download::DownloadItem* downloadType, item->GetLastReason(), adapterClient, - suggestedFilename + suggestedFilename, + item->GetStartTime().ToTimeT() }; for (ProfileAdapterClient *client : qAsConst(clients)) { @@ -218,7 +204,7 @@ bool DownloadManagerDelegateQt::DetermineDownloadTarget(download::DownloadItem* break; } - suggestedFile.setFile(info.path); + QFileInfo suggestedFile(info.path); if (info.accepted && !suggestedFile.absoluteDir().mkpath(suggestedFile.absolutePath())) { qWarning("Creating download path failed, download cancelled: %s", suggestedFile.absolutePath().toUtf8().data()); @@ -279,7 +265,7 @@ void DownloadManagerDelegateQt::ChooseSavePath(content::WebContents *web_content acceptedByDefault = true; } if (QFileInfo(suggestedFilePath).isRelative()) { - const QDir downloadDir(QStandardPaths::writableLocation(QStandardPaths::DownloadLocation)); + const QDir downloadDir(m_profileAdapter->downloadPath()); suggestedFilePath = downloadDir.absoluteFilePath(suggestedFilePath); } @@ -311,8 +297,8 @@ void DownloadManagerDelegateQt::ChooseSavePath(content::WebContents *web_content ProfileAdapterClient::SavePage, ProfileAdapterClient::NoReason, adapterClient, - QFileInfo(suggestedFilePath).fileName() - + QFileInfo(suggestedFilePath).fileName(), + time_t(QDateTime::currentMSecsSinceEpoch()) }; for (ProfileAdapterClient *client : qAsConst(clients)) { @@ -379,7 +365,8 @@ void DownloadManagerDelegateQt::OnDownloadUpdated(download::DownloadItem *downlo 0 /* downloadType (unused) */, download->GetLastReason(), adapterClient, - toQt(download->GetSuggestedFilename()) + toQt(download->GetSuggestedFilename()), + download->GetStartTime().ToTimeT() }; for (ProfileAdapterClient *client : qAsConst(clients)) { diff --git a/src/core/download_manager_delegate_qt.h b/src/core/download_manager_delegate_qt.h index 382c57524..6acfa42ce 100644 --- a/src/core/download_manager_delegate_qt.h +++ b/src/core/download_manager_delegate_qt.h @@ -109,6 +109,7 @@ private: bool m_nextDownloadIsUserRequested; friend class DownloadManagerDelegateInstance; + friend class ProfileAdapter; DISALLOW_COPY_AND_ASSIGN(DownloadManagerDelegateQt); }; diff --git a/src/core/profile_adapter.cpp b/src/core/profile_adapter.cpp index 8d32aad84..65d5c2da2 100644 --- a/src/core/profile_adapter.cpp +++ b/src/core/profile_adapter.cpp @@ -57,6 +57,8 @@ #include "web_engine_context.h" #include "web_contents_adapter_client.h" +#include "base/files/file_util.h" +#include "base/time/time_to_iso8601.h" #include "components/keyed_service/content/browser_context_dependency_manager.h" #if BUILDFLAG(ENABLE_EXTENSIONS) @@ -691,6 +693,34 @@ bool ProfileAdapter::isUsedForGlobalCertificateVerification() const return m_usedForGlobalCertificateVerification; } +QString ProfileAdapter::determineDownloadPath(const QString &downloadDirectory, const QString &suggestedFilename, const time_t &startTime) +{ + QFileInfo suggestedFile(QDir(downloadDirectory).absoluteFilePath(suggestedFilename)); + QString suggestedFilePath = suggestedFile.absoluteFilePath(); + base::FilePath tmpFilePath(toFilePath(suggestedFilePath).NormalizePathSeparatorsTo('/')); + + int uniquifier = base::GetUniquePathNumber(tmpFilePath, base::FilePath::StringType()); + if (uniquifier > 0) + suggestedFilePath = toQt(tmpFilePath.InsertBeforeExtensionASCII(base::StringPrintf(" (%d)", uniquifier)).AsUTF8Unsafe()); + else if (uniquifier == -1) { + base::Time::Exploded exploded; + base::Time::FromTimeT(startTime).LocalExplode(&exploded); + std::string suffix = base::StringPrintf( + " - %04d-%02d-%02dT%02d%02d%02d.%03d", exploded.year, exploded.month, + exploded.day_of_month, exploded.hour, exploded.minute, + exploded.second, exploded.millisecond); + suggestedFilePath = toQt(tmpFilePath.InsertBeforeExtensionASCII(suffix).AsUTF8Unsafe()); + } + return suggestedFilePath; +} + +QString ProfileAdapter::updateDownloadPath(int downloadId, const QString &directory, const QString &fileName) +{ + download::DownloadItem *download = m_downloadManagerDelegate->findDownloadById(downloadId); + Q_ASSERT(download); + return determineDownloadPath(directory, fileName, download->GetStartTime().ToTimeT()); +} + #if QT_CONFIG(ssl) QWebEngineClientCertificateStore *ProfileAdapter::clientCertificateStore() { diff --git a/src/core/profile_adapter.h b/src/core/profile_adapter.h index 1f94f59a9..8df85a68f 100644 --- a/src/core/profile_adapter.h +++ b/src/core/profile_adapter.h @@ -214,6 +214,9 @@ public: QHash<QByteArray, QSharedPointer<UserNotificationController>> &persistentNotifications() { return m_persistentNotifications; } + QString determineDownloadPath(const QString &downloadDirectory, const QString &suggestedFilename, const time_t &startTime); + QString updateDownloadPath(int downloadId, const QString &directory, const QString &filename); + private: void updateCustomUrlSchemeHandlers(); void resetVisitedLinksManager(); diff --git a/src/core/profile_adapter_client.h b/src/core/profile_adapter_client.h index 3589f6cd7..dc0f508a1 100644 --- a/src/core/profile_adapter_client.h +++ b/src/core/profile_adapter_client.h @@ -55,6 +55,7 @@ #include <QSharedPointer> #include <QString> #include <QUrl> +#include <time.h> namespace QtWebEngineCore { @@ -139,6 +140,7 @@ public: int downloadInterruptReason; WebContentsAdapterClient *page; QString suggestedFileName; + time_t startTime; }; virtual ~ProfileAdapterClient() { } |