| /* |
| Copyright (c) 2004-2009, The Dojo Foundation All Rights Reserved. |
| Available via Academic Free License >= 2.1 OR the modified BSD license. |
| see: http://dojotoolkit.org/license for details |
| */ |
| |
| |
| if(!dojo._hasResource["dojox.cometd.RestChannels"]){ |
| dojo._hasResource["dojox.cometd.RestChannels"]=true; |
| dojo.provide("dojox.cometd.RestChannels"); |
| dojo.require("dojox.rpc.Client"); |
| dojo.requireIf(dojox.data&&!!dojox.data.JsonRestStore,"dojox.data.restListener"); |
| (function(){ |
| dojo.declare("dojox.cometd.RestChannels",null,{constructor:function(_1){ |
| dojo.mixin(this,_1); |
| if(dojox.rpc.Rest&&this.autoSubscribeRoot){ |
| var _2=dojox.rpc.Rest._get; |
| var _3=this; |
| dojox.rpc.Rest._get=function(_4,id){ |
| var _5=dojo.xhrGet; |
| dojo.xhrGet=function(r){ |
| var _6=_3.autoSubscribeRoot; |
| return (_6&&r.url.substring(0,_6.length)==_6)?_3.get(r.url,r):_5(r); |
| }; |
| var _7=_2.apply(this,arguments); |
| dojo.xhrGet=_5; |
| return _7; |
| }; |
| } |
| },absoluteUrl:function(_8,_9){ |
| return new dojo._Url(_8,_9)+""; |
| },acceptType:"application/rest+json,application/http;q=0.9,*/*;q=0.7",subscriptions:{},subCallbacks:{},autoReconnectTime:3000,reloadDataOnReconnect:true,sendAsJson:false,url:"/channels",autoSubscribeRoot:"/",open:function(){ |
| this.started=true; |
| if(!this.connected){ |
| this.connectionId=dojox.rpc.Client.clientId; |
| var _a=this.createdClientId?"Client-Id":"Create-Client-Id"; |
| this.createdClientId=true; |
| var _b={Accept:this.acceptType}; |
| _b[_a]=this.connectionId; |
| var _c=dojo.xhrPost({headers:_b,url:this.url,noStatus:true}); |
| var _d=this; |
| this.lastIndex=0; |
| var _e,_f=function(_10){ |
| if(typeof dojo=="undefined"){ |
| return null; |
| } |
| if(xhr&&xhr.status>400){ |
| return _e(true); |
| } |
| if(typeof _10=="string"){ |
| _10=_10.substring(_d.lastIndex); |
| } |
| var _11=xhr&&(xhr.contentType||xhr.getResponseHeader("Content-Type"))||(typeof _10!="string"&&"already json"); |
| var _12=_d.onprogress(xhr,_10,_11); |
| if(_12){ |
| if(_e()){ |
| return new Error(_12); |
| } |
| } |
| if(!xhr||xhr.readyState==4){ |
| xhr=null; |
| if(_d.connected){ |
| _d.connected=false; |
| _d.open(); |
| } |
| } |
| return _10; |
| }; |
| _e=function(_13){ |
| if(xhr&&xhr.status==409){ |
| _d.disconnected(); |
| return null; |
| } |
| _d.createdClientId=false; |
| _d.disconnected(); |
| return _13; |
| }; |
| _c.addCallbacks(_f,_e); |
| var xhr=_c.ioArgs.xhr; |
| if(xhr){ |
| xhr.onreadystatechange=function(){ |
| var _14; |
| try{ |
| if(xhr.readyState==3){ |
| _d.readyState=3; |
| _14=xhr.responseText; |
| } |
| } |
| catch(e){ |
| } |
| if(typeof _14=="string"){ |
| _f(_14); |
| } |
| }; |
| } |
| if(window.attachEvent){ |
| window.attachEvent("onunload",function(){ |
| _d.connected=false; |
| if(xhr){ |
| xhr.abort(); |
| } |
| }); |
| } |
| this.connected=true; |
| } |
| },_send:function(_15,_16,_17){ |
| if(this.sendAsJson){ |
| _16.postData=dojo.toJson({target:_16.url,method:_15,content:_17,params:_16.content,subscribe:_16.headers["Subscribe"]}); |
| _16.url=this.url; |
| _15="POST"; |
| }else{ |
| _16.postData=dojo.toJson(_17); |
| } |
| return dojo.xhr(_15,_16,_16.postData); |
| },subscribe:function(_18,_19){ |
| _19=_19||{}; |
| _19.url=this.absoluteUrl(this.url,_18); |
| if(_19.headers){ |
| delete _19.headers.Range; |
| } |
| var _1a=this.subscriptions[_18]; |
| var _1b=_19.method||"HEAD"; |
| var _1c=_19.since; |
| var _1d=_19.callback; |
| var _1e=_19.headers||(_19.headers={}); |
| this.subscriptions[_18]=_1c||_1a||0; |
| var _1f=this.subCallbacks[_18]; |
| if(_1d){ |
| this.subCallbacks[_18]=_1f?function(m){ |
| _1f(m); |
| _1d(m); |
| }:_1d; |
| } |
| if(!this.connected){ |
| this.open(); |
| } |
| if(_1a===undefined||_1a!=_1c){ |
| _1e["Cache-Control"]="max-age=0"; |
| _1c=typeof _1c=="number"?new Date(_1c).toUTCString():_1c; |
| if(_1c){ |
| _1e["Subscribe-Since"]=_1c; |
| } |
| _1e["Subscribe"]=_19.unsubscribe?"none":"*"; |
| var dfd=this._send(_1b,_19); |
| var _20=this; |
| dfd.addBoth(function(_21){ |
| var xhr=dfd.ioArgs.xhr; |
| if(!(_21 instanceof Error)){ |
| if(_19.confirmation){ |
| _19.confirmation(); |
| } |
| } |
| if(xhr&&xhr.getResponseHeader("Subscribed")=="OK"){ |
| var _22=xhr.getResponseHeader("Last-Modified"); |
| if(xhr.responseText){ |
| _20.subscriptions[_18]=_22||new Date().toUTCString(); |
| }else{ |
| return null; |
| } |
| }else{ |
| if(xhr&&!(_21 instanceof Error)){ |
| delete _20.subscriptions[_18]; |
| } |
| } |
| if(!(_21 instanceof Error)){ |
| var _23={responseText:xhr&&xhr.responseText,channel:_18,getResponseHeader:function(_24){ |
| return xhr.getResponseHeader(_24); |
| },getAllResponseHeaders:function(){ |
| return xhr.getAllResponseHeaders(); |
| },result:_21}; |
| if(_20.subCallbacks[_18]){ |
| _20.subCallbacks[_18](_23); |
| } |
| }else{ |
| if(_20.subCallbacks[_18]){ |
| _20.subCallbacks[_18](xhr); |
| } |
| } |
| return _21; |
| }); |
| return dfd; |
| } |
| return null; |
| },publish:function(_25,_26){ |
| return this._send("POST",{url:_25,contentType:"application/json"},_26); |
| },_processMessage:function(_27){ |
| _27.event=_27.event||_27.getResponseHeader("Event"); |
| if(_27.event=="connection-conflict"){ |
| return "conflict"; |
| } |
| try{ |
| _27.result=_27.result||dojo.fromJson(_27.responseText); |
| } |
| catch(e){ |
| } |
| var _28=this; |
| var loc=_27.channel=new dojo._Url(this.url,_27.source||_27.getResponseHeader("Content-Location"))+""; |
| if(loc in this.subscriptions&&_27.getResponseHeader){ |
| this.subscriptions[loc]=_27.getResponseHeader("Last-Modified"); |
| } |
| if(this.subCallbacks[loc]){ |
| setTimeout(function(){ |
| _28.subCallbacks[loc](_27); |
| },0); |
| } |
| this.receive(_27); |
| return null; |
| },onprogress:function(xhr,_29,_2a){ |
| if(!_2a||_2a.match(/application\/rest\+json/)){ |
| var _2b=_29.length; |
| _29=_29.replace(/^\s*[,\[]?/,"[").replace(/[,\]]?\s*$/,"]"); |
| try{ |
| var _2c=dojo.fromJson(_29); |
| this.lastIndex+=_2b; |
| } |
| catch(e){ |
| } |
| }else{ |
| if(dojox.io&&dojox.io.httpParse&&_2a.match(/application\/http/)){ |
| var _2d=""; |
| if(xhr&&xhr.getAllResponseHeaders){ |
| _2d=xhr.getAllResponseHeaders(); |
| } |
| _2c=dojox.io.httpParse(_29,_2d,xhr.readyState!=4); |
| }else{ |
| if(typeof _29=="object"){ |
| _2c=_29; |
| } |
| } |
| } |
| if(_2c){ |
| for(var i=0;i<_2c.length;i++){ |
| if(this._processMessage(_2c[i])){ |
| return "conflict"; |
| } |
| } |
| return null; |
| } |
| if(!xhr){ |
| return "error"; |
| } |
| if(xhr.readyState!=4){ |
| return null; |
| } |
| if(xhr.__proto__){ |
| xhr={channel:"channel",__proto__:xhr}; |
| } |
| return this._processMessage(xhr); |
| },get:function(_2e,_2f){ |
| (_2f=_2f||{}).method="GET"; |
| return this.subscribe(_2e,_2f); |
| },receive:function(_30){ |
| if(dojox.data&&dojox.data.restListener){ |
| dojox.data.restListener(_30); |
| } |
| },disconnected:function(){ |
| var _31=this; |
| if(this.connected){ |
| this.connected=false; |
| if(this.started){ |
| setTimeout(function(){ |
| var _32=_31.subscriptions; |
| _31.subscriptions={}; |
| for(var i in _32){ |
| if(_31.reloadDataOnReconnect&&dojox.rpc.JsonRest){ |
| delete dojox.rpc.Rest._index[i]; |
| dojox.rpc.JsonRest.fetch(i); |
| }else{ |
| _31.subscribe(i,{since:_32[i]}); |
| } |
| } |
| _31.open(); |
| },this.autoReconnectTime); |
| } |
| } |
| },unsubscribe:function(_33,_34){ |
| _34=_34||{}; |
| _34.unsubscribe=true; |
| this.subscribe(_33,_34); |
| },disconnect:function(){ |
| this.started=false; |
| this.xhr.abort(); |
| }}); |
| var _35=dojox.cometd.RestChannels.defaultInstance=new dojox.cometd.RestChannels(); |
| if(dojox.cometd.connectionTypes){ |
| _35.startup=function(_36){ |
| _35.open(); |
| this._cometd._deliver({channel:"/meta/connect",successful:true}); |
| }; |
| _35.check=function(_37,_38,_39){ |
| for(var i=0;i<_37.length;i++){ |
| if(_37[i]=="rest-channels"){ |
| return !_39; |
| } |
| } |
| return false; |
| }; |
| _35.deliver=function(_3a){ |
| }; |
| dojo.connect(this,"receive",null,function(_3b){ |
| _3b.data=_3b.result; |
| this._cometd._deliver(_3b); |
| }); |
| _35.sendMessages=function(_3c){ |
| for(var i=0;i<_3c.length;i++){ |
| var _3d=_3c[i]; |
| var _3e=_3d.channel; |
| var _3f=this._cometd; |
| var _40={confirmation:function(){ |
| _3f._deliver({channel:_3e,successful:true}); |
| }}; |
| if(_3e=="/meta/subscribe"){ |
| this.subscribe(_3d.subscription,_40); |
| }else{ |
| if(_3e=="/meta/unsubscribe"){ |
| this.unsubscribe(_3d.subscription,_40); |
| }else{ |
| if(_3e=="/meta/connect"){ |
| _40.confirmation(); |
| }else{ |
| if(_3e=="/meta/disconnect"){ |
| _35.disconnect(); |
| _40.confirmation(); |
| }else{ |
| if(_3e.substring(0,6)!="/meta/"){ |
| this.publish(_3e,_3d.data); |
| } |
| } |
| } |
| } |
| } |
| } |
| }; |
| dojox.cometd.connectionTypes.register("rest-channels",_35.check,_35,false,true); |
| } |
| })(); |
| } |