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

system.verbs.builtins.betty.rpc.serverSupport.callHandler

on callHandler (procedureName, adrparams, adrerrorflag) {
	<<Changes
		<<4/9/01; 12:38:32 PM by DW
			<<Created. Code cribbed from betty.server. Call the indicated handler with the params.
	
	local (response);
	on rpcFault (errorstring, errornum) {
		new (tabletype, @response);
		response.faultString = errorstring;
		response.faultCode = errornum;
		adrerrorflag^ = true};
	local (nomad, adrscript, securitylist = {});
	try { //locate the script
		local (s = procedureName, name);
		nomad = @user.betty.rpcHandlers;
		loop {
			if typeOf (nomad^) == tabletype {
				local (adr = @nomad^.["#security"]);
				if defined (adr^) {
					securitylist = securitylist + {adr}}};
			if sizeof (s) == 0 {
				break};
			name = string.nthField (s, '.', 1);
			nomad = @nomad^.[name];
			if typeof (nomad^) == addresstype {
				nomad = nomad^};
			s = string.delete (s, 1, sizeof (name) + 1)};
		adrscript = nomad}
	else {
		rpcFault (tryError, betty.rpc.errorcodes.scriptAddressError);
		return (response)};
	
	try { //check in with the #security scripts
		local (adr);
		for adr in securitylist {
			callScript (string (adr), {})}}
	else {
		rpcFault (tryError, betty.rpc.errorcodes.securityFault);
		return (response)};
	
	try { //call the script
		response = callScript (string (adrscript), adrparams^)}
	else {
		rpcFault (tryError, betty.rpc.errorcodes.scriptError);
		return (response)};
	adrerrorflag^ = false; //default, no error
	return (response)};
bundle { //test code
	local (params = {12});
	try {delete (@scratchpad.scriptresult)};
	scratchpad.scriptresult = callHandler ("examples.getStateName", @params);
	edit (@scratchpad.scriptresult)}



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.