Index: chromecast/base/device_capabilities_impl.h |
diff --git a/chromecast/base/device_capabilities_impl.h b/chromecast/base/device_capabilities_impl.h |
index e58774cf088d51ed221fc4374cbb6ae5e943394e..4e61644b1fbb00a85791ca717055ec8818695fbe 100644 |
--- a/chromecast/base/device_capabilities_impl.h |
+++ b/chromecast/base/device_capabilities_impl.h |
@@ -5,11 +5,17 @@ |
#ifndef CHROMECAST_BASE_DEVICE_CAPABILITIES_IMPL_H_ |
#define CHROMECAST_BASE_DEVICE_CAPABILITIES_IMPL_H_ |
-#include "base/containers/hash_tables.h" |
-#include "base/observer_list.h" |
-#include "base/threading/thread_checker.h" |
+#include "base/containers/scoped_ptr_hash_map.h" |
+#include "base/macros.h" |
+#include "base/memory/weak_ptr.h" |
+#include "base/observer_list_threadsafe.h" |
+#include "base/synchronization/lock.h" |
#include "chromecast/base/device_capabilities.h" |
+namespace base { |
+class SingleThreadTaskRunner; |
+} |
+ |
namespace chromecast { |
class DeviceCapabilitiesImpl : public DeviceCapabilities { |
@@ -22,10 +28,8 @@ class DeviceCapabilitiesImpl : public DeviceCapabilities { |
Validator* GetValidator(const std::string& key) const override; |
bool BluetoothSupported() const override; |
bool DisplaySupported() const override; |
- bool GetCapability(const std::string& path, |
- const base::Value** out_value) const override; |
- const std::string& GetCapabilitiesString() const override; |
- const base::DictionaryValue* GetCapabilities() const override; |
+ scoped_ptr<base::Value> GetCapability(const std::string& path) const override; |
+ scoped_refptr<Data> GetData() const override; |
void SetCapability(const std::string& path, |
scoped_ptr<base::Value> proposed_value) override; |
void MergeDictionary(const base::DictionaryValue& dict_value) override; |
@@ -33,28 +37,56 @@ class DeviceCapabilitiesImpl : public DeviceCapabilities { |
void RemoveCapabilitiesObserver(Observer* observer) override; |
private: |
+ class ValidatorInfo : public base::SupportsWeakPtr<ValidatorInfo> { |
+ public: |
+ explicit ValidatorInfo(Validator* validator); |
+ ~ValidatorInfo(); |
+ |
+ Validator* validator() const { return validator_; } |
+ |
+ scoped_refptr<base::SingleThreadTaskRunner> task_runner() const { |
+ return task_runner_; |
+ } |
+ |
+ void Validate(const std::string& path, |
+ scoped_ptr<base::Value> proposed_value) const; |
+ |
+ private: |
+ Validator* const validator_; |
+ // TaskRunner of thread that validator_ was registered on |
+ const scoped_refptr<base::SingleThreadTaskRunner> task_runner_; |
+ |
+ DISALLOW_COPY_AND_ASSIGN(ValidatorInfo); |
+ }; |
+ |
// For DeviceCapabilitiesImpl() |
friend class DeviceCapabilities; |
// For SetValidatedValueInternal() |
friend class DeviceCapabilities::Validator; |
- // Map from capability key to corresponding Validator. Gets updated |
+ // Map from capability key to corresponding ValidatorInfo. Gets updated |
// in Register()/Unregister(). |
- typedef base::hash_map<std::string, Validator*> ValidatorMap; |
+ typedef base::ScopedPtrHashMap<std::string, scoped_ptr<ValidatorInfo>> |
+ ValidatorMap; |
// Internal constructor used by static DeviceCapabilities::Create*() methods. |
DeviceCapabilitiesImpl(); |
- void SetValidatedValueInternal(const std::string& path, |
- scoped_ptr<base::Value> new_value) override; |
- void UpdateStrAndNotifyChanged(const std::string& path); |
+ void SetValidatedValue(const std::string& path, |
+ scoped_ptr<base::Value> new_value) override; |
+ |
+ // Lock for reading/writing data_ pointer |
+ mutable base::Lock data_lock_; |
+ // Lock for reading/writing validator_map_ |
+ mutable base::Lock validation_lock_; |
- scoped_ptr<base::DictionaryValue> capabilities_; |
- scoped_ptr<const std::string> capabilities_str_; |
+ scoped_refptr<Data> data_; |
+ // TaskRunner for capability writes. All internal writes to data_ must occur |
+ // on task_runner_for_writes_'s thread. |
+ const scoped_refptr<base::SingleThreadTaskRunner> task_runner_for_writes_; |
ValidatorMap validator_map_; |
- base::ObserverList<Observer> observer_list_; |
- base::ThreadChecker thread_checker_; |
+ const scoped_refptr<base::ObserverListThreadSafe<Observer>> observer_list_; |
DISALLOW_COPY_AND_ASSIGN(DeviceCapabilitiesImpl); |
}; |