follow through on changes
authorShikhar Bhushan <shikhar@schmizz.net>
Wed, 22 Apr 2009 23:56:38 +0000 (23:56 +0000)
committerShikhar Bhushan <shikhar@schmizz.net>
Wed, 22 Apr 2009 23:56:38 +0000 (23:56 +0000)
git-svn-id: http://ncclient.googlecode.com/svn/trunk@43 6dbcf712-26ac-11de-a2f3-1373824ab735

ncclient/listeners.py
ncclient/session.py

index 096a46e..c201bd6 100644 (file)
@@ -16,10 +16,13 @@ import logging
 from weakref import WeakValueDictionary
 
 import content
+from session import SessionCloseError
 
 logger = logging.getLogger('ncclient.listeners')
 
-session_listeners = {}
+################################################################################
+
+session_listeners = WeakValueDictionary
 def session_listener_factory(session):
     try:
         return session_listeners[session]
@@ -27,7 +30,7 @@ def session_listener_factory(session):
         session_listeners[session] = SessionListener()
         return session_listeners[session]
 
-class SessionListener(object):
+class SessionListener:
     
     def __init__(self):
         self._id2rpc = WeakValueDictionary()
@@ -37,8 +40,6 @@ class SessionListener(object):
     def __str__(self):
         return 'SessionListener'
     
-    
-    
     def expect_close(self):
         self._expecting_close = True
     
@@ -60,13 +61,13 @@ class SessionListener(object):
             logger.warning(e)
     
     def error(self, err):
-        from ssh import SessionCloseError
         if err is SessionCloseError:
-            logger.debug('received session close, expecting_close=%s' %
+            logger.debug('session closed by remote endpoint, expecting_close=%s' %
                          self._expecting_close)
             if not self._expecting_close:
                 raise err
 
+################################################################################
 
 class HelloListener:
     
@@ -76,6 +77,8 @@ class HelloListener:
     def __init__(self, session):
         self._session = session
     
+    ### Events
+    
     def reply(self, data):
         try:
             id, capabilities = content.Hello.parse(data)
@@ -87,14 +90,9 @@ class HelloListener:
     def error(self, err):
         self._session.initialize_error(err)
 
+################################################################################
 
 class DebugListener:
-    
-    def __str__(self):
-        return 'DebugListener'
-    
-    def reply(self, raw):
-        logger.debug('DebugListener:reply:\n%s' % raw)
-    
-    def error(self, err):
-        logger.debug('DebugListener:error:\n%s' % err)
\ No newline at end of file
+    def __str__(self): return 'DebugListener'
+    def reply(self, raw): logger.debug('DebugListener:reply:\n%s' % raw)
+    def error(self, err): logger.debug('DebugListener:error:\n%s' % err)
index 9d8ae06..a833398 100644 (file)
@@ -19,6 +19,7 @@ from Queue import Queue
 import content
 from capabilities import Capabilities, CAPABILITIES
 from error import ClientError
+from listeners import HelloListener
 from subject import Subject
 
 logger = logging.getLogger('ncclient.session')
@@ -29,32 +30,35 @@ class Session(Thread, Subject):
     
     def __init__(self):
         Thread.__init__(self, name='session')
-        Subject.__init__(self, listeners=[HelloListener(self)])
+        Subject.__init__(self)
         self._client_capabilities = CAPABILITIES
         self._server_capabilities = None # yet
         self._id = None # session-id
         self._error = None
         self._init_event = Event()
         self._q = Queue()
-        self._connected = False # to be set/cleared by subclass
+        self._connected = False # to be set/cleared by subclass implementation
     
     def _post_connect(self):
         # start the subclass' main loop
+        listener = HelloListener(self)
+        self.add_listener(listener)
         self.start()
         # queue client's hello message for sending
         self.send(content.Hello.build(self._client_capabilities))
-        # we expect server's hello message, wait for _init_event to be set by HelloListener
+        # we expect server's hello message, wait for _init_event to be set
         self._init_event.wait()
+        self.remove_listener(listener)
         # there may have been an error
         if self._error:
             self._close()
             raise self._error
     
-    def initialize(self, id, capabilities):
+    def hello(self, id, capabilities):
         self._id, self._capabilities = id, Capabilities(capabilities)
         self._init_event.set()
     
-    def initialize_error(self, err):
+    def hello_error(self, err):
         self._error = err
         self._init_event.set()