version_loader.h revision 4e180b6a0b4720a9b8e9e959a882386f690f08ff
15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2011 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef CHROME_BROWSER_CHROMEOS_VERSION_LOADER_H_
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CHROME_BROWSER_CHROMEOS_VERSION_LOADER_H_
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <string>
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/callback.h"
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/gtest_prod_util.h"
122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/common/cancelable_task_tracker.h"
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace chromeos {
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// ChromeOSVersionLoader loads the version of Chrome OS from the file system.
172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Loading is done asynchronously in the blocking thread pool. Once loaded,
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// ChromeOSVersionLoader callback to a method of your choice with the version
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// (or an empty string if the version couldn't be found).
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// To use ChromeOSVersionLoader do the following:
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// . In your class define a member field of type chromeos::VersionLoader and
232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)//   CancelableTaskTracker.
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// . Define the callback method, something like:
252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)//   void OnGetChromeOSVersion(const std::string& version);
262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// . When you want the version invoke:
272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)//   VersionLoader::GetVersion()
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This class also provides the ability to load the bios firmware using
302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)//   VersionLoader::GetFirmware()
312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class VersionLoader {
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  VersionLoader();
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~VersionLoader();
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  enum VersionFormat {
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    VERSION_SHORT,
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    VERSION_SHORT_WITH_DATE,
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    VERSION_FULL,
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Signature
432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  typedef base::Callback<void(const std::string&)> GetVersionCallback;
442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  typedef base::Callback<void(const std::string&)> GetFirmwareCallback;
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Asynchronously requests the version.
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // If |full_version| is true version string with extra info is extracted,
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // otherwise it's in short format x.x.xx.x.
492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CancelableTaskTracker::TaskId GetVersion(VersionFormat format,
502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                           const GetVersionCallback& callback,
512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                           CancelableTaskTracker* tracker);
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CancelableTaskTracker::TaskId GetFirmware(const GetFirmwareCallback& callback,
542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                            CancelableTaskTracker* tracker);
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FRIEND_TEST_ALL_PREFIXES(VersionLoaderTest, ParseFirmware);
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // VersionLoader calls into the Backend in the blocking thread pool to load
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // and extract the version.
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  class Backend : public base::RefCountedThreadSafe<Backend> {
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   public:
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Backend() {}
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
654e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    // Gets the version number from base::SysInfo. This is invoked on the
664e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    // blocking thread pool.
672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    void GetVersion(VersionFormat format, std::string* version);
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
694e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    // Calls ParseFirmware to get the firmware value. This is invoked on the
704e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    // blocking thread pool.
712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    void GetFirmware(std::string* firmware);
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   private:
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    friend class base::RefCountedThreadSafe<Backend>;
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ~Backend() {}
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DISALLOW_COPY_AND_ASSIGN(Backend);
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Extracts the firmware from the file.
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static std::string ParseFirmware(const std::string& contents);
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_refptr<Backend> backend_;
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(VersionLoader);
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace chromeos
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif  // CHROME_BROWSER_CHROMEOS_VERSION_LOADER_H_
92