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

Side by Side Diff: mojo/dart/embedder/io/filter.cc

Issue 1760523007: Add support for compression filters in the mojo dart:io (Closed) Base URL: git@github.com:domokit/mojo.git@master
Patch Set: Created 4 years, 9 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
« no previous file with comments | « mojo/dart/embedder/io/filter.h ('k') | mojo/dart/embedder/io/filter_patch.dart » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
(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
OLDNEW
« no previous file with comments | « mojo/dart/embedder/io/filter.h ('k') | mojo/dart/embedder/io/filter_patch.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698