Revision d6688264 ncclient/glue.py
b/ncclient/glue.py | ||
---|---|---|
15 | 15 |
"TODO: docstring" |
16 | 16 |
|
17 | 17 |
from cStringIO import StringIO |
18 |
from threading import Thread |
|
19 |
from Queue import Queue |
|
20 |
from threading import Lock |
|
18 |
from threading import Thread, Lock |
|
21 | 19 |
from xml.etree import cElementTree as ET |
22 | 20 |
|
23 | 21 |
import logging |
24 | 22 |
logger = logging.getLogger('ncclient.glue') |
25 | 23 |
|
24 |
|
|
26 | 25 |
def parse_root(raw): |
27 | 26 |
'''Parse the top-level element from a string representing an XML document. |
28 | 27 |
|
... | ... | |
30 | 29 |
the qualified name of the root element and `attributes` is an |
31 | 30 |
`{attribute: value}` dictionary. |
32 | 31 |
''' |
33 |
fp = StringIO(raw)
|
|
32 |
fp = StringIO(raw[:1024]) # this is a guess but start element beyond 1024 bytes would be a bit absurd
|
|
34 | 33 |
for event, element in ET.iterparse(fp, events=('start',)): |
35 | 34 |
return (element.tag, element.attrib) |
36 | 35 |
|
... | ... | |
42 | 41 |
def __init__(self): |
43 | 42 |
"TODO: docstring" |
44 | 43 |
Thread.__init__(self) |
45 |
self._q = Queue() |
|
46 | 44 |
self._listeners = set() # TODO(?) weakref |
47 | 45 |
self._lock = Lock() |
48 | 46 |
|
49 | 47 |
def _dispatch_message(self, raw): |
50 | 48 |
"TODO: docstring" |
51 |
root = parse_root(raw) |
|
49 |
try: |
|
50 |
root = parse_root(raw) |
|
51 |
except Exception as e: |
|
52 |
logger.error('error parsing dispatch message: %s' % e) |
|
53 |
return |
|
52 | 54 |
with self._lock: |
53 | 55 |
listeners = list(self._listeners) |
54 | 56 |
for l in listeners: |
... | ... | |
89 | 91 |
for listener in self._listeners: |
90 | 92 |
if isinstance(listener, cls): |
91 | 93 |
return listener |
92 |
|
|
93 |
def send(self, message): |
|
94 |
"TODO: docstring" |
|
95 |
logger.debug('queueing %s' % message) |
|
96 |
self._q.put(message) |
|
97 | 94 |
|
98 | 95 |
|
99 | 96 |
class Listener(object): |
Also available in: Unified diff