// Copyright (c) 2012 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. // // 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 CONTENT_PUBLIC_BROWSER_DOWNLOAD_ITEM_H_ #define CONTENT_PUBLIC_BROWSER_DOWNLOAD_ITEM_H_ #pragma once #include #include #include #include "base/file_path.h" #include "base/string16.h" #include "content/public/browser/download_danger_type.h" #include "content/public/browser/download_interrupt_reasons.h" #include "content/public/common/page_transition_types.h" class DownloadFileManager; class FilePath; class GURL; struct DownloadCreateInfo; namespace base { class Time; class TimeDelta; } namespace content { class BrowserContext; class DownloadId; class DownloadManager; class WebContents; struct DownloadPersistentStoreInfo; // 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 CONTENT_EXPORT DownloadItem { 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. }; // Reason for deleting the download. Passed to Delete(). enum DeleteReason { DELETE_DUE_TO_BROWSER_SHUTDOWN = 0, DELETE_DUE_TO_USER_DISCARD }; // How the final target path should be used. enum TargetDisposition { TARGET_DISPOSITION_OVERWRITE, // Overwrite if the target already exists. TARGET_DISPOSITION_UNIQUIFY, // Append a uniquifier if the target already // exists. E.g.: "foo.txt" -> "foo (1).txt" TARGET_DISPOSITION_PROMPT // Prompt the user for the actual // target. Implies // TARGET_DISPOSITION_OVERWRITE. }; // A fake download table ID which represents a download that has started, // but is not yet in the table. static const int kUninitializedHandle; static const char kEmptyFileHash[]; // Interface that observers of a particular download must implement in order // to receive updates to the download's status. class CONTENT_EXPORT 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() {} }; // Interface for data that can be stored associated with (and owned // by) an object of this class via GetExternalData/SetExternalData. class ExternalData { public: virtual ~ExternalData() {}; }; virtual ~DownloadItem() {} virtual void AddObserver(DownloadItem::Observer* observer) = 0; virtual void RemoveObserver(DownloadItem::Observer* observer) = 0; // Notifies our observers periodically. virtual void UpdateObservers() = 0; // Returns true if it is OK to open a folder which this file is inside. virtual bool CanShowInFolder() = 0; // Returns true if it is OK to register the type of this file so that // it opens automatically. virtual bool CanOpenDownload() = 0; // Tests if a file type should be opened automatically. virtual bool ShouldOpenFileBasedOnExtension() = 0; // Open the file associated with this download (wait for the download to // complete if it is in progress). virtual void OpenDownload() = 0; // Show the download via the OS shell. virtual void ShowDownloadInShell() = 0; // Called when the user has validated the download of a dangerous file. virtual void DangerousDownloadValidated() = 0; // Called periodically from the download thread, or from the UI thread // for saving packages. // |bytes_so_far| is the number of bytes received so far. // |hash_state| is the current hash state. virtual void UpdateProgress(int64 bytes_so_far, int64 bytes_per_sec, const std::string& hash_state) = 0; // 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 |user_cancel| 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). virtual void Cancel(bool user_cancel) = 0; // Called by external code (SavePackage) using the DownloadItem interface // to display progress when the DownloadItem should be considered complete. virtual void MarkAsComplete() = 0; // Called by the delegate after it delayed opening the download in // DownloadManagerDelegate::ShouldOpenDownload. virtual void DelayedDownloadOpened(bool auto_opened) = 0; // Called when all data has been saved. Only has display effects. virtual void OnAllDataSaved(int64 size, const std::string& final_hash) = 0; // Called when the downloaded file is removed. virtual void OnDownloadedFileRemoved() = 0; // Download operation had an error. // |size| is the amount of data received at interruption. // |hash_state| is the current hash state at interruption. // |reason| is the download interrupt reason code that the operation received. virtual void Interrupted(int64 size, const std::string& hash_state, DownloadInterruptReason reason) = 0; // 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. virtual void Delete(DeleteReason reason) = 0; // Removes the download from the views and history. virtual void Remove() = 0; // 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. virtual bool TimeRemaining(base::TimeDelta* remaining) const = 0; // Simple speed estimate in bytes/s virtual int64 CurrentSpeed() const = 0; // Rough percent complete, -1 means we don't know (since we didn't receive a // total size). virtual int PercentComplete() const = 0; // Returns true if this download has saved all of its data. virtual bool AllDataSaved() const = 0; // Allow the user to temporarily pause a download or resume a paused download. virtual void TogglePause() = 0; // Called when the download is ready to complete. // This may perform final rename if necessary and will eventually call // DownloadItem::Completed(). virtual void OnDownloadCompleting(DownloadFileManager* file_manager) = 0; // Returns true if this item matches |query|. |query| must be lower-cased. virtual bool MatchesQuery(const string16& query) const = 0; // Returns true if the download needs more data. virtual bool IsPartialDownload() const = 0; // Returns true if the download is still receiving data. virtual bool IsInProgress() const = 0; // Returns true if the download has been cancelled or was interrupted. virtual bool IsCancelled() const = 0; // Returns true if the download was interrupted. virtual bool IsInterrupted() const = 0; // Returns true if we have all the data and know the final file name. virtual bool IsComplete() const = 0; // Full path to the downloaded or downloading file. This is the path to the // physical file, if one exists. Can be empty if the in-progress path hasn't // been determined yet. virtual const FilePath& GetFullPath() const = 0; // Target path of an in-progress download. We may be downloading to a // temporary or intermediate file (specified by |current_path_|. Once the // download completes, we will rename the file to |target_path_|. virtual const FilePath& GetTargetFilePath() const = 0; // Get the target disposition. virtual TargetDisposition GetTargetDisposition() const = 0; // Called when the target path has been determined. |target_path| is the // suggested target path. |disposition| indicates how the target path should // be used (see TargetDisposition). |danger_type| is the danger level of // |target_path| as determined by the caller. If |disposition| is // TARGET_DISPOSITION_PROMPT, then OnTargetPathSelected() should be called // subsequently with the user's selected target path. virtual void OnTargetPathDetermined( const FilePath& target_path, TargetDisposition disposition, content::DownloadDangerType danger_type) = 0; // This method should be called if and only if OnTargetPathDetermined() was // called previously with disposition set to TARGET_DISPOSITION_PROMPT. // |target_path| is the path that the user selected after being prompted for a // target path. virtual void OnTargetPathSelected(const FilePath& target_path) = 0; // Called if a check of the download contents was performed and the results of // the test are available. This should only be called after AllDataSaved() is // true. virtual void OnContentCheckCompleted(DownloadDangerType danger_type) = 0; virtual void OnIntermediatePathDetermined(DownloadFileManager* file_manager, const FilePath& path, bool ok_to_overwrite) = 0; virtual void SetIsPersisted() = 0; virtual bool IsPersisted() const = 0; // Accessors virtual const std::string& GetHash() const = 0; virtual DownloadState GetState() const = 0; virtual const GURL& GetURL() const = 0; virtual const std::vector& GetUrlChain() const = 0; virtual const GURL& GetOriginalUrl() const = 0; virtual const GURL& GetReferrerUrl() const = 0; virtual std::string GetSuggestedFilename() const = 0; virtual std::string GetContentDisposition() const = 0; virtual std::string GetMimeType() const = 0; virtual std::string GetOriginalMimeType() const = 0; virtual std::string GetReferrerCharset() const = 0; virtual std::string GetRemoteAddress() const = 0; virtual int64 GetTotalBytes() const = 0; virtual void SetTotalBytes(int64 total_bytes) = 0; virtual int64 GetReceivedBytes() const = 0; virtual const std::string& GetHashState() const = 0; virtual int32 GetId() const = 0; virtual DownloadId GetGlobalId() const = 0; virtual base::Time GetStartTime() const = 0; virtual base::Time GetEndTime() const = 0; virtual void SetDbHandle(int64 handle) = 0; virtual int64 GetDbHandle() const = 0; virtual bool IsPaused() const = 0; virtual bool GetOpenWhenComplete() const = 0; virtual void SetOpenWhenComplete(bool open) = 0; virtual bool GetFileExternallyRemoved() const = 0; virtual SafetyState GetSafetyState() const = 0; // Why |safety_state_| is not SAFE. virtual DownloadDangerType GetDangerType() const = 0; virtual bool IsDangerous() const = 0; virtual bool GetAutoOpened() = 0; virtual FilePath GetTargetName() const = 0; virtual const FilePath& GetForcedFilePath() const = 0; virtual bool HasUserGesture() const = 0; virtual content::PageTransition GetTransitionType() const = 0; virtual bool IsOtr() const = 0; virtual bool IsTemporary() const = 0; virtual void SetIsTemporary(bool temporary) = 0; virtual void SetOpened(bool opened) = 0; virtual bool GetOpened() const = 0; virtual const std::string& GetLastModifiedTime() const = 0; virtual const std::string& GetETag() const = 0; virtual DownloadInterruptReason GetLastReason() const = 0; virtual DownloadPersistentStoreInfo GetPersistentStoreInfo() const = 0; virtual BrowserContext* GetBrowserContext() const = 0; virtual WebContents* GetWebContents() const = 0; // Returns the file-name that should be reported to the user. If a display // name has been explicitly set using SetDisplayName(), this function returns // that display name. Otherwise returns the final target filename. virtual FilePath GetFileNameToReportUser() const = 0; // Set a display name for the download that will be independent of the target // filename. If |name| is not empty, then GetFileNameToReportUser() will // return |name|. Has no effect on the final target filename. virtual void SetDisplayName(const FilePath& name) = 0; // 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. virtual FilePath GetUserVerifiedFilePath() const = 0; // Cancels the off-thread aspects of the download. // TODO(rdsmith): This should be private and only called from // DownloadItem::Cancel/Interrupt; it isn't now because we can't // call those functions from // DownloadManager::FileSelectionCancelled() without doing some // rewrites of the DownloadManager queues. virtual void OffThreadCancel(DownloadFileManager* file_manager) = 0; // Manage data owned by other subsystems associated with the // DownloadItem. By custom, key is the address of a // static char subsystem_specific_string[] = ".."; defined // in the subsystem, but the only requirement of this interface // is that the key be unique over all data stored with this // DownloadItem. // // Note that SetExternalData takes ownership of the // passed object; it will be destroyed when the DownloadItem is. // If an object is already held by the DownloadItem associated with // the passed key, it will be destroyed if overwriten by a new pointer // (overwrites by the same pointer are ignored). virtual ExternalData* GetExternalData(const void* key) = 0; virtual const ExternalData* GetExternalData(const void* key) const = 0; virtual void SetExternalData(const void* key, ExternalData* data) = 0; virtual std::string DebugString(bool verbose) const = 0; virtual void MockDownloadOpenForTesting() = 0; }; } // namespace content #endif // CONTENT_PUBLIC_BROWSER_DOWNLOAD_ITEM_H_