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

system.verbs.builtins.radio.upstream.builtinDrivers.xmlStorageSystem.configPage

on configPage (adrfolder, adrspec) {
	<<Changes
		<<10/23/01; 1:45:35 AM by JES
			<<Changed <account> to <usernum>. Don't register with the server here. You must be registered already.
	local (pta = html.getPageTableAddress ());
	pta^.title = "Upstream Settings";
	
	local (htmltext = "");
	on add (s) {
		htmltext = htmltext + s + "\r"};
	
	local (adrdata = @temp.radio.upstreamSettingsForm); //temp storage for the prefs browser
	new (tableType, adrdata);
	
	bundle { //cleanup items in the pageTable for the prefs browser
		if pta^.method == "POST" {
			local (adrargs = @pta^.radioResponder.postArgs);
			if defined (adrargs^.command) {
				case adrargs^.command {
					"postUpstreamSettings" { //clean up custom items in the post args
						delete (@adrargs^.command);
						table.rename (@adrargs^.passwordName, "temp.radio.upstreamSettingsForm.passwordName");
						table.rename (@adrargs^.rpcProtocol, "temp.radio.upstreamSettingsForm.protocol")};
					"upstreamSettings" {
						pta^.method = "GET"}}}}}; //tell the prefs browser not to treat this as a POST
	
	if adrspec == nil { //get default settings
		if defined (user.radio.prefs.usernum) {
			adrdata^.usernum = user.radio.prefs.usernum}
		else { //empty string
			adrdata^.usernum = ""};
		adrdata^.name = user.prefs.name;
		adrdata^.passwordName = nameOf (user.radio.prefs.passwords[1]);
		local (adrdefaults = @xmlStorageSystem.data);
		adrdata^.server = adrdefaults^.server;
		adrdata^.port = adrdefaults^.port;
		adrdata^.protocol = adrdefaults^.protocol;
		adrdata^.rpcPath = adrdefaults^.rpcPath;
		adrdata^.soapAction = adrdefaults^.soapAction}
	else { //get settings from the cached spec
		if defined (adrdata^.usernum) {
			adrdata^.usernum = usernum}
		else { //Grandfather in old element names, if present. Otherwise default to user.radio.prefs.usernum, or the empty string.
			if defined (adrdata^.account) {
				adrdata^.usernum = adrspec^.account}
			else {
				if defined (adrdata^.email) { //support the older #upsteram.xml spec
					adrdata^.usernum = adrspec^.email}
				else {
					if defined (user.radio.prefs.usernum) {
						adrdata^.usernum = user.radio.prefs.usernum}
					else {
						adrdata^.usernum = ""}}}};
		adrdata^.name = adrspec^.name;
		adrdata^.passwordName = adrspec^.passwordName;
		adrdata^.server = adrspec^.server;
		adrdata^.port = adrspec^.port;
		adrdata^.protocol = adrspec^.protocol;
		if defined (adrspec^.xmlRpcPath) { //legacy support for old xmlRpcPath element
			adrdata^.rpcPath = adrspec^.xmlRpcPath};
		if defined (adrspec^.rpcPath) {
			adrdata^.rpcPath = adrspec^.rpcPath};
		adrdata^.soapAction = adrspec^.soapAction};
	
	local (folder = nameOf (adrfolder^), folderlink);
	bundle { //build folderlink
		local (parentfolder = file.folderfrompath (user.radio.prefs.wwwfolder));
		local (foldername = string.replaceall (string.delete (folder, 1, sizeof (parentfolder)), file.getpathchar (), "/"));
		local (folderpath = string.replaceall (string.delete (folder, 1, sizeof (user.radio.prefs.wwwfolder)), file.getpathchar (), "/"));
		folderpath = string.replaceAll (folderpath, file.getPathChar (), "/");
		folderlink = "<a href=\"/" + folderpath + "?folderView=1\">" + foldername + "</a>"};
	htmltext = string.replace (radio.prefs.browser ("prefsWizardUpstreamXss.opml"), "[[folder]]", folderlink);
	
	if pta^.method == "POST" { //handle a post of the prefs form
		local (adrargs = @pta^.radioResponder.postArgs);
		bundle { //write out the #upstream.xml file
			local (f = folder + radio.data.fileNames.upstreamFileName);
			local (adrdriver = parentOf (this^));
			with adrdata^ {
				adrdriver^.saveUpstreamSpec (f, usernum, name, passwordName, protocol, server, port, rpcPath, soapAction)}};
		<<bundle //register with the server
			<<with adrdata^
				<<local (greeting)
				<<try //trap errors
					<<local (spec = adrspec^)
					<<spec.fldebug = false
					<<if xmlStorageSystem.register (account, user.radio.prefs.passwords.[passwordname], name, @greeting, @spec)
						<<htmltext = "<p><font color=\"darkblue\">The server said: " + greeting + "</font></p>\r" + htmltext
						<<bundle //invalidate the cache for all files in this folder
							<<local (adr)
							<<for adr in @user.radio.settings.files
								<<local (name = nameOf (adr^))
								<<if name beginsWith folder
									<<adr^.modified = date (0)
									<<adr^.upstream.url = ""
									<<adr^.upstream.whenLastUploaded = date (0)
					<<else //the server reported an error
						<<htmltext = "<p><font color=\"red\">The server reported an error: " + greeting + "</font></p>\r" + htmltext
				<<else //show the error to the user
					<<htmltext = "<p><font color=\"red\">Error connecting to the server: " + tryError + "</font></p>\r" + htmltext
		delete (adrdata)}; //delete temporary storage
	
	return (htmltext)}



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.