Add methods to dynamically update commands and state definitions BUG:24267885 Change-Id: I988cff3b1e5010bc0470bbed2313373bf3991efe Reviewed-on: https://weave-review.googlesource.com/1251 Reviewed-by: Alex Vakulenko <avakulenko@google.com>
diff --git a/libweave/include/weave/device.h b/libweave/include/weave/device.h index d8b6963..c673fcb 100644 --- a/libweave/include/weave/device.h +++ b/libweave/include/weave/device.h
@@ -45,6 +45,12 @@ virtual void AddSettingsChangedCallback( const SettingsChangedCallback& callback) = 0; + // Adds provided commands definitions. Can be called multiple times with + // condition that definitions do not conflict. + // Invalid value is fatal. + virtual void AddCommandDefinitions(const std::string& json) = 0; + virtual void AddCommandDefinitions(const base::DictionaryValue& dict) = 0; + // Callback type for AddCommandHandler. using CommandHandlerCallback = base::Callback<void(Command*)>; @@ -69,6 +75,18 @@ // Sets callback which is called when stat is changed. virtual void AddStateChangedCallback(const base::Closure& callback) = 0; + // Adds provided state definitions. Can be called multiple times with + // condition that definitions do not conflict. + // Invalid value is fatal. + virtual void AddStateDefinitions(const std::string& json) = 0; + virtual void AddStateDefinitions(const base::DictionaryValue& dict) = 0; + + // Updates multiple properties of the state. + // It's recommended to call this to initialize state defined by + // AddStateDefinitions. + virtual bool SetState(const std::string& json, ErrorPtr* error) = 0; + virtual bool SetState(const base::DictionaryValue& dict, ErrorPtr* error) = 0; + // Returns value of the single property. // |name| is full property name, including package name. e.g. "base.network". virtual std::unique_ptr<base::Value> GetStateProperty(
diff --git a/libweave/include/weave/test/mock_device.h b/libweave/include/weave/test/mock_device.h index af149b4..de6f01c 100644 --- a/libweave/include/weave/test/mock_device.h +++ b/libweave/include/weave/test/mock_device.h
@@ -21,12 +21,18 @@ MOCK_CONST_METHOD0(GetSettings, const Settings&()); MOCK_METHOD1(AddSettingsChangedCallback, void(const SettingsChangedCallback& callback)); + MOCK_METHOD1(AddCommandDefinitions, void(const std::string&)); + MOCK_METHOD1(AddCommandDefinitions, void(const base::DictionaryValue&)); MOCK_METHOD2(AddCommandHandler, void(const std::string&, const CommandHandlerCallback&)); MOCK_METHOD3(AddCommand, bool(const base::DictionaryValue&, std::string*, ErrorPtr*)); MOCK_METHOD1(FindCommand, Command*(const std::string&)); MOCK_METHOD1(AddStateChangedCallback, void(const base::Closure& callback)); + MOCK_METHOD1(AddStateDefinitions, void(const std::string&)); + MOCK_METHOD1(AddStateDefinitions, void(const base::DictionaryValue&)); + MOCK_METHOD2(SetState, bool(const std::string&, ErrorPtr*)); + MOCK_METHOD2(SetState, bool(const base::DictionaryValue&, ErrorPtr*)); MOCK_CONST_METHOD1(MockGetStateProperty, base::Value*(const std::string& name)); MOCK_METHOD3(SetStateProperty,
diff --git a/libweave/src/device_manager.cc b/libweave/src/device_manager.cc index 009df46..9c52912 100644 --- a/libweave/src/device_manager.cc +++ b/libweave/src/device_manager.cc
@@ -92,8 +92,12 @@ device_info_->AddGcdStateChangedCallback(callback); } -void DeviceManager::AddStateChangedCallback(const base::Closure& callback) { - state_manager_->AddChangedCallback(callback); +void DeviceManager::AddCommandDefinitions(const std::string& json) { + CHECK(command_manager_->LoadCommands(json, nullptr)); +} + +void DeviceManager::AddCommandDefinitions(const base::DictionaryValue& dict) { + CHECK(command_manager_->LoadCommands(dict, nullptr)); } bool DeviceManager::AddCommand(const base::DictionaryValue& command, @@ -111,6 +115,27 @@ return command_manager_->AddCommandHandler(command_name, callback); } +void DeviceManager::AddStateChangedCallback(const base::Closure& callback) { + state_manager_->AddChangedCallback(callback); +} + +void DeviceManager::AddStateDefinitions(const std::string& json) { + CHECK(state_manager_->LoadStateDefinition(json, nullptr)); +} + +void DeviceManager::AddStateDefinitions(const base::DictionaryValue& dict) { + CHECK(state_manager_->LoadStateDefinition(dict, nullptr)); +} + +bool DeviceManager::SetState(const std::string& json, ErrorPtr* error) { + return state_manager_->LoadStateDefaults(json, error); +} + +bool DeviceManager::SetState(const base::DictionaryValue& dict, + ErrorPtr* error) { + return state_manager_->LoadStateDefaults(dict, error); +} + bool DeviceManager::SetStateProperties( const base::DictionaryValue& property_set, ErrorPtr* error) {
diff --git a/libweave/src/device_manager.h b/libweave/src/device_manager.h index 72a24ab..516e5a4 100644 --- a/libweave/src/device_manager.h +++ b/libweave/src/device_manager.h
@@ -37,6 +37,8 @@ const Settings& GetSettings() const override; void AddSettingsChangedCallback( const SettingsChangedCallback& callback) override; + void AddCommandDefinitions(const std::string& json) override; + void AddCommandDefinitions(const base::DictionaryValue& dict) override; bool AddCommand(const base::DictionaryValue& command, std::string* id, ErrorPtr* error) override; @@ -44,6 +46,10 @@ void AddCommandHandler(const std::string& command_name, const CommandHandlerCallback& callback) override; void AddStateChangedCallback(const base::Closure& callback) override; + void AddStateDefinitions(const std::string& json) override; + void AddStateDefinitions(const base::DictionaryValue& dict) override; + bool SetState(const std::string& json, ErrorPtr* error) override; + bool SetState(const base::DictionaryValue& dict, ErrorPtr* error) override; bool SetStateProperties(const base::DictionaryValue& property_set, ErrorPtr* error) override; std::unique_ptr<base::Value> GetStateProperty(
diff --git a/libweave/src/states/state_manager.h b/libweave/src/states/state_manager.h index 5a64d78..3dbd0d5 100644 --- a/libweave/src/states/state_manager.h +++ b/libweave/src/states/state_manager.h
@@ -39,6 +39,10 @@ ~StateManager(); void AddChangedCallback(const base::Closure& callback); + bool LoadStateDefinition(const base::DictionaryValue& dict, ErrorPtr* error); + bool LoadStateDefinition(const std::string& json, ErrorPtr* error); + bool LoadStateDefaults(const base::DictionaryValue& dict, ErrorPtr* error); + bool LoadStateDefaults(const std::string& json, ErrorPtr* error); bool SetProperties(const base::DictionaryValue& property_set, ErrorPtr* error); std::unique_ptr<base::Value> GetProperty(const std::string& name) const; @@ -75,25 +79,11 @@ const base::Time& timestamp, ErrorPtr* error); - // Loads a device state fragment from a JSON object. - bool LoadStateDefinition(const base::DictionaryValue& dict, - ErrorPtr* error); - - // Loads a device state fragment JSON. - bool LoadStateDefinition(const std::string& json, - ErrorPtr* error); - // Loads the base device state fragment JSON. This state fragment // defines the standard state properties from the 'base' package as defined // by GCD specification. bool LoadBaseStateDefinition(const std::string& json, ErrorPtr* error); - // Loads state default values from JSON object. - bool LoadStateDefaults(const base::DictionaryValue& dict, ErrorPtr* error); - - // Loads state default values from JSON. - bool LoadStateDefaults(const std::string& json, ErrorPtr* error); - // Finds a package by its name. Returns nullptr if not found. StatePackage* FindPackage(const std::string& package_name); const StatePackage* FindPackage(const std::string& package_name) const;