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"
125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "base/task/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
235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)//   base::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.
495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  base::CancelableTaskTracker::TaskId GetVersion(
505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      VersionFormat format,
515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      const GetVersionCallback& callback,
525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      base::CancelableTaskTracker* tracker);
535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  base::CancelableTaskTracker::TaskId GetFirmware(
555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      const GetFirmwareCallback& callback,
565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      base::CancelableTaskTracker* tracker);
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FRIEND_TEST_ALL_PREFIXES(VersionLoaderTest, ParseFirmware);
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // VersionLoader calls into the Backend in the blocking thread pool to load
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // and extract the version.
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  class Backend : public base::RefCountedThreadSafe<Backend> {
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   public:
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Backend() {}
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
674e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    // Gets the version number from base::SysInfo. This is invoked on the
684e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    // blocking thread pool.
692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    void GetVersion(VersionFormat format, std::string* version);
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
714e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    // Calls ParseFirmware to get the firmware value. This is invoked on the
724e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    // blocking thread pool.
732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    void GetFirmware(std::string* firmware);
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   private:
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    friend class base::RefCountedThreadSafe<Backend>;
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ~Backend() {}
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DISALLOW_COPY_AND_ASSIGN(Backend);
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Extracts the firmware from the file.
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static std::string ParseFirmware(const std::string& contents);
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_refptr<Backend> backend_;
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(VersionLoader);
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace chromeos
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif  // CHROME_BROWSER_CHROMEOS_VERSION_LOADER_H_
94