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