Monday, November 08, 2010 at 12:05 AM.
system.verbs.builtins.radio.cloud.registerWithServer
on registerWithServer (password, name=user.prefs.name, email=user.prefs.mailAddress, flNewUser=true, usernumForExistingUser=0, flGetInitialResources=false) {
<<Changes
<<7/22/03; 5:07:24 PM by JES
<<If the server sends back a trackbackPageUrl when connecting an existing user, store it in weblogData.prefs.trackback.trackbackPageUrl.
<<12/9/02; 2:31:43 PM by JES
<<If the server sends back a commentsPageUrl when connecting an existing user, store it in weblogData.prefs.commentsPageUrl.
<<3/17/02; 4:41:44 PM by JES
<<After registering with the server, but before pinging the cloud or enabling upstreaming, clear the cached home folder URL, so that the one we need to get from the new server won't be overwritten when we ping.
<<3/16/02; 1:37:31 AM by JES
<<Don't call radio.thread.agents.pingCloud in its own thread -- avoids a potential macro error when changing community servers.
<<3/11/02; 4:06:49 PM by JES
<<Moved to the cloud sub-table. New optional parameter, flGetInitialResources, defaults to false. If true, we call radio.cloud.getInitialResources.
<<3/1/02; 11:38:27 AM by JES
<<Factored from radio.bootstrap. Perform all of the bootstrapping needed to connect to a community for the first time.
local (adrdata = radio.weblog.init ());
on getInitials (s) {
local (initials = "");
bundle { //strip off parentheticals
if s contains "(" {
s = string.nthField (s, "(", 1)};
if s contains "[" {
s = string.nthField (s, "[", 1)};
if s contains "{" {
s = string.nthField (s, "{", 1)}};
s = string.trimWhiteSpace (s);
initials = string.upper (s[1]);
local (i, ct = sizeOf (s));
if sizeOf (s) > 1 {
local (flNextCharIsInitial = false);
for i = 2 to ct {
if flNextCharIsInitial {
if string.isAlpha (s[i]) {
initials = initials + string.upper (s[i])};
flNextCharIsInitial = false};
if not string.isAlpha (s[i]) {
flNextCharIsInitial = true}}};
return (initials)};
on setName (name) {
user.prefs.name = name;
if adrdata^.prefs.title == "My Radio Weblog" { //work around a chicken-and-egg problem
<<The problem & the solution:
<<radio.thread.agents.mailToWeblog calls radio.weblog.checkMail, which in turn calls radio.weblog.init.
<<(There may be other places radio.weblog.init is called before we get here as well.)
<<This happens before we ever get to the desktop website, so you end up with a weblog whose title is "'s Radio Weblog".
<<Solution: Set user.prefs.name, delete the title, and let radio.weblog.init re-create it.
delete (@adrdata^.prefs.title);
radio.weblog.init ()};
adrdata^.prefs.authorName = name;
bundle { //set user.prefs.initials
user.prefs.initials = getInitials (name)}};
on setEmail (email) {
user.prefs.mailAddress = email;
adrdata^.prefs.authorMailAddress = email;
adrdata^.prefs.managingEditor = email;
adrdata^.prefs.webmaster = email};
local (upstreamDriverName = "xmlStorageSystem", adrdriver, flFinishSetup = false);
if flGetInitialResources {
radio.cloud.getInitialResources ()};
if flNewUser { //register new user
local (data = user.radio.prefs.defaultCloud);
data.flDebug = false;
local (response);
try { //trap network errors
if not defined (user.radio.prefs.usernum) { //only register if we don't already have a usernum
local (message);
if xmlStorageSystem.register (email, password, name, adrdata:@data, adrresponse:@response) {
user.radio.prefs.usernum = response.usernum;
user.radio.prefs.passwords.default = binary (password);
setName (name);
setEmail (email);
flFinishSetup = true}
else {
scriptError (response.message);
flError = true}}
else {}} //do nothing
else { //network or other error
local (t); new (tableType, @t);
t.error = tryError;
scriptError (radio.string.getlocalizedstring ("setupRadio.networkError", @t))}}
else { //connect existing user
local (data = user.radio.prefs.defaultCloud);
data.flDebug = false;
try { //ping the server
local (clouddata);
if xmlStorageSystem.ping (usernumForExistingUser, password, 0, adrdata: @data, adrclouddata:@clouddata) { //0 means online (not offline)
local (name = clouddata.name, email = clouddata.email);
if system.environment.isMac {
name = latinToMac.convert (name)};
if defined (clouddata.commentsPageUrl) {
adrdata^.prefs.commentsPageUrl = clouddata.commentsPageUrl};
if defined (clouddata.trackbackPageUrl) {
adrdata^.prefs.trackback.trackbackPageUrl = clouddata.trackbackPageUrl};
user.radio.prefs.usernum = usernumForExistingUser;
user.radio.prefs.passwords.default = binary (password);
setName (name);
setEmail (email);
flFinishSetup = true}
else { //the server returned an error
scriptError (radio.string.getlocalizedstring ("setupRadio.badLoginError"))}}
else { //network or other error
local (t); new (tableType, @t);
t.error = tryError;
scriptError (radio.string.getlocalizedstring ("setupRadio.networkError", @t))}};
if flFinishSetup { //write upstream spec
user.radio.prefs.upstream.enabled = false; //mostly for debugging, but not a bad idea anyway
local (folder = user.radio.prefs.upstream.folder);
local (f = folder + radio.data.fileNames.upstreamFileName);
if radio.upstream.findDriver (upstreamDriverName, @adrdriver) {
if defined (system.temp.radio.upstreamSpecCache.[f]) {
delete (@system.temp.radio.upstreamSpecCache.[f])};
if defined (user.radio.prefs.upstream.servers.[rcsServer]) {
delete (@user.radio.prefs.upstream.servers.[rcsServer])}}
else { //fatal error
scriptError ("Can't register with the server because there is no upstream driver of type \"" + upstreamDriverName + "\".")};
adrdriver^.saveUpstreamSpec (f, user.radio.prefs.usernum, user.prefs.name);
bundle { //set whenLastUpstreamed for all files in the www folder to its mod-date, plus one second
local (f, datezero = date (0));
fileloop (f in user.radio.prefs.upstream.folder, infinity) {
local (adrfile);
radio.file.getFileAttributes (f, @adrfile);
adrfile^.upstream.url = ""; //clear cached URLs
if not adrfile^.flFolder {
if adrfile^.mimetype beginsWith "text/" {
adrfile^.upstream.whenLastUploaded = date (number (file.modified (f)) + 1)}
else {
adrfile^.upstream.whenLastUploaded = datezero}}}};
bundle { //clear the cached home folder url so that we'll get the correct url from the new server
local (adrfolder = @user.radio.settings.files.[user.radio.prefs.wwwfolder]);
if defined (adrfolder^) {
try {adrfolder^.upstream.url = ""}}}};
bundle { //ping cloud and get server capabilities
system.temp.timers.["system.verbs.builtins.radio.thread.agents.pingCloud"] = date (0);
radio.thread.agents.pingCloud ()};
bundle { //turn upstreaming back on
user.radio.prefs.upstream.enabled = true};
return (true)};
<<bundle //testing
<<bundle //new user
<<if defined (user.radio.prefs.usernum)
<<if not defined (scratchpad.originalUsernum)
<<scratchpad.originalUsernum = user.radio.prefs.usernum
<<delete (@user.radio.prefs.usernum)
<<registerWithServer (user.radio.prefs.passwords.default)
<<bundle //existing user
<<registerWithServer (user.radio.prefs.passwords.default, flNewUser:false, usernumForExistingUser:user.radio.prefs.usernum)
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.