1 // Copyright © 2017 Mozilla Foundation
2 //
3 // This program is made available under an ISC-style license. See the
4 // accompanying file LICENSE for details.
5
6 use cubeb_backend::Error;
7 use std::os::raw::c_int;
8
9 #[doc(hidden)]
_err<E>(e: E) -> Error where E: Into<Option<c_int>>,10 pub fn _err<E>(e: E) -> Error
11 where
12 E: Into<Option<c_int>>,
13 {
14 match e.into() {
15 Some(e) => unsafe { Error::from_raw(e) },
16 None => Error::error(),
17 }
18 }
19
20 #[macro_export]
21 macro_rules! send_recv {
22 ($rpc:expr, $smsg:ident => $rmsg:ident) => {{
23 let resp = send_recv!(__send $rpc, $smsg);
24 send_recv!(__recv resp, $rmsg)
25 }};
26 ($rpc:expr, $smsg:ident => $rmsg:ident()) => {{
27 let resp = send_recv!(__send $rpc, $smsg);
28 send_recv!(__recv resp, $rmsg __result)
29 }};
30 ($rpc:expr, $smsg:ident($($a:expr),*) => $rmsg:ident) => {{
31 let resp = send_recv!(__send $rpc, $smsg, $($a),*);
32 send_recv!(__recv resp, $rmsg)
33 }};
34 ($rpc:expr, $smsg:ident($($a:expr),*) => $rmsg:ident()) => {{
35 let resp = send_recv!(__send $rpc, $smsg, $($a),*);
36 send_recv!(__recv resp, $rmsg __result)
37 }};
38 //
39 (__send $rpc:expr, $smsg:ident) => ({
40 $rpc.call(ServerMessage::$smsg)
41 });
42 (__send $rpc:expr, $smsg:ident, $($a:expr),*) => ({
43 $rpc.call(ServerMessage::$smsg($($a),*))
44 });
45 (__recv $resp:expr, $rmsg:ident) => ({
46 match $resp.wait() {
47 Ok(ClientMessage::$rmsg) => Ok(()),
48 Ok(ClientMessage::Error(e)) => Err($crate::send_recv::_err(e)),
49 Ok(m) => {
50 debug!("received wrong message - got={:?}", m);
51 Err($crate::send_recv::_err(None))
52 },
53 Err(e) => {
54 debug!("received error from rpc - got={:?}", e);
55 Err($crate::send_recv::_err(None))
56 },
57 }
58 });
59 (__recv $resp:expr, $rmsg:ident __result) => ({
60 match $resp.wait() {
61 Ok(ClientMessage::$rmsg(v)) => Ok(v),
62 Ok(ClientMessage::Error(e)) => Err($crate::send_recv::_err(e)),
63 Ok(m) => {
64 debug!("received wrong message - got={:?}", m);
65 Err($crate::send_recv::_err(None))
66 },
67 Err(e) => {
68 debug!("received error - got={:?}", e);
69 Err($crate::send_recv::_err(None))
70 },
71 }
72 })
73 }
74