| // Copyright (c) 2010 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/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 KeyboardLibrary; |
| class LibCrosServiceLibrary; |
| class LibraryLoader; |
| class LoginLibrary; |
| class MountLibrary; |
| class NetworkLibrary; |
| class PowerLibrary; |
| class ScreenLockLibrary; |
| class SpeechSynthesisLibrary; |
| class SyslogsLibrary; |
| class SystemLibrary; |
| 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 SetKeyboardLibrary(KeyboardLibrary* 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 SetSystemLibrary(SystemLibrary* 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(); |
| KeyboardLibrary* GetKeyboardLibrary(); |
| LoginLibrary* GetLoginLibrary(); |
| MountLibrary* GetMountLibrary(); |
| NetworkLibrary* GetNetworkLibrary(); |
| PowerLibrary* GetPowerLibrary(); |
| ScreenLockLibrary* GetScreenLockLibrary(); |
| SpeechSynthesisLibrary* GetSpeechSynthesisLibrary(); |
| SyslogsLibrary* GetSyslogsLibrary(); |
| SystemLibrary* GetSystemLibrary(); |
| 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<KeyboardLibrary> keyboard_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<SystemLibrary> system_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_ |