X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=src%2Forg%2Fxwt%2FXMLRPC.java;h=30cc98cb986c99b3f63ef8d6d5a253f23c8c2a2a;hb=6306453b7699b9a9eba4e2108d673928ad5a431c;hp=274b5ef84b21277c767ef66e5213ce58ea6f6161;hpb=fa18ff2c6785c96c00d19092338f404ad7f6240c;p=org.ibex.core.git diff --git a/src/org/xwt/XMLRPC.java b/src/org/xwt/XMLRPC.java index 274b5ef..30cc98c 100644 --- a/src/org/xwt/XMLRPC.java +++ b/src/org/xwt/XMLRPC.java @@ -74,6 +74,7 @@ class XMLRPC extends XML implements Function { // Methods to Recieve and parse XML-RPC Response //////////////////////////////////////////////////// public void startElement(String name, String[] keys, Object[] vals, int line, int col) { + content.reset(); if (name.equals("fault")) fault = true; else if (name.equals("struct")) objects.setElementAt(new JSObject(false), objects.size() - 1); else if (name.equals("array")) objects.setElementAt(null, objects.size() - 1); @@ -95,7 +96,7 @@ class XMLRPC extends XML implements Function { objects.setElementAt(new Double(new String(content.getBuf(), 0, content.size())), objects.size() - 1); else if (name.equals("base64")) - objects.setElementAt(new String(Base64.decode(new String(content.getBuf(), 0, content.size()))), objects.size() - 1); + objects.setElementAt(new ByteStream(Base64.decode(new String(content.getBuf(), 0, content.size()))), objects.size() - 1); else if (name.equals("name")) objects.addElement(new String(content.getBuf(), 0, content.size())); @@ -182,6 +183,30 @@ class XMLRPC extends XML implements Function { sb.append(((Boolean)o).booleanValue() ? "1" : "0"); sb.append("\n"); + } else if (o instanceof ByteStream) { + try { + sb.append(" \n"); + InputStream is = ((ByteStream)o).getInputStream(); + byte[] buf = new byte[54]; + while(true) { + int numread = is.read(buf, 0, 54); + if (numread == -1) break; + byte[] writebuf = buf; + if (numread < buf.length) { + writebuf = new byte[numread]; + System.arraycopy(buf, 0, writebuf, 0, numread); + } + sb.append(" "); + sb.append(new String(Base64.encode(writebuf))); + sb.append("\n"); + } + sb.append("\n \n"); + } catch (IOException e) { + if (Log.on) Log.log(this, "caught IOException while attempting to send a ByteStream via XML-RPC"); + if (Log.on) Log.log(this, e); + throw new JavaScriptException("caught IOException while attempting to send a ByteStream via XML-RPC"); + } + } else if (o instanceof String) { sb.append(" "); String s = (String)o; @@ -202,6 +227,26 @@ class XMLRPC extends XML implements Function { } sb.append("\n"); + } else if (o instanceof NativeDate) { + sb.append(" "); + NativeDate nd = (NativeDate)o; + Date d = new Date(nd.getRawTime()); + sb.append(d.getYear() + 1900); + if (d.getMonth() + 1 < 10) sb.append('0'); + sb.append(d.getMonth() + 1); + if (d.getDate() < 10) sb.append('0'); + sb.append(d.getDate()); + sb.append('T'); + if (d.getHours() < 10) sb.append('0'); + sb.append(d.getHours()); + sb.append(':'); + if (d.getMinutes() < 10) sb.append('0'); + sb.append(d.getMinutes()); + sb.append(':'); + if (d.getSeconds() < 10) sb.append('0'); + sb.append(d.getSeconds()); + sb.append("\n"); + } else if (o instanceof NativeArray) { if (tracker.get(o) != null) throw new JavaScriptException("attempted to send multi-ref data structure via XML-RPC"); tracker.put(o, Boolean.TRUE); @@ -230,7 +275,9 @@ class XMLRPC extends XML implements Function { } } - public Object call(Object[] args) throws JavaScriptException, IOException { + // this is synchronized in case multiple threads try to make a call on the same object... in the future, change this + // behavior to use pipelining. + public synchronized Object call(Object[] args) throws JavaScriptException, IOException { if (Log.verbose) Log.log(this, "call to " + url + " : " + methodname); if (tracker == null) tracker = new Hash(); @@ -266,13 +313,11 @@ class XMLRPC extends XML implements Function { new BufferedReader(new FilterReader(new InputStreamReader(new Filter(http.getInputStream()))) { public int read() throws IOException { int i = super.read(); - System.out.println("X " + i); if (Log.on) Log.log(this, "recv: " + ((char)i)); return i; } public int read(char[] c, int off, int len) throws IOException { int ret = super.read(c, off, len); - System.out.println("Y " + ret); if (ret == -1) return ret; if (Log.on) Log.log(this, "recv: " + new String(c, off, ret)); return ret; @@ -317,19 +362,10 @@ class XMLRPC extends XML implements Function { public final Object call(Context cx, Scriptable scope, Scriptable thisObj, java.lang.Object[] args) throws JavaScriptException { - // put ourselves in the background - Thread thread = Thread.currentThread(); - if (!(thread instanceof ThreadMessage)) { - if (Log.on) Log.log(this, "RPC calls may only be made from background threads"); - return null; - } - ThreadMessage mythread = (ThreadMessage)thread; - mythread.setPriority(Thread.MIN_PRIORITY); - mythread.done.release(); + if (!ThreadMessage.suspendThread()) return null; try { return call(args); - } catch (IOException se) { if (Log.on) Log.log(this, se); if (Log.on) Log.log(this, " at " + cx.interpreterSourceFile + ":" + cx.interpreterLine); @@ -342,12 +378,8 @@ class XMLRPC extends XML implements Function { if (Log.on) Log.log(this, " at " + cx.interpreterSourceFile + ":" + cx.interpreterLine); } throw jse; - } finally { - // okay, let ourselves be brought to the foreground - MessageQueue.add(mythread); - mythread.setPriority(Thread.NORM_PRIORITY); - mythread.go.block(); + ThreadMessage.resumeThread(); } }