1ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// Copyright (c) 2011 The Chromium Authors. All rights reserved.
2c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Use of this source code is governed by a BSD-style license that can be
3c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// found in the LICENSE file.
4c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//
5c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// The DownloadManager object manages the process of downloading, including
6c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// updates to the history system and providing the information for displaying
7c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// the downloads view in the Destinations tab. There is one DownloadManager per
8c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// active profile in Chrome.
9c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//
10c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Download observers:
11c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Objects that are interested in notifications about new downloads, or progress
12c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// updates for a given download must implement one of the download observer
13c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// interfaces:
14c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//   DownloadManager::Observer:
15c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//     - allows observers, primarily views, to be notified when changes to the
16c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//       set of all downloads (such as new downloads, or deletes) occur
17c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Use AddObserver() / RemoveObserver() on the appropriate download object to
18c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// receive state updates.
19c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//
20c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Download state persistence:
21c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// The DownloadManager uses the history service for storing persistent
22c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// information about the state of all downloads. The history system maintains a
23c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// separate table for this called 'downloads'. At the point that the
24c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// DownloadManager is constructed, we query the history service for the state of
25c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// all persisted downloads.
26c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
27c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#ifndef CHROME_BROWSER_DOWNLOAD_DOWNLOAD_MANAGER_H_
28c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#define CHROME_BROWSER_DOWNLOAD_DOWNLOAD_MANAGER_H_
293345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#pragma once
30c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
31c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include <map>
32c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include <set>
33c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include <string>
34c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include <vector>
35c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
36c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "base/basictypes.h"
37c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "base/file_path.h"
38ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "base/gtest_prod_util.h"
39ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "base/memory/ref_counted.h"
40ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "base/memory/weak_ptr.h"
41c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "base/observer_list.h"
423345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#include "base/scoped_ptr.h"
43c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "base/time.h"
443345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#include "chrome/browser/download/download_status_updater_delegate.h"
4572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "chrome/browser/ui/shell_dialogs.h"
46dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "content/browser/browser_thread.h"
47c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
48c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass DownloadFileManager;
493345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickclass DownloadHistory;
50c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass DownloadItem;
513345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickclass DownloadPrefs;
523345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickclass DownloadStatusUpdater;
53c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass GURL;
54c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass Profile;
55c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass ResourceDispatcherHost;
56c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass TabContents;
573345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickstruct DownloadCreateInfo;
58c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochstruct DownloadSaveInfo;
59c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
60ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsennamespace net {
61ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenclass URLRequestContextGetter;
62ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen}
63ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
64c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Browser's download manager: manages all downloads and destination view.
653345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickclass DownloadManager
663345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    : public base::RefCountedThreadSafe<DownloadManager,
67731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick                                        BrowserThread::DeleteOnUIThread>,
683345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      public DownloadStatusUpdaterDelegate,
693345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      public SelectFileDialog::Listener {
70c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch public:
713345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  explicit DownloadManager(DownloadStatusUpdater* status_updater);
72c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
733345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // Shutdown the download manager. Must be called before destruction.
743345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  void Shutdown();
75c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
76c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Interface to implement for observers that wish to be informed of changes
77c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // to the DownloadManager's collection of downloads.
78c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  class Observer {
79c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch   public:
80c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    // New or deleted download, observers should query us for the current set
81c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    // of downloads.
82c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    virtual void ModelChanged() = 0;
83c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
84c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    // Called when the DownloadManager is being destroyed to prevent Observers
85c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    // from calling back to a stale pointer.
86c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    virtual void ManagerGoingDown() {}
87c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
88201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    // Called immediately after the DownloadManager puts up a select file
89201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    // dialog.
90ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    // |id| indicates which download opened the dialog.
91ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    virtual void SelectFileDialogDisplayed(int32 id) {}
92201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
93c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch   protected:
94c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    virtual ~Observer() {}
95c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  };
96c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
97c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Return all temporary downloads that reside in the specified directory.
983345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  void GetTemporaryDownloads(const FilePath& dir_path,
993345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick                             std::vector<DownloadItem*>* result);
100c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
101c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Return all non-temporary downloads in the specified directory that are
102ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // are in progress or have completed.
1033345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  void GetAllDownloads(const FilePath& dir_path,
1043345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick                       std::vector<DownloadItem*>* result);
105c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
106c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Return all non-temporary downloads in the specified directory that are
107ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // in-progress (including dangerous downloads waiting for user confirmation).
1083345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  void GetCurrentDownloads(const FilePath& dir_path,
1093345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick                           std::vector<DownloadItem*>* result);
1103345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
1113345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // Returns all non-temporary downloads matching |query|. Empty query matches
1123345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // everything.
1133345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  void SearchDownloads(const string16& query,
1143345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick                       std::vector<DownloadItem*>* result);
115c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
116c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Returns true if initialized properly.
117c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  bool Init(Profile* profile);
118c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
119c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Notifications sent from the download thread to the UI thread
120c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void StartDownload(DownloadCreateInfo* info);
121c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void UpdateDownload(int32 download_id, int64 size);
122ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // |hash| is sha256 hash for the downloaded file. It is empty when the hash
123ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // is not available.
124ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  void OnResponseCompleted(int32 download_id, int64 size, int os_error,
125ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                           const std::string& hash);
126c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
127c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Called from a view when a user clicks a UI button or link.
128c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void DownloadCancelled(int32 download_id);
129c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void PauseDownload(int32 download_id, bool pause);
130c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void RemoveDownload(int64 download_handle);
131c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
13272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  // Determine if the download is ready for completion, i.e. has had
133ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // all data saved, and completed the filename determination and
13472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  // history insertion.
13572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  bool IsDownloadReadyForCompletion(DownloadItem* download);
13672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
13772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  // If all pre-requisites have been met, complete download processing, i.e.
13872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  // do internal cleanup, file rename, and potentially auto-open.
13972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  // (Dangerous downloads still may block on user acceptance after this
14072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  // point.)
14172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  void MaybeCompleteDownload(DownloadItem* download);
14272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
143c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Called when the download is renamed to its final name.
144ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // |uniquifier| is a number used to make unique names for the file.  It is
145ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // only valid for the DANGEROUS_BUT_VALIDATED state of the download item.
146ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  void OnDownloadRenamedToFinalName(int download_id,
147ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                                    const FilePath& full_path,
148ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                                    int uniquifier);
149c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
150c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Remove downloads after remove_begin (inclusive) and before remove_end
151c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // (exclusive). You may pass in null Time values to do an unbounded delete
152c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // in either direction.
153c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  int RemoveDownloadsBetween(const base::Time remove_begin,
154c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                             const base::Time remove_end);
155c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
156c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Remove downloads will delete all downloads that have a timestamp that is
157c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // the same or more recent than |remove_begin|. The number of downloads
158c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // deleted is returned back to the caller.
159c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  int RemoveDownloads(const base::Time remove_begin);
160c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
161c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Remove all downloads will delete all downloads. The number of downloads
162c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // deleted is returned back to the caller.
163c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  int RemoveAllDownloads();
164c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
165ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // Final download manager transition for download: Update the download
166ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // history and remove the download from |active_downloads_|.
167ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  void DownloadCompleted(int32 download_id);
168dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
1693345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // Called when a Save Page As download is started. Transfers ownership
1703345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // of |download_item| to the DownloadManager.
1713345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  void SavePageAsDownloadStarted(DownloadItem* download_item);
1723345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
173c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Download the object at the URL. Used in cases such as "Save Link As..."
174c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void DownloadUrl(const GURL& url,
175c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                   const GURL& referrer,
176c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                   const std::string& referrer_encoding,
177c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                   TabContents* tab_contents);
178c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
179c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Download the object at the URL and save it to the specified path. The
180c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // download is treated as the temporary download and thus will not appear
181c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // in the download history. Used in cases such as drag and drop.
182c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void DownloadUrlToFile(const GURL& url,
183c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                         const GURL& referrer,
184c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                         const std::string& referrer_encoding,
185c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                         const DownloadSaveInfo& save_info,
186c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                         TabContents* tab_contents);
187c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
188c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Allow objects to observe the download creation process.
189c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void AddObserver(Observer* observer);
190c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
191c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Remove a download observer from ourself.
192c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void RemoveObserver(Observer* observer);
193c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
194c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Methods called on completion of a query sent to the history system.
195c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void OnQueryDownloadEntriesComplete(
196c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      std::vector<DownloadCreateInfo>* entries);
197513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  void OnCreateDownloadEntryComplete(
1984a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch      DownloadCreateInfo info, int64 db_handle);
199c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
200c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Display a new download in the appropriate browser UI.
201c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void ShowDownloadInBrowser(const DownloadCreateInfo& info,
202c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                             DownloadItem* download);
203c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
204c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // The number of in progress (including paused) downloads.
205c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  int in_progress_count() const {
206c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    return static_cast<int>(in_progress_.size());
207c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
208c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
2093345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  Profile* profile() { return profile_; }
2103345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
2113345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  DownloadHistory* download_history() { return download_history_.get(); }
2123345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
2133345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  DownloadPrefs* download_prefs() { return download_prefs_.get(); }
214c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
21521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  // Creates the download item.  Must be called on the UI thread.
21621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  void CreateDownloadItem(DownloadCreateInfo* info);
21721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen
218c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Clears the last download path, used to initialize "save as" dialogs.
219c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void ClearLastDownloadPath();
220c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
221c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Tests if a file type should be opened automatically.
222c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  bool ShouldOpenFileBasedOnExtension(const FilePath& path) const;
223c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
2243345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // Overridden from DownloadStatusUpdaterDelegate:
2253345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  virtual bool IsDownloadProgressKnown();
2263345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  virtual int64 GetInProgressDownloadCount();
2273345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  virtual int64 GetReceivedDownloadBytes();
2283345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  virtual int64 GetTotalDownloadBytes();
229c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
230c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Overridden from SelectFileDialog::Listener:
231c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual void FileSelected(const FilePath& path, int index, void* params);
232c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual void FileSelectionCanceled(void* params);
233c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
2343345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // Called when the user has validated the download of a dangerous file.
235c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void DangerousDownloadValidated(DownloadItem* download);
236c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
237dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  // Callback function after url is checked with safebrowsing service.
238dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  void CheckDownloadUrlDone(DownloadCreateInfo* info, bool is_dangerous_url);
239dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
240ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // Callback function after download file hash is checked with safebrowsing
241ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // service.
242ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  void CheckDownloadHashDone(int32 download_id, bool is_dangerous_hash);
243ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
244c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch private:
24572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  // For testing.
24672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  friend class DownloadManagerTest;
24772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  friend class MockDownloadManager;
24872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
249c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // This class is used to let an incognito DownloadManager observe changes to
250c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // a normal DownloadManager, to propagate ModelChanged() calls from the parent
251c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // DownloadManager to the observers of the incognito DownloadManager.
252c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  class OtherDownloadManagerObserver : public Observer {
253c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch   public:
254c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    explicit OtherDownloadManagerObserver(
255c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        DownloadManager* observing_download_manager);
256c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    virtual ~OtherDownloadManagerObserver();
257c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
258c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    // Observer interface.
259c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    virtual void ModelChanged();
260c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    virtual void ManagerGoingDown();
261c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
262c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch   private:
263c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    // The incognito download manager.
264c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    DownloadManager* observing_download_manager_;
265c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
266c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    // The original profile's download manager.
267c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    DownloadManager* observed_download_manager_;
268c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  };
269c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
270dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  friend struct BrowserThread::DeleteOnThread<BrowserThread::UI>;
2713345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  friend class DeleteTask<DownloadManager>;
272c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  friend class OtherDownloadManagerObserver;
273c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
274c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ~DownloadManager();
275c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
276c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Called on the download thread to check whether the suggested file path
277c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // exists.  We don't check if the file exists on the UI thread to avoid UI
278c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // stalls from interacting with the file system.
279731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  void CheckIfSuggestedPathExists(DownloadCreateInfo* info,
280731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick                                  const FilePath& default_path);
281c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
282c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Called on the UI thread once the DownloadManager has determined whether the
283c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // suggested file path exists.
284c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void OnPathExistenceAvailable(DownloadCreateInfo* info);
285c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
286c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Called back after a target path for the file to be downloaded to has been
287c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // determined, either automatically based on the suggested file name, or by
288c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // the user in a Save As dialog box.
289dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  void AttachDownloadItem(DownloadCreateInfo* info);
290c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
291c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Download cancel helper function.
292c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void DownloadCancelledInternal(int download_id,
293c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                 int render_process_id,
294c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                 int request_id);
295c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
296ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // All data has been downloaded.
297ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // |hash| is sha256 hash for the downloaded file. It is empty when the hash
298ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // is not available.
299ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  void OnAllDataSaved(int32 download_id, int64 size, const std::string& hash);
300c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
301ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // An error occurred in the download.
302ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  void OnDownloadError(int32 download_id, int64 size, int os_error);
303c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
304c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Updates the app icon about the overall download progress.
3053345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  void UpdateAppIcon();
306c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
3073345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // Makes the ResourceDispatcherHost pause/un-pause a download request.
3083345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // Called on the IO thread.
3093345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  void PauseDownloadRequest(ResourceDispatcherHost* rdh,
3103345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick                            int render_process_id,
3113345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick                            int request_id,
3123345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick                            bool pause);
3133345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
314c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Inform observers that the model has changed.
315c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void NotifyModelChanged();
316c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
3173345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  DownloadItem* GetDownloadItem(int id);
3183345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
31921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  // Debugging routine to confirm relationship between below
32021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  // containers; no-op if NDEBUG.
32121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  void AssertContainersConsistent() const;
32221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen
32321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  // |downloads_| is the owning set for all downloads known to the
32421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  // DownloadManager.  This includes downloads started by the user in
32521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  // this session, downloads initialized from the history system, and
32621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  // "save page as" downloads.  All other DownloadItem containers in
32721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  // the DownloadManager are maps; they do not own the DownloadItems.
32821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  // Note that this is the only place (with any functional implications;
32921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  // see save_page_as_downloads_ below) that "save page as" downloads are
33021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  // kept, as the DownloadManager's only job is to hold onto those
33121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  // until destruction.
33221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  //
33321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  // |history_downloads_| is map of all downloads in this profile. The key
33421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  // is the handle returned by the history system, which is unique
33521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  // across sessions.
336c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  //
33772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  // |active_downloads_| is a map of all downloads that are currently being
33872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  // processed. The key is the ID assigned by the ResourceDispatcherHost,
33972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  // which is unique for the current session.
34072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  //
34121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  // |in_progress_| is a map of all downloads that are in progress and that have
342c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // not yet received a valid history handle. The key is the ID assigned by the
34321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  // ResourceDispatcherHost, which is unique for the current session.
344c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  //
34521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  // |save_page_as_downloads_| (if defined) is a collection of all the
34621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  // downloads the "save page as" system has given to us to hold onto
34721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  // until we are destroyed.  It is only used for debugging.
348c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  //
349c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // When a download is created through a user action, the corresponding
35072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  // DownloadItem* is placed in |active_downloads_| and remains there until the
351ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // download is in a terminal state (COMPLETE or CANCELLED).  It is also
352ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // placed in |in_progress_| and remains there until it has received a
353ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // valid handle from the history system. Once it has a valid handle, the
354ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // DownloadItem* is placed in the |history_downloads_| map.  When the
355ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // download reaches a terminal state, it is removed from |in_progress_|.
356ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // Downloads from past sessions read from a persisted state from the
357ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // history system are placed directly into |history_downloads_| since
358ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // they have valid handles in the history system.
35921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  typedef std::set<DownloadItem*> DownloadSet;
360c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  typedef base::hash_map<int64, DownloadItem*> DownloadMap;
361c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
36221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  DownloadSet downloads_;
36321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  DownloadMap history_downloads_;
36421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  DownloadMap in_progress_;
36572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  DownloadMap active_downloads_;
36621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen#if !defined(NDEBUG)
36721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  DownloadSet save_page_as_downloads_;
36821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen#endif
3693345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
370c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // True if the download manager has been initialized and requires a shutdown.
371c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  bool shutdown_needed_;
372c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
373c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Observers that want to be notified of changes to the set of downloads.
374c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ObserverList<Observer> observers_;
375c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
376c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // The current active profile.
377c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  Profile* profile_;
378ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  scoped_refptr<net::URLRequestContextGetter> request_context_getter_;
379c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
3803345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  scoped_ptr<DownloadHistory> download_history_;
3813345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
3823345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  scoped_ptr<DownloadPrefs> download_prefs_;
383c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
384c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Non-owning pointer for handling file writing on the download_thread_.
385c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  DownloadFileManager* file_manager_;
386c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
3873345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // Non-owning pointer for updating the download status.
388731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  base::WeakPtr<DownloadStatusUpdater> status_updater_;
389c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
390c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // The user's last choice for download directory. This is only used when the
391c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // user wants us to prompt for a save location for each download.
392c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  FilePath last_download_path_;
393c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
394c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // The "Save As" dialog box used to ask the user where a file should be
395c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // saved.
396c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  scoped_refptr<SelectFileDialog> select_file_dialog_;
397c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
398c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  scoped_ptr<OtherDownloadManagerObserver> other_download_manager_observer_;
399c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
400c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  DISALLOW_COPY_AND_ASSIGN(DownloadManager);
401c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch};
402c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
403c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#endif  // CHROME_BROWSER_DOWNLOAD_DOWNLOAD_MANAGER_H_
404