// Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file // for details. All rights reserved. Use of this source code is governed by a // BSD-style license that can be found in the LICENSE file. #ifndef RUNTIME_BIN_FILTER_H_ #define RUNTIME_BIN_FILTER_H_ #include "bin/builtin.h" #include "bin/utils.h" #include "zlib/zlib.h" namespace dart { namespace bin { class Filter { public: virtual ~Filter() {} virtual bool Init() = 0; /** * On a successful call to Process, Process will take ownership of data. On * successive calls to either Processed or ~Filter, data will be freed with * a delete[] call. */ virtual bool Process(uint8_t* data, intptr_t length) = 0; virtual intptr_t Processed(uint8_t* buffer, intptr_t length, bool finish, bool end) = 0; static Dart_Handle SetFilterAndCreateFinalizer(Dart_Handle filter, Filter* filter_pointer, intptr_t filter_size); static Dart_Handle GetFilterNativeField(Dart_Handle filter, Filter** filter_pointer); bool initialized() const { return initialized_; } void set_initialized(bool value) { initialized_ = value; } uint8_t* processed_buffer() { return processed_buffer_; } intptr_t processed_buffer_size() const { return kFilterBufferSize; } protected: Filter() : initialized_(false) {} private: static constexpr intptr_t kFilterBufferSize = 64 * KB; uint8_t processed_buffer_[kFilterBufferSize]; bool initialized_; DISALLOW_COPY_AND_ASSIGN(Filter); }; class ZLibDeflateFilter : public Filter { public: ZLibDeflateFilter(bool gzip, int32_t level, int32_t window_bits, int32_t mem_level, int32_t strategy, uint8_t* dictionary, intptr_t dictionary_length, bool raw) : gzip_(gzip), level_(level), window_bits_(window_bits), mem_level_(mem_level), strategy_(strategy), dictionary_(dictionary), dictionary_length_(dictionary_length), raw_(raw), current_buffer_(nullptr) {} virtual ~ZLibDeflateFilter(); virtual bool Init(); virtual bool Process(uint8_t* data, intptr_t length); virtual intptr_t Processed(uint8_t* buffer, intptr_t length, bool finish, bool end); private: const bool gzip_; const int32_t level_; const int32_t window_bits_; const int32_t mem_level_; const int32_t strategy_; uint8_t* dictionary_; const intptr_t dictionary_length_; const bool raw_; uint8_t* current_buffer_; z_stream stream_; DISALLOW_COPY_AND_ASSIGN(ZLibDeflateFilter); }; class ZLibInflateFilter : public Filter { public: ZLibInflateFilter(int32_t window_bits, uint8_t* dictionary, intptr_t dictionary_length, bool raw) : window_bits_(window_bits), dictionary_(dictionary), dictionary_length_(dictionary_length), raw_(raw), current_buffer_(nullptr) {} virtual ~ZLibInflateFilter(); virtual bool Init(); virtual bool Process(uint8_t* data, intptr_t length); virtual intptr_t Processed(uint8_t* buffer, intptr_t length, bool finish, bool end); private: const int32_t window_bits_; uint8_t* dictionary_; const intptr_t dictionary_length_; const bool raw_; uint8_t* current_buffer_; z_stream stream_; DISALLOW_COPY_AND_ASSIGN(ZLibInflateFilter); }; } // namespace bin } // namespace dart #endif // RUNTIME_BIN_FILTER_H_