#ifndef CHROMECAST_BASE_DEVICE_CAPABILITIES_IMPL_H_
#define CHROMECAST_BASE_DEVICE_CAPABILITIES_IMPL_H_
#include <memory>
#include <string>
#include <unordered_map>
#include "base/memory/raw_ptr.h"
#include "base/memory/weak_ptr.h"
#include "base/observer_list_threadsafe.h"
#include "base/synchronization/lock.h"
#include "base/values.h"
#include "chromecast/base/device_capabilities.h"
namespace base {
class SingleThreadTaskRunner;
}
namespace chromecast {
class DeviceCapabilitiesImpl : public DeviceCapabilities {
public:
DeviceCapabilitiesImpl(const DeviceCapabilitiesImpl&) = delete;
DeviceCapabilitiesImpl& operator=(const DeviceCapabilitiesImpl&) = delete;
~DeviceCapabilitiesImpl() override;
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;
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,
base::Value proposed_value) override;
void MergeDictionary(const base::Value::Dict& dict) override;
void AddCapabilitiesObserver(Observer* observer) override;
void RemoveCapabilitiesObserver(Observer* observer) override;
private:
class ValidatorInfo final {
public:
explicit ValidatorInfo(Validator* validator);
ValidatorInfo(const ValidatorInfo&) = delete;
ValidatorInfo& operator=(const ValidatorInfo&) = delete;
~ValidatorInfo();
Validator* validator() const { return validator_; }
scoped_refptr<base::SingleThreadTaskRunner> task_runner() const {
return task_runner_;
}
void Validate(const std::string& path, base::Value proposed_value) const;
base::WeakPtr<ValidatorInfo> AsWeakPtr() {
return weak_ptr_factory_.GetWeakPtr();
}
private:
const raw_ptr<Validator> validator_;
const scoped_refptr<base::SingleThreadTaskRunner> task_runner_;
base::WeakPtrFactory<ValidatorInfo> weak_ptr_factory_{this};
};
friend class DeviceCapabilities;
using ValidatorMap =
std::unordered_map<std::string, std::unique_ptr<ValidatorInfo>>;
DeviceCapabilitiesImpl();
void SetPublicValidatedValue(const std::string& path,
base::Value new_value) override;
void SetPrivateValidatedValue(const std::string& path,
base::Value new_value) override;
void SetValidatedValueInternal(const std::string& path,
base::Value new_value);
scoped_refptr<Data> GenerateDataWithNewValue(const base::Value::Dict& dict,
const std::string& path,
base::Value new_value);
mutable base::Lock data_lock_;
mutable base::Lock validation_lock_;
scoped_refptr<Data> all_data_;
scoped_refptr<Data> public_data_;
const scoped_refptr<base::SingleThreadTaskRunner> task_runner_for_writes_;
ValidatorMap validator_map_;
const scoped_refptr<base::ObserverListThreadSafe<Observer>> observer_list_;
};
}
#endif