15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef CONTENT_PUBLIC_BROWSER_DOWNLOAD_MANAGER_DELEGATE_H_ 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CONTENT_PUBLIC_BROWSER_DOWNLOAD_MANAGER_DELEGATE_H_ 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/basictypes.h" 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/callback.h" 102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/files/file_path.h" 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/logging.h" 12eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "base/time/time.h" 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/common/content_export.h" 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/download_danger_type.h" 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/download_item.h" 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/save_page_type.h" 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace content { 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class BrowserContext; 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class WebContents; 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Called by SavePackage when it creates a DownloadItem. 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef base::Callback<void(DownloadItem*)> 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SavePackageDownloadCreatedCallback; 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Will be called asynchronously with the results of the ChooseSavePath 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// operation. If the delegate wants notification of the download item created 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// in response to this operation, the SavePackageDownloadCreatedCallback will be 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// non-null. 312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)typedef base::Callback<void(const base::FilePath&, 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SavePageType, 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const SavePackageDownloadCreatedCallback&)> 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SavePackagePathPickedCallback; 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Called with the results of DetermineDownloadTarget(). If the delegate decides 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// to cancel the download, then |target_path| should be set to an empty path. If 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// |target_path| is non-empty, then |intermediate_path| is required to be 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// non-empty and specify the path to the intermediate file (which could be the 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// same as |target_path|). Both |target_path| and |intermediate_path| are 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// expected to in the same directory. 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef base::Callback<void( 432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::FilePath& target_path, 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DownloadItem::TargetDisposition disposition, 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DownloadDangerType danger_type, 462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::FilePath& intermediate_path)> DownloadTargetCallback; 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Called when a download delayed by the delegate has completed. 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef base::Callback<void(bool)> DownloadOpenDelayedCallback; 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 517dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch// Called with the result of CheckForFileExistence(). 522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)typedef base::Callback<void(bool result)> CheckForFileExistenceCallback; 532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 547dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochtypedef base::Callback<void(uint32)> DownloadIdCallback; 557dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Browser's download manager: manages all downloads and destination view. 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class CONTENT_EXPORT DownloadManagerDelegate { 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Lets the delegate know that the download manager is shutting down. 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void Shutdown() {} 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 627dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // Runs |callback| with a new download id when possible, perhaps 637dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // synchronously. 647dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch virtual void GetNextId(const DownloadIdCallback& callback); 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Called to notify the delegate that a new download |item| requires a 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // download target to be determined. The delegate should return |true| if it 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // will determine the target information and will invoke |callback|. The 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // callback may be invoked directly (synchronously). If this function returns 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // |false|, the download manager will continue the download using a default 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // target path. 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The state of the |item| shouldn't be modified during the process of 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // filename determination save for external data (GetExternalData() / 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // SetExternalData()). 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If the download should be canceled, |callback| should be invoked with an 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // empty |target_path| argument. 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual bool DetermineDownloadTarget(DownloadItem* item, 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const DownloadTargetCallback& callback); 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Tests if a file type should be opened automatically. 832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual bool ShouldOpenFileBasedOnExtension(const base::FilePath& path); 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Allows the delegate to delay completion of the download. This function 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // will either return true (in which case the download may complete) 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // or will call the callback passed when the download is ready for 882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // completion. This routine may be called multiple times; once the callback 892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // has been called or the function has returned true for a particular 902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // download it should continue to return true for that download. 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual bool ShouldCompleteDownload( 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DownloadItem* item, 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const base::Closure& complete_callback); 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Allows the delegate to override opening the download. If this function 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // returns false, the delegate needs to call callback when it's done 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // with the item, and is responsible for opening it. This function is called 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // after the final rename, but before the download state is set to COMPLETED. 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual bool ShouldOpenDownload(DownloadItem* item, 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const DownloadOpenDelayedCallback& callback); 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Returns true if we need to generate a binary hash for downloads. 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual bool GenerateFileHash(); 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Retrieve the directories to save html pages and downloads to. 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void GetSaveDir(BrowserContext* browser_context, 1072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath* website_save_dir, 1082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath* download_save_dir, 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool* skip_dir_check) {} 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Asks the user for the path to save a page. The delegate calls the callback 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // to give the answer. 1132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void ChooseSavePath( 1142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) WebContents* web_contents, 1152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::FilePath& suggested_path, 1162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::FilePath::StringType& default_extension, 1172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool can_save_as_complete, 1182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const SavePackagePathPickedCallback& callback) { 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Opens the file associated with this download. 1222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void OpenDownload(DownloadItem* download) {} 1232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Shows the download via the OS shell. 1252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void ShowDownloadInShell(DownloadItem* download) {} 1262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Checks whether a downloaded file still exists. 1282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void CheckForFileExistence( 1292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DownloadItem* download, 1302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const CheckForFileExistenceCallback& callback) {} 1312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 132ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch // Return a GUID string used for identifying the application to the 133ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch // system AV function for scanning downloaded files. If an empty 134ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch // or invalid GUID string is returned, no client identification 135ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch // will be given to the AV function. 136ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch virtual std::string ApplicationClientIdForFileScanning() const; 137ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected: 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~DownloadManagerDelegate(); 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace content 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif // CONTENT_PUBLIC_BROWSER_DOWNLOAD_MANAGER_DELEGATE_H_ 145