Index: runtime/bin/filter.cc |
diff --git a/runtime/bin/filter.cc b/runtime/bin/filter.cc |
index 3ea389d1549112ffe6db6d68c22fa74d54fbf319..a263dd6f0b760de58c48ab3355a58bb7a804d325 100644 |
--- a/runtime/bin/filter.cc |
+++ b/runtime/bin/filter.cc |
@@ -12,7 +12,6 @@ |
namespace dart { |
namespace bin { |
-const int kZlibFlagMemUsage = 8; |
const int kZLibFlagWindowBits = 15; |
const int kZLibFlagUseGZipHeader = 16; |
const int kZLibFlagAcceptAnyHeader = 32; |
@@ -38,7 +37,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 +65,37 @@ 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")); |
+ } |
+ Dart_Handle mLevel_obj = Dart_GetNativeArgument(args, 5); |
+ int64_t memLevel; |
+ if (Dart_IsError(Dart_IntegerToInt64(mLevel_obj, &memLevel))) { |
+ Dart_ThrowException(DartUtils::NewInternalError( |
+ "Failed to get 'memLevel' parameter")); |
+ } |
+ Filter* filter = new ZLibDeflateFilter(gzip, level, windowBits, raw, |
+ memLevel); |
if (filter == NULL || !filter->Init()) { |
delete filter; |
Dart_ThrowException(DartUtils::NewInternalError( |
@@ -190,16 +220,17 @@ ZLibDeflateFilter::~ZLibDeflateFilter() { |
bool ZLibDeflateFilter::Init() { |
+ int windowBits = windowBits_; |
+ if (raw_) { |
+ windowBits *= -1; |
+ } else if (gzip_) { |
+ windowBits += kZLibFlagUseGZipHeader; |
+ } |
stream_.zalloc = Z_NULL; |
stream_.zfree = Z_NULL; |
stream_.opaque = Z_NULL; |
- int result = deflateInit2( |
- &stream_, |
- level_, |
- Z_DEFLATED, |
- kZLibFlagWindowBits | (gzip_ ? kZLibFlagUseGZipHeader : 0), |
- kZlibFlagMemUsage, |
- Z_DEFAULT_STRATEGY); |
+ int result = deflateInit2(&stream_, level_, Z_DEFLATED, windowBits, memLevel_, |
+ Z_DEFAULT_STRATEGY); |
if (result == Z_OK) { |
set_initialized(true); |
return true; |
@@ -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: |