1// Copyright 2013 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#ifndef CONTENT_SHELL_BROWSER_SHELL_DOWNLOAD_MANAGER_DELEGATE_H_
6#define CONTENT_SHELL_BROWSER_SHELL_DOWNLOAD_MANAGER_DELEGATE_H_
7
8#include "base/callback_forward.h"
9#include "base/compiler_specific.h"
10#include "base/memory/weak_ptr.h"
11#include "content/public/browser/download_manager_delegate.h"
12
13namespace content {
14
15class DownloadManager;
16
17class ShellDownloadManagerDelegate : public DownloadManagerDelegate {
18 public:
19  ShellDownloadManagerDelegate();
20  virtual ~ShellDownloadManagerDelegate();
21
22  void SetDownloadManager(DownloadManager* manager);
23
24  virtual void Shutdown() OVERRIDE;
25  virtual bool DetermineDownloadTarget(
26      DownloadItem* download,
27      const DownloadTargetCallback& callback) OVERRIDE;
28  virtual bool ShouldOpenDownload(
29      DownloadItem* item,
30      const DownloadOpenDelayedCallback& callback) OVERRIDE;
31  virtual void GetNextId(const DownloadIdCallback& callback) OVERRIDE;
32
33  // Inhibits prompting and sets the default download path.
34  void SetDownloadBehaviorForTesting(
35      const base::FilePath& default_download_path);
36
37 private:
38  friend class base::RefCountedThreadSafe<ShellDownloadManagerDelegate>;
39
40  typedef base::Callback<void(const base::FilePath&)>
41      FilenameDeterminedCallback;
42
43  static void GenerateFilename(const GURL& url,
44                               const std::string& content_disposition,
45                               const std::string& suggested_filename,
46                               const std::string& mime_type,
47                               const base::FilePath& suggested_directory,
48                               const FilenameDeterminedCallback& callback);
49  void OnDownloadPathGenerated(uint32 download_id,
50                               const DownloadTargetCallback& callback,
51                               const base::FilePath& suggested_path);
52  void ChooseDownloadPath(uint32 download_id,
53                          const DownloadTargetCallback& callback,
54                          const base::FilePath& suggested_path);
55
56  DownloadManager* download_manager_;
57  base::FilePath default_download_path_;
58  bool suppress_prompting_;
59  base::WeakPtrFactory<ShellDownloadManagerDelegate> weak_ptr_factory_;
60
61  DISALLOW_COPY_AND_ASSIGN(ShellDownloadManagerDelegate);
62};
63
64}  // namespace content
65
66#endif  // CONTENT_SHELL_BROWSER_SHELL_DOWNLOAD_MANAGER_DELEGATE_H_
67