root / trunk / web / dojo / dojox / xmpp / TransportSession.js @ 12
History | View | Annotate | Download (8.46 KB)
1 | 9 | andrej.cim | /*
|
---|---|---|---|
2 | Copyright (c) 2004-2010, The Dojo Foundation All Rights Reserved.
|
||
3 | Available via Academic Free License >= 2.1 OR the modified BSD license.
|
||
4 | see: http://dojotoolkit.org/license for details
|
||
5 | */
|
||
6 | |||
7 | |||
8 | if(!dojo._hasResource["dojox.xmpp.TransportSession"]){ |
||
9 | dojo._hasResource["dojox.xmpp.TransportSession"]=true; |
||
10 | dojo.provide("dojox.xmpp.TransportSession");
|
||
11 | dojo.require("dojox.xmpp.bosh");
|
||
12 | dojo.require("dojox.xmpp.util");
|
||
13 | dojo.require("dojox.data.dom");
|
||
14 | dojox.xmpp.TransportSession=function(_1){ |
||
15 | this.sendTimeout=(this.wait+20)*1000; |
||
16 | if(_1&&dojo.isObject(_1)){
|
||
17 | dojo.mixin(this,_1);
|
||
18 | if(this.useScriptSrcTransport){ |
||
19 | this.transportIframes=[];
|
||
20 | } |
||
21 | } |
||
22 | }; |
||
23 | dojo.extend(dojox.xmpp.TransportSession,{rid:0,hold:1,polling:1000,secure:false,wait:60,lang:"en",submitContentType:"text/xml; charset=utf=8",serviceUrl:"/httpbind",defaultResource:"dojoIm",domain:"imserver.com",sendTimeout:0,useScriptSrcTransport:false,keepAliveTimer:null,state:"NotReady",transmitState:"Idle",protocolPacketQueue:[],outboundQueue:[],outboundRequests:{},inboundQueue:[],deferredRequests:{},matchTypeIdAttribute:{},open:function(){ |
||
24 | this.status="notReady"; |
||
25 | this.rid=Math.round(Math.random()*1000000000); |
||
26 | this.protocolPacketQueue=[];
|
||
27 | this.outboundQueue=[];
|
||
28 | this.outboundRequests={};
|
||
29 | this.inboundQueue=[];
|
||
30 | this.deferredRequests={};
|
||
31 | this.matchTypeIdAttribute={};
|
||
32 | this.keepAliveTimer=setTimeout(dojo.hitch(this,"_keepAlive"),10000); |
||
33 | if(this.useScriptSrcTransport){ |
||
34 | dojox.xmpp.bosh.initialize({iframes:this.hold+1,load:dojo.hitch(this,function(){ |
||
35 | this._sendLogin();
|
||
36 | })}); |
||
37 | }else{
|
||
38 | this._sendLogin();
|
||
39 | } |
||
40 | },_sendLogin:function(){ |
||
41 | var _2=this.rid++; |
||
42 | var _3={content:this.submitContentType,hold:this.hold,rid:_2,to:this.domain,secure:this.secure,wait:this.wait,"xml:lang":this.lang,"xmpp:version":"1.0",xmlns:dojox.xmpp.xmpp.BODY_NS,"xmlns:xmpp":"urn:xmpp:xbosh"}; |
||
43 | var _4=dojox.xmpp.util.createElement("body",_3,true); |
||
44 | this.addToOutboundQueue(_4,_2);
|
||
45 | },_sendRestart:function(){ |
||
46 | var _5=this.rid++; |
||
47 | var _6={rid:_5,sid:this.sid,to:this.domain,"xmpp:restart":"true","xml:lang":this.lang,xmlns:dojox.xmpp.xmpp.BODY_NS,"xmlns:xmpp":"urn:xmpp:xbosh"}; |
||
48 | var _7=dojox.xmpp.util.createElement("body",_6,true); |
||
49 | this.addToOutboundQueue(_7,_5);
|
||
50 | },processScriptSrc:function(_8,_9){ |
||
51 | var _a=dojox.xml.parser.parse(_8,"text/xml"); |
||
52 | if(_a){
|
||
53 | this.processDocument(_a,_9);
|
||
54 | }else{
|
||
55 | } |
||
56 | },_keepAlive:function(){ |
||
57 | if(this.state=="wait"||this.isTerminated()){ |
||
58 | return;
|
||
59 | } |
||
60 | this._dispatchPacket();
|
||
61 | this.keepAliveTimer=setTimeout(dojo.hitch(this,"_keepAlive"),10000); |
||
62 | },close:function(_b){ |
||
63 | var _c=this.rid++; |
||
64 | var _d={sid:this.sid,rid:_c,type:"terminate"}; |
||
65 | var _e=null; |
||
66 | if(_b){
|
||
67 | _e=new dojox.string.Builder(dojox.xmpp.util.createElement("body",_d,false)); |
||
68 | _e.append(_b); |
||
69 | _e.append("</body>");
|
||
70 | }else{
|
||
71 | _e=new dojox.string.Builder(dojox.xmpp.util.createElement("body",_d,false)); |
||
72 | } |
||
73 | this.addToOutboundQueue(_e.toString(),_c);
|
||
74 | this.state=="Terminate"; |
||
75 | },dispatchPacket:function(_f,_10,_11,_12){ |
||
76 | if(_f){
|
||
77 | this.protocolPacketQueue.push(_f);
|
||
78 | } |
||
79 | var def=new dojo.Deferred(); |
||
80 | if(_10&&_11){
|
||
81 | def.protocolMatchType=_10; |
||
82 | def.matchId=_11; |
||
83 | def.matchProperty=_12||"id";
|
||
84 | if(def.matchProperty!="id"){ |
||
85 | this.matchTypeIdAttribute[_10]=def.matchProperty;
|
||
86 | } |
||
87 | } |
||
88 | this.deferredRequests[def.protocolMatchType+"-"+def.matchId]=def; |
||
89 | if(!this.dispatchTimer){ |
||
90 | this.dispatchTimer=setTimeout(dojo.hitch(this,"_dispatchPacket"),600); |
||
91 | } |
||
92 | return def;
|
||
93 | },_dispatchPacket:function(){ |
||
94 | clearTimeout(this.dispatchTimer);
|
||
95 | delete this.dispatchTimer; |
||
96 | if(!this.sid){ |
||
97 | return;
|
||
98 | } |
||
99 | if(!this.authId){ |
||
100 | return;
|
||
101 | } |
||
102 | if(this.transmitState!="error"&&(this.protocolPacketQueue.length==0)&&(this.outboundQueue.length>0)){ |
||
103 | return;
|
||
104 | } |
||
105 | if(this.state=="wait"||this.isTerminated()){ |
||
106 | return;
|
||
107 | } |
||
108 | var req={sid:this.sid,xmlns:dojox.xmpp.xmpp.BODY_NS}; |
||
109 | var _13;
|
||
110 | if(this.protocolPacketQueue.length>0){ |
||
111 | req.rid=this.rid++;
|
||
112 | _13=new dojox.string.Builder(dojox.xmpp.util.createElement("body",req,false)); |
||
113 | _13.append(this.processProtocolPacketQueue());
|
||
114 | _13.append("</body>");
|
||
115 | delete this.lastPollTime; |
||
116 | }else{
|
||
117 | if(this.lastPollTime){ |
||
118 | var now=new Date().getTime(); |
||
119 | if(now-this.lastPollTime<this.polling){ |
||
120 | this.dispatchTimer=setTimeout(dojo.hitch(this,"_dispatchPacket"),this.polling-(now-this.lastPollTime)+10); |
||
121 | return;
|
||
122 | } |
||
123 | } |
||
124 | req.rid=this.rid++;
|
||
125 | this.lastPollTime=new Date().getTime(); |
||
126 | _13=new dojox.string.Builder(dojox.xmpp.util.createElement("body",req,true)); |
||
127 | } |
||
128 | this.addToOutboundQueue(_13.toString(),req.rid);
|
||
129 | },redispatchPacket:function(rid){ |
||
130 | var env=this.outboundRequests[rid]; |
||
131 | this.sendXml(env,rid);
|
||
132 | },addToOutboundQueue:function(msg,rid){ |
||
133 | this.outboundQueue.push({msg:msg,rid:rid}); |
||
134 | this.outboundRequests[rid]=msg;
|
||
135 | this.sendXml(msg,rid);
|
||
136 | },removeFromOutboundQueue:function(rid){ |
||
137 | for(var i=0;i<this.outboundQueue.length;i++){ |
||
138 | if(rid==this.outboundQueue[i]["rid"]){ |
||
139 | this.outboundQueue.splice(i,1); |
||
140 | break;
|
||
141 | } |
||
142 | } |
||
143 | delete this.outboundRequests[rid]; |
||
144 | },processProtocolPacketQueue:function(){ |
||
145 | var _14=new dojox.string.Builder(); |
||
146 | for(var i=0;i<this.protocolPacketQueue.length;i++){ |
||
147 | _14.append(this.protocolPacketQueue[i]);
|
||
148 | } |
||
149 | this.protocolPacketQueue=[];
|
||
150 | return _14.toString();
|
||
151 | },sendXml:function(_15,rid){ |
||
152 | if(this.isTerminated()){ |
||
153 | return false; |
||
154 | } |
||
155 | this.transmitState="transmitting"; |
||
156 | var def=null; |
||
157 | if(this.useScriptSrcTransport){ |
||
158 | def=dojox.xmpp.bosh.get({rid:rid,url:this.serviceUrl+"?"+encodeURIComponent(_15),error:dojo.hitch(this,function(res,io){ |
||
159 | this.setState("Terminate","error"); |
||
160 | return false; |
||
161 | }),timeout:this.sendTimeout}); |
||
162 | }else{
|
||
163 | def=dojo.rawXhrPost({contentType:"text/xml",url:this.serviceUrl,postData:_15,handleAs:"xml",error:dojo.hitch(this,function(res,io){ |
||
164 | return this.processError(io.xhr.responseXML,io.xhr.status,rid); |
||
165 | }),timeout:this.sendTimeout}); |
||
166 | } |
||
167 | def.addCallback(this,function(res){ |
||
168 | return this.processDocument(res,rid); |
||
169 | }); |
||
170 | return def;
|
||
171 | },processDocument:function(doc,rid){ |
||
172 | if(this.isTerminated()||!doc.firstChild){ |
||
173 | return false; |
||
174 | } |
||
175 | this.transmitState="idle"; |
||
176 | var _16=doc.firstChild;
|
||
177 | if(_16.nodeName!="body"){ |
||
178 | } |
||
179 | if(this.outboundQueue.length<1){ |
||
180 | return false; |
||
181 | } |
||
182 | var _17=this.outboundQueue[0]["rid"]; |
||
183 | if(rid==_17){
|
||
184 | this.removeFromOutboundQueue(rid);
|
||
185 | this.processResponse(_16,rid);
|
||
186 | this.processInboundQueue();
|
||
187 | }else{
|
||
188 | var gap=rid-_17;
|
||
189 | if(gap<this.hold+2){ |
||
190 | this.addToInboundQueue(doc,rid);
|
||
191 | }else{
|
||
192 | } |
||
193 | } |
||
194 | return doc;
|
||
195 | },processInboundQueue:function(){ |
||
196 | while(this.inboundQueue.length>0){ |
||
197 | var _18=this.inboundQueue.shift(); |
||
198 | this.processDocument(_18["doc"],_18["rid"]); |
||
199 | } |
||
200 | },addToInboundQueue:function(doc,rid){ |
||
201 | for(var i=0;i<this.inboundQueue.length;i++){ |
||
202 | if(rid<this.inboundQueue[i]["rid"]){ |
||
203 | continue;
|
||
204 | } |
||
205 | this.inboundQueue.splice(i,0,{doc:doc,rid:rid}); |
||
206 | } |
||
207 | },processResponse:function(_19,rid){ |
||
208 | if(_19.getAttribute("type")=="terminate"){ |
||
209 | var _1a=_19.firstChild.firstChild;
|
||
210 | var _1b=""; |
||
211 | if(_1a.nodeName=="conflict"){ |
||
212 | _1b="conflict";
|
||
213 | } |
||
214 | this.setState("Terminate",_1b); |
||
215 | return;
|
||
216 | } |
||
217 | if((this.state!="Ready")&&(this.state!="Terminate")){ |
||
218 | var sid=_19.getAttribute("sid"); |
||
219 | if(sid){
|
||
220 | this.sid=sid;
|
||
221 | }else{
|
||
222 | throw new Error("No sid returned during xmpp session startup"); |
||
223 | } |
||
224 | this.authId=_19.getAttribute("authid"); |
||
225 | if(this.authId==""){ |
||
226 | if(this.authRetries--<1){ |
||
227 | console.error("Unable to obtain Authorization ID");
|
||
228 | this.terminateSession();
|
||
229 | } |
||
230 | } |
||
231 | this.wait=_19.getAttribute("wait"); |
||
232 | if(_19.getAttribute("polling")){ |
||
233 | this.polling=parseInt(_19.getAttribute("polling"))*1000; |
||
234 | } |
||
235 | this.inactivity=_19.getAttribute("inactivity"); |
||
236 | this.setState("Ready"); |
||
237 | } |
||
238 | dojo.forEach(_19.childNodes,function(_1c){
|
||
239 | this.processProtocolResponse(_1c,rid);
|
||
240 | },this);
|
||
241 | if(this.transmitState=="idle"){ |
||
242 | this.dispatchPacket();
|
||
243 | } |
||
244 | },processProtocolResponse:function(msg,rid){ |
||
245 | this.onProcessProtocolResponse(msg);
|
||
246 | var key=msg.nodeName+"-"+msg.getAttribute("id"); |
||
247 | var def=this.deferredRequests[key]; |
||
248 | if(def){
|
||
249 | def.callback(msg); |
||
250 | delete this.deferredRequests[key]; |
||
251 | } |
||
252 | },setState:function(_1d,_1e){ |
||
253 | if(this.state!=_1d){ |
||
254 | if(this["on"+_1d]){ |
||
255 | this["on"+_1d](_1d,this.state,_1e); |
||
256 | } |
||
257 | this.state=_1d;
|
||
258 | } |
||
259 | },isTerminated:function(){ |
||
260 | return this.state=="Terminate"; |
||
261 | },processError:function(err,_1f,rid){ |
||
262 | if(this.isTerminated()){ |
||
263 | return false; |
||
264 | } |
||
265 | if(_1f!=200){ |
||
266 | if(_1f>=400&&_1f<500){ |
||
267 | this.setState("Terminate",_20); |
||
268 | return false; |
||
269 | }else{
|
||
270 | this.removeFromOutboundQueue(rid);
|
||
271 | setTimeout(dojo.hitch(this,function(){ |
||
272 | this.dispatchPacket();
|
||
273 | }),200);
|
||
274 | return true; |
||
275 | } |
||
276 | return false; |
||
277 | } |
||
278 | if(err&&err.dojoType&&err.dojoType=="timeout"){ |
||
279 | } |
||
280 | this.removeFromOutboundQueue(rid);
|
||
281 | if(err&&err.firstChild){
|
||
282 | if(err.firstChild.getAttribute("type")=="terminate"){ |
||
283 | var _21=err.firstChild.firstChild;
|
||
284 | var _20=""; |
||
285 | if(_21&&_21.nodeName=="conflict"){ |
||
286 | _20="conflict";
|
||
287 | } |
||
288 | this.setState("Terminate",_20); |
||
289 | return false; |
||
290 | } |
||
291 | } |
||
292 | this.transmitState="error"; |
||
293 | setTimeout(dojo.hitch(this,function(){ |
||
294 | this.dispatchPacket();
|
||
295 | }),200);
|
||
296 | return true; |
||
297 | },onTerminate:function(_22,_23,_24){ |
||
298 | },onProcessProtocolResponse:function(msg){ |
||
299 | },onReady:function(_25,_26){ |
||
300 | }}); |
||
301 | } |