| Index: chrome/browser/download_manager.h
|
| ===================================================================
|
| --- chrome/browser/download_manager.h (revision 2162)
|
| +++ chrome/browser/download_manager.h (working copy)
|
| @@ -1,483 +0,0 @@
|
| -// Copyright (c) 2006-2008 The Chromium Authors. All rights reserved.
|
| -// Use of this source code is governed by a BSD-style license that can be
|
| -// found in the LICENSE file.
|
| -//
|
| -// The DownloadManager object manages the process of downloading, including
|
| -// updates to the history system and providing the information for displaying
|
| -// the downloads view in the Destinations tab. There is one DownloadManager per
|
| -// active profile in Chrome.
|
| -//
|
| -// Each download is represented by a DownloadItem, and all DownloadItems
|
| -// are owned by the DownloadManager which maintains a global list of all
|
| -// downloads. DownloadItems are created when a user initiates a download,
|
| -// and exist for the duration of the browser life time.
|
| -//
|
| -// Download observers:
|
| -// Objects that are interested in notifications about new downloads, or progress
|
| -// updates for a given download must implement one of the download observer
|
| -// interfaces:
|
| -// DownloadItem::Observer:
|
| -// - allows observers to receive notifications about one download from start
|
| -// to completion
|
| -// DownloadManager::Observer:
|
| -// - allows observers, primarily views, to be notified when changes to the
|
| -// set of all downloads (such as new downloads, or deletes) occur
|
| -// Use AddObserver() / RemoveObserver() on the appropriate download object to
|
| -// receive state updates.
|
| -//
|
| -// Download state persistence:
|
| -// The DownloadManager uses the history service for storing persistent
|
| -// information about the state of all downloads. The history system maintains a
|
| -// separate table for this called 'downloads'. At the point that the
|
| -// DownloadManager is constructed, we query the history service for the state of
|
| -// all persisted downloads.
|
| -
|
| -#ifndef CHROME_BROWSER_DOWNLOAD_MANAGER_H__
|
| -#define CHROME_BROWSER_DOWNLOAD_MANAGER_H__
|
| -
|
| -#include <string>
|
| -#include <map>
|
| -#include <set>
|
| -#include <vector>
|
| -
|
| -#include "base/basictypes.h"
|
| -#include "base/hash_tables.h"
|
| -#include "base/observer_list.h"
|
| -#include "base/ref_counted.h"
|
| -#include "chrome/browser/cancelable_request.h"
|
| -#include "chrome/browser/history/download_types.h"
|
| -#include "chrome/browser/history/history.h"
|
| -#include "chrome/browser/shell_dialogs.h"
|
| -#include "chrome/common/pref_member.h"
|
| -
|
| -class DownloadFileManager;
|
| -class DownloadItem;
|
| -class DownloadItemView;
|
| -class DownloadManager;
|
| -class GURL;
|
| -class MessageLoop;
|
| -class PrefService;
|
| -class Profile;
|
| -class ResourceDispatcherHost;
|
| -class URLRequestContext;
|
| -class WebContents;
|
| -
|
| -namespace base {
|
| -class Thread;
|
| -}
|
| -
|
| -// DownloadItem ----------------------------------------------------------------
|
| -
|
| -// One DownloadItem per download. This is the model class that stores all the
|
| -// state for a download. Multiple views, such as a tab's download shelf and the
|
| -// Destination tab's download view, may refer to a given DownloadItem.
|
| -class DownloadItem {
|
| - public:
|
| - enum DownloadState {
|
| - IN_PROGRESS,
|
| - COMPLETE,
|
| - CANCELLED,
|
| - REMOVING
|
| - };
|
| -
|
| - // Interface that observers of a particular download must implement in order
|
| - // to receive updates to the download's status.
|
| - class Observer {
|
| - public:
|
| - virtual void OnDownloadUpdated(DownloadItem* download) = 0;
|
| - };
|
| -
|
| - // Constructing from persistent store:
|
| - DownloadItem(const DownloadCreateInfo& info);
|
| -
|
| - // Constructing from user action:
|
| - DownloadItem(int32 download_id,
|
| - const std::wstring& path,
|
| - const std::wstring& url,
|
| - const Time start_time,
|
| - int64 download_size,
|
| - int render_process_id,
|
| - int request_id);
|
| -
|
| - ~DownloadItem();
|
| -
|
| - void Init(bool start_timer);
|
| -
|
| - // Public API
|
| -
|
| - void AddObserver(Observer* observer);
|
| - void RemoveObserver(Observer* observer);
|
| -
|
| - // Notify our observers periodically
|
| - void UpdateObservers();
|
| -
|
| - // Received a new chunk of data
|
| - void Update(int64 bytes_so_far);
|
| -
|
| - // Cancel the download operation. We need to distinguish between cancels at
|
| - // exit (DownloadManager destructor) from user interface initiated cancels
|
| - // because at exit, the history system may not exist, and any updates to it
|
| - // require AddRef'ing the DownloadManager in the destructor which results in
|
| - // a DCHECK failure. Set 'update_history' to false when canceling from at
|
| - // exit to prevent this crash. This may result in a difference between the
|
| - // downloaded file's size on disk, and what the history system's last record
|
| - // of it is. At worst, we'll end up re-downloading a small portion of the file
|
| - // when resuming a download (assuming the server supports byte ranges).
|
| - void Cancel(bool update_history);
|
| -
|
| - // 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();
|
| -
|
| - // Start/stop sending periodic updates to our observers
|
| - void StartProgressTimer();
|
| - void StopProgressTimer();
|
| -
|
| - // Simple calculation of the amount of time remaining to completion. Fills
|
| - // |*remaining| with the amount of time remaining if successful. Fails and
|
| - // returns false if we do not have the number of bytes or the speed so can
|
| - // not estimate.
|
| - bool TimeRemaining(TimeDelta* remaining) const;
|
| -
|
| - // Simple speed estimate in bytes/s
|
| - int64 CurrentSpeed() const;
|
| -
|
| - // Rough percent complete, -1 means we don't know (since we didn't receive a
|
| - // total size).
|
| - int PercentComplete() const;
|
| -
|
| - // Update the download's path, the actual file is renamed on the download
|
| - // thread.
|
| - void Rename(const std::wstring& full_path);
|
| -
|
| - // Allow the user to temporarily pause a download or resume a paused download.
|
| - void TogglePause();
|
| -
|
| - // Accessors
|
| - DownloadState state() const { return state_; }
|
| - std::wstring full_path() const { return full_path_; }
|
| - std::wstring file_name() const { return file_name_; }
|
| - std::wstring url() const { return url_; }
|
| - int64 total_bytes() const { return total_bytes_; }
|
| - void set_total_bytes(int64 total_bytes) { total_bytes_ = total_bytes; }
|
| - int64 received_bytes() const { return received_bytes_; }
|
| - int32 id() const { return id_; }
|
| - Time start_time() const { return start_time_; }
|
| - void set_db_handle(int64 handle) { db_handle_ = handle; }
|
| - int64 db_handle() const { return db_handle_; }
|
| - DownloadManager* manager() const { return manager_; }
|
| - void set_manager(DownloadManager* manager) { manager_ = manager; }
|
| - bool is_paused() const { return is_paused_; }
|
| - void set_is_paused(bool pause) { is_paused_ = pause; }
|
| - bool open_when_complete() const { return open_when_complete_; }
|
| - 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_; }
|
| -
|
| - private:
|
| - // Internal helper for maintaining consistent received and total sizes.
|
| - void UpdateSize(int64 size);
|
| -
|
| - // Request ID assigned by the ResourceDispatcherHost.
|
| - int32 id_;
|
| -
|
| - // Full path to the downloaded file
|
| - std::wstring full_path_;
|
| -
|
| - // Short display version of the file
|
| - std::wstring file_name_;
|
| -
|
| - // The URL from whence we came, for display
|
| - std::wstring url_;
|
| -
|
| - // Total bytes expected
|
| - int64 total_bytes_;
|
| -
|
| - // Current received bytes
|
| - int64 received_bytes_;
|
| -
|
| - // Start time for calculating remaining time
|
| - uintptr_t start_tick_;
|
| -
|
| - // The current state of this download
|
| - DownloadState state_;
|
| -
|
| - // The views of this item in the download shelf and download tab
|
| - ObserverList<Observer> observers_;
|
| -
|
| - // Time the download was started
|
| - Time start_time_;
|
| -
|
| - // Our persistent store handle
|
| - int64 db_handle_;
|
| -
|
| - // Timer for regularly updating our observers
|
| - base::RepeatingTimer<DownloadItem> update_timer_;
|
| -
|
| - // Our owning object
|
| - DownloadManager* manager_;
|
| -
|
| - // In progress downloads may be paused by the user, we note it here
|
| - bool is_paused_;
|
| -
|
| - // A flag for indicating if the download should be opened at completion.
|
| - bool open_when_complete_;
|
| -
|
| - // For canceling or pausing requests.
|
| - int render_process_id_;
|
| - int request_id_;
|
| -
|
| - DISALLOW_EVIL_CONSTRUCTORS(DownloadItem);
|
| -};
|
| -
|
| -
|
| -// DownloadManager -------------------------------------------------------------
|
| -
|
| -// Browser's download manager: manages all downloads and destination view.
|
| -class DownloadManager : public base::RefCountedThreadSafe<DownloadManager>,
|
| - public SelectFileDialog::Listener {
|
| - // For testing.
|
| - friend class DownloadManagerTest;
|
| -
|
| - public:
|
| - DownloadManager();
|
| - ~DownloadManager();
|
| -
|
| - static void RegisterUserPrefs(PrefService* prefs);
|
| -
|
| - // Interface to implement for observers that wish to be informed of changes
|
| - // to the DownloadManager's collection of downloads.
|
| - class Observer {
|
| - public:
|
| - // New or deleted download, observers should query us for the current set
|
| - // of downloads.
|
| - virtual void ModelChanged() = 0;
|
| -
|
| - // A callback once the DownloadManager has retrieved the requested set of
|
| - // downloads. The DownloadManagerObserver must copy the vector, but does not
|
| - // own the individual DownloadItems, when this call is made.
|
| - virtual void SetDownloads(std::vector<DownloadItem*>& downloads) = 0;
|
| - };
|
| -
|
| - // Public API
|
| -
|
| - // Begin a search for all downloads matching 'search_text'. If 'search_text'
|
| - // is empty, return all known downloads. The results are returned in the
|
| - // 'SetDownloads' observer callback.
|
| - void GetDownloads(Observer* observer,
|
| - const std::wstring& search_text);
|
| -
|
| - // Returns true if initialized properly.
|
| - bool Init(Profile* profile);
|
| -
|
| - // Schedule a query of the history service to retrieve all downloads.
|
| - void QueryHistoryForDownloads();
|
| -
|
| - // Notifications sent from the download thread to the UI thread
|
| - void StartDownload(DownloadCreateInfo* info);
|
| - void UpdateDownload(int32 download_id, int64 size);
|
| - void DownloadFinished(int32 download_id, int64 size);
|
| -
|
| - // Helper method for cancelling the network request associated with a
|
| - // download.
|
| - static void CancelDownloadRequest(int render_process_id, int request_id);
|
| -
|
| - // Called from a view when a user clicks a UI button or link.
|
| - void DownloadCancelled(int32 download_id);
|
| - void PauseDownload(int32 download_id, bool pause);
|
| - void RemoveDownload(int64 download_handle);
|
| -
|
| - // Remove downloads after remove_begin (inclusive) and before remove_end
|
| - // (exclusive). You may pass in null Time values to do an unbounded delete
|
| - // in either direction.
|
| - int RemoveDownloadsBetween(const Time remove_begin, const Time remove_end);
|
| -
|
| - // Remove downloads will delete all downloads that have a timestamp that is
|
| - // the same or more recent than |remove_begin|. The number of downloads
|
| - // deleted is returned back to the caller.
|
| - int RemoveDownloads(const Time remove_begin);
|
| -
|
| - // Download the object at the URL. Used in cases such as "Save Link As..."
|
| - void DownloadUrl(const GURL& url,
|
| - const GURL& referrer,
|
| - WebContents* web_contents);
|
| -
|
| - // Allow objects to observe the download creation process.
|
| - void AddObserver(Observer* observer);
|
| -
|
| - // Remove a download observer from ourself.
|
| - void RemoveObserver(Observer* observer);
|
| -
|
| - // Methods called on completion of a query sent to the history system.
|
| - void OnQueryDownloadEntriesComplete(
|
| - std::vector<DownloadCreateInfo>* entries);
|
| - void OnCreateDownloadEntryComplete(DownloadCreateInfo info, int64 db_handle);
|
| - void OnSearchComplete(HistoryService::Handle handle,
|
| - std::vector<int64>* results);
|
| -
|
| - // Show or Open a download via the Windows shell.
|
| - void ShowDownloadInShell(const DownloadItem* download);
|
| - void OpenDownloadInShell(const DownloadItem* download, HWND parent_window);
|
| -
|
| - // The number of in progress (including paused) downloads.
|
| - int in_progress_count() const {
|
| - return static_cast<int>(in_progress_.size());
|
| - }
|
| -
|
| - std::wstring download_path() { return *download_path_; }
|
| -
|
| - // Registers this file extension for automatic opening upon download
|
| - // completion if 'open' is true, or prevents the extension from automatic
|
| - // opening if 'open' is false.
|
| - void OpenFilesOfExtension(const std::wstring& extension, bool open);
|
| -
|
| - // Tests if a file type should be opened automatically.
|
| - bool ShouldOpenFileExtension(const std::wstring& extension);
|
| -
|
| - // Tests if we think the server means for this mime_type to be executable.
|
| - static bool IsExecutableMimeType(const std::string& mime_type);
|
| -
|
| - // Tests if a file type is considered executable.
|
| - bool IsExecutable(const std::wstring& extension);
|
| -
|
| - // Resets the automatic open preference.
|
| - void ResetAutoOpenFiles();
|
| -
|
| - // Returns true if there are automatic handlers registered for any file
|
| - // types.
|
| - bool HasAutoOpenFileTypesRegistered() const;
|
| -
|
| - // Overridden from SelectFileDialog::Listener:
|
| - virtual void FileSelected(const std::wstring& path, void* params);
|
| - virtual void FileSelectionCanceled(void* params);
|
| -
|
| - private:
|
| - // Shutdown the download manager. This call is needed only after Init.
|
| - void Shutdown();
|
| -
|
| - // Called on the download thread to check whether the suggested file path
|
| - // exists. We don't check if the file exists on the UI thread to avoid UI
|
| - // stalls from interacting with the file system.
|
| - void CheckIfSuggestedPathExists(DownloadCreateInfo* info);
|
| -
|
| - // Called on the UI thread once the DownloadManager has determined whether the
|
| - // suggested file path exists.
|
| - void OnPathExistenceAvailable(DownloadCreateInfo* info);
|
| -
|
| - // Called back after a target path for the file to be downloaded to has been
|
| - // determined, either automatically based on the suggested file name, or by
|
| - // the user in a Save As dialog box.
|
| - void ContinueStartDownload(DownloadCreateInfo* info,
|
| - const std::wstring& target_path);
|
| -
|
| - // Update the history service for a particular download.
|
| - void UpdateHistoryForDownload(DownloadItem* download);
|
| - void RemoveDownloadFromHistory(DownloadItem* download);
|
| - void RemoveDownloadsFromHistoryBetween(const Time remove_begin,
|
| - const Time remove_before);
|
| -
|
| - // Inform the notification service of download starts and stops.
|
| - void NotifyAboutDownloadStart();
|
| - void NotifyAboutDownloadStop();
|
| -
|
| - // Create an extension based on the file name and mime type.
|
| - void GenerateExtension(const std::wstring& file_name,
|
| - const std::string& mime_type,
|
| - std::wstring* generated_extension);
|
| -
|
| - // Create a file name based on the response from the server.
|
| - void GenerateFilename(DownloadCreateInfo* info, std::wstring* generated_name);
|
| -
|
| - // Persist the automatic opening preference.
|
| - void SaveAutoOpens();
|
| -
|
| - // Runs the network cancel on the IO thread.
|
| - static void OnCancelDownloadRequest(ResourceDispatcherHost* rdh,
|
| - int render_process_id,
|
| - int request_id);
|
| -
|
| - // Runs the pause on the IO thread.
|
| - static void OnPauseDownloadRequest(ResourceDispatcherHost* rdh,
|
| - int render_process_id,
|
| - int request_id,
|
| - bool pause);
|
| -
|
| - // '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
|
| - // system.
|
| - //
|
| - // 'in_progress_' is a map of all downloads that are in progress and that have
|
| - // not yet received a valid history handle. The key is the ID assigned by the
|
| - // ResourceDispatcherHost, which is unique for the current session. This map
|
| - // does not own the DownloadItems.
|
| - //
|
| - // 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
|
| - // handle, the DownloadItem* is placed in the 'downloads_' map. When the
|
| - // download is complete, it is removed from 'in_progress_'. Downloads from
|
| - // past sessions read from a persisted state from the history system are
|
| - // placed directly into 'downloads_' since they have valid handles in the
|
| - // history system.
|
| - typedef base::hash_map<int64, DownloadItem*> DownloadMap;
|
| - DownloadMap downloads_;
|
| - DownloadMap in_progress_;
|
| -
|
| - // True if the download manager has been initialized and requires a shutdown.
|
| - bool shutdown_needed_;
|
| -
|
| - // Observers that want to be notified of changes to the set of downloads.
|
| - ObserverList<Observer> observers_;
|
| -
|
| - // The current active profile.
|
| - Profile* profile_;
|
| - scoped_refptr<URLRequestContext> request_context_;
|
| -
|
| - // Used for history service request management.
|
| - CancelableRequestConsumerT<Observer*, 0> cancelable_consumer_;
|
| -
|
| - // Non-owning pointer for handling file writing on the download_thread_.
|
| - DownloadFileManager* file_manager_;
|
| -
|
| - // A pointer to the main UI loop.
|
| - MessageLoop* ui_loop_;
|
| -
|
| - // A pointer to the file thread's loop. The file thread lives longer than
|
| - // the DownloadManager, so this is safe to cache.
|
| - MessageLoop* file_loop_;
|
| -
|
| - // User preferences
|
| - BooleanPrefMember prompt_for_download_;
|
| - StringPrefMember download_path_;
|
| -
|
| - // The user's last choice for download directory. This is only used when the
|
| - // user wants us to prompt for a save location for each download.
|
| - std::wstring last_download_path_;
|
| -
|
| - // Set of file extensions to open at download completion.
|
| - std::set<std::wstring> auto_open_;
|
| -
|
| - // Set of file extensions that are executables and shouldn't be auto opened.
|
| - std::set<std::wstring> exe_types_;
|
| -
|
| - // Keep track of downloads that are completed before the user selects the
|
| - // destination, so that observers are appropriately notified of completion
|
| - // after this determination is made.
|
| - // The map is of download_id->remaining size (bytes), both of which are
|
| - // required when calling DownloadFinished.
|
| - typedef std::map<int32, int64> PendingFinishedMap;
|
| - PendingFinishedMap pending_finished_downloads_;
|
| -
|
| - // The "Save As" dialog box used to ask the user where a file should be
|
| - // saved.
|
| - scoped_refptr<SelectFileDialog> select_file_dialog_;
|
| -
|
| - DISALLOW_EVIL_CONSTRUCTORS(DownloadManager);
|
| -};
|
| -
|
| -
|
| -#endif // CHROME_BROWSER_DOWNLOAD_MANAGER_H__
|
|
|