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