Implement UpdateAttempterAndroid::AllocateSpaceForPayload am: 6561303cc3 am: ffd7be3e23

Change-Id: I66d7b77e3abb73ed18931e7a1a3e047518edd3d5
diff --git a/update_attempter_android.cc b/update_attempter_android.cc
index cc891e7..3292dd5 100644
--- a/update_attempter_android.cc
+++ b/update_attempter_android.cc
@@ -893,8 +893,34 @@
     const std::string& metadata_filename,
     const vector<string>& key_value_pair_headers,
     brillo::ErrorPtr* error) {
-  // TODO(elsk): implement b/138808058
-  LogAndSetError(error, FROM_HERE, "Not implemented.");
+  DeltaArchiveManifest manifest;
+  if (!VerifyPayloadParseManifest(metadata_filename, &manifest, error)) {
+    return 0;
+  }
+  std::map<string, string> headers;
+  if (!ParseKeyValuePairHeaders(key_value_pair_headers, &headers, error)) {
+    return 0;
+  }
+
+  string payload_id = GetPayloadId(headers);
+  uint64_t required_size = 0;
+  if (!DeltaPerformer::PreparePartitionsForUpdate(prefs_,
+                                                  boot_control_,
+                                                  GetTargetSlot(),
+                                                  manifest,
+                                                  payload_id,
+                                                  &required_size)) {
+    if (required_size == 0) {
+      LogAndSetError(error, FROM_HERE, "Failed to allocate space for payload.");
+      return 0;
+    } else {
+      LOG(ERROR) << "Insufficient space for payload: " << required_size
+                 << " bytes";
+      return required_size;
+    }
+  }
+
+  LOG(INFO) << "Successfully allocated space for payload.";
   return 0;
 }