1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
|
// Copyright (c) 2011 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "chrome/browser/chromeos/version_loader.h"
#include <vector>
#include "base/bind.h"
#include "base/file_util.h"
#include "base/files/file_path.h"
#include "base/location.h"
#include "base/message_loop/message_loop.h"
#include "base/strings/string_split.h"
#include "base/strings/string_util.h"
#include "base/strings/stringprintf.h"
#include "base/sys_info.h"
#include "base/threading/sequenced_worker_pool.h"
#include "base/threading/thread.h"
#include "base/time/time.h"
#include "chrome/browser/browser_process.h"
#include "content/public/browser/browser_thread.h"
using content::BrowserThread;
namespace {
// Beginning of line we look for that gives full version number.
// Format: x.x.xx.x (Developer|Official build extra info) board info
const char kFullVersionKey[] = "CHROMEOS_RELEASE_DESCRIPTION";
// Same but for short version (x.x.xx.x).
const char kVersionKey[] = "CHROMEOS_RELEASE_VERSION";
// Beginning of line we look for that gives the firmware version.
const char kFirmwarePrefix[] = "version";
// File to look for firmware number in.
const char kPathFirmware[] = "/var/log/bios_info.txt";
// Converts const string* to const string&.
void VersionLoaderCallbackHelper(
base::Callback<void(const std::string&)> callback,
const std::string* version) {
callback.Run(*version);
}
} // namespace
namespace chromeos {
VersionLoader::VersionLoader() : backend_(new Backend()) {}
VersionLoader::~VersionLoader() {}
CancelableTaskTracker::TaskId VersionLoader::GetVersion(
VersionFormat format,
const GetVersionCallback& callback,
CancelableTaskTracker* tracker) {
std::string* version = new std::string();
return tracker->PostTaskAndReply(
BrowserThread::GetBlockingPool(),
FROM_HERE,
base::Bind(&Backend::GetVersion, backend_.get(), format, version),
base::Bind(&VersionLoaderCallbackHelper, callback, base::Owned(version)));
}
CancelableTaskTracker::TaskId VersionLoader::GetFirmware(
const GetFirmwareCallback& callback,
CancelableTaskTracker* tracker) {
std::string* firmware = new std::string();
return tracker->PostTaskAndReply(
BrowserThread::GetBlockingPool(),
FROM_HERE,
base::Bind(&Backend::GetFirmware, backend_.get(), firmware),
base::Bind(&VersionLoaderCallbackHelper,
callback, base::Owned(firmware)));
}
// static
std::string VersionLoader::ParseFirmware(const std::string& contents) {
// The file contains lines such as:
// vendor | ...
// version | ...
// release_date | ...
// We don't make any assumption that the spaces between "version" and "|" is
// fixed. So we just match kFirmwarePrefix at the start of the line and find
// the first character that is not "|" or space
std::vector<std::string> lines;
base::SplitString(contents, '\n', &lines);
for (size_t i = 0; i < lines.size(); ++i) {
if (StartsWithASCII(lines[i], kFirmwarePrefix, false)) {
std::string str = lines[i].substr(std::string(kFirmwarePrefix).size());
size_t found = str.find_first_not_of("| ");
if (found != std::string::npos)
return str.substr(found);
}
}
return std::string();
}
void VersionLoader::Backend::GetVersion(VersionFormat format,
std::string* version) {
DCHECK(BrowserThread::GetBlockingPool()->RunsTasksOnCurrentThread());
std::string key = (format == VERSION_FULL) ? kFullVersionKey : kVersionKey;
if (!base::SysInfo::GetLsbReleaseValue(key, version)) {
LOG_IF(ERROR, base::SysInfo::IsRunningOnChromeOS())
<< "No LSB version key: " << key;
*version = "0.0.0.0";
}
if (format == VERSION_SHORT_WITH_DATE) {
base::Time::Exploded ctime;
base::SysInfo::GetLsbReleaseTime().UTCExplode(&ctime);
*version += base::StringPrintf("-%02u.%02u.%02u",
ctime.year % 100,
ctime.month,
ctime.day_of_month);
}
}
void VersionLoader::Backend::GetFirmware(std::string* firmware) {
DCHECK(BrowserThread::GetBlockingPool()->RunsTasksOnCurrentThread());
std::string contents;
const base::FilePath file_path(kPathFirmware);
if (base::ReadFileToString(file_path, &contents)) {
*firmware = ParseFirmware(contents);
}
}
} // namespace chromeos
|