1 // 2 // Copyright (C) 2009 The Android Open Source Project 3 // 4 // Licensed under the Apache License, Version 2.0 (the "License"); 5 // you may not use this file except in compliance with the License. 6 // You may obtain a copy of the License at 7 // 8 // http://www.apache.org/licenses/LICENSE-2.0 9 // 10 // Unless required by applicable law or agreed to in writing, software 11 // distributed under the License is distributed on an "AS IS" BASIS, 12 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 // See the License for the specific language governing permissions and 14 // limitations under the License. 15 // 16 17 #ifndef UPDATE_ENGINE_PAYLOAD_CONSUMER_FILE_WRITER_H_ 18 #define UPDATE_ENGINE_PAYLOAD_CONSUMER_FILE_WRITER_H_ 19 20 #include <fcntl.h> 21 #include <sys/stat.h> 22 #include <sys/types.h> 23 #include <unistd.h> 24 25 #include <android-base/strings.h> 26 #include <base/logging.h> 27 28 #include "update_engine/common/error_code.h" 29 #include "update_engine/common/utils.h" 30 31 // FileWriter is a class that is used to (synchronously, for now) write to 32 // a file. This file is a thin wrapper around open/write/close system calls, 33 // but provides and interface that can be customized by subclasses that wish 34 // to filter the data. 35 36 namespace chromeos_update_engine { 37 38 class FileWriter { 39 public: FileWriter()40 FileWriter() {} ~FileWriter()41 virtual ~FileWriter() {} 42 43 // Wrapper around write. Returns true if all requested bytes 44 // were written, or false on any error, regardless of progress. 45 virtual bool Write(const void* bytes, size_t count) = 0; 46 47 // Same as the Write method above but returns a detailed |error| code 48 // in addition if the returned value is false. By default this method 49 // returns kActionExitDownloadWriteError as the error code, but subclasses 50 // can override if they wish to return more specific error codes. Write(const void * bytes,size_t count,ErrorCode * error)51 virtual bool Write(const void* bytes, size_t count, ErrorCode* error) { 52 *error = ErrorCode::kDownloadWriteError; 53 return Write(bytes, count); 54 } 55 56 // Wrapper around close. Returns 0 on success or -errno on error. 57 virtual int Close() = 0; 58 59 private: 60 DISALLOW_COPY_AND_ASSIGN(FileWriter); 61 }; 62 63 // Direct file writer is probably the simplest FileWriter implementation. 64 // It calls the system calls directly. 65 66 class DirectFileWriter : public FileWriter { 67 public: 68 DirectFileWriter() = default; 69 70 // FileWriter overrides. 71 bool Write(const void* bytes, size_t count) override; 72 int Close() override; 73 74 // Wrapper around open. Returns 0 on success or -errno on error. 75 int Open(const char* path, int flags, mode_t mode); 76 fd()77 int fd() const { return fd_; } 78 79 private: 80 int fd_{-1}; 81 82 DISALLOW_COPY_AND_ASSIGN(DirectFileWriter); 83 }; 84 85 class ScopedFileWriterCloser { 86 public: ScopedFileWriterCloser(FileWriter * writer)87 explicit ScopedFileWriterCloser(FileWriter* writer) : writer_(writer) {} ~ScopedFileWriterCloser()88 ~ScopedFileWriterCloser() { 89 int err = writer_->Close(); 90 if (err) 91 LOG(ERROR) << "FileWriter::Close failed: " 92 << android::base::ErrnoNumberAsString(-err); 93 } 94 95 private: 96 FileWriter* writer_; 97 98 DISALLOW_COPY_AND_ASSIGN(ScopedFileWriterCloser); 99 }; 100 101 } // namespace chromeos_update_engine 102 103 #endif // UPDATE_ENGINE_PAYLOAD_CONSUMER_FILE_WRITER_H_ 104