| Index: runtime/bin/filter.cc
|
| diff --git a/runtime/bin/filter.cc b/runtime/bin/filter.cc
|
| index 3ea389d1549112ffe6db6d68c22fa74d54fbf319..548b35521e57673bde553794a85efda479aa3954 100644
|
| --- a/runtime/bin/filter.cc
|
| +++ b/runtime/bin/filter.cc
|
| @@ -38,7 +38,19 @@ void EndFilter(Dart_Handle filter_obj, Filter* filter) {
|
|
|
| void FUNCTION_NAME(Filter_CreateZLibInflate)(Dart_NativeArguments args) {
|
| Dart_Handle filter_obj = Dart_GetNativeArgument(args, 0);
|
| - Filter* filter = new ZLibInflateFilter();
|
| + Dart_Handle wBits_obj = Dart_GetNativeArgument(args, 1);
|
| + int64_t windowBits;
|
| + if (Dart_IsError(Dart_IntegerToInt64(wBits_obj, &windowBits))) {
|
| + Dart_ThrowException(DartUtils::NewInternalError(
|
| + "Failed to get 'windowBits' parameter"));
|
| + }
|
| + Dart_Handle raw_obj = Dart_GetNativeArgument(args, 2);
|
| + bool raw;
|
| + if (Dart_IsError(Dart_BooleanValue(raw_obj, &raw))) {
|
| + Dart_ThrowException(DartUtils::NewInternalError(
|
| + "Failed to get 'raw' parameter"));
|
| + }
|
| + Filter* filter = new ZLibInflateFilter(windowBits, raw);
|
| if (filter == NULL || !filter->Init()) {
|
| delete filter;
|
| Dart_ThrowException(DartUtils::NewInternalError(
|
| @@ -54,18 +66,30 @@ void FUNCTION_NAME(Filter_CreateZLibInflate)(Dart_NativeArguments args) {
|
| void FUNCTION_NAME(Filter_CreateZLibDeflate)(Dart_NativeArguments args) {
|
| Dart_Handle filter_obj = Dart_GetNativeArgument(args, 0);
|
| Dart_Handle gzip_obj = Dart_GetNativeArgument(args, 1);
|
| - Dart_Handle level_obj = Dart_GetNativeArgument(args, 2);
|
| bool gzip;
|
| if (Dart_IsError(Dart_BooleanValue(gzip_obj, &gzip))) {
|
| Dart_ThrowException(DartUtils::NewInternalError(
|
| "Failed to get 'gzip' parameter"));
|
| }
|
| + Dart_Handle level_obj = Dart_GetNativeArgument(args, 2);
|
| int64_t level;
|
| if (Dart_IsError(Dart_IntegerToInt64(level_obj, &level))) {
|
| Dart_ThrowException(DartUtils::NewInternalError(
|
| "Failed to get 'level' parameter"));
|
| }
|
| - Filter* filter = new ZLibDeflateFilter(gzip, level);
|
| + Dart_Handle wBits_obj = Dart_GetNativeArgument(args, 3);
|
| + int64_t windowBits;
|
| + if (Dart_IsError(Dart_IntegerToInt64(wBits_obj, &windowBits))) {
|
| + Dart_ThrowException(DartUtils::NewInternalError(
|
| + "Failed to get 'windowBits' parameter"));
|
| + }
|
| + Dart_Handle raw_obj = Dart_GetNativeArgument(args, 4);
|
| + bool raw;
|
| + if (Dart_IsError(Dart_BooleanValue(raw_obj, &raw))) {
|
| + Dart_ThrowException(DartUtils::NewInternalError(
|
| + "Failed to get 'raw' parameter"));
|
| + }
|
| + Filter* filter = new ZLibDeflateFilter(gzip, level, windowBits, raw);
|
| if (filter == NULL || !filter->Init()) {
|
| delete filter;
|
| Dart_ThrowException(DartUtils::NewInternalError(
|
| @@ -190,6 +214,13 @@ ZLibDeflateFilter::~ZLibDeflateFilter() {
|
|
|
|
|
| bool ZLibDeflateFilter::Init() {
|
| + int windowBits = windowBits_;
|
| + // todo(vbe) raw
|
| + if (raw_) {
|
| + windowBits *= -1;
|
| + } else if (gzip_) {
|
| + windowBits += kZLibFlagUseGZipHeader;
|
| + }
|
| stream_.zalloc = Z_NULL;
|
| stream_.zfree = Z_NULL;
|
| stream_.opaque = Z_NULL;
|
| @@ -197,7 +228,7 @@ bool ZLibDeflateFilter::Init() {
|
| &stream_,
|
| level_,
|
| Z_DEFLATED,
|
| - kZLibFlagWindowBits | (gzip_ ? kZLibFlagUseGZipHeader : 0),
|
| + windowBits,
|
| kZlibFlagMemUsage,
|
| Z_DEFAULT_STRATEGY);
|
| if (result == Z_OK) {
|
| @@ -230,16 +261,13 @@ intptr_t ZLibDeflateFilter::Processed(uint8_t* buffer,
|
| if (processed == 0) {
|
| delete[] current_buffer_;
|
| current_buffer_ = NULL;
|
| - return 0;
|
| - } else {
|
| - // We processed data, should be called again.
|
| - return processed;
|
| }
|
| + return processed;
|
| }
|
|
|
| default:
|
| case Z_STREAM_ERROR:
|
| - // An error occoured.
|
| + // An error occurred.
|
| delete[] current_buffer_;
|
| current_buffer_ = NULL;
|
| return -1;
|
| @@ -254,11 +282,14 @@ ZLibInflateFilter::~ZLibInflateFilter() {
|
|
|
|
|
| bool ZLibInflateFilter::Init() {
|
| + int windowBits = raw_ ?
|
| + -1 * windowBits_ :
|
| + windowBits_ | kZLibFlagAcceptAnyHeader;
|
| +
|
| stream_.zalloc = Z_NULL;
|
| stream_.zfree = Z_NULL;
|
| stream_.opaque = Z_NULL;
|
| - int result = inflateInit2(&stream_,
|
| - kZLibFlagWindowBits | kZLibFlagAcceptAnyHeader);
|
| + int result = inflateInit2(&stream_, windowBits);
|
| if (result == Z_OK) {
|
| set_initialized(true);
|
| return true;
|
| @@ -290,11 +321,8 @@ intptr_t ZLibInflateFilter::Processed(uint8_t* buffer,
|
| if (processed == 0) {
|
| delete[] current_buffer_;
|
| current_buffer_ = NULL;
|
| - return 0;
|
| - } else {
|
| - // We processed data, should be called again.
|
| - return processed;
|
| }
|
| + return processed;
|
| }
|
|
|
| default:
|
|
|