1// Copyright 2014 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#include "base/files/file_util.h"
6#include "chrome/browser/extensions/api/image_writer_private/destroy_partitions_operation.h"
7#include "chrome/browser/extensions/api/image_writer_private/error_messages.h"
8#include "content/public/browser/browser_thread.h"
9
10namespace extensions {
11namespace image_writer {
12
13// Number of bytes for the maximum partition table size.  GUID partition tables
14// reside in the second sector of the disk.  Disks can have up to 4k sectors.
15// See http://crbug.com/328246 for more information.
16const int kPartitionTableSize = 2 * 4096;
17
18DestroyPartitionsOperation::DestroyPartitionsOperation(
19    base::WeakPtr<OperationManager> manager,
20    const ExtensionId& extension_id,
21    const std::string& storage_unit_id)
22    : Operation(manager, extension_id, storage_unit_id) {}
23
24DestroyPartitionsOperation::~DestroyPartitionsOperation() {}
25
26void DestroyPartitionsOperation::StartImpl() {
27  if (!base::CreateTemporaryFileInDir(temp_dir_.path(), &image_path_)) {
28    Error(error::kTempFileError);
29    return;
30  }
31
32  scoped_ptr<char[]> buffer(new char[kPartitionTableSize]);
33  memset(buffer.get(), 0, kPartitionTableSize);
34
35  if (base::WriteFile(image_path_, buffer.get(), kPartitionTableSize) !=
36      kPartitionTableSize) {
37    Error(error::kTempFileError);
38    return;
39  }
40
41  content::BrowserThread::PostTask(
42      content::BrowserThread::FILE,
43      FROM_HERE,
44      base::Bind(&DestroyPartitionsOperation::Write,
45                 this,
46                 base::Bind(&DestroyPartitionsOperation::Finish, this)));
47}
48
49}  // namespace image_writer
50}  // namespace extensions
51