diff options
Diffstat (limited to 'chrome/browser/download/download_item.h')
-rw-r--r-- | chrome/browser/download/download_item.h | 493 |
1 files changed, 0 insertions, 493 deletions
diff --git a/chrome/browser/download/download_item.h b/chrome/browser/download/download_item.h deleted file mode 100644 index d0749f2..0000000 --- a/chrome/browser/download/download_item.h +++ /dev/null @@ -1,493 +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. -// -// Each download is represented by a DownloadItem, and all DownloadItems -// are owned by the DownloadManager which maintains a global list of all -// downloads. DownloadItems are created when a user initiates a download, -// and exist for the duration of the browser life time. -// -// Download observers: -// DownloadItem::Observer: -// - allows observers to receive notifications about one download from start -// to completion -// Use AddObserver() / RemoveObserver() on the appropriate download object to -// receive state updates. - -#ifndef CHROME_BROWSER_DOWNLOAD_DOWNLOAD_ITEM_H_ -#define CHROME_BROWSER_DOWNLOAD_DOWNLOAD_ITEM_H_ -#pragma once - -#include <string> - -#include "base/basictypes.h" -#include "base/file_path.h" -#include "base/observer_list.h" -#include "base/time.h" -#include "base/timer.h" -#include "chrome/browser/download/download_request_handle.h" -#include "chrome/browser/download/download_state_info.h" -#include "content/common/notification_observer.h" -#include "content/common/notification_registrar.h" -#include "googleurl/src/gurl.h" - -class CrxInstaller; -class DownloadFileManager; -class DownloadManager; -struct DownloadCreateInfo; -struct DownloadHistoryInfo; - -// One DownloadItem per download. This is the model class that stores all the -// state for a download. Multiple views, such as a tab's download shelf and the -// Destination tab's download view, may refer to a given DownloadItem. -// -// This is intended to be used only on the UI thread. -class DownloadItem : public NotificationObserver { - public: - enum DownloadState { - // Download is actively progressing. - IN_PROGRESS = 0, - - // Download is completely finished. - COMPLETE, - - // Download has been cancelled. - CANCELLED, - - // This state indicates that the download item is about to be destroyed, - // and observers seeing this state should release all references. - REMOVING, - - // This state indicates that the download has been interrupted. - INTERRUPTED, - - // Maximum value. - MAX_DOWNLOAD_STATE - }; - - enum SafetyState { - SAFE = 0, - DANGEROUS, - DANGEROUS_BUT_VALIDATED // Dangerous but the user confirmed the download. - }; - - // This enum is used by histograms. Do not change the ordering or remove - // items. - enum DangerType { - NOT_DANGEROUS = 0, - - // A dangerous file to the system (e.g.: an executable or extension from - // places other than gallery). - DANGEROUS_FILE, - - // Safebrowsing service shows this URL leads to malicious file download. - DANGEROUS_URL, - - // Memory space for histograms is determined by the max. - // ALWAYS ADD NEW VALUES BEFORE THIS ONE. - DANGEROUS_TYPE_MAX - }; - - // Reason for deleting the download. Passed to Delete(). - enum DeleteReason { - DELETE_DUE_TO_BROWSER_SHUTDOWN = 0, - DELETE_DUE_TO_USER_DISCARD - }; - - // Interface that observers of a particular download must implement in order - // to receive updates to the download's status. - class Observer { - public: - virtual void OnDownloadUpdated(DownloadItem* download) = 0; - - // Called when a downloaded file has been opened. - virtual void OnDownloadOpened(DownloadItem* download) = 0; - - protected: - virtual ~Observer() {} - }; - - // Constructing from persistent store: - DownloadItem(DownloadManager* download_manager, - const DownloadHistoryInfo& info); - - // Constructing for a regular download: - DownloadItem(DownloadManager* download_manager, - const DownloadCreateInfo& info, - bool is_otr); - - // Constructing for the "Save Page As..." feature: - DownloadItem(DownloadManager* download_manager, - const FilePath& path, - const GURL& url, - bool is_otr); - - virtual ~DownloadItem(); - - void AddObserver(Observer* observer); - void RemoveObserver(Observer* observer); - - // Notifies our observers periodically. - void UpdateObservers(); - - // NotificationObserver implementation. - virtual void Observe(int type, - const NotificationSource& source, - const NotificationDetails& details); - - // Returns true if it is OK to open a folder which this file is inside. - bool CanShowInFolder(); - - // Returns true if it is OK to register the type of this file so that - // it opens automatically. - bool CanOpenDownload(); - - // Tests if a file type should be opened automatically. - bool ShouldOpenFileBasedOnExtension(); - - // Registers this file extension for automatic opening upon download - // completion if 'open' is true, or prevents the extension from automatic - // opening if 'open' is false. - void OpenFilesBasedOnExtension(bool open); - - // Open the file associated with this download (wait for the download to - // complete if it is in progress). - void OpenDownload(); - - // Show the download via the OS shell. - void ShowDownloadInShell(); - - // Called when the user has validated the download of a dangerous file. - void DangerousDownloadValidated(); - - // Received a new chunk of data - void Update(int64 bytes_so_far); - - // Cancel the download operation. We need to distinguish between cancels at - // exit (DownloadManager destructor) from user interface initiated cancels - // because at exit, the history system may not exist, and any updates to it - // require AddRef'ing the DownloadManager in the destructor which results in - // a DCHECK failure. Set 'update_history' to false when canceling from at - // exit to prevent this crash. This may result in a difference between the - // downloaded file's size on disk, and what the history system's last record - // of it is. At worst, we'll end up re-downloading a small portion of the file - // when resuming a download (assuming the server supports byte ranges). - void Cancel(bool update_history); - - // Called by external code (SavePackage) using the DownloadItem interface - // to display progress when the DownloadItem should be considered complete. - void MarkAsComplete(); - - // Called when all data has been saved. Only has display effects. - void OnAllDataSaved(int64 size); - - // Called when the downloaded file is removed. - void OnDownloadedFileRemoved(); - - // Download operation had an error. - // |size| is the amount of data received so far, and |os_error| is the error - // code that the operation received. - void Interrupted(int64 size, int os_error); - - // Deletes the file from disk and removes the download from the views and - // history. |user| should be true if this is the result of the user clicking - // the discard button, and false if it is being deleted for other reasons like - // browser shutdown. - void Delete(DeleteReason reason); - - // Removes the download from the views and history. - void Remove(); - - // Simple calculation of the amount of time remaining to completion. Fills - // |*remaining| with the amount of time remaining if successful. Fails and - // returns false if we do not have the number of bytes or the speed so can - // not estimate. - bool TimeRemaining(base::TimeDelta* remaining) const; - - // Simple speed estimate in bytes/s - int64 CurrentSpeed() const; - - // Rough percent complete, -1 means we don't know (since we didn't receive a - // total size). - int PercentComplete() const; - - // Called when the final path has been determined. - void OnPathDetermined(const FilePath& path); - - // Returns true if this download has saved all of its data. - bool all_data_saved() const { return all_data_saved_; } - - // Update the fields that may have changed in DownloadStateInfo as a - // result of analyzing the file and figuring out its type, location, etc. - // May only be called once. - void SetFileCheckResults(const DownloadStateInfo& state); - - // Update the download's path, the actual file is renamed on the download - // thread. - void Rename(const FilePath& full_path); - - // Allow the user to temporarily pause a download or resume a paused download. - void TogglePause(); - - // Called when the download is ready to complete. - // This may perform final rename if necessary and will eventually call - // DownloadItem::Completed(). - void OnDownloadCompleting(DownloadFileManager* file_manager); - - // Called when the file name for the download is renamed to its final name. - void OnDownloadRenamedToFinalName(const FilePath& full_path); - - // Returns true if this item matches |query|. |query| must be lower-cased. - bool MatchesQuery(const string16& query) const; - - // Returns true if the download needs more data. - bool IsPartialDownload() const; - - // Returns true if the download is still receiving data. - bool IsInProgress() const; - - // Returns true if the download has been cancelled or was interrupted. - bool IsCancelled() const; - - // Returns true if the download was interrupted. - bool IsInterrupted() const; - - // Returns true if we have all the data and know the final file name. - bool IsComplete() const; - - // Accessors - DownloadState state() const { return state_; } - const FilePath& full_path() const { return full_path_; } - void set_path_uniquifier(int uniquifier) { - state_info_.path_uniquifier = uniquifier; - } - const GURL& GetURL() const; - - const std::vector<GURL>& url_chain() const { return url_chain_; } - const GURL& original_url() const { return url_chain_.front(); } - const GURL& referrer_url() const { return referrer_url_; } - std::string suggested_filename() const { return suggested_filename_; } - std::string content_disposition() const { return content_disposition_; } - std::string mime_type() const { return mime_type_; } - std::string original_mime_type() const { return original_mime_type_; } - std::string referrer_charset() const { return referrer_charset_; } - int64 total_bytes() const { return total_bytes_; } - void set_total_bytes(int64 total_bytes) { - total_bytes_ = total_bytes; - } - int64 received_bytes() const { return received_bytes_; } - int32 id() const { return download_id_; } - base::Time start_time() const { return start_time_; } - void set_db_handle(int64 handle) { db_handle_ = handle; } - int64 db_handle() const { return db_handle_; } - bool is_paused() const { return is_paused_; } - bool open_when_complete() const { return open_when_complete_; } - void set_open_when_complete(bool open) { open_when_complete_ = open; } - bool file_externally_removed() const { return file_externally_removed_; } - SafetyState safety_state() const { return safety_state_; } - // Why |safety_state_| is not SAFE. - DangerType GetDangerType() const; - bool IsDangerous() const; - void MarkFileDangerous(); - void MarkUrlDangerous(); - - bool auto_opened() { return auto_opened_; } - const FilePath& target_name() const { return state_info_.target_name; } - bool prompt_user_for_save_location() const { - return state_info_.prompt_user_for_save_location; - } - bool is_otr() const { return is_otr_; } - bool is_extension_install() const { - return state_info_.is_extension_install; - } - const FilePath& suggested_path() const { return state_info_.suggested_path; } - bool is_temporary() const { return is_temporary_; } - void set_opened(bool opened) { opened_ = opened; } - bool opened() const { return opened_; } - - DownloadHistoryInfo GetHistoryInfo() const; - DownloadStateInfo state_info() const { return state_info_; } - const DownloadRequestHandle& request_handle() const { - return request_handle_; - } - - // Returns the final target file path for the download. - FilePath GetTargetFilePath() const; - - // Returns the file-name that should be reported to the user, which is - // target_name possibly with the uniquifier number. - FilePath GetFileNameToReportUser() const; - - // Returns the user-verified target file path for the download. - // This returns the same path as GetTargetFilePath() for safe downloads - // but does not for dangerous downloads until the name is verified. - FilePath GetUserVerifiedFilePath() const; - - // Returns true if the current file name is not the final target name yet. - bool NeedsRename() const { - return state_info_.target_name != full_path_.BaseName(); - } - - // Is a CRX installer running on this download? - bool IsCrxInstallRuning() const { - return (is_extension_install() && - all_data_saved() && - state_ == IN_PROGRESS); - } - - std::string DebugString(bool verbose) const; - -#ifdef UNIT_TEST - // Mock opening downloads (for testing only). - void TestMockDownloadOpen() { open_enabled_ = false; } -#endif - - private: - // Construction common to all constructors. |active| should be true for new - // downloads and false for downloads from the history. - void Init(bool active); - - // Internal helper for maintaining consistent received and total sizes. - void UpdateSize(int64 size); - - // Called when the entire download operation (including renaming etc) - // is completed. - void Completed(); - - // Start/stop sending periodic updates to our observers - void StartProgressTimer(); - void StopProgressTimer(); - - // Call to install this item as a CRX. Should only be called on - // items which are CRXes. Use is_extension_install() to check. - void StartCrxInstall(); - - // Call to transition state; all state transitions should go through this. - void TransitionTo(DownloadState new_state); - - // Called when safety_state_ should be recomputed from is_dangerous_file - // and is_dangerous_url. - void UpdateSafetyState(); - - // Helper function to recompute |state_info_.target_name| when - // it may have changed. (If it's non-null it should be left alone, - // otherwise updated from |full_path_|.) - void UpdateTarget(); - - // State information used by the download manager. - DownloadStateInfo state_info_; - - // The handle to the request information. Used for operations outside the - // download system. - DownloadRequestHandle request_handle_; - - // Download ID assigned by DownloadResourceHandler. - int32 download_id_; - - // Full path to the downloaded or downloading file. - FilePath full_path_; - - // A number that should be appended to the path to make it unique, or 0 if the - // path should be used as is. - int path_uniquifier_; - - // The chain of redirects that leading up to and including the final URL. - std::vector<GURL> url_chain_; - - // The URL of the page that initiated the download. - GURL referrer_url_; - - // Suggested filename in 'download' attribute of an anchor. Details: - // http://www.whatwg.org/specs/web-apps/current-work/#downloading-hyperlinks - std::string suggested_filename_; - - // Information from the request. - // Content-disposition field from the header. - std::string content_disposition_; - - // Mime-type from the header. Subject to change. - std::string mime_type_; - - // The value of the content type header sent with the downloaded item. It - // may be different from |mime_type_|, which may be set based on heuristics - // which may look at the file extension and first few bytes of the file. - std::string original_mime_type_; - - // The charset of the referring page where the download request comes from. - // It's used to construct a suggested filename. - std::string referrer_charset_; - - // Total bytes expected - int64 total_bytes_; - - // Current received bytes - int64 received_bytes_; - - // Last error. - int last_os_error_; - - // Start time for calculating remaining time - base::TimeTicks start_tick_; - - // The current state of this download - DownloadState state_; - - // The views of this item in the download shelf and download tab - ObserverList<Observer> observers_; - - // Time the download was started - base::Time start_time_; - - // Our persistent store handle - int64 db_handle_; - - // Timer for regularly updating our observers - base::RepeatingTimer<DownloadItem> update_timer_; - - // Our owning object - DownloadManager* download_manager_; - - // In progress downloads may be paused by the user, we note it here - bool is_paused_; - - // A flag for indicating if the download should be opened at completion. - bool open_when_complete_; - - // A flag for indicating if the downloaded file is externally removed. - bool file_externally_removed_; - - // Indicates if the download is considered potentially safe or dangerous - // (executable files are typically considered dangerous). - SafetyState safety_state_; - - // True if the download was auto-opened. We set this rather than using - // an observer as it's frequently possible for the download to be auto opened - // before the observer is added. - bool auto_opened_; - - // True if the download was initiated in an incognito window. - bool is_otr_; - - // True if the item was downloaded temporarily. - bool is_temporary_; - - // True if we've saved all the data for the download. - bool all_data_saved_; - - // Did the user open the item either directly or indirectly (such as by - // setting always open files of this type)? The shelf also sets this field - // when the user closes the shelf before the item has been opened but should - // be treated as though the user opened it. - bool opened_; - - // Do we actual open downloads when requested? For testing purposes - // only. - bool open_enabled_; - - // DownloadItem observes CRX installs it initiates. - NotificationRegistrar registrar_; - - DISALLOW_COPY_AND_ASSIGN(DownloadItem); -}; - -#endif // CHROME_BROWSER_DOWNLOAD_DOWNLOAD_ITEM_H_ |