buffet: Add ObjectManager interface to /org/chromium/Buffet

BUG=chromium:359190
TEST=`buffet_client GetManagedObjects` returns
message_type: MESSAGE_METHOD_RETURN
destination: :1.35
sender: :1.31
signature: a{oa{sa{sv}}}
serial: 10
reply_serial: 3

array [
  dict entry {
    object_path "/org/chromium/Buffet/Manager"
    array [
      dict entry {
        string "org.chromium.Buffet.Manager"
        array [
          dict entry {
            string "State"
            variant               string "{}"
          }
        ]
      }
    ]
  }
]

Done.

Change-Id: I2bbcc9a3f71c7ec6ab76cb4600dad7efe1a8bb0a
Reviewed-on: https://chromium-review.googlesource.com/198963
Reviewed-by: Chris Sosa <sosa@chromium.org>
Commit-Queue: Christopher Wiley <wiley@chromium.org>
Tested-by: Christopher Wiley <wiley@chromium.org>
Reviewed-by: Ilja Friedel <ihf@chromium.org>
diff --git a/buffet/buffet_client.cc b/buffet/buffet_client.cc
index 34eb89f..a763e42 100644
--- a/buffet/buffet_client.cc
+++ b/buffet/buffet_client.cc
@@ -14,6 +14,7 @@
 #include <dbus/bus.h>
 #include <dbus/message.h>
 #include <dbus/object_proxy.h>
+#include <dbus/object_manager.h>
 #include <dbus/values_util.h>
 
 #include "buffet/dbus_constants.h"
@@ -34,6 +35,7 @@
   std::cerr << "  " << kManagerFinishRegisterDevice
                     << " device_id" << std::endl;
   std::cerr << "  " << kManagerUpdateStateMethod << std::endl;
+  std::cerr << "  " << dbus::kObjectManagerGetManagedObjects << std::endl;
 }
 
 class BuffetHelperProxy {
@@ -45,6 +47,9 @@
     manager_proxy_ = bus_->GetObjectProxy(
         kServiceName,
         dbus::ObjectPath(kManagerServicePath));
+    root_proxy_ = bus_->GetObjectProxy(
+        kServiceName,
+        dbus::ObjectPath(kRootServicePath));
     return EX_OK;
   }
 
@@ -226,9 +231,29 @@
     return EX_OK;
   }
 
+  int CallRootGetManagedObjects(const CommandLine::StringVector& args) {
+    if (!args.empty()) {
+      std::cerr << "Invalid number of arguments for "
+                << dbus::kObjectManagerGetManagedObjects << std::endl;
+      usage();
+      return EX_USAGE;
+    }
+    dbus::MethodCall method_call(
+        dbus::kObjectManagerInterface, dbus::kObjectManagerGetManagedObjects);
+    scoped_ptr<dbus::Response> response(
+        root_proxy_->CallMethodAndBlock(&method_call, default_timeout_ms));
+    if (!response) {
+      std::cout << "Failed to receive a response." << std::endl;
+      return EX_UNAVAILABLE;
+    }
+    std::cout << response->ToString() << std::endl;
+    return EX_OK;
+  }
+
  private:
   scoped_refptr<dbus::Bus> bus_;
   dbus::ObjectProxy* manager_proxy_{nullptr};  // NOLINT - initializer list
+  dbus::ObjectProxy* root_proxy_{nullptr};  // NOLINT - initializer list
 };
 
 }  // namespace
@@ -270,6 +295,8 @@
   } else if (command.compare(kManagerUpdateStateMethod) == 0 ||
              command.compare("us") == 0) {
     err = helper.CallManagerUpdateState(args);
+  } else if (command.compare(dbus::kObjectManagerGetManagedObjects) == 0) {
+    err = helper.CallRootGetManagedObjects(args);
   } else {
     std::cerr << "Unknown command: " << command << std::endl;
     usage();