blob: e8e39642a89c98789bbd88512afe55923250fcbb [file] [log] [blame]
// 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_