| // | 
 | // 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_ |