Revision e91a5349 ncclient/operations/rpc.py

b/ncclient/operations/rpc.py
16 16
from uuid import uuid1
17 17
from weakref import WeakKeyDictionary
18 18

  
19
from . import logger
19 20
from listener import SessionListener
20 21
from ncclient.content.builders import RPCBuilder
21 22
from ncclient.content.parsers import RPCReplyParser
22 23

  
24
_listeners = WeakKeyDictionary()
25
_lock = Lock()
26

  
27
def get_listener(session):
28
    with self._lock:
29
        return _listeners.setdefault(session, ReplyListener())
30

  
23 31
class RPC:
24
    
25
    _listeners = WeakKeyDictionary()
26
    _lock = Lock()
27
    
32
        
28 33
    def __init__(self, session):
29 34
        self._session = session
30 35
        self._id = None
......
32 37
        self._reply_event = None
33 38
    
34 39
    @property
35
    def _listener(self):
36
        with self._lock:
37
            return self._listeners.setdefault(self._session, SessionListener())
38 40
    
39
    def deliver(self, raw):
40
        self._reply = RPCReply(raw)
41
        self._reply_event.set()
42
    
43
    def _do_request(self, op, reply_event=None):
41
    def _request(self, op):
44 42
        self._id = uuid1().urn
43
        self._reply = RPCReply()
45 44
        # get the listener instance for this session
46 45
        # <rpc-reply> with message id will reach response_cb
47 46
        self._listener.register(self._id, self)
......
56 55
            self._reply_event = Event()
57 56
            self._reply_event.wait()
58 57
            self._reply.parse()
59
            return self._reply
58
        return self._reply
60 59
    
61 60
    def request(self, *args, **kwds):
62 61
        raise NotImplementedError
......
82 81

  
83 82
class RPCReply:
84 83
    
85
    def __init__(self, raw):
86
        self._raw = raw
87
        self._parsed = False
88
        self._errs = []
84
    def __init__(self, event):
85
        self._delivery_event = event
86
        self._raw = None
87
        self._errs = None
89 88
    
90 89
    def __str__(self):
91 90
        return self._raw
......
97 96
                self._errs.append(RPCError(raw, err_dict))
98 97
            self._parsed = True
99 98
    
99
    def deliver(self, raw):
100
        self._raw = raw
101
        self._delivery_event.set()
102
    
103
    def received(self, timeout=None):
104
        self._delivery_event.wait(timeout)
105
        return True
106
    
100 107
    @property
101 108
    def raw(self):
102 109
        return self._raw
......
153 160
    @property
154 161
    def info(self):
155 162
        return self._dict.get('info', None)
163

  
164
class Notification:
165
    
166
    pass
167

  
168

  
169

  
170
from builder import TreeBuilder
171
from common import BASE_NS
172
from common import qualify as _
173

  
174
################################################################################
175

  
176
_ = qualify
177

  
178
def build(msgid, op, encoding='utf-8'):
179
    "TODO: docstring"
180
    if isinstance(op, basestring):
181
        return RPCBuilder.build_from_string(msgid, op, encoding)
182
    else:
183
        return RPCBuilder.build_from_spec(msgid, op, encoding)
184

  
185
def build_from_spec(msgid, opspec, encoding='utf-8'):
186
    "TODO: docstring"
187
    spec = {
188
        'tag': _('rpc', BASE_NS),
189
        'attributes': {'message-id': msgid},
190
        'children': opspec
191
        }
192
    return TreeBuilder(spec).to_string(encoding)
193

  
194
def build_from_string(msgid, opstr, encoding='utf-8'):
195
    "TODO: docstring"
196
    decl = '<?xml version="1.0" encoding="%s"?>' % encoding
197
    doc = (u'''<rpc message-id="%s" xmlns="%s">%s</rpc>''' %
198
           (msgid, BASE_NS, opstr)).encode(encoding)
199
    return (decl + doc)
200

  
201
################################################################################
202

  
203
# parsing stuff TODO
204

  
205

  

Also available in: Unified diff