home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
PC World 2008 February
/
PCWorld_2008-02_cd.bin
/
temacd
/
songbird
/
Songbird_0.4_windows-i686.exe
/
xulrunner
/
components
/
nsScriptableIO.js
< prev
next >
Wrap
Text File
|
2007-07-25
|
13KB
|
378 lines
/* ***** BEGIN LICENSE BLOCK *****
* Version: MPL 1.1/GPL 2.0/LGPL 2.1
*
* The contents of this file are subject to the Mozilla Public License Version
* 1.1 (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
* http://www.mozilla.org/MPL/
*
* Software distributed under the License is distributed on an "AS IS" basis,
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
* for the specific language governing rights and limitations under the
* License.
*
* The Original Code is Scriptable IO.
*
* The Initial Developer of the Original Code is Mozilla Corporation.
* Portions created by the Initial Developer are Copyright (C) 2007
* the Initial Developer. All Rights Reserved.
*
* Contributor(s):
* Neil Deakin <enndeakin@sympatico.ca> (Original Author)
*
* Alternatively, the contents of this file may be used under the terms of
* either the GNU General Public License Version 2 or later (the "GPL"), or
* the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
* in which case the provisions of the GPL or the LGPL are applicable instead
* of those above. If you wish to allow use of your version of this file only
* under the terms of either the GPL or the LGPL, and not to allow others to
* use your version of this file under the terms of the MPL, indicate your
* decision by deleting the provisions above and replace them with the notice
* and other provisions required by the GPL or the LGPL. If you do not delete
* the provisions above, a recipient may use your version of this file under
* the terms of any one of the MPL, the GPL or the LGPL.
*
* ***** END LICENSE BLOCK ***** */
const SCRIPTABLEIO_CLASS_ID = Components.ID("1EDB3B94-0E2E-419A-8C2B-D9E232D41086");
const SCRIPTABLEIO_CLASS_NAME = "Scriptable IO";
const SCRIPTABLEIO_CONTRACT_ID = "@mozilla.org/io/scriptable-io;1";
const DEFAULT_BUFFER_SIZE = 1024;
const DEFAULT_PERMISSIONS = 0644;
const Cc = Components.classes;
const Ci = Components.interfaces;
var gScriptableIO = null;
// when using the directory service, map some extra keys that are
// easier to understand for common directories
var mappedDirKeys = {
Application: "resource:app",
Working: "CurWorkD",
Profile: "ProfD",
Desktop: "Desk",
Components: "ComsD",
Temp: "TmpD"
};
function ScriptableIO() {
}
ScriptableIO.prototype =
{
_wrapBaseWithInputStream : function ScriptableIO_wrapBaseWithInputStream
(base, modes, permissions)
{
var stream;
if (base instanceof Ci.nsIFile) {
var behaviour = 0;
if (modes["deleteonclose"])
behaviour |= Ci.nsIFileInputStream.DELETE_ON_CLOSE;
if (modes["closeoneof"])
behaviour |= Ci.nsIFileInputStream.CLOSE_ON_EOF;
if (modes["reopenonrewind"])
behaviour |= Ci.nsIFileInputStream.REOPEN_ON_REWIND;
stream = Cc["@mozilla.org/network/file-input-stream;1"].
createInstance(Ci.nsIFileInputStream);
stream.init(base, 1, permissions, behaviour);
}
else if (base instanceof Ci.nsITransport) {
var flags = modes["block"] ? Ci.nsITransport.OPEN_BLOCKING : 0;
stream = base.openInputStream(flags, buffersize, 0);
}
else if (base instanceof Ci.nsIInputStream) {
stream = base;
}
else if (typeof base == "string") {
stream = Cc["@mozilla.org/io/string-input-stream;1"].
createInstance(Ci.nsIStringInputStream);
stream.setData(base, base.length);
}
if (!stream)
throw "Cannot create input stream from base";
return stream;
},
_wrapBaseWithOutputStream : function ScriptableIO_wrapBaseWithOutputStream
(base, modes, permissions)
{
var stream;
if (base instanceof Ci.nsIFile) {
stream = Cc["@mozilla.org/network/file-output-stream;1"].
createInstance(Ci.nsIFileOutputStream);
// default for writing is 'write create truncate'
var modeFlags = 42;
if (modes["nocreate"])
modeFlags ^= 8;
if (modes["append"])
modeFlags |= 16;
if (modes["notruncate"])
modeFlags ^= 32;
if (modes["syncsave"])
modeFlags |= 64;
stream.init(base, modeFlags, permissions, 0);
}
else if (base instanceof Ci.nsITransport) {
var flags = modes["block"] ? Ci.nsITransport.OPEN_BLOCKING : 0;
stream = base.openOutputStream(flags, buffersize, 0);
}
else if (base instanceof Ci.nsIInputStream) {
stream = base;
}
if (!stream)
throw "Cannot create output stream from base";
return stream;
},
_openForReading : function ScriptableIO_openForReading
(base, modes, buffersize, charset, replchar)
{
var stream = base;
var charstream = null;
if (modes["text"]) {
if (!charset)
charset = "UTF-8";
if (!replchar)
replchar = Ci.nsIConverterInputStream.DEFAULT_REPLACEMENT_CHARACTER;
charstream = Cc["@mozilla.org/intl/converter-input-stream;1"].
createInstance(Ci.nsIConverterInputStream);
charstream.init(base, charset, buffersize, replchar);
}
else if (modes["buffered"]) {
stream = Cc["@mozilla.org/network/buffered-input-stream;1"].
createInstance(Ci.nsIBufferedInputStream);
stream.init(base, buffersize);
}
else if (modes["multi"]) {
stream = Cc["@mozilla.org/io/multiplex-input-stream;1"].
createInstance(Ci.nsIMultiplexInputStream);
stream.appendStream(base);
}
// wrap the stream in a scriptable stream
var sstream = Cc["@mozilla.org/scriptableinputstream;1"].createInstance();
sstream.initWithStreams(stream, charstream);
return sstream;
},
_openForWriting : function ScriptableIO_openForWriting
(base, modes, buffersize, charset, replchar)
{
var stream = base;
var charstream = null;
if (modes["text"]) {
if (!charset)
charset = "UTF-8";
if (!replchar)
replchar = Ci.nsIConverterInputStream.DEFAULT_REPLACEMENT_CHARACTER;
charstream = Cc["@mozilla.org/intl/converter-output-stream;1"].
createInstance(Ci.nsIConverterOutputStream);
charstream.init(base, charset, buffersize, replchar);
}
else if (modes["buffered"]) {
stream = Cc["@mozilla.org/network/buffered-output-stream;1"].
createInstance(Ci.nsIBufferedOutputStream);
stream.init(base, buffersize);
}
// wrap the stream in a scriptable stream
var sstream = Cc["@mozilla.org/scriptableoutputstream;1"].createInstance();
sstream.initWithStreams(stream, charstream);
return sstream;
},
getFile : function ScriptableIO_getFile(location, file)
{
if (!location)
throw Components.results.NS_ERROR_INVALID_ARG;
if (location in mappedDirKeys)
location = mappedDirKeys[location];
var ds = Cc["@mozilla.org/file/directory_service;1"].
getService(Ci.nsIProperties);
var fl = ds.get(location, Ci.nsILocalFile);
if (file)
fl.append(file);
return fl;
},
getFileWithPath : function ScriptableIO_getFileWithPath(filepath)
{
if (!filepath)
throw Components.results.NS_ERROR_INVALID_ARG;
// XXXndeakin not sure if setting persistentDescriptor is best here, but
// it's more useful than initWithPath, for instance, for preferences
var fl = Cc["@mozilla.org/file/local;1"].createInstance();
fl.persistentDescriptor = filepath;
return fl;
},
newURI : function ScriptableIO_newURI(uri)
{
if (!uri)
throw Components.results.NS_ERROR_INVALID_ARG;
var ios = Cc["@mozilla.org/network/io-service;1"].
getService(Ci.nsIIOService);
if (uri instanceof Ci.nsIFile)
return ios.newFileURI(uri);
return ios.newURI(uri, "", null);
},
newInputStream : function ScriptableIO_newInputStream
(base, mode, charset, replchar, buffersize)
{
return this._newStream(base, mode, charset, replchar, buffersize,
DEFAULT_PERMISSIONS, false);
},
newOutputStream : function ScriptableIO_newOutputStream
(base, mode, charset, replchar, buffersize, permissions)
{
return this._newStream(base, mode, charset, replchar, buffersize,
permissions, true);
},
_newStream : function ScriptableIO_newStream
(base, mode, charset, replchar, buffersize, permissions, iswrite)
{
if (!base)
throw Components.results.NS_ERROR_INVALID_ARG;
var modes = {};
var modeArr = mode.split(/\s+/);
for (var m = 0; m < modeArr.length; m++) {
modes[modeArr[m]] = true;
}
if (!buffersize)
buffersize = DEFAULT_BUFFER_SIZE;
var stream;
if (iswrite) {
base = this._wrapBaseWithOutputStream(base, modes, permissions);
stream = this._openForWriting(base, modes, buffersize, charset, replchar);
}
else {
base = this._wrapBaseWithInputStream(base, modes, permissions);
stream = this._openForReading(base, modes, buffersize, charset, replchar);
}
if (!stream)
throw "Cannot create stream from base";
return stream;
},
// nsIClassInfo
classDescription : "IO",
classID : SCRIPTABLEIO_CLASS_ID,
contractID : SCRIPTABLEIO_CONTRACT_ID,
flags : Ci.nsIClassInfo.SINGLETON,
implementationLanguage : Ci.nsIProgrammingLanguage.JAVASCRIPT,
getInterfaces : function ScriptableIO_getInterfaces(aCount) {
var interfaces = [Ci.nsIScriptableIO, Ci.nsIClassInfo];
aCount.value = interfaces.length;
return interfaces;
},
getHelperForLanguage : function ScriptableIO_getHelperForLanguage(aCount) {
return null;
},
QueryInterface: function ScriptableIO_QueryInterface(aIID) {
if (aIID.equals(Ci.nsIScriptableIO) ||
aIID.equals(Ci.nsIClassInfo) ||
aIID.equals(Ci.nsISupports))
return this;
throw Components.results.NS_ERROR_NO_INTERFACE;
}
}
var ScriptableIOFactory = {
QueryInterface: function ScriptableIOFactory_QueryInterface(iid)
{
if (iid.equals(Ci.nsIFactory) ||
iid.equals(Ci.nsISupports))
return this;
throw Cr.NS_ERROR_NO_INTERFACE;
},
createInstance: function ScriptableIOFactory_createInstance(aOuter, aIID)
{
if (aOuter != null)
throw Components.results.NS_ERROR_NO_AGGREGATION;
if (gScriptableIO == null)
gScriptableIO = new ScriptableIO();
return gScriptableIO.QueryInterface(aIID);
}
};
var ScriptableIOModule = {
QueryInterface: function ScriptableIOModule_QueryInterface(iid) {
if (iid.equals(Ci.nsIModule) ||
iid.equals(Ci.nsISupports))
return this;
throw Cr.NS_ERROR_NO_INTERFACE;
},
registerSelf: function ScriptableIOModule_registerSelf(aCompMgr, aFileSpec, aLocation, aType)
{
aCompMgr = aCompMgr.QueryInterface(Ci.nsIComponentRegistrar);
aCompMgr.registerFactoryLocation(SCRIPTABLEIO_CLASS_ID,
SCRIPTABLEIO_CLASS_NAME,
SCRIPTABLEIO_CONTRACT_ID,
aFileSpec, aLocation, aType);
var categoryManager = Cc["@mozilla.org/categorymanager;1"].
getService(Ci.nsICategoryManager);
categoryManager.addCategoryEntry("JavaScript global privileged property", "IO",
SCRIPTABLEIO_CONTRACT_ID, true, true);
},
unregisterSelf: function ScriptableIOModule_unregisterSelf(aCompMgr, aLocation, aType)
{
aCompMgr = aCompMgr.QueryInterface(Ci.nsIComponentRegistrar);
aCompMgr.unregisterFactoryLocation(SCRIPTABLEIO_CLASS_ID, aLocation);
var categoryManager = Cc["@mozilla.org/categorymanager;1"].
getService(Ci.nsICategoryManager);
categoryManager.deleteCategoryEntry("JavaScript global privileged property",
SCRIPTABLEIO_CONTRACT_ID, true);
},
getClassObject: function ScriptableIOModule_getClassObject(aCompMgr, aCID, aIID)
{
if (!aIID.equals(Ci.nsIFactory))
throw Components.results.NS_ERROR_NOT_IMPLEMENTED;
if (aCID.equals(SCRIPTABLEIO_CLASS_ID))
return ScriptableIOFactory;
throw Components.results.NS_ERROR_NO_INTERFACE;
},
canUnload: function ScriptableIOModule_canUnload(aCompMgr)
{
gScriptableIO = null;
return true;
}
};
function NSGetModule(aCompMgr, aFileSpec) { return ScriptableIOModule; }