changeset 125:0cd559a16758

add sockets git-svn-id: https://luan-java.googlecode.com/svn/trunk@126 21e917c8-12df-6dd8-5cb6-c86387c605b9
author fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
date Fri, 06 Jun 2014 05:59:11 +0000
parents f537ff5e511d
children 0149bdf98fd8
files src/luan/lib/BasicLib.java src/luan/lib/IoLib.java src/luan/lib/PackageLib.java src/luan/lib/Utils.java
diffstat 4 files changed, 187 insertions(+), 201 deletions(-) [+]
line wrap: on
line diff
diff -r f537ff5e511d -r 0cd559a16758 src/luan/lib/BasicLib.java
--- a/src/luan/lib/BasicLib.java	Fri Jun 06 03:41:04 2014 +0000
+++ b/src/luan/lib/BasicLib.java	Fri Jun 06 05:59:11 2014 +0000
@@ -92,7 +92,7 @@
 
 	public static LuanFunction load_file(LuanState luan,String fileName) throws LuanException {
 		try {
-			String src = fileName==null ? Utils.readAll(new InputStreamReader(System.in)) : Utils.read(new File(fileName));
+			String src = fileName==null ? Utils.readAll(new InputStreamReader(System.in)) : new IoLib.LuanFile(fileName).read_text();
 			return load(luan,src,fileName,false);
 		} catch(IOException e) {
 			throw luan.JAVA.exception(e);
diff -r f537ff5e511d -r 0cd559a16758 src/luan/lib/IoLib.java
--- a/src/luan/lib/IoLib.java	Fri Jun 06 03:41:04 2014 +0000
+++ b/src/luan/lib/IoLib.java	Fri Jun 06 05:59:11 2014 +0000
@@ -8,12 +8,18 @@
 import java.io.FileReader;
 import java.io.FileWriter;
 import java.io.BufferedReader;
+import java.io.BufferedWriter;
+import java.io.BufferedOutputStream;
 import java.io.File;
 import java.io.FileInputStream;
 import java.io.FileOutputStream;
 import java.io.InputStreamReader;
+import java.io.OutputStreamWriter;
+import java.io.ByteArrayInputStream;
 import java.io.IOException;
 import java.net.URL;
+import java.net.Socket;
+import java.net.ServerSocket;
 import java.net.MalformedURLException;
 import luan.LuanState;
 import luan.LuanTable;
@@ -52,6 +58,9 @@
 					IoLib.class.getMethod( "stdin_read_blocks", Integer.class ), null
 				) );
 				module.put( "stdin", stdin );
+
+				add( module, "socket", String.class, Integer.TYPE );
+				add( module, "socket_server", Integer.TYPE );
 			} catch(NoSuchMethodException e) {
 				throw new RuntimeException(e);
 			}
@@ -65,139 +74,6 @@
 		t.put( method, new LuanJavaFunction(IoLib.class.getMethod(method,parameterTypes),null) );
 	}
 
