version_loader.h revision 5821806d5e7f356e8fa4b058a389a808ea183019
1801e60946bc879afeb37bcd3372e441e8f631c79James Dennett// Copyright (c) 2011 The Chromium Authors. All rights reserved. 2d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlsson// Use of this source code is governed by a BSD-style license that can be 3d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlsson// found in the LICENSE file. 4d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlsson 5d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlsson#ifndef CHROME_BROWSER_CHROMEOS_VERSION_LOADER_H_ 6d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlsson#define CHROME_BROWSER_CHROMEOS_VERSION_LOADER_H_ 7d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlsson 8d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlsson#include <string> 9d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlsson 10d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlsson#include "base/callback.h" 11d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlsson#include "base/gtest_prod_util.h" 12d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlsson#include "chrome/browser/common/cancelable_request.h" 13d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlsson 1481226601148d7e7c187b96c6ef86e83df204f59fAnders Carlssonnamespace chromeos { 1581226601148d7e7c187b96c6ef86e83df204f59fAnders Carlsson 16d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlsson// ChromeOSVersionLoader loads the version of Chrome OS from the file system. 172fa67efeaf66a9332c30a026dc1c21bef6c33a6cBenjamin Kramer// Loading is done asynchronously on the file thread. Once loaded, 18ddc2a53584f91b1fdcc466f1ea1345d97c428802Richard Smith// ChromeOSVersionLoader callback to a method of your choice with the version 19a8fb24fa3151567056f6125999cea69e39604f35Fariborz Jahanian// (or an empty string if the version couldn't be found). 202fa67efeaf66a9332c30a026dc1c21bef6c33a6cBenjamin Kramer// To use ChromeOSVersionLoader do the following: 212fa67efeaf66a9332c30a026dc1c21bef6c33a6cBenjamin Kramer// 22cf807c4dfdb23e8fa3f400e0b24ef5b79db7a530Sean Hunt// . In your class define a member field of type chromeos::VersionLoader and 230a0d2b179085a52c10402feebeb6db8b4d96a140Douglas Gregor// CancelableRequestConsumerBase. 249594675cc1eb52a054de13c4a21e466643847480Chris Lattner// . Define the callback method, something like: 259594675cc1eb52a054de13c4a21e466643847480Chris Lattner// void OnGetChromeOSVersion(chromeos::VersionLoader::Handle, 269594675cc1eb52a054de13c4a21e466643847480Chris Lattner// const std::string& version); 279fe8c74a93ac8e92512615c5f83e7a328b3b0544David Blaikie// . When you want the version invoke: loader.GetVersion(&consumer, callback); 281bea8807bcd2be10bf6309a3a848489434464cedDouglas Gregor// 296bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines// This class also provides the ability to load the bios firmware using 30baa66fc389ca0a9f11e0c864304bcfd89de39439Anders Carlsson// loader.GetFirmware(&consumer, callback); 31adf21bdb3d17acfdb74657fcbc5035a404c6c8f4Anders Carlssonclass VersionLoader : public CancelableRequestProvider { 32d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlsson public: 33cc5814732edc0c382d0136ab57ec6149566043e2Chris Lattner VersionLoader(); 34857e918a8a40deb128840308a318bf623d68295fTed Kremenek virtual ~VersionLoader(); 35857e918a8a40deb128840308a318bf623d68295fTed Kremenek 364ced79f0971592e6e7122037de69ee9ae534ce72Chandler Carruth enum VersionFormat { 37a8fb24fa3151567056f6125999cea69e39604f35Fariborz Jahanian VERSION_SHORT, 38cf807c4dfdb23e8fa3f400e0b24ef5b79db7a530Sean Hunt VERSION_SHORT_WITH_DATE, 39cf807c4dfdb23e8fa3f400e0b24ef5b79db7a530Sean Hunt VERSION_FULL, 40d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlsson }; 41d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlsson 42d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlsson // Signature 43d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlsson typedef base::Callback<void(Handle, const std::string&)> GetVersionCallback; 44ffcc3105d223899740e79f3f8199f3881df4d1deArgyrios Kyrtzidis typedef CancelableRequest<GetVersionCallback> GetVersionRequest; 45cf807c4dfdb23e8fa3f400e0b24ef5b79db7a530Sean Hunt 462f402708e62f89fb875442802e3d3f20fc909d33Anton Korobeynikov typedef base::Callback<void(Handle, const std::string&)> GetFirmwareCallback; 47d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlsson typedef CancelableRequest<GetFirmwareCallback> GetFirmwareRequest; 4851d8c52ad36129760eaa586f85176037e2cd0d0eMichael Han 4951d8c52ad36129760eaa586f85176037e2cd0d0eMichael Han // Asynchronously requests the version. 5051d8c52ad36129760eaa586f85176037e2cd0d0eMichael Han // If |full_version| is true version string with extra info is extracted, 51a97d70b7ea9633e8cbf976510d7a9ea66f4ac96cPeter Collingbourne // otherwise it's in short format x.x.xx.x. 52f6565a9f7318b1ca6ea9510003dde7b89696daabRichard Smith Handle GetVersion(CancelableRequestConsumerBase* consumer, 53651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines const GetVersionCallback& callback, 54f6565a9f7318b1ca6ea9510003dde7b89696daabRichard Smith VersionFormat format); 551de22a26c0e126b08edb2eda9d9091c021d96dc6Douglas Gregor 5651d8c52ad36129760eaa586f85176037e2cd0d0eMichael Han Handle GetFirmware(CancelableRequestConsumerBase* consumer, 570b2b6e1cb1573bb295c0a65813dc4df8d57f305bChris Lattner const GetFirmwareCallback& callback); 58b219cfc4d75f0a03630b7c4509ef791b7e97b2c8David Blaikie 590b2b6e1cb1573bb295c0a65813dc4df8d57f305bChris Lattner // Parse the version information as a Chrome platfrom, not Chrome OS 600b2b6e1cb1573bb295c0a65813dc4df8d57f305bChris Lattner // TODO(rkc): Change this and everywhere it is used once we switch Chrome OS 61b219cfc4d75f0a03630b7c4509ef791b7e97b2c8David Blaikie // over to xx.yyy.zz version numbers instead of 0.xx.yyy.zz 620b2b6e1cb1573bb295c0a65813dc4df8d57f305bChris Lattner // Refer to http://code.google.com/p/chromium-os/issues/detail?id=15789 631eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump void EnablePlatformVersions(bool enable); 64cf807c4dfdb23e8fa3f400e0b24ef5b79db7a530Sean Hunt 65cf807c4dfdb23e8fa3f400e0b24ef5b79db7a530Sean Hunt static const char kFullVersionPrefix[]; 66cf807c4dfdb23e8fa3f400e0b24ef5b79db7a530Sean Hunt static const char kVersionPrefix[]; 67cf807c4dfdb23e8fa3f400e0b24ef5b79db7a530Sean Hunt static const char kFirmwarePrefix[]; 68cf807c4dfdb23e8fa3f400e0b24ef5b79db7a530Sean Hunt 69cf807c4dfdb23e8fa3f400e0b24ef5b79db7a530Sean Hunt private: 70cf807c4dfdb23e8fa3f400e0b24ef5b79db7a530Sean Hunt FRIEND_TEST_ALL_PREFIXES(VersionLoaderTest, ParseFullVersion); 71a87cdc03f4014545a8440110c1f4f68701100576Eli Friedman FRIEND_TEST_ALL_PREFIXES(VersionLoaderTest, ParseVersion); 72cf807c4dfdb23e8fa3f400e0b24ef5b79db7a530Sean Hunt FRIEND_TEST_ALL_PREFIXES(VersionLoaderTest, ParseFirmware); 73cf807c4dfdb23e8fa3f400e0b24ef5b79db7a530Sean Hunt 74cf807c4dfdb23e8fa3f400e0b24ef5b79db7a530Sean Hunt // VersionLoader calls into the Backend on the file thread to load 750b2b6e1cb1573bb295c0a65813dc4df8d57f305bChris Lattner // and extract the version. 7651d8c52ad36129760eaa586f85176037e2cd0d0eMichael Han class Backend : public base::RefCountedThreadSafe<Backend> { 7751d8c52ad36129760eaa586f85176037e2cd0d0eMichael Han public: 78651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines Backend() {} 79cf807c4dfdb23e8fa3f400e0b24ef5b79db7a530Sean Hunt 80cc5814732edc0c382d0136ab57ec6149566043e2Chris Lattner // Calls ParseVersion to get the version # and notifies request. 811eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump // This is invoked on the file thread. 82cf807c4dfdb23e8fa3f400e0b24ef5b79db7a530Sean Hunt // If |full_version| is true then extra info is passed in version string. 83cf807c4dfdb23e8fa3f400e0b24ef5b79db7a530Sean Hunt void GetVersion(scoped_refptr<GetVersionRequest> request, 84d406bf0e8c17012110a8476d03c6f9a97b56ecf7Anders Carlsson VersionFormat format); 8551d8c52ad36129760eaa586f85176037e2cd0d0eMichael Han 8651d8c52ad36129760eaa586f85176037e2cd0d0eMichael Han // Calls ParseFirmware to get the firmware # and notifies request. 87651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // This is invoked on the file thread. 881eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump void GetFirmware(scoped_refptr<GetFirmwareRequest> request); 89ffcc3105d223899740e79f3f8199f3881df4d1deArgyrios Kyrtzidis 90ffcc3105d223899740e79f3f8199f3881df4d1deArgyrios Kyrtzidis private: 91ffcc3105d223899740e79f3f8199f3881df4d1deArgyrios Kyrtzidis friend class base::RefCountedThreadSafe<Backend>; 921eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 93192e7f7e7f0493f7cdfda1d752e6de340d4e3ffePeter Collingbourne ~Backend() {} 94192e7f7e7f0493f7cdfda1d752e6de340d4e3ffePeter Collingbourne 95651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines DISALLOW_COPY_AND_ASSIGN(Backend); 96651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines }; 97651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 98651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // Extracts the version from the file. 99651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // |prefix| specifies what key defines version data. 100f6565a9f7318b1ca6ea9510003dde7b89696daabRichard Smith static std::string ParseVersion(const std::string& contents, 101f6565a9f7318b1ca6ea9510003dde7b89696daabRichard Smith const std::string& prefix); 102f6565a9f7318b1ca6ea9510003dde7b89696daabRichard Smith 1039f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas Gregor // Extracts the firmware from the file. 104f6565a9f7318b1ca6ea9510003dde7b89696daabRichard Smith static std::string ParseFirmware(const std::string& contents); 1059f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas Gregor 10623323e0253716ff03c95a00fb6903019daafe3aaDeLesley Hutchins scoped_refptr<Backend> backend_; 10723323e0253716ff03c95a00fb6903019daafe3aaDeLesley Hutchins 1081bea8807bcd2be10bf6309a3a848489434464cedDouglas Gregor DISALLOW_COPY_AND_ASSIGN(VersionLoader); 109cfa88f893915ceb8ae4ce2f17c46c24a4d67502fDmitri Gribenko}; 1100dae729a69c4fccc38c97d5dd44f7b20bb20de1cRichard Smith 111651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines} // namespace chromeos 112651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 113651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines#endif // CHROME_BROWSER_CHROMEOS_VERSION_LOADER_H_ 114651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines