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