// Copyright (c) 2011 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #ifndef CHROME_BROWSER_CHROMEOS_CUSTOMIZATION_DOCUMENT_H_ #define CHROME_BROWSER_CHROMEOS_CUSTOMIZATION_DOCUMENT_H_ #pragma once #include #include #include "base/gtest_prod_util.h" #include "base/memory/scoped_ptr.h" #include "base/memory/singleton.h" #include "base/timer.h" #include "base/values.h" #include "chrome/common/net/url_fetcher.h" #include "googleurl/src/gurl.h" class DictionaryValue; class FilePath; class ListValue; class PrefService; namespace base { class Time; } namespace chromeos { class SystemAccess; // Base class for OEM customization document classes. class CustomizationDocument { public: virtual ~CustomizationDocument() {} // Return true if the document was successfully fetched and parsed. bool IsReady() const { return root_.get(); } protected: CustomizationDocument() {} virtual bool LoadManifestFromFile(const FilePath& manifest_path); virtual bool LoadManifestFromString(const std::string& manifest); std::string GetLocaleSpecificString(const std::string& locale, const std::string& dictionary_name, const std::string& entry_name) const; scoped_ptr root_; private: DISALLOW_COPY_AND_ASSIGN(CustomizationDocument); }; // OEM startup customization document class. // Now StartupCustomizationDocument is loaded in c-tor so just after create it // may be ready or not (if manifest is missing or corrupted) and this state // won't be changed later (i.e. IsReady() always return the same value). class StartupCustomizationDocument : public CustomizationDocument { public: static StartupCustomizationDocument* GetInstance(); const std::string& initial_locale() const { return initial_locale_; } const std::string& initial_timezone() const { return initial_timezone_; } const std::string& keyboard_layout() const { return keyboard_layout_; } const std::string& registration_url() const { return registration_url_; } std::string GetHelpPage(const std::string& locale) const; std::string GetEULAPage(const std::string& locale) const; private: FRIEND_TEST(StartupCustomizationDocumentTest, Basic); FRIEND_TEST(StartupCustomizationDocumentTest, VPD); FRIEND_TEST(StartupCustomizationDocumentTest, BadManifest); friend struct DefaultSingletonTraits; // C-tor for singleton construction. StartupCustomizationDocument(); // C-tor for test construction. StartupCustomizationDocument(SystemAccess* system_access, const std::string& manifest); void Init(SystemAccess* system_access); // If |attr| exists in machine stat, assign it to |value|. void InitFromMachineStatistic(const char* attr, std::string* value); std::string initial_locale_; std::string initial_timezone_; std::string keyboard_layout_; std::string registration_url_; DISALLOW_COPY_AND_ASSIGN(StartupCustomizationDocument); }; // OEM services customization document class. // ServicesCustomizationDocument is fetched from network or local file but on // FILE thread therefore it may not be ready just after creation. Fetching of // the manifest should be initiated outside this class by calling // StartFetching() method. User of the file should check IsReady before use it. class ServicesCustomizationDocument : public CustomizationDocument, private URLFetcher::Delegate { public: // OEM specific carrier deal. struct CarrierDeal { explicit CarrierDeal(DictionaryValue* deal_dict); // Returns string with the specified |locale| and |id|. // If there's no version for |locale|, default one is returned. // If there's no string with specified |id|, empty string is returned. std::string GetLocalizedString(const std::string& locale, const std::string& id) const; std::string deal_locale; std::string top_up_url; int notification_count; base::Time expire_date; DictionaryValue* localized_strings; }; // Carrier ID (ex. "Verizon (us)") mapping to carrier deals. typedef std::map CarrierDeals; static ServicesCustomizationDocument* GetInstance(); // Registers preferences. static void RegisterPrefs(PrefService* local_state); // Return true if the customization was applied. Customization is applied only // once per machine. static bool WasApplied(); // Start fetching customization document. void StartFetching(); // Apply customization and save in machine options that customization was // applied successfully. Return true if customization was applied. bool ApplyCustomization(); std::string GetInitialStartPage(const std::string& locale) const; std::string GetSupportPage(const std::string& locale) const; // Returns carrier deal by specified |carrier_id|. // Also checks deal restrictions, such as deal locale (launch locale) and // deal expiration date if |check_restrictions| is true. const ServicesCustomizationDocument::CarrierDeal* GetCarrierDeal( const std::string& carrier_id, bool check_restrictions) const; protected: virtual bool LoadManifestFromString(const std::string& manifest) OVERRIDE; private: FRIEND_TEST(ServicesCustomizationDocumentTest, Basic); FRIEND_TEST(ServicesCustomizationDocumentTest, BadManifest); FRIEND_TEST(ServicesCustomizationDocumentTest, DealOtherLocale); FRIEND_TEST(ServicesCustomizationDocumentTest, NoDealRestrictions); FRIEND_TEST(ServicesCustomizationDocumentTest, OldDeal); friend struct DefaultSingletonTraits; // C-tor for singleton construction. ServicesCustomizationDocument(); // C-tor for test construction. ServicesCustomizationDocument(const std::string& manifest, const std::string& initial_locale); // Save applied state in machine settings. static void SetApplied(bool val); // Overriden from URLFetcher::Delegate: virtual void OnURLFetchComplete(const URLFetcher* source, const GURL& url, const net::URLRequestStatus& status, int response_code, const ResponseCookies& cookies, const std::string& data); // Initiate file fetching. void StartFileFetch(); // Executes on FILE thread and reads file to string. void ReadFileInBackground(const FilePath& file); // Services customization manifest URL. GURL url_; // URLFetcher instance. scoped_ptr url_fetcher_; // Timer to retry fetching file if network is not available. base::OneShotTimer retry_timer_; // How many times we already tried to fetch customization manifest file. int num_retries_; // Carrier-specific deals. CarrierDeals carrier_deals_; // Initial locale value. std::string initial_locale_; DISALLOW_COPY_AND_ASSIGN(ServicesCustomizationDocument); }; } // namespace chromeos #endif // CHROME_BROWSER_CHROMEOS_CUSTOMIZATION_DOCUMENT_H_