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;