From 8024f8b5b376be6c80b13ccd6ecbc8ed9b433dfa Mon Sep 17 00:00:00 2001 From: Shikhar Bhushan Date: Wed, 22 Apr 2009 23:56:38 +0000 Subject: [PATCH] follow through on changes git-svn-id: http://ncclient.googlecode.com/svn/trunk@43 6dbcf712-26ac-11de-a2f3-1373824ab735 --- ncclient/listeners.py | 28 +++++++++++++--------------- ncclient/session.py | 14 +++++++++----- 2 files changed, 22 insertions(+), 20 deletions(-) diff --git a/ncclient/listeners.py b/ncclient/listeners.py index 096a46e..c201bd6 100644 --- a/ncclient/listeners.py +++ b/ncclient/listeners.py @@ -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) diff --git a/ncclient/session.py b/ncclient/session.py index 9d8ae06..a833398 100644 --- a/ncclient/session.py +++ b/ncclient/session.py @@ -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() -- 1.7.10.4