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