      1 /**
      2  *  ---------
      3  * |.##> <##.|  Open Smart Card Development Platform (www.openscdp.org)
      4  * |#       #|
      5  * |#       #|  Copyright (c) 1999-2006 CardContact Software & System Consulting
      6  * |'##> <##'|  Andreas Schwier, 32429 Minden, Germany (www.cardcontact.de)
      7  *  ---------
      8  *
      9  *  This file is part of OpenSCDP.
     10  *
     11  *  OpenSCDP is free software; you can redistribute it and/or modify
     12  *  it under the terms of the GNU General Public License version 2 as
     13  *  published by the Free Software Foundation.
     14  *
     15  *  OpenSCDP is distributed in the hope that it will be useful,
     16  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
     17  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
     18  *  GNU General Public License for more details.
     19  *
     20  *  You should have received a copy of the GNU General Public License
     21  *  along with OpenSCDP; if not, write to the Free Software
     22  *  Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
     23  *
     24  * @fileoverview General File I/O Class
     25  */
     26
     27
     28
     29 /**
     30  * Create a reference to a file system object (file or directory)
     31  *
     32  * @class Class implementing basic support for files
     33  * @constructor
     34  * @param {String} name relative or absolute file path
     35  * @param {Number} location one of GPSystem.CWD, GPSystem.USR, GPSystem.SYS, GPSystem.AUTO to resolve relative names. Default GPSystem.CWD
     36  */
     37 function File(name, location) {
     38 	this.name = name;
     39 	this.location = location;
     40 }
     41
     42 exports.File = File;
     43
     44
     45
     46 /**
     47  * Return absolute path
     48  *
     49  * @param{Number} mode one of GPSystem.AUTO, GPSystem.CWD, GPSystem.USR or GPSystem.SYS. See GPSystem.mapFilename() for details
     50  * @type String
     51  * @return the absolute path
     52  */
     53 File.prototype.getAbsolutePath = function(mode) {
     54 	if (typeof(mode) == "undefined") {
     55 		if (typeof(this.location) == "undefined") {
     56 			mode = GPSystem.AUTO;
     57 		} else {
     58 			mode = this.location;
     59 		}
     60 	}
     61
     62 	var path = GPSystem.mapFilename(this.name, mode);
     63 	if (path == null) {
     64 		return undefined;
     65 	}
     66 	return path;
     67 }
     68
     69
     70
     71 /**
     72  * @private
     73  * Return a java.io.File object
     74  */
     75 File.prototype.getFile = function() {
     76 	if (typeof(this.file) == "undefined") {
     77 		var path = this.getAbsolutePath();
     78 		if (path) {
     79 			this.file = new java.io.File(path);
     80 		}
     81 	}
     82 	return this.file;
     83 }
     84
     85
     86
     87 /**
     88  * Return true if file exists
     89  */
     90 File.prototype.exists = function() {
     91 	var f = this.getFile();
     92
     93 	if (!f) {
     94 		return false;
     95 	}
     96 	return f.exists();
     97 }
     98
     99
    100
    101 /**
    102  * Close streams associated with file
    103  */
    104 File.prototype.close = function() {
    105 	if (typeof(this.os) != "undefined") {
    106 		this.os.close();
    107 		delete(this.os);
    108 	}
    109
    110 	if (typeof(this.is) != "undefined") {
    111 		this.is.close();
    112 		delete(this.is);
    113 	}
    114 }
    115
    116
    117
    118 /**
    119  * @private
    120  * Return a java.io.FileInputStream
    121  */
    122 File.prototype.getInputStream = function() {
    123 	if (typeof(this.is) == "undefined") {
    124 		var path = this.getAbsolutePath();
    125 		if (!path) {
    126 			throw new GPError(module.id, GPError.OBJECT_NOT_FOUND, 0, "File " + this.name + " not found");
    127 		}
    128 		this.is = new java.io.FileInputStream(path);
    129 	}
    130 	return this.is;
    131 }
    132
    133
    134
    135 /**
    136  * @private
    137  * Return a java.io.FileOutputStream
    138  */
    139 File.prototype.getOutputStream = function() {
    140 	if (typeof(this.os) == "undefined") {
    141 		var path = this.getAbsolutePath();
    142 		if (!path) {
    143 			throw new GPError(module.id, GPError.OBJECT_NOT_FOUND, 0, "File " + this.name + " not found");
    144 		}
    145 		this.os = new java.io.FileOutputStream(path);
    146 	}
    147 	return this.os;
    148 }
    149
    150
    151
    152 /**
    153  * Read complete file into ByteString object
    154  *
    155  * @type ByteString
    156  * @return the binary content
    157  */
    158 File.prototype.readAllAsBinary = function() {
    159 	var is = this.getInputStream();
    160
    161 	// Determine file size
    162 	var flen = is.available();
    163
    164 	// Allocate native byte array
    165 	var bs = java.lang.reflect.Array.newInstance(java.lang.Byte.TYPE, flen);
    166
    167 	// Read into byte array
    168 	var len = is.read(bs);
    169
    170 	this.close();
    171
    172 	// Allocate JavaScript ByteBuffer from native/wrapped byte array
    173 	var bb = new ByteBuffer(bs);
    174
    175 	// Convert to JavaScript ByteString
    176 	var data = bb.toByteString();
    177
    178 	return data;
    179 }
    180
    181
    182
    183 /**
    184  * Read complete file into String object
    185  *
    186  * @type String
    187  * @return the text content
    188  */
    189 File.prototype.readAllAsString = function(encoding) {
    190
    191 	if (typeof(encoding) == "undefined") {
    192 		encoding = UTF8;
    193 	}
    194
    195 	return this.readAllAsBinary().toString(encoding);
    196 }
    197
    198
    199
    200 /**
    201  * Write the object to file
    202  *
    203  * @param{Object} obj to write to file (Using toString() for any other than String and ByteString)
    204  * @param{Number} one of UTF8 or ASCII (Default is UTF8)
    205  */
    206 File.prototype.writeAll = function(obj, encoding) {
    207 	if ((typeof(obj) != "string") && !(obj instanceof ByteString)) {
    208 		obj = obj.toString();
    209 	}
    210 	if (typeof(obj) == "string") {
    211 		if (typeof(encoding) == "undefined") {
    212 			encoding = UTF8;
    213 		}
    214 		obj = new ByteString(obj, encoding);
    215 	}
    216
    217 	var os = this.getOutputStream();
    218 	os.write(obj);
    219 	this.close();
    220 }
    221
    222
    223
    224 /**
    225  * Return list of files contained in the directory referenced by the File object
    226  *
    227  * @type String[]
    228  * @return the list of file names
    229  */
    230 File.prototype.list = function() {
    231 	var list = this.getFile().list();
    232 	var jslist = [];
    233
    234 	if (list) {
    235 		for (var i = 0; i < list.length; i++) {
    236 			jslist.push(new String(list[i]));
    237 		}
    238 	}
    239
    240 	return jslist;
    241 }
    242
    243
    244
    245 /**
    246  * Return the parent file of this file object
    247  *
    248  * @type File
    249  * @return the parent file object or null
    250  */
    251 File.prototype.getParentFile = function() {
    252 	var file = this.getFile();
    253 	var parent = file.getParent();
    254 	if (parent == null) {
    255 		return null;
    256 	}
    257 	return new File(parent);
    258 }
    259
    260
    261
    262 File.test = function() {
    263 	var file = new File("test.bin");
    264 	var b = new ByteString("Hello World", ASCII);
    265 	file.writeAll(b);
    266
    267 	var file = new File("test.bin");
    268 	var c = file.readAllAsBinary();
    269 	print(c.toString(ASCII));
    270
    271 	var file = new File("test.txt");
    272 	var s = "Hello World";
    273 	file.writeAll(s);
    274
    275 	var file = new File("test.txt");
    276 	var c = file.readAllAsString();
    277 	print(c);
    278
    279 	var dir = file.getParentFile();
    280 	print(dir.getAbsolutePath());
    281 	print(dir.list());
    282
    283 }
    284