1 // Copyright (C) 2007 Harlan Iverson <h.iverson at gmail.com>
\r
3 // This program is free software; you can redistribute it and/or
\r
4 // modify it under the terms of the GNU General Public License
\r
5 // as published by the Free Software Foundation; either version 2
\r
6 // of the License, or (at your option) any later version.
\r
8 // This program is distributed in the hope that it will be useful,
\r
9 // but WITHOUT ANY WARRANTY; without even the implied warranty of
\r
10 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
\r
11 // GNU General Public License for more details.
\r
13 // You should have received a copy of the GNU General Public License
\r
14 // along with this program; if not, write to the Free Software
\r
15 // Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
\r
17 Ext.namespace( "Xmpp4Js.Packet" );
\r
20 * A registry of stanza qualifiers and mappings to classes to create from elements.
\r
21 * Does not register default providers automatically; explicitly call
\r
22 * registerDefaultProviders.
\r
25 Xmpp4Js.Packet.StanzaProvider = function() {
\r
26 this.providers = [];
\r
29 Xmpp4Js.Packet.StanzaProvider.prototype = {
\r
31 * Registers a provider with a qualifier function, class, and priority.
\r
32 * @param qualifier {Function} The function to use to qualify the packet
\r
33 * @param clazz {Class} The class to create an instance of and setNode.
\r
34 * @param priority {Number} The priority of the provider. Higher gets more weight.
\r
36 register: function( qualifier, clazz, priority ) {
\r
37 this.providers.push( {qualifier: qualifier, clazz: clazz, priority: priority} );
\r
40 * Uses registered providers to figure out which Stanza class to use for
\r
41 * a given packet node.
\r
42 * @param stanzaNode {Element} A stanza node
\r
43 * @return {Xmpp4Js.Packet.Base} A packet object representing the node.
\r
45 fromNode: function( stanzaNode ) {
\r
46 if( !(stanzaNode instanceof DOMElement) ) {
\r
47 // TODO throw error or something.
\r
51 var bestProvider = undefined;
\r
53 for( var i = 0; i < this.providers.length; i++ ) {
\r
54 var provider = this.providers[i];
\r
56 if( provider.qualifier( stanzaNode )
\r
57 && (bestProvider === undefined || provider.priority > bestProvider.priority)) {
\r
58 bestProvider = provider;
\r
61 if( bestProvider === undefined ) {
\r
62 throw new NoProviderError( stanzaNode );
\r
65 var stanza = new bestProvider.clazz();
\r
66 stanza.setNode( stanzaNode );
\r
71 * Registers a provider for all unmatched packets with priority 0,
\r
72 * and for message, iq, and message with priority 1.
\r
74 registerDefaultProviders: function() {
\r
75 // match all packets, priority 0, and make a Packet.Base
\r
77 Xmpp4Js.Packet.StanzaProvider.BaseProvider,
\r
78 Xmpp4Js.Packet.Base,
\r
82 // match all packets with elem name message, priority 1, and make a Packet.Message
\r
84 Xmpp4Js.Packet.StanzaProvider.MessageProvider,
\r
85 Xmpp4Js.Packet.Message,
\r
88 // match all packets with elem name presence, priority 1, and make a Packet.Presence
\r
90 Xmpp4Js.Packet.StanzaProvider.PresenceProvider,
\r
91 Xmpp4Js.Packet.Presence,
\r
94 // match all packets with elem name iq, priority 1, and make a Packet.IQ
\r
96 Xmpp4Js.Packet.StanzaProvider.IQProvider,
\r
104 Xmpp4Js.Packet.StanzaProvider.BaseProvider = function( stanzaNode ) {
\r
108 Xmpp4Js.Packet.StanzaProvider._ElemNameProvider = function( stanzaNode, packetType ) {
\r
109 return stanzaNode.nodeName.toLowerCase() == packetType.toLowerCase();
\r
112 Xmpp4Js.Packet.StanzaProvider.IQProvider = function( stanzaNode ) {
\r
113 return Xmpp4Js.Packet.StanzaProvider._ElemNameProvider( stanzaNode, "iq" );
\r
116 Xmpp4Js.Packet.StanzaProvider.PresenceProvider = function( stanzaNode ) {
\r
117 return Xmpp4Js.Packet.StanzaProvider._ElemNameProvider( stanzaNode, "presence" );
\r
120 Xmpp4Js.Packet.StanzaProvider.MessageProvider = function( stanzaNode ) {
\r
121 return Xmpp4Js.Packet.StanzaProvider._ElemNameProvider( stanzaNode, "message" );
\r
128 function NoProviderError(stanzaNode) {
\r
129 this.stanzaNode = stanzaNode
\r
132 NoProviderError.prototype = {
\r
133 getStanzaNode: function() {
\r
134 return this.stanzaNode;
\r
138 Ext.extend( NoProviderError, Error, NoProviderError.prototype );
\r