|  | // Copyright 2015 The Weave Authors. All rights reserved. | 
|  | // Use of this source code is governed by a BSD-style license that can be | 
|  | // found in the LICENSE file. | 
|  |  | 
|  | #ifndef LIBWEAVE_SRC_STATES_STATE_PACKAGE_H_ | 
|  | #define LIBWEAVE_SRC_STATES_STATE_PACKAGE_H_ | 
|  |  | 
|  | #include <map> | 
|  | #include <memory> | 
|  | #include <string> | 
|  |  | 
|  | #include <base/macros.h> | 
|  | #include <weave/error.h> | 
|  |  | 
|  | #include "src/commands/object_schema.h" | 
|  | #include "src/commands/prop_values.h" | 
|  |  | 
|  | namespace base { | 
|  | class DictionaryValue; | 
|  | }  // namespace base | 
|  |  | 
|  | namespace weave { | 
|  |  | 
|  | // A package is a set of related state properties. GCD specification defines | 
|  | // a number of standard state properties in "base" package such as | 
|  | // "base.manufacturer", "base.model", "base.firmwareVersion" and so on. | 
|  | class StatePackage final { | 
|  | public: | 
|  | explicit StatePackage(const std::string& name); | 
|  |  | 
|  | // Loads state property definitions from a JSON object and adds them | 
|  | // to the current package. | 
|  | bool AddSchemaFromJson(const base::DictionaryValue* json, ErrorPtr* error); | 
|  | // Loads a set of state property values from a JSON object and assigns them | 
|  | // to existing properties.  A property must be defined prior to loading its | 
|  | // value.  We use this when we load default values during buffet startup. | 
|  | bool AddValuesFromJson(const base::DictionaryValue* json, ErrorPtr* error); | 
|  |  | 
|  | // Returns a set of state properties and their values as a JSON object. | 
|  | // After being aggregated across multiple packages, this becomes the device | 
|  | // state object passed to the GCD server or a local client in the format | 
|  | // described by GCD specification, e.g.: | 
|  | //  { | 
|  | //    "base": { | 
|  | //      "manufacturer":"...", | 
|  | //      "model":"..." | 
|  | //    }, | 
|  | //    "printer": { | 
|  | //      "message": "Printer low on cyan ink" | 
|  | //    } | 
|  | //  } | 
|  | std::unique_ptr<base::DictionaryValue> GetValuesAsJson() const; | 
|  |  | 
|  | // Gets the value for a specific state property. |property_name| must not | 
|  | // include the package name as part of the property name. | 
|  | std::unique_ptr<base::Value> GetPropertyValue( | 
|  | const std::string& property_name, | 
|  | ErrorPtr* error) const; | 
|  | // Sets the value for a specific state property. |property_name| must not | 
|  | // include the package name as part of the property name. | 
|  | bool SetPropertyValue(const std::string& property_name, | 
|  | const base::Value& value, | 
|  | ErrorPtr* error); | 
|  |  | 
|  | std::shared_ptr<const PropValue> GetProperty( | 
|  | const std::string& property_name) const { | 
|  | auto it = values_.find(property_name); | 
|  | return it != values_.end() ? it->second | 
|  | : std::shared_ptr<const PropValue>{}; | 
|  | } | 
|  |  | 
|  | // Returns the name of the this package. | 
|  | const std::string& GetName() const { return name_; } | 
|  |  | 
|  | private: | 
|  | std::string name_; | 
|  | ObjectSchema types_; | 
|  | ValueMap values_; | 
|  |  | 
|  | friend class StatePackageTestHelper; | 
|  | DISALLOW_COPY_AND_ASSIGN(StatePackage); | 
|  | }; | 
|  |  | 
|  | }  // namespace weave | 
|  |  | 
|  | #endif  // LIBWEAVE_SRC_STATES_STATE_PACKAGE_H_ |