| Index: chrome/browser/download/download_manager.h
|
| ===================================================================
|
| --- chrome/browser/download/download_manager.h (revision 96793)
|
| +++ chrome/browser/download/download_manager.h (working copy)
|
| @@ -1,418 +0,0 @@
|
| -// Copyright (c) 2011 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.
|
| -//
|
| -// 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:
|
| -// 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_DOWNLOAD_MANAGER_H_
|
| -#define CHROME_BROWSER_DOWNLOAD_DOWNLOAD_MANAGER_H_
|
| -#pragma once
|
| -
|
| -#include <map>
|
| -#include <set>
|
| -#include <string>
|
| -#include <vector>
|
| -
|
| -#include "base/basictypes.h"
|
| -#include "base/file_path.h"
|
| -#include "base/gtest_prod_util.h"
|
| -#include "base/hash_tables.h"
|
| -#include "base/memory/ref_counted.h"
|
| -#include "base/memory/scoped_ptr.h"
|
| -#include "base/memory/weak_ptr.h"
|
| -#include "base/observer_list.h"
|
| -#include "base/time.h"
|
| -#include "chrome/browser/download/download_item.h"
|
| -#include "chrome/browser/download/download_request_handle.h"
|
| -#include "chrome/browser/download/download_status_updater_delegate.h"
|
| -#include "content/browser/browser_thread.h"
|
| -
|
| -class DownloadFileManager;
|
| -class DownloadHistory;
|
| -class DownloadManagerDelegate;
|
| -class DownloadPrefs;
|
| -class DownloadStatusUpdater;
|
| -class GURL;
|
| -class Profile;
|
| -class ResourceDispatcherHost;
|
| -class TabContents;
|
| -struct DownloadCreateInfo;
|
| -struct DownloadHistoryInfo;
|
| -struct DownloadSaveInfo;
|
| -
|
| -// Browser's download manager: manages all downloads and destination view.
|
| -class DownloadManager
|
| - : public base::RefCountedThreadSafe<DownloadManager,
|
| - BrowserThread::DeleteOnUIThread>,
|
| - public DownloadStatusUpdaterDelegate {
|
| - public:
|
| - DownloadManager(DownloadManagerDelegate* delegate,
|
| - DownloadStatusUpdater* status_updater);
|
| -
|
| - // Shutdown the download manager. Must be called before destruction.
|
| - void Shutdown();
|
| -
|
| - // 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;
|
| -
|
| - // Called when the DownloadManager is being destroyed to prevent Observers
|
| - // from calling back to a stale pointer.
|
| - virtual void ManagerGoingDown() {}
|
| -
|
| - // Called immediately after the DownloadManager puts up a select file
|
| - // dialog.
|
| - // |id| indicates which download opened the dialog.
|
| - virtual void SelectFileDialogDisplayed(int32 id) {}
|
| -
|
| - protected:
|
| - virtual ~Observer() {}
|
| - };
|
| -
|
| - typedef std::vector<DownloadItem*> DownloadVector;
|
| -
|
| - // Return all temporary downloads that reside in the specified directory.
|
| - void GetTemporaryDownloads(const FilePath& dir_path, DownloadVector* result);
|
| -
|
| - // Return all non-temporary downloads in the specified directory that are
|
| - // are in progress or have completed.
|
| - void GetAllDownloads(const FilePath& dir_path, DownloadVector* result);
|
| -
|
| - // Return all non-temporary downloads in the specified directory that are
|
| - // in-progress (including dangerous downloads waiting for user confirmation).
|
| - void GetCurrentDownloads(const FilePath& dir_path, DownloadVector* result);
|
| -
|
| - // Returns all non-temporary downloads matching |query|. Empty query matches
|
| - // everything.
|
| - void SearchDownloads(const string16& query, DownloadVector* result);
|
| -
|
| - // Returns true if initialized properly.
|
| - bool Init(Profile* profile);
|
| -
|
| - // Notifications sent from the download thread to the UI thread
|
| - void StartDownload(int32 id);
|
| - void UpdateDownload(int32 download_id, int64 size);
|
| - // |hash| is sha256 hash for the downloaded file. It is empty when the hash
|
| - // is not available.
|
| - void OnResponseCompleted(int32 download_id, int64 size, int os_error,
|
| - const std::string& hash);
|
| -
|
| - // Called from a view when a user clicks a UI button or link.
|
| - void DownloadCancelled(int32 download_id);
|
| - void RemoveDownload(int64 download_handle);
|
| -
|
| - // Determine if the download is ready for completion, i.e. has had
|
| - // all data saved, and completed the filename determination and
|
| - // history insertion.
|
| - bool IsDownloadReadyForCompletion(DownloadItem* download);
|
| -
|
| - // If all pre-requisites have been met, complete download processing, i.e.
|
| - // do internal cleanup, file rename, and potentially auto-open.
|
| - // (Dangerous downloads still may block on user acceptance after this
|
| - // point.)
|
| - void MaybeCompleteDownload(DownloadItem* download);
|
| -
|
| - // Called when the download is renamed to its final name.
|
| - // |uniquifier| is a number used to make unique names for the file. It is
|
| - // only valid for the DANGEROUS_BUT_VALIDATED state of the download item.
|
| - void OnDownloadRenamedToFinalName(int download_id,
|
| - const FilePath& full_path,
|
| - int uniquifier);
|
| -
|
| - // 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 base::Time remove_begin,
|
| - const base::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 base::Time remove_begin);
|
| -
|
| - // Remove all downloads will delete all downloads. The number of downloads
|
| - // deleted is returned back to the caller.
|
| - int RemoveAllDownloads();
|
| -
|
| - // Final download manager transition for download: Update the download
|
| - // history and remove the download from |active_downloads_|.
|
| - void DownloadCompleted(int32 download_id);
|
| -
|
| - // Download the object at the URL. Used in cases such as "Save Link As..."
|
| - void DownloadUrl(const GURL& url,
|
| - const GURL& referrer,
|
| - const std::string& referrer_encoding,
|
| - TabContents* tab_contents);
|
| -
|
| - // Download the object at the URL and save it to the specified path. The
|
| - // download is treated as the temporary download and thus will not appear
|
| - // in the download history. Used in cases such as drag and drop.
|
| - void DownloadUrlToFile(const GURL& url,
|
| - const GURL& referrer,
|
| - const std::string& referrer_encoding,
|
| - const DownloadSaveInfo& save_info,
|
| - TabContents* tab_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<DownloadHistoryInfo>* entries);
|
| - void OnCreateDownloadEntryComplete(int32 download_id, int64 db_handle);
|
| -
|
| - // Display a new download in the appropriate browser UI.
|
| - void ShowDownloadInBrowser(DownloadItem* download);
|
| -
|
| - // The number of in progress (including paused) downloads.
|
| - int in_progress_count() const {
|
| - return static_cast<int>(in_progress_.size());
|
| - }
|
| -
|
| - Profile* profile() { return profile_; }
|
| -
|
| - DownloadHistory* download_history() { return download_history_.get(); }
|
| -
|
| - DownloadPrefs* download_prefs() { return download_prefs_.get(); }
|
| -
|
| - FilePath last_download_path() { return last_download_path_; }
|
| -
|
| - // Creates the download item. Must be called on the UI thread.
|
| - void CreateDownloadItem(DownloadCreateInfo* info);
|
| -
|
| - // Clears the last download path, used to initialize "save as" dialogs.
|
| - void ClearLastDownloadPath();
|
| -
|
| - // Overridden from DownloadStatusUpdaterDelegate:
|
| - virtual bool IsDownloadProgressKnown();
|
| - virtual int64 GetInProgressDownloadCount();
|
| - virtual int64 GetReceivedDownloadBytes();
|
| - virtual int64 GetTotalDownloadBytes();
|
| -
|
| - // Called by the delegate after the save as dialog is closed.
|
| - void FileSelected(const FilePath& path, void* params);
|
| - void FileSelectionCanceled(void* params);
|
| -
|
| - // Called by the delegate if it delayed the download in
|
| - // DownloadManagerDelegate::ShouldStartDownload and now is ready.
|
| - void RestartDownload(int32 download_id);
|
| -
|
| - // Checks whether downloaded files still exist. Updates state of downloads
|
| - // that refer to removed files. The check runs in the background and may
|
| - // finish asynchronously after this method returns.
|
| - void CheckForHistoryFilesRemoval();
|
| -
|
| - // Checks whether a downloaded file still exists and updates the file's state
|
| - // if the file is already removed. The check runs in the background and may
|
| - // finish asynchronously after this method returns.
|
| - void CheckForFileRemoval(DownloadItem* download_item);
|
| -
|
| - // Assert the named download item is on the correct queues
|
| - // in the DownloadManager. For debugging.
|
| - void AssertQueueStateConsistent(DownloadItem* download);
|
| -
|
| - // Get the download item from the history map. Useful after the item has
|
| - // been removed from the active map, or was retrieved from the history DB.
|
| - DownloadItem* GetDownloadItem(int id);
|
| -
|
| - // Called when Save Page download starts. Transfers ownership of |download|
|
| - // to the DownloadManager.
|
| - void SavePageDownloadStarted(DownloadItem* download);
|
| -
|
| - // Callback when Save Page As entry is commited to the history system.
|
| - void OnSavePageDownloadEntryAdded(int32 download_id, int64 db_handle);
|
| -
|
| - // Called when Save Page download is done.
|
| - void SavePageDownloadFinished(DownloadItem* download);
|
| -
|
| - // Download Id for next Save Page.
|
| - int32 GetNextSavePageId();
|
| -
|
| - // Get the download item from the active map. Useful when the item is not
|
| - // yet in the history map.
|
| - DownloadItem* GetActiveDownloadItem(int id);
|
| -
|
| - DownloadManagerDelegate* delegate() const { return delegate_; }
|
| -
|
| - private:
|
| - typedef std::set<DownloadItem*> DownloadSet;
|
| - typedef base::hash_map<int64, DownloadItem*> DownloadMap;
|
| -
|
| - // For testing.
|
| - friend class DownloadManagerTest;
|
| - friend class MockDownloadManager;
|
| -
|
| - // This class is used to let an incognito DownloadManager observe changes to
|
| - // a normal DownloadManager, to propagate ModelChanged() calls from the parent
|
| - // DownloadManager to the observers of the incognito DownloadManager.
|
| - class OtherDownloadManagerObserver : public Observer {
|
| - public:
|
| - explicit OtherDownloadManagerObserver(
|
| - DownloadManager* observing_download_manager);
|
| - virtual ~OtherDownloadManagerObserver();
|
| -
|
| - // Observer interface.
|
| - virtual void ModelChanged();
|
| - virtual void ManagerGoingDown();
|
| -
|
| - private:
|
| - // The incognito download manager.
|
| - DownloadManager* observing_download_manager_;
|
| -
|
| - // The original profile's download manager.
|
| - DownloadManager* observed_download_manager_;
|
| - };
|
| -
|
| - friend struct BrowserThread::DeleteOnThread<BrowserThread::UI>;
|
| - friend class DeleteTask<DownloadManager>;
|
| - friend class OtherDownloadManagerObserver;
|
| -
|
| - virtual ~DownloadManager();
|
| -
|
| - // Called on the FILE thread to check the existence of a downloaded file.
|
| - void CheckForFileRemovalOnFileThread(int64 db_handle, const FilePath& path);
|
| -
|
| - // Called on the UI thread if the FILE thread detects the removal of
|
| - // the downloaded file. The UI thread updates the state of the file
|
| - // and then notifies this update to the file's observer.
|
| - void OnFileRemovalDetected(int64 db_handle);
|
| -
|
| - // 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 ContinueDownloadWithPath(DownloadItem* download,
|
| - const FilePath& chosen_file);
|
| -
|
| - // Download cancel helper function.
|
| - void DownloadCancelledInternal(int download_id,
|
| - const DownloadRequestHandle& request_handle);
|
| -
|
| - // All data has been downloaded.
|
| - // |hash| is sha256 hash for the downloaded file. It is empty when the hash
|
| - // is not available.
|
| - void OnAllDataSaved(int32 download_id, int64 size, const std::string& hash);
|
| -
|
| - // An error occurred in the download.
|
| - void OnDownloadError(int32 download_id, int64 size, int os_error);
|
| -
|
| - // Updates the app icon about the overall download progress.
|
| - void UpdateAppIcon();
|
| -
|
| - // Inform observers that the model has changed.
|
| - void NotifyModelChanged();
|
| -
|
| - // Debugging routine to confirm relationship between below
|
| - // containers; no-op if NDEBUG.
|
| - void AssertContainersConsistent() const;
|
| -
|
| - // Add a DownloadItem to history_downloads_.
|
| - void AddDownloadItemToHistory(DownloadItem* item, int64 db_handle);
|
| -
|
| - // Remove from internal maps.
|
| - int RemoveDownloadItems(const DownloadVector& pending_deletes);
|
| -
|
| - // |downloads_| is the owning set for all downloads known to the
|
| - // DownloadManager. This includes downloads started by the user in
|
| - // this session, downloads initialized from the history system, and
|
| - // "save page as" downloads. All other DownloadItem containers in
|
| - // the DownloadManager are maps; they do not own the DownloadItems.
|
| - // Note that this is the only place (with any functional implications;
|
| - // see save_page_as_downloads_ below) that "save page as" downloads are
|
| - // kept, as the DownloadManager's only job is to hold onto those
|
| - // until destruction.
|
| - //
|
| - // |history_downloads_| is map of all downloads in this profile. The key
|
| - // is the handle returned by the history system, which is unique
|
| - // across sessions.
|
| - //
|
| - // |active_downloads_| is a map of all downloads that are currently being
|
| - // processed. The key is the ID assigned by the ResourceDispatcherHost,
|
| - // which is unique for the current session.
|
| - //
|
| - // |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.
|
| - //
|
| - // |save_page_as_downloads_| (if defined) is a collection of all the
|
| - // downloads the "save page as" system has given to us to hold onto
|
| - // until we are destroyed. It is only used for debugging.
|
| - //
|
| - // When a download is created through a user action, the corresponding
|
| - // DownloadItem* is placed in |active_downloads_| and remains there until the
|
| - // download is in a terminal state (COMPLETE or CANCELLED). It is also
|
| - // 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 |history_downloads_| map. When the
|
| - // download reaches a terminal state, it is removed from |in_progress_|.
|
| - // Downloads from past sessions read from a persisted state from the
|
| - // history system are placed directly into |history_downloads_| since
|
| - // they have valid handles in the history system.
|
| -
|
| - DownloadSet downloads_;
|
| - DownloadMap history_downloads_;
|
| - DownloadMap in_progress_;
|
| - DownloadMap active_downloads_;
|
| - DownloadMap save_page_downloads_;
|
| -
|
| - // 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_ptr<DownloadHistory> download_history_;
|
| -
|
| - scoped_ptr<DownloadPrefs> download_prefs_;
|
| -
|
| - // Non-owning pointer for handling file writing on the download_thread_.
|
| - DownloadFileManager* file_manager_;
|
| -
|
| - // Non-owning pointer for updating the download status.
|
| - base::WeakPtr<DownloadStatusUpdater> status_updater_;
|
| -
|
| - // 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.
|
| - FilePath last_download_path_;
|
| -
|
| - // Download Id for next Save Page.
|
| - int32 next_save_page_id_;
|
| -
|
| - scoped_ptr<OtherDownloadManagerObserver> other_download_manager_observer_;
|
| -
|
| - // Allows an embedder to control behavior. Guaranteed to outlive this object.
|
| - DownloadManagerDelegate* delegate_;
|
| -
|
| - DISALLOW_COPY_AND_ASSIGN(DownloadManager);
|
| -};
|
| -
|
| -#endif // CHROME_BROWSER_DOWNLOAD_DOWNLOAD_MANAGER_H_
|
|
|