blob: 86ced233292fe7bdeaadf2dd2f9e8f95526f2f17 [file] [log] [blame]
// Copyright 2018 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#![allow(non_snake_case)]
use fidl_bluetooth_bonder::{BondingData, Key, LeConnectionParameters, LeData, Ltk};
use std::collections::HashMap;
#[derive(Serialize, Deserialize)]
#[serde(remote = "LeConnectionParameters")]
pub struct LeConnectionParametersDef {
pub connection_interval: u16,
pub connection_latency: u16,
pub supervision_timeout: u16,
}
#[derive(Serialize, Deserialize)]
#[serde(remote = "Key")]
pub struct KeyDef {
pub authenticated: bool,
pub value: [u8; 16],
}
#[derive(Serialize, Deserialize)]
#[serde(remote = "Ltk")]
pub struct LtkDef {
#[serde(with = "KeyDef")]
pub key: Key,
pub key_size: u8,
pub ediv: u16,
pub rand: u64,
}
#[derive(Serialize, Deserialize)]
#[serde(remote = "LeData")]
pub struct LeDataDef {
pub address: String,
pub resolvable: bool,
pub master: bool,
#[serde(with = "LeConnectionParametersWrapper")]
pub connection_parameters: Option<Box<LeConnectionParameters>>,
pub services: Vec<String>,
#[serde(with = "LtkWrapper")]
pub ltk: Option<Box<Ltk>>,
#[serde(with = "KeyWrapper")]
pub irk: Option<Box<Key>>,
#[serde(with = "KeyWrapper")]
pub csrk: Option<Box<Key>>,
}
#[derive(Serialize, Deserialize)]
#[serde(remote = "BondingData")]
pub struct BondingDataDef {
pub name: String,
#[serde(with = "LeDataWrapper")]
pub le: Option<Box<LeData>>,
}
/// Wrap the Ser/De types to work with Option<Box<T>>
macro_rules! optboxify {
($mod:ident, $b:ident, $c:ident, $d:expr) => {
mod $mod {
use super::{$b, $c};
use serde::{Deserialize, Deserializer};
use serde::{Serialize, Serializer};
pub fn serialize<S>(value: &Option<Box<$b>>, serializer: S) -> Result<S::Ok, S::Error>
where
S: Serializer,
{
#[derive(Serialize)]
struct Wrapper<'a>(#[serde(with = $d)] &'a Box<$b>);
value.as_ref().map(Wrapper).serialize(serializer)
}
pub fn deserialize<'de, D>(deserializer: D) -> Result<Option<Box<$b>>, D::Error>
where
D: Deserializer<'de>,
{
#[derive(Deserialize)]
struct Wrapper(#[serde(with = $d)] $b);
let helper = Option::deserialize(deserializer)?;
Ok(helper.map(|Wrapper(external)| Box::new(external)))
}
}
};
}
optboxify!(LeDataWrapper, LeData, LeDataDef, "LeDataDef");
optboxify!(KeyWrapper, Key, KeyDef, "KeyDef");
optboxify!(LtkWrapper, Ltk, LtkDef, "LtkDef");
optboxify!(
LeConnectionParametersWrapper,
LeConnectionParameters,
LeConnectionParametersDef,
"LeConnectionParametersDef"
);
#[derive(Serialize, Deserialize)]
pub struct BondMap(HashMap<String, VecBondingData>);
impl BondMap {
pub fn inner(&self) -> &HashMap<String, VecBondingData> {
&self.0
}
pub fn inner_mut(&mut self) -> &mut HashMap<String, VecBondingData> {
&mut self.0
}
}
#[derive(Serialize, Deserialize)]
pub struct VecBondingData {
#[serde(with = "VecBondData")]
pub inner: Vec<BondingData>,
}
//impl VecBondingData {
// pub fn inner(&self) -> VecBondingData {
// &self.inner
// }
//}
// TODO
struct VecBondIter {}
//
//impl Iterator for VecBondIter {
// type Item = BondingData;
//
// fn next(&mut self) -> Option<Self::Item> {
// self.inner.iter().next()
// }
//}
//impl IntoIterator for VecBondingData {
// type Item = BondingData;
// //type IntoIterator = VecBondIter;
//
// //fn into_iter(self) -> Self::IntoIterator {
//
// //}
//}
mod VecBondData {
use super::{BondingData, BondingDataDef};
use serde::Serializer;
use serde::{Deserialize, Deserializer};
pub fn deserialize<'de, D>(deserializer: D) -> Result<Vec<BondingData>, D::Error>
where
D: Deserializer<'de>,
{
#[derive(Deserialize)]
struct Wrapper(#[serde(with = "BondingDataDef")] BondingData);
let v = Vec::deserialize(deserializer)?;
Ok(v.into_iter().map(|Wrapper(a)| a).collect())
}
pub fn serialize<S>(value: &Vec<BondingData>, serializer: S) -> Result<S::Ok, S::Error>
where
S: Serializer,
{
#[derive(Serialize)]
struct Wrapper<'a>(#[serde(with = "BondingDataDef")] &'a BondingData);
serializer.collect_seq(value.iter().map(Wrapper))
}
}