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


on renewSubscriptions (flSubscribeAll = false) {
		<<9/17/09; 7:46:44 AM by DW
			<<Factored body of loop into renewOneSubscription to make testing much easier.
		<<9/7/09; 11:56:03 AM by DW
			<<Change in policy. If a cloud asks for http-post to request notification, then we ask for notification via http-post. This is a heuristic. Figuring if it doesn't speak XML-RPC on one side, it might not speak it on the other. (There's an app coming online that behaves this way. Early days in rssCloud.)
		<<8/25/09; 1:29:46 PM by DW
			<<Move the check for http-post inside an "else" -- to work around an (apparent) problem in the "with" statement? Weird.
		<<8/16/09; 9:37:30 AM by DW
			<<Minor tweaks to logging of renewal errors.
		<<8/16/09; 9:26:18 AM by DW
			<<Count and log renewal errors.
		<<8/15/09; 7:28:30 PM by DW
			<<Instead of hard-coding the renew at 24 hours, use the feed-level preference.
		<<8/10/09; 2:55:21 PM by DW
			<<Improved logging for "Please notify" events.
		<<7/25/09; 10:33:45 AM by DW
			<<Increment stats.ctCloudRenew.
		<<7/21/09; 7:48:22 PM by DW
			<<Add support for subscribing via REST, in addition to XML-RPC.
		<<7/19/09; 11:39:35 AM by DW
			<<Save the last cloud renew error string.
		<<7/17/09; 11:06:25 AM by DW
			<<Cribbed from xml.aggregator.updateSubscriptions.
		<<12/27/01; 5:55:13 PM by PBS
			<<If this is Frontier, check the firewall pref at adrdata^.prefs.flBehindFirewall since is not defined.
		<<12/9/01; 10:41:43 AM by DW
			<<People behind firewalls cannot receive notifications. 
			<<No point requesting them.
		<<1/7/01; 12:36:24 PM by DW
			<<Add support for HTTP-POST notification.
		<<1/6/01; 8:46:28 PM by DW
			<<Logging code is controlled by a preference.
		<<1/6/01; 3:46:22 PM by JES
			<<Changed the value of the 1st and 3rd parameters in the SOAP implementation to supply the correct actionURI and methodName.
		<<1/5/01; 7:54:01 PM by DW
			<<Add SOAP implementation. 
		<<1/5/01; 7:24:13 PM by DW
			<<Add a boolean parameter, if true, we resubscribe to all, our IP address might have changed.
		<<1/5/01; 5:32:13 PM by DW
			<<Created. Send a request to receive notification for channels that support clouds. 
			<<Only send a request once every twenty-four hours.
	local (adrdata = river2Suite.init ());
	if adrdata^.prefs.flRequestCloudNotify {
		local (startticks = clock.ticks (), htmltext = "");
		local (adrfeed, now = ());
		for adrfeed in @adrdata^.feeds {
			local (urlfeed = nameof (adrfeed^), linkfeed = "<a href=\"" + urlfeed + "\">" + adrfeed^.feedinfo.title + "</a>");
			river2Suite.initFeed (urlfeed);
			if defined (adrfeed^ {
				<<edit (adrfeed)
				local (flsubscribe = true);
				if not flSubscribeAll {
					if (now - adrfeed^.stats.whenLastCloudRenew) < adrfeed^.prefs.ctSecsBetwRenews { //8/15/09 by DW
						flsubscribe = false}};
				if flsubscribe {
					river2Suite.renewOneSubscription (adrfeed, @htmltext)}}};
					<<bundle //old code that was factored, 9/17/09 by DW
						<<local (startticksthisrenew = clock.ticks ())
						<<with adrfeed^
								<<if protocol == "xml-rpc"
									<<local (server = "xmlrpc://" + domain + ":" + port + path)
									<<[server].[registerProcedure] ("river2.feedUpdated", 5337, "/RPC2", "xml-rpc", {urlfeed})
									<<local (params = {"river2.feedUpdated", 5337, "/RPC2", "xml-rpc", {urlfeed}})
									<<betty.rpc.client (domain, port, registerProcedure, @params, rpcPath: path)
									<<if protocol == "http-post" //7/21/09 by DW
										<<bundle //request notification via to http-post, 9/7/09 by DW
											<<local (apiurl = "http://" + domain + ":" + port + path, params)
											<<new (tabletype, @params)
											<<params.notifyProcedure = ""
											<<params.port = 5337
											<<params.path = "/river2/notify"
											<<params.protocol = "http-post"
											<<params.url1 = urlfeed
											<<local (xmltext = tcp.httppost (apiurl, @params), xstruct)
											<<xml.compile (xmltext, @xstruct)
											<<local (adrnotifyresult = xml.getaddress (@xstruct, "notifyResult"))
											<<local (flsuccess = xml.getattributevalue (adrnotifyresult, "success"))
											<<if not flsuccess
												<<scripterror (xml.getattributevalue (adrnotifyresult, "msg"))
										<<bundle //old code -- request notification via XML-RPC, switch to http-post, 9/7/09 by DW
											<<local (apiurl = "http://" + domain + ":" + port + path, params)
											<<new (tabletype, @params)
											<<params.notifyProcedure = "river2.feedUpdated"
											<<params.port = 5337
											<<params.path = "/RPC2"
											<<params.protocol = "xml-rpc"
											<<params.url1 = urlfeed
											<<local (xmltext = tcp.httppost (apiurl, @params), xstruct)
											<<xml.compile (xmltext, @xstruct)
											<<local (adrnotifyresult = xml.getaddress (@xstruct, "notifyResult"))
											<<local (flsuccess = xml.getattributevalue (adrnotifyresult, "success"))
											<<if not flsuccess
												<<scripterror (xml.getattributevalue (adrnotifyresult, "msg"))
								<<if protocol == "soap"
									<<local (params = {"channelChanged", user.inetd.config.http.port, "/aggregator", "soap", {urlfeed}})
									<<soap.rpc.client (path, registerProcedure, @params, domain, port)
								<<htmltext = htmltext + linkfeed + ", "
								<<adrfeed^.stats.lastCloudRenewError = tryerror //7/19/09 by DW
								<<adrfeed^.stats.ctCloudRenewErrors++ //8/16/09 by DW
								<<log2.add (, "Notify", "Error renewing " + linkfeed + ": \"" + tryerror + ".\"", startticksthisrenew)
						<<adrfeed^.stats.whenLastCloudRenew = now
						<<adrfeed^.stats.ctCloudRenew++ //7/25/09 by DW
		if htmltext != "" {
			htmltext = string.delete (htmltext, sizeof (htmltext) - 1, 2); //pop off last comma + space
			htmltext = "Requested notification when the following feeds update: " + htmltext + ".";
			log2.add (, "Notify", htmltext, startticks)}}};
bundle { //test code
	renewSubscriptions (false)}

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.