summaryrefslogtreecommitdiffstats
path: root/chrome
diff options
context:
space:
mode:
authordpolukhin@chromium.org <dpolukhin@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2011-03-11 07:20:16 +0000
committerdpolukhin@chromium.org <dpolukhin@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2011-03-11 07:20:16 +0000
commita433a972da43bb77fc2204a15f11a928dfd9c221 (patch)
treec4f2dfcf53ee5b14f0bc1474cbfe3b45edb06daa /chrome
parente85ec21e64187b4e31957ff382d6e00b0c66b2c5 (diff)
downloadchromium_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.cc73
-rw-r--r--chrome/browser/chromeos/customization_document.h11
-rw-r--r--chrome/browser/chromeos/customization_document_unittest.cc33
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));
}