Home | History | Annotate | Download | only in payload_generator
      1 //
      2 // Copyright (C) 2015 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_PAYLOAD_GENERATOR_EXTENT_UTILS_H_
     18 #define UPDATE_ENGINE_PAYLOAD_GENERATOR_EXTENT_UTILS_H_
     19 
     20 #include <string>
     21 #include <vector>
     22 
     23 #include "update_engine/payload_consumer/payload_constants.h"
     24 #include "update_engine/update_metadata.pb.h"
     25 
     26 // Utility functions for manipulating Extents and lists of blocks.
     27 
     28 namespace chromeos_update_engine {
     29 
     30 // |block| must either be the next block in the last extent or a block
     31 // in the next extent. This function will not handle inserting block
     32 // into an arbitrary place in the extents.
     33 void AppendBlockToExtents(std::vector<Extent>* extents, uint64_t block);
     34 
     35 // Takes a collection (vector or RepeatedPtrField) of Extent and
     36 // returns a vector of the blocks referenced, in order.
     37 template<typename T>
     38 std::vector<uint64_t> ExpandExtents(const T& extents) {
     39   std::vector<uint64_t> ret;
     40   for (const auto& extent : extents) {
     41     if (extent.start_block() == kSparseHole) {
     42       ret.resize(ret.size() + extent.num_blocks(), kSparseHole);
     43     } else {
     44       for (uint64_t block = extent.start_block();
     45            block < (extent.start_block() + extent.num_blocks()); block++) {
     46         ret.push_back(block);
     47       }
     48     }
     49   }
     50   return ret;
     51 }
     52 
     53 // Stores all Extents in 'extents' into 'out'.
     54 void StoreExtents(const std::vector<Extent>& extents,
     55                   google::protobuf::RepeatedPtrField<Extent>* out);
     56 
     57 // Stores all extents in |extents| into |out_vector|.
     58 void ExtentsToVector(const google::protobuf::RepeatedPtrField<Extent>& extents,
     59                      std::vector<Extent>* out_vector);
     60 
     61 // Returns a string representing all extents in |extents|.
     62 std::string ExtentsToString(const std::vector<Extent>& extents);
     63 
     64 // Takes a pointer to extents |extents| and extents |extents_to_add|, and
     65 // merges them by adding |extents_to_add| to |extents| and normalizing.
     66 void ExtendExtents(
     67   google::protobuf::RepeatedPtrField<Extent>* extents,
     68   const google::protobuf::RepeatedPtrField<Extent>& extents_to_add);
     69 
     70 // Takes a vector of extents and normalizes those extents. Expects the extents
     71 // to be sorted by start block. E.g. if |extents| is [(1, 2), (3, 5), (10, 2)]
     72 // then |extents| will be changed to [(1, 7), (10, 2)].
     73 void NormalizeExtents(std::vector<Extent>* extents);
     74 
     75 // Return a subsequence of the list of blocks passed. Both the passed list of
     76 // blocks |extents| and the return value are expressed as a list of Extent, not
     77 // blocks. The returned list skips the first |block_offset| blocks from the
     78 // |extents| and cotains |block_count| blocks (or less if |extents| is shorter).
     79 std::vector<Extent> ExtentsSublist(const std::vector<Extent>& extents,
     80                                    uint64_t block_offset, uint64_t block_count);
     81 
     82 bool operator==(const Extent& a, const Extent& b);
     83 
     84 }  // namespace chromeos_update_engine
     85 
     86 #endif  // UPDATE_ENGINE_PAYLOAD_GENERATOR_EXTENT_UTILS_H_
     87