| Index: chrome/browser/download/download_manager.h
|
| ===================================================================
|
| --- chrome/browser/download/download_manager.h (revision 2758)
|
| +++ chrome/browser/download/download_manager.h (working copy)
|
| @@ -80,6 +80,12 @@
|
| REMOVING
|
| };
|
|
|
| + enum SafetyState {
|
| + SAFE = 0,
|
| + DANGEROUS,
|
| + DANGEROUS_BUT_VALIDATED // Dangerous but the user confirmed the download.
|
| + };
|
| +
|
| // Interface that observers of a particular download must implement in order
|
| // to receive updates to the download's status.
|
| class Observer {
|
| @@ -94,10 +100,12 @@
|
| DownloadItem(int32 download_id,
|
| const std::wstring& path,
|
| const std::wstring& url,
|
| + const std::wstring& original_name,
|
| const Time start_time,
|
| int64 download_size,
|
| int render_process_id,
|
| - int request_id);
|
| + int request_id,
|
| + bool is_dangerous);
|
|
|
| ~DownloadItem();
|
|
|
| @@ -125,12 +133,12 @@
|
| // when resuming a download (assuming the server supports byte ranges).
|
| void Cancel(bool update_history);
|
|
|
| - // Download operation completed
|
| + // Download operation completed.
|
| void Finished(int64 size);
|
|
|
| - // The user wants to remove the download from the views and history. This
|
| - // operation does not delete the file on the disk.
|
| - void Remove();
|
| + // The user wants to remove the download from the views and history. If
|
| + // |delete_file| is true, the file is deleted on the disk.
|
| + void Remove(bool delete_file);
|
|
|
| // Start/stop sending periodic updates to our observers
|
| void StartProgressTimer();
|
| @@ -158,8 +166,10 @@
|
|
|
| // Accessors
|
| DownloadState state() const { return state_; }
|
| + std::wstring file_name() const { return file_name_; }
|
| + void set_file_name(const std::wstring& name) { file_name_ = name; }
|
| std::wstring full_path() const { return full_path_; }
|
| - std::wstring file_name() const { return file_name_; }
|
| + void set_full_path(const std::wstring& path) { full_path_ = path; }
|
| std::wstring url() const { return url_; }
|
| int64 total_bytes() const { return total_bytes_; }
|
| void set_total_bytes(int64 total_bytes) { total_bytes_ = total_bytes; }
|
| @@ -176,7 +186,17 @@
|
| void set_open_when_complete(bool open) { open_when_complete_ = open; }
|
| int render_process_id() const { return render_process_id_; }
|
| int request_id() const { return request_id_; }
|
| + SafetyState safety_state() const { return safety_state_; }
|
| + void set_safety_state(SafetyState safety_state) {
|
| + safety_state_ = safety_state;
|
| + }
|
| + std::wstring original_name() const { return original_name_; }
|
| + void set_original_name(const std::wstring& name) { original_name_ = name; }
|
|
|
| + // Returns the file-name that should be reported to the user, which is
|
| + // file_name_ for safe downloads and original_name_ for dangerous ones.
|
| + std::wstring GetFileName() const;
|
| +
|
| private:
|
| // Internal helper for maintaining consistent received and total sizes.
|
| void UpdateSize(int64 size);
|
| @@ -226,6 +246,14 @@
|
| // A flag for indicating if the download should be opened at completion.
|
| bool open_when_complete_;
|
|
|
| + // Whether the download is considered potentially safe or dangerous
|
| + // (executable files are typically considered dangerous).
|
| + SafetyState safety_state_;
|
| +
|
| + // Dangerous download are given temporary names until the user approves them.
|
| + // This stores their original name.
|
| + std::wstring original_name_;
|
| +
|
| // For canceling or pausing requests.
|
| int render_process_id_;
|
| int request_id_;
|
| @@ -354,6 +382,12 @@
|
| virtual void FileSelected(const std::wstring& path, void* params);
|
| virtual void FileSelectionCanceled(void* params);
|
|
|
| + // Deletes the specified path on the file thread.
|
| + void DeleteDownload(const std::wstring& path);
|
| +
|
| + // Called when the user has validated the donwload of a dangerous file.
|
| + void DangerousDownloadValidated(DownloadItem* download);
|
| +
|
| private:
|
| // Shutdown the download manager. This call is needed only after Init.
|
| void Shutdown();
|
| @@ -405,6 +439,32 @@
|
| int request_id,
|
| bool pause);
|
|
|
| + // Performs the last steps required when a download has been completed.
|
| + // It is necessary to break down the flow when a download is finished as
|
| + // dangerous downloads are downloaded to temporary files that need to be
|
| + // renamed on the file thread first.
|
| + // Invoked on the UI thread.
|
| + void ContinueDownloadFinished(DownloadItem* download);
|
| +
|
| + // Renames a finished dangerous download from its temporary file name to its
|
| + // real file name.
|
| + // Invoked on the file thread.
|
| + void ProceedWithFinishedDangerousDownload(int64 download_handle,
|
| + const std::wstring& path,
|
| + const std::wstring& original_name);
|
| +
|
| + // Invoked on the UI thread when a dangerous downloaded file has been renamed.
|
| + void DangerousDownloadRenamed(int64 download_handle,
|
| + bool success,
|
| + const std::wstring& new_path);
|
| +
|
| + // Checks whether a file represents a risk if downloaded.
|
| + bool IsDangerous(const std::wstring& file_name);
|
| +
|
| + // Changes the paths and file name of the specified |download|, propagating
|
| + // the change to the history system.
|
| + void RenameDownload(DownloadItem* download, const std::wstring& new_path);
|
| +
|
| // 'downloads_' is map of all downloads in this profile. The key is the handle
|
| // returned by the history system, which is unique across sessions. This map
|
| // owns all the DownloadItems once they have been created in the history
|
| @@ -415,6 +475,12 @@
|
| // ResourceDispatcherHost, which is unique for the current session. This map
|
| // does not own the DownloadItems.
|
| //
|
| + // 'dangerous_finished_' is a map of dangerous download that have finished
|
| + // but were not yet approved by the user. Similarly to in_progress_, the key
|
| + // is the ID assigned by the ResourceDispatcherHost and the map does not own
|
| + // the DownloadItems. It is used on shutdown to delete completed downloads
|
| + // that have not been approved.
|
| + //
|
| // When a download is created through a user action, the corresponding
|
| // DownloadItem* is placed in 'in_progress_' and remains there until it has
|
| // received a valid handle from the history system. Once it has a valid
|
| @@ -426,6 +492,7 @@
|
| typedef base::hash_map<int64, DownloadItem*> DownloadMap;
|
| DownloadMap downloads_;
|
| DownloadMap in_progress_;
|
| + DownloadMap dangerous_finished_;
|
|
|
| // True if the download manager has been initialized and requires a shutdown.
|
| bool shutdown_needed_;
|
|
|