| // Copyright 2015 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 CHROMECAST_BASE_DEVICE_CAPABILITIES_IMPL_H_ |
| #define CHROMECAST_BASE_DEVICE_CAPABILITIES_IMPL_H_ |
| |
| #include <memory> |
| #include <string> |
| #include <unordered_map> |
| |
| #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 { |
| public: |
| ~DeviceCapabilitiesImpl() override; |
| |
| // DeviceCapabilities implementation: |
| void Register(const std::string& key, Validator* validator) override; |
| void Unregister(const std::string& key, const Validator* validator) override; |
| Validator* GetValidator(const std::string& key) const override; |
| bool AssistantSupported() const override; |
| bool BluetoothSupported() const override; |
| bool DisplaySupported() const override; |
| bool HiResAudioSupported() const override; |
| std::unique_ptr<base::Value> GetCapability( |
| const std::string& path) const override; |
| scoped_refptr<Data> GetAllData() const override; |
| scoped_refptr<Data> GetPublicData() const override; |
| void SetCapability(const std::string& path, |
| std::unique_ptr<base::Value> proposed_value) override; |
| void MergeDictionary(const base::DictionaryValue& dict_value) override; |
| void AddCapabilitiesObserver(Observer* observer) override; |
| 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, |
| std::unique_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; |
| |
| // Map from capability key to corresponding ValidatorInfo. Gets updated |
| // in Register()/Unregister(). |
| using ValidatorMap = |
| std::unordered_map<std::string, std::unique_ptr<ValidatorInfo>>; |
| |
| // Internal constructor used by static DeviceCapabilities::Create*() methods. |
| DeviceCapabilitiesImpl(); |
| |
| void SetPublicValidatedValue(const std::string& path, |
| std::unique_ptr<base::Value> new_value) override; |
| void SetPrivateValidatedValue( |
| const std::string& path, |
| std::unique_ptr<base::Value> new_value) override; |
| void SetValidatedValueInternal(const std::string& path, |
| std::unique_ptr<base::Value> new_value); |
| |
| scoped_refptr<Data> GenerateDataWithNewValue( |
| const base::DictionaryValue& dict, |
| const std::string& path, |
| std::unique_ptr<base::Value> new_value); |
| |
| // Lock for reading/writing all_data_ or public_data_ pointers |
| mutable base::Lock data_lock_; |
| // Lock for reading/writing validator_map_ |
| mutable base::Lock validation_lock_; |
| |
| // Contains all public and private capabilities. |
| scoped_refptr<Data> all_data_; |
| // Contains only public capabilities. All capabilities in public_data_ are |
| // present and duplicated in all_data_. This duplication allows callers to |
| // quickly query public capabilities without having build a new data |
| // dictionary. |
| scoped_refptr<Data> public_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_; |
| const scoped_refptr<base::ObserverListThreadSafe<Observer>> observer_list_; |
| |
| DISALLOW_COPY_AND_ASSIGN(DeviceCapabilitiesImpl); |
| }; |
| |
| } // namespace chromecast |
| |
| #endif // CHROMECAST_BASE_DEVICE_CAPABILITIES_IMPL_H_ |