implement the...
Content-type: text/plain

Author: damoxc

Revision: 5743

Log:
        fix a KeyError in the JSON component
implement the EventQueue for the server side handling of events

Diff:
Modified: trunk/deluge/ui/web/json_api.py
===================================================================
--- trunk/deluge/ui/web/json_api.py     2009-09-14 10:36:40 UTC (rev 5742)
+++ trunk/deluge/ui/web/json_api.py     2009-09-14 15:41:12 UTC (rev 5743)
@@ -142,9 +142,9 @@
         client.disconnect()
     
     def enable(self):
-        if component.get("DelugeWeb").config["deluge_daemon"]:
+        if component.get("DelugeWeb").config["default_daemon"]:
             # Sort out getting the default daemon here
-            default = component.get("DelugeWeb").config["deluge_daemon"]
+            default = component.get("DelugeWeb").config["default_daemon"]
             host = component.get("Web").get_host(default)
             self.connect()
 
@@ -318,6 +318,68 @@
 
 FILES_KEYS = ["files", "file_progress", "file_priorities"]
 
+class EventQueue(object):
+    """
+    This class subscribes to events from the core and stores them until all
+    the subscribed listeners have received the events.
+    """
+    
+    def __init__(self):
+        self.__events = {}
+        self.__handlers = {}
+        self.__queue = {}
+    
+    def add_listener(self, listener_id, event):
+        """
+        Add a listener to the event queue.
+        
+        :param listener_id: A unique id for the listener
+        :type listener_id: string
+        :param event: The event name
+        :type event: string
+       """
+        if event not in self.__events:
+            
+            def on_event(*args):
+                for listener in self.__events[event]:
+                    if listener not in self.__queue:
+                        self.__queue[listener] = []
+                    self.__queue[listener].append((event, args))
+            
+            client.register_event_handler(event, on_event)
+            self.__handlers[event] = on_event
+            self.__events[event] = [listener_id]
+        else:
+            self.__events[event].append(listener_id)
+    
+    def get_events(self, listener_id):
+        """
+        Retrieve the pending events for the listener.
+        
+        :param listener_id: A unique id for the listener
+        :type listener_id: string
+       """
+        if listener_id in self.__queue:
+            queue = self.__queue[listener_id]
+            del self.__queue[listener_id]
+            return queue
+        return None
+    
+    def remove_listener(self, listener_id, event):
+        """
+        Remove a listener from the event queue.
+        
+        :param listener_id: The unique id for the listener
+        :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])
+            del self.__events[event]
+            del self.__handlers[event]
+
 class WebApi(JSONComponent):
     """
     The component that implements all the methods required for managing
@@ -329,6 +391,7 @@
         super(WebApi, self).__init__("Web")
         self.host_list = ConfigManager("hostlist.conf.1.2", DEFAULT_HOSTS)
         self.core_config = CoreConfig()
+        self.event_queue = EventQueue()
 
     def get_host(self, host_id):
         """
@@ -720,4 +783,31 @@
     
     @export
     def get_plugin_info(self, name):
-        return component.get("Web.PluginManager").get_plugin_info(name)
\ No newline at end of file
+        return component.get("Web.PluginManager").get_plugin_info(name)
+    
+    @export
+    def register_event_listener(self, event):
+        """
+        Add a listener to the event queue.
+        
+        :param event: The event name
+        :type event: string
+       """
+        self.event_queue.add_listener(__request__.session_id, event)
+    
+    @export
+    def deregister_event_listener(self, event):
+        """
+        Remove an event listener from the event queue.
+        
+        :param event: The event name
+        :type event: string
+       """
+        self.event_queue.remove_listener(__request__.session_id, event)
+    
+    @export
+    def get_events(self):
+        """
+        Retrieve the pending events for the session.
+       """
+        return self.event_queue.get_events(__request__.session_id)
\ No newline at end of file



--~--~---------~--~----~------------~-------~--~----~
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