| OLD | NEW |
| (Empty) | |
| 1 // Copyright 2016 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. |
| 4 |
| 5 #include "mojo/dart/embedder/io/filter.h" |
| 6 |
| 7 namespace mojo { |
| 8 namespace dart { |
| 9 |
| 10 const int kZLibFlagUseGZipHeader = 16; |
| 11 const int kZLibFlagAcceptAnyHeader = 32; |
| 12 |
| 13 static const int kFilterPointerNativeField = 0; |
| 14 |
| 15 Dart_Handle Filter::SetFilterPointerNativeField(Dart_Handle filter, |
| 16 Filter* filter_pointer) { |
| 17 return Dart_SetNativeInstanceField( |
| 18 filter, |
| 19 kFilterPointerNativeField, |
| 20 reinterpret_cast<intptr_t>(filter_pointer)); |
| 21 } |
| 22 |
| 23 |
| 24 Dart_Handle Filter::GetFilterPointerNativeField(Dart_Handle filter, |
| 25 Filter** filter_pointer) { |
| 26 return Dart_GetNativeInstanceField( |
| 27 filter, |
| 28 kFilterPointerNativeField, |
| 29 reinterpret_cast<intptr_t*>(filter_pointer)); |
| 30 } |
| 31 |
| 32 |
| 33 ZLibDeflateFilter::~ZLibDeflateFilter() { |
| 34 delete[] dictionary_; |
| 35 delete[] current_buffer_; |
| 36 if (initialized()) deflateEnd(&stream_); |
| 37 } |
| 38 |
| 39 |
| 40 bool ZLibDeflateFilter::Init() { |
| 41 int window_bits = window_bits_; |
| 42 if (raw_) { |
| 43 window_bits = -window_bits; |
| 44 } else if (gzip_) { |
| 45 window_bits += kZLibFlagUseGZipHeader; |
| 46 } |
| 47 stream_.next_in = Z_NULL; |
| 48 stream_.zalloc = Z_NULL; |
| 49 stream_.zfree = Z_NULL; |
| 50 stream_.opaque = Z_NULL; |
| 51 int result = deflateInit2(&stream_, level_, Z_DEFLATED, window_bits, |
| 52 mem_level_, strategy_); |
| 53 if (result != Z_OK) { |
| 54 return false; |
| 55 } |
| 56 if (dictionary_ != NULL && !gzip_ && !raw_) { |
| 57 result = deflateSetDictionary(&stream_, dictionary_, dictionary_length_); |
| 58 delete[] dictionary_; |
| 59 dictionary_ = NULL; |
| 60 if (result != Z_OK) { |
| 61 return false; |
| 62 } |
| 63 } |
| 64 set_initialized(true); |
| 65 return true; |
| 66 } |
| 67 |
| 68 |
| 69 bool ZLibDeflateFilter::Process(uint8_t* data, intptr_t length) { |
| 70 if (current_buffer_ != NULL) return false; |
| 71 stream_.avail_in = length; |
| 72 stream_.next_in = current_buffer_ = data; |
| 73 return true; |
| 74 } |
| 75 |
| 76 intptr_t ZLibDeflateFilter::Processed(uint8_t* buffer, |
| 77 intptr_t length, |
| 78 bool flush, |
| 79 bool end) { |
| 80 stream_.avail_out = length; |
| 81 stream_.next_out = buffer; |
| 82 bool error = false; |
| 83 switch (deflate(&stream_, |
| 84 end ? Z_FINISH : flush ? Z_SYNC_FLUSH : Z_NO_FLUSH)) { |
| 85 case Z_STREAM_END: |
| 86 case Z_BUF_ERROR: |
| 87 case Z_OK: { |
| 88 intptr_t processed = length - stream_.avail_out; |
| 89 if (processed == 0) { |
| 90 break; |
| 91 } |
| 92 return processed; |
| 93 } |
| 94 |
| 95 default: |
| 96 case Z_STREAM_ERROR: |
| 97 error = true; |
| 98 } |
| 99 |
| 100 delete[] current_buffer_; |
| 101 current_buffer_ = NULL; |
| 102 // Either 0 Byte processed or error |
| 103 return error ? -1 : 0; |
| 104 } |
| 105 |
| 106 |
| 107 ZLibInflateFilter::~ZLibInflateFilter() { |
| 108 delete[] dictionary_; |
| 109 delete[] current_buffer_; |
| 110 if (initialized()) inflateEnd(&stream_); |
| 111 } |
| 112 |
| 113 |
| 114 bool ZLibInflateFilter::Init() { |
| 115 int window_bits = raw_ ? |
| 116 -window_bits_ : |
| 117 window_bits_ | kZLibFlagAcceptAnyHeader; |
| 118 |
| 119 stream_.next_in = Z_NULL; |
| 120 stream_.avail_in = 0; |
| 121 stream_.zalloc = Z_NULL; |
| 122 stream_.zfree = Z_NULL; |
| 123 stream_.opaque = Z_NULL; |
| 124 int result = inflateInit2(&stream_, window_bits); |
| 125 if (result != Z_OK) { |
| 126 return false; |
| 127 } |
| 128 set_initialized(true); |
| 129 return true; |
| 130 } |
| 131 |
| 132 |
| 133 bool ZLibInflateFilter::Process(uint8_t* data, intptr_t length) { |
| 134 if (current_buffer_ != NULL) return false; |
| 135 stream_.avail_in = length; |
| 136 stream_.next_in = current_buffer_ = data; |
| 137 return true; |
| 138 } |
| 139 |
| 140 |
| 141 intptr_t ZLibInflateFilter::Processed(uint8_t* buffer, |
| 142 intptr_t length, |
| 143 bool flush, |
| 144 bool end) { |
| 145 stream_.avail_out = length; |
| 146 stream_.next_out = buffer; |
| 147 bool error = false; |
| 148 int v; |
| 149 switch (v = inflate(&stream_, |
| 150 end ? Z_FINISH : flush ? Z_SYNC_FLUSH : Z_NO_FLUSH)) { |
| 151 case Z_STREAM_END: |
| 152 case Z_BUF_ERROR: |
| 153 case Z_OK: { |
| 154 intptr_t processed = length - stream_.avail_out; |
| 155 if (processed == 0) { |
| 156 break; |
| 157 } |
| 158 return processed; |
| 159 } |
| 160 |
| 161 case Z_NEED_DICT: |
| 162 if (dictionary_ == NULL) { |
| 163 error = true; |
| 164 } else { |
| 165 int result = inflateSetDictionary(&stream_, dictionary_, |
| 166 dictionary_length_); |
| 167 delete[] dictionary_; |
| 168 dictionary_ = NULL; |
| 169 error = result != Z_OK; |
| 170 } |
| 171 if (error) { |
| 172 break; |
| 173 } else { |
| 174 return Processed(buffer, length, flush, end); |
| 175 } |
| 176 |
| 177 default: |
| 178 case Z_MEM_ERROR: |
| 179 case Z_DATA_ERROR: |
| 180 case Z_STREAM_ERROR: |
| 181 error = true; |
| 182 } |
| 183 |
| 184 delete[] current_buffer_; |
| 185 current_buffer_ = NULL; |
| 186 // Either 0 Byte processed or error |
| 187 return error ? -1 : 0; |
| 188 } |
| 189 |
| 190 } // namespace dart |
| 191 } // namespace mojo |
| OLD | NEW |