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

system.verbs.builtins.radio.html.changeCommunityServer

<<Changes
	<<5/9/02; 11:22:10 AM by JES
		<<When setting the rpcPath for the new community server, make sure it has a leading '/' character. When connecting to a new server, also set up user.radio.prefs.rssCloud and user.radio.prefs.webBugSimulator, just like we do in radio.thread.agents.installer, when setting up based on the contents of a defaultCloud.xml file.
	<<3/11/02; 6:50:13 PM by JES
		<<Clear the calendar and navigatorLinks caches after successfully registering with the new server.
	<<3/11/02; 5:47:09 PM by JES
		<<Call radio.cloud.registerWithServer instead of radio.registerWithServer. Same code, new location.
	<<3/10/02; 11:20:09 PM by JS
		<<Call radio.getInitialResources and radio.registerWithServer instead of rdio.bootstrap, to register with the server.
	<<3/7/02; 2:56:51 PM by JES
		<<Created. Render a page which lets a Radio user switch to a new community server.
		<<When the form on this page is submitted, two things happen:
		<<1) Radio gets the server's initial resources -- radioCommunityServer.getInitialResources.
		<<2) Radio registers itself as a new user on that server -- xmlStorageSystem.register.

local (pta = html.getPageTableAddress ());
pta^.title = radio.string.getLocalizedString ("changeCommunityServer.title");

local (htmltext, indentlevel=0);
on add (s) {
	htmltext = htmltext + (string.filledstring ("\t", indentlevel) + s + "\r\n");};

local (flError = false, errorMessage = "", flConfirmPage = false);
if pta^.method == "POST" {
	<<workspace.pt = pta^; edit (@workspace.pt)
	local (adrargs = @pta^.radioResponder.postArgs);
	if defined (adrargs^.changeCommunityServer) {
		local (password = adrargs^.["system.temp.radio.misc.newCommunityServerPassword"] );
		local (repeatPassword = adrargs^.["system.temp.radio.misc.newCommunityServerPasswordRepeat"] );
		bundle { //check that the password is ok, and that it matches the repeat password
			if sizeOf (password) < 4 {
				errorMessage = radio.string.getlocalizedstring ("changeCommunityServer.shortPasswordError");
				flError = true};
			if not flError {
				if password != repeatPassword {
					errorMessage = radio.string.getlocalizedstring ("changeCommunityServer.passwordMismatchError");
					flError = true}};
			temp.radio.misc.newCommunityServerPassword = "";
			temp.radio.misc.newCommunityServerPasswordRepeat = ""};
		if not flError { //get the server info from postArgs, and do the bootstrap
			local (urlparts);
			try { //check for malformed URLs
				local (serverUrl = adrargs^.["system.temp.radio.misc.newCommunityServer"]);
				if not (serverUrl beginsWith "http://") {
					temp.radio.misc.newCommunityServer = "http://" + temp.radio.misc.newCommunityServer};
				urlparts = string.urlSplit (serverUrl)}
			else { //error
				errorMessage = radio.string.getLocalizedString ("changeCommunityServer.badUrlError");
				flError = true};
			if not flError { //do the bootstrap
				local (server = urlparts[2], port = 80);
				if server contains ":" { //split out the port
					port = number (string.nthField (server, ":", 2));
					server = string.nthField (server, ":", 1)};
				local (rpcPath = "/" + urlParts[3]);
				local (originalUsernum, originalCloudData, originalPassword, originalRssCloud, originalWebBugData);
				bundle { //record the current settings -- in case there's an error, we can restore them
					originalUsernum = 0;
					if defined (user.radio.prefs.usernum) {
						originalUsernum = user.radio.prefs.usernum};
					originalCloudData = user.radio.prefs.defaultCloud;
					originalPassword = user.radio.prefs.passwords.default;
					originalRssCloud = user.radio.prefs.rssCloud;
					originalWebBugData = user.radio.prefs.webBugSimulator};
				bundle { //set up items in user.radio.prefs: defaultCloud, rssCloud, webBugSimulator, and ...passwords.default
					user.radio.prefs.defaultCloud.server = server;
					user.radio.prefs.defaultCloud.port = port;
					user.radio.prefs.defaultCloud.rpcPath = rpcPath;
					user.radio.prefs.defaultCloud.protocol = "xml-rpc";
					
					user.radio.prefs.rssCloud.server = server;
					user.radio.prefs.rssCloud.port = port;
					user.radio.prefs.rssCloud.rpcPath = rpcPath;
					user.radio.prefs.rssCloud.protocol = "xml-rpc";
					
					user.radio.prefs.webBugSimulator.server = server;
					user.radio.prefs.webBugSimulator.port = port;
					user.radio.prefs.webBugSimulator.rpcPath = rpcPath;
					
					user.radio.prefs.passwords.default = password};
				try { //trap network errors
					if defined (user.radio.prefs.usernum) { //delete it so the bootstrap will actually register
						delete (@user.radio.prefs.usernum)};
					radio.cloud.registerWithServer (password, flNewUser:true, flGetInitialResources:true); //true, to register a new user
					bundle { //clear the cached home folder URL
						local (adrfolder = @user.radio.settings.files.[user.radio.prefs.upstream.folder]);
						if defined (adrfolder^) {
							if defined (adrfolder^.upstream) {
								adrfolder^.upstream.url = ""}}};
					bundle { //clear cached calendars and navigation links
						local (adrdata = radio.weblog.init ());
						if defined (adrdata^.cache) {
							new (tableType, @adrdata^.cache.calendar)};
						new (tableType, @system.temp.radio.navigatorLinksCache)};
					flConfirmPage = true}
				else { //network or other error
					errorMessage = tryError;
					flError = true};
				if flError { //restore original settings
					if originalUsernum == 0 {
						delete (@user.radio.prefs.usernum)}
					else {
						user.radio.prefs.usernum = originalUsernum};
					user.radio.prefs.defaultCloud = originalCloudData;
					user.radio.prefs.passwords.default = originalPassword;
					user.radio.prefs.rssCloud = originalRssCloud;
					user.radio.prefs.webBugSimulator = originalWebBugData}}}};
	if defined (adrargs^.["continue"]) { //redirect to home page
		radio.webserver.redirect (radio.data.systemUrls.homePage);
		return ("")}};
