buffet: Refactor async operations.

Use less of lambdas and keep the logic in methods.

BUG=None
TEST=cros_workon_make buffet --test&&manual

Change-Id: I6bc3bddaa69763b029af6960630b1bd1e5f5c30e
Reviewed-on: https://chromium-review.googlesource.com/225960
Reviewed-by: Anton Muhin <antonm@chromium.org>
Commit-Queue: Anton Muhin <antonm@chromium.org>
Tested-by: Anton Muhin <antonm@chromium.org>
diff --git a/buffet/device_registration_info.cc b/buffet/device_registration_info.cc
index 00fdecf..330b515 100644
--- a/buffet/device_registration_info.cc
+++ b/buffet/device_registration_info.cc
@@ -630,86 +630,92 @@
   if (!CheckRegistration(error))
     return;
 
+  base::Bind(
+      &DeviceRegistrationInfo::UpdateDeviceResource,
+      base::Unretained(this),
+      base::Bind(
+          &DeviceRegistrationInfo::FetchCommands,
+          base::Unretained(this),
+          base::Bind(
+              &DeviceRegistrationInfo::AbortLimboCommands,
+              base::Unretained(this),
+              base::Bind(
+                  &DeviceRegistrationInfo::PeriodicallyPollCommands,
+                  base::Unretained(this))))).Run();
+}
+
+void DeviceRegistrationInfo::UpdateDeviceResource(base::Closure callback) {
   std::unique_ptr<base::DictionaryValue> device_resource =
-      BuildDeviceResource(error);
+      BuildDeviceResource(nullptr);
   if (!device_resource)
     return;
 
-  auto std_errorback = base::Bind([](const chromeos::Error& error) {});
+  DoCloudRequest(
+      chromeos::http::request_type::kPut,
+      GetDeviceURL(),
+      device_resource.get(),
+      base::Bind([callback](const base::DictionaryValue&){
+        base::MessageLoop::current()->PostTask(FROM_HERE, callback);
+      }),
+      // TODO(antonm): Failure to update device resource probably deserves
+      // some additional actions.
+      base::Bind([](const chromeos::Error&){}));
+}
 
-  const std::string device_url{GetDeviceURL()};
-  auto update_device_resource = [device_url, std_errorback]
-      (DeviceRegistrationInfo* self, base::DictionaryValue* device_resource,
-       CloudRequestCallback callback) {
-    self->DoCloudRequest(
-        chromeos::http::request_type::kPut,
-        device_url,
-        device_resource,
-        // TODO(antonm): Failure to update device resource probably deserves
-        // some additional actions.
-        callback, std_errorback);
-  };
+void DeviceRegistrationInfo::FetchCommands(
+    base::Callback<void(const base::ListValue&)> callback) {
+  DoCloudRequest(
+      chromeos::http::request_type::kGet,
+      GetServiceURL("commands/queue", {{"deviceId", device_id_}}),
+      nullptr,
+      base::Bind([callback](const base::DictionaryValue& json) {
+        const base::ListValue* commands{nullptr};
+        if (!json.GetList("commands", &commands)) {
+          VLOG(1) << "No commands in the response.";
+        }
+        const base::ListValue empty;
+        callback.Run(commands ? *commands : empty);
+      }),
+      base::Bind([](const chromeos::Error&){}));
+}
 
-  const std::string command_queue_url{
-    GetServiceURL("commands/queue", {{"deviceId", device_id_}})};
-  auto fetch_commands = [command_queue_url, std_errorback]
-      (DeviceRegistrationInfo* self,
-       CloudRequestCallback callback, const base::DictionaryValue&) {
-    self->DoCloudRequest(chromeos::http::request_type::kGet,
-                         command_queue_url,
-                         nullptr,
-                         callback, std_errorback);
-  };
-
-  auto abort_commands = [](base::Callback<void(void)> callback,
-                           const base::DictionaryValue& json) {
-    const base::ListValue* commands{nullptr};
-    if (json.GetList("commands", &commands)) {
-      const size_t size{commands->GetSize()};
-      for (size_t i = 0; i < size; ++i) {
-        const base::DictionaryValue* command{nullptr};
-        if (!commands->GetDictionary(i, &command)) {
-          LOG(WARNING) << "No command resource at " << i;
-          continue;
-        }
-        std::string command_state;
-        if (!command->GetString("state", &command_state)) {
-          LOG(WARNING) << "Command with no state at " << i;
-          continue;
-        }
-        if (command_state != "error" &&
-            command_state != "inProgress" &&
-            command_state != "paused") {
-          // It's not a limbo command, ignore.
-          continue;
-        }
-        std::string command_id;
-        if (!command->GetString("id", &command_id)) {
-          LOG(WARNING) << "Command with no ID at " << i;
-          continue;
-        }
-        // TODO(antonm): Really abort the command.
-      }
+void DeviceRegistrationInfo::AbortLimboCommands(
+    base::Closure callback, const base::ListValue& commands) {
+  const size_t size{commands.GetSize()};
+  for (size_t i = 0; i < size; ++i) {
+    const base::DictionaryValue* command{nullptr};
+    if (!commands.GetDictionary(i, &command)) {
+      LOG(WARNING) << "No command resource at " << i;
+      continue;
     }
-    base::MessageLoop::current()->PostTask(FROM_HERE, callback);
-  };
+    std::string command_state;
+    if (!command->GetString("state", &command_state)) {
+      LOG(WARNING) << "Command with no state at " << i;
+      continue;
+    }
+    if (command_state != "error" &&
+        command_state != "inProgress" &&
+        command_state != "paused") {
+      // It's not a limbo command, ignore.
+      continue;
+    }
+    std::string command_id;
+    if (!command->GetString("id", &command_id)) {
+      LOG(WARNING) << "Command with no ID at " << i;
+      continue;
+    }
+    // TODO(antonm): Really abort the command.
+  }
 
+  base::MessageLoop::current()->PostTask(FROM_HERE, callback);
+}
+
+void DeviceRegistrationInfo::PeriodicallyPollCommands() {
   auto delay = base::TimeDelta::FromSeconds(7);
-  auto poll_commands = [delay](DeviceRegistrationInfo* self) {
-    PostRepeatingTask(FROM_HERE, base::Bind([](){
-      VLOG(1) << "Poll commands";
-      // TODO(antonm): Implement real polling of commands.
-    }), delay);
-  };
-
-  base::Bind(update_device_resource,
-             base::Unretained(this),
-             base::Owned(device_resource.release()),
-             base::Bind(fetch_commands,
-                        base::Unretained(this),
-                        base::Bind(abort_commands,
-                                   base::Bind(poll_commands,
-                                              base::Unretained(this))))).Run();
+  PostRepeatingTask(FROM_HERE, base::Bind([]{
+    VLOG(1) << "Poll commands";
+    // TODO(antonm): Implement real polling of commands.
+  }), delay);
 }
 
 }  // namespace buffet
diff --git a/buffet/device_registration_info.h b/buffet/device_registration_info.h
index 80c57d8..c683e37 100644
--- a/buffet/device_registration_info.h
+++ b/buffet/device_registration_info.h
@@ -136,6 +136,15 @@
       CloudRequestCallback callback,
       CloudRequestErroback errorback);
 
+  void UpdateDeviceResource(base::Closure callback);
+
+  void FetchCommands(base::Callback<void(const base::ListValue&)> callback);
+
+  void AbortLimboCommands(base::Closure callback,
+                          const base::ListValue& commands);
+
+  void PeriodicallyPollCommands();
+
   // Builds Cloud API devices collection REST resouce which matches
   // current state of the device including command definitions
   // for all supported commands and current device state.