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


on register (email, password, name, adrgreeting = nil, adrdata =, adrresponse = nil) {
		<<4/2/01; 7:58:22 AM by DW
			<<Created. Send a registerUser message to the cloud, returning true if the user is registered, false if there was a failure.
			<<email is an email address, it could be fictitious, it identifies the user. 
			<<We send an MD5 hash of the password to the server.
			<<The user's name is displayed in various lists, it's nice to know people's real name. You may lie if you want.
			<<adrgreeting points to a string that will receive the English-language message from the server, but it's optional. 
		<<7/23/01; 9:45:30 PM by JES
			<<The data table now supports both xmlRpcPath, and the more general rpcPath, used for both XML-RPC and for SOAP. This is for support for SOAP-based xmlStorageSystem implementations which have a request URI which is different from the value of the SOAPAction header.
		<<10/6/01; 1:55:51 AM by JES
			<<Send the serial number as a parameter in the RPC request.
			<<New optional parameter, adrresponse. If not nil, the entire response struct will be copied to adrresponse. This is required in order to get usernums back from an xmlStorageSystem server.
		<<10/6/01; 2:10:07 AM by JES
			<<Commented out debugging code.
	local (useragent);
	bundle { //set useragent
		if system.environment.isPike {
			useragent = "Radio UserLand"}
		else {
			useragent = "UserLand Frontier"};
		useragent = useragent + " v" + Frontier.version () + ", " + system.environment.osFullNameForDisplay + " " + system.environment.osVersionString};
	local (params = {"email":email, "name":name, "password":string.hashmd5 (password), "clientPort":user.inetd.config.http.port, "userAgent":useragent});
	if defined (adrdata^.serialNumber) {
		params = params + {"serialNumber":user.prefs.serialNumber}};
	local (rpcPath);
	if defined (adrdata^.xmlRpcPath) {
		rpcPath = adrdata^.xmlRpcPath};
	if defined (adrdata^.rpcPath) {
		rpcPath = adrdata^.rpcPath};
	with adrdata^ {
		local (result);
		result = xml.rpc (server, port, "xmlStorageSystem.registerUser", @params, rpcPath:rpcPath, fldebug:fldebug, protocol:protocol, soapAction:soapAction);
		if adrgreeting != nil {
			adrgreeting^ = result.message};
		if adrresponse != nil {
			adrresponse^ = result};
		return (not result.flerror)}}
<<bundle //test code
	<<local (greeting)
	<<local (data); new (tableType, @data)
	<<bundle //init data table
		<<data.fldebug = false
		<<data.port = 80
		<<data.protocol = "xml-rpc"
		<<data.server = ""
		<<data.xmlRpcPath = "/RPC2"
		<<data.soapAction = "/xmlStorageSystem"
		<<data.serialNumber = user.prefs.serialNumber
	<<xmlStorageSystem.init ()
	<<with user.xmlStorageSystem
		<<register (email, password, name, @greeting, @data)
	<<dialog.alert (greeting)

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.