146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved.
22a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
32a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// found in the LICENSE file.
42a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
52a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/basictypes.h"
62a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/bind.h"
72a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/files/file_path.h"
81320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "base/files/file_util.h"
92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/logging.h"
102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/prefs/pref_service.h"
11868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/string_util.h"
122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/task_runner_util.h"
132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/threading/worker_pool.h"
142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/browser_process.h"
152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/common/pref_names.h"
16a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "chromeos/system/statistics_provider.h"
172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/public/browser/browser_thread.h"
182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)namespace google_brand {
202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace chromeos {
212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace {
232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Path to file that stores the RLZ brand code on ChromeOS.
252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const base::FilePath::CharType kRLZBrandFilePath[] =
262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    FILE_PATH_LITERAL("/opt/oem/etc/BRAND_CODE");
272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Reads the brand code from file |kRLZBrandFilePath|.
292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)std::string ReadBrandFromFile() {
302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  std::string brand;
312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath brand_file_path(kRLZBrandFilePath);
3258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  if (!base::ReadFileToString(brand_file_path, &brand))
332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    LOG(WARNING) << "Brand code file missing: " << brand_file_path.value();
34a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  base::TrimWhitespace(brand, base::TRIM_ALL, &brand);
352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return brand;
362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Sets the brand code to |brand|.
392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void SetBrand(const base::Closure& callback, const std::string& brand) {
402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  g_browser_process->local_state()->SetString(prefs::kRLZBrand, brand);
412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  callback.Run();
422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// True if brand code has been cleared for the current session.
452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool g_brand_empty = false;
462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}  // namespace
482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void ClearBrandForCurrentSession() {
50ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  DCHECK(!content::BrowserThread::IsThreadInitialized(
51ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch             content::BrowserThread::UI) ||
52ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch         content::BrowserThread::CurrentlyOn(content::BrowserThread::UI));
532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  g_brand_empty = true;
542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)std::string GetBrand() {
57ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  DCHECK(!content::BrowserThread::IsThreadInitialized(
58ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch             content::BrowserThread::UI) ||
59ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch         content::BrowserThread::CurrentlyOn(content::BrowserThread::UI));
602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (g_brand_empty)
612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return std::string();
622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DCHECK(g_browser_process->local_state());
632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return g_browser_process->local_state()->GetString(prefs::kRLZBrand);
642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
66a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)void InitBrand(const base::Closure& callback) {
67a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  ::chromeos::system::StatisticsProvider* provider =
68a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      ::chromeos::system::StatisticsProvider::GetInstance();
69a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  std::string brand;
70a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  const bool found = provider->GetMachineStatistic(
71a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      ::chromeos::system::kRlzBrandCodeKey, &brand);
72a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  if (found && !brand.empty()) {
73a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    SetBrand(callback, brand);
74a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    return;
75a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  }
76a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::PostTaskAndReplyWithResult(
787d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      base::WorkerPool::GetTaskRunner(false /* task_is_slow */).get(),
792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      FROM_HERE,
802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      base::Bind(&ReadBrandFromFile),
812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      base::Bind(&SetBrand, callback));
822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}  // namespace chromeos
8546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)}  // namespace google_brand
86