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