Add fake component/trait property to device draft To enable clients to start developing using the new trait/component model, add a generated sections for "traits" and "components" to the device draft. The actual content of these nodes will change once full support for traits/components are added to libweave. This change is a temporary stop-gap measure. Change-Id: I0ec0f76034a2b1dca9870eda3614fe563cecb552 Reviewed-on: https://weave-review.googlesource.com/1720 Reviewed-by: Vitaly Buka <vitalybuka@google.com>
diff --git a/src/device_registration_info.cc b/src/device_registration_info.cc index 30e8862..33b1643 100644 --- a/src/device_registration_info.cc +++ b/src/device_registration_info.cc
@@ -14,6 +14,7 @@ #include <base/json/json_reader.h> #include <base/json/json_writer.h> #include <base/strings/string_number_conversions.h> +#include <base/strings/stringprintf.h> #include <base/values.h> #include <weave/provider/http_client.h> #include <weave/provider/network.h> @@ -505,6 +506,31 @@ resource->Set("commandDefs", commands.DeepCopy()); resource->Set("state", state.DeepCopy()); + // TODO(avakulenko): Temporary code to generate a single top-level component + // using the new component-trait model. This is to unblock clients to start + // implementation on their side. + base::DictionaryValue traits; + base::DictionaryValue component; + std::set<std::string> all_traits; + for (const auto& pair : state_manager_->packages()) { + all_traits.insert(pair.first); + std::string key = base::StringPrintf("%s.state", pair.first.c_str()); + traits.Set(key, pair.second->types().DeepCopy()); + key = base::StringPrintf("state.%s", pair.first.c_str()); + component.Set(key, pair.second->GetValuesAsJson().DeepCopy()); + } + for (base::DictionaryValue::Iterator it(commands); !it.IsAtEnd(); + it.Advance()) { + all_traits.insert(it.key()); + std::string key = base::StringPrintf("%s.commands", it.key().c_str()); + traits.Set(key, it.value().DeepCopy()); + } + resource->Set("traits", traits.DeepCopy()); + base::ListValue* trait_list = new base::ListValue(); + for (const std::string& trait : all_traits) + trait_list->AppendString(trait); + component.Set("traits", trait_list); + resource->Set("components.device", component.DeepCopy()); return resource; }
diff --git a/src/states/state_manager.h b/src/states/state_manager.h index c48a57c..bd1eb92 100644 --- a/src/states/state_manager.h +++ b/src/states/state_manager.h
@@ -58,6 +58,10 @@ return state_change_queue_; } + const std::map<std::string, std::unique_ptr<StatePackage>>& packages() const { + return packages_; + } + private: friend class BaseApiHandlerTest; friend class StateManagerTest;
diff --git a/src/states/state_package.h b/src/states/state_package.h index 4092948..afc4c52 100644 --- a/src/states/state_package.h +++ b/src/states/state_package.h
@@ -58,6 +58,8 @@ // Returns the name of the this package. const std::string& GetName() const { return name_; } + const base::DictionaryValue& types() const { return types_; } + private: std::string name_; base::DictionaryValue types_;