blob: d723004dce40668870e0accd0eddff805d67c645 [file] [log] [blame]
Alex Deymo477aec22015-03-24 23:40:48 -07001// Copyright 2015 The Chromium OS Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#include "update_engine/payload_generator/annotated_operation.h"
6
7#include <base/format_macros.h>
8#include <base/strings/string_number_conversions.h>
9#include <base/strings/stringprintf.h>
10
Gilad Arnold41e34742015-05-11 11:31:50 -070011#include "update_engine/utils.h"
12
Alex Deymo477aec22015-03-24 23:40:48 -070013using std::string;
14
15namespace chromeos_update_engine {
16
17namespace {
18// Output the list of extents as (start_block, num_blocks) in the passed output
19// stream.
20void OutputExtents(std::ostream* os,
21 const google::protobuf::RepeatedPtrField<Extent>& extents) {
22 for (const auto& extent : extents) {
23 *os << " (" << extent.start_block() << ", " << extent.num_blocks() << ")";
24 }
25}
26} // namespace
27
Sen Jiang8cc502d2015-08-10 10:04:54 -070028bool AnnotatedOperation::SetOperationBlob(chromeos::Blob* blob,
29 BlobFileWriter* blob_file) {
Gilad Arnold41e34742015-05-11 11:31:50 -070030 op.set_data_length(blob->size());
Sen Jiang8cc502d2015-08-10 10:04:54 -070031 off_t data_offset = blob_file->StoreBlob(*blob);
32 if (data_offset == -1)
33 return false;
34 op.set_data_offset(data_offset);
Gilad Arnold41e34742015-05-11 11:31:50 -070035 return true;
36}
37
Alex Deymoa12ee112015-08-12 22:19:32 -070038string InstallOperationTypeName(InstallOperation_Type op_type) {
Alex Deymo477aec22015-03-24 23:40:48 -070039 switch (op_type) {
Alex Deymoa12ee112015-08-12 22:19:32 -070040 case InstallOperation::BSDIFF:
Alex Deymo477aec22015-03-24 23:40:48 -070041 return "BSDIFF";
Alex Deymoa12ee112015-08-12 22:19:32 -070042 case InstallOperation::MOVE:
Alex Deymo477aec22015-03-24 23:40:48 -070043 return "MOVE";
Alex Deymoa12ee112015-08-12 22:19:32 -070044 case InstallOperation::REPLACE:
Alex Deymo477aec22015-03-24 23:40:48 -070045 return "REPLACE";
Alex Deymoa12ee112015-08-12 22:19:32 -070046 case InstallOperation::REPLACE_BZ:
Alex Deymo477aec22015-03-24 23:40:48 -070047 return "REPLACE_BZ";
Alex Deymoa12ee112015-08-12 22:19:32 -070048 case InstallOperation::SOURCE_COPY:
Alex Deymo477aec22015-03-24 23:40:48 -070049 return "SOURCE_COPY";
Alex Deymoa12ee112015-08-12 22:19:32 -070050 case InstallOperation::SOURCE_BSDIFF:
Alex Deymo477aec22015-03-24 23:40:48 -070051 return "SOURCE_BSDIFF";
52 }
53 return "UNK";
54}
55
56std::ostream& operator<<(std::ostream& os, const AnnotatedOperation& aop) {
57 // For example, this prints:
58 // REPLACE_BZ 500 @3000
59 // name: /foo/bar
60 // dst: (123, 3) (127, 2)
61 os << InstallOperationTypeName(aop.op.type()) << " " << aop.op.data_length();
62 if (aop.op.data_length() > 0)
63 os << " @" << aop.op.data_offset();
64 if (!aop.name.empty()) {
65 os << std::endl << " name: " << aop.name;
66 }
67 if (aop.op.src_extents_size() != 0) {
68 os << std::endl << " src:";
69 OutputExtents(&os, aop.op.src_extents());
70 }
71 if (aop.op.dst_extents_size() != 0) {
72 os << std::endl << " dst:";
73 OutputExtents(&os, aop.op.dst_extents());
74 }
75 return os;
76}
77
78} // namespace chromeos_update_engine