📄 nsxmlrpcclient.js
字号:
return false; }, /* Generate the XML-RPC request body */ _generateRequestBody: function(writer, methodName, methodArgs) { writer.startElement('methodCall'); writer.startElement('methodName'); writer.write(methodName); writer.endElement('methodName'); writer.startElement('params'); for (var i = 0; i < methodArgs.length; i++) { writer.startElement('param'); this._generateArgumentBody(writer, methodArgs[i]); writer.endElement('param'); } writer.endElement('params'); writer.endElement('methodCall'); }, /* Write out a XML-RPC parameter value */ _generateArgumentBody: function(writer, obj) { writer.startElement('value'); var sType = this._typeOf(obj); switch (sType) { case 'PRUint8': case 'PRUint16': case 'PRInt16': case 'PRInt32': obj=obj.QueryInterface(Components.interfaces['nsISupports' + sType]); writer.startElement('i4'); writer.write(obj.toString()); writer.endElement('i4'); break; case 'PRBool': obj=obj.QueryInterface(Components.interfaces.nsISupportsPRBool); writer.startElement('boolean'); writer.write(obj.data ? '1' : '0'); writer.endElement('boolean'); break; case 'Char': case 'CString': obj=obj.QueryInterface(Components.interfaces['nsISupports' + sType]); writer.startElement('string'); writer.write(obj.toString()); writer.endElement('string'); break; case 'Float': case 'Double': obj=obj.QueryInterface(Components.interfaces['nsISupports' + sType]); writer.startElement('double'); writer.write(obj.toString()); writer.endElement('double'); break; case 'PRTime': obj = obj.QueryInterface( Components.interfaces.nsISupportsPRTime); var date = new Date(obj.data) writer.startElement('dateTime.iso8601'); writer.write(iso8601Format(date)); writer.endElement('dateTime.iso8601'); break; case 'InputStream': obj = obj.QueryInterface(Components.interfaces.nsIInputStream); obj = toScriptableStream(obj); writer.startElement('base64'); streamToBase64(obj, writer); writer.endElement('base64'); break; case 'Array': obj = obj.QueryInterface( Components.interfaces.nsISupportsArray); writer.startElement('array'); writer.startElement('data'); for (var i = 0; i < obj.Count(); i++) this._generateArgumentBody(writer, obj.GetElementAt(i)); writer.endElement('data'); writer.endElement('array'); break; case 'Dictionary': obj = obj.QueryInterface(Components.interfaces.nsIDictionary); writer.startElement('struct'); var keys = obj.getKeys({}); for (var k = 0; k < keys.length; k++) { writer.startElement('member'); writer.startElement('name'); writer.write(keys[k]); writer.endElement('name'); this._generateArgumentBody(writer, obj.getValue(keys[k])); writer.endElement('member'); } writer.endElement('struct'); break; default: throw Components.Exception('Unsupported argument', null, null, obj); } writer.endElement('value'); }, /* Determine type of a nsISupports primitive, array or dictionary. */ _typeOf: function(obj) { // XPConnect alows JS to pass in anything, because we are a regular // JS object to it. So we have to test rigorously. if (typeof obj != 'object') return 'Unknown'; // Anything else not nsISupports is not allowed. if (typeof obj.QueryInterface != 'function') return 'Unknown'; // Now we will have to eliminate by trying all possebilities. try { obj.QueryInterface(Components.interfaces.nsISupportsPRUint8); return 'PRUint8'; } catch(e) {} try { obj.QueryInterface(Components.interfaces.nsISupportsPRUint16); return 'PRUint16'; } catch(e) {} try { obj.QueryInterface(Components.interfaces.nsISupportsPRInt16); return 'PRInt16'; } catch(e) {} try { obj.QueryInterface(Components.interfaces.nsISupportsPRInt32); return 'PRInt32'; } catch(e) {} try { obj.QueryInterface(Components.interfaces.nsISupportsPRBool); return 'PRBool'; } catch(e) {} try { obj.QueryInterface(Components.interfaces.nsISupportsChar); return 'Char'; } catch(e) {} try { obj.QueryInterface(Components.interfaces.nsISupportsCString); return 'CString'; } catch(e) {} try { obj.QueryInterface(Components.interfaces.nsISupportsFloat); return 'Float'; } catch(e) {} try { obj.QueryInterface(Components.interfaces.nsISupportsDouble); return 'Double'; } catch(e) {} try { obj.QueryInterface(Components.interfaces.nsISupportsPRTime); return 'PRTime'; } catch(e) {} try { obj.QueryInterface(Components.interfaces.nsIInputStream); return 'InputStream'; } catch(e) {} try { obj.QueryInterface(Components.interfaces.nsISupportsArray); return 'Array'; } catch(e) {} try { obj.QueryInterface(Components.interfaces.nsIDictionary); return 'Dictionary'; } catch(e) {} // Not a supported type return 'Unknown'; }, // Response parsing state _valueStack: [], _currValue: null, _cdata: null, parse: function(doc) { var node = doc.firstChild; var result; if (node.nodeType == DOMNode.TEXT_NODE) node = node.nextSibling; if ((node.nodeType != DOMNode.ELEMENT_NODE) || (node.nodeName != 'methodResponse')) { throw Components.Exception('Expecting a methodResponse', null, null, doc); } node = node.firstChild; if (node.nodeType == DOMNode.TEXT_NODE) node = node.nextSibling; if (node.nodeType != DOMNode.ELEMENT_NODE) throw Components.Exception('Expecting a params or fault', null, null, doc); if (node.nodeName == 'params') { node = node.firstChild; if (node.nodeType == DOMNode.TEXT_NODE) node = node.nextSibling; if ((node.nodeType != DOMNode.ELEMENT_NODE) || (node.nodeName != 'param')) { throw Components.Exception('Expecting a param', null, null, doc); } result = this.parseValue(node.firstChild); } else if (node.nodeName == 'fault') { this._foundFault = true; result = this.parseFault(node.firstChild); } else { throw Components.Exception('Expecting a params or fault', null, null, doc); } debug('Parse finished'); return result; }, parseValue: function(node) { var cValue = new Value(); if (node && (node.nodeType == DOMNode.TEXT_NODE)) node = node.nextSibling; if (!node || (node.nodeType != DOMNode.ELEMENT_NODE) || (node.nodeName != 'value')) { throw Components.Exception('Expecting a value', null, null, node); } node = node.firstChild; if (!node) return cValue; if (node.nodeType == DOMNode.TEXT_NODE){ if (!node.nextSibling) { cValue.value = node.nodeValue; return cValue; } else { node = node.nextSibling; } } if (node.nodeType != DOMNode.ELEMENT_NODE) throw Components.Exception('Expecting a value type', null, null, node); switch (node.nodeName) { case 'string': cValue.value = this.parseString(node.firstChild); break; case 'i4': case 'int': cValue.type = this.INT; cValue.value = this.parseString(node.firstChild); break; case 'boolean': cValue.type = this.BOOLEAN; cValue.value = this.parseString(node.firstChild); break; case 'double': cValue.type = this.DOUBLE; cValue.value = this.parseString(node.firstChild); break; case 'dateTime.iso8601': cValue.type = this.DATETIME; cValue.value = this.parseString(node.firstChild); break; case 'base64': cValue.type = this.BASE64; cValue.value = this.parseString(node.firstChild); break; case 'struct': cValue.type = this.STRUCT; this.parseStruct(cValue, node.firstChild); break; case 'array': cValue.type = this.ARRAY; this.parseArray(cValue, node.firstChild); break; default: throw Components.Exception('Expecting a value type', null, null, node); } return cValue; }, parseString: function(node) { value = ''; while (node) { if (node.nodeType != DOMNode.TEXT_NODE) throw Components.Exception('Expecting a text node', null, null, node); value += node.nodeValue; node = node.nextSibling; } return value; }, parseStruct: function(struct, node) { while (node) { if (node.nodeType == DOMNode.TEXT_NODE) node = node.nextSibling; if (!node) return; if ((node.nodeType != DOMNode.ELEMENT_NODE) || (node.nodeName != 'member')) { throw Components.Exception('Expecting a member', null, null, node); } this.parseMember(struct, node.firstChild); node = node.nextSibling; } }, parseMember: function(struct, node) { var cValue; if (node.nodeType == DOMNode.TEXT_NODE) node = node.nextSibling; if (!node || (node.nodeType != DOMNode.ELEMENT_NODE) || (node.nodeName != 'name')) { throw Components.Exception('Expecting a name', null, null, node); } struct.name = this.parseString(node.firstChild); cValue = this.parseValue(node.nextSibling); struct.appendValue(cValue.value); }, parseArray: function(array, node) { if (node.nodeType == DOMNode.TEXT_NODE) node = node.nextSibling; if (!node || (node.nodeType != DOMNode.ELEMENT_NODE) || (node.nodeName != 'data')) { throw Components.Exception('Expecting array data', null, null, node); } for (node = node.firstChild; node; node = node.nextSibling) { if (node.nodeType == DOMNode.TEXT_NODE)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -