| 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 #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 |
| 11 const int kZlibFlagMemUsage = 8; | 11 const int kZlibFlagMemUsage = 8; |
| 12 const int kZLibFlagWindowBits = 15; | 12 const int kZLibFlagWindowBits = 15; |
| 13 const int kZLibFlagUseGZipHeader = 16; | 13 const int kZLibFlagUseGZipHeader = 16; |
| 14 const int kZLibFlagAcceptAnyHeader = 32; | 14 const int kZLibFlagAcceptAnyHeader = 32; |
| 15 | 15 |
| 16 const intptr_t kFilterBufferLength = 64 * KB; | |
| 17 | |
| 18 static const int kFilterPointerNativeField = 0; | 16 static const int kFilterPointerNativeField = 0; |
| 19 | 17 |
| 20 Filter* GetFilter(Dart_Handle filter_obj) { | 18 Filter* GetFilter(Dart_Handle filter_obj) { |
| 21 Filter* filter; | 19 Filter* filter; |
| 22 Dart_Handle result = Filter::GetFilterPointerNativeField(filter_obj, &filter); | 20 Dart_Handle result = Filter::GetFilterPointerNativeField(filter_obj, &filter); |
| 23 if (Dart_IsError(result)) { | 21 if (Dart_IsError(result)) { |
| 24 Dart_PropagateError(result); | 22 Dart_PropagateError(result); |
| 25 } | 23 } |
| 26 if (filter == NULL) { | 24 if (filter == NULL) { |
| 27 Dart_ThrowException(DartUtils::NewInternalError("Filter destroyed")); | 25 Dart_ThrowException(DartUtils::NewInternalError("Filter destroyed")); |
| (...skipping 98 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 126 void FUNCTION_NAME(Filter_Processed)(Dart_NativeArguments args) { | 124 void FUNCTION_NAME(Filter_Processed)(Dart_NativeArguments args) { |
| 127 Dart_EnterScope(); | 125 Dart_EnterScope(); |
| 128 Dart_Handle filter_obj = Dart_GetNativeArgument(args, 0); | 126 Dart_Handle filter_obj = Dart_GetNativeArgument(args, 0); |
| 129 Filter* filter = GetFilter(filter_obj); | 127 Filter* filter = GetFilter(filter_obj); |
| 130 Dart_Handle flush_obj = Dart_GetNativeArgument(args, 1); | 128 Dart_Handle flush_obj = Dart_GetNativeArgument(args, 1); |
| 131 bool flush; | 129 bool flush; |
| 132 if (Dart_IsError(Dart_BooleanValue(flush_obj, &flush))) { | 130 if (Dart_IsError(Dart_BooleanValue(flush_obj, &flush))) { |
| 133 Dart_ThrowException(DartUtils::NewInternalError( | 131 Dart_ThrowException(DartUtils::NewInternalError( |
| 134 "Failed to get 'flush' parameter")); | 132 "Failed to get 'flush' parameter")); |
| 135 } | 133 } |
| 136 uint8_t buffer[kFilterBufferLength]; | 134 intptr_t read = filter->Processed(filter->processed_buffer(), |
| 137 intptr_t read = filter->Processed(buffer, kFilterBufferLength, flush); | 135 filter->processed_buffer_size(), |
| 136 flush); |
| 138 if (read < 0) { | 137 if (read < 0) { |
| 139 // Error, end filter. | 138 // Error, end filter. |
| 140 EndFilter(filter_obj, filter); | 139 EndFilter(filter_obj, filter); |
| 141 Dart_ThrowException(DartUtils::NewInternalError( | 140 Dart_ThrowException(DartUtils::NewInternalError( |
| 142 "Filter error, bad data")); | 141 "Filter error, bad data")); |
| 143 } else if (read == 0) { | 142 } else if (read == 0) { |
| 144 Dart_SetReturnValue(args, Dart_Null()); | 143 Dart_SetReturnValue(args, Dart_Null()); |
| 145 } else { | 144 } else { |
| 146 uint8_t* io_buffer; | 145 uint8_t* io_buffer; |
| 147 Dart_Handle result = IOBuffer::Allocate(read, &io_buffer); | 146 Dart_Handle result = IOBuffer::Allocate(read, &io_buffer); |
| 148 memmove(io_buffer, buffer, read); | 147 memmove(io_buffer, filter->processed_buffer(), read); |
| 149 Dart_SetReturnValue(args, result); | 148 Dart_SetReturnValue(args, result); |
| 150 } | 149 } |
| 151 Dart_ExitScope(); | 150 Dart_ExitScope(); |
| 152 } | 151 } |
| 153 | 152 |
| 154 | 153 |
| 155 void FUNCTION_NAME(Filter_End)(Dart_NativeArguments args) { | 154 void FUNCTION_NAME(Filter_End)(Dart_NativeArguments args) { |
| 156 Dart_EnterScope(); | 155 Dart_EnterScope(); |
| 157 Dart_Handle filter_obj = Dart_GetNativeArgument(args, 0); | 156 Dart_Handle filter_obj = Dart_GetNativeArgument(args, 0); |
| 158 Filter* filter = GetFilter(filter_obj); | 157 Filter* filter = GetFilter(filter_obj); |
| (...skipping 13 matching lines...) Expand all Loading... |
| 172 Dart_Handle Filter::GetFilterPointerNativeField(Dart_Handle filter, | 171 Dart_Handle Filter::GetFilterPointerNativeField(Dart_Handle filter, |
| 173 Filter** filter_pointer) { | 172 Filter** filter_pointer) { |
| 174 return Dart_GetNativeInstanceField( | 173 return Dart_GetNativeInstanceField( |
| 175 filter, | 174 filter, |
| 176 kFilterPointerNativeField, | 175 kFilterPointerNativeField, |
| 177 reinterpret_cast<intptr_t*>(filter_pointer)); | 176 reinterpret_cast<intptr_t*>(filter_pointer)); |
| 178 } | 177 } |
| 179 | 178 |
| 180 | 179 |
| 181 ZLibDeflateFilter::~ZLibDeflateFilter() { | 180 ZLibDeflateFilter::~ZLibDeflateFilter() { |
| 182 delete[] current_buffer; | 181 delete[] current_buffer_; |
| 183 if (initialized) deflateEnd(&stream); | 182 if (initialized()) deflateEnd(&stream_); |
| 184 } | 183 } |
| 185 | 184 |
| 186 | 185 |
| 187 bool ZLibDeflateFilter::Init() { | 186 bool ZLibDeflateFilter::Init() { |
| 188 stream.zalloc = Z_NULL; | 187 stream_.zalloc = Z_NULL; |
| 189 stream.zfree = Z_NULL; | 188 stream_.zfree = Z_NULL; |
| 190 stream.opaque = Z_NULL; | 189 stream_.opaque = Z_NULL; |
| 191 int result = deflateInit2( | 190 int result = deflateInit2( |
| 192 &stream, | 191 &stream_, |
| 193 level, | 192 level_, |
| 194 Z_DEFLATED, | 193 Z_DEFLATED, |
| 195 kZLibFlagWindowBits | (gZip ? kZLibFlagUseGZipHeader : 0), | 194 kZLibFlagWindowBits | (gzip_ ? kZLibFlagUseGZipHeader : 0), |
| 196 kZlibFlagMemUsage, | 195 kZlibFlagMemUsage, |
| 197 Z_DEFAULT_STRATEGY); | 196 Z_DEFAULT_STRATEGY); |
| 198 if (result == Z_OK) { | 197 if (result == Z_OK) { |
| 199 initialized = true; | 198 set_initialized(true); |
| 200 return true; | 199 return true; |
| 201 } | 200 } |
| 202 return false; | 201 return false; |
| 203 } | 202 } |
| 204 | 203 |
| 205 | 204 |
| 206 bool ZLibDeflateFilter::Process(uint8_t* data, intptr_t length) { | 205 bool ZLibDeflateFilter::Process(uint8_t* data, intptr_t length) { |
| 207 if (current_buffer != NULL) return false; | 206 if (current_buffer_ != NULL) return false; |
| 208 stream.avail_in = length; | 207 stream_.avail_in = length; |
| 209 stream.next_in = current_buffer = data; | 208 stream_.next_in = current_buffer_ = data; |
| 210 return true; | 209 return true; |
| 211 } | 210 } |
| 212 | 211 |
| 213 intptr_t ZLibDeflateFilter::Processed(uint8_t* buffer, | 212 intptr_t ZLibDeflateFilter::Processed(uint8_t* buffer, |
| 214 intptr_t length, | 213 intptr_t length, |
| 215 bool flush) { | 214 bool flush) { |
| 216 stream.avail_out = length; | 215 stream_.avail_out = length; |
| 217 stream.next_out = buffer; | 216 stream_.next_out = buffer; |
| 218 switch (deflate(&stream, flush ? Z_SYNC_FLUSH : Z_NO_FLUSH)) { | 217 switch (deflate(&stream_, flush ? Z_SYNC_FLUSH : Z_NO_FLUSH)) { |
| 219 case Z_OK: { | 218 case Z_OK: { |
| 220 intptr_t processed = length - stream.avail_out; | 219 intptr_t processed = length - stream_.avail_out; |
| 221 if (processed == 0) { | 220 if (processed == 0) { |
| 222 delete[] current_buffer; | 221 delete[] current_buffer_; |
| 223 current_buffer = NULL; | 222 current_buffer_ = NULL; |
| 224 return 0; | 223 return 0; |
| 225 } else { | 224 } else { |
| 226 // We processed data, should be called again. | 225 // We processed data, should be called again. |
| 227 return processed; | 226 return processed; |
| 228 } | 227 } |
| 229 } | 228 } |
| 230 | 229 |
| 231 case Z_STREAM_END: | 230 case Z_STREAM_END: |
| 232 case Z_BUF_ERROR: | 231 case Z_BUF_ERROR: |
| 233 // We processed all available input data. | 232 // We processed all available input data. |
| 234 delete[] current_buffer; | 233 delete[] current_buffer_; |
| 235 current_buffer = NULL; | 234 current_buffer_ = NULL; |
| 236 return 0; | 235 return 0; |
| 237 | 236 |
| 238 default: | 237 default: |
| 239 case Z_STREAM_ERROR: | 238 case Z_STREAM_ERROR: |
| 240 // An error occoured. | 239 // An error occoured. |
| 241 delete[] current_buffer; | 240 delete[] current_buffer_; |
| 242 current_buffer = NULL; | 241 current_buffer_ = NULL; |
| 243 return -1; | 242 return -1; |
| 244 } | 243 } |
| 245 } | 244 } |
| 246 | 245 |
| 247 | 246 |
| 248 ZLibInflateFilter::~ZLibInflateFilter() { | 247 ZLibInflateFilter::~ZLibInflateFilter() { |
| 249 delete[] current_buffer; | 248 delete[] current_buffer_; |
| 250 if (initialized) inflateEnd(&stream); | 249 if (initialized()) inflateEnd(&stream_); |
| 251 } | 250 } |
| 252 | 251 |
| 253 | 252 |
| 254 bool ZLibInflateFilter::Init() { | 253 bool ZLibInflateFilter::Init() { |
| 255 stream.zalloc = Z_NULL; | 254 stream_.zalloc = Z_NULL; |
| 256 stream.zfree = Z_NULL; | 255 stream_.zfree = Z_NULL; |
| 257 stream.opaque = Z_NULL; | 256 stream_.opaque = Z_NULL; |
| 258 int result = inflateInit2(&stream, | 257 int result = inflateInit2(&stream_, |
| 259 kZLibFlagWindowBits | kZLibFlagAcceptAnyHeader); | 258 kZLibFlagWindowBits | kZLibFlagAcceptAnyHeader); |
| 260 if (result == Z_OK) { | 259 if (result == Z_OK) { |
| 261 initialized = true; | 260 set_initialized(true); |
| 262 return true; | 261 return true; |
| 263 } | 262 } |
| 264 return false; | 263 return false; |
| 265 } | 264 } |
| 266 | 265 |
| 267 | 266 |
| 268 bool ZLibInflateFilter::Process(uint8_t* data, intptr_t length) { | 267 bool ZLibInflateFilter::Process(uint8_t* data, intptr_t length) { |
| 269 if (current_buffer != NULL) return false; | 268 if (current_buffer_ != NULL) return false; |
| 270 stream.avail_in = length; | 269 stream_.avail_in = length; |
| 271 stream.next_in = current_buffer = data; | 270 stream_.next_in = current_buffer_ = data; |
| 272 return true; | 271 return true; |
| 273 } | 272 } |
| 274 | 273 |
| 275 | 274 |
| 276 intptr_t ZLibInflateFilter::Processed(uint8_t* buffer, | 275 intptr_t ZLibInflateFilter::Processed(uint8_t* buffer, |
| 277 intptr_t length, | 276 intptr_t length, |
| 278 bool flush) { | 277 bool flush) { |
| 279 stream.avail_out = length; | 278 stream_.avail_out = length; |
| 280 stream.next_out = buffer; | 279 stream_.next_out = buffer; |
| 281 switch (inflate(&stream, flush ? Z_SYNC_FLUSH : Z_NO_FLUSH)) { | 280 switch (inflate(&stream_, flush ? Z_SYNC_FLUSH : Z_NO_FLUSH)) { |
| 282 case Z_OK: { | 281 case Z_OK: { |
| 283 intptr_t processed = length - stream.avail_out; | 282 intptr_t processed = length - stream_.avail_out; |
| 284 if (processed == 0) { | 283 if (processed == 0) { |
| 285 delete[] current_buffer; | 284 delete[] current_buffer_; |
| 286 current_buffer = NULL; | 285 current_buffer_ = NULL; |
| 287 return 0; | 286 return 0; |
| 288 } else { | 287 } else { |
| 289 // We processed data, should be called again. | 288 // We processed data, should be called again. |
| 290 return processed; | 289 return processed; |
| 291 } | 290 } |
| 292 } | 291 } |
| 293 | 292 |
| 294 case Z_STREAM_END: | 293 case Z_STREAM_END: |
| 295 case Z_BUF_ERROR: | 294 case Z_BUF_ERROR: |
| 296 // We processed all available input data. | 295 // We processed all available input data. |
| 297 delete[] current_buffer; | 296 delete[] current_buffer_; |
| 298 current_buffer = NULL; | 297 current_buffer_ = NULL; |
| 299 return 0; | 298 return 0; |
| 300 | 299 |
| 301 default: | 300 default: |
| 302 case Z_MEM_ERROR: | 301 case Z_MEM_ERROR: |
| 303 case Z_NEED_DICT: | 302 case Z_NEED_DICT: |
| 304 case Z_DATA_ERROR: | 303 case Z_DATA_ERROR: |
| 305 case Z_STREAM_ERROR: | 304 case Z_STREAM_ERROR: |
| 306 // An error occoured. | 305 // An error occoured. |
| 307 delete[] current_buffer; | 306 delete[] current_buffer_; |
| 308 current_buffer = NULL; | 307 current_buffer_ = NULL; |
| 309 return -1; | 308 return -1; |
| 310 } | 309 } |
| 311 } | 310 } |
| 312 | 311 |
| OLD | NEW |