• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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