// // Copyright (C) 2009 The Android Open Source Project // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // #ifndef UPDATE_ENGINE_PAYLOAD_CONSUMER_FILE_WRITER_H_ #define UPDATE_ENGINE_PAYLOAD_CONSUMER_FILE_WRITER_H_ #include <fcntl.h> #include <sys/stat.h> #include <sys/types.h> #include <unistd.h> #include <base/logging.h> #include "update_engine/common/error_code.h" #include "update_engine/common/utils.h" // FileWriter is a class that is used to (synchronously, for now) write to // a file. This file is a thin wrapper around open/write/close system calls, // but provides and interface that can be customized by subclasses that wish // to filter the data. namespace chromeos_update_engine { class FileWriter { public: FileWriter() {} virtual ~FileWriter() {} // Wrapper around write. Returns true if all requested bytes // were written, or false on any error, regardless of progress. virtual bool Write(const void* bytes, size_t count) = 0; // Same as the Write method above but returns a detailed |error| code // in addition if the returned value is false. By default this method // returns kActionExitDownloadWriteError as the error code, but subclasses // can override if they wish to return more specific error codes. virtual bool Write(const void* bytes, size_t count, ErrorCode* error) { *error = ErrorCode::kDownloadWriteError; return Write(bytes, count); } // Wrapper around close. Returns 0 on success or -errno on error. virtual int Close() = 0; private: DISALLOW_COPY_AND_ASSIGN(FileWriter); }; // Direct file writer is probably the simplest FileWriter implementation. // It calls the system calls directly. class DirectFileWriter : public FileWriter { public: DirectFileWriter() = default; // FileWriter overrides. bool Write(const void* bytes, size_t count) override; int Close() override; // Wrapper around open. Returns 0 on success or -errno on error. int Open(const char* path, int flags, mode_t mode); int fd() const { return fd_; } private: int fd_{-1}; DISALLOW_COPY_AND_ASSIGN(DirectFileWriter); }; class ScopedFileWriterCloser { public: explicit ScopedFileWriterCloser(FileWriter* writer) : writer_(writer) {} ~ScopedFileWriterCloser() { int err = writer_->Close(); if (err) LOG(ERROR) << "FileWriter::Close failed: " << utils::ErrnoNumberAsString(-err); } private: FileWriter* writer_; DISALLOW_COPY_AND_ASSIGN(ScopedFileWriterCloser); }; } // namespace chromeos_update_engine #endif // UPDATE_ENGINE_PAYLOAD_CONSUMER_FILE_WRITER_H_