Revision 38a9b062 ncclient/rpc.py
b/ncclient/rpc.py | ||
---|---|---|
12 | 12 |
# See the License for the specific language governing permissions and |
13 | 13 |
# limitations under the License. |
14 | 14 |
|
15 |
from threading import Event |
|
15 |
from threading import Event, Lock
|
|
16 | 16 |
|
17 | 17 |
from listener import SessionListener |
18 | 18 |
|
19 |
from uuid import uuid1 |
|
20 |
|
|
19 | 21 |
class RPC: |
20 | 22 |
|
21 |
current_id = {} |
|
22 |
listeners = {} |
|
23 |
|
|
24 |
def __init__(self, session=None, async=False): |
|
25 |
self._session = None |
|
26 |
self._async = None |
|
23 |
def __init__(self, session, async=False): |
|
24 |
self._session = session |
|
25 |
self._async = async |
|
27 | 26 |
self._reply = None |
28 |
self._event = Event() |
|
29 |
|
|
30 |
def get_reply(self, timeout=2.0): |
|
31 |
self._event.wait(timeout) |
|
32 |
if self._event.isSet(): |
|
33 |
return self._reply |
|
34 |
|
|
35 |
def do(self, async=False): |
|
27 |
self._reply_event = Event() |
|
28 |
self._id = uuid1().urn |
|
29 |
|
|
30 |
def _listener(self): |
|
31 |
if not RPC.listeners.has_key(self._session.id): |
|
32 |
RPC.listeners[self._session.id] = SessionListener() |
|
33 |
return RPC.listeners[self._session.id] |
|
34 |
|
|
35 |
def request(self, async=False): |
|
36 | 36 |
self._async = async |
37 |
listener = SessionListener(self._session.id) |
|
38 |
session.add_listener(listener) |
|
39 |
listener.register(self._id, self) |
|
40 |
self._session.send(self.to_xml()) |
|
37 | 41 |
|
38 |
def _deliver(self, reply):
|
|
39 |
self._reply = reply |
|
42 |
def response_cb(self, reply):
|
|
43 |
self._reply = reply # does callback parse??
|
|
40 | 44 |
self._event.set() |
41 |
|
|
45 |
|
|
42 | 46 |
@property |
43 | 47 |
def has_reply(self): |
44 |
return self._event.isSet() |
|
48 |
return self._reply_event.isSet() |
|
49 |
|
|
50 |
def wait_on_reply(self, timeout=None): |
|
51 |
self._reply_event.wait(timeout) |
|
45 | 52 |
|
46 | 53 |
@property |
47 | 54 |
def is_async(self): |
48 | 55 |
return self._async |
49 | 56 |
|
50 | 57 |
@property |
51 |
def listener(self): |
|
52 |
if RPC.listeners[self._sid] is None: |
|
53 |
RPC.listeners[self.sid] = SessionListener() |
|
54 |
return RPC.listeners[self._sid] |
|
55 |
|
|
56 |
def _next_id(self): |
|
57 |
RPC.current_id[self._session.id] = RPC.current_id.get(self._session.id, 0) + 1 |
|
58 |
return RPC.current_id[self._sid] |
|
58 |
def id(self): |
|
59 |
return self._id |
Also available in: Unified diff