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