| // Copyright (c) 2012 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 browser context 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 CONTENT_PUBLIC_BROWSER_DOWNLOAD_MANAGER_H_ |
| #define CONTENT_PUBLIC_BROWSER_DOWNLOAD_MANAGER_H_ |
| |
| #include <string> |
| #include <vector> |
| |
| #include "base/basictypes.h" |
| #include "base/callback.h" |
| #include "base/files/file_path.h" |
| #include "base/gtest_prod_util.h" |
| #include "base/sequenced_task_runner_helpers.h" |
| #include "base/time.h" |
| #include "content/public/browser/download_id.h" |
| #include "content/public/browser/download_interrupt_reasons.h" |
| #include "content/public/browser/download_item.h" |
| #include "net/base/net_errors.h" |
| #include "net/base/net_log.h" |
| |
| class GURL; |
| |
| namespace content { |
| |
| class BrowserContext; |
| class ByteStreamReader; |
| class DownloadManagerDelegate; |
| class DownloadQuery; |
| class DownloadRequestHandle; |
| class DownloadUrlParameters; |
| struct DownloadCreateInfo; |
| struct DownloadRetrieveInfo; |
| |
| // Browser's download manager: manages all downloads and destination view. |
| class CONTENT_EXPORT DownloadManager |
| : public base::RefCountedThreadSafe<DownloadManager> { |
| public: |
| // Sets/Gets the delegate for this DownloadManager. The delegate has to live |
| // past its Shutdown method being called (by the DownloadManager). |
| virtual void SetDelegate(DownloadManagerDelegate* delegate) = 0; |
| virtual DownloadManagerDelegate* GetDelegate() const = 0; |
| |
| // Shutdown the download manager. Content calls this when BrowserContext is |
| // being destructed. If the embedder needs this to be called earlier, it can |
| // call it. In that case, the delegate's Shutdown() method will only be called |
| // once. |
| virtual void Shutdown() = 0; |
| |
| // Interface to implement for observers that wish to be informed of changes |
| // to the DownloadManager's collection of downloads. |
| class CONTENT_EXPORT Observer { |
| public: |
| // A DownloadItem was created. This item may be visible before the filename |
| // is determined; in this case the return value of GetTargetFileName() will |
| // be null. This method may be called an arbitrary number of times, e.g. |
| // when loading history on startup. As a result, consumers should avoid |
| // doing large amounts of work in OnDownloadCreated(). TODO(<whoever>): |
| // When we've fully specified the possible states of the DownloadItem in |
| // download_item.h, we should remove the caveat above. |
| virtual void OnDownloadCreated( |
| DownloadManager* manager, DownloadItem* item) {} |
| |
| // A SavePackage has successfully finished. |
| virtual void OnSavePackageSuccessfullyFinished( |
| DownloadManager* manager, DownloadItem* item) {} |
| |
| // Called when the DownloadManager is being destroyed to prevent Observers |
| // from calling back to a stale pointer. |
| virtual void ManagerGoingDown(DownloadManager* manager) {} |
| |
| protected: |
| virtual ~Observer() {} |
| }; |
| |
| typedef std::vector<DownloadItem*> DownloadVector; |
| |
| // Add all download items to |downloads|, no matter the type or state, without |
| // clearing |downloads| first. |
| virtual void GetAllDownloads(DownloadVector* downloads) = 0; |
| |
| // Returns true if initialized properly. |
| virtual bool Init(BrowserContext* browser_context) = 0; |
| |
| // Called by a download source (Currently DownloadResourceHandler) |
| // to initiate the non-source portions of a download. |
| // Returns the id assigned to the download. If the DownloadCreateInfo |
| // specifies an id, that id will be used. |
| virtual DownloadItem* StartDownload( |
| scoped_ptr<DownloadCreateInfo> info, |
| scoped_ptr<ByteStreamReader> stream) = 0; |
| |
| // Offthread target for cancelling a particular download. Will be a no-op |
| // if the download has already been cancelled. |
| virtual void CancelDownload(int32 download_id) = 0; |
| |
| // 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. |
| virtual int RemoveDownloadsBetween(base::Time remove_begin, |
| base::Time remove_end) = 0; |
| |
| // 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. |
| virtual int RemoveDownloads(base::Time remove_begin) = 0; |
| |
| // Remove all downloads will delete all downloads. The number of downloads |
| // deleted is returned back to the caller. |
| virtual int RemoveAllDownloads() = 0; |
| |
| // See DownloadUrlParameters for details about controlling the download. |
| virtual void DownloadUrl(scoped_ptr<DownloadUrlParameters> parameters) = 0; |
| |
| // Allow objects to observe the download creation process. |
| virtual void AddObserver(Observer* observer) = 0; |
| |
| // Remove a download observer from ourself. |
| virtual void RemoveObserver(Observer* observer) = 0; |
| |
| // Called by the embedder, after creating the download manager, to let it know |
| // about downloads from previous runs of the browser. |
| virtual DownloadItem* CreateDownloadItem( |
| const base::FilePath& current_path, |
| const base::FilePath& target_path, |
| const std::vector<GURL>& url_chain, |
| const GURL& referrer_url, |
| const base::Time& start_time, |
| const base::Time& end_time, |
| int64 received_bytes, |
| int64 total_bytes, |
| DownloadItem::DownloadState state, |
| DownloadDangerType danger_type, |
| DownloadInterruptReason interrupt_reason, |
| bool opened) = 0; |
| |
| // The number of in progress (including paused) downloads. |
| // Performance note: this loops over all items. If profiling finds that this |
| // is too slow, use an AllDownloadItemNotifier to count in-progress items. |
| virtual int InProgressCount() const = 0; |
| |
| virtual BrowserContext* GetBrowserContext() const = 0; |
| |
| // 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. |
| virtual void CheckForHistoryFilesRemoval() = 0; |
| |
| // Get the download item for |id| if present, no matter what type of download |
| // it is or state it's in. |
| virtual DownloadItem* GetDownload(int id) = 0; |
| |
| protected: |
| virtual ~DownloadManager() {} |
| |
| private: |
| friend class base::RefCountedThreadSafe<DownloadManager>; |
| }; |
| |
| } // namespace content |
| |
| #endif // CONTENT_PUBLIC_BROWSER_DOWNLOAD_MANAGER_H_ |