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

system.verbs.builtins.soap.encode.array

on array (adrmsg, listvalue, adrparent, name, customStructType=nil, customNamespace=nil, customNamespaceURI=nil, flEntityEncodeHighAscii=false) {
	<<Changes:
		<<03/19/01; 3:24:31 PM by JES
			<<Added support for encoding arrays of structs.
		<<03/27/01; 5:44:21 PM by JES
			<<Serialize doubles as type "xsd:float", instead of "xsd:double", since float means 32-bit floating point number, and double means 64-bit floating point number. In Frontier, a doubleType is 32-bits.
		<<03/29/01; 4:33:39 AM by JES
			<<Added xsi:type="SOAP-ENV:Array" attribute to the array element for interop with Apache SOAP.
		<<04/03/01; 7:51:02 PM by JES
			<<New optional parameter, flEntityEncodeHighAscii, specifies whether to entity-encode high-ascii characters when encoding strings. Default is false. This is passed to soap.encode.main and soap.encode.simpleType.
		<<04/07/01; 7:23:05 PM by JES
			<<Changed name of customArrayType parameter to customStructType. Pass customStructType, customNamespace and customNamespaceURI in the call to soap.encode.main.
	local (item, prevtype, flonetype = true);
	local (nsSchemaDataPrefix = soap.constants.nsSchemaDataPrefix);
	local (adrelement = soap.xmlutils.addElement (adrparent, name));
	bundle { //add the xsi:type attribute
		soap.xmlutils.addAttributeValue (adrelement, soap.constants.nsSchemaPrefix + ":type", soap.constants.nsEncodingPrefix + ":Array")};
	for item in listvalue {
		local (itemtype = typeof (item));
		if prevtype {
			flonetype = (itemtype == prevtype)}
		else {
			prevtype = itemtype};
		if not flonetype {
			break}};
	local (type);
	if sizeOf (listvalue) == 0 { //11/15/00 JES: handle empty arrays
		type = "ur-type"}
	else {
		if flonetype {
			case (prevtype) {
				stringType {
					type = "string"};
				charType {
					type = "byte"};
				longType;
				longType;
				intType {
					type = "int"};
				booleanType {
					type = "boolean"};
				doubleType {
					type = "float"};
					<<type = "double"
				shortType {
					type = "short"};
				binaryType {
					type = "base64"}}
			else { //it's a custom type -- most likely an array of structs
				bundle { //reality checks
					if customNamespace == nil {
						scriptError ("Can't encode \"" + name + "\" array because no namespace was specified.")};
					if customNamespaceURI == nil {
						scriptError ("Can't encode \"" + name + "\" array because no namespace URI was specified.")};
					if customStructType == nil {
						scripterror ("Can't encode \"" + name + "\" array because no type was specified.")}};
				soap.xmlutils.declareNamespaceInElement (adrelement, customNamespace, customNamespaceURI);
				nsSchemaDataPrefix = customNamespace;
				type = customStructType}}
		else {
			type = "ur-type"}};
	local (arraytype = nsSchemaDataPrefix + ":" + type + "[" + sizeOf (listvalue) + "]");
	soap.xmlutils.addAttributeValue (adrelement, soap.constants.nsEncodingPrefix + ":arrayType", arraytype);
	for item in listvalue {
		case typeOf (item) {
			tableType { //03/18/2001 JES: support arrays of structs
				soap.encode.main (adrmsg, item, adrelement, "item", customStructType, customNamespace, customNamespaceURI, flEntityEncodeHighAscii)}}
		else {
			soap.encode.simpleType (adrmsg, item, adrelement, "item", not flonetype, flEntityEncodeHighAscii)}};
	return (adrelement)}



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.