X-Git-Url: http://git.ithinksw.org/extjs.git/blobdiff_plain/ee06f37b0f6f6d94cd05a6ffae556660f7c4a2bc..c930e9176a5a85509c5b0230e2bff5c22a591432:/src/direct/PollingProvider.js?ds=sidebyside diff --git a/src/direct/PollingProvider.js b/src/direct/PollingProvider.js new file mode 100644 index 00000000..a95f453c --- /dev/null +++ b/src/direct/PollingProvider.js @@ -0,0 +1,151 @@ +/*! + * Ext JS Library 3.0.0 + * Copyright(c) 2006-2009 Ext JS, LLC + * licensing@extjs.com + * http://www.extjs.com/license + */ +/** + * @class Ext.direct.PollingProvider + * @extends Ext.direct.JsonProvider + * + *

Provides for repetitive polling of the server at distinct {@link #interval intervals}. + * The initial request for data originates from the client, and then is responded to by the + * server.

+ * + *

All configurations for the PollingProvider should be generated by the server-side + * API portion of the Ext.Direct stack.

+ * + *

An instance of PollingProvider may be created directly via the new keyword or by simply + * specifying type = 'polling'. For example:

+ *

+var pollA = new Ext.direct.PollingProvider({
+    type:'polling',
+    url: 'php/pollA.php',
+});
+Ext.Direct.addProvider(pollA);
+pollA.disconnect();
+
+Ext.Direct.addProvider(
+    {
+        type:'polling',
+        url: 'php/pollB.php',
+        id: 'pollB-provider'
+    }
+);
+var pollB = Ext.Direct.getProvider('pollB-provider');
+ * 
+ */ +Ext.direct.PollingProvider = Ext.extend(Ext.direct.JsonProvider, { + /** + * @cfg {Number} priority + * Priority of the request (defaults to 3). See {@link Ext.direct.Provider#priority}. + */ + // override default priority + priority: 3, + + /** + * @cfg {Number} interval + * How often to poll the server-side in milliseconds (defaults to 3000 - every + * 3 seconds). + */ + interval: 3000, + + /** + * @cfg {Object} baseParams An object containing properties which are to be sent as parameters + * on every polling request + */ + + /** + * @cfg {String/Function} url + * The url which the PollingProvider should contact with each request. This can also be + * an imported Ext.Direct method which will accept the baseParams as its only argument. + */ + + // private + constructor : function(config){ + Ext.direct.PollingProvider.superclass.constructor.call(this, config); + this.addEvents( + /** + * @event beforepoll + * Fired immediately before a poll takes place, an event handler can return false + * in order to cancel the poll. + * @param {Ext.direct.PollingProvider} + */ + 'beforepoll', + /** + * @event poll + * This event has not yet been implemented. + * @param {Ext.direct.PollingProvider} + */ + 'poll' + ); + }, + + // inherited + isConnected: function(){ + return !!this.pollTask; + }, + + /** + * Connect to the server-side and begin the polling process. To handle each + * response subscribe to the data event. + */ + connect: function(){ + if(this.url && !this.pollTask){ + this.pollTask = Ext.TaskMgr.start({ + run: function(){ + if(this.fireEvent('beforepoll', this) !== false){ + if(typeof this.url == 'function'){ + this.url(this.baseParams); + }else{ + Ext.Ajax.request({ + url: this.url, + callback: this.onData, + scope: this, + params: this.baseParams + }); + } + } + }, + interval: this.interval, + scope: this + }); + this.fireEvent('connect', this); + }else if(!this.url){ + throw 'Error initializing PollingProvider, no url configured.'; + } + }, + + /** + * Disconnect from the server-side and stop the polling process. The disconnect + * event will be fired on a successful disconnect. + */ + disconnect: function(){ + if(this.pollTask){ + Ext.TaskMgr.stop(this.pollTask); + delete this.pollTask; + this.fireEvent('disconnect', this); + } + }, + + // private + onData: function(opt, success, xhr){ + if(success){ + var events = this.getEvents(xhr); + for(var i = 0, len = events.length; i < len; i++){ + var e = events[i]; + this.fireEvent('data', this, e); + } + }else{ + var e = new Ext.Direct.ExceptionEvent({ + data: e, + code: Ext.Direct.exceptions.TRANSPORT, + message: 'Unable to connect to the server.', + xhr: xhr + }); + this.fireEvent('data', this, e); + } + } +}); + +Ext.Direct.PROVIDERS['polling'] = Ext.direct.PollingProvider; \ No newline at end of file