xref: /aosp_15_r20/system/update_engine/payload_consumer/extent_reader.h (revision 5a9231315b4521097b8dc3750bc806fcafe0c72f)
1*5a923131SAndroid Build Coastguard Worker //
2*5a923131SAndroid Build Coastguard Worker // Copyright (C) 2017 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_READER_H_
18*5a923131SAndroid Build Coastguard Worker #define UPDATE_ENGINE_PAYLOAD_CONSUMER_EXTENT_READER_H_
19*5a923131SAndroid Build Coastguard Worker 
20*5a923131SAndroid Build Coastguard Worker #include <vector>
21*5a923131SAndroid Build Coastguard Worker 
22*5a923131SAndroid Build Coastguard Worker #include "update_engine/payload_consumer/file_descriptor.h"
23*5a923131SAndroid Build Coastguard Worker #include "update_engine/update_metadata.pb.h"
24*5a923131SAndroid Build Coastguard Worker 
25*5a923131SAndroid Build Coastguard Worker namespace chromeos_update_engine {
26*5a923131SAndroid Build Coastguard Worker 
27*5a923131SAndroid Build Coastguard Worker // ExtentReader is an abstract class with reads from a given file descriptor at
28*5a923131SAndroid Build Coastguard Worker // the extents given.
29*5a923131SAndroid Build Coastguard Worker class ExtentReader {
30*5a923131SAndroid Build Coastguard Worker  public:
31*5a923131SAndroid Build Coastguard Worker   virtual ~ExtentReader() = default;
32*5a923131SAndroid Build Coastguard Worker 
33*5a923131SAndroid Build Coastguard Worker   // Initializes |ExtentReader|
34*5a923131SAndroid Build Coastguard Worker   virtual bool Init(FileDescriptorPtr fd,
35*5a923131SAndroid Build Coastguard Worker                     const google::protobuf::RepeatedPtrField<Extent>& extents,
36*5a923131SAndroid Build Coastguard Worker                     uint32_t block_size) = 0;
37*5a923131SAndroid Build Coastguard Worker 
38*5a923131SAndroid Build Coastguard Worker   // Seeks to the given |offset| assuming all extents are concatenated together.
39*5a923131SAndroid Build Coastguard Worker   virtual bool Seek(uint64_t offset) = 0;
40*5a923131SAndroid Build Coastguard Worker 
41*5a923131SAndroid Build Coastguard Worker   // Returns true on success.
42*5a923131SAndroid Build Coastguard Worker   virtual bool Read(void* buffer, size_t count) = 0;
43*5a923131SAndroid Build Coastguard Worker };
44*5a923131SAndroid Build Coastguard Worker 
45*5a923131SAndroid Build Coastguard Worker // DirectExtentReader is probably the simplest ExtentReader implementation.
46*5a923131SAndroid Build Coastguard Worker // It reads the data directly from the extents.
47*5a923131SAndroid Build Coastguard Worker class DirectExtentReader : public ExtentReader {
48*5a923131SAndroid Build Coastguard Worker  public:
49*5a923131SAndroid Build Coastguard Worker   DirectExtentReader() = default;
50*5a923131SAndroid Build Coastguard Worker   ~DirectExtentReader() override = default;
51*5a923131SAndroid Build Coastguard Worker 
52*5a923131SAndroid Build Coastguard Worker   bool Init(FileDescriptorPtr fd,
53*5a923131SAndroid Build Coastguard Worker             const google::protobuf::RepeatedPtrField<Extent>& extents,
54*5a923131SAndroid Build Coastguard Worker             uint32_t block_size) override;
55*5a923131SAndroid Build Coastguard Worker   bool Seek(uint64_t offset) override;
56*5a923131SAndroid Build Coastguard Worker   bool Read(void* bytes, size_t count) override;
57*5a923131SAndroid Build Coastguard Worker 
58*5a923131SAndroid Build Coastguard Worker  private:
59*5a923131SAndroid Build Coastguard Worker   FileDescriptorPtr fd_{nullptr};
60*5a923131SAndroid Build Coastguard Worker   google::protobuf::RepeatedPtrField<Extent> extents_;
61*5a923131SAndroid Build Coastguard Worker   size_t block_size_{0};
62*5a923131SAndroid Build Coastguard Worker 
63*5a923131SAndroid Build Coastguard Worker   // Current extent being read from |fd_|.
64*5a923131SAndroid Build Coastguard Worker   google::protobuf::RepeatedPtrField<Extent>::iterator cur_extent_;
65*5a923131SAndroid Build Coastguard Worker 
66*5a923131SAndroid Build Coastguard Worker   // Bytes read from |cur_extent_| thus far.
67*5a923131SAndroid Build Coastguard Worker   uint64_t cur_extent_bytes_read_{0};
68*5a923131SAndroid Build Coastguard Worker 
69*5a923131SAndroid Build Coastguard Worker   // Offset assuming all extents are concatenated.
70*5a923131SAndroid Build Coastguard Worker   uint64_t offset_{0};
71*5a923131SAndroid Build Coastguard Worker 
72*5a923131SAndroid Build Coastguard Worker   // The accelaring upper bounds for |extents_| if we assume all extents are
73*5a923131SAndroid Build Coastguard Worker   // concatenated.
74*5a923131SAndroid Build Coastguard Worker   std::vector<uint64_t> extents_upper_bounds_;
75*5a923131SAndroid Build Coastguard Worker   uint64_t total_size_{0};
76*5a923131SAndroid Build Coastguard Worker 
77*5a923131SAndroid Build Coastguard Worker   DISALLOW_COPY_AND_ASSIGN(DirectExtentReader);
78*5a923131SAndroid Build Coastguard Worker };
79*5a923131SAndroid Build Coastguard Worker 
80*5a923131SAndroid Build Coastguard Worker }  // namespace chromeos_update_engine
81*5a923131SAndroid Build Coastguard Worker 
82*5a923131SAndroid Build Coastguard Worker #endif  // UPDATE_ENGINE_PAYLOAD_CONSUMER_EXTENT_READER_H_
83