1 // Copyright (c) 2010 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 #pragma once 8 9 #include <string> 10 11 #include "base/callback.h" 12 #include "base/gtest_prod_util.h" 13 #include "content/browser/cancelable_request.h" 14 15 class FilePath; 16 17 namespace chromeos { 18 19 // ChromeOSVersionLoader loads the version of Chrome OS from the file system. 20 // Loading is done asynchronously on the file thread. Once loaded, 21 // ChromeOSVersionLoader callback to a method of your choice with the version 22 // (or an empty string if the version couldn't be found). 23 // To use ChromeOSVersionLoader do the following: 24 // 25 // . In your class define a member field of type chromeos::VersionLoader and 26 // CancelableRequestConsumerBase. 27 // . Define the callback method, something like: 28 // void OnGetChromeOSVersion(chromeos::VersionLoader::Handle, 29 // std::string version); 30 // . When you want the version invoke: loader.GetVersion(&consumer, callback); 31 // 32 // This class also provides the ability to load the bios firmware using 33 // loader.GetFirmware(&consumer, callback); 34 class VersionLoader : public CancelableRequestProvider { 35 public: 36 VersionLoader(); 37 38 enum VersionFormat { 39 VERSION_SHORT, 40 VERSION_SHORT_WITH_DATE, 41 VERSION_FULL, 42 }; 43 44 // Signature 45 typedef Callback2<Handle, std::string>::Type GetVersionCallback; 46 typedef CancelableRequest<GetVersionCallback> GetVersionRequest; 47 48 typedef Callback2<Handle, std::string>::Type GetFirmwareCallback; 49 typedef CancelableRequest<GetFirmwareCallback> GetFirmwareRequest; 50 51 // Asynchronously requests the version. 52 // If |full_version| is true version string with extra info is extracted, 53 // otherwise it's in short format x.x.xx.x. 54 Handle GetVersion(CancelableRequestConsumerBase* consumer, 55 GetVersionCallback* callback, 56 VersionFormat format); 57 58 Handle GetFirmware(CancelableRequestConsumerBase* consumer, 59 GetFirmwareCallback* callback); 60 61 // Parse the version information as a Chrome platfrom, not Chrome OS 62 // TODO(rkc): Change this and everywhere it is used once we switch Chrome OS 63 // over to xx.yyy.zz version numbers instead of 0.xx.yyy.zz 64 // Refer to http://code.google.com/p/chromium-os/issues/detail?id=15789 65 void EnablePlatformVersions(bool enable); 66 67 static const char kFullVersionPrefix[]; 68 static const char kVersionPrefix[]; 69 static const char kFirmwarePrefix[]; 70 71 private: 72 FRIEND_TEST_ALL_PREFIXES(VersionLoaderTest, ParseFullVersion); 73 FRIEND_TEST_ALL_PREFIXES(VersionLoaderTest, ParseVersion); 74 FRIEND_TEST_ALL_PREFIXES(VersionLoaderTest, ParseFirmware); 75 76 // VersionLoader calls into the Backend on the file thread to load 77 // and extract the version. 78 class Backend : public base::RefCountedThreadSafe<Backend> { 79 public: Backend()80 Backend() : parse_as_platform_(false) {} 81 82 // Calls ParseVersion to get the version # and notifies request. 83 // This is invoked on the file thread. 84 // If |full_version| is true then extra info is passed in version string. 85 void GetVersion(scoped_refptr<GetVersionRequest> request, 86 VersionFormat format); 87 88 // Calls ParseFirmware to get the firmware # and notifies request. 89 // This is invoked on the file thread. 90 void GetFirmware(scoped_refptr<GetFirmwareRequest> request); 91 set_parse_as_platform(bool value)92 void set_parse_as_platform(bool value) { parse_as_platform_ = value; } 93 94 private: 95 friend class base::RefCountedThreadSafe<Backend>; 96 97 bool parse_as_platform_; 98 ~Backend()99 ~Backend() {} 100 101 DISALLOW_COPY_AND_ASSIGN(Backend); 102 }; 103 104 // Extracts the version from the file. 105 // |prefix| specifies what key defines version data. 106 static std::string ParseVersion(const std::string& contents, 107 const std::string& prefix); 108 109 // Extracts the firmware from the file. 110 static std::string ParseFirmware(const std::string& contents); 111 112 scoped_refptr<Backend> backend_; 113 114 DISALLOW_COPY_AND_ASSIGN(VersionLoader); 115 }; 116 117 } // namespace chromeos 118 119 #endif // CHROME_BROWSER_CHROMEOS_VERSION_LOADER_H_ 120