# HG changeset patch # User Emmanuel Gil Peyrot # Date 1328113388 -3600 # Node ID bcb5b7c2c3d31769e65018d37bf453cf200a4952 # Parent 91f18fdc0e2cdedb09d14328ed1d03902a6d97bf Add a dataforms plugin and make disco#info use this one. diff --git a/plugins/dataforms.js b/plugins/dataforms.js new file mode 100644 --- /dev/null +++ b/plugins/dataforms.js @@ -0,0 +1,140 @@ +'use strict'; + +/** + Copyright (c) 2012, Emmanuel Gil Peyrot + + Permission to use, copy, modify, and/or distribute this software for any + purpose with or without fee is hereby granted, provided that the above + copyright notice and this permission notice appear in all copies. + + THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +*/ + +///////// +//Disco// +///////// + +(function() { + var form_types = ['cancel', 'form', 'result', 'submit']; + var field_types = ['boolean', 'fixed', 'hidden', 'jid-multi', 'jid-single', 'list-multi', 'list-single', 'text-multi', 'text-private', 'text-single']; + + var parseFields = function(fieldsList) { + var fields = []; + + for (var i = 0; i < fieldsList.length; i++) { + var field = {}; + var child = fieldsList[i]; + + var type = child.getAttributeNS(null, 'type'); + if (field_types.indexOf(type) === -1) + field.type = type; + else + field.type = 'text-single'; + + var label = child.getAttributeNS(null, 'label'); + if (label) + field.label = label; + + var _var = child.getAttributeNS(null, 'var'); + if (_var) + field.var = _var; + + var desc = child.getElementsByTagNameNS(Lightstring.namespaces['dataforms'], 'desc'); + if (desc.length > 1) + ; //TODO: emit a warning if there is more than one. + if (0 in desc) + field.desc = desc[0]; + + var required = child.getElementsByTagNameNS(Lightstring.namespaces['dataforms'], 'required'); + if (required.length > 1) + ; //TODO: emit a warning if there is more than one. + field.required = (0 in required) + + var values = child.getElementsByTagNameNS(Lightstring.namespaces['dataforms'], 'value'); + if (values.length) { + field.values = []; + for (var j = 0; j < values.length; j++) + field.values.push(values[j].textContent); + } + + var options = child.getElementsByTagNameNS(Lightstring.namespaces['dataforms'], 'option'); + if (options.length) { + field.options = []; + for (var j = 0; j < options.length; j++) { + var option = {}; + + var opt = options[j]; + + var val = opt.getElementsByTagNameNS(Lightstring.namespaces['dataforms'], 'value'); + if (val.length > 1) + ; //TODO: emit a warning if there is more than one. + if (0 in val) + option.value = val[0]; + + var optionLabel = opt.getAttributeNS(null, 'label'); + if (optionLabel) + option.label = optionLabel; + + field.options.push(option); + } + } + + fields.push(field); + } + + return fields; + }; + + Lightstring.plugins['disco'] = { + namespaces: { + dataforms: 'jabber:x:data' + }, + methods: { + parse: function(x) { + if (x.namespaceURI !== Lightstring.namespaces['dataforms'] || x.localName !== 'x') + return null; + + var form = {}; + + var type = x.getAttributeNS(null, 'type'); + if (form_types.indexOf(type) === -1) + return; //TODO: emit a warning too? + form.type = type; + + var title = x.getElementsByTagNameNS(Lightstring.namespaces['dataforms'], 'title'); + if (title.length > 1) + ; //TODO: emit a warning if there is more than one. + else if (0 in title) + form.title = title[0]; + + var fields = parseFields(x.getElementsByTagNameNS(Lightstring.namespaces['dataforms'], 'fields')); + if (fields) + form.fields = fields + + var reported = x.getElementsByTagNameNS(Lightstring.namespaces['dataforms'], 'reported'); + if (reported.length > 1) + ; //TODO: emit a warning if there is more than one. + else if (0 in reported) { + var fields = parseFields(reported[0].getElementsByTagNameNS(Lightstring.namespaces['dataforms'], 'fields')); + if (fields) + form.reported = fields + } + + var itemsList = x.getElementsByTagNameNS(Lightstring.namespaces['dataforms'], 'item'); + if (itemsList) { + var fields = parseFields(itemsList[0].getElementsByTagNameNS(Lightstring.namespaces['dataforms'], 'fields')); + if (fields) + form.items = fields; + } + + return form; + } + } + }; +})(); diff --git a/plugins/disco.js b/plugins/disco.js --- a/plugins/disco.js +++ b/plugins/disco.js @@ -119,46 +119,29 @@ Lightstring.plugins['disco'] = { var length = children.length; for (var i = 0; i < length; i++) { + var child = children[i]; + var ns = child.namespaceURI; + var name = child.localName; - if (children[i].localName === 'feature') - features.push(children[i].getAttributeNS(null, 'var')); + if (ns === Lightstring.namespaces['disco#info'] && name === 'feature') + features.push(child.getAttributeNS(null, 'var')); - else if (children[i].localName === 'identity') { + else if (ns === Lightstring.namespaces['disco#info'] && name === 'identity') { var identity = { - category: children[i].getAttributeNS(null, 'category'), - type: children[i].getAttributeNS(null, 'type') + category: child.getAttributeNS(null, 'category'), + type: child.getAttributeNS(null, 'type') }; - var name = children[i].getAttributeNS(null, 'name'); + var name = child.getAttributeNS(null, 'name'); if (name) identity.name = name; identities.push(identity); } - else if (children[i].localName === 'x') { - for (var j = 0; j < children[i].childNodes.length; j++) { - var child = children[i].childNodes[j]; - var field = { - type: child.getAttribute('type') - }; - - var _var = child.getAttribute('var'); - - var label = child.getAttribute('label'); - if (label) - field.label = label; + else if (ns === Lightstring.namespaces['dataforms'] && name === 'x') + this.disco.parse(child); //TODO: check if that plugin is enabled. - for (var y = 0; y < child.childNodes.length; y++) { - if(child.childNodes[y].localName === 'desc') - field.desc = child.childNodes[y].textContent; - else if(child.childNodes[y].localName === 'required') - field.required = true; - else if(child.childNodes[y].localName === 'value') - field.value = child.childNodes[y].textContent; - } - - fields[_var] = field; - } - } + else + ; //TODO: emit a warning. } stanza.identities = identities;