• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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_CHROMEOS_CUSTOMIZATION_DOCUMENT_H_
6 #define CHROME_BROWSER_CHROMEOS_CUSTOMIZATION_DOCUMENT_H_
7 
8 #include <string>
9 
10 #include "base/compiler_specific.h"
11 #include "base/gtest_prod_util.h"
12 #include "base/memory/scoped_ptr.h"
13 #include "base/memory/singleton.h"
14 #include "base/timer/timer.h"
15 #include "base/values.h"
16 #include "net/url_request/url_fetcher_delegate.h"
17 #include "url/gurl.h"
18 
19 class PrefRegistrySimple;
20 
21 namespace base {
22 class DictionaryValue;
23 class FilePath;
24 }
25 
26 namespace net {
27 class URLFetcher;
28 }
29 
30 namespace chromeos {
31 
32 namespace system {
33 class StatisticsProvider;
34 }  // system
35 
36 // Base class for OEM customization document classes.
37 class CustomizationDocument {
38  public:
39   virtual ~CustomizationDocument();
40 
41   // Return true if the document was successfully fetched and parsed.
IsReady()42   bool IsReady() const { return root_.get(); }
43 
44  protected:
45   explicit CustomizationDocument(const std::string& accepted_version);
46 
47   virtual bool LoadManifestFromFile(const base::FilePath& manifest_path);
48   virtual bool LoadManifestFromString(const std::string& manifest);
49 
50   std::string GetLocaleSpecificString(const std::string& locale,
51                                       const std::string& dictionary_name,
52                                       const std::string& entry_name) const;
53 
54   scoped_ptr<base::DictionaryValue> root_;
55 
56   // Value of the "version" attribute that is supported.
57   // Otherwise config is not loaded.
58   std::string accepted_version_;
59 
60  private:
61   DISALLOW_COPY_AND_ASSIGN(CustomizationDocument);
62 };
63 
64 // OEM startup customization document class.
65 // Now StartupCustomizationDocument is loaded in c-tor so just after create it
66 // may be ready or not (if manifest is missing or corrupted) and this state
67 // won't be changed later (i.e. IsReady() always return the same value).
68 class StartupCustomizationDocument : public CustomizationDocument {
69  public:
70   static StartupCustomizationDocument* GetInstance();
71 
72   std::string GetHelpPage(const std::string& locale) const;
73   std::string GetEULAPage(const std::string& locale) const;
74 
registration_url()75   const std::string& registration_url() const { return registration_url_; }
76 
77   // These methods can be called even if !IsReady(), in this case VPD values
78   // will be returned.
initial_locale()79   const std::string& initial_locale() const { return initial_locale_; }
initial_timezone()80   const std::string& initial_timezone() const { return initial_timezone_; }
keyboard_layout()81   const std::string& keyboard_layout() const { return keyboard_layout_; }
82 
83  private:
84   FRIEND_TEST_ALL_PREFIXES(StartupCustomizationDocumentTest, Basic);
85   FRIEND_TEST_ALL_PREFIXES(StartupCustomizationDocumentTest, VPD);
86   FRIEND_TEST_ALL_PREFIXES(StartupCustomizationDocumentTest, BadManifest);
87   friend struct DefaultSingletonTraits<StartupCustomizationDocument>;
88 
89   // C-tor for singleton construction.
90   StartupCustomizationDocument();
91 
92   // C-tor for test construction.
93   StartupCustomizationDocument(system::StatisticsProvider* provider,
94                                const std::string& manifest);
95 
96   virtual ~StartupCustomizationDocument();
97 
98   void Init(system::StatisticsProvider* provider);
99 
100   // If |attr| exists in machine stat, assign it to |value|.
101   void InitFromMachineStatistic(const char* attr, std::string* value);
102 
103   std::string initial_locale_;
104   std::string initial_timezone_;
105   std::string keyboard_layout_;
106   std::string registration_url_;
107 
108   DISALLOW_COPY_AND_ASSIGN(StartupCustomizationDocument);
109 };
110 
111 // OEM services customization document class.
112 // ServicesCustomizationDocument is fetched from network or local file but on
113 // FILE thread therefore it may not be ready just after creation. Fetching of
114 // the manifest should be initiated outside this class by calling
115 // StartFetching() method. User of the file should check IsReady before use it.
116 class ServicesCustomizationDocument : public CustomizationDocument,
117                                       private net::URLFetcherDelegate {
118  public:
119   static ServicesCustomizationDocument* GetInstance();
120 
121   // Registers preferences.
122   static void RegisterPrefs(PrefRegistrySimple* registry);
123 
124   // Return true if the customization was applied. Customization is applied only
125   // once per machine.
126   static bool WasApplied();
127 
128   // Start fetching customization document.
129   void StartFetching();
130 
131   // Apply customization and save in machine options that customization was
132   // applied successfully. Return true if customization was applied.
133   bool ApplyCustomization();
134 
135   std::string GetInitialStartPage(const std::string& locale) const;
136   std::string GetSupportPage(const std::string& locale) const;
137 
138  private:
139   FRIEND_TEST_ALL_PREFIXES(ServicesCustomizationDocumentTest, Basic);
140   FRIEND_TEST_ALL_PREFIXES(ServicesCustomizationDocumentTest, BadManifest);
141   friend struct DefaultSingletonTraits<ServicesCustomizationDocument>;
142 
143   // C-tor for singleton construction.
144   ServicesCustomizationDocument();
145 
146   // C-tor for test construction.
147   explicit ServicesCustomizationDocument(const std::string& manifest);
148 
149   virtual ~ServicesCustomizationDocument();
150 
151   // Save applied state in machine settings.
152   static void SetApplied(bool val);
153 
154   // Overriden from net::URLFetcherDelegate:
155   virtual void OnURLFetchComplete(const net::URLFetcher* source) OVERRIDE;
156 
157   // Initiate file fetching.
158   void StartFileFetch();
159 
160   // Executes on FILE thread and reads file to string.
161   void ReadFileInBackground(const base::FilePath& file);
162 
163   // Services customization manifest URL.
164   GURL url_;
165 
166   // URLFetcher instance.
167   scoped_ptr<net::URLFetcher> url_fetcher_;
168 
169   // Timer to retry fetching file if network is not available.
170   base::OneShotTimer<ServicesCustomizationDocument> retry_timer_;
171 
172   // How many times we already tried to fetch customization manifest file.
173   int num_retries_;
174 
175   DISALLOW_COPY_AND_ASSIGN(ServicesCustomizationDocument);
176 };
177 
178 }  // namespace chromeos
179 
180 #endif  // CHROME_BROWSER_CHROMEOS_CUSTOMIZATION_DOCUMENT_H_
181