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

system.verbs.builtins.radio.outliner.macros.subscribe

on subscribe () {
	<<Changes
		<<9/1/02; 9:00:32 PM by JES
			<<Only add the IM notification request info to the subscription sub-table if the sub-table exists.
		<<8/27/02; 1:06:58 AM by JES
			<<Get IM-based notification request info out of the URL, store it, and request notification if we're set up for it.
		<<4/3/02; 4:48:09 PM by JES
			<<If the user clicks the Cancel button in the confirmation dialog, or there's an error reading the outline, delete the subscription table. Prevents "author hasn't been defined" errors.
		<<3/26/02; 1:43:29 PM by JES
			<<If pta^.requestHeaders.Referer is not defined, return some text to the browser. Avoids an error message about Referer not being defined.
		<<3/12/02; 6:48:35 PM by DW
			<<Created.
	local (adrdata = radio.outliner.init ());
	local (pta = html.getpagetableaddress ());
	<<workspace.pt = pta^; edit (@workspace.pt)
	local (url = pta^.radioResponder.getArgs.url);
	local (author = pta^.radioResponder.getArgs.author);
	
	local (imProtocol, imUsername, imRegisterProcedure);
	on setImRegisterProcedure (adrsubscription) {
		local (adrim = @adrsubscription^.imRegisterProcedure);
		if not defined (adrim^) {
			new (tableType, adrim)};
		adrim^.protocol = imProtocol;
		adrim^.username = imUsername;
		adrim^.procedure = imRegisterProcedure};
	
	if adrdata^.prefs.messaging.flEnabled { //register for im-based notifications
		if defined (pta^.radioResponder.getArgs.imProtocol) {
			imProtocol = pta^.radioResponder.getArgs.imProtocol};
		if defined (pta^.radioResponder.getArgs.imUsername) {
			imUsername = pta^.radioResponder.getArgs.imUsername};
		if defined (pta^.radioResponder.getArgs.imRegisterProcedure) {
			imRegisterProcedure = pta^.radioResponder.getArgs.imRegisterProcedure};
		
		on register (protocol, screenname, procedure, myname) {
			local (adrdriver);
			try { //RPI is asynch -- no error messages
				if tcp.im.findDriver (protocol, @adrdriver) { //make sure the protocol is handled
					tcp.im.rpi.client (protocol, screenname, procedure, {protocol, myname})}}
			else {
				msg (tryError)}};
		
		case imProtocol {
			"aim" {
				if adrdata^.prefs.messaging.flAimEnabled {
					local (myscreenname = user.im.aim.username);
					register (imProtocol, imUsername, imRegisterProcedure, myscreenname)}};
			"jabber" {
				if adrdata^.prefs.messaging.flJabberEnabled {
					local (myscreenname = user.im.jabber.username);
					register (imProtocol, imUsername, imRegisterProcedure, myscreenname)}}}};
	
	local (adrsubscription = @adrdata^.subscriptions.[url]);
	if defined (adrsubscription^) {
		frontier.bringtofront ();
		radio.outliner.openBuddies (true, true);
		if adrdata^.prefs.messaging.flEnabled { //record im registration info
			setImRegisterProcedure (adrsubscription)};
		if defined (pta^.requestHeaders.Referer) {
			radio.webserver.redirect (pta^.requestHeaders.Referer);
			return}
		else {
			pta^.title = "Subscribe to Outline";
			local (s);
			if string.lower (author) endsWith "s" {
				s = author + "'"}
			else {
				s = author + "'s"};
			return ("Already subscribed to " + s + " Instant Outline.")}};
	
	local (localoutline);
	try {
		radio.outliner.read (url, @localoutline);
		if defined (adrsubscription^) {
			if adrdata^.prefs.messaging.flEnabled { //record im registration info
				setImRegisterProcedure (adrsubscription)}}}
	else {
		if defined (adrsubscription^) {
			delete (adrsubscription)};
		return ("Can't subscribe to the outline because there was an error reading it. \"" + tryerror + "\".")};
	
	frontier.bringtofront ();
	local (flSubscribed = false);
	if dialog.confirm ("Subscribe to " + author + "'s Instant Outline?") {
		new (tabletype, adrsubscription);
		adrsubscription^.author = author;
		<<adrsubscription^.outline = localoutline
		adrsubscription^.whenCreated = clock.now ();
		adrsubscription^.whenLastPoll = date (0);
		radio.outliner.openBuddies (true);
		if adrdata^.prefs.messaging.flEnabled { //record im registration info
			setImRegisterProcedure (adrsubscription)};
		flSubscribed = true}
	else { //delete the subscription table
		if defined (adrsubscription^) {
			delete (adrsubscription)}};
	if defined (pta^.requestHeaders.Referer) {
		radio.webserver.redirect (pta^.requestHeaders.Referer);
		if not flSubscribed {
			webBrowser.bringToFront ()}}
	else {
		pta^.title = "Subscribe to Outline";
		local (s);
		if string.lower (author) endsWith "s" {
			s = author + "'"}
		else {
			s = author + "'s"};
		if flSubscribed {
			return ("Congratulations, you have successfully subscribed to " + s + " Instant Outline. " + author + " now appears in your Buddies window.")}
		else {
			return ("Subscribe to outline cancelled.")}}}
<<bundle //test code
	<<html.setPageTableAddress (@workspace.pt)
	<<subscribe ()



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.