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_EXTENT_WRITER_H_ 18*5a923131SAndroid Build Coastguard Worker #define UPDATE_ENGINE_PAYLOAD_CONSUMER_EXTENT_WRITER_H_ 19*5a923131SAndroid Build Coastguard Worker 20*5a923131SAndroid Build Coastguard Worker #include <memory> 21*5a923131SAndroid Build Coastguard Worker #include <utility> 22*5a923131SAndroid Build Coastguard Worker 23*5a923131SAndroid Build Coastguard Worker #include <base/logging.h> 24*5a923131SAndroid Build Coastguard Worker #include <brillo/secure_blob.h> 25*5a923131SAndroid Build Coastguard Worker 26*5a923131SAndroid Build Coastguard Worker #include "update_engine/payload_consumer/file_descriptor.h" 27*5a923131SAndroid Build Coastguard Worker #include "update_engine/update_metadata.pb.h" 28*5a923131SAndroid Build Coastguard Worker 29*5a923131SAndroid Build Coastguard Worker // ExtentWriter is an abstract class which synchronously writes to a given 30*5a923131SAndroid Build Coastguard Worker // file descriptor at the extents given. 31*5a923131SAndroid Build Coastguard Worker 32*5a923131SAndroid Build Coastguard Worker namespace chromeos_update_engine { 33*5a923131SAndroid Build Coastguard Worker 34*5a923131SAndroid Build Coastguard Worker class ExtentWriter { 35*5a923131SAndroid Build Coastguard Worker public: 36*5a923131SAndroid Build Coastguard Worker ExtentWriter() = default; 37*5a923131SAndroid Build Coastguard Worker virtual ~ExtentWriter() = default; 38*5a923131SAndroid Build Coastguard Worker 39*5a923131SAndroid Build Coastguard Worker // Returns true on success. 40*5a923131SAndroid Build Coastguard Worker virtual bool Init(const google::protobuf::RepeatedPtrField<Extent>& extents, 41*5a923131SAndroid Build Coastguard Worker uint32_t block_size) = 0; 42*5a923131SAndroid Build Coastguard Worker 43*5a923131SAndroid Build Coastguard Worker // Returns true on success. 44*5a923131SAndroid Build Coastguard Worker virtual bool Write(const void* bytes, size_t count) = 0; 45*5a923131SAndroid Build Coastguard Worker }; 46*5a923131SAndroid Build Coastguard Worker 47*5a923131SAndroid Build Coastguard Worker // DirectExtentWriter is probably the simplest ExtentWriter implementation. 48*5a923131SAndroid Build Coastguard Worker // It writes the data directly into the extents. 49*5a923131SAndroid Build Coastguard Worker 50*5a923131SAndroid Build Coastguard Worker class DirectExtentWriter : public ExtentWriter { 51*5a923131SAndroid Build Coastguard Worker public: DirectExtentWriter(FileDescriptorPtr fd)52*5a923131SAndroid Build Coastguard Worker explicit DirectExtentWriter(FileDescriptorPtr fd) : fd_(fd) {} 53*5a923131SAndroid Build Coastguard Worker ~DirectExtentWriter() override = default; 54*5a923131SAndroid Build Coastguard Worker Init(const google::protobuf::RepeatedPtrField<Extent> & extents,uint32_t block_size)55*5a923131SAndroid Build Coastguard Worker bool Init(const google::protobuf::RepeatedPtrField<Extent>& extents, 56*5a923131SAndroid Build Coastguard Worker uint32_t block_size) override { 57*5a923131SAndroid Build Coastguard Worker block_size_ = block_size; 58*5a923131SAndroid Build Coastguard Worker extents_ = extents; 59*5a923131SAndroid Build Coastguard Worker cur_extent_ = extents_.begin(); 60*5a923131SAndroid Build Coastguard Worker return true; 61*5a923131SAndroid Build Coastguard Worker } 62*5a923131SAndroid Build Coastguard Worker bool Write(const void* bytes, size_t count) override; 63*5a923131SAndroid Build Coastguard Worker 64*5a923131SAndroid Build Coastguard Worker private: 65*5a923131SAndroid Build Coastguard Worker FileDescriptorPtr fd_{nullptr}; 66*5a923131SAndroid Build Coastguard Worker 67*5a923131SAndroid Build Coastguard Worker size_t block_size_{0}; 68*5a923131SAndroid Build Coastguard Worker // Bytes written into |cur_extent_| thus far. 69*5a923131SAndroid Build Coastguard Worker uint64_t extent_bytes_written_{0}; 70*5a923131SAndroid Build Coastguard Worker google::protobuf::RepeatedPtrField<Extent> extents_; 71*5a923131SAndroid Build Coastguard Worker // The next call to write should correspond to |cur_extents_|. 72*5a923131SAndroid Build Coastguard Worker google::protobuf::RepeatedPtrField<Extent>::iterator cur_extent_; 73*5a923131SAndroid Build Coastguard Worker }; 74*5a923131SAndroid Build Coastguard Worker 75*5a923131SAndroid Build Coastguard Worker } // namespace chromeos_update_engine 76*5a923131SAndroid Build Coastguard Worker 77*5a923131SAndroid Build Coastguard Worker #endif // UPDATE_ENGINE_PAYLOAD_CONSUMER_EXTENT_WRITER_H_ 78