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