1 //! Security service facade 2 3 use bt_topshim::btif::{BluetoothInterface, BtTransport, RawAddress}; 4 5 use bt_topshim_facade_protobuf::empty::Empty; 6 use bt_topshim_facade_protobuf::facade::{ 7 CreateBondRequest, CreateBondResponse, GenerateOobDataRequest, RemoveBondRequest, 8 }; 9 use bt_topshim_facade_protobuf::facade_grpc::{create_security_service, SecurityService}; 10 use grpcio::*; 11 12 use std::sync::{Arc, Mutex}; 13 use tokio::runtime::Runtime; 14 15 /// Main object for Adapter facade service 16 #[derive(Clone)] 17 pub struct SecurityServiceImpl { 18 #[allow(dead_code)] 19 rt: Arc<Runtime>, 20 #[allow(dead_code)] 21 btif_intf: Arc<Mutex<BluetoothInterface>>, 22 } 23 24 #[allow(dead_code)] 25 impl SecurityServiceImpl { 26 /// Create a new instance of the root facade service create(rt: Arc<Runtime>, btif_intf: Arc<Mutex<BluetoothInterface>>) -> grpcio::Service27 pub fn create(rt: Arc<Runtime>, btif_intf: Arc<Mutex<BluetoothInterface>>) -> grpcio::Service { 28 create_security_service(Self { rt, btif_intf }) 29 } 30 } 31 32 impl SecurityService for SecurityServiceImpl { remove_bond(&mut self, ctx: RpcContext<'_>, req: RemoveBondRequest, sink: UnarySink<Empty>)33 fn remove_bond(&mut self, ctx: RpcContext<'_>, req: RemoveBondRequest, sink: UnarySink<Empty>) { 34 let raw_address = RawAddress::from_string(req.address).unwrap(); 35 self.btif_intf.lock().unwrap().remove_bond(&raw_address); 36 ctx.spawn(async move { 37 sink.success(Empty::default()).await.unwrap(); 38 }) 39 } 40 generate_local_oob_data( &mut self, ctx: RpcContext<'_>, req: GenerateOobDataRequest, sink: UnarySink<Empty>, )41 fn generate_local_oob_data( 42 &mut self, 43 ctx: RpcContext<'_>, 44 req: GenerateOobDataRequest, 45 sink: UnarySink<Empty>, 46 ) { 47 self.btif_intf.lock().unwrap().generate_local_oob_data(req.transport); 48 ctx.spawn(async move { 49 sink.success(Empty::default()).await.unwrap(); 50 }) 51 } 52 create_bond( &mut self, ctx: RpcContext<'_>, req: CreateBondRequest, sink: UnarySink<CreateBondResponse>, )53 fn create_bond( 54 &mut self, 55 ctx: RpcContext<'_>, 56 req: CreateBondRequest, 57 sink: UnarySink<CreateBondResponse>, 58 ) { 59 let btif = self.btif_intf.clone(); 60 ctx.spawn(async move { 61 let bt_addr = &req.address; 62 if let Some(addr) = RawAddress::from_string(bt_addr) { 63 let status = 64 btif.lock().unwrap().create_bond(&addr, BtTransport::from(req.transport)); 65 let mut resp = CreateBondResponse::new(); 66 resp.status = status; 67 sink.success(resp).await.unwrap(); 68 } else { 69 sink.fail(RpcStatus::with_message( 70 RpcStatusCode::INVALID_ARGUMENT, 71 format!("Invalid Request Address: {}", bt_addr), 72 )) 73 .await 74 .unwrap(); 75 } 76 }); 77 } 78 } 79