package org.xmlrpc.android;
import java.io.BufferedReader;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.Reader;
import java.io.StringWriter;
import java.net.Socket;
import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserException;
import org.xmlpull.v1.XmlPullParserFactory;
import android.util.Log;
public class XMLRPCServer extends XMLRPCCommon {
private static final String RESPONSE =
"HTTP/1.1 200 OK\n" +
"Connection: close\n" +
"Content-Type: text/xml\n" +
"Content-Length: ";
private static final String NEWLINES = "\n\n";
private XMLRPCSerializer iXMLRPCSerializer;
public XMLRPCServer() {
iXMLRPCSerializer = new XMLRPCSerializer();
}
public MethodCall readMethodCall(Socket socket) throws IOException, XmlPullParserException
{
MethodCall methodCall = new MethodCall();
InputStream inputStream = socket.getInputStream();
XmlPullParser pullParser = xmlPullParserFromSocket(inputStream);
pullParser.nextTag();
pullParser.require(XmlPullParser.START_TAG, null, Tag.METHOD_CALL);
pullParser.nextTag();
pullParser.require(XmlPullParser.START_TAG, null, Tag.METHOD_NAME);
methodCall.setMethodName(pullParser.nextText());
pullParser.nextTag();
pullParser.require(XmlPullParser.START_TAG, null, Tag.PARAMS);
pullParser.nextTag(); // <param>
do {
//Log.d(Tag.LOG, "type=" + pullParser.getEventType() + ", tag=" + pullParser.getName());
pullParser.require(XmlPullParser.START_TAG, null, Tag.PARAM);
pullParser.nextTag(); // <value>
Object param = iXMLRPCSerializer.deserialize(pullParser);
methodCall.params.add(param); // add to return value
pullParser.nextTag();
pullParser.require(XmlPullParser.END_TAG, null, Tag.PARAM);
pullParser.nextTag(); // <param> or </params>
} while (!pullParser.getName().equals(Tag.PARAMS)); // </params>
return methodCall;
}
XmlPullParser xmlPullParserFromSocket(InputStream socketInputStream) throws IOException, XmlPullParserException {
String line, xmlRpcText = "";
BufferedReader br = new BufferedReader(new InputStreamReader(socketInputStream));
while ((line = br.readLine()) != null && line.length() > 0); // eat the HTTP POST headers
while (br.ready())
xmlRpcText = xmlRpcText + br.readLine();
// Log.d(Tag.LOG, "xml received:" + xmlRpcText);
InputStream inputStream = new ByteArrayInputStream(xmlRpcText.getBytes("UTF-8"));
XmlPullParser pullParser = XmlPullParserFactory.newInstance().newPullParser();
Reader streamReader = new InputStreamReader(inputStream);
pullParser.setInput(streamReader);
return pullParser;
}
public void respond(Socket socket, Object[] params) throws IOException {
String content = methodResponse(params);
String response = RESPONSE + (content.length()) + NEWLINES + content;
OutputStream outputStream = socket.getOutputStream();
outputStream.write(response.getBytes());
outputStream.flush();
outputStream.close();
socket.close();
Log.d(Tag.LOG, "response:" + response);
}
private String methodResponse(Object[] params)
throws IllegalArgumentException, IllegalStateException, IOException {
StringWriter bodyWriter = new StringWriter();
serializer.setOutput(bodyWriter);
serializer.startDocument(null, null);
serializer.startTag(null, Tag.METHOD_RESPONSE);
serializeParams(params);
serializer.endTag(null, Tag.METHOD_RESPONSE);
serializer.endDocument();
return bodyWriter.toString();
}
}