1 // Copyright 2017 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 "components/zucchini/mapped_file.h"
6
7 #include <utility>
8
9 #include "base/files/file_util.h"
10 #include "build/build_config.h"
11
12 namespace zucchini {
13
MappedFileReader(base::File file)14 MappedFileReader::MappedFileReader(base::File file) {
15 if (!file.IsValid()) {
16 error_ = "Invalid file.";
17 return; // |buffer_| will be uninitialized, and therefore invalid.
18 }
19 if (!buffer_.Initialize(std::move(file))) {
20 error_ = "Can't map file to memory.";
21 }
22 }
23
MappedFileWriter(const base::FilePath & file_path,base::File file,size_t length)24 MappedFileWriter::MappedFileWriter(const base::FilePath& file_path,
25 base::File file,
26 size_t length)
27 : file_path_(file_path), delete_behavior_(kManualDeleteOnClose) {
28 if (!file.IsValid()) {
29 error_ = "Invalid file.";
30 return; // |buffer_| will be uninitialized, and therefore invalid.
31 }
32
33 #if defined(OS_WIN)
34 file_handle_ = file.Duplicate();
35 // Tell the OS to delete the file when all handles are closed.
36 if (file_handle_.DeleteOnClose(true)) {
37 delete_behavior_ = kAutoDeleteOnClose;
38 } else {
39 error_ = "Failed to mark file for delete-on-close.";
40 }
41 #endif // defined(OS_WIN)
42
43 bool is_ok = buffer_.Initialize(std::move(file), {0, length},
44 base::MemoryMappedFile::READ_WRITE_EXTEND);
45 if (!is_ok) {
46 error_ = "Can't map file to memory.";
47 }
48 }
49
~MappedFileWriter()50 MappedFileWriter::~MappedFileWriter() {
51 if (!HasError() && delete_behavior_ == kManualDeleteOnClose &&
52 !file_path_.empty() && !base::DeleteFile(file_path_, false)) {
53 error_ = "Failed to delete file.";
54 }
55 }
56
Keep()57 bool MappedFileWriter::Keep() {
58 #if defined(OS_WIN)
59 if (delete_behavior_ == kAutoDeleteOnClose &&
60 !file_handle_.DeleteOnClose(false)) {
61 error_ = "Failed to prevent deletion of file.";
62 return false;
63 }
64 #endif // defined(OS_WIN)
65 delete_behavior_ = kKeep;
66 return true;
67 }
68
69 } // namespace zucchini
70