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;