xref: /aosp_15_r20/system/update_engine/payload_consumer/file_writer.h (revision 5a9231315b4521097b8dc3750bc806fcafe0c72f)
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