• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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