blob: cd8e2946a870dac432c39406675ba179f1241d5e [file] [log] [blame]
// Copyright (c) 2009 The Chromium OS Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef CHROMEOS_PLATFORM_UPDATE_ENGINE_DECOMPRESSING_FILE_WRITER_H__
#define CHROMEOS_PLATFORM_UPDATE_ENGINE_DECOMPRESSING_FILE_WRITER_H__
#include <zlib.h>
#include "base/basictypes.h"
#include "update_engine/file_writer.h"
// GzipDecompressingFileWriter is an implementation of FileWriter. It will
// gzip decompress all data that is passed via Write() onto another FileWriter,
// which is responsible for actually writing the data out. Calls to
// Open and Close are passed through to the other FileWriter.
namespace chromeos_update_engine {
class GzipDecompressingFileWriter : public FileWriter {
public:
explicit GzipDecompressingFileWriter(FileWriter* next) : next_(next) {
memset(&stream_, 0, sizeof(stream_));
CHECK_EQ(inflateInit2(&stream_, 16 + MAX_WBITS), Z_OK);
}
virtual ~GzipDecompressingFileWriter() {
inflateEnd(&stream_);
}
virtual int Open(const char* path, int flags, mode_t mode) {
return next_->Open(path, flags, mode);
}
// Write() calls into zlib to decompress the bytes passed in. It will not
// necessarily write all the decompressed data associated with this set of
// passed-in compressed data during this call, however for a valid gzip
// stream, after the entire stream has been written to this object,
// the entire decompressed stream will have been written to the
// underlying FileWriter.
virtual ssize_t Write(const void* bytes, size_t count);
virtual int Close() {
return next_->Close();
}
private:
// The FileWriter that we write all uncompressed data to
FileWriter* next_;
// The zlib state
z_stream stream_;
// This is for an optimization in Write(). We can keep this buffer around
// in our class to avoid repeated calls to malloc().
std::vector<char> buffer_;
DISALLOW_COPY_AND_ASSIGN(GzipDecompressingFileWriter);
};
} // namespace chromeos_update_engine
#endif // CHROMEOS_PLATFORM_UPDATE_ENGINE_DECOMPRESSING_FILE_WRITER_H__