annotate core/src/luan/modules/RpcLuan.java @ 742:5578541125ea

add Hosting.caller()
author Franklin Schmidt <fschmidt@gmail.com>
date Tue, 12 Jul 2016 17:47:30 -0600
parents b620b8e1010f
children 4b8695f1cfc4
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
610
b4f3dbe1c6e3 add Rpc and change Hosting to use Rpc
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
1 package luan.modules;
b4f3dbe1c6e3 add Rpc and change Hosting to use Rpc
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
2
b4f3dbe1c6e3 add Rpc and change Hosting to use Rpc
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
3 import java.io.InputStream;
b4f3dbe1c6e3 add Rpc and change Hosting to use Rpc
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
4 import java.io.OutputStream;
b4f3dbe1c6e3 add Rpc and change Hosting to use Rpc
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
5 import java.io.BufferedInputStream;
b4f3dbe1c6e3 add Rpc and change Hosting to use Rpc
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
6 import java.io.BufferedOutputStream;
b4f3dbe1c6e3 add Rpc and change Hosting to use Rpc
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
7 import java.io.IOException;
b4f3dbe1c6e3 add Rpc and change Hosting to use Rpc
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
8 import java.io.EOFException;
b4f3dbe1c6e3 add Rpc and change Hosting to use Rpc
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
9 import java.nio.charset.StandardCharsets;
b4f3dbe1c6e3 add Rpc and change Hosting to use Rpc
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
10 import java.util.Set;
b4f3dbe1c6e3 add Rpc and change Hosting to use Rpc
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
11 import java.util.IdentityHashMap;
b4f3dbe1c6e3 add Rpc and change Hosting to use Rpc
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
12 import java.util.Collections;
b4f3dbe1c6e3 add Rpc and change Hosting to use Rpc
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
13 import java.util.Map;
b4f3dbe1c6e3 add Rpc and change Hosting to use Rpc
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
14 import luan.Luan;
b4f3dbe1c6e3 add Rpc and change Hosting to use Rpc
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
15 import luan.LuanState;
b4f3dbe1c6e3 add Rpc and change Hosting to use Rpc
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
16 import luan.LuanTable;
b4f3dbe1c6e3 add Rpc and change Hosting to use Rpc
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
17 import luan.LuanFunction;
b4f3dbe1c6e3 add Rpc and change Hosting to use Rpc
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
18 import luan.LuanException;
b4f3dbe1c6e3 add Rpc and change Hosting to use Rpc
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
19 import luan.LuanMethod;
b4f3dbe1c6e3 add Rpc and change Hosting to use Rpc
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
20
b4f3dbe1c6e3 add Rpc and change Hosting to use Rpc
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
21
b4f3dbe1c6e3 add Rpc and change Hosting to use Rpc
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
22 public final class RpcLuan {
b4f3dbe1c6e3 add Rpc and change Hosting to use Rpc
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
23 private static final int NIL = 0;
b4f3dbe1c6e3 add Rpc and change Hosting to use Rpc
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
24 private static final int STRING = 1;
b4f3dbe1c6e3 add Rpc and change Hosting to use Rpc
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
25 private static final int BOOLEAN = 2;
b4f3dbe1c6e3 add Rpc and change Hosting to use Rpc
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
26 private static final int NUMBER = 3;
b4f3dbe1c6e3 add Rpc and change Hosting to use Rpc
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
27 private static final int BINARY = 4;
b4f3dbe1c6e3 add Rpc and change Hosting to use Rpc
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
28 private static final int TABLE = 5;
b4f3dbe1c6e3 add Rpc and change Hosting to use Rpc
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
29
b4f3dbe1c6e3 add Rpc and change Hosting to use Rpc
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
30 @LuanMethod public static Object[] call(LuanState luan,LuanTable socketTbl,String fnName,Object... args)
b4f3dbe1c6e3 add Rpc and change Hosting to use Rpc
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
31 throws LuanException, IOException
b4f3dbe1c6e3 add Rpc and change Hosting to use Rpc
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
32 {
b4f3dbe1c6e3 add Rpc and change Hosting to use Rpc
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
33 IoLuan.LuanSocket socket = (IoLuan.LuanSocket)socketTbl.rawGet("java");
b4f3dbe1c6e3 add Rpc and change Hosting to use Rpc
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
34 InputStream in = new BufferedInputStream(socket.inputStream());
b4f3dbe1c6e3 add Rpc and change Hosting to use Rpc
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
35 OutputStream out = new BufferedOutputStream(socket.outputStream());
b4f3dbe1c6e3 add Rpc and change Hosting to use Rpc
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
36 try {
b4f3dbe1c6e3 add Rpc and change Hosting to use Rpc
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
37 writeString(out,fnName);
b4f3dbe1c6e3 add Rpc and change Hosting to use Rpc
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
38 writeInt(out,args.length);
b4f3dbe1c6e3 add Rpc and change Hosting to use Rpc
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
39 for( Object arg : args ) {
b4f3dbe1c6e3 add Rpc and change Hosting to use Rpc
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
40 writeObj(out,luan,arg);
b4f3dbe1c6e3 add Rpc and change Hosting to use Rpc
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
41 }
b4f3dbe1c6e3 add Rpc and change Hosting to use Rpc
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
42 out.flush();
b4f3dbe1c6e3 add Rpc and change Hosting to use Rpc
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
43 boolean ok = readBoolean(in);
b4f3dbe1c6e3 add Rpc and change Hosting to use Rpc
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
44 if( ok ) {
b4f3dbe1c6e3 add Rpc and change Hosting to use Rpc
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
45 int n = readInt(in);
b4f3dbe1c6e3 add Rpc and change Hosting to use Rpc
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
46 Object[] rtn = new Object[n];
b4f3dbe1c6e3 add Rpc and change Hosting to use Rpc
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
47 for( int i=0; i<n; i++ ) {
b4f3dbe1c6e3 add Rpc and change Hosting to use Rpc
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
48 rtn[i] = readObj(in,luan);
b4f3dbe1c6e3 add Rpc and change Hosting to use Rpc
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
49 }
b4f3dbe1c6e3 add Rpc and change Hosting to use Rpc
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
50 return rtn;
b4f3dbe1c6e3 add Rpc and change Hosting to use Rpc
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
51 } else {
b4f3dbe1c6e3 add Rpc and change Hosting to use Rpc
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
52 String msg = readString(in);
646
cdc70de628b5 simplify LuanException
Franklin Schmidt <fschmidt@gmail.com>
parents: 610
diff changeset
53 throw new LuanException(msg);
610
b4f3dbe1c6e3 add Rpc and change Hosting to use Rpc
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
54 }
b4f3dbe1c6e3 add Rpc and change Hosting to use Rpc
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
55 } finally {
b4f3dbe1c6e3 add Rpc and change Hosting to use Rpc
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
56 out.close();
b4f3dbe1c6e3 add Rpc and change Hosting to use Rpc
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
57 in.close();
b4f3dbe1c6e3 add Rpc and change Hosting to use Rpc
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
58 }
b4f3dbe1c6e3 add Rpc and change Hosting to use Rpc
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
59 }
b4f3dbe1c6e3 add Rpc and change Hosting to use Rpc
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
60
b4f3dbe1c6e3 add Rpc and change Hosting to use Rpc
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
61 public static void respond(LuanState luan,LuanTable socketTbl,LuanTable fns)
b4f3dbe1c6e3 add Rpc and change Hosting to use Rpc
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
62 throws IOException, LuanException
b4f3dbe1c6e3 add Rpc and change Hosting to use Rpc
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
63 {
b4f3dbe1c6e3 add Rpc and change Hosting to use Rpc
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
64 IoLuan.LuanSocket socket = (IoLuan.LuanSocket)socketTbl.rawGet("java");
b4f3dbe1c6e3 add Rpc and change Hosting to use Rpc
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
65 InputStream in = new BufferedInputStream(socket.inputStream());
b4f3dbe1c6e3 add Rpc and change Hosting to use Rpc
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
66 OutputStream out = new BufferedOutputStream(socket.outputStream());
b4f3dbe1c6e3 add Rpc and change Hosting to use Rpc
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
67 try {
b4f3dbe1c6e3 add Rpc and change Hosting to use Rpc
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
68 Object[] rtn;
b4f3dbe1c6e3 add Rpc and change Hosting to use Rpc
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
69 try {
b4f3dbe1c6e3 add Rpc and change Hosting to use Rpc
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
70 String fnName = readString(in);
b4f3dbe1c6e3 add Rpc and change Hosting to use Rpc
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
71 int nArgs = readInt(in);
b4f3dbe1c6e3 add Rpc and change Hosting to use Rpc
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
72 Object[] args = new Object[nArgs];
b4f3dbe1c6e3 add Rpc and change Hosting to use Rpc
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
73 for( int i=0; i<nArgs; i++ ) {
b4f3dbe1c6e3 add Rpc and change Hosting to use Rpc
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
74 args[i] = readObj(in,luan);
b4f3dbe1c6e3 add Rpc and change Hosting to use Rpc
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
75 }
742
5578541125ea add Hosting.caller()
Franklin Schmidt <fschmidt@gmail.com>
parents: 694
diff changeset
76 LuanFunction fn = (LuanFunction)fns.get(luan,fnName);
610
b4f3dbe1c6e3 add Rpc and change Hosting to use Rpc
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
77 if( fn == null )
646
cdc70de628b5 simplify LuanException
Franklin Schmidt <fschmidt@gmail.com>
parents: 610
diff changeset
78 throw new LuanException( "function not found: " + fnName );
610
b4f3dbe1c6e3 add Rpc and change Hosting to use Rpc
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
79 rtn = Luan.array(fn.call(luan,args));
b4f3dbe1c6e3 add Rpc and change Hosting to use Rpc
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
80 } catch(LuanException e) {
b4f3dbe1c6e3 add Rpc and change Hosting to use Rpc
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
81 writeBoolean(out,false);
b4f3dbe1c6e3 add Rpc and change Hosting to use Rpc
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
82 writeString(out,e.getFullMessage());
b4f3dbe1c6e3 add Rpc and change Hosting to use Rpc
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
83 return;
b4f3dbe1c6e3 add Rpc and change Hosting to use Rpc
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
84 }
b4f3dbe1c6e3 add Rpc and change Hosting to use Rpc
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
85 writeBoolean(out,true);
b4f3dbe1c6e3 add Rpc and change Hosting to use Rpc
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
86 writeInt(out,rtn.length);
b4f3dbe1c6e3 add Rpc and change Hosting to use Rpc
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
87 for( Object obj : rtn ) {
b4f3dbe1c6e3 add Rpc and change Hosting to use Rpc
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
88 writeObj(out,luan,obj);
b4f3dbe1c6e3 add Rpc and change Hosting to use Rpc
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
89 }
b4f3dbe1c6e3 add Rpc and change Hosting to use Rpc
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
90 } finally {
b4f3dbe1c6e3 add Rpc and change Hosting to use Rpc
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
91 out.close();
b4f3dbe1c6e3 add Rpc and change Hosting to use Rpc
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
92 in.close();
b4f3dbe1c6e3 add Rpc and change Hosting to use Rpc
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
93 }
b4f3dbe1c6e3 add Rpc and change Hosting to use Rpc
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
94 }
b4f3dbe1c6e3 add Rpc and change Hosting to use Rpc
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
95
b4f3dbe1c6e3 add Rpc and change Hosting to use Rpc
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
96 static void writeObj(OutputStream out,LuanState luan,Object obj) throws IOException, LuanException {
b4f3dbe1c6e3 add Rpc and change Hosting to use Rpc
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
97 if( obj == null ) {
b4f3dbe1c6e3 add Rpc and change Hosting to use Rpc
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
98 out.write(NIL);
b4f3dbe1c6e3 add Rpc and change Hosting to use Rpc
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
99 }
b4f3dbe1c6e3 add Rpc and change Hosting to use Rpc
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
100 else if( obj instanceof String ) {
b4f3dbe1c6e3 add Rpc and change Hosting to use Rpc
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
101 out.write(STRING);
b4f3dbe1c6e3 add Rpc and change Hosting to use Rpc
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
102 writeString(out,(String)obj);
b4f3dbe1c6e3 add Rpc and change Hosting to use Rpc
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
103 }
b4f3dbe1c6e3 add Rpc and change Hosting to use Rpc
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
104 else if( obj instanceof Boolean ) {
b4f3dbe1c6e3 add Rpc and change Hosting to use Rpc
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
105 out.write(BOOLEAN);
b4f3dbe1c6e3 add Rpc and change Hosting to use Rpc
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
106 writeBoolean(out,(Boolean)obj);
b4f3dbe1c6e3 add Rpc and change Hosting to use Rpc
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
107 }
b4f3dbe1c6e3 add Rpc and change Hosting to use Rpc
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
108 else if( obj instanceof Number ) {
b4f3dbe1c6e3 add Rpc and change Hosting to use Rpc
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
109 out.write(NUMBER);
b4f3dbe1c6e3 add Rpc and change Hosting to use Rpc
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
110 writeString(out,obj.toString());
b4f3dbe1c6e3 add Rpc and change Hosting to use Rpc
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
111 }
b4f3dbe1c6e3 add Rpc and change Hosting to use Rpc
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
112 else if( obj instanceof byte[] ) {
b4f3dbe1c6e3 add Rpc and change Hosting to use Rpc
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
113 byte[] a = (byte[])obj;
b4f3dbe1c6e3 add Rpc and change Hosting to use Rpc
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
114 out.write(BINARY);
b4f3dbe1c6e3 add Rpc and change Hosting to use Rpc
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
115 writeInt(out,a.length);
b4f3dbe1c6e3 add Rpc and change Hosting to use Rpc
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
116 out.write(a);
b4f3dbe1c6e3 add Rpc and change Hosting to use Rpc
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
117 }
b4f3dbe1c6e3 add Rpc and change Hosting to use Rpc
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
118 else if( obj instanceof LuanTable ) {
b4f3dbe1c6e3 add Rpc and change Hosting to use Rpc
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
119 out.write(TABLE);
b4f3dbe1c6e3 add Rpc and change Hosting to use Rpc
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
120 String s = pickle( luan, obj, Collections.newSetFromMap(new IdentityHashMap<LuanTable,Boolean>()) );
b4f3dbe1c6e3 add Rpc and change Hosting to use Rpc
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
121 writeString(out,s);
b4f3dbe1c6e3 add Rpc and change Hosting to use Rpc
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
122 }
b4f3dbe1c6e3 add Rpc and change Hosting to use Rpc
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
123 else
646
cdc70de628b5 simplify LuanException
Franklin Schmidt <fschmidt@gmail.com>
parents: 610
diff changeset
124 throw new LuanException( "invalid type: " + obj.getClass() );
610
b4f3dbe1c6e3 add Rpc and change Hosting to use Rpc
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
125 }
b4f3dbe1c6e3 add Rpc and change Hosting to use Rpc
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
126
b4f3dbe1c6e3 add Rpc and change Hosting to use Rpc
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
127 static Object readObj(InputStream in,LuanState luan) throws IOException, LuanException {
b4f3dbe1c6e3 add Rpc and change Hosting to use Rpc
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
128 int type = in.read();
b4f3dbe1c6e3 add Rpc and change Hosting to use Rpc
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
129 switch(type) {
b4f3dbe1c6e3 add Rpc and change Hosting to use Rpc
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
130 case NIL:
b4f3dbe1c6e3 add Rpc and change Hosting to use Rpc
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
131 return null;
b4f3dbe1c6e3 add Rpc and change Hosting to use Rpc
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
132 case STRING:
b4f3dbe1c6e3 add Rpc and change Hosting to use Rpc
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
133 return readString(in);
b4f3dbe1c6e3 add Rpc and change Hosting to use Rpc
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
134 case BOOLEAN:
b4f3dbe1c6e3 add Rpc and change Hosting to use Rpc
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
135 return readBoolean(in);
b4f3dbe1c6e3 add Rpc and change Hosting to use Rpc
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
136 case NUMBER:
b4f3dbe1c6e3 add Rpc and change Hosting to use Rpc
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
137 return Double.valueOf(readString(in));
b4f3dbe1c6e3 add Rpc and change Hosting to use Rpc
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
138 case BINARY:
b4f3dbe1c6e3 add Rpc and change Hosting to use Rpc
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
139 return readBinary(in,readInt(in));
b4f3dbe1c6e3 add Rpc and change Hosting to use Rpc
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
140 case TABLE:
b4f3dbe1c6e3 add Rpc and change Hosting to use Rpc
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
141 String s = readString(in);
694
b620b8e1010f remove Luan.load() allow_expression param and add Luan.eval()
Franklin Schmidt <fschmidt@gmail.com>
parents: 646
diff changeset
142 LuanFunction fn = Luan.load("return "+s,"rpc-reader");
610
b4f3dbe1c6e3 add Rpc and change Hosting to use Rpc
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
143 return fn.call(luan);
b4f3dbe1c6e3 add Rpc and change Hosting to use Rpc
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
144 default:
646
cdc70de628b5 simplify LuanException
Franklin Schmidt <fschmidt@gmail.com>
parents: 610
diff changeset
145 throw new LuanException( "invalid type: " + type );
610
b4f3dbe1c6e3 add Rpc and change Hosting to use Rpc
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
146 }
b4f3dbe1c6e3 add Rpc and change Hosting to use Rpc
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
147 }
b4f3dbe1c6e3 add Rpc and change Hosting to use Rpc
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
148
b4f3dbe1c6e3 add Rpc and change Hosting to use Rpc
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
149 static Boolean readBoolean(InputStream in) throws IOException {
b4f3dbe1c6e3 add Rpc and change Hosting to use Rpc
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
150 return Boolean.valueOf(readString(in));
b4f3dbe1c6e3 add Rpc and change Hosting to use Rpc
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
151 }
b4f3dbe1c6e3 add Rpc and change Hosting to use Rpc
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
152
b4f3dbe1c6e3 add Rpc and change Hosting to use Rpc
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
153 static String readString(InputStream in) throws IOException {
b4f3dbe1c6e3 add Rpc and change Hosting to use Rpc
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
154 int len = readInt(in);
b4f3dbe1c6e3 add Rpc and change Hosting to use Rpc
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
155 byte[] a = readBinary(in,len);
b4f3dbe1c6e3 add Rpc and change Hosting to use Rpc
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
156 return new String(a,StandardCharsets.UTF_8);
b4f3dbe1c6e3 add Rpc and change Hosting to use Rpc
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
157 }
b4f3dbe1c6e3 add Rpc and change Hosting to use Rpc
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
158
b4f3dbe1c6e3 add Rpc and change Hosting to use Rpc
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
159 static int readInt(InputStream in) throws IOException {
b4f3dbe1c6e3 add Rpc and change Hosting to use Rpc
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
160 int ch1 = in.read();
b4f3dbe1c6e3 add Rpc and change Hosting to use Rpc
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
161 int ch2 = in.read();
b4f3dbe1c6e3 add Rpc and change Hosting to use Rpc
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
162 int ch3 = in.read();
b4f3dbe1c6e3 add Rpc and change Hosting to use Rpc
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
163 int ch4 = in.read();
b4f3dbe1c6e3 add Rpc and change Hosting to use Rpc
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
164 if ((ch1 | ch2 | ch3 | ch4) < 0)
b4f3dbe1c6e3 add Rpc and change Hosting to use Rpc
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
165 throw new EOFException();
b4f3dbe1c6e3 add Rpc and change Hosting to use Rpc
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
166 return ((ch1 << 24) + (ch2 << 16) + (ch3 << 8) + (ch4 << 0));
b4f3dbe1c6e3 add Rpc and change Hosting to use Rpc
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
167 }
b4f3dbe1c6e3 add Rpc and change Hosting to use Rpc
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
168
b4f3dbe1c6e3 add Rpc and change Hosting to use Rpc
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
169 static byte[] readBinary(InputStream in,int size) throws IOException {
b4f3dbe1c6e3 add Rpc and change Hosting to use Rpc
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
170 byte[] a = new byte[size];
b4f3dbe1c6e3 add Rpc and change Hosting to use Rpc
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
171 int i = 0;
b4f3dbe1c6e3 add Rpc and change Hosting to use Rpc
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
172 while( i < size ) {
b4f3dbe1c6e3 add Rpc and change Hosting to use Rpc
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
173 int n = in.read(a,i,size-i);
b4f3dbe1c6e3 add Rpc and change Hosting to use Rpc
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
174 if( n == -1 )
b4f3dbe1c6e3 add Rpc and change Hosting to use Rpc
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
175 throw new EOFException();
b4f3dbe1c6e3 add Rpc and change Hosting to use Rpc
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
176 i += n;
b4f3dbe1c6e3 add Rpc and change Hosting to use Rpc
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
177 }
b4f3dbe1c6e3 add Rpc and change Hosting to use Rpc
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
178 return a;
b4f3dbe1c6e3 add Rpc and change Hosting to use Rpc
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
179 }
b4f3dbe1c6e3 add Rpc and change Hosting to use Rpc
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
180
b4f3dbe1c6e3 add Rpc and change Hosting to use Rpc
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
181 static void writeBoolean(OutputStream out,Boolean b) throws IOException {
b4f3dbe1c6e3 add Rpc and change Hosting to use Rpc
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
182 writeString(out,b.toString());
b4f3dbe1c6e3 add Rpc and change Hosting to use Rpc
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
183 }
b4f3dbe1c6e3 add Rpc and change Hosting to use Rpc
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
184
b4f3dbe1c6e3 add Rpc and change Hosting to use Rpc
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
185 static void writeString(OutputStream out,String s) throws IOException {
b4f3dbe1c6e3 add Rpc and change Hosting to use Rpc
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
186 byte[] a = s.getBytes(StandardCharsets.UTF_8);
b4f3dbe1c6e3 add Rpc and change Hosting to use Rpc
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
187 writeInt(out,a.length);
b4f3dbe1c6e3 add Rpc and change Hosting to use Rpc
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
188 out.write(a);
b4f3dbe1c6e3 add Rpc and change Hosting to use Rpc
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
189 }
b4f3dbe1c6e3 add Rpc and change Hosting to use Rpc
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
190
b4f3dbe1c6e3 add Rpc and change Hosting to use Rpc
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
191 static void writeInt(OutputStream out,int v) throws IOException {
b4f3dbe1c6e3 add Rpc and change Hosting to use Rpc
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
192 out.write((v >>> 24) & 0xFF);
b4f3dbe1c6e3 add Rpc and change Hosting to use Rpc
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
193 out.write((v >>> 16) & 0xFF);
b4f3dbe1c6e3 add Rpc and change Hosting to use Rpc
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
194 out.write((v >>> 8) & 0xFF);
b4f3dbe1c6e3 add Rpc and change Hosting to use Rpc
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
195 out.write((v >>> 0) & 0xFF);
b4f3dbe1c6e3 add Rpc and change Hosting to use Rpc
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
196 }
b4f3dbe1c6e3 add Rpc and change Hosting to use Rpc
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
197
b4f3dbe1c6e3 add Rpc and change Hosting to use Rpc
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
198
b4f3dbe1c6e3 add Rpc and change Hosting to use Rpc
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
199 private static String pickle(LuanState luan,Object obj,Set<LuanTable> set) throws LuanException {
b4f3dbe1c6e3 add Rpc and change Hosting to use Rpc
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
200 if( obj == null )
b4f3dbe1c6e3 add Rpc and change Hosting to use Rpc
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
201 return "nil";
b4f3dbe1c6e3 add Rpc and change Hosting to use Rpc
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
202 if( obj instanceof Boolean )
b4f3dbe1c6e3 add Rpc and change Hosting to use Rpc
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
203 return obj.toString();
b4f3dbe1c6e3 add Rpc and change Hosting to use Rpc
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
204 if( obj instanceof Number )
b4f3dbe1c6e3 add Rpc and change Hosting to use Rpc
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
205 return Luan.toString((Number)obj);
b4f3dbe1c6e3 add Rpc and change Hosting to use Rpc
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
206 if( obj instanceof String )
b4f3dbe1c6e3 add Rpc and change Hosting to use Rpc
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
207 return "\"" + Luan.stringEncode((String)obj) + "\"";
b4f3dbe1c6e3 add Rpc and change Hosting to use Rpc
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
208 if( obj instanceof LuanTable ) {
b4f3dbe1c6e3 add Rpc and change Hosting to use Rpc
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
209 LuanTable tbl = (LuanTable)obj;
b4f3dbe1c6e3 add Rpc and change Hosting to use Rpc
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
210 if( !set.add(tbl) ) {
646
cdc70de628b5 simplify LuanException
Franklin Schmidt <fschmidt@gmail.com>
parents: 610
diff changeset
211 throw new LuanException( "circular reference in table" );
610
b4f3dbe1c6e3 add Rpc and change Hosting to use Rpc
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
212 }
b4f3dbe1c6e3 add Rpc and change Hosting to use Rpc
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
213 StringBuilder sb = new StringBuilder();
b4f3dbe1c6e3 add Rpc and change Hosting to use Rpc
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
214 sb.append( "{" );
b4f3dbe1c6e3 add Rpc and change Hosting to use Rpc
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
215 for( Map.Entry<Object,Object> entry : tbl.iterable(luan) ) {
b4f3dbe1c6e3 add Rpc and change Hosting to use Rpc
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
216 sb.append( "[" );
b4f3dbe1c6e3 add Rpc and change Hosting to use Rpc
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
217 sb.append( pickle(luan,entry.getKey(),set) );
b4f3dbe1c6e3 add Rpc and change Hosting to use Rpc
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
218 sb.append( "]=" );
b4f3dbe1c6e3 add Rpc and change Hosting to use Rpc
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
219 sb.append( pickle(luan,entry.getValue(),set) );
b4f3dbe1c6e3 add Rpc and change Hosting to use Rpc
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
220 sb.append( ", " );
b4f3dbe1c6e3 add Rpc and change Hosting to use Rpc
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
221 }
b4f3dbe1c6e3 add Rpc and change Hosting to use Rpc
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
222 sb.append( "}" );
b4f3dbe1c6e3 add Rpc and change Hosting to use Rpc
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
223 return sb.toString();
b4f3dbe1c6e3 add Rpc and change Hosting to use Rpc
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
224 }
646
cdc70de628b5 simplify LuanException
Franklin Schmidt <fschmidt@gmail.com>
parents: 610
diff changeset
225 throw new LuanException( "invalid type: " + obj.getClass() );
610
b4f3dbe1c6e3 add Rpc and change Hosting to use Rpc
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
226 }
b4f3dbe1c6e3 add Rpc and change Hosting to use Rpc
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
227
b4f3dbe1c6e3 add Rpc and change Hosting to use Rpc
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
228 }