• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Copyright (c) 2011 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 #pragma once
8 
9 #include <map>
10 #include <string>
11 
12 #include "base/gtest_prod_util.h"
13 #include "base/memory/scoped_ptr.h"
14 #include "base/memory/singleton.h"
15 #include "base/timer.h"
16 #include "base/values.h"
17 #include "chrome/common/net/url_fetcher.h"
18 #include "googleurl/src/gurl.h"
19 
20 class DictionaryValue;
21 class FilePath;
22 class ListValue;
23 class PrefService;
24 
25 namespace base {
26   class Time;
27 }
28 
29 namespace chromeos {
30 
31 class SystemAccess;
32 
33 // Base class for OEM customization document classes.
34 class CustomizationDocument {
35  public:
~CustomizationDocument()36   virtual ~CustomizationDocument() {}
37 
38   // Return true if the document was successfully fetched and parsed.
IsReady()39   bool IsReady() const { return root_.get(); }
40 
41  protected:
CustomizationDocument()42   CustomizationDocument() {}
43 
44   virtual bool LoadManifestFromFile(const FilePath& manifest_path);
45   virtual bool LoadManifestFromString(const std::string& manifest);
46 
47   std::string GetLocaleSpecificString(const std::string& locale,
48                                       const std::string& dictionary_name,
49                                       const std::string& entry_name) const;
50 
51   scoped_ptr<DictionaryValue> root_;
52 
53  private:
54   DISALLOW_COPY_AND_ASSIGN(CustomizationDocument);
55 };
56 
57 // OEM startup customization document class.
58 // Now StartupCustomizationDocument is loaded in c-tor so just after create it
59 // may be ready or not (if manifest is missing or corrupted) and this state
60 // won't be changed later (i.e. IsReady() always return the same value).
61 class StartupCustomizationDocument : public CustomizationDocument {
62  public:
63   static StartupCustomizationDocument* GetInstance();
64 
initial_locale()65   const std::string& initial_locale() const { return initial_locale_; }
initial_timezone()66   const std::string& initial_timezone() const { return initial_timezone_; }
keyboard_layout()67   const std::string& keyboard_layout() const { return keyboard_layout_; }
registration_url()68   const std::string& registration_url() const { return registration_url_; }
69 
70   std::string GetHelpPage(const std::string& locale) const;
71   std::string GetEULAPage(const std::string& locale) const;
72 
73  private:
74   FRIEND_TEST(StartupCustomizationDocumentTest, Basic);
75   FRIEND_TEST(StartupCustomizationDocumentTest, VPD);
76   FRIEND_TEST(StartupCustomizationDocumentTest, BadManifest);
77   friend struct DefaultSingletonTraits<StartupCustomizationDocument>;
78 
79   // C-tor for singleton construction.
80   StartupCustomizationDocument();
81 
82   // C-tor for test construction.
83   StartupCustomizationDocument(SystemAccess* system_access,
84                                const std::string& manifest);
85 
86   void Init(SystemAccess* system_access);
87 
88   // If |attr| exists in machine stat, assign it to |value|.
89   void InitFromMachineStatistic(const char* attr, std::string* value);
90 
91   std::string initial_locale_;
92   std::string initial_timezone_;
93   std::string keyboard_layout_;
94   std::string registration_url_;
95 
96   DISALLOW_COPY_AND_ASSIGN(StartupCustomizationDocument);
97 };
98 
99 // OEM services customization document class.
100 // ServicesCustomizationDocument is fetched from network or local file but on
101 // FILE thread therefore it may not be ready just after creation. Fetching of
102 // the manifest should be initiated outside this class by calling
103 // StartFetching() method. User of the file should check IsReady before use it.
104 class ServicesCustomizationDocument : public CustomizationDocument,
105                                       private URLFetcher::Delegate {
106  public:
107   // OEM specific carrier deal.
108   struct CarrierDeal {
109     explicit CarrierDeal(DictionaryValue* deal_dict);
110 
111     // Returns string with the specified |locale| and |id|.
112     // If there's no version for |locale|, default one is returned.
113     // If there's no string with specified |id|, empty string is returned.
114     std::string GetLocalizedString(const std::string& locale,
115                                    const std::string& id) const;
116 
117     std::string deal_locale;
118     std::string top_up_url;
119     int notification_count;
120     base::Time expire_date;
121     DictionaryValue* localized_strings;
122   };
123 
124   // Carrier ID (ex. "Verizon (us)") mapping to carrier deals.
125   typedef std::map<std::string, CarrierDeal*> CarrierDeals;
126 
127   static ServicesCustomizationDocument* GetInstance();
128 
129   // Registers preferences.
130   static void RegisterPrefs(PrefService* local_state);
131 
132   // Return true if the customization was applied. Customization is applied only
133   // once per machine.
134   static bool WasApplied();
135 
136   // Start fetching customization document.
137   void StartFetching();
138 
139   // Apply customization and save in machine options that customization was
140   // applied successfully. Return true if customization was applied.
141   bool ApplyCustomization();
142 
143   std::string GetInitialStartPage(const std::string& locale) const;
144   std::string GetSupportPage(const std::string& locale) const;
145 
146   // Returns carrier deal by specified |carrier_id|.
147   // Also checks deal restrictions, such as deal locale (launch locale) and
148   // deal expiration date if |check_restrictions| is true.
149   const ServicesCustomizationDocument::CarrierDeal* GetCarrierDeal(
150       const std::string& carrier_id, bool check_restrictions) const;
151 
152  protected:
153   virtual bool LoadManifestFromString(const std::string& manifest) OVERRIDE;
154 
155  private:
156   FRIEND_TEST(ServicesCustomizationDocumentTest, Basic);
157   FRIEND_TEST(ServicesCustomizationDocumentTest, BadManifest);
158   FRIEND_TEST(ServicesCustomizationDocumentTest, DealOtherLocale);
159   FRIEND_TEST(ServicesCustomizationDocumentTest, NoDealRestrictions);
160   FRIEND_TEST(ServicesCustomizationDocumentTest, OldDeal);
161   friend struct DefaultSingletonTraits<ServicesCustomizationDocument>;
162 
163   // C-tor for singleton construction.
164   ServicesCustomizationDocument();
165 
166   // C-tor for test construction.
167   ServicesCustomizationDocument(const std::string& manifest,
168                                 const std::string& initial_locale);
169 
170   // Save applied state in machine settings.
171   static void SetApplied(bool val);
172 
173   // Overriden from URLFetcher::Delegate:
174   virtual void OnURLFetchComplete(const URLFetcher* source,
175                                   const GURL& url,
176                                   const net::URLRequestStatus& status,
177                                   int response_code,
178                                   const ResponseCookies& cookies,
179                                   const std::string& data);
180 
181   // Initiate file fetching.
182   void StartFileFetch();
183 
184   // Executes on FILE thread and reads file to string.
185   void ReadFileInBackground(const FilePath& file);
186 
187   // Services customization manifest URL.
188   GURL url_;
189 
190   // URLFetcher instance.
191   scoped_ptr<URLFetcher> url_fetcher_;
192 
193   // Timer to retry fetching file if network is not available.
194   base::OneShotTimer<ServicesCustomizationDocument> retry_timer_;
195 
196   // How many times we already tried to fetch customization manifest file.
197   int num_retries_;
198 
199   // Carrier-specific deals.
200   CarrierDeals carrier_deals_;
201 
202   // Initial locale value.
203   std::string initial_locale_;
204 
205   DISALLOW_COPY_AND_ASSIGN(ServicesCustomizationDocument);
206 };
207 
208 }  // namespace chromeos
209 
210 #endif  // CHROME_BROWSER_CHROMEOS_CUSTOMIZATION_DOCUMENT_H_
211