Monday, November 08, 2010 at 12:07 AM.
system.verbs.builtins.xml.alidl.get
on get (adrhandlers, path, protocol, flObscureIp = false) {
<<Changes
<<3/5/01; 3:41:09 PM by DW
<<Add flObscureIp optional param, makes it possible to produce sample files without publishing the IP address of a specific machine.
<<3/5/01; 12:34:51 PM by DW
<<Added SOAP 1.1 support.
<<3/4/01; 9:00:07 PM by DW
<<Created.
local (xmltext = "", indentlevel = 0);
on add (s) {
xmltext = xmltext + string.filledstring ("\t", indentlevel) + s + "\r\n"};
add ("<?xml version=\"1.0\"?>");
add ("<alidl version=\"1.0\" whenLastUpdated=\"" + date.netstandardstring (clock.now ()) + "\">"); indentlevel++;
bundle { //add the head
add ("<head>"); indentlevel++;
local (ip);
if flObscureIp {
ip = "0.0.0.0"}
else {
ip = tcp.dns.getMyDottedId ()};
add ("<server>" + ip + "</server>");
add ("<port>" + user.inetd.config.http.port + "</port>");
add ("<path>" + path + "</path>");
case protocol {
"xml-rpc" {
add ("<protocol>" + protocol + "</protocol>")};
"soap" {
add ("<protocol version=\"1.1\">" + protocol + "</protocol>")}};
add ("</head>"); indentlevel--};
bundle { //add the body
add ("<body>"); indentlevel++;
on visit (adrtable, path) {
local (adr, name);
for adr in adrtable {
name = nameof (adr^);
if name beginswith "#" {
continue};
if path != "" {
name = path + "." + name};
case typeof (adr^) {
addresstype {
visit (adr^, name)};
tabletype {
visit (adr, name)};
scripttype {
local (s, params = {});
bundle { //set s to the "on" header for the script, or the empty string if it doesn't have one
s = string (adr^);
loop {
firstline = string.nthfield (s, "\r", 1);
if firstline beginswith "on" { //found it
s = firstline - "{";
break};
s = string.delete (s, 1, sizeof (firstline) + 1);
if s == "" {
break}}};
if s beginswith "on" {
s = string.nthfield (s, "(", 2);
s = string.trimwhitespace (string.nthfield (s, ")", 1));
if sizeof (s) > 0 {
loop {
if string.countfields (s, ",") == 1 {
params = params + {string.trimwhitespace (s)};
break}
else {
local (field = string.nthfield (s, ",", 1));
s = string.delete (s, 1, sizeof (field) + 1);
params = params + {string.trimwhitespace (field)}}}}};
<<msg ("betty.rpc.getAlidl: " + name)
case protocol {
"xml-rpc" {
add ("<procedure name=\"" + name + "\" ctParams=\"" + sizeof (params) + "\">"); indentlevel++};
"soap" {
<<3/5/01; 1:10:07 PM by DW
<<name contains a dotted path to the object. This won't work in SOAP. We allowed for this with the optional path attribute. We split the name into two parts.
<<
local (procname = name, procpath = "");
if procname contains "." {
procname = string.nthfield (procname, ".", string.countfields (procname, "."));
procpath = string.mid (name, 1, sizeof (name) - sizeof (procname) - 1);
procpath = string.replaceall (procpath, ".", "/")};
add ("<procedure path=\"" + procpath + "/\" name=\"" + procname + "\" ctParams=\"" + sizeof (params) + "\">"); indentlevel++}};
local (paramname, optional = "");
for paramname in params {
if paramname contains "=" {
optional = " optional=\"true\"";
paramname = string.trimwhitespace (string.nthfield (paramname, "=", 1))};
add ("<param name=\"" + paramname + "\"" + optional + "/>")};
add ("</procedure>"); indentlevel--}}}};
visit (adrhandlers, "");
add ("</body>"); indentlevel--};
add ("</alidl>"); indentlevel--;
return (xmltext)};
bundle { //test code
on writefile (s, foldername) {
local (productname);
if system.environment.ispike {
productname = "radio"}
else {
productname = "frontier"};
local (f = "c:\\program files\\radio userland\\www\\alidlExamples\\" + foldername + "\\" + productname + ".xml");
file.surefilepath (f);
file.writewholefile (f, s)};
<<webbrowser.openurl ("http://www.ourfavoritesongs.com/users/dave@userland.com/alidlExamples/" + foldername + "/" + productname + ".xml")
writefile (get (@user.soap.rpcHandlers, "/", "soap", true), "soap");
writefile (get (@user.betty.rpcHandlers, "/RPC2", "xml-rpc", true), "xmlrpc")}
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.