-	public static final class LuanFile {
-		private final File file;
-
-		private LuanFile(String name) {
-			this.file = new File(name);
-		}
-
-		public String read_text() throws IOException {
-			return Utils.read(file);
-		}
-
-		public byte[] read_binary() throws IOException {
-			return Utils.readAll(file);
-		}
-
-		public void write(LuanState luan,Object obj) throws LuanException, IOException {
-			if( obj instanceof String ) {
-				String s = (String)obj;
-				Utils.write(file,s);
-				return;
-			}
-			if( obj instanceof byte[] ) {
-				byte[] a = (byte[])obj;
-				Utils.writeAll(file,a);
-				return;
-			}
-			throw luan.JAVA.exception( "bad argument #1 to 'write' (string or binary expected)" );
-		}
-
-		public LuanTable text_writer() throws IOException {
-			return textWriter(new FileWriter(file));
-		}
-
-		public LuanTable binary_writer() throws IOException {
-			return binaryWriter(new FileOutputStream(file));
-		}
-
-		public LuanFunction read_lines() throws IOException {
-			return lines(new BufferedReader(new FileReader(file)));
-		}
-
-		public LuanFunction read_blocks(Integer blockSize) throws IOException {
-			int n = blockSize!=null ? blockSize : Utils.bufSize;
-			return blocks(new FileInputStream(file),n);
-		}
-	}
-
-	public static LuanTable file(String name) {
-		LuanTable tbl = new LuanTable();
-		LuanFile file = new LuanFile(name);
-		try {
-			tbl.put( "read_text", new LuanJavaFunction(
-				LuanFile.class.getMethod( "read_text" ), file
-			) );
-			tbl.put( "read_binary", new LuanJavaFunction(
-				LuanFile.class.getMethod( "read_binary" ), file
-			) );
-			tbl.put( "write", new LuanJavaFunction(
-				LuanFile.class.getMethod( "write", LuanState.class, Object.class ), file
-			) );
-			tbl.put( "text_writer", new LuanJavaFunction(
-				LuanFile.class.getMethod( "text_writer" ), file
-			) );
-			tbl.put( "binary_writer", new LuanJavaFunction(
-				LuanFile.class.getMethod( "binary_writer" ), file
-			) );
-			tbl.put( "read_lines", new LuanJavaFunction(
-				LuanFile.class.getMethod( "read_lines" ), file
-			) );
-			tbl.put( "read_blocks", new LuanJavaFunction(
-				LuanFile.class.getMethod( "read_blocks", Integer.class ), file
-			) );
-		} catch(NoSuchMethodException e) {
-			throw new RuntimeException(e);
-		}
-		return tbl;
-	}
-
-
-	public static final class LuanUrl {
-		private final URL url;
-
-		LuanUrl(String s) throws MalformedURLException {
-			this.url = new URL(s);
-		}
-
-		public String read_text() throws IOException {
-			Reader in = new InputStreamReader(url.openStream());
-			String s = Utils.readAll(in);
-			in.close();
-			return s;
-		}
-
-		public byte[] read_binary() throws IOException {
-			InputStream in = url.openStream();
-			byte[] a = Utils.readAll(in);
-			in.close();
-			return a;
-		}
-
-		public LuanFunction read_lines() throws IOException {
-			return lines(new BufferedReader(new InputStreamReader(url.openStream())));
-		}
-
-		public LuanFunction read_blocks(Integer blockSize) throws IOException {
-			int n = blockSize!=null ? blockSize : Utils.bufSize;
-			return blocks(url.openStream(),n);
-		}
-	}
-
-	public static LuanTable url(String s) throws MalformedURLException {
-		LuanTable tbl = new LuanTable();
-		LuanUrl url = new LuanUrl(s);
-		try {
-			tbl.put( "read_text", new LuanJavaFunction(
-				LuanUrl.class.getMethod( "read_text" ), url
-			) );
-			tbl.put( "read_binary", new LuanJavaFunction(
-				LuanUrl.class.getMethod( "read_binary" ), url
-			) );
-			tbl.put( "read_lines", new LuanJavaFunction(
-				LuanUrl.class.getMethod( "read_lines" ), url
-			) );
-			tbl.put( "read_blocks", new LuanJavaFunction(
-				LuanUrl.class.getMethod( "read_blocks", Integer.class ), url
-			) );
-		} catch(NoSuchMethodException e) {
-			throw new RuntimeException(e);
-		}
-		return tbl;
-	}
-
-
 
 	public static String stdin_read_text() throws IOException {
 		return Utils.readAll(new InputStreamReader(System.in));
@@ -345,4 +221,180 @@
 		};
 	}
 
