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;
- }
- });
|