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: |