Revision a14c36f9 ncclient/transport/session.py

b/ncclient/transport/session.py
23 23
import logging
24 24
logger = logging.getLogger('ncclient.transport.session')
25 25

  
26
class Session(Subject):
26
class Session(Thread):
27 27
    
28 28
    "TODO: docstring"
29 29
    
30 30
    def __init__(self, capabilities):
31 31
        "Subclass constructor should call this"
32
        Subject.__init__(self)
32
        Thread.__init__(self)
33
        self.setDaemon(True)
34
        self._listeners = set() # TODO(?) weakref
35
        self._lock = Lock()
33 36
        self.setName('session')
34 37
        self._q = Queue()
35 38
        self._client_capabilities = capabilities
......
65 68
        logger.info('initialized: session-id=%s | server_capabilities=%s' %
66 69
                     (self._id, self._server_capabilities))
67 70
    
71
    def _dispatch_message(self, raw):
72
        "TODO: docstring"
73
        try:
74
            root = parse_root(raw)
75
        except Exception as e:
76
            logger.error('error parsing dispatch message: %s' % e)
77
            return
78
        with self._lock:
79
            listeners = list(self._listeners)
80
        for l in listeners:
81
            logger.debug('dispatching message to %r' % l)
82
            try:
83
                l.callback(root, raw)
84
            except Exception as e:
85
                logger.warning('[error] %r' % e)
86
    
87
    def _dispatch_error(self, err):
88
        "TODO: docstring"
89
        with self._lock:
90
            listeners = list(self._listeners)
91
        for l in listeners:
92
            logger.debug('dispatching error to %r' % l)
93
            try:
94
                l.errback(err)
95
            except Exception as e:
96
                logger.warning('error %r' % e)
97
    
98
    def add_listener(self, listener):
99
        "TODO: docstring"
100
        logger.debug('installing listener %r' % listener)
101
        with self._lock:
102
            self._listeners.add(listener)
103
    
104
    def remove_listener(self, listener):
105
        "TODO: docstring"
106
        logger.debug('discarding listener %r' % listener)
107
        with self._lock:
108
            self._listeners.discard(listener)
109
    
110
    def get_listener_instance(self, cls):
111
        '''This is useful when we want to maintain one listener of a particular
112
        type per subject i.e. a multiton.
113
        '''
114
        with self._lock:
115
            for listener in self._listeners:
116
                if isinstance(listener, cls):
117
                    return listener
118
    
68 119
    def connect(self, *args, **kwds):
69 120
        "Subclass implements"
70 121
        raise NotImplementedError

Also available in: Unified diff