Upgrade to ExtJS 4.0.0 - Released 04/26/2011
[extjs.git] / src / direct / PollingProvider.js
1 /**
2  * @class Ext.direct.PollingProvider
3  * @extends Ext.direct.JsonProvider
4  *
5  * <p>Provides for repetitive polling of the server at distinct {@link #interval intervals}.
6  * The initial request for data originates from the client, and then is responded to by the
7  * server.</p>
8  * 
9  * <p>All configurations for the PollingProvider should be generated by the server-side
10  * API portion of the Ext.Direct stack.</p>
11  *
12  * <p>An instance of PollingProvider may be created directly via the new keyword or by simply
13  * specifying <tt>type = 'polling'</tt>.  For example:</p>
14  * <pre><code>
15 var pollA = new Ext.direct.PollingProvider({
16     type:'polling',
17     url: 'php/pollA.php',
18 });
19 Ext.direct.Manager.addProvider(pollA);
20 pollA.disconnect();
21
22 Ext.direct.Manager.addProvider(
23     {
24         type:'polling',
25         url: 'php/pollB.php',
26         id: 'pollB-provider'
27     }
28 );
29 var pollB = Ext.direct.Manager.getProvider('pollB-provider');
30  * </code></pre>
31  */
32 Ext.define('Ext.direct.PollingProvider', {
33     
34     /* Begin Definitions */
35     
36     extend: 'Ext.direct.JsonProvider',
37     
38     alias: 'direct.pollingprovider',
39     
40     uses: ['Ext.direct.ExceptionEvent'],
41     
42     requires: ['Ext.Ajax', 'Ext.util.DelayedTask'],
43     
44     /* End Definitions */
45     
46     /**
47      * @cfg {Number} interval
48      * How often to poll the server-side in milliseconds (defaults to <tt>3000</tt> - every
49      * 3 seconds).
50      */
51     interval: 3000,
52
53     /**
54      * @cfg {Object} baseParams An object containing properties which are to be sent as parameters
55      * on every polling request
56      */
57     
58     /**
59      * @cfg {String/Function} url
60      * The url which the PollingProvider should contact with each request. This can also be
61      * an imported Ext.Direct method which will accept the baseParams as its only argument.
62      */
63
64     // private
65     constructor : function(config){
66         this.callParent(arguments);
67         this.addEvents(
68             /**
69              * @event beforepoll
70              * Fired immediately before a poll takes place, an event handler can return false
71              * in order to cancel the poll.
72              * @param {Ext.direct.PollingProvider}
73              */
74             'beforepoll',            
75             /**
76              * @event poll
77              * This event has not yet been implemented.
78              * @param {Ext.direct.PollingProvider}
79              */
80             'poll'
81         );
82     },
83
84     // inherited
85     isConnected: function(){
86         return !!this.pollTask;
87     },
88
89     /**
90      * Connect to the server-side and begin the polling process. To handle each
91      * response subscribe to the data event.
92      */
93     connect: function(){
94         var me = this, url = me.url;
95         
96         if (url && !me.pollTask) {
97             me.pollTask = Ext.TaskManager.start({
98                 run: function(){
99                     if (me.fireEvent('beforepoll', me) !== false) {
100                         if (Ext.isFunction(url)) {
101                             url(me.baseParams);
102                         } else {
103                             Ext.Ajax.request({
104                                 url: url,
105                                 callback: me.onData,
106                                 scope: me,
107                                 params: me.baseParams
108                             });
109                         }
110                     }
111                 },
112                 interval: me.interval,
113                 scope: me
114             });
115             me.fireEvent('connect', me);
116         } else if (!url) {
117             //<debug>
118             Ext.Error.raise('Error initializing PollingProvider, no url configured.');
119             //</debug>
120         }
121     },
122
123     /**
124      * Disconnect from the server-side and stop the polling process. The disconnect
125      * event will be fired on a successful disconnect.
126      */
127     disconnect: function(){
128         var me = this;
129         
130         if (me.pollTask) {
131             Ext.TaskManager.stop(me.pollTask);
132             delete me.pollTask;
133             me.fireEvent('disconnect', me);
134         }
135     },
136
137     // private
138     onData: function(opt, success, response){
139         var me = this, 
140             i = 0, 
141             len,
142             events;
143         
144         if (success) {
145             events = me.createEvents(response);
146             for (len = events.length; i < len; ++i) {
147                 me.fireEvent('data', me, events[i]);
148             }
149         } else {
150             me.fireEvent('data', me, Ext.create('Ext.direct.ExceptionEvent', {
151                 data: null,
152                 code: Ext.direct.Manager.self.exceptions.TRANSPORT,
153                 message: 'Unable to connect to the server.',
154                 xhr: response
155             }));
156         }
157     }
158 });