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