Revision 8024f8b5

b/ncclient/listeners.py
16 16
from weakref import WeakValueDictionary
17 17

  
18 18
import content
19
from session import SessionCloseError
19 20

  
20 21
logger = logging.getLogger('ncclient.listeners')
21 22

  
22
session_listeners = {}
23
################################################################################
24

  
25
session_listeners = WeakValueDictionary
23 26
def session_listener_factory(session):
24 27
    try:
25 28
        return session_listeners[session]
......
27 30
        session_listeners[session] = SessionListener()
28 31
        return session_listeners[session]
29 32

  
30
class SessionListener(object):
33
class SessionListener:
31 34
    
32 35
    def __init__(self):
33 36
        self._id2rpc = WeakValueDictionary()
......
37 40
    def __str__(self):
38 41
        return 'SessionListener'
39 42
    
40
    
41
    
42 43
    def expect_close(self):
43 44
        self._expecting_close = True
44 45
    
......
60 61
            logger.warning(e)
61 62
    
62 63
    def error(self, err):
63
        from ssh import SessionCloseError
64 64
        if err is SessionCloseError:
65
            logger.debug('received session close, expecting_close=%s' %
65
            logger.debug('session closed by remote endpoint, expecting_close=%s' %
66 66
                         self._expecting_close)
67 67
            if not self._expecting_close:
68 68
                raise err
69 69

  
70
################################################################################
70 71

  
71 72
class HelloListener:
72 73
    
......
76 77
    def __init__(self, session):
77 78
        self._session = session
78 79
    
80
    ### Events
81
    
79 82
    def reply(self, data):
80 83
        try:
81 84
            id, capabilities = content.Hello.parse(data)
......
87 90
    def error(self, err):
88 91
        self._session.initialize_error(err)
89 92

  
93
################################################################################
90 94

  
91 95
class DebugListener:
92
    
93
    def __str__(self):
94
        return 'DebugListener'
95
    
96
    def reply(self, raw):
97
        logger.debug('DebugListener:reply:\n%s' % raw)
98
    
99
    def error(self, err):
100
        logger.debug('DebugListener:error:\n%s' % err)
96
    def __str__(self): return 'DebugListener'
97
    def reply(self, raw): logger.debug('DebugListener:reply:\n%s' % raw)
98
    def error(self, err): logger.debug('DebugListener:error:\n%s' % err)
b/ncclient/session.py
19 19
import content
20 20
from capabilities import Capabilities, CAPABILITIES
21 21
from error import ClientError
22
from listeners import HelloListener
22 23
from subject import Subject
23 24

  
24 25
logger = logging.getLogger('ncclient.session')
......
29 30
    
30 31
    def __init__(self):
31 32
        Thread.__init__(self, name='session')
32
        Subject.__init__(self, listeners=[HelloListener(self)])
33
        Subject.__init__(self)
33 34
        self._client_capabilities = CAPABILITIES
34 35
        self._server_capabilities = None # yet
35 36
        self._id = None # session-id
36 37
        self._error = None
37 38
        self._init_event = Event()
38 39
        self._q = Queue()
39
        self._connected = False # to be set/cleared by subclass
40
        self._connected = False # to be set/cleared by subclass implementation
40 41
    
41 42
    def _post_connect(self):
42 43
        # start the subclass' main loop
44
        listener = HelloListener(self)
45
        self.add_listener(listener)
43 46
        self.start()
44 47
        # queue client's hello message for sending
45 48
        self.send(content.Hello.build(self._client_capabilities))
46
        # we expect server's hello message, wait for _init_event to be set by HelloListener
49
        # we expect server's hello message, wait for _init_event to be set
47 50
        self._init_event.wait()
51
        self.remove_listener(listener)
48 52
        # there may have been an error
49 53
        if self._error:
50 54
            self._close()
51 55
            raise self._error
52 56
    
53
    def initialize(self, id, capabilities):
57
    def hello(self, id, capabilities):
54 58
        self._id, self._capabilities = id, Capabilities(capabilities)
55 59
        self._init_event.set()
56 60
    
57
    def initialize_error(self, err):
61
    def hello_error(self, err):
58 62
        self._error = err
59 63
        self._init_event.set()
60 64
    

Also available in: Unified diff