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