Monday, November 08, 2010 at 12:06 AM.

system.verbs.builtins.tcp.im.builtinDrivers.jabber.code.examples.rpc.xmlrpcResponse

on xmlrpcResponse ( connection, mesAdr, iq, query) {
	<<Changes
		<<5/14/02; 1:51:34 PM by JB
			<<Changelog created.
	<<This handles receiving a methodResponse, converting the response back into Frontier types, and turning control over to either the jabber.rpc call (synchronous), or the user-registered callback (asynchronous).
	local ( methodResponse, id, from, type, params, param, value, flGotRpcError = false, fault, struct, memberlist, faultCode, faultString );
	id = xml.getAttributeValue(iq, "id");
	id = tcp.im.builtinDrivers.jabber.code.idTables.getAdr(id);
	if id == "" { // no idtable at all, we forgot this call or it's spoofed, just ignore it
		return};
	methodResponse = xml.getAddress(query, "methodResponse" );
	bundle { // extract response, store in idTable appropriately
		try {
			params = xml.getAddress(methodResponse, "params");
			param = xml.getAddress(params, "param");
			id^.jabberXMLRPCResult = xml.getValue(param, "value");
			if typeOf ( value ) == tableType {
				local ( newValue );
				xml.coercions.structToFrontierValue(@id^.jabberXMLRPCResult[1], @newValue);
				table.assign(@id^.jabberXMLRPCResult, newValue)}}
		else { // we have an error
			flGotRpcError = true;
			fault = xml.getAddress(methodResponse, "fault");
			value = xml.getAddress(fault, "value");
			struct = xml.getAddress(value, "struct");
			memberlist = xml.getAddressList(struct, "member");
			for member in memberlist {
				local ( name = xml.getValue(member, "name"), value = xml.getValue(member, "value") );
				case name {
					"faultCode" {
						id^.JabberXMLRPCFaultCode = value};
					"faultString" {
						id^.JabberXMLRPCFaultString = value}}}}};
	
	if id^.jabberXMLRPCflAsync { // this was an asynchronous call, so call the given script and exit
		if not flGotRpcError {
			if defined ( id^.jabberXMLRPCCallback^ ) {
				try {
					id^.jabberXMLRPCCallback^ ( id^.jabberXMLRPCResult, id, id^.jabberXMLRPCExtraInfo)}};
			delete (id); // we know we don't need to run the cleanup now
			return}
		else {
			if defined ( id^.jabberXMLRPCErrorCallback^ ) {
				try {
					id^.jabberXMLRPCErrorCallback^ ( id, id^.JabberXMLRPCFaultCode, id^.JabberXMLRPCFaultString )}};
			delete (id); // we know we don't need to run the cleanup now
			return}};
	return}



This listing is for code that runs in the OPML Editor environment. I created these listings because I wanted the search engines to index it, so that when I want to look up something in my codebase I don't have to use the much slower search functionality in my object database. Dave Winer.