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