| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232 | 
							- /*
 -   Copyright 2010, François de Metz <francois@2metz.fr>
 - */
 - 
 - /**
 -  * Disco Strophe Plugin
 -  * Implement http://xmpp.org/extensions/xep-0030.html
 -  * TODO: manage node hierarchies, and node on info request
 -  */
 - Strophe.addConnectionPlugin('disco',
 - {
 -     _connection: null,
 -     _identities : [],
 -     _features : [],
 -     _items : [],
 -     /** Function: init
 -      * Plugin init
 -      *
 -      * Parameters:
 -      *   (Strophe.Connection) conn - Strophe connection
 -      */
 -     init: function(conn)
 -     {
 -     this._connection = conn;
 -         this._identities = [];
 -         this._features   = [];
 -         this._items      = [];
 -         // disco info
 -         conn.addHandler(this._onDiscoInfo.bind(this), Strophe.NS.DISCO_INFO, 'iq', 'get', null, null);
 -         // disco items
 -         conn.addHandler(this._onDiscoItems.bind(this), Strophe.NS.DISCO_ITEMS, 'iq', 'get', null, null);
 -     },
 -     /** Function: addIdentity
 -      * See http://xmpp.org/registrar/disco-categories.html
 -      * Parameters:
 -      *   (String) category - category of identity (like client, automation, etc ...)
 -      *   (String) type - type of identity (like pc, web, bot , etc ...)
 -      *   (String) name - name of identity in natural language
 -      *   (String) lang - lang of name parameter
 -      *
 -      * Returns:
 -      *   Boolean
 -      */
 -     addIdentity: function(category, type, name, lang)
 -     {
 -         for (var i=0; i<this._identities.length; i++)
 -         {
 -             if (this._identities[i].category == category &&
 -                 this._identities[i].type == type &&
 -                 this._identities[i].name == name &&
 -                 this._identities[i].lang == lang)
 -             {
 -                 return false;
 -             }
 -         }
 -         this._identities.push({category: category, type: type, name: name, lang: lang});
 -         return true;
 -     },
 -     /** Function: addFeature
 -      *
 -      * Parameters:
 -      *   (String) var_name - feature name (like jabber:iq:version)
 -      *
 -      * Returns:
 -      *   boolean
 -      */
 -     addFeature: function(var_name)
 -     {
 -         for (var i=0; i<this._features.length; i++)
 -         {
 -              if (this._features[i] == var_name)
 -                  return false;
 -         }
 -         this._features.push(var_name);
 -         return true;
 -     },
 -     /** Function: removeFeature
 -      *
 -      * Parameters:
 -      *   (String) var_name - feature name (like jabber:iq:version)
 -      *
 -      * Returns:
 -      *   boolean
 -      */
 -     removeFeature: function(var_name)
 -     {
 -         for (var i=0; i<this._features.length; i++)
 -         {
 -              if (this._features[i] === var_name){
 -                  this._features.splice(i,1)
 -                  return true;
 -              }
 -         }
 -         return false;
 -     },
 -     /** Function: addItem
 -      *
 -      * Parameters:
 -      *   (String) jid
 -      *   (String) name
 -      *   (String) node
 -      *   (Function) call_back
 -      *
 -      * Returns:
 -      *   boolean
 -      */
 -     addItem: function(jid, name, node, call_back)
 -     {
 -         if (node && !call_back)
 -             return false;
 -         this._items.push({jid: jid, name: name, node: node, call_back: call_back});
 -         return true;
 -     },
 -     /** Function: info
 -      * Info query
 -      *
 -      * Parameters:
 -      *   (Function) call_back
 -      *   (String) jid
 -      *   (String) node
 -      */
 -     info: function(jid, node, success, error, timeout)
 -     {
 -         var attrs = {xmlns: Strophe.NS.DISCO_INFO};
 -         if (node)
 -             attrs.node = node;
 - 
 -         var info = $iq({from:this._connection.jid,
 -                          to:jid, type:'get'}).c('query', attrs);
 -         this._connection.sendIQ(info, success, error, timeout);
 -     },
 -     /** Function: items
 -      * Items query
 -      *
 -      * Parameters:
 -      *   (Function) call_back
 -      *   (String) jid
 -      *   (String) node
 -      */
 -     items: function(jid, node, success, error, timeout)
 -     {
 -         var attrs = {xmlns: Strophe.NS.DISCO_ITEMS};
 -         if (node)
 -             attrs.node = node;
 - 
 -         var items = $iq({from:this._connection.jid,
 -                          to:jid, type:'get'}).c('query', attrs);
 -         this._connection.sendIQ(items, success, error, timeout);
 -     },
 - 
 -     /** PrivateFunction: _buildIQResult
 -      */
 -     _buildIQResult: function(stanza, query_attrs)
 -     {
 -         var id   =  stanza.getAttribute('id');
 -         var from = stanza.getAttribute('from');
 -         var iqresult = $iq({type: 'result', id: id});
 - 
 -         if (from !== null) {
 -             iqresult.attrs({to: from});
 -         }
 - 
 -         return iqresult.c('query', query_attrs);
 -     },
 - 
 -     /** PrivateFunction: _onDiscoInfo
 -      * Called when receive info request
 -      */
 -     _onDiscoInfo: function(stanza)
 -     {
 -         var node = stanza.getElementsByTagName('query')[0].getAttribute('node');
 -         var attrs = {xmlns: Strophe.NS.DISCO_INFO};
 -         if (node)
 -         {
 -             attrs.node = node;
 -         }
 -         var iqresult = this._buildIQResult(stanza, attrs);
 -         for (var i=0; i<this._identities.length; i++)
 -         {
 -             var attrs = {category: this._identities[i].category,
 -                          type    : this._identities[i].type};
 -             if (this._identities[i].name)
 -                 attrs.name = this._identities[i].name;
 -             if (this._identities[i].lang)
 -                 attrs['xml:lang'] = this._identities[i].lang;
 -             iqresult.c('identity', attrs).up();
 -         }
 -         for (var i=0; i<this._features.length; i++)
 -         {
 -             iqresult.c('feature', {'var':this._features[i]}).up();
 -         }
 -         this._connection.send(iqresult.tree());
 -         return true;
 -     },
 -     /** PrivateFunction: _onDiscoItems
 -      * Called when receive items request
 -      */
 -     _onDiscoItems: function(stanza)
 -     {
 -         var query_attrs = {xmlns: Strophe.NS.DISCO_ITEMS};
 -         var node = stanza.getElementsByTagName('query')[0].getAttribute('node');
 -         if (node)
 -         {
 -             query_attrs.node = node;
 -             var items = [];
 -             for (var i = 0; i < this._items.length; i++)
 -             {
 -                 if (this._items[i].node == node)
 -                 {
 -                     items = this._items[i].call_back(stanza);
 -                     break;
 -                 }
 -             }
 -         }
 -         else
 -         {
 -             var items = this._items;
 -         }
 -         var iqresult = this._buildIQResult(stanza, query_attrs);
 -         for (var i = 0; i < items.length; i++)
 -         {
 -             var attrs = {jid:  items[i].jid};
 -             if (items[i].name)
 -                 attrs.name = items[i].name;
 -             if (items[i].node)
 -                 attrs.node = items[i].node;
 -             iqresult.c('item', attrs).up();
 -         }
 -         this._connection.send(iqresult.tree());
 -         return true;
 -     }
 - });
 
 
  |