changeset 70:fdd1ae375067

Fix disco plugin and add it an handler.
author Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
date Thu, 02 Feb 2012 01:58:35 +0100
parents 03ccf507ecda
children f12c759e4097
files plugins/disco.js
diffstat 1 files changed, 135 insertions(+), 118 deletions(-) [+]
line wrap: on
line diff
--- a/plugins/disco.js
+++ b/plugins/disco.js
@@ -19,138 +19,155 @@
 /////////
 //Disco//
 /////////
-Lightstring.plugins['disco'] = {
-  namespaces: {
-    'disco#info': "http://jabber.org/protocol/disco#info",
-    'disco#items': "http://jabber.org/protocol/disco#items"
-  },
-  stanzas: {
-    'disco#items': function(aTo, aNode) {
-      if(aTo)
-        var iq = "<iq type='get' to='"+aTo+"'>";
-      else
-        var iq = "<iq type='get'>";
+(function() {
+  var identities = [{category: 'client', type: 'browser'}];
+  var features = [];
 
-      if(aNode)
-        var query = "<query xmlns='"+Lightstring.NS['disco#items']+"' node='"+aNode+"'/>";
-      else
-        var query = "<query xmlns='"+Lightstring.NS['disco#items']+"'/>";
-
-      return iq+query+"</iq>";
+  Lightstring.plugins['disco'] = {
+    namespaces: {
+      'disco#info': "http://jabber.org/protocol/disco#info",
+      'disco#items': "http://jabber.org/protocol/disco#items"
     },
-    'disco#info': function(aTo, aNode) {
-      if(aTo)
-        var iq = "<iq type='get' to='"+aTo+"'>";
-      else
-        var iq = "<iq type='get'>";
-      if(aNode)
-        var query = "<query xmlns='"+Lightstring.NS['disco#info']+"' node='"+aNode+"'/>";
-      else
-        var query = "<query xmlns='"+Lightstring.NS['disco#info']+"'/>";
+    stanzas: {
+      items: function(aTo, aNode) {
+        if(aTo)
+          var iq = "<iq type='get' to='" + aTo + "'>";
+        else
+          var iq = "<iq type='get'>";
+
+        if(aNode)
+          var query = "<query xmlns='" + Lightstring.ns['disco#items'] + "' node='" + aNode + "'/>";
+        else
+          var query = "<query xmlns='" + Lightstring.ns['disco#items'] + "'/>";
+
+        return iq + query + "</iq>";
+      },
+      info: function(aTo, aNode) {
+        if(aTo)
+          var iq = "<iq type='get' to='" + aTo + "'>";
+        else
+          var iq = "<iq type='get'>";
+        if(aNode)
+          var query = "<query xmlns='" + Lightstring.ns['disco#info'] + "' node='" + aNode + "'/>";
+        else
+          var query = "<query xmlns='" + Lightstring.ns['disco#info'] + "'/>";
 
-      return iq+query+"</iq>";
-    }
-  },
-  handlers: {
-    //TODO: fix that handler.
-    /*conn.on('iq/' + Lightstring.NS['disco#info'] + ':query', function(stanza) {
-      if (stanza.DOM.getAttributeNS(null, 'type') !== 'get')
-        return;
+        return iq + query + "</iq>";
+      }
+    },
+    methods: {
+      items: function(aTo, aResult, aError) {
+        this.send(Lightstring.stanzas.disco.items(aTo), function (stanza) {
+          var items = [];
+
+          var children = stanza.DOM.firstChild.childNodes;
+          var length = children.length;
+
+          for (var i = 0; i < length; i++) {
+            var node = children[i];
+            if (node.localName !== 'item')
+              continue;
+
+            var item = {
+              jid: node.getAttributeNS(null, 'jid'),
+              name: node.getAttributeNS(null, 'name'),
+              node: node.getAttributeNS(null, 'node')
+            };
+            items.push(item);
+          }
+
+          stanza.items = items;
 
-      var query = stanza.DOM.firstChild;
-      if (query.getAttributeNS(null, 'node')) {
-        var response = "<iq to='" + stanza.DOM.getAttributeNS(null, 'from') + "'" +
-                          " id='" + stanza.DOM.getAttributeNS(null, 'id') + "'" +
-                          " type='error'/>"; //TODO: precise the error.
-        conn.send(response);
-        return;
-      }
+          if (aResult)
+            aResult(stanza);
+        }, aError);
+      },
+      info: function(aTo, aNode, aResult, aError) {
+        this.send(Lightstring.stanzas.disco.info(aTo, aNode), function(stanza){
+          var identities = [];
+          var features = [];
+          var fields = {};
 
-      var features = [Lightstring.NS.sxe, Lightstring.NS.jingle.transports.sxe]; //TODO: put that elsewhere.
+          var children = stanza.DOM.firstChild.childNodes;
+          var length = children.length;
 
-      var response = "<iq to='" + stanza.DOM.getAttributeNS(null, 'from') + "'" +
-                        " id='" + stanza.DOM.getAttributeNS(null, 'id') + "'" +
-                        " type='result'>" +
-                       "<query xmlns='" + Lightstring.NS['disco#info'] + "'>" +
-                         "<identity category='client' type='browser'/>";
-      features.forEach(function(f) {
-        response += "<feature var='" + f + "'/>";
-      });
-      response += "</query>" +
-                "</iq>";
+          for (var i = 0; i < length; i++) {
+            var child = children[i];
+            var ns = child.namespaceURI;
+            var name = child.localName;
+
+            if (ns === Lightstring.namespaces['disco#info'] && name === 'feature')
+              features.push(child.getAttributeNS(null, 'var'));
+
+            else if (ns === Lightstring.namespaces['disco#info'] && name === 'identity') {
+              var identity = {
+                category: child.getAttributeNS(null, 'category'),
+                type: child.getAttributeNS(null, 'type')
+              };
+              var name = child.getAttributeNS(null, 'name');
+              if (name)
+                identity.name = name;
+              identities.push(identity);
+            }
 
-      conn.send(response);
-    });*/
-  },
-  methods: {
-    discoItems: function(aTo, aResult, aError) {
-      this.send(Lightstring.stanzas.disco.items(aTo), function (stanza) {
-        var items = [];
+            else if (ns === Lightstring.namespaces['dataforms'] && name === 'x')
+              this.disco.parse(child); //TODO: check if that plugin is enabled.
 
-        var children = stanza.DOM.firstChild.childNodes;
-        var length = children.length;
+            else
+              ; //TODO: emit a warning.
+          }
+
+          stanza.identities = identities;
+          stanza.features = features;
+          stanza.fields = fields;
 
-        for (var i = 0; i < length; i++) {
-          var node = children[i];
-          if (node.localName !== 'item')
-            continue;
+          if (aResult)
+            aResult(stanza);
+        }, aError);
+      },
+      addFeature: function(feature) {
+        features.push(feature);
+      }
+    },
+    init: function() {
+      conn.on('iq/' + Lightstring.ns['disco#info'] + ':query', function(stanza) {
+        if (stanza.DOM.getAttributeNS(null, 'type') !== 'get')
+          return false;
 
-          var item = {
-            jid: node.getAttributeNS(null, 'jid'),
-            name: node.getAttributeNS(null, 'name'),
-            node: node.getAttributeNS(null, 'node')
-          };
-          items.push(item);
+        var query = stanza.DOM.firstChild;
+        if (query.getAttributeNS(null, 'node')) {
+          var response = "<iq to='" + stanza.DOM.getAttributeNS(null, 'from') + "'" +
+                            " id='" + stanza.DOM.getAttributeNS(null, 'id') + "'" +
+                            " type='error'/>"; //TODO: precise the error.
+          conn.send(response);
+          return true;
         }
 
-        stanza.items = items;
-
-        if (aResult)
-          aResult(stanza);
-      }, aError);
-    },
-    discoInfo: function(aTo, aNode, aResult, aError) {
-      this.send(Lightstring.stanzas.disco.info(aTo, aNode), function(stanza){
-        var identities = [];
-        var features = [];
-        var fields = {};
-
-        var children = stanza.DOM.firstChild.childNodes;
-        var length = children.length;
-
-        for (var i = 0; i < length; i++) {
-          var child = children[i];
-          var ns = child.namespaceURI;
-          var name = child.localName;
-
-          if (ns === Lightstring.namespaces['disco#info'] && name === 'feature')
-            features.push(child.getAttributeNS(null, 'var'));
+        var res = "<iq to='" + stanza.DOM.getAttributeNS(null, 'from') + "'" +
+                     " id='" + stanza.DOM.getAttributeNS(null, 'id') + "'" +
+                     " type='result'>" +
+                    "<query xmlns='" + Lightstring.ns['disco#info'] + "'>";
 
-          else if (ns === Lightstring.namespaces['disco#info'] && name === 'identity') {
-            var identity = {
-              category: child.getAttributeNS(null, 'category'),
-              type: child.getAttributeNS(null, 'type')
-            };
-            var name = child.getAttributeNS(null, 'name');
-            if (name)
-              identity.name = name;
-            identities.push(identity);
-          }
-
-          else if (ns === Lightstring.namespaces['dataforms'] && name === 'x')
-            this.disco.parse(child); //TODO: check if that plugin is enabled.
+        identities.forEach(function(i) {
+          res += "<identity";
+          if (i.category)
+            res += " category='" + i.category + "'";
+          if (i.name)
+            res += " name='" + i.name + "'";
+          if (i.type)
+            res += " type='" + i.type + "'";
+          res += "/>";
+        });
 
-          else
-            ; //TODO: emit a warning.
-        }
+        features.forEach(function(f) {
+          res += "<feature var='" + f + "'/>";
+        });
 
-        stanza.identities = identities;
-        stanza.features = features;
-        stanza.fields = fields;
+        res += "</query>" +
+             "</iq>";
 
-        if (aResult)
-          aResult(stanza);
-      }, aError);
+        conn.send(res);
+      });
     }
-  }
-};
+  };
+})();