• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 //
2 // Copyright (C) 2020 The Android Open Source Project
3 //
4 // Licensed under the Apache License, Version 2.0 (the "License");
5 // you may not use this file except in compliance with the License.
6 // You may obtain a copy of the License at
7 //
8 //      http://www.apache.org/licenses/LICENSE-2.0
9 //
10 // Unless required by applicable law or agreed to in writing, software
11 // distributed under the License is distributed on an "AS IS" BASIS,
12 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 // See the License for the specific language governing permissions and
14 // limitations under the License.
15 //
16 
17 #ifndef UPDATE_ENGINE_SNAPSHOT_EXTENT_WRITER_H_
18 #define UPDATE_ENGINE_SNAPSHOT_EXTENT_WRITER_H_
19 
20 #include <cstdint>
21 #include <vector>
22 
23 #include <libsnapshot/cow_writer.h>
24 
25 #include "update_engine/payload_consumer/extent_writer.h"
26 #include "update_engine/update_metadata.pb.h"
27 
28 namespace chromeos_update_engine {
29 
30 class SnapshotExtentWriter : public chromeos_update_engine::ExtentWriter {
31  public:
32   explicit SnapshotExtentWriter(android::snapshot::ICowWriter* cow_writer);
33   ~SnapshotExtentWriter();
34   // Returns true on success.
35   bool Init(const google::protobuf::RepeatedPtrField<Extent>& extents,
36             uint32_t block_size) override;
37   // Returns true on success.
38   // This will construct a COW_REPLACE operation and forward it to CowWriter. It
39   // is important that caller does not perform SOURCE_COPY operation on this
40   // class, otherwise raw data will be stored. Caller should find ways to use
41   // COW_COPY whenever possible.
42   bool Write(const void* bytes, size_t count) override;
43 
44  private:
45   bool next_extent();
46   [[nodiscard]] size_t ConsumeWithBuffer(const uint8_t* bytes, size_t count);
47   // It's a non-owning pointer, because PartitionWriter owns the CowWruter. This
48   // allows us to use a single instance of CowWriter for all operations applied
49   // to the same partition.
50   android::snapshot::ICowWriter* cow_writer_;
51   google::protobuf::RepeatedPtrField<Extent> extents_;
52   size_t cur_extent_idx_;
53   std::vector<uint8_t> buffer_;
54   size_t block_size_;
55 };
56 
57 }  // namespace chromeos_update_engine
58 
59 #endif
60