// Copyright 2004 Adam Megacz, see the COPYING file for licensing [GPL]
-package org.ibex;
+package org.ibex.net;
import java.io.*;
import java.util.*;
import org.ibex.js.*;
import org.ibex.util.*;
-import org.bouncycastle.util.encoders.Base64;
+import org.ibex.crypto.*;
/**
* An XML-RPC client implemented as a JavaScript Host Object. See the
* convert.
* </ol>
*/
-class XMLRPC extends JS {
+public class XMLRPC extends JS {
public XMLRPC(String url, String method) {
this.http = url.startsWith("stdio:") ? HTTP.stdio : new HTTP(url);
content.reset();
//#switch(c.getLocalName())
case "fault": fault = true;
- case "struct": objects.setElementAt(new JS(), objects.size() - 1);
+ case "struct": objects.setElementAt(new JS.O(), objects.size() - 1);
case "array": objects.setElementAt(null, objects.size() - 1);
case "value": objects.addElement("");
//#end
public void endElement(XML.Element c) {
//#switch(c.getLocalName())
- case "int": objects.setElementAt(new Integer(new String(content.getBuf(), 0, content.size())), objects.size() - 1);
- case "i4": objects.setElementAt(new Integer(new String(content.getBuf(), 0, content.size())), objects.size() - 1);
- case "boolean": objects.setElementAt(content.getBuf()[0] == '1' ? Boolean.TRUE : Boolean.FALSE, objects.size() - 1);
- case "string": objects.setElementAt(new String(content.getBuf(), 0, content.size()), objects.size() - 1);
- case "double": objects.setElementAt(new Double(new String(content.getBuf(), 0, content.size())), objects.size() - 1);
+ case "int": objects.setElementAt(JS.N(Integer.parseInt(new String(content.getBuf(), 0, content.size()))), objects.size() - 1);
+ case "i4": objects.setElementAt(JS.N(Integer.parseInt(new String(content.getBuf(), 0, content.size()))), objects.size() - 1);
+ case "boolean": objects.setElementAt(content.getBuf()[0] == '1' ? JS.T : JS.F, objects.size() - 1);
+ case "string": objects.setElementAt(JS.S(new String(content.getBuf(), 0, content.size())), objects.size() - 1);
+ case "double": objects.setElementAt(JS.N(Double.parseDouble(new String(content.getBuf(), 0, content.size()))), objects.size() - 1);
case "base64":
objects.setElementAt(new Stream.ByteArray(Base64.decode(new String(content.getBuf(), 0, content.size())),
null), objects.size() - 1);
- case "name": objects.addElement(new String(content.getBuf(), 0, content.size()));
+ case "name": objects.addElement(JS.S(new String(content.getBuf(), 0, content.size())));
case "value": if ("".equals(objects.lastElement()))
- objects.setElementAt(new String(content.getBuf(), 0, content.size()), objects.size() - 1);
+ objects.setElementAt(JS.S(new String(content.getBuf(), 0, content.size())), objects.size() - 1);
case "dateTime.iso8601":
String s = new String(content.getBuf(), 0, content.size());
"the server sent a <dateTime.iso8601> tag which was malformed: " + s);
}
case "member":
- Object memberValue = objects.elementAt(objects.size() - 1);
+ JS memberValue = (JS) objects.elementAt(objects.size() - 1);
String memberName = (String)objects.elementAt(objects.size() - 2);
JS struct = (JS)objects.elementAt(objects.size() - 3);
try {
- struct.put(memberName, memberValue);
+ struct.put(JS.S(memberName), memberValue);
} catch (JSExn e) {
throw new Error("this should never happen");
}
case "data":
int i;
for(i=objects.size() - 1; objects.elementAt(i) != null; i--);
- JSArray arr = new JSArray();
+ JS arr = new JSArray();
try {
- for(int j = i + 1; j<objects.size(); j++) arr.put(new Integer(j - i - 1), objects.elementAt(j));
+ for(int j = i + 1; j<objects.size(); j++) arr.put(JS.N(j - i - 1), (JS)objects.elementAt(j));
} catch (JSExn e) {
throw new Error("this should never happen");
}
// Send ///////////////////////////////////////////////////////////////////////////
- protected String buildRequest(JSArray args) throws JSExn, IOException {
+ protected String buildRequest(JS[] args) throws JSExn, IOException {
StringBuffer content = new StringBuffer();
content.append("\r\n");
content.append("<?xml version=\"1.0\"?>\n");
content.append(method);
content.append("</methodName>\n");
content.append(" <params>\n");
- for(int i=0; i<args.length(); i++) {
+ for(int i=0; i<args.length; i++) {
content.append(" <param>\n");
- appendObject(args.elementAt(i), content);
+ appendObject(args[i], content);
content.append(" </param>\n");
}
content.append(" </params>\n");
}
/** Appends the XML-RPC representation of <code>o</code> to <code>sb</code> */
- void appendObject(Object o, StringBuffer sb) throws JSExn {
-
- if (o == null) {
+ void appendObject(JS o, StringBuffer sb) throws JSExn {
+ // JS:FIXME: Update for new api
+ throw new Error("FIXME");
+ /*if (o == null) {
throw new JSExn("attempted to send a null value via XML-RPC");
} else if (o instanceof Number) {
} else {
throw new JSExn("attempt to send object of type " + o.getClass().getName() + " via XML-RPC");
- }
+ }*/
}
// Call Sequence //////////////////////////////////////////////////////////////////////////
- public final Object call(Object a0, Object a1, Object a2, Object[] rest, int nargs) throws JSExn {
- JSArray args = new JSArray();
- for(int i=0; i<nargs; i++) args.addElement(i==0?a0:i==1?a1:i==2?a2:rest[i-3]);
- return call(args);
- }
-
- public final Object call(final JSArray args) throws JSExn {
+ public final JS call(JS a0, JS a1, JS a2, JS[] rest, int nargs) throws JSExn {
+ final JS[] args = new JS[nargs];
+ for(int i=0;i<nargs;i++) args[i]= i==0?a0:i==1?a1:i==2?a2:rest[i-3];
try {
final JS.UnpauseCallback callback = JS.pause();
- new java.lang.Thread() { public void run() { call(callback, args); } }.start();
+ new java.lang.Thread() { public void run() { call(callback,args); } }.start();
return null; // doesn't matter since we paused
} catch (NotPauseableException npe) {
throw new JSExn("cannot invoke an XML-RPC call in the foreground thread");
}
}
- final void call(final JS.UnpauseCallback callback, final JSArray args) {
+ final void call(final JS.UnpauseCallback callback, JS[] args) {
try {
if (Log.rpc) Log.info(this, "call to " + url + " : " + method);
if (tracker == null) tracker = new Hash();
BufferedReader br = new BufferedReader(new InputStreamReader(is));
try {
new Helper().parse(br);
- final Object result = fault ? new JSExn(objects.elementAt(0)) : objects.size() == 0 ? null : objects.elementAt(0);
- Scheduler.add(new Scheduler.Task() { public void perform() throws JSExn { callback.unpause(result); }});
+ final JSExn exn = fault ? new JSExn(objects.elementAt(0).toString()) : null;
+ final JS result = fault ? null : objects.size() == 0 ? null : (JS) objects.elementAt(0);
+ Scheduler.add(new Task() { public void perform() throws JSExn { if(fault) callback.unpause(exn); else callback.unpause(result); }});
} finally {
tracker.clear();
objects.setSize(0);
}
} catch (final JSExn e) {
- final Exception e2 = e;
- Scheduler.add(new Scheduler.Task() { public void perform() throws JSExn { callback.unpause(e2); }});
+ Scheduler.add(new Task() { public void perform() throws JSExn { callback.unpause(e); }});
} catch (final IOException e) {
final Exception e2 = e;
- Scheduler.add(new Scheduler.Task() { public void perform() throws JSExn { callback.unpause(new JSExn(e2)); }});
+ Scheduler.add(new Task() { public void perform() throws JSExn { callback.unpause(new JSExn(e2.toString())); }});
} catch (final XML.Exn e) {
final Exception e2 = e;
- Scheduler.add(new Scheduler.Task() { public void perform() throws JSExn { callback.unpause(new JSExn(e2)); }});
+ Scheduler.add(new Task() { public void perform() throws JSExn { callback.unpause(new JSExn(e2.toString())); }});
}
}
}