1//
2// Copyright (C) 2009 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_CONSUMER_BZIP_EXTENT_WRITER_H_
18#define UPDATE_ENGINE_PAYLOAD_CONSUMER_BZIP_EXTENT_WRITER_H_
19
20#include <bzlib.h>
21#include <memory>
22#include <utility>
23
24#include <brillo/secure_blob.h>
25
26#include "update_engine/common/utils.h"
27#include "update_engine/payload_consumer/extent_writer.h"
28
29// BzipExtentWriter is a concrete ExtentWriter subclass that bzip-decompresses
30// what it's given in Write. It passes the decompressed data to an underlying
31// ExtentWriter.
32
33namespace chromeos_update_engine {
34
35class BzipExtentWriter : public ExtentWriter {
36 public:
37  explicit BzipExtentWriter(std::unique_ptr<ExtentWriter> next)
38      : next_(std::move(next)) {
39    memset(&stream_, 0, sizeof(stream_));
40  }
41  ~BzipExtentWriter() override = default;
42
43  bool Init(FileDescriptorPtr fd,
44            const google::protobuf::RepeatedPtrField<Extent>& extents,
45            uint32_t block_size) override;
46  bool Write(const void* bytes, size_t count) override;
47  bool EndImpl() override;
48
49 private:
50  std::unique_ptr<ExtentWriter> next_;  // The underlying ExtentWriter.
51  bz_stream stream_;  // the libbz2 stream
52  brillo::Blob input_buffer_;
53};
54
55}  // namespace chromeos_update_engine
56
57#endif  // UPDATE_ENGINE_PAYLOAD_CONSUMER_BZIP_EXTENT_WRITER_H_
58