1// Copyright (c) 2012 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 CHROME_BROWSER_DOWNLOAD_DOWNLOAD_PREFS_H_
6#define CHROME_BROWSER_DOWNLOAD_DOWNLOAD_PREFS_H_
7
8#include <set>
9
10#include "base/files/file_path.h"
11#include "base/prefs/pref_member.h"
12
13class PrefService;
14class Profile;
15
16namespace content {
17class BrowserContext;
18class DownloadManager;
19}
20
21namespace user_prefs {
22class PrefRegistrySyncable;
23}
24
25// Stores all download-related preferences.
26class DownloadPrefs {
27 public:
28  explicit DownloadPrefs(Profile* profile);
29  ~DownloadPrefs();
30
31  static void RegisterProfilePrefs(user_prefs::PrefRegistrySyncable* registry);
32
33  // Returns the default download directory.
34  static const base::FilePath& GetDefaultDownloadDirectory();
35
36  // Returns the default download directory for the current profile.
37  base::FilePath GetDefaultDownloadDirectoryForProfile() const;
38
39  // Returns the DownloadPrefs corresponding to the given DownloadManager
40  // or BrowserContext.
41  static DownloadPrefs* FromDownloadManager(
42      content::DownloadManager* download_manager);
43  static DownloadPrefs* FromBrowserContext(
44      content::BrowserContext* browser_context);
45
46  base::FilePath DownloadPath() const;
47  void SetDownloadPath(const base::FilePath& path);
48  base::FilePath SaveFilePath() const;
49  void SetSaveFilePath(const base::FilePath& path);
50  int save_file_type() const { return *save_file_type_; }
51  void SetSaveFileType(int type);
52
53  // Returns true if the prompt_for_download preference has been set and the
54  // download location is not managed (which means the user shouldn't be able
55  // to choose another download location).
56  bool PromptForDownload() const;
57
58  // Returns true if the download path preference is managed.
59  bool IsDownloadPathManaged() const;
60
61  // Returns true if there is at least one file extension registered
62  // for auto-open.
63  bool IsAutoOpenUsed() const;
64
65  // Returns true if |path| should be opened automatically based on
66  // |path.Extension()|.
67  bool IsAutoOpenEnabledBasedOnExtension(const base::FilePath& path) const;
68
69  // Enables auto-open based on file extension. Returns true on success.
70  // TODO(phajdan.jr): Add WARN_UNUSED_RESULT here.
71  bool EnableAutoOpenBasedOnExtension(const base::FilePath& file_name);
72
73  // Disables auto-open based on file extension.
74  void DisableAutoOpenBasedOnExtension(const base::FilePath& file_name);
75
76#if defined(OS_WIN)
77  // Store the user preference to disk. If |should_open| is true, also disable
78  // the built-in PDF plugin. If |should_open| is false, enable the PDF plugin.
79  void SetShouldOpenPdfInAdobeReader(bool should_open);
80
81  // Return whether the user prefers to open PDF downloads in Adobe Reader.
82  bool ShouldOpenPdfInAdobeReader() const;
83#endif
84
85  void ResetAutoOpen();
86
87 private:
88  void SaveAutoOpenState();
89
90  Profile* profile_;
91
92  BooleanPrefMember prompt_for_download_;
93  FilePathPrefMember download_path_;
94  FilePathPrefMember save_file_path_;
95  IntegerPrefMember save_file_type_;
96
97  // Set of file extensions to open at download completion.
98  struct AutoOpenCompareFunctor {
99    bool operator()(const base::FilePath::StringType& a,
100                    const base::FilePath::StringType& b) const;
101  };
102  typedef std::set<base::FilePath::StringType,
103                   AutoOpenCompareFunctor> AutoOpenSet;
104  AutoOpenSet auto_open_;
105
106#if defined(OS_WIN)
107  bool should_open_pdf_in_adobe_reader_;
108#endif
109
110  DISALLOW_COPY_AND_ASSIGN(DownloadPrefs);
111};
112
113#endif  // CHROME_BROWSER_DOWNLOAD_DOWNLOAD_PREFS_H_
114