+
+
+	public static abstract class LuanIn {
+		abstract InputStream inputStream() throws IOException;
+
+		public String read_text() throws IOException {
+			Reader in = new InputStreamReader(inputStream());
+			String s = Utils.readAll(in);
+			in.close();
+			return s;
+		}
+
+		public byte[] read_binary() throws IOException {
+			InputStream in = inputStream();
+			byte[] a = Utils.readAll(in);
+			in.close();
+			return a;
+		}
+
+		public LuanFunction read_lines() throws IOException {
+			return lines(new BufferedReader(new InputStreamReader(inputStream())));
+		}
+
+		public LuanFunction read_blocks(Integer blockSize) throws IOException {
+			int n = blockSize!=null ? blockSize : Utils.bufSize;
+			return blocks(inputStream(),n);
+		}
+
+		LuanTable table() {
+			LuanTable tbl = new LuanTable();
+			try {
+				tbl.put( "read_text", new LuanJavaFunction(
+					LuanIn.class.getMethod( "read_text" ), this
+				) );
+				tbl.put( "read_binary", new LuanJavaFunction(
+					LuanIn.class.getMethod( "read_binary" ), this
+				) );
+				tbl.put( "read_lines", new LuanJavaFunction(
+					LuanIn.class.getMethod( "read_lines" ), this
+				) );
+				tbl.put( "read_blocks", new LuanJavaFunction(
+					LuanIn.class.getMethod( "read_blocks", Integer.class ), this
+				) );
+			} catch(NoSuchMethodException e) {
+				throw new RuntimeException(e);
+			}
+			return tbl;
+		}
+	}
+
+	public static abstract class LuanIO extends LuanIn {
+		abstract OutputStream outputStream() throws IOException;
+
+		public void write(LuanState luan,Object obj) throws LuanException, IOException {
+			if( obj instanceof String ) {
+				String s = (String)obj;
+				Writer out = new OutputStreamWriter(outputStream());
+				out.write(s);
+				out.close();
+				return;
+			}
+			if( obj instanceof byte[] ) {
+				byte[] a = (byte[])obj;
+				OutputStream out = outputStream();
+				Utils.copyAll(new ByteArrayInputStream(a),out);
+				out.close();
+				return;
+			}
+			throw luan.JAVA.exception( "bad argument #1 to 'write' (string or binary expected)" );
+		}
+
+		public LuanTable text_writer() throws IOException {
+			return textWriter(new BufferedWriter(new OutputStreamWriter(outputStream())));
+		}
+
+		public LuanTable binary_writer() throws IOException {
+			return binaryWriter(new BufferedOutputStream(outputStream()));
+		}
+
+		LuanTable table() {
+			LuanTable tbl = super.table();
+			try {
+				tbl.put( "write", new LuanJavaFunction(
+					LuanIO.class.getMethod( "write", LuanState.class, Object.class ), this
+				) );
+				tbl.put( "text_writer", new LuanJavaFunction(
+					LuanIO.class.getMethod( "text_writer" ), this
+				) );
+				tbl.put( "binary_writer", new LuanJavaFunction(
+					LuanIO.class.getMethod( "binary_writer" ), this
+				) );
+			} catch(NoSuchMethodException e) {
+				throw new RuntimeException(e);
+			}
+			return tbl;
+		}
+	}
+
+	public static final class LuanUrl extends LuanIn {
+		private final URL url;
+
+		public LuanUrl(String s) throws MalformedURLException {
+			this.url = new URL(s);
+		}
+
+		InputStream inputStream() throws IOException {
+			return url.openStream();
+		}
+	}
+
+	public static LuanTable url(String s) throws MalformedURLException {
+		return new LuanUrl(s).table();
+	}
+
+	public static final class LuanFile extends LuanIO {
+		private final File file;
+
+		public LuanFile(String name) {
+			this.file = new File(name);
+		}
+
+		InputStream inputStream() throws IOException {
+			return new FileInputStream(file);
+		}
+
+		OutputStream outputStream() throws IOException {
+			return new FileOutputStream(file);
+		}
+	}
+
+	public static LuanTable file(String name) {
+		return new LuanFile(name).table();
+	}
+
+	public static final class LuanSocket extends LuanIO {
+		private final Socket socket;
+
+		public LuanSocket(String host,int port) throws IOException {
+			this(new Socket(host,port));
+		}
+
+		public LuanSocket(Socket socket) throws IOException {
+			this.socket = socket;
+		}
+
+		InputStream inputStream() throws IOException {
+			return socket.getInputStream();
+		}
+
+		OutputStream outputStream() throws IOException {
+			return socket.getOutputStream();
+		}
+	}
+
+	public static LuanTable socket(String host,int port) throws IOException {
+		return new LuanSocket(host,port).table();
+	}
+
+	public static LuanFunction socket_server(int port) throws IOException {
+		final ServerSocket ss = new ServerSocket(port);
+		return new LuanFunction() {
+			@Override public Object call(LuanState luan,Object[] args) throws LuanException {
+				try {
+					if( args.length > 0 ) {
+						if( args.length > 1 || !"close".equals(args[0]) )
+							throw luan.JAVA.exception( "the only argument allowed is 'close'" );
+						ss.close();
+						return null;
+					}
+					return new LuanSocket(ss.accept()).table();
+				} catch(IOException e) {
+					throw luan.JAVA.exception(e);
+				}
+			}
+		};
+	}
 }
