OLD | NEW |
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 #if !defined(DART_IO_DISABLED) | 5 #if !defined(DART_IO_DISABLED) |
6 | 6 |
7 #include "bin/filter.h" | 7 #include "bin/filter.h" |
8 | 8 |
9 #include "bin/dartutils.h" | 9 #include "bin/dartutils.h" |
10 #include "bin/io_buffer.h" | 10 #include "bin/io_buffer.h" |
(...skipping 16 matching lines...) Expand all Loading... |
27 return err; | 27 return err; |
28 } | 28 } |
29 if (result == NULL) { | 29 if (result == NULL) { |
30 return Dart_NewApiError("Filter was destroyed"); | 30 return Dart_NewApiError("Filter was destroyed"); |
31 } | 31 } |
32 | 32 |
33 *filter = result; | 33 *filter = result; |
34 return Dart_Null(); | 34 return Dart_Null(); |
35 } | 35 } |
36 | 36 |
37 | |
38 static Dart_Handle CopyDictionary(Dart_Handle dictionary_obj, | 37 static Dart_Handle CopyDictionary(Dart_Handle dictionary_obj, |
39 uint8_t** dictionary) { | 38 uint8_t** dictionary) { |
40 ASSERT(dictionary != NULL); | 39 ASSERT(dictionary != NULL); |
41 uint8_t* src = NULL; | 40 uint8_t* src = NULL; |
42 intptr_t size; | 41 intptr_t size; |
43 Dart_TypedData_Type type; | 42 Dart_TypedData_Type type; |
44 | 43 |
45 Dart_Handle err = Dart_ListLength(dictionary_obj, &size); | 44 Dart_Handle err = Dart_ListLength(dictionary_obj, &size); |
46 if (Dart_IsError(err)) { | 45 if (Dart_IsError(err)) { |
47 return err; | 46 return err; |
(...skipping 14 matching lines...) Expand all Loading... |
62 if (Dart_IsError(err)) { | 61 if (Dart_IsError(err)) { |
63 delete[] result; | 62 delete[] result; |
64 return err; | 63 return err; |
65 } | 64 } |
66 } | 65 } |
67 | 66 |
68 *dictionary = result; | 67 *dictionary = result; |
69 return Dart_Null(); | 68 return Dart_Null(); |
70 } | 69 } |
71 | 70 |
72 | |
73 void FUNCTION_NAME(Filter_CreateZLibInflate)(Dart_NativeArguments args) { | 71 void FUNCTION_NAME(Filter_CreateZLibInflate)(Dart_NativeArguments args) { |
74 Dart_Handle filter_obj = Dart_GetNativeArgument(args, 0); | 72 Dart_Handle filter_obj = Dart_GetNativeArgument(args, 0); |
75 Dart_Handle window_bits_obj = Dart_GetNativeArgument(args, 1); | 73 Dart_Handle window_bits_obj = Dart_GetNativeArgument(args, 1); |
76 int64_t window_bits = DartUtils::GetIntegerValue(window_bits_obj); | 74 int64_t window_bits = DartUtils::GetIntegerValue(window_bits_obj); |
77 Dart_Handle dict_obj = Dart_GetNativeArgument(args, 2); | 75 Dart_Handle dict_obj = Dart_GetNativeArgument(args, 2); |
78 Dart_Handle raw_obj = Dart_GetNativeArgument(args, 3); | 76 Dart_Handle raw_obj = Dart_GetNativeArgument(args, 3); |
79 bool raw = DartUtils::GetBooleanValue(raw_obj); | 77 bool raw = DartUtils::GetBooleanValue(raw_obj); |
80 | 78 |
81 Dart_Handle err; | 79 Dart_Handle err; |
82 uint8_t* dictionary = NULL; | 80 uint8_t* dictionary = NULL; |
(...skipping 25 matching lines...) Expand all Loading... |
108 DartUtils::NewInternalError("Failed to create ZLibInflateFilter")); | 106 DartUtils::NewInternalError("Failed to create ZLibInflateFilter")); |
109 } | 107 } |
110 err = Filter::SetFilterAndCreateFinalizer( | 108 err = Filter::SetFilterAndCreateFinalizer( |
111 filter_obj, filter, sizeof(*filter) + dictionary_length); | 109 filter_obj, filter, sizeof(*filter) + dictionary_length); |
112 if (Dart_IsError(err)) { | 110 if (Dart_IsError(err)) { |
113 delete filter; | 111 delete filter; |
114 Dart_PropagateError(err); | 112 Dart_PropagateError(err); |
115 } | 113 } |
116 } | 114 } |
117 | 115 |
118 | |
119 void FUNCTION_NAME(Filter_CreateZLibDeflate)(Dart_NativeArguments args) { | 116 void FUNCTION_NAME(Filter_CreateZLibDeflate)(Dart_NativeArguments args) { |
120 Dart_Handle filter_obj = Dart_GetNativeArgument(args, 0); | 117 Dart_Handle filter_obj = Dart_GetNativeArgument(args, 0); |
121 Dart_Handle gzip_obj = Dart_GetNativeArgument(args, 1); | 118 Dart_Handle gzip_obj = Dart_GetNativeArgument(args, 1); |
122 bool gzip = DartUtils::GetBooleanValue(gzip_obj); | 119 bool gzip = DartUtils::GetBooleanValue(gzip_obj); |
123 Dart_Handle level_obj = Dart_GetNativeArgument(args, 2); | 120 Dart_Handle level_obj = Dart_GetNativeArgument(args, 2); |
124 int64_t level = | 121 int64_t level = |
125 DartUtils::GetInt64ValueCheckRange(level_obj, kMinInt32, kMaxInt32); | 122 DartUtils::GetInt64ValueCheckRange(level_obj, kMinInt32, kMaxInt32); |
126 Dart_Handle window_bits_obj = Dart_GetNativeArgument(args, 3); | 123 Dart_Handle window_bits_obj = Dart_GetNativeArgument(args, 3); |
127 int64_t window_bits = DartUtils::GetIntegerValue(window_bits_obj); | 124 int64_t window_bits = DartUtils::GetIntegerValue(window_bits_obj); |
128 Dart_Handle mLevel_obj = Dart_GetNativeArgument(args, 4); | 125 Dart_Handle mLevel_obj = Dart_GetNativeArgument(args, 4); |
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
165 DartUtils::NewInternalError("Failed to create ZLibDeflateFilter")); | 162 DartUtils::NewInternalError("Failed to create ZLibDeflateFilter")); |
166 } | 163 } |
167 Dart_Handle result = Filter::SetFilterAndCreateFinalizer( | 164 Dart_Handle result = Filter::SetFilterAndCreateFinalizer( |
168 filter_obj, filter, sizeof(*filter) + dictionary_length); | 165 filter_obj, filter, sizeof(*filter) + dictionary_length); |
169 if (Dart_IsError(result)) { | 166 if (Dart_IsError(result)) { |
170 delete filter; | 167 delete filter; |
171 Dart_PropagateError(result); | 168 Dart_PropagateError(result); |
172 } | 169 } |
173 } | 170 } |
174 | 171 |
175 | |
176 void FUNCTION_NAME(Filter_Process)(Dart_NativeArguments args) { | 172 void FUNCTION_NAME(Filter_Process)(Dart_NativeArguments args) { |
177 Dart_Handle filter_obj = Dart_GetNativeArgument(args, 0); | 173 Dart_Handle filter_obj = Dart_GetNativeArgument(args, 0); |
178 Dart_Handle data_obj = Dart_GetNativeArgument(args, 1); | 174 Dart_Handle data_obj = Dart_GetNativeArgument(args, 1); |
179 intptr_t start = DartUtils::GetIntptrValue(Dart_GetNativeArgument(args, 2)); | 175 intptr_t start = DartUtils::GetIntptrValue(Dart_GetNativeArgument(args, 2)); |
180 intptr_t end = DartUtils::GetIntptrValue(Dart_GetNativeArgument(args, 3)); | 176 intptr_t end = DartUtils::GetIntptrValue(Dart_GetNativeArgument(args, 3)); |
181 intptr_t chunk_length = end - start; | 177 intptr_t chunk_length = end - start; |
182 intptr_t length; | 178 intptr_t length; |
183 Dart_TypedData_Type type; | 179 Dart_TypedData_Type type; |
184 uint8_t* buffer = NULL; | 180 uint8_t* buffer = NULL; |
185 | 181 |
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
223 } | 219 } |
224 } | 220 } |
225 // Process will take ownership of buffer, if successful. | 221 // Process will take ownership of buffer, if successful. |
226 if (!filter->Process(buffer, chunk_length)) { | 222 if (!filter->Process(buffer, chunk_length)) { |
227 delete[] buffer; | 223 delete[] buffer; |
228 Dart_ThrowException(DartUtils::NewInternalError( | 224 Dart_ThrowException(DartUtils::NewInternalError( |
229 "Call to Process while still processing data")); | 225 "Call to Process while still processing data")); |
230 } | 226 } |
231 } | 227 } |
232 | 228 |
233 | |
234 void FUNCTION_NAME(Filter_Processed)(Dart_NativeArguments args) { | 229 void FUNCTION_NAME(Filter_Processed)(Dart_NativeArguments args) { |
235 Dart_Handle filter_obj = Dart_GetNativeArgument(args, 0); | 230 Dart_Handle filter_obj = Dart_GetNativeArgument(args, 0); |
236 Dart_Handle flush_obj = Dart_GetNativeArgument(args, 1); | 231 Dart_Handle flush_obj = Dart_GetNativeArgument(args, 1); |
237 bool flush = DartUtils::GetBooleanValue(flush_obj); | 232 bool flush = DartUtils::GetBooleanValue(flush_obj); |
238 Dart_Handle end_obj = Dart_GetNativeArgument(args, 2); | 233 Dart_Handle end_obj = Dart_GetNativeArgument(args, 2); |
239 bool end = DartUtils::GetBooleanValue(end_obj); | 234 bool end = DartUtils::GetBooleanValue(end_obj); |
240 | 235 |
241 Filter* filter = NULL; | 236 Filter* filter = NULL; |
242 Dart_Handle err = GetFilter(filter_obj, &filter); | 237 Dart_Handle err = GetFilter(filter_obj, &filter); |
243 if (Dart_IsError(err)) { | 238 if (Dart_IsError(err)) { |
244 Dart_PropagateError(err); | 239 Dart_PropagateError(err); |
245 } | 240 } |
246 | 241 |
247 intptr_t read = filter->Processed( | 242 intptr_t read = filter->Processed( |
248 filter->processed_buffer(), filter->processed_buffer_size(), flush, end); | 243 filter->processed_buffer(), filter->processed_buffer_size(), flush, end); |
249 if (read < 0) { | 244 if (read < 0) { |
250 Dart_ThrowException(DartUtils::NewInternalError("Filter error, bad data")); | 245 Dart_ThrowException(DartUtils::NewInternalError("Filter error, bad data")); |
251 } else if (read == 0) { | 246 } else if (read == 0) { |
252 Dart_SetReturnValue(args, Dart_Null()); | 247 Dart_SetReturnValue(args, Dart_Null()); |
253 } else { | 248 } else { |
254 uint8_t* io_buffer; | 249 uint8_t* io_buffer; |
255 Dart_Handle result = IOBuffer::Allocate(read, &io_buffer); | 250 Dart_Handle result = IOBuffer::Allocate(read, &io_buffer); |
256 memmove(io_buffer, filter->processed_buffer(), read); | 251 memmove(io_buffer, filter->processed_buffer(), read); |
257 Dart_SetReturnValue(args, result); | 252 Dart_SetReturnValue(args, result); |
258 } | 253 } |
259 } | 254 } |
260 | 255 |
261 | |
262 static void DeleteFilter(void* isolate_data, | 256 static void DeleteFilter(void* isolate_data, |
263 Dart_WeakPersistentHandle handle, | 257 Dart_WeakPersistentHandle handle, |
264 void* filter_pointer) { | 258 void* filter_pointer) { |
265 Filter* filter = reinterpret_cast<Filter*>(filter_pointer); | 259 Filter* filter = reinterpret_cast<Filter*>(filter_pointer); |
266 delete filter; | 260 delete filter; |
267 } | 261 } |
268 | 262 |
269 | |
270 Dart_Handle Filter::SetFilterAndCreateFinalizer(Dart_Handle filter, | 263 Dart_Handle Filter::SetFilterAndCreateFinalizer(Dart_Handle filter, |
271 Filter* filter_pointer, | 264 Filter* filter_pointer, |
272 intptr_t size) { | 265 intptr_t size) { |
273 Dart_Handle err = | 266 Dart_Handle err = |
274 Dart_SetNativeInstanceField(filter, kFilterPointerNativeField, | 267 Dart_SetNativeInstanceField(filter, kFilterPointerNativeField, |
275 reinterpret_cast<intptr_t>(filter_pointer)); | 268 reinterpret_cast<intptr_t>(filter_pointer)); |
276 if (Dart_IsError(err)) { | 269 if (Dart_IsError(err)) { |
277 return err; | 270 return err; |
278 } | 271 } |
279 Dart_NewWeakPersistentHandle(filter, reinterpret_cast<void*>(filter_pointer), | 272 Dart_NewWeakPersistentHandle(filter, reinterpret_cast<void*>(filter_pointer), |
280 size, DeleteFilter); | 273 size, DeleteFilter); |
281 return err; | 274 return err; |
282 } | 275 } |
283 | 276 |
284 | |
285 Dart_Handle Filter::GetFilterNativeField(Dart_Handle filter, | 277 Dart_Handle Filter::GetFilterNativeField(Dart_Handle filter, |
286 Filter** filter_pointer) { | 278 Filter** filter_pointer) { |
287 return Dart_GetNativeInstanceField( | 279 return Dart_GetNativeInstanceField( |
288 filter, kFilterPointerNativeField, | 280 filter, kFilterPointerNativeField, |
289 reinterpret_cast<intptr_t*>(filter_pointer)); | 281 reinterpret_cast<intptr_t*>(filter_pointer)); |
290 } | 282 } |
291 | 283 |
292 | |
293 ZLibDeflateFilter::~ZLibDeflateFilter() { | 284 ZLibDeflateFilter::~ZLibDeflateFilter() { |
294 delete[] dictionary_; | 285 delete[] dictionary_; |
295 delete[] current_buffer_; | 286 delete[] current_buffer_; |
296 if (initialized()) { | 287 if (initialized()) { |
297 deflateEnd(&stream_); | 288 deflateEnd(&stream_); |
298 } | 289 } |
299 } | 290 } |
300 | 291 |
301 | |
302 bool ZLibDeflateFilter::Init() { | 292 bool ZLibDeflateFilter::Init() { |
303 int window_bits = window_bits_; | 293 int window_bits = window_bits_; |
304 if (raw_) { | 294 if (raw_) { |
305 window_bits = -window_bits; | 295 window_bits = -window_bits; |
306 } else if (gzip_) { | 296 } else if (gzip_) { |
307 window_bits += kZLibFlagUseGZipHeader; | 297 window_bits += kZLibFlagUseGZipHeader; |
308 } | 298 } |
309 stream_.next_in = Z_NULL; | 299 stream_.next_in = Z_NULL; |
310 stream_.zalloc = Z_NULL; | 300 stream_.zalloc = Z_NULL; |
311 stream_.zfree = Z_NULL; | 301 stream_.zfree = Z_NULL; |
312 stream_.opaque = Z_NULL; | 302 stream_.opaque = Z_NULL; |
313 int result = deflateInit2(&stream_, level_, Z_DEFLATED, window_bits, | 303 int result = deflateInit2(&stream_, level_, Z_DEFLATED, window_bits, |
314 mem_level_, strategy_); | 304 mem_level_, strategy_); |
315 if (result != Z_OK) { | 305 if (result != Z_OK) { |
316 return false; | 306 return false; |
317 } | 307 } |
318 if ((dictionary_ != NULL) && !gzip_ && !raw_) { | 308 if ((dictionary_ != NULL) && !gzip_ && !raw_) { |
319 result = deflateSetDictionary(&stream_, dictionary_, dictionary_length_); | 309 result = deflateSetDictionary(&stream_, dictionary_, dictionary_length_); |
320 delete[] dictionary_; | 310 delete[] dictionary_; |
321 dictionary_ = NULL; | 311 dictionary_ = NULL; |
322 if (result != Z_OK) { | 312 if (result != Z_OK) { |
323 return false; | 313 return false; |
324 } | 314 } |
325 } | 315 } |
326 set_initialized(true); | 316 set_initialized(true); |
327 return true; | 317 return true; |
328 } | 318 } |
329 | 319 |
330 | |
331 bool ZLibDeflateFilter::Process(uint8_t* data, intptr_t length) { | 320 bool ZLibDeflateFilter::Process(uint8_t* data, intptr_t length) { |
332 if (current_buffer_ != NULL) { | 321 if (current_buffer_ != NULL) { |
333 return false; | 322 return false; |
334 } | 323 } |
335 stream_.avail_in = length; | 324 stream_.avail_in = length; |
336 stream_.next_in = current_buffer_ = data; | 325 stream_.next_in = current_buffer_ = data; |
337 return true; | 326 return true; |
338 } | 327 } |
339 | 328 |
340 intptr_t ZLibDeflateFilter::Processed(uint8_t* buffer, | 329 intptr_t ZLibDeflateFilter::Processed(uint8_t* buffer, |
(...skipping 19 matching lines...) Expand all Loading... |
360 case Z_STREAM_ERROR: | 349 case Z_STREAM_ERROR: |
361 error = true; | 350 error = true; |
362 } | 351 } |
363 | 352 |
364 delete[] current_buffer_; | 353 delete[] current_buffer_; |
365 current_buffer_ = NULL; | 354 current_buffer_ = NULL; |
366 // Either 0 Byte processed or error | 355 // Either 0 Byte processed or error |
367 return error ? -1 : 0; | 356 return error ? -1 : 0; |
368 } | 357 } |
369 | 358 |
370 | |
371 ZLibInflateFilter::~ZLibInflateFilter() { | 359 ZLibInflateFilter::~ZLibInflateFilter() { |
372 delete[] dictionary_; | 360 delete[] dictionary_; |
373 delete[] current_buffer_; | 361 delete[] current_buffer_; |
374 if (initialized()) { | 362 if (initialized()) { |
375 inflateEnd(&stream_); | 363 inflateEnd(&stream_); |
376 } | 364 } |
377 } | 365 } |
378 | 366 |
379 | |
380 bool ZLibInflateFilter::Init() { | 367 bool ZLibInflateFilter::Init() { |
381 int window_bits = | 368 int window_bits = |
382 raw_ ? -window_bits_ : window_bits_ | kZLibFlagAcceptAnyHeader; | 369 raw_ ? -window_bits_ : window_bits_ | kZLibFlagAcceptAnyHeader; |
383 | 370 |
384 stream_.next_in = Z_NULL; | 371 stream_.next_in = Z_NULL; |
385 stream_.avail_in = 0; | 372 stream_.avail_in = 0; |
386 stream_.zalloc = Z_NULL; | 373 stream_.zalloc = Z_NULL; |
387 stream_.zfree = Z_NULL; | 374 stream_.zfree = Z_NULL; |
388 stream_.opaque = Z_NULL; | 375 stream_.opaque = Z_NULL; |
389 int result = inflateInit2(&stream_, window_bits); | 376 int result = inflateInit2(&stream_, window_bits); |
390 if (result != Z_OK) { | 377 if (result != Z_OK) { |
391 return false; | 378 return false; |
392 } | 379 } |
393 set_initialized(true); | 380 set_initialized(true); |
394 return true; | 381 return true; |
395 } | 382 } |
396 | 383 |
397 | |
398 bool ZLibInflateFilter::Process(uint8_t* data, intptr_t length) { | 384 bool ZLibInflateFilter::Process(uint8_t* data, intptr_t length) { |
399 if (current_buffer_ != NULL) { | 385 if (current_buffer_ != NULL) { |
400 return false; | 386 return false; |
401 } | 387 } |
402 stream_.avail_in = length; | 388 stream_.avail_in = length; |
403 stream_.next_in = current_buffer_ = data; | 389 stream_.next_in = current_buffer_ = data; |
404 return true; | 390 return true; |
405 } | 391 } |
406 | 392 |
407 | |
408 intptr_t ZLibInflateFilter::Processed(uint8_t* buffer, | 393 intptr_t ZLibInflateFilter::Processed(uint8_t* buffer, |
409 intptr_t length, | 394 intptr_t length, |
410 bool flush, | 395 bool flush, |
411 bool end) { | 396 bool end) { |
412 stream_.avail_out = length; | 397 stream_.avail_out = length; |
413 stream_.next_out = buffer; | 398 stream_.next_out = buffer; |
414 bool error = false; | 399 bool error = false; |
415 int v; | 400 int v; |
416 switch (v = inflate(&stream_, | 401 switch (v = inflate(&stream_, |
417 end ? Z_FINISH : flush ? Z_SYNC_FLUSH : Z_NO_FLUSH)) { | 402 end ? Z_FINISH : flush ? Z_SYNC_FLUSH : Z_NO_FLUSH)) { |
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
451 delete[] current_buffer_; | 436 delete[] current_buffer_; |
452 current_buffer_ = NULL; | 437 current_buffer_ = NULL; |
453 // Either 0 Byte processed or error | 438 // Either 0 Byte processed or error |
454 return error ? -1 : 0; | 439 return error ? -1 : 0; |
455 } | 440 } |
456 | 441 |
457 } // namespace bin | 442 } // namespace bin |
458 } // namespace dart | 443 } // namespace dart |
459 | 444 |
460 #endif // !defined(DART_IO_DISABLED) | 445 #endif // !defined(DART_IO_DISABLED) |
OLD | NEW |