mirror of
https://github.com/gryf/pentadactyl-pm.git
synced 2025-12-21 19:47:59 +01:00
175 lines
5.2 KiB
JavaScript
175 lines
5.2 KiB
JavaScript
/***** 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.
|
|
|
|
(c) 2006-2007: Martin Stubenschrott <stubenschrott@gmx.net>
|
|
Code based on venkman
|
|
|
|
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 PERM_IWOTH = 00002; /* write permission, others */
|
|
const PERM_IWGRP = 00020; /* write permission, group */
|
|
|
|
const MODE_RDONLY = 0x01;
|
|
const MODE_WRONLY = 0x02;
|
|
const MODE_RDWR = 0x04;
|
|
const MODE_CREATE = 0x08;
|
|
const MODE_APPEND = 0x10;
|
|
const MODE_TRUNCATE = 0x20;
|
|
const MODE_SYNC = 0x40;
|
|
const MODE_EXCL = 0x80;
|
|
|
|
|
|
function LocalFile(file, mode, perms, tmp) // {{{
|
|
{
|
|
const classes = Components.classes;
|
|
const interfaces = Components.interfaces;
|
|
|
|
const LOCALFILE_CTRID = "@mozilla.org/file/local;1";
|
|
const FILEIN_CTRID = "@mozilla.org/network/file-input-stream;1";
|
|
const FILEOUT_CTRID = "@mozilla.org/network/file-output-stream;1";
|
|
const SCRIPTSTREAM_CTRID = "@mozilla.org/scriptableinputstream;1";
|
|
|
|
const nsIFile = interfaces.nsIFile;
|
|
const nsILocalFile = interfaces.nsILocalFile;
|
|
const nsIFileOutputStream = interfaces.nsIFileOutputStream;
|
|
const nsIFileInputStream = interfaces.nsIFileInputStream;
|
|
const nsIScriptableInputStream = interfaces.nsIScriptableInputStream;
|
|
|
|
if (typeof perms == "undefined")
|
|
perms = 0666 & ~(PERM_IWOTH | PERM_IWGRP);
|
|
|
|
if (typeof mode == "string")
|
|
{
|
|
switch (mode)
|
|
{
|
|
case ">":
|
|
mode = MODE_WRONLY | MODE_CREATE | MODE_TRUNCATE;
|
|
break;
|
|
case ">>":
|
|
mode = MODE_WRONLY | MODE_CREATE | MODE_APPEND;
|
|
break;
|
|
case "<":
|
|
mode = MODE_RDONLY;
|
|
break;
|
|
default:
|
|
throw "Invalid mode ``" + mode + "''";
|
|
}
|
|
}
|
|
|
|
if (typeof file == "string")
|
|
{
|
|
this.localFile = classes[LOCALFILE_CTRID].createInstance(nsILocalFile);
|
|
this.localFile.initWithPath(file);
|
|
if (!this.localFile.exists())
|
|
throw "No such file or directory";
|
|
}
|
|
else if (file instanceof nsILocalFile)
|
|
{
|
|
this.localFile = file;
|
|
if (!this.localFile.exists())
|
|
throw "No such file or directory";
|
|
}
|
|
else
|
|
{
|
|
throw "bad type for argument |file|.";
|
|
}
|
|
|
|
this.path = this.localFile.path;
|
|
|
|
if (mode & (MODE_WRONLY | MODE_RDWR))
|
|
{
|
|
this.outputStream =
|
|
classes[FILEOUT_CTRID].createInstance(nsIFileOutputStream);
|
|
this.outputStream.init(this.localFile, mode, perms, 0);
|
|
}
|
|
|
|
if (mode & (MODE_RDONLY | MODE_RDWR))
|
|
{
|
|
var is = classes[FILEIN_CTRID].createInstance(nsIFileInputStream);
|
|
is.init(this.localFile, mode, perms, tmp);
|
|
this.inputStream =
|
|
classes[SCRIPTSTREAM_CTRID].createInstance(nsIScriptableInputStream);
|
|
this.inputStream.init(is);
|
|
}
|
|
}
|
|
|
|
|
|
LocalFile.prototype.write =
|
|
function fo_write(buf)
|
|
{
|
|
if (!("outputStream" in this))
|
|
throw "file not open for writing.";
|
|
|
|
return this.outputStream.write(buf, buf.length);
|
|
}
|
|
|
|
LocalFile.prototype.read =
|
|
function fo_read(max)
|
|
{
|
|
if (this.localFile.isDirectory())
|
|
{
|
|
var entries = this.localFile.directoryEntries;
|
|
var array = [];
|
|
while (entries.hasMoreElements())
|
|
{
|
|
var entry = entries.getNext();
|
|
entry.QueryInterface(Components.interfaces.nsIFile);
|
|
array.push(entry);
|
|
}
|
|
return array;
|
|
}
|
|
|
|
if (!("inputStream" in this))
|
|
throw "file not open for reading.";
|
|
|
|
var av = this.inputStream.available();
|
|
if (typeof max == "undefined")
|
|
max = av;
|
|
|
|
if (!av)
|
|
return null;
|
|
|
|
var rv = this.inputStream.read(max);
|
|
return rv;
|
|
}
|
|
|
|
LocalFile.prototype.close =
|
|
function fo_close()
|
|
{
|
|
if ("outputStream" in this)
|
|
this.outputStream.close();
|
|
if ("inputStream" in this)
|
|
this.inputStream.close();
|
|
}
|
|
|
|
LocalFile.prototype.flush =
|
|
function fo_close()
|
|
{
|
|
return this.outputStream.flush();
|
|
}
|
|
//}}}
|
|
|
|
// vim: set fdm=marker sw=4 ts=4 et:
|