diff -r f537ff5e511d -r 0cd559a16758 src/luan/lib/PackageLib.java
--- a/src/luan/lib/PackageLib.java	Fri Jun 06 03:41:04 2014 +0000
+++ b/src/luan/lib/PackageLib.java	Fri Jun 06 05:59:11 2014 +0000
@@ -118,8 +118,7 @@
 		@Override public Object call(LuanState luan,Object[] args) throws LuanException {
 			String urlStr = (String)args[1];
 			try {
-				URL url = new URL(urlStr);
-				String src = Utils.read(url);
+				String src = new IoLib.LuanUrl(urlStr).read_text();
 				LuanFunction fn = BasicLib.load(luan,src,urlStr,false);
 				return fn.call(luan,args);
 			} catch(IOException e) {
diff -r f537ff5e511d -r 0cd559a16758 src/luan/lib/Utils.java
--- a/src/luan/lib/Utils.java	Fri Jun 06 03:41:04 2014 +0000
+++ b/src/luan/lib/Utils.java	Fri Jun 06 05:59:11 2014 +0000
@@ -1,22 +1,12 @@
 package luan.lib;
 
-import java.io.File;
-import java.io.FileReader;
-import java.io.FileWriter;
-import java.io.InputStreamReader;
 import java.io.Reader;
-import java.io.Writer;
 import java.io.IOException;
-import java.io.ByteArrayInputStream;
 import java.io.ByteArrayOutputStream;
-import java.io.FileInputStream;
-import java.io.FileOutputStream;
 import java.io.InputStream;
 import java.io.OutputStream;
-import java.net.URL;
 import luan.LuanState;
 import luan.LuanException;
-import luan.LuanElement;
 
 
 public final class Utils {
@@ -41,24 +31,6 @@
 		return buf.toString();
 	}
 
-	public static String read(File file)
-		throws IOException
-	{
-		Reader in = new FileReader(file);
-		String s = readAll(in);
-		in.close();
-		return s;
-	}
-
-	public static String read(URL url)
-		throws IOException
-	{
-		Reader in = new InputStreamReader(url.openStream());
-		String s = readAll(in);
-		in.close();
-		return s;
-	}
-
 	public static void copyAll(InputStream in,OutputStream out)
 		throws IOException
 	{
@@ -69,43 +41,6 @@
 		}
 	}
 
-	public static byte[] readAll(File file)
-		throws IOException
-	{
-		int len = (int)file.length();
-		ByteArrayOutputStream out = new ByteArrayOutputStream(len) {
-			public byte[] toByteArray() {
-				return buf;
-			}
-		};
-		FileInputStream in = new FileInputStream(file);
-		copyAll(in,out);
-		in.close();
-		return out.toByteArray();
-	}
-
-	public static void write(File file,String s)
-		throws IOException
-	{
-		Writer out = new FileWriter(file);
-		out.write(s);
-		out.close();
-	}
-
-	public static void writeAll(byte[] a,OutputStream out)
-		throws IOException
-	{
-		copyAll(new ByteArrayInputStream(a),out);
-	}
-
-	public static void writeAll(File file,byte[] a)
-		throws IOException
-	{
-		FileOutputStream fos = new FileOutputStream(file);
-		writeAll(a,fos);
-		fos.close();
-	}
-
 	public static byte[] readAll(InputStream in)
 		throws IOException
 	{