X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=src%2Forg%2Fxwt%2FXMLRPC.java;h=ebea2a666a253b9a93a7fd76d38326e1c8dc838c;hb=89152b4505ee3435af5396582e25ef45bd48f290;hp=596151e01a68c70320a62b9a07f96cd9292494b2;hpb=903894f81543b6f907783d979c4cd3bc98c5ff3b;p=org.ibex.core.git diff --git a/src/org/xwt/XMLRPC.java b/src/org/xwt/XMLRPC.java index 596151e..ebea2a6 100644 --- a/src/org/xwt/XMLRPC.java +++ b/src/org/xwt/XMLRPC.java @@ -41,6 +41,9 @@ class XMLRPC extends XML implements Function { /** this holds character content as we read it in -- since there is only one per instance, we don't support mixed content */ protected AccessibleCharArrayWriter content = new AccessibleCharArrayWriter(100); + /** the HTTP connection to use */ + protected HTTP http = null; + /** The object stack. As we process xml elements, pieces of the * return value are pushed onto and popped off of this stack. * @@ -73,37 +76,38 @@ 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) { - 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); - else if (name.equals("value")) objects.addElement(""); + public void startElement(XML.Element c) { + content.reset(); + if (c.localName.equals("fault")) fault = true; + else if (c.localName.equals("struct")) objects.setElementAt(new JSObject(false), objects.size() - 1); + else if (c.localName.equals("array")) objects.setElementAt(null, objects.size() - 1); + else if (c.localName.equals("value")) objects.addElement(""); } - public void endElement(String name, int line, int col) { + public void endElement(XML.Element c) { - if (name.equals("int") || name.equals("i4")) + if (c.localName.equals("int") || c.localName.equals("i4")) objects.setElementAt(new Integer(new String(content.getBuf(), 0, content.size())), objects.size() - 1); - else if (name.equals("boolean")) + else if (c.localName.equals("boolean")) objects.setElementAt(content.getBuf()[0] == '1' ? Boolean.TRUE : Boolean.FALSE, objects.size() - 1); - else if (name.equals("string")) + else if (c.localName.equals("string")) objects.setElementAt(new String(content.getBuf(), 0, content.size()), objects.size() - 1); - else if (name.equals("double")) + else if (c.localName.equals("double")) objects.setElementAt(new Double(new String(content.getBuf(), 0, content.size())), objects.size() - 1); - else if (name.equals("base64")) + else if (c.localName.equals("base64")) objects.setElementAt(new ByteStream(Base64.decode(new String(content.getBuf(), 0, content.size()))), objects.size() - 1); - else if (name.equals("name")) + else if (c.localName.equals("name")) objects.addElement(new String(content.getBuf(), 0, content.size())); - else if (name.equals("value") && "".equals(objects.lastElement())) + else if (c.localName.equals("value") && "".equals(objects.lastElement())) objects.setElementAt(new String(content.getBuf(), 0, content.size()), objects.size() - 1); - else if (name.equals("dateTime.iso8601")) { + else if (c.localName.equals("dateTime.iso8601")) { String s = new String(content.getBuf(), 0, content.size()); // strip whitespace @@ -129,14 +133,14 @@ class XMLRPC extends XML implements Function { if (Log.on) Log.log(this, e); } - } else if (name.equals("member")) { + } else if (c.localName.equals("member")) { Object memberValue = objects.elementAt(objects.size() - 1); String memberName = (String)objects.elementAt(objects.size() - 2); Scriptable struct = (Scriptable)objects.elementAt(objects.size() - 3); struct.put(memberName, struct, memberValue); objects.setSize(objects.size() - 2); - } else if (name.equals("data")) { + } else if (c.localName.equals("data")) { int i; for(i=objects.size() - 1; objects.elementAt(i) != null; i--); Object[] arr = new Object[objects.size() - i - 1]; @@ -149,7 +153,7 @@ class XMLRPC extends XML implements Function { content.reset(); } - public void content(char[] ch, int start, int length, int line, int col) { + public void characters(char[] ch, int start, int length) { try { content.write(ch, start, length); } catch (Exception e) { if (Log.on) Log.log(this, "Exception in XMLRPC.content() -- this should never happen"); @@ -157,6 +161,7 @@ class XMLRPC extends XML implements Function { } } + public void whitespace(char[] ch, int start, int length) {} // Methods to make outbound XML-RPC request /////////////////////////////////////////////////// @@ -226,6 +231,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); @@ -265,64 +290,53 @@ class XMLRPC extends XML implements Function { if (objects == null) objects = new Vec(); else objects.setSize(0); - HTTP http = new HTTP(url); String content = send(args, http); - OutputStream os = new BufferedOutputStream(http.getOutputStream(content.length(), "text/xml"), 4000); - PrintWriter ps = !Log.verbose ? - new PrintWriter(os) : - new PrintWriter(new FilterWriter(new OutputStreamWriter(os)) { - public void write(int i) throws IOException { - super.write(i); - if (Log.on) Log.log(this, "send: " + ((char)i)); - } - public void write(String s, int start, int len) throws IOException { - super.write(s, start, len); - if (Log.on) Log.log(this, "send: " + s.substring(start, start + len)); - } - public void write(char[] c, int start, int len) throws IOException { - super.write(c, start, len); - if (Log.on) Log.log(this, "send: " + new String(c, start, len)); - } - }); - ps.print(content.toString()); - ps.flush(); - - BufferedReader br = !Log.verbose ? - new BufferedReader(new InputStreamReader(new Filter(http.getInputStream()))) : - 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; - } - }); - return recieve(br); + if (Log.verbose) { + String s; + BufferedReader br2 = new BufferedReader(new StringReader(content)); + while ((s = br2.readLine()) != null) Log.log(this, "send: " + s); + } + + HTTP.HTTPInputStream is = http.POST("text/xml", content); + try { + BufferedReader br = !Log.verbose ? + new BufferedReader(new InputStreamReader(new Filter(is))) : + new BufferedReader(new FilterReader(new InputStreamReader(new Filter(is))) { + public int read() throws IOException { + int i = super.read(); + 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); + if (ret == -1) return ret; + String s; + BufferedReader br2 = new BufferedReader(new StringReader(new String(c, off, ret))); + while ((s = br2.readLine()) != null) Log.log(this, "recv: " + s); + return ret; + } + }); + return recieve(br); + } finally { + is.close(); + } } protected String send(Object[] args, HTTP http) throws JavaScriptException, IOException { StringBuffer content = new StringBuffer(); + content.append("\r\n"); content.append("\n"); content.append(" \n"); content.append(" "); content.append(methodname); content.append("\n"); - if (args.length > 0) { - content.append(" \n"); - for(int i=0; i\n"); - appendObject(args[i], content); - content.append(" \n"); - } - content.append(" \n"); + content.append(" \n"); + for(int i=0; i\n"); + appendObject(args[i], content); + content.append(" \n"); } + content.append(" \n"); content.append(" "); return content.toString(); } @@ -331,7 +345,7 @@ class XMLRPC extends XML implements Function { // parse XML reply try { parse(br); - } catch (XML.SAXException e) { + } catch (XML.XMLException e) { if (Log.on) Log.log(this, "reply from server was not well-formed XML: " + e); throw new JavaScriptException("reply from server was not well-formed XML: " + e); } @@ -367,10 +381,17 @@ class XMLRPC extends XML implements Function { /** When you get a property from an XMLRPC, it just returns another XMLRPC with the property name tacked onto methodname. */ public Object get(String name, Scriptable start) { - return new XMLRPC(url, (methodname.equals("") ? "" : methodname + ".") + name); + return new XMLRPC(url, (methodname.equals("") ? "" : methodname + ".") + name, http); } public XMLRPC(String url, String methodname) { + this(url, methodname, new HTTP(url)); + } + + public XMLRPC(String url, String methodname, HTTP http) { + super(BUFFER_SIZE); + + this.http = http; this.url = url; this.methodname = methodname; } @@ -389,17 +410,17 @@ class XMLRPC extends XML implements Function { public Filter(InputStream is) { super(is); } public int read() throws IOException { Thread.yield(); - while(MessageQueue.working) try { Thread.sleep(100); } catch (Exception e) { }; + while(MessageQueue.nonThreadEventsInQueue > 0) try { Thread.sleep(100); } catch (Exception e) { }; return super.read(); } public int read(byte[] b) throws IOException { Thread.yield(); - while(MessageQueue.working) try { Thread.sleep(100); } catch (Exception e) { }; + while(MessageQueue.nonThreadEventsInQueue > 0) try { Thread.sleep(100); } catch (Exception e) { }; return super.read(b); } public int read(byte[] b, int i, int j) throws IOException { Thread.yield(); - while(MessageQueue.working) try { Thread.sleep(100); } catch (Exception e) { }; + while(MessageQueue.nonThreadEventsInQueue > 0) try { Thread.sleep(100); } catch (Exception e) { }; return super.read(b, i, j); } }