123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170 |
- /*
- Copyright (c) 2004-2012, 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.longPollTransportJsonEncoded"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
- dojo._hasResource["dojox.cometd.longPollTransportJsonEncoded"] = true;
- dojo.provide("dojox.cometd.longPollTransportJsonEncoded");
- dojo.require("dojox.cometd._base");
- dojox.cometd.longPollTransportJsonEncoded = new function(){
- // This is an alternative implementation to that provided in logPollTransportFormEncoded.js
- // that sends messages as text/json rather than form encoding them.
-
- this._connectionType="long-polling";
- this._cometd=null;
- this.check = function(types, version, xdomain){
- return ((!xdomain)&&(dojo.indexOf(types, "long-polling") >= 0));
- }
- this.tunnelInit = function(){
- var message = {
- channel: "/meta/connect",
- clientId: this._cometd.clientId,
- connectionType: this._connectionType,
- id: ""+this._cometd.messageId++
- };
- message=this._cometd._extendOut(message);
- this.openTunnelWith([message]);
- }
- this.tunnelCollapse = function(){
- // TODO handle transport specific advice
-
- if(!this._cometd._initialized){ return; }
-
- if(this._cometd._advice && this._cometd._advice["reconnect"]=="none"){
- return;
- }
- if (this._cometd._status=="connected") {
- setTimeout(dojo.hitch(this,function(){this._connect();}),this._cometd._interval());
- }else{
- setTimeout(dojo.hitch(this._cometd,function(){this.init(this.url,this._props);}),this._cometd._interval());
- }
- }
- this._connect = function(){
- if(!this._cometd._initialized){ return; }
- if(this._cometd._polling) {
- return;
- }
-
- if((this._cometd._advice) && (this._cometd._advice["reconnect"]=="handshake")){
- this._cometd._status="unconnected";
- this._initialized = false;
- this._cometd.init(this._cometd.url,this._cometd._props);
- }else if(this._cometd._status=="connected"){
- var message={
- channel: "/meta/connect",
- connectionType: this._connectionType,
- clientId: this._cometd.clientId,
- id: ""+this._cometd.messageId++
- };
- if (this._cometd.connectTimeout>=this._cometd.expectedNetworkDelay){
- message.advice={timeout:(this._cometd.connectTimeout-this._cometd.expectedNetworkDelay)};
- }
- message=this._cometd._extendOut(message);
- this.openTunnelWith([message]);
- }
- }
- this.deliver = function(message){
- // Nothing to do
- }
- this.openTunnelWith = function(messages, url){
- this._cometd._polling = true;
- var post = {
- url: (url||this._cometd.url),
- postData: dojo.toJson(messages),
- contentType: "text/json;charset=UTF-8",
- handleAs: this._cometd.handleAs,
- load: dojo.hitch(this, function(data){
- this._cometd._polling=false;
- this._cometd.deliver(data);
- this._cometd._backon();
- this.tunnelCollapse();
- }),
- error: dojo.hitch(this, function(err){
- this._cometd._polling=false;
- var metaMsg = {
- failure: true,
- error: err,
- advice: this._cometd._advice
- };
- this._cometd._publishMeta("connect",false, metaMsg);
- this._cometd._backoff();
- this.tunnelCollapse();
- })
- };
- var connectTimeout=this._cometd._connectTimeout();
- if (connectTimeout>0) {
- post.timeout=connectTimeout;
- }
- this._poll = dojo.rawXhrPost(post);
- }
- this.sendMessages = function(messages){
- for(var i=0; i<messages.length; i++){
- messages[i].clientId = this._cometd.clientId;
- messages[i].id = ""+this._cometd.messageId++;
- messages[i]=this._cometd._extendOut(messages[i]);
- }
- return dojo.rawXhrPost({
- url: this._cometd.url||dojo.config["cometdRoot"],
- handleAs: this._cometd.handleAs,
- load: dojo.hitch(this._cometd, "deliver"),
- postData: dojo.toJson(messages),
- contentType: "text/json;charset=UTF-8",
- error: dojo.hitch(this, function(err){
- this._cometd._publishMeta("publish",false,{messages:messages});
- }),
- timeout: this._cometd.expectedNetworkDelay
- });
- }
- this.startup = function(handshakeData){
- if(this._cometd._status=="connected"){ return; }
- this.tunnelInit();
- }
- this.disconnect = function(){
- var message = {
- channel: "/meta/disconnect",
- clientId: this._cometd.clientId,
- id: "" + this._cometd.messageId++
- };
- message = this._cometd._extendOut(message);
- dojo.rawXhrPost({
- url: this._cometd.url || dojo.config["cometdRoot"],
- handleAs: this._cometd.handleAs,
- postData: dojo.toJson([message]),
- contentType: "text/json;charset=UTF-8"
- });
- }
- this.cancelConnect = function(){
- if(this._poll){
- this._poll.cancel();
- this._cometd._polling=false;
- this._cometd._publishMeta("connect",false,{cancel:true});
- this._cometd._backoff();
- this.disconnect();
- this.tunnelCollapse();
- }
- }
- }
- dojox.cometd.longPollTransport = dojox.cometd.longPollTransportJsonEncoded;
- dojox.cometd.connectionTypes.register("long-polling", dojox.cometd.longPollTransport.check, dojox.cometd.longPollTransportJsonEncoded);
- dojox.cometd.connectionTypes.register("long-polling-json-encoded", dojox.cometd.longPollTransport.check, dojox.cometd.longPollTransportJsonEncoded);
- }
|