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 #include "update_engine/payload_generator/annotated_operation.h"
     18 
     19 #include <base/format_macros.h>
     20 #include <base/strings/string_number_conversions.h>
     21 #include <base/strings/stringprintf.h>
     22 
     23 #include "update_engine/common/utils.h"
     24 #include "update_engine/payload_consumer/payload_constants.h"
     25 
     26 namespace chromeos_update_engine {
     27 
     28 namespace {
     29 // Output the list of extents as (start_block, num_blocks) in the passed output
     30 // stream.
     31 void OutputExtents(std::ostream* os,
     32                    const google::protobuf::RepeatedPtrField<Extent>& extents) {
     33   for (const auto& extent : extents) {
     34     *os << " (" << extent.start_block() << ", " << extent.num_blocks() << ")";
     35   }
     36 }
     37 }  // namespace
     38 
     39 bool AnnotatedOperation::SetOperationBlob(const brillo::Blob& blob,
     40                                           BlobFileWriter* blob_file) {
     41   if (blob.empty()) {
     42     op.clear_data_offset();
     43     op.clear_data_length();
     44     return true;
     45   }
     46   off_t data_offset = blob_file->StoreBlob(blob);
     47   TEST_AND_RETURN_FALSE(data_offset != -1);
     48   op.set_data_offset(data_offset);
     49   op.set_data_length(blob.size());
     50   return true;
     51 }
     52 
     53 std::ostream& operator<<(std::ostream& os, const AnnotatedOperation& aop) {
     54   // For example, this prints:
     55   // REPLACE_BZ 500 @3000
     56   //   name: /foo/bar
     57   //    dst: (123, 3) (127, 2)
     58   os << InstallOperationTypeName(aop.op.type()) << " "  << aop.op.data_length();
     59   if (aop.op.data_length() > 0)
     60     os << " @" << aop.op.data_offset();
     61   if (!aop.name.empty()) {
     62     os << std::endl << "  name: " << aop.name;
     63   }
     64   if (aop.op.src_extents_size() != 0) {
     65     os << std::endl << "   src:";
     66     OutputExtents(&os, aop.op.src_extents());
     67   }
     68   if (aop.op.dst_extents_size() != 0) {
     69     os << std::endl << "   dst:";
     70     OutputExtents(&os, aop.op.dst_extents());
     71   }
     72   return os;
     73 }
     74 
     75 }  // namespace chromeos_update_engine
     76