buffet: Add State property to Manager

BUG=chromium:356368
TEST=Modified buffet_BasicDBusAPI verifies that Get and GetAll work.

Change-Id: I3af7cbbdee6d47405786420b0d00a71b0f883ec7
Reviewed-on: https://chromium-review.googlesource.com/192002
Tested-by: Christopher Wiley <wiley@chromium.org>
Reviewed-by: Chris Sosa <sosa@chromium.org>
Commit-Queue: Christopher Wiley <wiley@chromium.org>
diff --git a/buffet/manager.cc b/buffet/manager.cc
index 4daa9fc..e0a9b7a 100644
--- a/buffet/manager.cc
+++ b/buffet/manager.cc
@@ -28,9 +28,16 @@
                                   dbus_constants::kManagerUpdateStateMethod,
                                   base::Bind(&Manager::HandleUpdateState,
                                              base::Unretained(this)));
+  properties_.reset(new Properties(exported_object));
+  // TODO(wiley): Initialize all properties appropriately before claiming
+  //              the properties interface.
+  properties_->state_.SetValue("{}");
+  properties_->ClaimPropertiesInterface();
 }
 
 Manager::~Manager() {
+  // Prevent the properties object from making calls to the exported object.
+  properties_.reset(nullptr);
   // Unregister ourselves from the Bus.  This prevents the bus from calling
   // our callbacks in between the Manager's death and the bus unregistering
   // our exported object on shutdown.  Unretained makes no promises of memory
@@ -89,7 +96,8 @@
   }
 
   LOG(INFO) << "Received call to Manager.UpdateState()";
-  // TODO(wiley): Do something with these parameters to update state.
+  // TODO(wiley): Merge json state blobs intelligently.
+  properties_->state_.SetValue(json_state_fragment);
 
   // Send back our response.
   return dbus::Response::FromMethodCall(method_call);
diff --git a/buffet/manager.h b/buffet/manager.h
index d373a5e..cc65868 100644
--- a/buffet/manager.h
+++ b/buffet/manager.h
@@ -9,6 +9,9 @@
 #include <base/memory/scoped_ptr.h>
 #include <dbus/message.h>
 
+#include "buffet/dbus_constants.h"
+#include "buffet/exported_property_set.h"
+
 namespace buffet {
 
 class DBusManager;
@@ -22,6 +25,16 @@
   ~Manager();
 
  private:
+  struct Properties: public dbus_utils::ExportedPropertySet {
+   public:
+    dbus_utils::ExportedProperty<std::string> state_;
+    Properties(dbus::ExportedObject *manager_object)
+        : dbus_utils::ExportedPropertySet(manager_object) {
+      RegisterProperty(dbus_constants::kManagerInterface, "State", &state_);
+    }
+    virtual ~Properties() {}
+  };
+
   // Handles calls to org.chromium.Buffet.Manager.RegisterDevice().
   scoped_ptr<dbus::Response> HandleRegisterDevice(
       dbus::MethodCall* method_call);
@@ -30,6 +43,7 @@
       dbus::MethodCall* method_call);
 
   DBusManager* dbus_manager_;  // Weak;  DBusManager should outlive Manager.
+  scoped_ptr<Properties> properties_;
 
   DISALLOW_COPY_AND_ASSIGN(Manager);
 };