OLD | NEW |
1 /* | 1 /* |
2 * This file is part of Adblock Plus <https://adblockplus.org/>, | 2 * This file is part of Adblock Plus <https://adblockplus.org/>, |
3 * Copyright (C) 2006-2016 Eyeo GmbH | 3 * Copyright (C) 2006-2016 Eyeo GmbH |
4 * | 4 * |
5 * Adblock Plus is free software: you can redistribute it and/or modify | 5 * Adblock Plus is free software: you can redistribute it and/or modify |
6 * it under the terms of the GNU General Public License version 3 as | 6 * it under the terms of the GNU General Public License version 3 as |
7 * published by the Free Software Foundation. | 7 * published by the Free Software Foundation. |
8 * | 8 * |
9 * Adblock Plus is distributed in the hope that it will be useful, | 9 * Adblock Plus is distributed in the hope that it will be useful, |
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of | 10 * but WITHOUT ANY WARRANTY; without even the implied warranty of |
(...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
71 */ | 71 */ |
72 readFromFile: function(/**nsIFile*/ file, /**Object*/ listener, /**Function*/
callback) | 72 readFromFile: function(/**nsIFile*/ file, /**Object*/ listener, /**Function*/
callback) |
73 { | 73 { |
74 try | 74 try |
75 { | 75 { |
76 let processing = false; | 76 let processing = false; |
77 let buffer = ""; | 77 let buffer = ""; |
78 let loaded = false; | 78 let loaded = false; |
79 let error = null; | 79 let error = null; |
80 | 80 |
81 let onProgress = function(data) | 81 let onProgress = function*(data) |
82 { | 82 { |
83 let index = (processing ? -1 : Math.max(data.lastIndexOf("\n"), data.las
tIndexOf("\r"))); | 83 let index = (processing ? -1 : Math.max(data.lastIndexOf("\n"), data.las
tIndexOf("\r"))); |
84 if (index >= 0) | 84 if (index >= 0) |
85 { | 85 { |
86 // Protect against reentrance in case the listener processes events. | 86 // Protect against reentrance in case the listener processes events. |
87 processing = true; | 87 processing = true; |
88 try | 88 try |
89 { | 89 { |
90 let oldBuffer = buffer; | 90 let oldBuffer = buffer; |
91 buffer = data.substr(index + 1); | 91 buffer = data.substr(index + 1); |
92 data = data.substr(0, index + 1); | 92 data = data.substr(0, index + 1); |
93 let lines = data.split(/[\r\n]+/); | 93 let lines = data.split(/[\r\n]+/); |
94 lines.pop(); | 94 lines.pop(); |
95 lines[0] = oldBuffer + lines[0]; | 95 lines[0] = oldBuffer + lines[0]; |
96 for (let i = 0; i < lines.length; i++) | 96 for (let i = 0; i < lines.length; i++) |
97 listener.process(lines[i]); | 97 yield listener.process(lines[i]); |
98 } | 98 } |
99 finally | 99 finally |
100 { | 100 { |
101 processing = false; | 101 processing = false; |
102 data = buffer; | 102 data = buffer; |
103 buffer = ""; | 103 buffer = ""; |
104 onProgress(data); | 104 yield* onProgress(data); |
105 | 105 |
106 if (loaded) | 106 if (loaded) |
107 { | 107 { |
108 loaded = false; | 108 loaded = false; |
109 onSuccess(); | 109 onSuccess(); |
110 } | 110 } |
111 | 111 |
112 if (error) | 112 if (error) |
113 { | 113 { |
114 let param = error; | 114 let param = error; |
115 error = null; | 115 error = null; |
116 onError(param); | 116 onError(param); |
117 } | 117 } |
118 } | 118 } |
119 } | 119 } |
120 else | 120 else |
121 buffer += data; | 121 buffer += data; |
122 }; | 122 }; |
123 | 123 |
124 let onSuccess = function() | 124 let onSuccess = function() |
125 { | 125 { |
126 if (processing) | 126 if (processing) |
127 { | 127 { |
128 // Still processing data, delay processing this event. | 128 // Still processing data, delay processing this event. |
129 loaded = true; | 129 loaded = true; |
130 return; | 130 return; |
131 } | 131 } |
132 | 132 |
| 133 // We are ignoring return value of listener.process() here because |
| 134 // turning this callback into a generator would be complicated, and |
| 135 // delaying isn't really necessary for the last two calls. |
133 if (buffer !== "") | 136 if (buffer !== "") |
134 listener.process(buffer); | 137 listener.process(buffer); |
135 listener.process(null); | 138 listener.process(null); |
136 | 139 |
137 callback(null); | 140 callback(null); |
138 }; | 141 }; |
139 | 142 |
140 let onError = function(e) | 143 let onError = function(e) |
141 { | 144 { |
142 if (processing) | 145 if (processing) |
(...skipping 29 matching lines...) Expand all Loading... |
172 firstRead = false; | 175 firstRead = false; |
173 | 176 |
174 let f = yield OS.File.open(file.path, {read: true}); | 177 let f = yield OS.File.open(file.path, {read: true}); |
175 while (true) | 178 while (true) |
176 { | 179 { |
177 let array = yield f.read(BUFFER_SIZE); | 180 let array = yield f.read(BUFFER_SIZE); |
178 if (!array.length) | 181 if (!array.length) |
179 break; | 182 break; |
180 | 183 |
181 let data = decoder.decode(array, {stream: true}); | 184 let data = decoder.decode(array, {stream: true}); |
182 onProgress(data); | 185 yield* onProgress(data); |
183 } | 186 } |
184 yield f.close(); | 187 yield f.close(); |
185 }.bind(this)).then(onSuccess, onError); | 188 }.bind(this)).then(onSuccess, onError); |
186 } | 189 } |
187 catch (e) | 190 catch (e) |
188 { | 191 { |
189 callback(e); | 192 callback(e); |
190 } | 193 } |
191 }, | 194 }, |
192 | 195 |
(...skipping 130 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
323 else | 326 else |
324 callback(e); | 327 callback(e); |
325 }); | 328 }); |
326 } | 329 } |
327 catch(e) | 330 catch(e) |
328 { | 331 { |
329 callback(e); | 332 callback(e); |
330 } | 333 } |
331 } | 334 } |
332 } | 335 } |
OLD | NEW |