import org.jabber.jabberbeans.*;
import org.jabber.jabberbeans.Extension.*;
import org.jabber.jabberbeans.util.JID;
import java.net.InetAddress;
import java.util.Enumeration;
import java.io.*;
import helma.xmlrpc.*;
public class JabberRPCResponder implements PacketListener
{
private String server = "gnu.mine.nu";
private String user = "server";
private String pass = "pass";
private String resource = "jrpc-server";
private XmlRpcServer responder;
private ConnectionBean cb;
// Constructor
public JabberRPCResponder()
{
responder = new XmlRpcServer();
responder.addHandler("examples", new RPCHandler());
}
// Main program
public static void main(String args[])
{
JabberRPCResponder server = new JabberRPCResponder();
try
{
server.start();
}
catch (Exception e)
{
System.out.println("Cannot start server: " + e.toString());
}
}
public void start() throws Exception
{
cb = new ConnectionBean();
InetAddress addr;
cb.addPacketListener(this);
// Connect
cb.connect(addr=InetAddress.getByName(server));
// Authenticate
InfoQueryBuilder iqb = new InfoQueryBuilder();
IQAuthBuilder iqAuthb = new IQAuthBuilder();
iqb.setType("set");
iqAuthb.setUsername(user);
iqAuthb.setPassword(pass);
iqAuthb.setResource(resource);
iqb.addExtension(iqAuthb.build());
InfoQuery iq = (InfoQuery)iqb.build();
cb.send(iq);
// Send presence
PresenceBuilder pb = new PresenceBuilder();
cb.send(pb.build());
}
// Packet Listener interface:
public void receivedPacket(PacketEvent pe)
{
Packet packet = pe.getPacket();
System.out.println("RECV:" + packet.toString());
if (packet instanceof InfoQuery)
{
Enumeration e = ((InfoQuery)packet).Extensions();
if (e.hasMoreElements())
{
Extension ext = (Extension)e.nextElement();
String request = ext.toString();
String id = ((InfoQuery)packet).getIdentifier();
JID from = ((InfoQuery)packet).getFromAddress();
ByteArrayInputStream bis =
new ByteArrayInputStream(request.getBytes());
String result = new String(responder.execute(bis));
String response = result;
int pos = result.lastIndexOf("?>");
if (pos >= 0)
{
response = result.substring(pos + 2);
}
IQRPCBuilder iqrpcb = new IQRPCBuilder();
iqrpcb.setPayload(response);
InfoQueryBuilder iqb = new InfoQueryBuilder();
iqb.setType("result");
iqb.setIdentifier(id);
iqb.setToAddress(from);
iqb.addExtension(iqrpcb.build());
InfoQuery iq;
try {
iq = (InfoQuery)iqb.build();
}
catch (InstantiationException ie)
{
System.out.println("Build failed: " + ie.toString());
return;
}
cb.send(iq);
}
}
}
public void sentPacket(PacketEvent pe)
{
Packet packet = pe.getPacket();
System.out.println("SEND:" + packet.toString());
}
public void sendFailed(PacketEvent pe)
{
Packet packet = pe.getPacket();
System.out.println("failed to send:" + packet.toString());
}
}
|