buffet: Add ability to add commands via buffet_client

Implemented "AddCommand" parameter in buffet_client that queues
a GCD command in buffet daemon.

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

Change-Id: Ie5a6561efc8675ba5fb234c1151a0f1dbda39e5d
Reviewed-on: https://chromium-review.googlesource.com/217829
Reviewed-by: Christopher Wiley <wiley@chromium.org>
Reviewed-by: Anton Muhin <antonm@chromium.org>
Commit-Queue: Alex Vakulenko <avakulenko@chromium.org>
Tested-by: Alex Vakulenko <avakulenko@chromium.org>
diff --git a/buffet/buffet_client.cc b/buffet/buffet_client.cc
index 38ea239..14636f8 100644
--- a/buffet/buffet_client.cc
+++ b/buffet/buffet_client.cc
@@ -37,6 +37,9 @@
                     << " param1 = val1&param2 = val2..." << std::endl;
   std::cerr << "  " << kManagerFinishRegisterDevice
                     << " device_id" << std::endl;
+  std::cerr << "  " << kManagerAddCommand
+                    << " '{\"name\":\"command_name\",\"parameters\":{}}'"
+                    << std::endl;
   std::cerr << "  " << kManagerUpdateStateMethod << std::endl;
   std::cerr << "  " << dbus::kObjectManagerGetManagedObjects << std::endl;
 }
@@ -235,6 +238,26 @@
     return EX_OK;
   }
 
+  int CallManagerAddCommand(const CommandLine::StringVector& args) {
+    if (args.size() != 1) {
+      std::cerr << "Invalid number of arguments for "
+                << "Manager." << kManagerAddCommand << std::endl;
+      usage();
+      return EX_USAGE;
+    }
+    dbus::MethodCall method_call(
+        kManagerInterface, kManagerAddCommand);
+    dbus::MessageWriter writer(&method_call);
+    writer.AppendString(args.front());
+    scoped_ptr<dbus::Response> response(
+        manager_proxy_->CallMethodAndBlock(&method_call, default_timeout_ms));
+    if (!response) {
+      std::cout << "Failed to receive a response." << std::endl;
+      return EX_UNAVAILABLE;
+    }
+    return EX_OK;
+  }
+
   int CallRootGetManagedObjects(const CommandLine::StringVector& args) {
     if (!args.empty()) {
       std::cerr << "Invalid number of arguments for "
@@ -299,6 +322,9 @@
   } else if (command.compare(kManagerUpdateStateMethod) == 0 ||
              command.compare("us") == 0) {
     err = helper.CallManagerUpdateState(args);
+  } else if (command.compare(kManagerAddCommand) == 0 ||
+             command.compare("ac") == 0) {
+    err = helper.CallManagerAddCommand(args);
   } else if (command.compare(dbus::kObjectManagerGetManagedObjects) == 0) {
     err = helper.CallRootGetManagedObjects(args);
   } else {