Skip to content

Instantly share code, notes, and snippets.

@kovrov
Created August 30, 2012 23:21
Show Gist options
  • Save kovrov/3544715 to your computer and use it in GitHub Desktop.
Save kovrov/3544715 to your computer and use it in GitHub Desktop.
xml-rpc qml javascript utils
.pragma library
function parseResponse(xml) {
try {
if (xml.documentElement.firstChild.tagName === 'fault') {
throw new Error("TODO: XML-RPC fault")
}
return _parseValue(_querySelector(xml.documentElement, "params param value"))
}
catch (e) {
throw new Error("Error parsing XML-RPC response")
}
}
function _querySelector(node, selector) {
var a = selector.split(' ')
for (var i in a) {
node = _firstChildByTagName(node, a[i])
if (!node)
break
}
return node
}
function _firstChildByTagName(node, name) {
for (var i=0; i<node.childNodes.length; i++) {
if (node.childNodes[i].tagName === name) {
return node.childNodes[i]
}
}
}
function _firstChildNode(node) {
for (var i=0; i<node.childNodes.length; i++) {
if (node.childNodes[i].nodeType === 1) {
return node.childNodes[i]
}
}
}
function _parseValue(node) {
var type_node = _firstChildNode(node)
switch (type_node.tagName) {
case 'array':
var res = []
var data = _firstChildByTagName(type_node, "data")
for (var i=0; i<data.childNodes.length; i++) {
var value = data.childNodes[i]
if (value.tagName === 'value') {
res.push(_parseValue(value))
}
}
return res
case 'base64':
return Utf8.fromBase64(type_node.firstChild.data)
case 'boolean':
return type_node.firstChild.data !== '0' || type_node.firstChild.data === 'true'
case 'dateTime.iso8601':
break
case 'double':
break
case 'i4':
case 'int':
break
case 'string':
return type_node.firstChild ? type_node.firstChild.data : undefined
case 'struct':
var res = {}
for (var i=0; i<type_node.childNodes.length; i++) {
var member = type_node.childNodes[i]
if (member.tagName === 'member') {
res[_firstChildByTagName(member, "name").firstChild.data] =
_parseValue(_firstChildByTagName(member, "value"))
}
}
return res
case 'nil':
break
default:
break
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment