📄 xmlrpc.js
字号:
switch (child.tagName){ case "string": var s="" //Mozilla has many textnodes with a size of 4096 chars each instead of one large one. //They all need to be concatenated. for(var j=0;j<child.childNodes.length;j++){ s+=new String(child.childNodes.item(j).nodeValue); } return s; case "int": case "i4": case "double": return (child.firstChild) ? new Number(child.firstChild.nodeValue) : 0; case "boolean": return Boolean(isNaN(parseInt(child.firstChild.nodeValue)) ? (child.firstChild.nodeValue == "true") : parseInt(child.firstChild.nodeValue)); case "base64": return parseBase64(child); case "dateTime.iso8601": return parseDateTime(child); case "array": return parseArray(child); case "struct": return parseStruct(child); case "nil": //for python None todo: ??? is this valid XML-RPC return null; default: throw new mod.MalformedXmlRpc("'string','int','i4','double','boolean','base64','dateTime.iso8601','array' or 'struct' element expected.\nFound: '" + child.tagName + "'"); } } } if(node.firstChild){ var s="" //Mozilla has many textnodes with a size of 4096 chars each instead of one large one. //They all need to be concatenated. for(var j=0;j<node.childNodes.length;j++){ s+=new String(node.childNodes.item(j).nodeValue); } return s; }else{ return ""; } }catch(e){ throw new mod.MalformedXmlRpc("'value' element could not be parsed.",null,e); } } /** Parses a base64 element. @param node The base64 element. @return A string with the decoded base64. */ var parseBase64=function(node){ try{ var s = node.firstChild.nodeValue; return s.decode("base64"); }catch(e){ throw new mod.MalformedXmlRpc("'base64' element could not be parsed.",null,e); } } /** Parses a dateTime.iso8601 element. @param node The dateTime.iso8601 element. @return A JavaScript date. */ var parseDateTime=function(node){ try{ if(/^(\d{4})-?(\d{2})-?(\d{2})T(\d{2}):?(\d{2}):?(\d{2})/.test(node.firstChild.nodeValue)){ return new Date(Date.UTC(RegExp.$1, RegExp.$2-1, RegExp.$3, RegExp.$4, RegExp.$5, RegExp.$6)); }else{ //todo error message throw new mod.MalformedXmlRpc("Could not convert the given date."); } }catch(e){ throw new mod.MalformedXmlRpc("'dateTime.iso8601' element could not be parsed.",null,e); } } /** Parses an array element. @param node The array element. @return An Array. */ var parseArray=function(node){ try{ for(var i=0;i<node.childNodes.length;i++){ var child = node.childNodes.item(i); if (child.nodeType == 1){ switch (child.tagName){ case "data": return parseData(child); default: throw new mod.MalformedXmlRpc("'data' element expected.\nFound: '" + child.tagName + "'"); } } } throw new mod.MalformedXmlRpc("'data' element expected. But not found."); }catch(e){ throw new mod.MalformedXmlRpc("'array' element could not be parsed.",null,e); } } /** Parses a data element. @param node The data element. @return The value of a data element. */ var parseData=function(node){ try{ var rslt = new Array(); for(var i=0;i<node.childNodes.length;i++){ var child = node.childNodes.item(i); if (child.nodeType == 1){ switch (child.tagName){ case "value": rslt.push(parseValue(child)); break; default: throw new mod.MalformedXmlRpc("'value' element expected.\nFound: '" + child.tagName + "'"); } } } return rslt; }catch(e){ throw new mod.MalformedXmlRpc("'data' element could not be parsed.",null,e); } } /** Parses a struct element. @param node The struct element. @return A JavaScript object. Struct memembers are properties of the object. */ var parseStruct=function(node){ try{ var struct = new Object(); for(var i=0;i<node.childNodes.length;i++){ var child = node.childNodes.item(i); if (child.nodeType == 1){ switch (child.tagName){ case "member": var member = parseMember(child); //returns [name, value] if(member[0] != ""){ struct[member[0]] = member[1]; } break; default: throw new mod.MalformedXmlRpc("'data' element expected.\nFound: '" + child.tagName + "'"); } } } return struct; }catch(e){ throw new mod.MalformedXmlRpc("'struct' element could not be parsed.",null,e); } } /** Parses a member element. @param node The member element. @return Array containing [memberName, value]. */ var parseMember=function(node){ try{ var name=""; var value=null; for(var i=0;i<node.childNodes.length;i++){ var child = node.childNodes.item(i); if (child.nodeType == 1){ switch (child.tagName){ case "value": value = parseValue(child); break; case "name": if(child.hasChildNodes()){ name = new String(child.firstChild.nodeValue); } break; default: throw new mod.MalformedXmlRpc("'value' or 'name' element expected.\nFound: '" + child.tagName + "'"); } } } /*if(name == ""){ throw new mod.MalformedXmlRpc("Name for member not found/convertable."); }else{ return new Array(name, value); }*/ return [name, value]; }catch(e){ throw new mod.MalformedXmlRpc("'member' element could not be parsed.",null,e); } } /** Parses a fault element. @param node The fault element. @return A Fault Exception object. */ var parseFault = function(node){ try{ for(var i=0;i<node.childNodes.length;i++){ var child = node.childNodes.item(i); if (child.nodeType == 1){ switch (child.tagName){ case "value": var flt = parseValue(child); return new mod.Fault(flt.faultCode, flt.faultString); default: throw new mod.MalformedXmlRpc("'value' element expected.\nFound: '" + child.tagName + "'"); } } } throw new mod.MalformedXmlRpc("'value' element expected. But not found."); }catch(e){ throw new mod.MalformedXmlRpc("'fault' element could not be parsed.",null,e); } } /** Class for creating XML-RPC methods. Calling the created method will result in an XML-RPC call to the service. The return value of this call will be the return value of the RPC call. RPC-Faults will be raised as Exceptions. Asynchronous operation: If the last parameter passed to the method is an XMLRPCAsyncCallback object, then the remote method will be called asynchronously. The results and errors are passed to the callback. */ mod.XMLRPCMethod =Class("XMLRPCMethod", function(publ){ var postData = function(url, user, pass, data, callback){ if(callback == null){ var rslt = urllib.postURL(url, user, pass, data, [["Content-Type", "text/xml"]]); return rslt; }else{ urllib.postURL(url, user, pass, data, [["Content-Type", "text/xml"]], callback); } } var handleResponse=function(resp){ var status=null; try{//see if the server responded with a response code 200 OK. status = resp.status; }catch(e){ } if(status == 200){ var respDoc=null; try{ respDoc = resp.responseXML; }catch(e){ } var respTxt = ""; try{ respTxt=resp.responseText; }catch(e){ } if(respDoc == null){ if(respTxt == null || respTxt == ""){ throw new mod.MalformedXmlRpc("The server responded with an empty document.", ""); }else{ return mod.unmarshall(respTxt); } }else{ //use the respDoc directly so the xml does not have to be parsed. return mod.unmarshallDoc(respDoc, respTxt); } }else{ throw new mod.InvalidServerResponse(status); } } var getXML = function(methodName, args){ var data='<?xml version="1.0"?><methodCall><methodName>' + methodName + '</methodName>'; if (args.length>0){ data += "<params>"; for(var i=0;i<args.length;i++){ data += '<param><value>' + mod.marshall(args[i]) + '</value></param>'; } data += '</params>'; } data += '</methodCall>'; return data; } /** Initializes the XML-RPC method.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -