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

system.verbs.apps.Manila.windowTypes.types.manilaMessage.save

on save (adr, flClosing=false, subject=nil) {
	<<Save a manila message.
		<<7/8/01; 12:21:11 AM by JES
			<<Cribbed from various places, primarily pike.commands.save.
		<<9/22/01; 5:48:19 PM by JES
			<<Fixed a bug when doing a Save As, where the msg in the about window would display the old subject, instead of the new one.
	
	local (atts);
	window.attributes.getAll (@atts, adr);
	if atts.flReadOnly { //read only windows can't be saved
		return (true)};
	try { //if tcp.isOffline, show a dialog, and then return false
		if tcp.isOffline () {
			dialog.alert ("Can't save " + atts.title + " because you are working offline.");
			return (false)}};
	
	local (adrinfo = atts.adrSiteInfo, username, password);
	if manila.windowTypes.getUsernameAndPassword (adrinfo, @username, @password) {
		manila.windowTypes.setUsernameAndPassword (adrinfo, username, password)}
	else { //the user cancelled the password dialog -- return false
		return (false)};
	
	local (siteInfoTable = adrinfo^);
	siteInfoTable.username = username;
	siteInfoTable.password = password;
	
	if subject != nil { //this is a Save As: set the subject and window title
		atts.subject = subject};
	
	msg ("Saving \"" + adrinfo^.displaySiteName + ": " + atts.subject + "\"...");
	
	local (bodyType);
	if adrinfo^.flAcceptsOpml { //set bodyType to text/x-opml
		bodyType = "text/x-opml"}
	else { //set bodyType to text/x-outline-tabbed
		bodyType = "text/x-outline-tabbed"};
	
	local (windowInfo = manila.windowTypes.getWindowInfoTable (adr));
	
	local (rendererInfo);
	if defined (atts.rendererInfo) { //preserve rendererInfo
		rendererInfo = atts.rendererInfo};
	
	on error (s) {
		window.attributes.setOne ("savingError", s, adr);
		dialog.alert (tryError);
		return (false)};
	
	local (response);
	if defined (atts.msgnum) { //save a pre-existing message
		try { //do the RPC call to save the message
			if adrinfo^.flAcceptsOpml { //send the opml to the server
				local (opmlText = op.outlineToXml (adr, ownerEmail:adrinfo^.username));
				response = manila.message.set (adrinfo, atts.msgnum, atts.subject, opmlText, bodyType, windowInfo, rendererInfo)}
			else { //send the tabbed-outline to the server
				response = manila.message.set (adrinfo, atts.msgnum, atts.subject, string (adrItem^), bodyType, windowInfo, rendererInfo)}}
		else { //error making the RPC call
			return (error (tryError))};
		bundle { //set attributes, window title, needed for Save As to work
			local (t); new (tableType, @t);
			local (windowTitle = adrinfo^.displaySiteName + ": " + atts.subject);
			window.setTitle (adr, windowTitle);
			t.title = windowTitle;
			t.subject = atts.subject;
			window.attributes.addGroup (@t, adr)}}
	else { //save a new message
		try { //do the RPC call to save the message
			if adrinfo^.flAcceptsOpml { //send the opml to the server
				local (opmlText = op.outlineToXml (adr, ownerEmail:adrinfo^.username));
				response = manila.message.create (adrinfo, atts.subject, opmlText, bodyType, atts.inResponseTo, windowInfo, rendererInfo)}
			else { //send the tabbed-outline to the server
				response = manila.message.create (adrinfo, subject, string (adr^), bodyType, inResponseTo, windowInfo, rendererInfo)}}
		else { //error making the RPC call
			msg (""); //clear the about window
			return (error (tryError))};
		bundle { //add attributes
			local (t); new (tableType, @t);
			t.msgnum = response.msgnum;
			t.url = response.url;
			window.attributes.addGroup (@t, adr)};
		if atts.flAddToStoriesList {
			manila.message.addToStoriesList (adrinfo, response.msgnum)};
		if not flClosing { //check out the message
			manila.message.checkOut (adrinfo, response.msgnum)}};
	
	msg ("");
	return (true);
	};
	<<bundle //old code
		<<local (windowType = pike.getWindowType (adrItem))
		<<if windowType != ""
			<<
			<<if not (playlist.tcpOkay ()) //PBS 09/22/00: check offline status
				<<return (false)
			<<
			<<local (adrTable = parentOf (adrItem^))
			<<
			<<local (bodyType = "text/x-outline-tabbed")
			<<
			<<local (windowInfoTable = pike.buildWindowInfoTable (adrItem)) //PBS 02/05/00: get the window info table
			<<
			<<local (flServerAcceptsOpml = false)
			<<if defined (adrTable^.siteInfo.flAcceptsOpml) //11/03/00 JES
				<<flServerAcceptsOpml = adrTable^.siteInfo.flAcceptsOpml
			<<case windowType
				<<"advancedItems"
					<<local (itemTypeName = nameOf (adrTable^))
					<<msg ("Saving " + itemTypeName + "...")
					<<local (handlerName = pike.advancedItemToHandlerName (itemTypeName))
					<<try
						<<local (s = string (adrItem^))
						<<if defined (adrTable^.itemInfo.adrSerializeRoutine) //PBS 08/23/00: call serialization routine if there is one
							<<if defined (adrTable^.itemInfo.adrSerializeRoutine^)
								<<s = adrTable^.itemInfo.adrSerializeRoutine^ (adrTable)
						<<if defined (manila.[handlerName].set)
							<<manila.[handlerName].set (@adrTable^.siteinfo, s, windowInfoTable)
						<<else //PBS 11/20/00: use generic save routine
							<<manila.advancedPref.set (@adrTable^.siteInfo, itemTypeName, s, windowInfoTable)
					<<else
						<<savingError ("the " + itemTypeName)
					<<adrTable^.lastSaved = clock.now ()
				<<"savedStories"
					<<if flServerAcceptsOpml
						<<bodyType = "text/x-opml"
					<<local (subject = adrTable^.storyinfo.subject)
					<<msg ("Saving \"" + subject + "\"...")
					<<local (adrStory = @adrTable^.storyinfo)
					<<try
						<<if flServerAcceptsOpml //11/03/00 JES
							<<local (opmlText = op.outlineToXml (adrItem, ownerEmail:adrTable^.siteInfo.username))
							<<manila.message.set (@adrTable^.siteinfo, adrStory^.msgnum, adrStory^.subject, opmlText, bodyType, windowInfoTable) //PBS 02/05/00: added windowInfoTable parameter
						<<else
							<<manila.message.set (@adrTable^.siteinfo, adrStory^.msgnum, adrStory^.subject, string (adrItem^), bodyType, windowInfoTable) //PBS 02/05/00: added windowInfoTable parameter
					<<else
						<<temp.errorText = tryError
						<<savingError ("\"" + subject + "\"")
					<<adrTable^.lastSaved = clock.now ()
				<<"newStories"
					<<if flServerAcceptsOpml
						<<bodyType = "text/x-opml"
					<<local (subject = adrTable^.storyinfo.subject)
					<<msg ("Saving \"" + subject + "\"...")
					<<
					<<local (resulttable)
					<<try
						<<local (inResponseTo = 0)
						<<if defined (adrTable^.storyInfo.inResponseTo)
							<<inResponseTo = adrTable^.storyInfo.inResponseTo
						<<if flServerAcceptsOpml //11/03/00 JES
							<<local (opmlText = op.outlineToXml (adrItem, ownerEmail:adrTable^.siteInfo.username))
							<<resulttable = manila.message.create (@adrTable^.siteinfo, subject, opmlText, bodyType, inResponseTo, windowInfoTable)
						<<else
							<<resulttable = manila.message.create (@adrTable^.siteinfo, subject, string (adrItem^), bodyType, inResponseTo, windowInfoTable)
					<<else
						<<temp.errorText = tryError
						<<savingError ("\"" + subject + "\"")
					<<
					<<if not flClosing //copy to savedStories
						<<local (adrStoryTable = pike.getStoryTableAddress (@adrTable^.siteinfo, resulttable.msgnum))
						<<adrStoryTable^.siteinfo = adrTable^.siteinfo
						<<adrStoryTable^.storyinfo = resulttable
						<<
						<<table.move (adrItem, adrStoryTable)
						<<pike.setWindowTitle (adrStoryTable)
						<<
						<<adrTable^.storyinfo.url = adrStoryTable^.storyinfo.url //12/20/00 JES: make view in browser work for new stories
						<<
						<<adrStoryTable^.lastSaved = clock.now ()
					<<
					<<local (flAddToStoriesList = true) //PBS 08/22/00: if flAddToStoriesList exists and is false, don't add to stories. This way we can have messages that aren't stories.
					<<if defined (adrTable^.storyInfo.flAddToStoriesList)
						<<if not (adrTable^.storyInfo.flAddToStoriesList)
							<<flAddToStoriesList = false
					<<if flAddToStoriesList
						<<manila.message.addToStoriesList (@adrTable^.siteinfo, resulttable.msgnum)

bundle { //debugging
	save (window.frontmost ())}



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.