1*cf78ab8cSAndroid Build Coastguard Worker //! Frontend-client library for rust. 2*cf78ab8cSAndroid Build Coastguard Worker /// 3*cf78ab8cSAndroid Build Coastguard Worker /// Rust to C++ Grpc frontend.proto for Windows, linux and mac. 4*cf78ab8cSAndroid Build Coastguard Worker /// 5*cf78ab8cSAndroid Build Coastguard Worker /// This can be replaced with grpcio native implementation when the 6*cf78ab8cSAndroid Build Coastguard Worker /// Windows build works. 7*cf78ab8cSAndroid Build Coastguard Worker 8*cf78ab8cSAndroid Build Coastguard Worker /// Wrapper struct for application defined ClientResponseReader 9*cf78ab8cSAndroid Build Coastguard Worker pub struct ClientResponseReader { 10*cf78ab8cSAndroid Build Coastguard Worker /// Delegated handler for reading responses 11*cf78ab8cSAndroid Build Coastguard Worker pub handler: Box<dyn ClientResponseReadable>, 12*cf78ab8cSAndroid Build Coastguard Worker } 13*cf78ab8cSAndroid Build Coastguard Worker 14*cf78ab8cSAndroid Build Coastguard Worker /// Delegating functions to handler 15*cf78ab8cSAndroid Build Coastguard Worker impl ClientResponseReader { handle_chunk(&self, chunk: &[u8])16*cf78ab8cSAndroid Build Coastguard Worker fn handle_chunk(&self, chunk: &[u8]) { 17*cf78ab8cSAndroid Build Coastguard Worker self.handler.handle_chunk(chunk); 18*cf78ab8cSAndroid Build Coastguard Worker } handle_error(&self, error_code: u32, error_message: &str)19*cf78ab8cSAndroid Build Coastguard Worker fn handle_error(&self, error_code: u32, error_message: &str) { 20*cf78ab8cSAndroid Build Coastguard Worker self.handler.handle_error(error_code, error_message); 21*cf78ab8cSAndroid Build Coastguard Worker } 22*cf78ab8cSAndroid Build Coastguard Worker } 23*cf78ab8cSAndroid Build Coastguard Worker 24*cf78ab8cSAndroid Build Coastguard Worker /// Trait for ClientResponseReader handler functions 25*cf78ab8cSAndroid Build Coastguard Worker pub trait ClientResponseReadable { 26*cf78ab8cSAndroid Build Coastguard Worker /// Process each chunk of streaming response handle_chunk(&self, chunk: &[u8])27*cf78ab8cSAndroid Build Coastguard Worker fn handle_chunk(&self, chunk: &[u8]); 28*cf78ab8cSAndroid Build Coastguard Worker /// Process errors in response handle_error(&self, error_code: u32, error_message: &str)29*cf78ab8cSAndroid Build Coastguard Worker fn handle_error(&self, error_code: u32, error_message: &str); 30*cf78ab8cSAndroid Build Coastguard Worker } 31*cf78ab8cSAndroid Build Coastguard Worker 32*cf78ab8cSAndroid Build Coastguard Worker #[cxx::bridge(namespace = "netsim::frontend")] 33*cf78ab8cSAndroid Build Coastguard Worker #[allow(clippy::needless_maybe_sized)] 34*cf78ab8cSAndroid Build Coastguard Worker #[allow(missing_docs)] 35*cf78ab8cSAndroid Build Coastguard Worker #[allow(unsafe_op_in_unsafe_fn)] 36*cf78ab8cSAndroid Build Coastguard Worker pub mod frontend_client_ffi { 37*cf78ab8cSAndroid Build Coastguard Worker // Shared enum GrpcMethod 38*cf78ab8cSAndroid Build Coastguard Worker #[derive(Debug, PartialEq, Eq)] 39*cf78ab8cSAndroid Build Coastguard Worker pub enum GrpcMethod { 40*cf78ab8cSAndroid Build Coastguard Worker GetVersion, 41*cf78ab8cSAndroid Build Coastguard Worker CreateDevice, 42*cf78ab8cSAndroid Build Coastguard Worker DeleteChip, 43*cf78ab8cSAndroid Build Coastguard Worker PatchDevice, 44*cf78ab8cSAndroid Build Coastguard Worker ListDevice, 45*cf78ab8cSAndroid Build Coastguard Worker Reset, 46*cf78ab8cSAndroid Build Coastguard Worker ListCapture, 47*cf78ab8cSAndroid Build Coastguard Worker PatchCapture, 48*cf78ab8cSAndroid Build Coastguard Worker GetCapture, 49*cf78ab8cSAndroid Build Coastguard Worker } 50*cf78ab8cSAndroid Build Coastguard Worker 51*cf78ab8cSAndroid Build Coastguard Worker extern "Rust" { 52*cf78ab8cSAndroid Build Coastguard Worker type ClientResponseReader; handle_chunk(&self, chunk: &[u8])53*cf78ab8cSAndroid Build Coastguard Worker fn handle_chunk(&self, chunk: &[u8]); handle_error(&self, error_code: u32, error_message: &str)54*cf78ab8cSAndroid Build Coastguard Worker fn handle_error(&self, error_code: u32, error_message: &str); 55*cf78ab8cSAndroid Build Coastguard Worker } 56*cf78ab8cSAndroid Build Coastguard Worker 57*cf78ab8cSAndroid Build Coastguard Worker // C++ types and signatures exposed to Rust. 58*cf78ab8cSAndroid Build Coastguard Worker unsafe extern "C++" { 59*cf78ab8cSAndroid Build Coastguard Worker include!("frontend/frontend_client.h"); 60*cf78ab8cSAndroid Build Coastguard Worker 61*cf78ab8cSAndroid Build Coastguard Worker type FrontendClient; 62*cf78ab8cSAndroid Build Coastguard Worker type ClientResult; 63*cf78ab8cSAndroid Build Coastguard Worker 64*cf78ab8cSAndroid Build Coastguard Worker #[allow(dead_code)] 65*cf78ab8cSAndroid Build Coastguard Worker #[rust_name = "new_frontend_client"] NewFrontendClient(server: &CxxString) -> UniquePtr<FrontendClient>66*cf78ab8cSAndroid Build Coastguard Worker pub fn NewFrontendClient(server: &CxxString) -> UniquePtr<FrontendClient>; 67*cf78ab8cSAndroid Build Coastguard Worker 68*cf78ab8cSAndroid Build Coastguard Worker #[allow(dead_code)] 69*cf78ab8cSAndroid Build Coastguard Worker #[rust_name = "get_capture"] GetCapture( self: &FrontendClient, request: &Vec<u8>, client_reader: &ClientResponseReader, ) -> UniquePtr<ClientResult>70*cf78ab8cSAndroid Build Coastguard Worker pub fn GetCapture( 71*cf78ab8cSAndroid Build Coastguard Worker self: &FrontendClient, 72*cf78ab8cSAndroid Build Coastguard Worker request: &Vec<u8>, 73*cf78ab8cSAndroid Build Coastguard Worker client_reader: &ClientResponseReader, 74*cf78ab8cSAndroid Build Coastguard Worker ) -> UniquePtr<ClientResult>; 75*cf78ab8cSAndroid Build Coastguard Worker 76*cf78ab8cSAndroid Build Coastguard Worker #[allow(dead_code)] 77*cf78ab8cSAndroid Build Coastguard Worker #[rust_name = "send_grpc"] SendGrpc( self: &FrontendClient, grpc_method: &GrpcMethod, request: &Vec<u8>, ) -> UniquePtr<ClientResult>78*cf78ab8cSAndroid Build Coastguard Worker pub fn SendGrpc( 79*cf78ab8cSAndroid Build Coastguard Worker self: &FrontendClient, 80*cf78ab8cSAndroid Build Coastguard Worker grpc_method: &GrpcMethod, 81*cf78ab8cSAndroid Build Coastguard Worker request: &Vec<u8>, 82*cf78ab8cSAndroid Build Coastguard Worker ) -> UniquePtr<ClientResult>; 83*cf78ab8cSAndroid Build Coastguard Worker 84*cf78ab8cSAndroid Build Coastguard Worker #[allow(dead_code)] 85*cf78ab8cSAndroid Build Coastguard Worker #[rust_name = "is_ok"] IsOk(self: &ClientResult) -> bool86*cf78ab8cSAndroid Build Coastguard Worker pub fn IsOk(self: &ClientResult) -> bool; 87*cf78ab8cSAndroid Build Coastguard Worker 88*cf78ab8cSAndroid Build Coastguard Worker #[allow(dead_code)] 89*cf78ab8cSAndroid Build Coastguard Worker #[rust_name = "err"] Err(self: &ClientResult) -> String90*cf78ab8cSAndroid Build Coastguard Worker pub fn Err(self: &ClientResult) -> String; 91*cf78ab8cSAndroid Build Coastguard Worker 92*cf78ab8cSAndroid Build Coastguard Worker #[allow(dead_code)] 93*cf78ab8cSAndroid Build Coastguard Worker #[rust_name = "byte_vec"] ByteVec(self: &ClientResult) -> &CxxVector<u8>94*cf78ab8cSAndroid Build Coastguard Worker pub fn ByteVec(self: &ClientResult) -> &CxxVector<u8>; 95*cf78ab8cSAndroid Build Coastguard Worker 96*cf78ab8cSAndroid Build Coastguard Worker } 97*cf78ab8cSAndroid Build Coastguard Worker } 98