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_VERSION_LOADER_H_ 6#define CHROME_BROWSER_CHROMEOS_VERSION_LOADER_H_ 7 8#include <string> 9 10#include "base/callback.h" 11#include "base/gtest_prod_util.h" 12#include "base/task/cancelable_task_tracker.h" 13 14namespace chromeos { 15 16// ChromeOSVersionLoader loads the version of Chrome OS from the file system. 17// Loading is done asynchronously in the blocking thread pool. Once loaded, 18// ChromeOSVersionLoader callback to a method of your choice with the version 19// (or an empty string if the version couldn't be found). 20// To use ChromeOSVersionLoader do the following: 21// 22// . In your class define a member field of type chromeos::VersionLoader and 23// base::CancelableTaskTracker. 24// . Define the callback method, something like: 25// void OnGetChromeOSVersion(const std::string& version); 26// . When you want the version invoke: 27// VersionLoader::GetVersion() 28// 29// This class also provides the ability to load the bios firmware using 30// VersionLoader::GetFirmware() 31class VersionLoader { 32 public: 33 VersionLoader(); 34 virtual ~VersionLoader(); 35 36 enum VersionFormat { 37 VERSION_SHORT, 38 VERSION_SHORT_WITH_DATE, 39 VERSION_FULL, 40 }; 41 42 // Signature 43 typedef base::Callback<void(const std::string&)> GetVersionCallback; 44 typedef base::Callback<void(const std::string&)> GetFirmwareCallback; 45 46 // Asynchronously requests the version. 47 // If |full_version| is true version string with extra info is extracted, 48 // otherwise it's in short format x.x.xx.x. 49 base::CancelableTaskTracker::TaskId GetVersion( 50 VersionFormat format, 51 const GetVersionCallback& callback, 52 base::CancelableTaskTracker* tracker); 53 54 base::CancelableTaskTracker::TaskId GetFirmware( 55 const GetFirmwareCallback& callback, 56 base::CancelableTaskTracker* tracker); 57 58 private: 59 FRIEND_TEST_ALL_PREFIXES(VersionLoaderTest, ParseFirmware); 60 61 // VersionLoader calls into the Backend in the blocking thread pool to load 62 // and extract the version. 63 class Backend : public base::RefCountedThreadSafe<Backend> { 64 public: 65 Backend() {} 66 67 // Gets the version number from base::SysInfo. This is invoked on the 68 // blocking thread pool. 69 void GetVersion(VersionFormat format, std::string* version); 70 71 // Calls ParseFirmware to get the firmware value. This is invoked on the 72 // blocking thread pool. 73 void GetFirmware(std::string* firmware); 74 75 private: 76 friend class base::RefCountedThreadSafe<Backend>; 77 78 ~Backend() {} 79 80 DISALLOW_COPY_AND_ASSIGN(Backend); 81 }; 82 83 // Extracts the firmware from the file. 84 static std::string ParseFirmware(const std::string& contents); 85 86 scoped_refptr<Backend> backend_; 87 88 DISALLOW_COPY_AND_ASSIGN(VersionLoader); 89}; 90 91} // namespace chromeos 92 93#endif // CHROME_BROWSER_CHROMEOS_VERSION_LOADER_H_ 94