Monday, November 08, 2010 at 12:01 AM.
system.verbs.apps.Manila.editResponder.respond
on respond (pta) {
<<Implement the edit responder that opens Manila objects for editing.
<<11/26/00; 9:33:13 PM by PBS
<<Changes:
<<11/26/00; 9:33:35 PM by PBS
<<pathArgs have priority over searchArgs, since sometimes we need to send a form, and searchArgs get wiped out in that case. So we use pathArgs in that case. For instance -- the Create a New Story form uses pathArgs, since it's a form.
<<11/27/00; 12:47:13 AM by PBS
<<Fixed a bug with editing messages -- you would sometimes get the rendered text instead of the outline.
<<11/27/00; 3:46:47 PM by PBS
<<Shortening the URL the server generates -- less info is sent now. Get info from referer, assume defaults, when certain arguments aren't specified. If not supplied, get username and password from prefs or prompt user.
<<12/04/00 at 3:53:37 PM by JES
<<If there's a scriptError when checking out an item, forget the username and password, so the user will have a chance to enter them again.
<<12/04/00 4:16:11 PM by PBS
<<If there's an error, display a friendly It Didn't Work page rather than a 500 Server Error page.
<<12/12/00; 10:29:11 PM by PBS
<<If this is a Macintosh, bring the app to front right away, to work around the MSIE 5 CPU hogging bug.
<<12/17/00; 6:32:24 PM by JES
<<Optimizations: If we already know the canonical site name, get it from user.playlist.manila.sites, instead of calling the server. If the story is already open for editing, don't make any calls to the server; just bring the window to the front.
<<12/27/00; 2:50:35 PM by PBS
<<Bring Radio to front on Windows right away (same as on Macs). If there's an error page to display, bring the Web browser to the front.
<<12/30/00; 5:51:36 PM by JES
<<Edit Manila sites' site structure using the structure outline, instead of plain XML.
<<01/22/01; 1:59:38 AM by JES
<<Fix a bug where stories created in the browser would not correctly translate to Mac text for editing in Radio.
<<3/22/01; 6:38:26 PM by PBS
<<When creating a new story, convert the title that was typed in the form on the web page to Macintosh text (when on a Macintosh).
<<3/12/02; 4:00:26 AM by JES
<<Convert the title of new stories from Latin to Mac text, if running on a Mac. (This conversion used to happen, but was lost in the move to the windowTypes framework.)
Frontier.bringToFront ();
bundle { //init windowTypes and nodeTypes
manila.nodeTypes.init ();
manila.windowTypes.init ()};
pta^.responseHeaders.["Content-Type"] = "text/html"; //a sensible default
try {
on buildResponse (code, shortmessage, longmessage) {
pta^.code = code;
pta^.responseBody = webserver.util.buildErrorPage (code + " " + string.upper (shortmessage), longmessage);
return};
local (args, siteinfo, redirectURL, adrinfo);
bundle { //decode args, copy items to siteinfo table and to redirectURL
try {
new (tabletype, @args);
if pta^.pathArgs != "" {
webserver.parseArgs (pta^.pathArgs, @args)};
bundle { //add search args
local (t);
new (tableType, @t);
webserver.parseArgs (pta^.searchArgs, @t);
table.copyContents (@t, @args)};
new (tabletype, @siteinfo);
siteInfo.url = args.url;
bundle { //host
if defined (args.host) { //PBS 11/27/00: if not defined, get from site URL
siteinfo.host = args.host}
else {
local (urlParts = string.urlSplit (siteInfo.url));
local (host = urlParts [2]);
host = string.nthField (host, ':', 1); //strip port
siteInfo.host = host}};
bundle { //port
if defined (args.port) { //PBS 11/27/00: assume port 80 if not sent
siteinfo.port = args.port}
else {
siteInfo.port = 80}};
bundle { //rpcPath
if defined (args.rpcPath) { //PBS 11/27/00: assume /RPC2 if not sent
siteinfo.rpcPath = args.rpcPath}
else {
siteInfo.rpcPath = "/RPC2"}};
bundle { //canonical site name
if defined (args.siteName) { //PBS 11/27/00: get siteName via XML-RPC if not defined
siteInfo.siteName = args.sitename}
else {
if defined (args.s) { //short name
siteInfo.siteName = args.s}
else {
try { //12/17/00 JES: try to get the siteName from prefs
<<siteInfo.siteName = playlist.manila.getCanonicalNameFromPrefs (siteInfo.url)
bundle { //get the name from the siteInfoTable at user.manila.data.sites
local (adrinfo);
if manila.windowTypes.findSiteInfo (siteInfo.url, @adrinfo) {
siteInfo.siteName = adrinfo^.siteName}};
if siteInfo.siteName == "" {
siteInfo.siteName = manila.getSiteName (args.url)}}
else {
siteInfo.siteName = manila.getSiteName (args.url)}}}};
bundle { //display site name
if defined (args.displaySiteName) { //PBS 11/27/00: use canonical site name if not defined
siteInfo.displaySiteName = args.displaySiteName}
else {
if defined (args.d) { //short name
siteInfo.displaySiteName = args.d}
else {
siteInfo.displaySiteName == "";
bundle { //get the displaySiteName from the siteInfoTable at user.manila.data.sites
local (adrinfo);
if manila.windowTypes.findSiteInfo (siteInfo.url, @adrinfo) {
siteInfo.siteName = adrinfo^.displaySiteName}};
if siteInfo.displaySiteName == "" { //fall back to the canonical site name for displaySiteName
siteInfo.displaySiteName = siteInfo.siteName}}}};
bundle { //redirect URL
if defined (args.redirectUrl) { //PBS 11/27/00: if not defined, use referer
redirectURL = args.redirectURL}
else {
redirectUrl = pta^.requestHeaders.referer}};
bundle { //server accepts OPML
if defined (args.flAcceptsOpml) {
siteInfo.flAcceptsOpml = args.flAcceptsOpml}};
bundle { //username and password
siteInfo.username = "";
siteInfo.password = "";
if defined (args.u) {
siteinfo.username = base64.decode (args.u)};
if defined (args.p) {
siteinfo.password = base64.decode (args.p)};
}}
<<if siteInfo.username == "" or siteInfo.password == "" //get from prefs or prompt user
<<siteInfo.password = ""
<<playlist.manila.getUserNameAndPassword (siteinfo.URL, @siteInfo.username, @siteInfo.password)
else {
scripterror ("Can't edit with Radio because an error occured while decoding the GET arguments: " + tryerror)}};
on passwordError () {
try { //to clear the password
manila.windowTypes.setUsernameAndPassword (adrinfo, siteInfo.username, "")};
scriptError ("Can't edit with Radio because the username and password have not been set.")};
local (s = string.delete (pta^.path, 1, sizeOf ("/manilaEdit/")));
local (command = string.lower (string.nthField (s, '/', 1)));
try {
on createInfoCallback (adrinfo) {
if manila.windowTypes.getUsernameAndPassword (adrinfo, @siteInfo.username, @siteInfo.password) {
manila.windowTypes.setUsernameAndPassword (adrinfo, siteInfo.username, siteInfo.password);
return (true)}
else {
return (false)}};
if manila.windowTypes.findSiteInfo (siteinfo.url, @adrinfo, @createInfoCallback) {
bundle { //copy siteInfo items returned by the server
if defined (siteinfo.host) {
adrinfo^.host = siteinfo.host};
if defined (siteinfo.port) {
adrinfo^.port = siteinfo.port};
if defined (siteinfo.rpcPath) {
adrinfo^.rpcPath = siteinfo.rpcPath};
if defined (siteinfo.protocol) {
adrinfo^.protocol = siteinfo.protocol};
if defined (siteinfo.soapAction) {
adrinfo^.soapAction = siteinfo.soapAction};
if defined (siteinfo.siteName) {
adrinfo^.siteName = siteinfo.siteName};
if defined (siteinfo.displaySiteName) {
adrinfo^.displaySiteName = siteinfo.displaySiteName};
if defined (siteinfo.flAcceptsOpml) {
adrinfo^.flAcceptsOpml = siteinfo.flAcceptsOpml}};
case command {
"newstory" {
local (adrtype);
if Frontier.tools.windowTypes.findWindowType ("manilaMessage", @adrtype) {
local (inResponseTo = 0);
if defined (args.inResponseTo) {
inResponseTo = args.inResponseTo};
local (title = args.title);
if system.environment.isMac {
title = latinToMac.convert (title)};
if not adrtype^.newMessage (args.url, title, inResponseTo, boolean (args.flPromoteToStory)) {
scriptError ("Can't create story because there was a problem calling the manilaMessage.newMessage windowType script. It returned false.")}}};
<<bundle //old code
<<pike.checkSiteInfoTable (@siteinfo, "create story in Radio")
<<local (storyinfo)
<<new (tableType, @storyinfo)
<<new (tableType, @storyinfo.rendererInfo)
<<try
<<storyinfo.subject = args.title
<<if system.environment.isMac //PBS 03/22/01: convert title to Mac text
<<storyInfo.subject = latinToMac.convert (storyInfo.subject)
<<storyinfo.rendererInfo.name = args.rendererName
<<storyinfo.rendererInfo.flRenderOnEntry = boolean (args.flRenderOnEntry)
<<storyInfo.flPromoteToStory = boolean (args.flPromoteToStory)
<<if defined (args.inResponseTo)
<<storyInfo.inResponseTo = args.inResponseTo
<<if defined (args.flAcceptsOpml)
<<storyInfo.flServerAcceptsOpml = true
<<else
<<scripterror ("Can't edit in Radio because an error occured while decoding the GET arguments: " + tryerror)
<<local (adrStoryTable = pike.getNewStoryTableAddress (@siteinfo))
<<adrStoryTable^.siteinfo = siteinfo
<<adrStoryTable^.storyinfo = storyinfo
<<
<<thread.callScript (@pike.commands.newStory, {adrStoryTable})
"editstory" {
local (adrtype);
if Frontier.tools.windowTypes.findWindowType ("manilaMessage", @adrtype) {
local (flHomePage = false, adrwindow);
try {flHomePage = (args.url == args.redirectUrl)};
if not adrtype^.openMessage (args.url, args.msgnum, false, flHomePage, @adrwindow) {
scriptError ("Can't edit message because there was a problem calling the manilaMessage.openMessage windowType script. It returned false.")}}};
<<bundle //old code
<<pike.checkSiteInfoTable (@siteinfo, "edit story in Radio")
<<local (msgnum) //actually, we don't care if it's a number
<<try
<<msgnum = args.msgnum
<<else
<<scripterror ("Can't edit in Radio because an error occured while decoding the GET arguments: " + tryerror)
<<local (adrStoryTable = pike.getStoryTableAddress (@siteinfo, msgnum), flAlreadyOpen = false)
<<if defined (adrStoryTable^.outline) //12/17/00 JES: bring the outline to the front if already open
<<if window.isOpen (@adrStoryTable^.outline)
<<window.bringToFront (@adrStoryTable^.outline)
<<flAlreadyOpen = true
<<if not flAlreadyOpen //12/17/00 JES: only call the server if the outline wasn't already open
<<manila.message.checkOut (@siteInfo, msgNum) //check out the story: custody support
<<local (storyinfo = manila.message.get (@siteinfo, msgnum))
<<if defined (storyInfo.outline)
<<storyInfo.body = storyInfo.outline
<<pike.checkStoryInfoTable (@storyinfo, "edit story in Radio")
<<if defined (args.flAcceptsOpml)
<<storyInfo.flServerAcceptsOpml = true
<<if system.environment.isMac //convert from Latin to Mac text (if this is a Mac)
<<if defined (storyinfo.opml) //01/22/01 JES: only convert to Mac text if the body is opml
<<storyInfo.body = latinToMac.convert (storyInfo.body)
<<thread.callScript (@pike.commands.editStory, {siteinfo, storyinfo})
"editadvanceditem" {
local (item);
try { //get the itemtype
itemtype = args.itemtype}
else {
scripterror ("Can't edit in Radio because an error occured while decoding the GET arguments: " + tryerror)};
local (adrtype);
if Frontier.tools.windowTypes.findWindowType ("manilaTemplate", @adrtype) {
if not adrtype^.openTemplate (args.url, itemtype) {
scriptError ("Can't edit message because there was a problem calling the manilaTemplate.openTemplate windowType script. It returned false.")}}}}
<<bundle //old code
<<manila.advancedPref.checkOut (@siteInfo, itemType) //check it out
<<local (itemInfo = manila.advancedPref.get (@siteInfo, itemType))
<<itemInfo.type = itemType
<<
<<local (adrBuildDisplayRoutine, adrSerializeRoutine)
<<case string.lower (itemInfo.type) //12/30/00 JES: edit site structure with site structure editor
<<"sitestructure"
<<adrBuildDisplayRoutine = @playlist.manila.siteStructure.xmlToOutline
<<adrSerializeRoutine = @playlist.manila.siteStructure.outlineToXml
<<thread.callScript (@pike.commands.editAdvancedItem, {siteinfo, iteminfo, true, adrBuildDisplayRoutine, adrSerializeRoutine})
else { //unimplemented command
buildResponse (404, "NOT FOUND", "The object \"" + command + "\" doesn't exist.");
return (true)}}
else { //username/password error
passwordError ()}}
else { //the script that implements the command had an error
local (lowerError = string.lower (tryError));
if (lowerError contains "password") or (lowerError contains "not a member") {
passwordError ()}
else { //unhandled error
scriptError (tryError)}};
pta^.responseHeaders.location = redirectURL;
pta^.responseHeaders.URI = redirectURL;
buildResponse (302, "FOUND", "Found the page.")}
else { //an error -- show It Didn't Work page
webBrowser.bringToFront ();
local (htmlText = "<html><head><title>It Didn't Work</title></head>");
on add (s) {
htmlText = htmlText + s + "\r"};
add ("<body bgcolor=\"#FFFFFF\">");
add ("<blockquote><h2>It Didn't Work</h2>");
add ("<b>Radio UserLand reported an error:</b><p>" + tryError + "");
add ("</blockquote></body></html>");
pta^.code = 200;
pta^.responseBody = htmlText};
return (true)}
<<bundle //debugging
<<respond (@scratchpad.pt)
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.