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 #ifndef COMPONENTS_ZUCCHINI_MAPPED_FILE_H_
6 #define COMPONENTS_ZUCCHINI_MAPPED_FILE_H_
7 
8 #include <stddef.h>
9 #include <stdint.h>
10 
11 #include <string>
12 
13 #include "base/files/file.h"
14 #include "base/files/file_path.h"
15 #include "base/files/memory_mapped_file.h"
16 #include "components/zucchini/buffer_view.h"
17 
18 namespace zucchini {
19 
20 // A file reader wrapper.
21 class MappedFileReader {
22  public:
23   // Maps |file| to memory for reading. Also validates |file|. Errors are
24   // available via HasError() and error().
25   explicit MappedFileReader(base::File file);
26   MappedFileReader(const MappedFileReader&) = delete;
27   const MappedFileReader& operator=(const MappedFileReader&) = delete;
28 
data()29   const uint8_t* data() const { return buffer_.data(); }
length()30   size_t length() const { return buffer_.length(); }
region()31   zucchini::ConstBufferView region() const { return {data(), length()}; }
32 
HasError()33   bool HasError() { return !error_.empty() || !buffer_.IsValid(); }
error()34   const std::string& error() { return error_; }
35 
36  private:
37   std::string error_;
38   base::MemoryMappedFile buffer_;
39 };
40 
41 // A file writer wrapper. The target file is deleted on destruction unless
42 // Keep() is called.
43 class MappedFileWriter {
44  public:
45   // Maps |file| to memory for writing. |file_path| is needed for auto delete on
46   // UNIX systems, but can be empty if auto delete is not needed. Errors are
47   // available via HasError() and error().
48   MappedFileWriter(const base::FilePath& file_path,
49                    base::File file,
50                    size_t length);
51   MappedFileWriter(const MappedFileWriter&) = delete;
52   const MappedFileWriter& operator=(const MappedFileWriter&) = delete;
53   ~MappedFileWriter();
54 
data()55   uint8_t* data() { return buffer_.data(); }
length()56   size_t length() const { return buffer_.length(); }
region()57   zucchini::MutableBufferView region() { return {data(), length()}; }
58 
HasError()59   bool HasError() { return !error_.empty() || !buffer_.IsValid(); }
error()60   const std::string& error() { return error_; }
61 
62   // Indicates that the file should not be deleted on destruction. Returns true
63   // iff the operation succeeds.
64   bool Keep();
65 
66  private:
67   enum OnCloseDeleteBehavior {
68     kKeep,
69     kAutoDeleteOnClose,
70     kManualDeleteOnClose
71   };
72 
73   std::string error_;
74   base::FilePath file_path_;
75   base::File file_handle_;
76   base::MemoryMappedFile buffer_;
77   OnCloseDeleteBehavior delete_behavior_;
78 };
79 
80 }  // namespace zucchini
81 
82 #endif  // COMPONENTS_ZUCCHINI_MAPPED_FILE_H_
83