2 * (C) Copyright 2004 Shawn Betts
3 * (C) Copyright 2007-2008 Jeremy Maitin-Shepard
5 * Portions of this file were derived from the Venkman JavaScript debugger,
6 * (C) Copyright 1998 Netscape Communications Corporation.
8 * Use, modification, and distribution are subject to the terms specified in the
12 const PERM_IWOTH
= parseInt("00002", 8); /* write permission, others */
13 const PERM_IWGRP
= parseInt("00020", 8); /* write permission, group */
15 const MODE_RDONLY
= 0x01;
16 const MODE_WRONLY
= 0x02;
17 const MODE_RDWR
= 0x04;
18 const MODE_CREATE
= 0x08;
19 const MODE_APPEND
= 0x10;
20 const MODE_TRUNCATE
= 0x20;
21 const MODE_SYNC
= 0x40;
22 const MODE_EXCL
= 0x80;
23 const MODE_OUTPUT
= MODE_WRONLY
| MODE_CREATE
| MODE_TRUNCATE
;
24 const MODE_OUTPUT_APPEND
= MODE_WRONLY
| MODE_CREATE
| MODE_APPEND
;
25 const MODE_INPUT
= MODE_RDONLY
;
27 define_keywords("$charset");
28 function read_text_file(file
)
30 keywords(arguments
, $charset
= "UTF-8");
32 var ifstream
= null, icstream
= null;
35 ifstream
= Cc
["@mozilla.org/network/file-input-stream;1"].createInstance(Ci
.nsIFileInputStream
);
36 icstream
= Cc
["@mozilla.org/intl/converter-input-stream;1"].createInstance(Ci
.nsIConverterInputStream
);
38 ifstream
.init(file
, -1, 0, 0);
39 const replacementChar
= Ci
.nsIConverterInputStream
.DEFAULT_REPLACEMENT_CHARACTER
;
40 icstream
.init(ifstream
, arguments
.$charset
, 4096, replacementChar
); // 4096 bytes buffering
44 while (icstream
.readString(4096, str
) != 0)
55 define_keywords("$mode", "$perms", "$charset");
56 function write_text_file(file
, buf
)
58 keywords(arguments
, $charset
= "UTF-8", $perms
= parseInt("0644", 8), $mode
= MODE_WRONLY
| MODE_CREATE
| MODE_TRUNCATE
);
60 var ofstream
, ocstream
;
62 ofstream
= Cc
["@mozilla.org/network/file-output-stream;1"].createInstance(Ci
.nsIFileOutputStream
);
63 ocstream
= Cc
["@mozilla.org/intl/converter-output-stream;1"].createInstance(Ci
.nsIConverterOutputStream
);
65 ofstream
.init(file
, arguments
.$mode
, arguments
.$perms
, 0);
66 ocstream
.init(ofstream
, arguments
.$charset
, 0, 0x0000);
67 ocstream
.writeString(buf
);
76 define_keywords("$mode", "$perms");
77 function write_binary_file(file
, buf
)
79 keywords(arguments
, $perms
= parseInt("0644", 8), $mode
= MODE_WRONLY
| MODE_CREATE
| MODE_TRUNCATE
);
80 var stream
= null, bstream
= null;
83 stream
= Cc
["@mozilla.org/network/file-output-stream;1"].createInstance(Ci
.nsIFileOutputStream
);
84 stream
.init(file
, arguments
.$mode
, arguments
.$perms
, 0);
86 bstream
= binary_output_stream(stream
);
87 bstream
.writeBytes(buf
, buf
.length
);
96 var thread_manager
= Cc
["@mozilla.org/thread-manager;1"].getService(Ci
.nsIThreadManager
);
98 function input_stream_async_wait(stream
, callback
, requested_count
) {
99 stream
= stream
.QueryInterface(Ci
.nsIAsyncInputStream
);
100 var flags
= (requested_count
=== false) ? Ci
.nsIAsyncInputStream
.WAIT_CLOSURE_ONLY
: 0;
101 if (requested_count
== null || requested_count
== false)
103 stream
.asyncWait({onInputStreamReady
: callback
}, flags
, requested_count
, thread_manager
.mainThread
);
106 function output_stream_async_wait(stream
, callback
, requested_count
) {
107 stream
= stream
.QueryInterface(Ci
.nsIAsyncOutputStream
);
108 var flags
= (requested_count
=== false) ? Ci
.nsIAsyncOutputStream
.WAIT_CLOSURE_ONLY
: 0;
109 if (requested_count
== null || requested_count
== false)
111 stream
.asyncWait({onOutputStreamReady
: callback
}, flags
, requested_count
, thread_manager
.mainThread
);
114 function binary_output_stream(stream
) {
115 var s
= Cc
["@mozilla.org/binaryoutputstream;1"].createInstance(Ci
.nsIBinaryOutputStream
);
116 s
.setOutputStream(stream
);
120 function binary_input_stream(stream
) {
121 var s
= Cc
["@mozilla.org/binaryinputstream;1"].createInstance(Ci
.nsIBinaryInputStream
);
122 s
.setInputStream(stream
);
126 // callback is called with null if the write succeeded, and an error otherwise
127 function async_binary_write(stream
, data
, callback
) {
129 function attempt_write() {
132 if (data
.length
== 0) {
134 if (callback
!= null)
138 var len
= stream
.write(data
, data
.length
);
141 data
= data
.substring(len
);
144 catch (e
if (e
instanceof Components
.Exception
) && e
.result
== Cr
.NS_BASE_STREAM_WOULD_BLOCK
) {}
146 if (callback
!= null)
150 output_stream_async_wait(stream
, attempt_write
, data
.length
);
156 * The `str' parameter should be a normal JavaScript string whose char codes specify Unicode code points.
157 * The return value is a byte string (all char codes are from 0 to 255) equal to the `str' encoded in the specified charset.
158 * If charset is not specified, it defaults to UTF-8.
160 function encode_string(str
, charset
) {
161 var converter
= Cc
["@mozilla.org/intl/scriptableunicodeconverter"].createInstance(Ci
.nsIScriptableUnicodeConverter
);
162 converter
.charset
= charset
|| "UTF-8";
163 var output
= converter
.ConvertFromUnicode(str
);
164 output
+= converter
.Finish();
171 * The `bstr' parameter should be a byte string (all char codes are from 0 to 255).
172 * The return value is a normal JavaScript unicode sring equal to `bstr' decoded using the specified charset.
173 * If charset is not specified, it defaults to UTF-8.
175 function decode_string(bstr
, charset
) {
176 var converter
= Cc
["@mozilla.org/intl/scriptableunicodeconverter"].createInstance(Ci
.nsIScriptableUnicodeConverter
);
177 converter
.charset
= charset
|| "UTF-8";
178 return converter
.ConvertToUnicode(bstr
);
181 /* Calls callback when the write has completed. If callback is null,
182 the stream is closed when the write completes. */
183 function async_binary_string_writer(bstr
, callback
) {
184 return function (stream
) {
185 function modified_callback (e
) {
186 if (callback
== null) {
192 async_binary_write(stream
, bstr
, modified_callback
);
196 function async_binary_reader(callback
) {
197 return function (stream
) {
198 var bstream
= binary_input_stream(stream
);
201 let avail
= stream
.available();
203 callback(bstream
.readBytes(avail
));
205 input_stream_async_wait(stream
, handler
);
210 input_stream_async_wait(stream
, handler
);
214 function string_input_stream(data
) {
215 var string_stream
= Cc
["@mozilla.org/io/string-input-stream;1"].createInstance(Ci
.nsIStringInputStream
);
216 string_stream
.data
= data
;
217 return string_stream
;
220 function mime_input_stream(stream
, headers
) {
221 var mime_stream
= Cc
["@mozilla.org/network/mime-input-stream;1"].createInstance(Ci
.nsIMIMEInputStream
);
223 for each (let [name
,value
] in headers
) {
224 mime_stream
.addHeader(name
,value
);
227 mime_stream
.addContentLength
= true;
228 mime_stream
.setData(stream
);