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// Each download is represented by a DownloadItem, and all DownloadItems 6c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// are owned by the DownloadManager which maintains a global list of all 7c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// downloads. DownloadItems are created when a user initiates a download, 8c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// and exist for the duration of the browser life time. 9c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// 10c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Download observers: 11c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// DownloadItem::Observer: 12c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// - allows observers to receive notifications about one download from start 13c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// to completion 14c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Use AddObserver() / RemoveObserver() on the appropriate download object to 15c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// receive state updates. 16c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 17c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#ifndef CHROME_BROWSER_DOWNLOAD_DOWNLOAD_ITEM_H_ 18c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#define CHROME_BROWSER_DOWNLOAD_DOWNLOAD_ITEM_H_ 193345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#pragma once 20c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 21c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include <string> 22c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 23c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "base/basictypes.h" 24c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "base/file_path.h" 25c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "base/observer_list.h" 26c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "base/time.h" 27c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "base/timer.h" 28c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "googleurl/src/gurl.h" 29c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 304a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdochclass DownloadFileManager; 31c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass DownloadManager; 32c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochstruct DownloadCreateInfo; 33c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 34c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// One DownloadItem per download. This is the model class that stores all the 35c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// state for a download. Multiple views, such as a tab's download shelf and the 36c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Destination tab's download view, may refer to a given DownloadItem. 3772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// 3872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// This is intended to be used only on the UI thread. 39c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass DownloadItem { 40c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch public: 41c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch enum DownloadState { 42ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // Download is actively progressing. 43c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch IN_PROGRESS, 4472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 45ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // Download is completely finished. 46c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch COMPLETE, 4772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 48ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // Download has been cancelled. 49c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch CANCELLED, 5072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 5172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen // This state indicates that the download item is about to be destroyed, 5272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen // and observers seeing this state should release all references. 53ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen REMOVING, 54ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 55ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // This state indicates that the download has been interrupted. 56ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen INTERRUPTED 57c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch }; 58c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 59c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch enum SafetyState { 60c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch SAFE = 0, 61c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch DANGEROUS, 62c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch DANGEROUS_BUT_VALIDATED // Dangerous but the user confirmed the download. 63c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch }; 64c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 65ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // This enum is used by histograms. Do not change the ordering or remove 66ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // items. 67dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen enum DangerType { 68dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen NOT_DANGEROUS = 0, 69dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen 70dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen // A dangerous file to the system (e.g.: an executable or extension from 71dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen // places other than gallery). 72dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen DANGEROUS_FILE, 73dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen 74dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen // Safebrowsing service shows this URL leads to malicious file download. 75ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen DANGEROUS_URL, 76ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 77ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // Memory space for histograms is determined by the max. 78ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // ALWAYS ADD NEW VALUES BEFORE THIS ONE. 79ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen DANGEROUS_TYPE_MAX 80ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen }; 81ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 82ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // Reason for deleting the download. Passed to Delete(). 83ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen enum DeleteReason { 84ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen DELETE_DUE_TO_BROWSER_SHUTDOWN = 0, 85ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen DELETE_DUE_TO_USER_DISCARD 86dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen }; 87dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen 88c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Interface that observers of a particular download must implement in order 89c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // to receive updates to the download's status. 90c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch class Observer { 91c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch public: 92c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch virtual void OnDownloadUpdated(DownloadItem* download) = 0; 93c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 94c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Called when a downloaded file has been opened. 95c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch virtual void OnDownloadOpened(DownloadItem* download) = 0; 96c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 97c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch protected: 98c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch virtual ~Observer() {} 99c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch }; 100c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 101c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Constructing from persistent store: 1023345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick DownloadItem(DownloadManager* download_manager, 1033345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick const DownloadCreateInfo& info); 104c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 1053345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // Constructing for a regular download: 1063345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick DownloadItem(DownloadManager* download_manager, 1073345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick const DownloadCreateInfo& info, 1083345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick bool is_otr); 1093345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 1103345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // Constructing for the "Save Page As..." feature: 1113345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick DownloadItem(DownloadManager* download_manager, 112c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const FilePath& path, 113c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const GURL& url, 1143345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick bool is_otr); 115c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 116c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ~DownloadItem(); 117c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 118c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch void AddObserver(Observer* observer); 119c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch void RemoveObserver(Observer* observer); 120c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 121c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Notifies our observers periodically. 122c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch void UpdateObservers(); 123c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 1243345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // Whether it is OK to open this download. 1253345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick bool CanOpenDownload(); 1263345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 1273345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // Tests if a file type should be opened automatically. 1283345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick bool ShouldOpenFileBasedOnExtension(); 1293345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 1303345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // Registers this file extension for automatic opening upon download 1313345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // completion if 'open' is true, or prevents the extension from automatic 1323345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // opening if 'open' is false. 1333345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick void OpenFilesBasedOnExtension(bool open); 1343345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 1353345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // Open the file associated with this download (wait for the download to 1363345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // complete if it is in progress). 1373345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick void OpenDownload(); 1383345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 1393345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // Show the download via the OS shell. 1403345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick void ShowDownloadInShell(); 1413345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 1423345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // Called when the user has validated the download of a dangerous file. 1433345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick void DangerousDownloadValidated(); 144c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 145c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Received a new chunk of data 146c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch void Update(int64 bytes_so_far); 147c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 148c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Cancel the download operation. We need to distinguish between cancels at 149c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // exit (DownloadManager destructor) from user interface initiated cancels 150c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // because at exit, the history system may not exist, and any updates to it 151c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // require AddRef'ing the DownloadManager in the destructor which results in 152c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // a DCHECK failure. Set 'update_history' to false when canceling from at 153c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // exit to prevent this crash. This may result in a difference between the 154c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // downloaded file's size on disk, and what the history system's last record 155c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // of it is. At worst, we'll end up re-downloading a small portion of the file 156c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // when resuming a download (assuming the server supports byte ranges). 157c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch void Cancel(bool update_history); 158c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 15972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen // Called when all data has been saved. Only has display effects. 1603345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick void OnAllDataSaved(int64 size); 1613345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 162ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // Called by external code (SavePackage) using the DownloadItem interface 163ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // to display progress when the DownloadItem should be considered complete. 16472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen void MarkAsComplete(); 16572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 166ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // Download operation had an error. 167ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // |size| is the amount of data received so far, and |os_error| is the error 168ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // code that the operation received. 169ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen void Interrupted(int64 size, int os_error); 170c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 171ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // Deletes the file from disk and removes the download from the views and 172ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // history. |user| should be true if this is the result of the user clicking 173ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // the discard button, and false if it is being deleted for other reasons like 174ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // browser shutdown. 175ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen void Delete(DeleteReason reason); 176ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 177ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // Removes the download from the views and history. 178ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen void Remove(); 179c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 180c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Simple calculation of the amount of time remaining to completion. Fills 181c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // |*remaining| with the amount of time remaining if successful. Fails and 182c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // returns false if we do not have the number of bytes or the speed so can 183c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // not estimate. 184c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch bool TimeRemaining(base::TimeDelta* remaining) const; 185c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 186c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Simple speed estimate in bytes/s 187c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch int64 CurrentSpeed() const; 188c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 189c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Rough percent complete, -1 means we don't know (since we didn't receive a 190c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // total size). 191c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch int PercentComplete() const; 192c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 19372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen // Whether or not this download has saved all of its data. 19472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen bool all_data_saved() const { return all_data_saved_; } 19572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 19621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen // Update the fields that may have changed in DownloadCreateInfo as a 19721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen // result of analyzing the file and figuring out its type, location, etc. 19821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen // May only be called once. 19921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen void SetFileCheckResults(const FilePath& path, 200dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen bool is_dangerous_file, 201dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen bool is_dangerous_url, 20221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen int path_uniquifier, 20321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen bool prompt, 20421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen bool is_extension_install, 20521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen const FilePath& original_name); 20621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen 207c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Update the download's path, the actual file is renamed on the download 208c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // thread. 209c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch void Rename(const FilePath& full_path); 210c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 211c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Allow the user to temporarily pause a download or resume a paused download. 212c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch void TogglePause(); 213c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 2143345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // Called when the name of the download is finalized. 2153345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick void OnNameFinalized(); 2163345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 217ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // Called when the download is ready to complete. 2184a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch // This may perform final rename if necessary and will eventually call 219ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // DownloadItem::Completed(). 220ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen void OnDownloadCompleting(DownloadFileManager* file_manager); 2214a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch 2224a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch // Called when the file name for the download is renamed to its final name. 2234a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch void OnDownloadRenamedToFinalName(const FilePath& full_path); 2244a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch 2253345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // Returns true if this item matches |query|. |query| must be lower-cased. 2263345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick bool MatchesQuery(const string16& query) const; 2273345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 228ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // Returns true if the download needs more data. 229ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen bool IsPartialDownload() const; 230ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 231ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // Returns true if the download is still receiving data. 232ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen bool IsInProgress() const; 233ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 234ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // Returns true if the download has been cancelled or was interrupted. 235ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen bool IsCancelled() const; 236ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 237ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // Returns true if the download was interrupted. 238ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen bool IsInterrupted() const; 239ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 240ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // Returns true if we have all the data and know the final file name. 241ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen bool IsComplete() const; 242ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 243c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Accessors 244c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch DownloadState state() const { return state_; } 245c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch FilePath full_path() const { return full_path_; } 246c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch void set_path_uniquifier(int uniquifier) { path_uniquifier_ = uniquifier; } 247ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen const GURL& url() const { return url_chain_.back(); } 248ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen const std::vector<GURL>& url_chain() const { return url_chain_; } 249ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen const GURL& original_url() const { return url_chain_.front(); } 250ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen const GURL& referrer_url() const { return referrer_url_; } 251c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch std::string mime_type() const { return mime_type_; } 252c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch std::string original_mime_type() const { return original_mime_type_; } 253c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch int64 total_bytes() const { return total_bytes_; } 254c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch void set_total_bytes(int64 total_bytes) { total_bytes_ = total_bytes; } 255c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch int64 received_bytes() const { return received_bytes_; } 256c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch int32 id() const { return id_; } 257c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch base::Time start_time() const { return start_time_; } 258c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch void set_db_handle(int64 handle) { db_handle_ = handle; } 259c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch int64 db_handle() const { return db_handle_; } 260c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch bool is_paused() const { return is_paused_; } 261c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch bool open_when_complete() const { return open_when_complete_; } 262c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch void set_open_when_complete(bool open) { open_when_complete_ = open; } 263c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch int render_process_id() const { return render_process_id_; } 264c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch int request_id() const { return request_id_; } 265c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch SafetyState safety_state() const { return safety_state_; } 266c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch void set_safety_state(SafetyState safety_state) { 267c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch safety_state_ = safety_state; 268c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 269dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen DangerType danger_type() { return danger_type_;} 270c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch bool auto_opened() { return auto_opened_; } 271513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch FilePath target_name() const { return target_name_; } 272c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch bool save_as() const { return save_as_; } 273c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch bool is_otr() const { return is_otr_; } 274c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch bool is_extension_install() const { return is_extension_install_; } 275c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch bool name_finalized() const { return name_finalized_; } 276c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch bool is_temporary() const { return is_temporary_; } 2773345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick void set_opened(bool opened) { opened_ = opened; } 2783345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick bool opened() const { return opened_; } 279c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 280513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // Returns the final target file path for the download. 281513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch FilePath GetTargetFilePath() const; 282513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch 283c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Returns the file-name that should be reported to the user, which is 284513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // target_name_ possibly with the uniquifier number. 285513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch FilePath GetFileNameToReportUser() const; 286513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch 287201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch // Returns the user-verified target file path for the download. 288201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch // This returns the same path as GetTargetFilePath() for safe downloads 289513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // but does not for dangerous downloads until the name is verified. 290201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch FilePath GetUserVerifiedFilePath() const; 291513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch 292513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // Returns true if the current file name is not the final target name yet. 293513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch bool NeedsRename() const { 294513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch return target_name_ != full_path_.BaseName(); 295513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch } 296c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 297201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch std::string DebugString(bool verbose) const; 298201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch 299c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch private: 3003345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick void Init(bool start_timer); 3013345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 302c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Internal helper for maintaining consistent received and total sizes. 303c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch void UpdateSize(int64 size); 304c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 305ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // Called when the entire download operation (including renaming etc) 306ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // is completed. 307ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen void Completed(); 308ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 3093345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // Start/stop sending periodic updates to our observers 3103345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick void StartProgressTimer(); 3113345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick void StopProgressTimer(); 3123345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 313c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Request ID assigned by the ResourceDispatcherHost. 314c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch int32 id_; 315c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 316513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // Full path to the downloaded or downloading file. 317c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch FilePath full_path_; 318c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 319c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // A number that should be appended to the path to make it unique, or 0 if the 320c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // path should be used as is. 321c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch int path_uniquifier_; 322c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 323ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // The chain of redirects that leading up to and including the final URL. 324ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen std::vector<GURL> url_chain_; 32572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 326c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // The URL of the page that initiated the download. 327c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch GURL referrer_url_; 328c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 329c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // The mimetype of the download 330c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch std::string mime_type_; 331c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 332c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // The value of the content type header received when downloading 333c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // this item. |mime_type_| may be different because of type sniffing. 334c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch std::string original_mime_type_; 335c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 336c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Total bytes expected 337c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch int64 total_bytes_; 338c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 339c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Current received bytes 340c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch int64 received_bytes_; 341c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 342ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // Last error. 343ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen int last_os_error_; 344ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 345c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Start time for calculating remaining time 346c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch base::TimeTicks start_tick_; 347c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 348c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // The current state of this download 349c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch DownloadState state_; 350c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 351c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // The views of this item in the download shelf and download tab 352c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ObserverList<Observer> observers_; 353c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 354c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Time the download was started 355c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch base::Time start_time_; 356c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 357c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Our persistent store handle 358c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch int64 db_handle_; 359c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 360c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Timer for regularly updating our observers 361c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch base::RepeatingTimer<DownloadItem> update_timer_; 362c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 363c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Our owning object 3643345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick DownloadManager* download_manager_; 365c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 366c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // In progress downloads may be paused by the user, we note it here 367c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch bool is_paused_; 368c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 369c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // A flag for indicating if the download should be opened at completion. 370c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch bool open_when_complete_; 371c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 372c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Whether the download is considered potentially safe or dangerous 373c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // (executable files are typically considered dangerous). 374c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch SafetyState safety_state_; 375c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 376dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen // Why |safety_state_| is not SAFE. 377dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen DangerType danger_type_; 378dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen 379c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Whether the download was auto-opened. We set this rather than using 380c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // an observer as it's frequently possible for the download to be auto opened 381c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // before the observer is added. 382c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch bool auto_opened_; 383c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 384513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // Dangerous downloads or ongoing downloads are given temporary names until 385513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // the user approves them or the downloads finish. 386513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // This stores their final target name. 387513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch FilePath target_name_; 388c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 389c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // For canceling or pausing requests. 390c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch int render_process_id_; 391c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch int request_id_; 392c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 393c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // True if the item was downloaded as a result of 'save as...' 394c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch bool save_as_; 395c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 396c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // True if the download was initiated in an incognito window. 397c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch bool is_otr_; 398c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 399c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // True if the item was downloaded for an extension installation. 400c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch bool is_extension_install_; 401c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 402c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // True if the filename is finalized. 403c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch bool name_finalized_; 404c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 405c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // True if the item was downloaded temporarily. 406c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch bool is_temporary_; 407c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 40872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen // True if we've saved all the data for the download. 40972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen bool all_data_saved_; 41072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 4113345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // Did the user open the item either directly or indirectly (such as by 4123345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // setting always open files of this type)? The shelf also sets this field 4133345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // when the user closes the shelf before the item has been opened but should 4143345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // be treated as though the user opened it. 4153345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick bool opened_; 4163345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 417c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch DISALLOW_COPY_AND_ASSIGN(DownloadItem); 418c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}; 419c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 420c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#endif // CHROME_BROWSER_DOWNLOAD_DOWNLOAD_ITEM_H_ 421