1ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// Copyright (c) 2011 The Chromium Authors. All rights reserved.
2c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Use of this source code is governed by a BSD-style license that can be
3c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// found in the LICENSE file.
4c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
5c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/chromeos/cros/cros_library.h"
6c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen#include "base/lazy_instance.h"
821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen#include "chrome/browser/chromeos/cros/brightness_library.h"
93345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#include "chrome/browser/chromeos/cros/burn_library.h"
10c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/chromeos/cros/cros_library_loader.h"
11c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/chromeos/cros/cryptohome_library.h"
12c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/chromeos/cros/input_method_library.h"
1372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "chrome/browser/chromeos/cros/libcros_service_library.h"
14c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/chromeos/cros/login_library.h"
15c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/chromeos/cros/mount_library.h"
16c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/chromeos/cros/network_library.h"
17c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/chromeos/cros/power_library.h"
18c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/chromeos/cros/screen_lock_library.h"
19c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/chromeos/cros/speech_synthesis_library.h"
20c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/chromeos/cros/syslogs_library.h"
213345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#include "chrome/browser/chromeos/cros/touchpad_library.h"
22c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/chromeos/cros/update_library.h"
23c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
2421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen#define DEFINE_GET_LIBRARY_METHOD(class_prefix, var_prefix)                    \
2521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsenclass_prefix##Library* CrosLibrary::Get##class_prefix##Library() {             \
2621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  return var_prefix##_lib_.GetDefaultImpl(use_stub_impl_);                     \
2721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen}
2821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen
2921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen#define DEFINE_SET_LIBRARY_METHOD(class_prefix, var_prefix)                    \
3021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsenvoid CrosLibrary::TestApi::Set##class_prefix##Library(                         \
3121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen    class_prefix##Library* library, bool own) {                                \
3221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  library_->var_prefix##_lib_.SetImpl(library, own);                           \
3321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen}
3421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen
3521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen
36c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochnamespace chromeos {
37c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
3821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsenstatic base::LazyInstance<CrosLibrary> g_cros_library(
3921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen    base::LINKER_INITIALIZED);
4021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen
41c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochCrosLibrary::CrosLibrary() : library_loader_(NULL),
423345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick                             own_library_loader_(false),
433345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick                             use_stub_impl_(false),
44c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                             loaded_(false),
45c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                             load_error_(false),
46c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                             test_api_(NULL) {
47c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
48c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
49c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochCrosLibrary::~CrosLibrary() {
50c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (own_library_loader_)
51c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    delete library_loader_;
52c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
53c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
54c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// static
55c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochCrosLibrary* CrosLibrary::Get() {
5621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  return g_cros_library.Pointer();
5721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen}
5821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen
5921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian MonsenDEFINE_GET_LIBRARY_METHOD(Brightness, brightness);
6021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian MonsenDEFINE_GET_LIBRARY_METHOD(Burn, burn);
6121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian MonsenDEFINE_GET_LIBRARY_METHOD(Cryptohome, crypto);
6221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian MonsenDEFINE_GET_LIBRARY_METHOD(InputMethod, input_method);
6372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian MonsenDEFINE_GET_LIBRARY_METHOD(LibCrosService, libcros_service);
6421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian MonsenDEFINE_GET_LIBRARY_METHOD(Login, login);
6521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian MonsenDEFINE_GET_LIBRARY_METHOD(Mount, mount);
6621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian MonsenDEFINE_GET_LIBRARY_METHOD(Network, network);
6721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian MonsenDEFINE_GET_LIBRARY_METHOD(Power, power);
6821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian MonsenDEFINE_GET_LIBRARY_METHOD(ScreenLock, screen_lock);
6921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian MonsenDEFINE_GET_LIBRARY_METHOD(SpeechSynthesis, speech_synthesis);
7021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian MonsenDEFINE_GET_LIBRARY_METHOD(Syslogs, syslogs);
7121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian MonsenDEFINE_GET_LIBRARY_METHOD(Touchpad, touchpad);
7221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian MonsenDEFINE_GET_LIBRARY_METHOD(Update, update);
73c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
74c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochbool CrosLibrary::EnsureLoaded() {
753345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  if (use_stub_impl_)
763345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    return true;
773345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
78c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (!loaded_ && !load_error_) {
793345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    if (!library_loader_) {
80c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      library_loader_ = new CrosLibraryLoader();
813345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      own_library_loader_ = true;
823345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    }
83c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    loaded_ = library_loader_->Load(&load_error_string_);
84c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    load_error_ = !loaded_;
85c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
86c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  return loaded_;
87c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
88c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
89c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochCrosLibrary::TestApi* CrosLibrary::GetTestApi() {
903345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  if (!test_api_.get())
913345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    test_api_.reset(new TestApi(this));
923345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  return test_api_.get();
933345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick}
943345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
953345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickvoid CrosLibrary::TestApi::SetUseStubImpl() {
963345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  library_->use_stub_impl_ = true;
973345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick}
983345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
993345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickvoid CrosLibrary::TestApi::ResetUseStubImpl() {
1003345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  library_->use_stub_impl_ = false;
101c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
102c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
103c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid CrosLibrary::TestApi::SetLibraryLoader(LibraryLoader* loader, bool own) {
104c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (library_->library_loader_ == loader)
105c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    return;
106c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (library_->own_library_loader_)
107c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    delete library_->library_loader_;
108c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  library_->own_library_loader_ = own;
109c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  library_->library_loader_ = loader;
110c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Reset load flags when loader changes. Otherwise some tests are really not
111c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // going to be happy.
112c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  library_->loaded_ = false;
113c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  library_->load_error_ = false;
114c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
115c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
11621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian MonsenDEFINE_SET_LIBRARY_METHOD(Brightness, brightness);
11721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian MonsenDEFINE_SET_LIBRARY_METHOD(Burn, burn);
11821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian MonsenDEFINE_SET_LIBRARY_METHOD(Cryptohome, crypto);
11921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian MonsenDEFINE_SET_LIBRARY_METHOD(InputMethod, input_method);
12072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian MonsenDEFINE_SET_LIBRARY_METHOD(LibCrosService, libcros_service);
12121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian MonsenDEFINE_SET_LIBRARY_METHOD(Login, login);
12221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian MonsenDEFINE_SET_LIBRARY_METHOD(Mount, mount);
12321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian MonsenDEFINE_SET_LIBRARY_METHOD(Network, network);
12421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian MonsenDEFINE_SET_LIBRARY_METHOD(Power, power);
12521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian MonsenDEFINE_SET_LIBRARY_METHOD(ScreenLock, screen_lock);
12621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian MonsenDEFINE_SET_LIBRARY_METHOD(SpeechSynthesis, speech_synthesis);
12721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian MonsenDEFINE_SET_LIBRARY_METHOD(Syslogs, syslogs);
12821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian MonsenDEFINE_SET_LIBRARY_METHOD(Touchpad, touchpad);
12921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian MonsenDEFINE_SET_LIBRARY_METHOD(Update, update);
130c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
131c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} // namespace chromeos
132