Index: chrome/browser/chromeos/system_access.cc |
=================================================================== |
--- chrome/browser/chromeos/system_access.cc (revision 83304) |
+++ chrome/browser/chromeos/system_access.cc (working copy) |
@@ -4,48 +4,82 @@ |
#include "chrome/browser/chromeos/system_access.h" |
-#include "base/basictypes.h" |
-#include "base/command_line.h" |
#include "base/file_path.h" |
#include "base/file_util.h" |
#include "base/logging.h" |
-#include "base/process_util.h" |
-#include "base/string_tokenizer.h" |
-#include "base/string_util.h" |
-#include "base/threading/thread_restrictions.h" |
+#include "base/observer_list.h" |
+#include "base/memory/scoped_ptr.h" |
+#include "base/memory/singleton.h" |
#include "base/utf_string_conversions.h" |
+#include "chrome/browser/chromeos/name_value_pairs_parser.h" |
namespace chromeos { // NOLINT |
namespace { // NOLINT |
// The filepath to the timezone file that symlinks to the actual timezone file. |
-static const char kTimezoneSymlink[] = "/var/lib/timezone/localtime"; |
-static const char kTimezoneSymlink2[] = "/var/lib/timezone/localtime2"; |
+const char kTimezoneSymlink[] = "/var/lib/timezone/localtime"; |
+const char kTimezoneSymlink2[] = "/var/lib/timezone/localtime2"; |
// The directory that contains all the timezone files. So for timezone |
// "US/Pacific", the actual timezone file is: "/usr/share/zoneinfo/US/Pacific" |
-static const char kTimezoneFilesDir[] = "/usr/share/zoneinfo/"; |
+const char kTimezoneFilesDir[] = "/usr/share/zoneinfo/"; |
// The system command that returns the hardware class. |
-static const char kHardwareClassKey[] = "hardware_class"; |
-static const char* kHardwareClassTool[] = { "/usr/bin/hardware_class" }; |
-static const char kUnknownHardwareClass[] = "unknown"; |
+const char kHardwareClassKey[] = "hardware_class"; |
+const char* kHardwareClassTool[] = { "/usr/bin/hardware_class" }; |
+const char kUnknownHardwareClass[] = "unknown"; |
// Command to get machine hardware info and key/value delimiters. |
// /tmp/machine-info is generated by platform/init/chromeos_startup. |
-static const char* kMachineHardwareInfoTool[] = { "cat", "/tmp/machine-info" }; |
-static const char kMachineHardwareInfoEq[] = "="; |
-static const char kMachineHardwareInfoDelim[] = " \n"; |
+const char* kMachineHardwareInfoTool[] = { "cat", "/tmp/machine-info" }; |
+const char kMachineHardwareInfoEq[] = "="; |
+const char kMachineHardwareInfoDelim[] = " \n"; |
// Command to get machine OS info and key/value delimiters. |
-static const char* kMachineOSInfoTool[] = { "cat", "/etc/lsb-release" }; |
-static const char kMachineOSInfoEq[] = "="; |
-static const char kMachineOSInfoDelim[] = "\n"; |
+const char* kMachineOSInfoTool[] = { "cat", "/etc/lsb-release" }; |
+const char kMachineOSInfoEq[] = "="; |
+const char kMachineOSInfoDelim[] = "\n"; |
+// Command to get HWID and key. |
+const char kHwidKey[] = "hwid"; |
+const char* kHwidTool[] = { "cat", "/sys/devices/platform/chromeos_acpi/HWID" }; |
+ |
+// Command to get VPD info and key/value delimiters. |
+const char* kVpdTool[] = { "cat", "/var/log/vpd_2.0.txt" }; |
+const char kVpdEq[] = "="; |
+const char kVpdDelim[] = "\n"; |
+ |
// Fallback time zone ID used in case of an unexpected error. |
-static const char kFallbackTimeZoneId[] = "America/Los_Angeles"; |
+const char kFallbackTimeZoneId[] = "America/Los_Angeles"; |
+class SystemAccessImpl : public SystemAccess { |
+ public: |
+ // SystemAccess.implementation: |
+ virtual const icu::TimeZone& GetTimezone(); |
+ virtual void SetTimezone(const icu::TimeZone& timezone); |
+ virtual bool GetMachineStatistic(const std::string& name, |
+ std::string* result); |
+ virtual void AddObserver(Observer* observer); |
+ virtual void RemoveObserver(Observer* observer); |
+ |
+ static SystemAccessImpl* GetInstance(); |
+ |
+ private: |
+ friend struct DefaultSingletonTraits<SystemAccessImpl>; |
+ |
+ SystemAccessImpl(); |
+ |
+ // Updates the machine statistcs by examining the system. |
+ void UpdateMachineStatistics(); |
+ |
+ scoped_ptr<icu::TimeZone> timezone_; |
+ ObserverList<Observer> observers_; |
+ NameValuePairsParser::NameValueMap machine_info_; |
+ |
+ DISALLOW_COPY_AND_ASSIGN(SystemAccessImpl); |
+}; |
+ |
std::string GetTimezoneIDAsString() { |
// Look at kTimezoneSymlink, see which timezone we are symlinked to. |
char buf[256]; |
@@ -103,17 +137,11 @@ |
} |
} |
-} // namespace |
- |
-SystemAccess* SystemAccess::GetInstance() { |
- return Singleton<SystemAccess, DefaultSingletonTraits<SystemAccess> >::get(); |
-} |
- |
-const icu::TimeZone& SystemAccess::GetTimezone() { |
+const icu::TimeZone& SystemAccessImpl::GetTimezone() { |
return *timezone_.get(); |
} |
-void SystemAccess::SetTimezone(const icu::TimeZone& timezone) { |
+void SystemAccessImpl::SetTimezone(const icu::TimeZone& timezone) { |
timezone_.reset(timezone.clone()); |
icu::UnicodeString unicode; |
timezone.getID(unicode); |
@@ -125,9 +153,9 @@ |
FOR_EACH_OBSERVER(Observer, observers_, TimezoneChanged(timezone)); |
} |
-bool SystemAccess::GetMachineStatistic( |
+bool SystemAccessImpl::GetMachineStatistic( |
const std::string& name, std::string* result) { |
- MachineInfo::iterator iter = machine_info_.find(name); |
+ NameValuePairsParser::NameValueMap::iterator iter = machine_info_.find(name); |
if (iter != machine_info_.end()) { |
*result = iter->second; |
return true; |
@@ -135,15 +163,15 @@ |
return false; |
} |
-void SystemAccess::AddObserver(Observer* observer) { |
+void SystemAccessImpl::AddObserver(Observer* observer) { |
observers_.AddObserver(observer); |
} |
-void SystemAccess::RemoveObserver(Observer* observer) { |
+void SystemAccessImpl::RemoveObserver(Observer* observer) { |
observers_.RemoveObserver(observer); |
} |
-SystemAccess::SystemAccess() { |
+SystemAccessImpl::SystemAccessImpl() { |
// Get Statistics |
UpdateMachineStatistics(); |
// Get Timezone |
@@ -159,7 +187,7 @@ |
VLOG(1) << "Timezone is " << id; |
} |
-void SystemAccess::UpdateMachineStatistics() { |
+void SystemAccessImpl::UpdateMachineStatistics() { |
NameValuePairsParser parser(&machine_info_); |
if (!parser.GetSingleValueFromTool(arraysize(kHardwareClassTool), |
kHardwareClassTool, |
@@ -175,87 +203,20 @@ |
kMachineOSInfoTool, |
kMachineOSInfoEq, |
kMachineOSInfoDelim); |
+ parser.GetSingleValueFromTool(arraysize(kHwidTool), kHwidTool, kHwidKey); |
+ parser.ParseNameValuePairsFromTool( |
+ arraysize(kVpdTool), kVpdTool, kVpdEq, kVpdDelim); |
} |
-NameValuePairsParser::NameValuePairsParser(MachineInfo* machine_info) |
- : machine_info_(machine_info) { |
+SystemAccessImpl* SystemAccessImpl::GetInstance() { |
+ return Singleton<SystemAccessImpl, |
+ DefaultSingletonTraits<SystemAccessImpl> >::get(); |
} |
-void NameValuePairsParser::AddNameValuePair(const std::string& key, |
- const std::string& value) { |
- (*machine_info_)[key] = value; |
- VLOG(1) << "name: " << key << ", value: " << value; |
-} |
+} // namespace |
-bool NameValuePairsParser::ParseNameValuePairs(const std::string& in_string, |
- const std::string& eq, |
- const std::string& delim) { |
- // Set up the pair tokenizer. |
- StringTokenizer pair_toks(in_string, delim); |
- pair_toks.set_quote_chars("\""); |
- // Process token pairs. |
- while (pair_toks.GetNext()) { |
- std::string pair(pair_toks.token()); |
- if (pair.find(eq) == 0) { |
- LOG(WARNING) << "Empty key: '" << pair << "'. Aborting."; |
- return false; |
- } |
- StringTokenizer keyvalue(pair, eq); |
- std::string key,value; |
- if (keyvalue.GetNext()) { |
- key = keyvalue.token(); |
- if (keyvalue.GetNext()) { |
- value = keyvalue.token(); |
- if (keyvalue.GetNext()) { |
- LOG(WARNING) << "Multiple key tokens: '" << pair << "'. Aborting."; |
- return false; |
- } |
- } |
- } |
- if (key.empty()) { |
- LOG(WARNING) << "Invalid token pair: '" << pair << "'. Aborting."; |
- return false; |
- } |
- AddNameValuePair(key, value); |
- } |
- return true; |
+SystemAccess* SystemAccess::GetInstance() { |
+ return SystemAccessImpl::GetInstance(); |
} |
-bool NameValuePairsParser::GetSingleValueFromTool(int argc, |
- const char* argv[], |
- const std::string& key) { |
- CommandLine command_line(argc, argv); |
- std::string output_string; |
- // TODO(stevenjb,satorux): Make this non blocking: crosbug.com/5603. |
- base::ThreadRestrictions::ScopedAllowIO allow_io_for_thread_join; |
- if (argc < 1 || !base::GetAppOutput(command_line, &output_string)) { |
- LOG(WARNING) << "Error excuting: " << command_line.command_line_string(); |
- return false; |
- } |
- TrimWhitespaceASCII(output_string, TRIM_ALL, &output_string); |
- AddNameValuePair(key, output_string); |
- return true; |
-} |
- |
-bool NameValuePairsParser::ParseNameValuePairsFromTool( |
- int argc, |
- const char* argv[], |
- const std::string& eq, |
- const std::string& delim) { |
- CommandLine command_line(argc, argv); |
- std::string output_string; |
- // TODO(stevenjb,satorux): Make this non blocking: crosbug.com/5603. |
- base::ThreadRestrictions::ScopedAllowIO allow_io_for_thread_join; |
- if (argc < 1 || !base::GetAppOutput(command_line, &output_string)) { |
- LOG(WARNING) << "Error excuting: " << command_line.command_line_string(); |
- return false; |
- } |
- if (!ParseNameValuePairs(output_string, eq, delim)) { |
- LOG(WARNING) << "Error parsing values while excuting: " |
- << command_line.command_line_string(); |
- return false; |
- } |
- return true; |
-} |
- |
} // namespace chromeos |