• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4 
5 #ifndef CHROME_BROWSER_CHROMEOS_CROS_CROS_LIBRARY_H_
6 #define CHROME_BROWSER_CHROMEOS_CROS_CROS_LIBRARY_H_
7 #pragma once
8 
9 #include <string>
10 #include "base/basictypes.h"
11 #include "base/command_line.h"
12 #include "base/memory/scoped_ptr.h"
13 #include "chrome/common/chrome_switches.h"
14 
15 namespace base {
16 template <typename T> struct DefaultLazyInstanceTraits;
17 }
18 
19 namespace chromeos {
20 
21 class BrightnessLibrary;
22 class BurnLibrary;
23 class CryptohomeLibrary;
24 class InputMethodLibrary;
25 class LibCrosServiceLibrary;
26 class LibraryLoader;
27 class LoginLibrary;
28 class MountLibrary;
29 class NetworkLibrary;
30 class PowerLibrary;
31 class ScreenLockLibrary;
32 class SpeechSynthesisLibrary;
33 class SyslogsLibrary;
34 class TouchpadLibrary;
35 class UpdateLibrary;
36 
37 // This class handles access to sub-parts of ChromeOS library. it provides
38 // a level of indirection so individual libraries that it exposes can
39 // be mocked for testing.
40 class CrosLibrary {
41  public:
42   // This class provides access to internal members of CrosLibrary class for
43   // purpose of testing (i.e. replacement of members' implementation with
44   // mock objects).
45   class TestApi {
46    public:
47     // Use the stub implementations of the library. This is mainly for
48     // running the chromeos build of chrome on the desktop.
49     void SetUseStubImpl();
50 
51     // Reset the stub implementations of the library, called after
52     // SetUseStubImp is called.
53     void ResetUseStubImpl();
54 
55     // Passing true for own for these setters will cause them to be deleted
56     // when the CrosLibrary is deleted (or other mocks are set).
57     // Setter for LibraryLoader.
58     void SetLibraryLoader(LibraryLoader* loader, bool own);
59     void SetBrightnessLibrary(BrightnessLibrary* library, bool own);
60     void SetBurnLibrary(BurnLibrary* library, bool own);
61     void SetCryptohomeLibrary(CryptohomeLibrary* library, bool own);
62     void SetInputMethodLibrary(InputMethodLibrary* library, bool own);
63     void SetLibCrosServiceLibrary(LibCrosServiceLibrary* library, bool own);
64     void SetLoginLibrary(LoginLibrary* library, bool own);
65     void SetMountLibrary(MountLibrary* library, bool own);
66     void SetNetworkLibrary(NetworkLibrary* library, bool own);
67     void SetPowerLibrary(PowerLibrary* library, bool own);
68     void SetScreenLockLibrary(ScreenLockLibrary* library, bool own);
69     void SetSpeechSynthesisLibrary(SpeechSynthesisLibrary* library, bool own);
70     void SetSyslogsLibrary(SyslogsLibrary* library, bool own);
71     void SetTouchpadLibrary(TouchpadLibrary* library, bool own);
72     void SetUpdateLibrary(UpdateLibrary* library, bool own);
73 
74    private:
75     friend class CrosLibrary;
TestApi(CrosLibrary * library)76     explicit TestApi(CrosLibrary* library) : library_(library) {}
77     CrosLibrary* library_;
78   };
79 
80   // This gets the CrosLibrary.
81   static CrosLibrary* Get();
82 
83   BrightnessLibrary* GetBrightnessLibrary();
84   BurnLibrary* GetBurnLibrary();
85   CryptohomeLibrary* GetCryptohomeLibrary();
86   InputMethodLibrary* GetInputMethodLibrary();
87   LibCrosServiceLibrary* GetLibCrosServiceLibrary();
88   LoginLibrary* GetLoginLibrary();
89   MountLibrary* GetMountLibrary();
90   NetworkLibrary* GetNetworkLibrary();
91   PowerLibrary* GetPowerLibrary();
92   ScreenLockLibrary* GetScreenLockLibrary();
93   SpeechSynthesisLibrary* GetSpeechSynthesisLibrary();
94   SyslogsLibrary* GetSyslogsLibrary();
95   TouchpadLibrary* GetTouchpadLibrary();
96   UpdateLibrary* GetUpdateLibrary();
97 
98   // Getter for Test API that gives access to internal members of this class.
99   TestApi* GetTestApi();
100 
101   // Ensures that the library is loaded, loading it if needed. If the library
102   // could not be loaded, returns false.
103   bool EnsureLoaded();
104 
105   // Returns an unlocalized string describing the last load error (if any).
load_error_string()106   const std::string& load_error_string() {
107     return load_error_string_;
108   }
109 
110  private:
111   friend struct base::DefaultLazyInstanceTraits<chromeos::CrosLibrary>;
112   friend class CrosLibrary::TestApi;
113 
114   CrosLibrary();
115   virtual ~CrosLibrary();
116 
117   LibraryLoader* library_loader_;
118 
119   bool own_library_loader_;
120 
121   // This template supports the creation, setting and optional deletion of
122   // the cros libraries.
123   template <class L>
124   class Library {
125    public:
126     Library() : library_(NULL), own_(true) {}
127 
128     ~Library() {
129       if (own_)
130         delete library_;
131     }
132 
133     L* GetDefaultImpl(bool use_stub_impl) {
134       if (!library_) {
135         own_ = true;
136         if (CommandLine::ForCurrentProcess()->HasSwitch(
137             switches::kForceStubLibcros))
138           use_stub_impl = true;
139         library_ = L::GetImpl(use_stub_impl);
140       }
141       return library_;
142     }
143 
144     void SetImpl(L* library, bool own) {
145       if (library != library_) {
146         if (own_)
147           delete library_;
148         library_ = library;
149         own_ = own;
150       }
151     }
152 
153    private:
154     L* library_;
155     bool own_;
156   };
157 
158   Library<BrightnessLibrary> brightness_lib_;
159   Library<BurnLibrary> burn_lib_;
160   Library<CryptohomeLibrary> crypto_lib_;
161   Library<InputMethodLibrary> input_method_lib_;
162   Library<LibCrosServiceLibrary> libcros_service_lib_;
163   Library<LoginLibrary> login_lib_;
164   Library<MountLibrary> mount_lib_;
165   Library<NetworkLibrary> network_lib_;
166   Library<PowerLibrary> power_lib_;
167   Library<ScreenLockLibrary> screen_lock_lib_;
168   Library<SpeechSynthesisLibrary> speech_synthesis_lib_;
169   Library<SyslogsLibrary> syslogs_lib_;
170   Library<TouchpadLibrary> touchpad_lib_;
171   Library<UpdateLibrary> update_lib_;
172 
173   // Stub implementations of the libraries should be used.
174   bool use_stub_impl_;
175   // True if libcros was successfully loaded.
176   bool loaded_;
177   // True if the last load attempt had an error.
178   bool load_error_;
179   // Contains the error string from the last load attempt.
180   std::string load_error_string_;
181   scoped_ptr<TestApi> test_api_;
182 
183   DISALLOW_COPY_AND_ASSIGN(CrosLibrary);
184 };
185 
186 // The class is used for enabling the stub libcros, and cleaning it up at
187 // the end of the object lifetime. Useful for testing.
188 class ScopedStubCrosEnabler {
189  public:
190   ScopedStubCrosEnabler() {
191     chromeos::CrosLibrary::Get()->GetTestApi()->SetUseStubImpl();
192   }
193 
194   ~ScopedStubCrosEnabler() {
195     chromeos::CrosLibrary::Get()->GetTestApi()->ResetUseStubImpl();
196   }
197 
198  private:
199   DISALLOW_COPY_AND_ASSIGN(ScopedStubCrosEnabler);
200 };
201 
202 }  // namespace chromeos
203 
204 #endif  // CHROME_BROWSER_CHROMEOS_CROS_CROS_LIBRARY_H_
205