Index: chrome/browser/extensions/system_info_watcher.h |
diff --git a/chrome/browser/extensions/system_info_watcher.h b/chrome/browser/extensions/system_info_watcher.h |
new file mode 100644 |
index 0000000000000000000000000000000000000000..b53acdc3f9199b9935a66df8729ee39661151129 |
--- /dev/null |
+++ b/chrome/browser/extensions/system_info_watcher.h |
@@ -0,0 +1,103 @@ |
+// Copyright (c) 2012 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_EXTENSIONS_SYSTEM_INFO_WATCHER_H_ |
+#define CHROME_BROWSER_EXTENSIONS_SYSTEM_INFO_WATCHER_H_ |
+ |
+#include <set> |
+ |
+#include "base/lazy_instance.h" |
+#include "base/memory/scoped_ptr.h" |
+#include "base/observer_list.h" |
+ |
+namespace extensions { |
+ |
+// The SystemInfoWatcher class is an abstract interface for watching system |
+// information change, e.g. storage free space changes. It is used by |
+// SystemInfoEventRouter to monitor device status for systemInfo.* API. |
+class SystemInfoWatcher { |
+ public: |
+ // Observer for system information changes. |
+ class Observer { |
+ public: |
+ virtual ~Observer() {} |
+ |
+ // Called when the storage available capacity gets changed. |
+ // |id|: identifies the storage unit on which the change happened. |
+ // |available_capacity|: the available capacity on the storage unit. |
+ virtual void OnStorageDeviceAvailableCapacityChanged(const std::string& id, |
+ double available_capacity) {} |
+ |
+ // Called when a new storage device is attached to the system, e.g. |
+ // a USB disk is plugged in. |
+ // |id|: The unique identifier for the storage device attached already. |
+ // |type|: The string of storage type. See storage_info_provider.h comment. |
+ // |capacity|: The total capacity of the storage device can hold. |
+ // |available_capacity|: The available capacity left on the storage device. |
+ virtual void OnStorageDeviceAdded(const std::string& id, |
+ const std::string& type, |
+ double capacity, |
+ double available_capacity) {} |
+ |
+ // Called when a storage device is removed from the system, e.g. |
+ // a USB disk is unplugged. |
+ // |id|: the identifier of the storage device that has been removed. |
+ virtual void OnStorageDeviceRemoved(const std::string& id) {} |
+ }; |
+ |
+ // Return the single shared instance. |
+ static SystemInfoWatcher* Get(); |
+ |
+ // Initialize for testing |
+ static void InitializeForTesting(SystemInfoWatcher* watcher); |
+ |
+ virtual ~SystemInfoWatcher(); |
+ |
+ // Add and remove the observer for device information change event. |
+ void AddObserver(Observer* observer); |
+ void RemoveObserver(Observer* observer); |
+ |
+ // Start watching the |event_name| event. Return true if the watching |
+ // succeeds to start. Otherwise, false is returned. |
+ virtual bool StartWatching(const std::string& event_name); |
+ |
+ // Stop watching the |event_name| event. Return true if the watching |
+ // succeeds to stop. Otherwise, false is returned. |
+ virtual bool StopWatching(const std::string& event_name); |
+ |
+ // Return true if the |event_name| event is being watched. |
+ virtual bool IsWatching(const std::string& event_name); |
+ |
+ protected: |
+ SystemInfoWatcher(); |
+ |
+ // Platform specific implementation for start/stop watching. |
+ virtual bool PlatformStartWatching(const std::string& event_name) = 0; |
+ virtual bool PlatformStopWatching(const std::string& event_name) = 0; |
+ |
+ // Template function for creating the shared instance. The parameter I is |
+ // the type of SystemInfoWatcher implementation. |
+ template<class I> |
+ static SystemInfoWatcher* GetInstance() { |
+ if (!single_shared_watcher_.Get().get()) { |
+ I* impl = new I(); |
+ single_shared_watcher_.Get().reset(impl); |
+ } |
+ return single_shared_watcher_.Get().get(); |
+ } |
+ |
+ ObserverList<SystemInfoWatcher::Observer> observers_; |
+ std::set<std::string> watching_event_names_; |
+ |
+ private: |
+ // The single shared SystemInfoWatcher instance. It is constructed only when |
+ // needed, and kept until the program exits. |
+ static base::LazyInstance<scoped_ptr<SystemInfoWatcher> > |
+ single_shared_watcher_; |
+ |
+ DISALLOW_COPY_AND_ASSIGN(SystemInfoWatcher); |
+}; |
+ |
+} // namespace extensions |
+#endif // CHROME_BROWSER_EXTENSIONS_SYSTEM_INFO_WATCHER_H_ |