buffet: Add device state manager

Added StateManager class to buffet and all the internals to
load vendor-provided state definition fragments, apply state
property defaults, expose the state property values over D-Bus
to be updated by daemons (using Buffet.UpdateState method) and
sent the current device state to GCD server as part of device
draft provided during device registration.

BUG=chromium:415364
TEST=FEATURES=test emerge-link buffet

Change-Id: I78e470c98d906064dfbe925614613ee6a91ff3cf
Reviewed-on: https://chromium-review.googlesource.com/218743
Tested-by: Alex Vakulenko <avakulenko@chromium.org>
Reviewed-by: Christopher Wiley <wiley@chromium.org>
Commit-Queue: Alex Vakulenko <avakulenko@chromium.org>
diff --git a/buffet/manager.cc b/buffet/manager.cc
index 5af35a5..03a5443 100644
--- a/buffet/manager.cc
+++ b/buffet/manager.cc
@@ -21,6 +21,7 @@
 #include "buffet/commands/command_instance.h"
 #include "buffet/commands/command_manager.h"
 #include "buffet/libbuffet/dbus_constants.h"
+#include "buffet/states/state_manager.h"
 
 using chromeos::dbus_utils::AsyncEventSequencer;
 using chromeos::dbus_utils::ExportedObjectManager;
@@ -56,16 +57,14 @@
   itf->AddMethodHandler(dbus_constants::kManagerTestMethod,
                         base::Unretained(this),
                         &Manager::HandleTestMethod);
-  itf->AddProperty("State", &state_);
-  // TODO(wiley): Initialize all properties appropriately before claiming
-  //              the properties interface.
-  state_.SetValue("{}");
   dbus_object_.RegisterAsync(cb);
   command_manager_ =
       std::make_shared<CommandManager>(dbus_object_.GetObjectManager());
   command_manager_->Startup();
+  state_manager_ = std::make_shared<StateManager>();
+  state_manager_->Startup();
   device_info_ = std::unique_ptr<DeviceRegistrationInfo>(
-      new DeviceRegistrationInfo(command_manager_));
+      new DeviceRegistrationInfo(command_manager_, state_manager_));
   device_info_->Load();
 }
 
@@ -118,9 +117,9 @@
 }
 
 void Manager::HandleUpdateState(
-    chromeos::ErrorPtr* error, const std::string& json_state_fragment) {
-  // TODO(wiley): Merge json state blobs intelligently.
-  state_.SetValue(json_state_fragment);
+    chromeos::ErrorPtr* error,
+    const chromeos::dbus_utils::Dictionary& property_set) {
+  state_manager_->UpdateProperties(property_set, error);
 }
 
 void Manager::HandleAddCommand(