Index: lib/io.js |
=================================================================== |
--- a/lib/io.js |
+++ b/lib/io.js |
@@ -54,96 +54,92 @@ let IO = exports.IO = |
* Reads strings from a file asynchronously, calls listener.process() with |
* each line read and with a null parameter once the read operation is done. |
* The callback will be called when the operation is done. |
*/ |
readFromFile: function(/**nsIFile|nsIURI*/ file, /**Boolean*/ decode, /**Object*/ listener, /**Function*/ callback, /**String*/ timeLineID) |
{ |
try |
{ |
+ let buffer = ""; |
let uri = file instanceof Ci.nsIFile ? Services.io.newFileURI(file) : file; |
- let channel = Services.io.newChannelFromURI(uri); |
- channel.contentType = "text/plain"; |
- let converter = null; |
- if (decode) |
+ let request = Cc["@mozilla.org/xmlextras/xmlhttprequest;1"].createInstance(Ci.nsIXMLHttpRequest); |
+ request.open("GET", uri.spec); |
+ request.mozBackgroundRequest = true; |
+ request.responseType = "moz-chunked-text"; |
+ request.overrideMimeType("text/plain" + (decode ? "? charset=utf-8" : "")); |
+ |
+ request.addEventListener("progress", function(event) |
{ |
- converter = Cc["@mozilla.org/intl/scriptableunicodeconverter"].createInstance(Ci.nsIScriptableUnicodeConverter); |
- converter.charset = "utf-8"; |
- } |
+ if (timeLineID) |
+ { |
+ TimeLine.asyncStart(timeLineID); |
+ } |
- channel.asyncOpen({ |
- buffer: "", |
- QueryInterface: XPCOMUtils.generateQI([Ci.nsIRequestObserver, Ci.nsIStreamListener]), |
- onStartRequest: function(request, context) {}, |
- onDataAvailable: function(request, context, stream, offset, count) |
+ let data = event.target.response; |
+ let index = Math.max(data.lastIndexOf("\n"), data.lastIndexOf("\r")); |
+ if (index >= 0) |
{ |
- if (timeLineID) |
- { |
- TimeLine.asyncStart(timeLineID); |
- } |
+ let oldBuffer = buffer; |
+ buffer = data.substr(index + 1); |
+ data = data.substr(0, index + 1); |
Felix Dahlke
2012/10/30 17:40:06
Nit: You're doing "index + 1" twice, might be wort
|
+ let lines = data.split(/[\r\n]+/); |
+ lines.pop(); |
+ lines[0] = oldBuffer + lines[0]; |
+ for (let i = 0; i < lines.length; i++) |
+ listener.process(lines[i]); |
+ } |
+ else |
+ buffer += data; |
- let inputStream = Cc["@mozilla.org/scriptableinputstream;1"].createInstance(Ci.nsIScriptableInputStream); |
- inputStream.init(stream); |
+ if (timeLineID) |
+ { |
+ TimeLine.asyncEnd(timeLineID); |
+ } |
+ }, false); |
- let data = this.buffer + inputStream.readBytes(count); |
- let index = Math.max(data.lastIndexOf("\n"), data.lastIndexOf("\r")); |
- if (index >= 0) |
- { |
- this.buffer = data.substr(index + 1); |
- data = data.substr(0, index + 1); |
- if (converter) |
- data = converter.ConvertToUnicode(data); |
+ request.addEventListener("load", function(event) |
+ { |
+ if (timeLineID) |
+ { |
+ TimeLine.asyncStart(timeLineID); |
+ } |
- let lines = data.split(/[\r\n]+/); |
- lines.pop(); |
- for (let i = 0; i < lines.length; i++) |
- listener.process(lines[i]); |
- } |
- else |
- this.buffer = data; |
+ if (buffer !== "") |
+ listener.process(buffer); |
+ listener.process(null); |
- if (timeLineID) |
- { |
- TimeLine.asyncEnd(timeLineID); |
- } |
- }, |
- onStopRequest: function(request, context, result) |
+ if (timeLineID) |
{ |
- if (timeLineID) |
- { |
- TimeLine.asyncStart(timeLineID); |
- } |
+ TimeLine.asyncEnd(timeLineID); |
+ TimeLine.asyncDone(timeLineID); |
+ } |
- if (Components.isSuccessCode(result) && this.buffer.length) |
- listener.process(this.buffer); |
- listener.process(null); |
+ callback(null); |
+ }, false); |
- if (timeLineID) |
- { |
- TimeLine.asyncEnd(timeLineID); |
- TimeLine.asyncDone(timeLineID); |
- } |
+ request.addEventListener("error", function() |
+ { |
+ let e = Cc["@mozilla.org/js/xpc/Exception;1"].createInstance(Ci.nsIXPCException); |
+ e.initialize("File read operation failed", result, null, Components.stack, file, null); |
+ callback(e); |
- if (!Components.isSuccessCode(result)) |
- { |
- let e = Cc["@mozilla.org/js/xpc/Exception;1"].createInstance(Ci.nsIXPCException); |
- e.initialize("File read operation failed", result, null, Components.stack, file, null); |
- callback(e); |
- } |
- else |
- callback(null); |
+ if (timeLineID) |
+ { |
+ TimeLine.asyncDone(timeLineID); |
} |
- }, null); |
+ }, false); |
+ |
+ request.send(null); |
} |
catch (e) |
{ |
callback(e); |
} |
}, |
- |
/** |
* Writes string data to a file asynchronously, optionally encodes it into |
* UTF-8 first. The callback will be called when the write operation is done. |
*/ |
writeToFile: function(/**nsIFile*/ file, /**Boolean*/ encode, /**Iterator*/ data, /**Function*/ callback, /**String*/ timeLineID) |
{ |
try |
{ |