diff options
author | dpolukhin@chromium.org <dpolukhin@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2011-03-11 07:20:16 +0000 |
---|---|---|
committer | dpolukhin@chromium.org <dpolukhin@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2011-03-11 07:20:16 +0000 |
commit | a433a972da43bb77fc2204a15f11a928dfd9c221 (patch) | |
tree | c4f2dfcf53ee5b14f0bc1474cbfe3b45edb06daa /chrome | |
parent | e85ec21e64187b4e31957ff382d6e00b0c66b2c5 (diff) | |
download | chromium_src-a433a972da43bb77fc2204a15f11a928dfd9c221.zip chromium_src-a433a972da43bb77fc2204a15f11a928dfd9c221.tar.gz chromium_src-a433a972da43bb77fc2204a15f11a928dfd9c221.tar.bz2 |
Set OEM startup parameters based on value from VPD
BUG=chromium-os:12355
TEST=StartupCustomizationDocumentTest.VPD
Review URL: http://codereview.chromium.org/6657035
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@77795 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome')
-rw-r--r-- | chrome/browser/chromeos/customization_document.cc | 73 | ||||
-rw-r--r-- | chrome/browser/chromeos/customization_document.h | 11 | ||||
-rw-r--r-- | chrome/browser/chromeos/customization_document_unittest.cc | 33 |
3 files changed, 114 insertions, 3 deletions
diff --git a/chrome/browser/chromeos/customization_document.cc b/chrome/browser/chromeos/customization_document.cc index 19f3a29..04e4460 100644 --- a/chrome/browser/chromeos/customization_document.cc +++ b/chrome/browser/chromeos/customization_document.cc @@ -7,6 +7,7 @@ #include "base/file_util.h" #include "base/json/json_reader.h" #include "base/logging.h" +#include "base/string_tokenizer.h" #include "base/string_util.h" // Manifest attributes names. @@ -31,6 +32,7 @@ const char kSupportPageAttr[] = "support_page"; const char kAcceptedManifestVersion[] = "1.0"; const char kHWIDPath[] = "/sys/devices/platform/chromeos_acpi/HWID"; +const char kVPDPath[] = "/var/log/vpd_2.0.txt"; } // anonymous namespace @@ -134,13 +136,18 @@ bool StartupCustomizationDocument::LoadManifestFromString( LOG(ERROR) << "Can't read HWID from " << kHWIDPath; } - // TODO(dpolukhin): read initial locale and timezone from VPD. - // http://crosbug.com/12355 + VPDMap vpd_map; + if (ParseVPD(GetVPD(), &vpd_map)) { + InitFromVPD(vpd_map, kInitialLocaleAttr, &initial_locale_); + InitFromVPD(vpd_map, kInitialTimezoneAttr, &initial_timezone_); + InitFromVPD(vpd_map, kKeyboardLayoutAttr, &keyboard_layout_); + } return true; } std::string StartupCustomizationDocument::GetHWID() const { + // TODO(dpolukhin): move to SystemLibrary to be reusable. std::string hwid; FilePath hwid_file_path(kHWIDPath); if (!file_util::ReadFileToString(hwid_file_path, &hwid)) @@ -148,6 +155,68 @@ std::string StartupCustomizationDocument::GetHWID() const { return hwid; } +std::string StartupCustomizationDocument::GetVPD() const { + // TODO(dpolukhin): move to SystemLibrary to be reusable. + std::string vpd; + FilePath vpd_file_path(kVPDPath); + if (!file_util::ReadFileToString(vpd_file_path, &vpd)) + LOG(ERROR) << "Can't read VPD from " << kVPDPath; + return vpd; +} + +bool StartupCustomizationDocument::ParseVPD(const std::string& vpd_string, + VPDMap* vpd_map) { + // TODO(dpolukhin): move to SystemLibrary to be reusable. + const char kDelimiterChars[] = "= \n"; + const char kQuotaChars[] = "\"\'"; + + StringTokenizer tok(vpd_string, kDelimiterChars); + tok.set_quote_chars(kQuotaChars); + tok.set_options(StringTokenizer::RETURN_DELIMS); + bool next_is_equal = false; + bool next_is_value = false; + std::string name; + std::string value; + while (tok.GetNext()) { + // Skip all delimiters that are not '='. + if (tok.token_is_delim() && tok.token() != "=") + continue; + + if (next_is_equal) { + if (tok.token() != "=") + break; + + next_is_equal = false; + next_is_value = true; + } else if (next_is_value) { + TrimString(tok.token(), kQuotaChars, &value); + next_is_value = false; + + if (!vpd_map->insert(VPDMap::value_type(name, value)).second) { + LOG(ERROR) << "Identical keys in VPD " << name; + return false; + } + } else { + TrimString(tok.token(), kQuotaChars, &name); + next_is_equal = true; + } + } + + if (next_is_equal || next_is_value) { + LOG(ERROR) << "Syntax error in VPD " << vpd_string; + return false; + } + + return true; +} + +void StartupCustomizationDocument::InitFromVPD( + const VPDMap& vpd_map, const char* attr, std::string* value) { + VPDMap::const_iterator it = vpd_map.find(attr); + if (it != vpd_map.end()) + *value = it->second; +} + std::string StartupCustomizationDocument::GetHelpPage( const std::string& locale) const { return GetLocaleSpecificString(locale, kSetupContentAttr, kHelpPageAttr); diff --git a/chrome/browser/chromeos/customization_document.h b/chrome/browser/chromeos/customization_document.h index 9ef954f..019ca74 100644 --- a/chrome/browser/chromeos/customization_document.h +++ b/chrome/browser/chromeos/customization_document.h @@ -53,9 +53,20 @@ class StartupCustomizationDocument : public CustomizationDocument { std::string GetEULAPage(const std::string& locale) const; private: + typedef std::map<std::string, std::string> VPDMap; + // Returns HWID for the machine. Declared as virtual to override in tests. virtual std::string GetHWID() const; + // Returns VPD as string. Declared as virtual to override in tests. + virtual std::string GetVPD() const; + + // Parse VPD file as string and initialize |vpd_map|. + bool ParseVPD(const std::string& vpd_string, VPDMap* vpd_map); + + // If |attr| exists in |vpd_map|, assign it value to |value|; + void InitFromVPD(const VPDMap& vpd_map, const char* attr, std::string* value); + std::string initial_locale_; std::string initial_timezone_; std::string keyboard_layout_; diff --git a/chrome/browser/chromeos/customization_document_unittest.cc b/chrome/browser/chromeos/customization_document_unittest.cc index 43d78870..64d1e6a 100644 --- a/chrome/browser/chromeos/customization_document_unittest.cc +++ b/chrome/browser/chromeos/customization_document_unittest.cc @@ -66,11 +66,34 @@ const char kGoodServicesManifest[] = " }," "}"; +const char kHWID[] = "Mario 123-456"; + +const char kVPD[] = + "\"initial_locale\"=\"ja\"\n" + "\"initial_timezone\"=\"Asia/Tokyo\"\n" + "\"keyboard_layout\"=\"mozc-jp\"\n"; + class TestDocument : public chromeos::StartupCustomizationDocument { + public: + TestDocument() : hwid_(kHWID), vpd_() { + } + + void set_hwid(const std::string& hwid) { hwid_ = hwid; } + void set_vpd(const std::string& vpd) { vpd_ = vpd; } + private: virtual std::string GetHWID() const { - return "Mario 123-456"; + return hwid_; + } + + virtual std::string GetVPD() const { + return vpd_; } + + std::string hwid_; + std::string vpd_; + + DISALLOW_COPY_AND_ASSIGN(TestDocument); }; } // anonymous namespace @@ -103,6 +126,14 @@ TEST_F(StartupCustomizationDocumentTest, Basic) { "file:///opt/oem/eula/en/eula.html"); } +TEST_F(StartupCustomizationDocumentTest, VPD) { + customization_.set_vpd(kVPD); + EXPECT_TRUE(customization_.LoadManifestFromString(kGoodStartupManifest)); + EXPECT_EQ(customization_.initial_locale(), "ja"); + EXPECT_EQ(customization_.initial_timezone(), "Asia/Tokyo"); + EXPECT_EQ(customization_.keyboard_layout(), "mozc-jp"); +} + TEST_F(StartupCustomizationDocumentTest, BadManifest) { EXPECT_FALSE(customization_.LoadManifestFromString(kBadManifest)); } |