blob: 2ea973c5a2d889210486d990ab778e31895a4896 [file] [log] [blame]
Samuel Huang06f1ae92018-03-13 18:19:34 +00001// 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"
Samuel Huang06f1ae92018-03-13 18:19:34 +000010#include "build/build_config.h"
11
12namespace zucchini {
13
Samuel Huangf35146e2018-06-21 15:50:22 +000014MappedFileReader::MappedFileReader(base::File file) {
Samuel Huang06f1ae92018-03-13 18:19:34 +000015 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
24MappedFileWriter::MappedFileWriter(const base::FilePath& file_path,
Samuel Huangf35146e2018-06-21 15:50:22 +000025 base::File file,
Samuel Huang06f1ae92018-03-13 18:19:34 +000026 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
50MappedFileWriter::~MappedFileWriter() {
51 if (!HasError() && delete_behavior_ == kManualDeleteOnClose &&
Kelvin Zhang539c01b2021-08-19 10:52:34 -070052 !file_path_.empty() && !base::DeleteFile(file_path_, false)) {
Samuel Huang06f1ae92018-03-13 18:19:34 +000053 error_ = "Failed to delete file.";
54 }
55}
56
57bool 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