• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Copyright 2017 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 #ifndef SRC_INCLUDE_PUFFIN_UTILS_H_
6 #define SRC_INCLUDE_PUFFIN_UTILS_H_
7 
8 #include <string>
9 #include <vector>
10 
11 #include "puffin/common.h"
12 #include "puffin/stream.h"
13 
14 namespace puffin {
15 
16 // Counts the number of bytes in a list of |ByteExtent|s.
17 PUFFIN_EXPORT
18 uint64_t BytesInByteExtents(const std::vector<ByteExtent>& extents);
19 
20 // Converts an array of |ByteExtens| or |BitExtents| to a string. Each extent
21 // has format "offset:length" and are comma separated.
22 template <typename T>
ExtentsToString(const T & extents)23 PUFFIN_EXPORT std::string ExtentsToString(const T& extents) {
24   std::string str;
25   for (const auto& extent : extents) {
26     str += std::to_string(extent.offset) + ":" + std::to_string(extent.length) +
27            ",";
28   }
29   return str;
30 }
31 
32 // Locates deflate locations for a zlib buffer |data|. It locates by removing
33 // header and footer bytes from the zlib stream.
34 bool LocateDeflatesInZlib(const Buffer& data,
35                           std::vector<ByteExtent>* deflate_blocks);
36 
37 // Similar to the function above, except that it accepts the file path to the
38 // source and a list of zlib blocks and returns the deflate addresses in bit
39 // extents.
40 PUFFIN_EXPORT
41 bool LocateDeflatesInZlibBlocks(const std::string& file_path,
42                                 const std::vector<ByteExtent>& zlibs,
43                                 std::vector<BitExtent>* deflates);
44 
45 // Searches for deflate locations in a gzip file. The results are
46 // saved in |deflate_blocks|.
47 bool LocateDeflatesInGzip(const Buffer& data,
48                           std::vector<ByteExtent>* deflate_blocks);
49 
50 // Search for the deflates in a zip archive, and put the result in
51 // |deflate_blocks|.
52 bool LocateDeflatesInZipArchive(const Buffer& data,
53                                 std::vector<ByteExtent>* deflate_blocks);
54 
55 PUFFIN_EXPORT
56 // Create a list of deflate subblock locations from the deflate blocks in a
57 // zip archive.
58 bool LocateDeflateSubBlocksInZipArchive(const Buffer& data,
59                                         std::vector<BitExtent>* deflates);
60 
61 // Reads the deflates in from |deflates| and returns a list of its subblock
62 // locations. Each subblock in practice is a deflate stream by itself.
63 // Assumption is that the first subblock in each deflate in |deflates| start in
64 // byte boundary.
65 bool FindDeflateSubBlocks(const UniqueStreamPtr& src,
66                           const std::vector<ByteExtent>& deflates,
67                           std::vector<BitExtent>* subblock_deflates);
68 
69 // Finds the location of puffs in the deflate stream |src| based on the location
70 // of |deflates| and populates the |puffs|. We assume |deflates| are sorted by
71 // their offset value. |out_puff_size| will be the size of the puff stream.
72 bool FindPuffLocations(const UniqueStreamPtr& src,
73                        const std::vector<BitExtent>& deflates,
74                        std::vector<ByteExtent>* puffs,
75                        uint64_t* out_puff_size);
76 
77 }  // namespace puffin
78 
79 #endif  // SRC_INCLUDE_PUFFIN_UTILS_H_
80