Author: damoxc

Revision: 6174

Log:
        implement a better remote events system

Diff:
Modified: trunk/deluge/ui/web/js/deluge-all/Deluge.Events.js
===================================================================
--- trunk/deluge/ui/web/js/deluge-all/Deluge.Events.js  2010-02-17 01:34:42 UTC 
(rev 6173)
+++ trunk/deluge/ui/web/js/deluge-all/Deluge.Events.js  2010-02-17 01:50:05 UTC 
(rev 6174)
@@ -60,9 +60,10 @@
                        Events.superclass.addListener.call(this, eventName, fn, 
scope, o);
                },
        
-               poll: function() {
+               getEvents: function() {
                        Deluge.Client.web.get_events({
-                               success: this.onPollSuccess,
+                               success: this.onGetEventsSuccess,
+                               failure: this.onGetEventsFailure,
                                scope: this
                        });
                },
@@ -74,18 +75,15 @@
                        Ext.each(this.toRegister, function(eventName) {
                                
Deluge.Client.web.register_event_listener(eventName);
                        });
-                       this.poll = this.poll.createDelegate(this);
-                       this.running = setInterval(this.poll, 2000);
-                       this.poll();
+                       this.running = true;
+                       this.getEvents();
                },
        
                /**
                 * Stops the EventsManager checking for events.
                 */
                stop: function() {
-                       if (this.running) {
-                               clearInterval(this.running); 
-                       }
+                       this.running = false;
                },
 
                // private
@@ -94,15 +92,22 @@
                        this.on('PluginEnabledEvent', this.onPluginEnabled, 
this);
                        this.on('PluginDisabledEvent', this.onPluginDisabled, 
this);
                },
-       
-               // private
-               onPollSuccess: function(events) {
+
+               onGetEventsSuccess: function(events) {
                        if (!events) return;
                        Ext.each(events, function(event) {
                                var name = event[0], args = event[1];
                                args.splice(0, 0, name);
                                this.fireEvent.apply(this, args);
                        }, this);
+                       if (this.running) this.getEvents();
+               },
+       
+               // private
+               onGetEventsFailure: function(events) {
+                       // the request timed out so we just want to open up 
another
+                       // one.
+                       if (this.running) this.getEvents();
                }
        });
 
@@ -113,7 +118,8 @@
        Events.prototype.on = Events.prototype.addListener
 
        /**
-        * Fires the specified event with the passed parameters (minus the 
event name).
+        * Fires the specified event with the passed parameters (minus the
+        * event name).
         * @method 
         */
        Events.prototype.fire = Events.prototype.fireEvent

Modified: trunk/deluge/ui/web/json_api.py
===================================================================
--- trunk/deluge/ui/web/json_api.py     2010-02-17 01:34:42 UTC (rev 6173)
+++ trunk/deluge/ui/web/json_api.py     2010-02-17 01:50:05 UTC (rev 6174)
@@ -42,6 +42,7 @@
 import tempfile
 
 from types import FunctionType
+from twisted.internet import reactor
 from twisted.internet.defer import Deferred, DeferredList
 from twisted.web import http, resource, server
 
@@ -328,6 +329,7 @@
         self.__events = {}
         self.__handlers = {}
         self.__queue = {}
+        self.__loopers = {}
 
     def add_listener(self, listener_id, event):
         """
@@ -337,7 +339,7 @@
         :type listener_id: string
         :param event: The event name
         :type event: string
-       """
+           """
         if event not in self.__events:
 
             def on_event(*args):
@@ -358,13 +360,27 @@
 
         :param listener_id: A unique id for the listener
         :type listener_id: string
-       """
+           """
+
+        # Check to see if we have anything to return immediately
         if listener_id in self.__queue:
             queue = self.__queue[listener_id]
             del self.__queue[listener_id]
             return queue
-        return None
 
+        # Create a deferred to and check again in 100ms
+        d = Deferred()
+        reactor.callLater(0.5, self._get_events, listener_id, d)
+        return d
+
+    def _get_events(self, listener_id, d):
+        if listener_id in self.__queue:
+            queue = self.__queue[listener_id]
+            del self.__queue[listener_id]
+            d.callback(queue)
+        else:
+            reactor.callLater(0.1, self._get_events, listener_id, d)
+
     def remove_listener(self, listener_id, event):
         """
         Remove a listener from the event queue.
@@ -373,7 +389,7 @@
         :type listener_id: string
         :param event: The event name
         :type event: string
-       """
+           """
         self.__events[event].remove(listener_id)
         if not self.__events[event]:
             client.deregister_event_handler(event, self.__handlers[event])


-- 
You received this message because you are subscribed to the Google Groups 
"deluge-commit" group.
To post to this group, send email to [email protected].
To unsubscribe from this group, send email to 
[email protected].
For more options, visit this group at 
http://groups.google.com/group/deluge-commit?hl=en.

Reply via email to