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