bundle { //get default values
	temp.radio.misc.newCommunityServer = "http://";
	if defined (pta^.radioResponder.getArgs.rcs) {
		temp.radio.misc.newCommunityServer = pta^.radioResponder.getArgs.rcs};
	temp.radio.misc.newCommunityServerPassword = "";
	temp.radio.misc.newCommunityServerPasswordRepeat = ""};

if flConfirmPage { //render confirmation page
	local (t); new (tableType, @t);
	t.usernum = user.radio.prefs.usernum;
	t.websiteUrl = radio.weblog.getUrl ();
	add (radio.string.getLocalizedString ("changeCommunityServer.welcomeMessage", @t));
	bundle { //add the Continue button
		add ("<form method=\"POST\">");
		add ("<input type=\"submit\" name=\"continue\" value=\"" + radio.string.getlocalizedstring ("setupRadio.continueButton") + "\">");
		add ("</form>")}}
else { //render the form
	bundle { //intro text, possibly error message
		add ("<p>" + radio.string.getlocalizedstring ("changeCommunityServer.intro") + "</p>");
		if flError {
			add ("<p><font color=\"red\">" + errorMessage + "</font></p>")}};
	bundle { //start the form and table
		add ("<form method=\"POST\">"); indentlevel++;
		add ("<table cellpadding=\"5\" callspacing=\"0\" border=\"0\">"); indentlevel++};
	bundle { //add the fields
		add (radio.prefs.stringPref ("Server URL", @temp.radio.misc.newCommunityServer, size:80, maxlength:255));
		add (radio.prefs.stringPref ("Password", @temp.radio.misc.newCommunityServerPassword, "password", 25, 255, flCheckRepeatedPassword:false));
		add (radio.prefs.stringPref ("Repeat Password", @temp.radio.misc.newCommunityServerPasswordRepeat, "password", 25, 255, flCheckRepeatedPassword:false))};
	bundle { //submit button
		add ("<tr><td> </td><td style=\"padding-top:14px\"><input type=\"submit\" name=\"changeCommunityServer\" value=\"" + radio.string.getlocalizedstring ("changeCommunityServer.submitButton") + "\"></td></tr>")};
	bundle { //close the table and form
		add ("</table>"); indentlevel--;
		add ("</form>"); indentlevel--}};

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.