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 13 class PrefService; 14 class Profile; 15 16 namespace content { 17 class BrowserContext; 18 class DownloadManager; 19 } 20 21 namespace user_prefs { 22 class PrefRegistrySyncable; 23 } 24 25 // Stores all download-related preferences. 26 class 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