/*
* Copyright (c) 1998-2011 Caucho Technology -- all rights reserved
*
* This file is part of Resin(R) Open Source
*
* Each copy or derived work must preserve the copyright notice and this
* notice unmodified.
*
* Resin Open Source is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* Resin Open Source is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE, or any warranty
* of NON-INFRINGEMENT. See the GNU General Public License for more
* details.
*
* You should have received a copy of the GNU General Public License
* along with Resin Open Source; if not, write to the
* Free SoftwareFoundation, Inc.
* 59 Temple Place, Suite 330
* Boston, MA 02111-1307 USA
*
* @author Scott Ferguson
*/
package com.caucho.es;
import com.caucho.vfs.WriteStream;
import java.io.IOException;
/**
* JavaScript object
*/
class NativeFile extends Native {
static ESId IN = ESId.intern("in");
static ESId OUT = ESId.intern("out");
static final int WRITE = 2;
static final int WRITELN = 3;
static final int FLUSH = 4;
static final int CLOSE = 5;
private NativeFile(String name, int n, int len)
{
super(name, len);
this.n = n;
}
static void create(Global resin)
{
put(resin, "write", WRITE, 0, DONT_ENUM);
put(resin, "writeln", WRITELN, 0, DONT_ENUM);
put(resin, "flush", FLUSH, 0, DONT_ENUM);
put(resin, "close", CLOSE, 0, DONT_ENUM);
}
private static void put(Global resin, String name, int n, int len,
int flags)
{
ESId id = ESId.intern(name);
resin.addProperty(id, new NativeFile(name, n, len));
}
public ESBase call(Call eval, int length) throws Throwable
{
ESBase evalThis = eval.getArg(-1);
WriteStream stream = null;
try {
stream = (WriteStream) evalThis.toJavaObject();
} catch (Exception e) {
}
if (stream == null) {
ESBase out = evalThis.hasProperty(OUT);
if (out != null) {
eval.setThis(out);
return out.call(eval, length, id);
}
}
switch (n) {
case WRITE:
return write(eval, length);
case WRITELN:
return writeln(eval, length);
case FLUSH:
return flush(eval, length);
case CLOSE:
return close(eval, length);
default:
throw new ESException("Unknown file function");
}
}
private static WriteStream getWriteStream(Call eval) throws Throwable
{
ESBase evalThis = eval.getArg(-1);
WriteStream stream = null;
try {
stream = (WriteStream) evalThis.toJavaObject();
} catch (Exception e) {
}
if (stream != null)
return stream;
ESBase obj = evalThis.hasProperty(OUT);
try {
stream = (WriteStream) obj.toJavaObject();
} catch (Exception e) {
}
obj = Global.getGlobalProto().getGlobal().hasProperty(OUT);
try {
stream = (WriteStream) obj.toJavaObject();
} catch (Exception e) {
}
if (stream == null)
throw new ESException("expected file as `this' or as value of `" + OUT + "'");
return stream;
}
static public ESBase write(Call eval, int length) throws Throwable
{
WriteStream stream = getWriteStream(eval);
try {
for (int i = 0; i < length; i++)
stream.print(eval.getArg(i).toString());
} catch (IOException e) {
return ESBoolean.FALSE;
}
return eval.getArg(-1);
}
static public ESBase writeln(Call eval, int length) throws Throwable
{
WriteStream stream = getWriteStream(eval);
try {
for (int i = 0; i < length; i++)
stream.print(eval.getArg(i).toString());
stream.println();
} catch (IOException e) {
return ESBoolean.FALSE;
}
return eval.getArg(-1);
}
static public ESBase flush(Call eval, int length) throws Throwable
{
WriteStream stream = getWriteStream(eval);
try {
stream.flush();
} catch (IOException e) {
return ESBoolean.FALSE;
}
return eval.getArg(-1);
}
static public ESBase close(Call eval, int length) throws Throwable
{
WriteStream stream = getWriteStream(eval);
try {
stream.close();
} catch (IOException e) {
return ESBoolean.FALSE;
}
return eval.getArg(-1);
}
}