make use of the soashable project theme
[xmpp4js.git] / src / main / javascript / StanzaProvider.js
blobbbdd9f9504358eeb07102d5831f2edfa73c50bc7
1 // Copyright (C) 2007  Harlan Iverson <h.iverson at gmail.com>\r
2 //\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
7 //\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
12 //\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
19 /**\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
23  * @constructor\r
24  */\r
25 Xmpp4Js.Packet.StanzaProvider = function() {\r
26         this.providers = [];\r
27 }\r
29 Xmpp4Js.Packet.StanzaProvider.prototype = {\r
30         /**\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
35          */\r
36         register: function( qualifier, clazz, priority ) {\r
37                 this.providers.push( {qualifier: qualifier, clazz: clazz, priority: priority} );\r
38         },\r
39         /**\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
44          */\r
45         fromNode: function( stanzaNode ) {\r
46                 if( !(stanzaNode instanceof DOMElement) ) {\r
47                         // TODO throw error or something.\r
48                         return undefined;\r
49                 }\r
50         \r
51                 var bestProvider = undefined;\r
52                 \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
59                         }\r
60                 }\r
61                 if( bestProvider === undefined ) {\r
62                         throw new NoProviderError( stanzaNode );\r
63                 }\r
64                 \r
65                 var stanza = new bestProvider.clazz();\r
66                 stanza.setNode( stanzaNode );\r
67                 \r
68                 return stanza;\r
69         },\r
70         /**\r
71          * Registers a provider for all unmatched packets with priority 0,\r
72          * and for message, iq, and message with priority 1.\r
73          */\r
74         registerDefaultProviders: function() {\r
75                 // match all packets, priority 0, and make a Packet.Base\r
76                 this.register(\r
77                         Xmpp4Js.Packet.StanzaProvider.BaseProvider,\r
78                         Xmpp4Js.Packet.Base,\r
79                         0\r
80                 );\r
81                 \r
82                 // match all packets with elem name message, priority 1, and make a Packet.Message\r
83                 this.register(\r
84                         Xmpp4Js.Packet.StanzaProvider.MessageProvider,\r
85                         Xmpp4Js.Packet.Message,\r
86                         1\r
87                 );\r
88                 // match all packets with elem name presence, priority 1, and make a Packet.Presence\r
89                 this.register(\r
90                         Xmpp4Js.Packet.StanzaProvider.PresenceProvider,\r
91                         Xmpp4Js.Packet.Presence,\r
92                         1\r
93                 );\r
94                 // match all packets with elem name iq, priority 1, and make a Packet.IQ\r
95                 this.register(\r
96                         Xmpp4Js.Packet.StanzaProvider.IQProvider,\r
97                         Xmpp4Js.Packet.IQ,\r
98                         1\r
99                 );\r
100         }\r
104 Xmpp4Js.Packet.StanzaProvider.BaseProvider = function( stanzaNode ) {\r
105         return true;\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
124 /**\r
125  * @constructor\r
126  * @extends Error\r
127  */\r
128 function NoProviderError(stanzaNode) {\r
129         this.stanzaNode = stanzaNode\r
132 NoProviderError.prototype = {\r
133         getStanzaNode: function() {\r
134                 return this.stanzaNode;\r
135         }\r
138 Ext.extend( NoProviderError, Error, NoProviderError.prototype );\r