Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(419)

Side by Side Diff: runtime/bin/filter.cc

Issue 130513003: [ZLIB] Add support for windowBits, memLevel, raw (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Created 6 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file 1 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file
2 // for details. All rights reserved. Use of this source code is governed by a 2 // for details. All rights reserved. Use of this source code is governed by a
3 // BSD-style license that can be found in the LICENSE file. 3 // BSD-style license that can be found in the LICENSE file.
4 4
5 #include "bin/dartutils.h" 5 #include "bin/dartutils.h"
6 #include "bin/filter.h" 6 #include "bin/filter.h"
7 #include "bin/io_buffer.h" 7 #include "bin/io_buffer.h"
8 8
9 #include "include/dart_api.h" 9 #include "include/dart_api.h"
10 10
(...skipping 20 matching lines...) Expand all
31 return filter; 31 return filter;
32 } 32 }
33 33
34 void EndFilter(Dart_Handle filter_obj, Filter* filter) { 34 void EndFilter(Dart_Handle filter_obj, Filter* filter) {
35 Filter::SetFilterPointerNativeField(filter_obj, NULL); 35 Filter::SetFilterPointerNativeField(filter_obj, NULL);
36 delete filter; 36 delete filter;
37 } 37 }
38 38
39 void FUNCTION_NAME(Filter_CreateZLibInflate)(Dart_NativeArguments args) { 39 void FUNCTION_NAME(Filter_CreateZLibInflate)(Dart_NativeArguments args) {
40 Dart_Handle filter_obj = Dart_GetNativeArgument(args, 0); 40 Dart_Handle filter_obj = Dart_GetNativeArgument(args, 0);
41 Filter* filter = new ZLibInflateFilter(); 41 Dart_Handle wBits_obj = Dart_GetNativeArgument(args, 1);
42 int64_t windowBits;
43 if (Dart_IsError(Dart_IntegerToInt64(wBits_obj, &windowBits))) {
44 Dart_ThrowException(DartUtils::NewInternalError(
45 "Failed to get 'windowBits' parameter"));
46 }
47 Dart_Handle raw_obj = Dart_GetNativeArgument(args, 2);
48 bool raw;
49 if (Dart_IsError(Dart_BooleanValue(raw_obj, &raw))) {
50 Dart_ThrowException(DartUtils::NewInternalError(
51 "Failed to get 'raw' parameter"));
52 }
53 Filter* filter = new ZLibInflateFilter(windowBits, raw);
42 if (filter == NULL || !filter->Init()) { 54 if (filter == NULL || !filter->Init()) {
43 delete filter; 55 delete filter;
44 Dart_ThrowException(DartUtils::NewInternalError( 56 Dart_ThrowException(DartUtils::NewInternalError(
45 "Failed to create ZLibInflateFilter")); 57 "Failed to create ZLibInflateFilter"));
46 } 58 }
47 Dart_Handle result = Filter::SetFilterPointerNativeField(filter_obj, filter); 59 Dart_Handle result = Filter::SetFilterPointerNativeField(filter_obj, filter);
48 if (Dart_IsError(result)) { 60 if (Dart_IsError(result)) {
49 delete filter; 61 delete filter;
50 Dart_PropagateError(result); 62 Dart_PropagateError(result);
51 } 63 }
52 } 64 }
53 65
54 void FUNCTION_NAME(Filter_CreateZLibDeflate)(Dart_NativeArguments args) { 66 void FUNCTION_NAME(Filter_CreateZLibDeflate)(Dart_NativeArguments args) {
55 Dart_Handle filter_obj = Dart_GetNativeArgument(args, 0); 67 Dart_Handle filter_obj = Dart_GetNativeArgument(args, 0);
56 Dart_Handle gzip_obj = Dart_GetNativeArgument(args, 1); 68 Dart_Handle gzip_obj = Dart_GetNativeArgument(args, 1);
57 Dart_Handle level_obj = Dart_GetNativeArgument(args, 2);
58 bool gzip; 69 bool gzip;
59 if (Dart_IsError(Dart_BooleanValue(gzip_obj, &gzip))) { 70 if (Dart_IsError(Dart_BooleanValue(gzip_obj, &gzip))) {
60 Dart_ThrowException(DartUtils::NewInternalError( 71 Dart_ThrowException(DartUtils::NewInternalError(
61 "Failed to get 'gzip' parameter")); 72 "Failed to get 'gzip' parameter"));
62 } 73 }
74 Dart_Handle level_obj = Dart_GetNativeArgument(args, 2);
63 int64_t level; 75 int64_t level;
64 if (Dart_IsError(Dart_IntegerToInt64(level_obj, &level))) { 76 if (Dart_IsError(Dart_IntegerToInt64(level_obj, &level))) {
65 Dart_ThrowException(DartUtils::NewInternalError( 77 Dart_ThrowException(DartUtils::NewInternalError(
66 "Failed to get 'level' parameter")); 78 "Failed to get 'level' parameter"));
67 } 79 }
68 Filter* filter = new ZLibDeflateFilter(gzip, level); 80 Dart_Handle wBits_obj = Dart_GetNativeArgument(args, 3);
81 int64_t windowBits;
82 if (Dart_IsError(Dart_IntegerToInt64(wBits_obj, &windowBits))) {
83 Dart_ThrowException(DartUtils::NewInternalError(
84 "Failed to get 'windowBits' parameter"));
85 }
86 Dart_Handle raw_obj = Dart_GetNativeArgument(args, 4);
87 bool raw;
88 if (Dart_IsError(Dart_BooleanValue(raw_obj, &raw))) {
89 Dart_ThrowException(DartUtils::NewInternalError(
90 "Failed to get 'raw' parameter"));
91 }
92 Filter* filter = new ZLibDeflateFilter(gzip, level, windowBits, raw);
69 if (filter == NULL || !filter->Init()) { 93 if (filter == NULL || !filter->Init()) {
70 delete filter; 94 delete filter;
71 Dart_ThrowException(DartUtils::NewInternalError( 95 Dart_ThrowException(DartUtils::NewInternalError(
72 "Failed to create ZLibDeflateFilter")); 96 "Failed to create ZLibDeflateFilter"));
73 } 97 }
74 Dart_Handle result = Filter::SetFilterPointerNativeField(filter_obj, filter); 98 Dart_Handle result = Filter::SetFilterPointerNativeField(filter_obj, filter);
75 if (Dart_IsError(result)) { 99 if (Dart_IsError(result)) {
76 delete filter; 100 delete filter;
77 Dart_PropagateError(result); 101 Dart_PropagateError(result);
78 } 102 }
(...skipping 104 matching lines...) Expand 10 before | Expand all | Expand 10 after
183 } 207 }
184 208
185 209
186 ZLibDeflateFilter::~ZLibDeflateFilter() { 210 ZLibDeflateFilter::~ZLibDeflateFilter() {
187 delete[] current_buffer_; 211 delete[] current_buffer_;
188 if (initialized()) deflateEnd(&stream_); 212 if (initialized()) deflateEnd(&stream_);
189 } 213 }
190 214
191 215
192 bool ZLibDeflateFilter::Init() { 216 bool ZLibDeflateFilter::Init() {
217 int windowBits = windowBits_;
218 // todo(vbe) raw
219 if (raw_) {
220 windowBits *= -1;
221 } else if (gzip_) {
222 windowBits += kZLibFlagUseGZipHeader;
223 }
193 stream_.zalloc = Z_NULL; 224 stream_.zalloc = Z_NULL;
194 stream_.zfree = Z_NULL; 225 stream_.zfree = Z_NULL;
195 stream_.opaque = Z_NULL; 226 stream_.opaque = Z_NULL;
196 int result = deflateInit2( 227 int result = deflateInit2(
197 &stream_, 228 &stream_,
198 level_, 229 level_,
199 Z_DEFLATED, 230 Z_DEFLATED,
200 kZLibFlagWindowBits | (gzip_ ? kZLibFlagUseGZipHeader : 0), 231 windowBits,
201 kZlibFlagMemUsage, 232 kZlibFlagMemUsage,
202 Z_DEFAULT_STRATEGY); 233 Z_DEFAULT_STRATEGY);
203 if (result == Z_OK) { 234 if (result == Z_OK) {
204 set_initialized(true); 235 set_initialized(true);
205 return true; 236 return true;
206 } 237 }
207 return false; 238 return false;
208 } 239 }
209 240
210 241
(...skipping 12 matching lines...) Expand all
223 stream_.next_out = buffer; 254 stream_.next_out = buffer;
224 switch (deflate(&stream_, 255 switch (deflate(&stream_,
225 end ? Z_FINISH : flush ? Z_SYNC_FLUSH : Z_NO_FLUSH)) { 256 end ? Z_FINISH : flush ? Z_SYNC_FLUSH : Z_NO_FLUSH)) {
226 case Z_STREAM_END: 257 case Z_STREAM_END:
227 case Z_BUF_ERROR: 258 case Z_BUF_ERROR:
228 case Z_OK: { 259 case Z_OK: {
229 intptr_t processed = length - stream_.avail_out; 260 intptr_t processed = length - stream_.avail_out;
230 if (processed == 0) { 261 if (processed == 0) {
231 delete[] current_buffer_; 262 delete[] current_buffer_;
232 current_buffer_ = NULL; 263 current_buffer_ = NULL;
233 return 0;
234 } else {
235 // We processed data, should be called again.
236 return processed;
237 } 264 }
265 return processed;
238 } 266 }
239 267
240 default: 268 default:
241 case Z_STREAM_ERROR: 269 case Z_STREAM_ERROR:
242 // An error occoured. 270 // An error occurred.
243 delete[] current_buffer_; 271 delete[] current_buffer_;
244 current_buffer_ = NULL; 272 current_buffer_ = NULL;
245 return -1; 273 return -1;
246 } 274 }
247 } 275 }
248 276
249 277
250 ZLibInflateFilter::~ZLibInflateFilter() { 278 ZLibInflateFilter::~ZLibInflateFilter() {
251 delete[] current_buffer_; 279 delete[] current_buffer_;
252 if (initialized()) inflateEnd(&stream_); 280 if (initialized()) inflateEnd(&stream_);
253 } 281 }
254 282
255 283
256 bool ZLibInflateFilter::Init() { 284 bool ZLibInflateFilter::Init() {
285 int windowBits = raw_ ?
286 -1 * windowBits_ :
287 windowBits_ | kZLibFlagAcceptAnyHeader;
288
257 stream_.zalloc = Z_NULL; 289 stream_.zalloc = Z_NULL;
258 stream_.zfree = Z_NULL; 290 stream_.zfree = Z_NULL;
259 stream_.opaque = Z_NULL; 291 stream_.opaque = Z_NULL;
260 int result = inflateInit2(&stream_, 292 int result = inflateInit2(&stream_, windowBits);
261 kZLibFlagWindowBits | kZLibFlagAcceptAnyHeader);
262 if (result == Z_OK) { 293 if (result == Z_OK) {
263 set_initialized(true); 294 set_initialized(true);
264 return true; 295 return true;
265 } 296 }
266 return false; 297 return false;
267 } 298 }
268 299
269 300
270 bool ZLibInflateFilter::Process(uint8_t* data, intptr_t length) { 301 bool ZLibInflateFilter::Process(uint8_t* data, intptr_t length) {
271 if (current_buffer_ != NULL) return false; 302 if (current_buffer_ != NULL) return false;
(...skipping 11 matching lines...) Expand all
283 stream_.next_out = buffer; 314 stream_.next_out = buffer;
284 switch (inflate(&stream_, 315 switch (inflate(&stream_,
285 end ? Z_FINISH : flush ? Z_SYNC_FLUSH : Z_NO_FLUSH)) { 316 end ? Z_FINISH : flush ? Z_SYNC_FLUSH : Z_NO_FLUSH)) {
286 case Z_STREAM_END: 317 case Z_STREAM_END:
287 case Z_BUF_ERROR: 318 case Z_BUF_ERROR:
288 case Z_OK: { 319 case Z_OK: {
289 intptr_t processed = length - stream_.avail_out; 320 intptr_t processed = length - stream_.avail_out;
290 if (processed == 0) { 321 if (processed == 0) {
291 delete[] current_buffer_; 322 delete[] current_buffer_;
292 current_buffer_ = NULL; 323 current_buffer_ = NULL;
293 return 0;
294 } else {
295 // We processed data, should be called again.
296 return processed;
297 } 324 }
325 return processed;
298 } 326 }
299 327
300 default: 328 default:
301 case Z_MEM_ERROR: 329 case Z_MEM_ERROR:
302 case Z_NEED_DICT: 330 case Z_NEED_DICT:
303 case Z_DATA_ERROR: 331 case Z_DATA_ERROR:
304 case Z_STREAM_ERROR: 332 case Z_STREAM_ERROR:
305 // An error occoured. 333 // An error occoured.
306 delete[] current_buffer_; 334 delete[] current_buffer_;
307 current_buffer_ = NULL; 335 current_buffer_ = NULL;
308 return -1; 336 return -1;
309 } 337 }
310 } 338 }
311 339
312 } // namespace bin 340 } // namespace bin
313 } // namespace dart 341 } // namespace dart
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698