buffet: Add GCD device draft record to device registration

Use the command definitions provided by Command Manager in
device registration record sent to GCD server.

BUG=chromium:396716
TEST=USE=buffet P2_TEST_FILTER="buffet::*" FEATURES=test emerge-link platform2

Change-Id: If9109bfee8862d9252cdb03301a4362492064809
Reviewed-on: https://chromium-review.googlesource.com/210146
Reviewed-by: Christopher Wiley <wiley@chromium.org>
Tested-by: Alex Vakulenko <avakulenko@chromium.org>
Commit-Queue: Alex Vakulenko <avakulenko@chromium.org>
diff --git a/buffet/commands/command_dictionary.cc b/buffet/commands/command_dictionary.cc
index dcba8c9..e011a23 100644
--- a/buffet/commands/command_dictionary.cc
+++ b/buffet/commands/command_dictionary.cc
@@ -145,6 +145,34 @@
   return true;
 }
 
+std::unique_ptr<base::DictionaryValue> CommandDictionary::GetCommandsAsJson(
+    bool full_schema, ErrorPtr* error) const {
+  std::unique_ptr<base::DictionaryValue> dict(new base::DictionaryValue);
+  for (const auto& pair : definitions_) {
+    std::unique_ptr<base::DictionaryValue> definition =
+        pair.second->GetParameters()->ToJson(full_schema, error);
+    if (!definition) {
+      dict.reset();
+      return dict;
+    }
+    auto cmd_name_parts = string_utils::SplitAtFirst(pair.first, '.');
+    std::string package_name = cmd_name_parts.first;
+    std::string command_name = cmd_name_parts.second;
+    base::DictionaryValue* package = nullptr;
+    if (!dict->GetDictionaryWithoutPathExpansion(package_name, &package)) {
+      // If this is the first time we encounter this package, create a JSON
+      // object for it.
+      package = new base::DictionaryValue;
+      dict->SetWithoutPathExpansion(package_name, package);
+    }
+    base::DictionaryValue* command_def = new base::DictionaryValue;
+    command_def->SetWithoutPathExpansion(
+        commands::attributes::kCommand_Parameters, definition.release());
+    package->SetWithoutPathExpansion(command_name, command_def);
+  }
+  return dict;
+}
+
 const CommandDefinition* CommandDictionary::FindCommand(
     const std::string& command_name) const {
   auto pair = definitions_.find(command_name);