// 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.
#ifndef CHROME_BROWSER_CHROMEOS_CROS_CROS_LIBRARY_H_
#define CHROME_BROWSER_CHROMEOS_CROS_CROS_LIBRARY_H_
#pragma once
#include <string>
#include "base/basictypes.h"
#include "base/command_line.h"
#include "base/memory/scoped_ptr.h"
#include "chrome/common/chrome_switches.h"
namespace base {
template <typename T> struct DefaultLazyInstanceTraits;
}
namespace chromeos {
class BrightnessLibrary;
class BurnLibrary;
class CryptohomeLibrary;
class InputMethodLibrary;
class LibCrosServiceLibrary;
class LibraryLoader;
class LoginLibrary;
class MountLibrary;
class NetworkLibrary;
class PowerLibrary;
class ScreenLockLibrary;
class SpeechSynthesisLibrary;
class SyslogsLibrary;
class TouchpadLibrary;
class UpdateLibrary;
// This class handles access to sub-parts of ChromeOS library. it provides
// a level of indirection so individual libraries that it exposes can
// be mocked for testing.
class CrosLibrary {
public:
// This class provides access to internal members of CrosLibrary class for
// purpose of testing (i.e. replacement of members' implementation with
// mock objects).
class TestApi {
public:
// Use the stub implementations of the library. This is mainly for
// running the chromeos build of chrome on the desktop.
void SetUseStubImpl();
// Reset the stub implementations of the library, called after
// SetUseStubImp is called.
void ResetUseStubImpl();
// Passing true for own for these setters will cause them to be deleted
// when the CrosLibrary is deleted (or other mocks are set).
// Setter for LibraryLoader.
void SetLibraryLoader(LibraryLoader* loader, bool own);
void SetBrightnessLibrary(BrightnessLibrary* library, bool own);
void SetBurnLibrary(BurnLibrary* library, bool own);
void SetCryptohomeLibrary(CryptohomeLibrary* library, bool own);
void SetInputMethodLibrary(InputMethodLibrary* library, bool own);
void SetLibCrosServiceLibrary(LibCrosServiceLibrary* library, bool own);
void SetLoginLibrary(LoginLibrary* library, bool own);
void SetMountLibrary(MountLibrary* library, bool own);
void SetNetworkLibrary(NetworkLibrary* library, bool own);
void SetPowerLibrary(PowerLibrary* library, bool own);
void SetScreenLockLibrary(ScreenLockLibrary* library, bool own);
void SetSpeechSynthesisLibrary(SpeechSynthesisLibrary* library, bool own);
void SetSyslogsLibrary(SyslogsLibrary* library, bool own);
void SetTouchpadLibrary(TouchpadLibrary* library, bool own);
void SetUpdateLibrary(UpdateLibrary* library, bool own);
private:
friend class CrosLibrary;
explicit TestApi(CrosLibrary* library) : library_(library) {}
CrosLibrary* library_;
};
// This gets the CrosLibrary.
static CrosLibrary* Get();
BrightnessLibrary* GetBrightnessLibrary();
BurnLibrary* GetBurnLibrary();
CryptohomeLibrary* GetCryptohomeLibrary();
InputMethodLibrary* GetInputMethodLibrary();
LibCrosServiceLibrary* GetLibCrosServiceLibrary();
LoginLibrary* GetLoginLibrary();
MountLibrary* GetMountLibrary();
NetworkLibrary* GetNetworkLibrary();
PowerLibrary* GetPowerLibrary();
ScreenLockLibrary* GetScreenLockLibrary();
SpeechSynthesisLibrary* GetSpeechSynthesisLibrary();
SyslogsLibrary* GetSyslogsLibrary();
TouchpadLibrary* GetTouchpadLibrary();
UpdateLibrary* GetUpdateLibrary();
// Getter for Test API that gives access to internal members of this class.
TestApi* GetTestApi();
// Ensures that the library is loaded, loading it if needed. If the library
// could not be loaded, returns false.
bool EnsureLoaded();
// Returns an unlocalized string describing the last load error (if any).
const std::string& load_error_string() {
return load_error_string_;
}
private:
friend struct base::DefaultLazyInstanceTraits<chromeos::CrosLibrary>;
friend class CrosLibrary::TestApi;
CrosLibrary();
virtual ~CrosLibrary();
LibraryLoader* library_loader_;
bool own_library_loader_;
// This template supports the creation, setting and optional deletion of
// the cros libraries.
template <class L>
class Library {
public:
Library() : library_(NULL), own_(true) {}
~Library() {
if (own_)
delete library_;
}
L* GetDefaultImpl(bool use_stub_impl) {
if (!library_) {
own_ = true;
if (CommandLine::ForCurrentProcess()->HasSwitch(
switches::kForceStubLibcros))
use_stub_impl = true;
library_ = L::GetImpl(use_stub_impl);
}
return library_;
}
void SetImpl(L* library, bool own) {
if (library != library_) {
if (own_)
delete library_;
library_ = library;
own_ = own;
}
}
private:
L* library_;
bool own_;
};
Library<BrightnessLibrary> brightness_lib_;
Library<BurnLibrary> burn_lib_;
Library<CryptohomeLibrary> crypto_lib_;
Library<InputMethodLibrary> input_method_lib_;
Library<LibCrosServiceLibrary> libcros_service_lib_;
Library<LoginLibrary> login_lib_;
Library<MountLibrary> mount_lib_;
Library<NetworkLibrary> network_lib_;
Library<PowerLibrary> power_lib_;
Library<ScreenLockLibrary> screen_lock_lib_;
Library<SpeechSynthesisLibrary> speech_synthesis_lib_;
Library<SyslogsLibrary> syslogs_lib_;
Library<TouchpadLibrary> touchpad_lib_;
Library<UpdateLibrary> update_lib_;
// Stub implementations of the libraries should be used.
bool use_stub_impl_;
// True if libcros was successfully loaded.
bool loaded_;
// True if the last load attempt had an error.
bool load_error_;
// Contains the error string from the last load attempt.
std::string load_error_string_;
scoped_ptr<TestApi> test_api_;
DISALLOW_COPY_AND_ASSIGN(CrosLibrary);
};
// The class is used for enabling the stub libcros, and cleaning it up at
// the end of the object lifetime. Useful for testing.
class ScopedStubCrosEnabler {
public:
ScopedStubCrosEnabler() {
chromeos::CrosLibrary::Get()->GetTestApi()->SetUseStubImpl();
}
~ScopedStubCrosEnabler() {
chromeos::CrosLibrary::Get()->GetTestApi()->ResetUseStubImpl();
}
private:
DISALLOW_COPY_AND_ASSIGN(ScopedStubCrosEnabler);
};
} // namespace chromeos
#endif // CHROME_BROWSER_CHROMEOS_CROS_CROS_LIBRARY_H_