1use std::{
2 time::{Duration, SystemTime, UNIX_EPOCH},
3 convert::TryFrom
4};
5use cyfs_base::*;
6use crate::types::*;
7
8
9#[derive(Clone, Copy, PartialEq, PartialOrd, Ord, Eq, Debug)]
10pub enum SnServiceGrade {
11 None = 0,
12 Discard = 1,
13 Passable = 2,
14 Normal = 3,
15 Fine = 4,
16 Wonderfull = 5,
17}
18
19impl SnServiceGrade {
20 pub fn is_accept(&self) -> bool {
21 *self >= SnServiceGrade::Passable
22 }
23 pub fn is_refuse(&self) -> bool {
24 !self.is_accept()
25 }
26}
27
28impl TryFrom<u8> for SnServiceGrade {
29 type Error = BuckyError;
30 fn try_from(v: u8) -> Result<Self, Self::Error> {
31 match v {
32 0 => Ok(Self::None),
33 1 => Ok(Self::Discard),
34 2 => Ok(Self::Passable),
35 3 => Ok(Self::Normal),
36 4 => Ok(Self::Fine),
37 5 => Ok(Self::Wonderfull),
38 _ => Err(BuckyError::new(
39 BuckyErrorCode::InvalidParam,
40 "invalid SnServiceGrade value",
41 )),
42 }
43 }
44}
45
46impl RawFixedBytes for SnServiceGrade {
47 fn raw_bytes() -> Option<usize> {
48 Some(1)
49 }
50}
51
52impl RawEncode for SnServiceGrade {
53 fn raw_measure(&self, _purpose: &Option<RawEncodePurpose>) -> Result<usize, BuckyError> {
54 Ok(Self::raw_bytes().unwrap())
55 }
56
57 fn raw_encode<'a>(
58 &self,
59 buf: &'a mut [u8],
60 _purpose: &Option<RawEncodePurpose>,
61 ) -> Result<&'a mut [u8], BuckyError> {
62 let bytes = Self::raw_bytes().unwrap();
63 if buf.len() < bytes {
64 let msg = format!("not enough buffer for encode SnServiceGrade, except={}, got={}", bytes, buf.len());
65 error!("{}", msg);
66
67 return Err(BuckyError::new(
68 BuckyErrorCode::OutOfLimit,
69 msg,
70 ));
71 }
72 buf[0] = (*self) as u8;
73 Ok(&mut buf[1..])
74 }
75}
76
77impl<'de> RawDecode<'de> for SnServiceGrade {
78 fn raw_decode(buf: &'de [u8]) -> Result<(Self, &'de [u8]), BuckyError> {
79 let bytes = Self::raw_bytes().unwrap();
80 if buf.len() < bytes {
81 let msg = format!("not enough buffer for decode SnServiceGrade, except={}, got={}", bytes, buf.len());
82 error!("{}", msg);
83
84 return Err(BuckyError::new(
85 BuckyErrorCode::OutOfLimit,
86 msg,
87 ));
88 }
89 let v = Self::try_from(buf[0])?;
90 Ok((v, &buf[Self::raw_bytes().unwrap()..]))
91 }
92}
93
94#[derive(Clone, Copy, PartialEq, Debug)]
95pub enum SnServiceReceiptVersion {
96 Invalid = 0,
97 Current = 1,
98}
99
100impl TryFrom<u8> for SnServiceReceiptVersion {
101 type Error = BuckyError;
102 fn try_from(v: u8) -> Result<Self, Self::Error> {
103 match v {
104 0 => Ok(Self::Invalid),
105 1 => Ok(Self::Current),
106 _ => Err(BuckyError::new(
107 BuckyErrorCode::UnSupport,
108 format!("unsupport version({})", v).as_str(),
109 )),
110 }
111 }
112}
113
114impl RawFixedBytes for SnServiceReceiptVersion {
115 fn raw_bytes() -> Option<usize> {
116 Some(1)
117 }
118}
119
120impl RawEncode for SnServiceReceiptVersion {
121 fn raw_measure(&self, _purpose: &Option<RawEncodePurpose>) -> Result<usize, BuckyError> {
122 Ok(Self::raw_bytes().unwrap())
123 }
124
125 fn raw_encode<'a>(
126 &self,
127 buf: &'a mut [u8],
128 _purpose: &Option<RawEncodePurpose>,
129 ) -> Result<&'a mut [u8], BuckyError> {
130 let bytes = Self::raw_bytes().unwrap();
131 if buf.len() < bytes {
132 let msg = format!("not enough buffer for encode SnServiceReceiptVersion, except={}, got={}", bytes, buf.len());
133 error!("{}", msg);
134
135 return Err(BuckyError::new(
136 BuckyErrorCode::OutOfLimit,
137 msg,
138 ));
139 }
140 buf[0] = (*self) as u8;
141 Ok(&mut buf[1..])
142 }
143}
144
145impl<'de> RawDecode<'de> for SnServiceReceiptVersion {
146 fn raw_decode(buf: &'de [u8]) -> Result<(Self, &'de [u8]), BuckyError> {
147 let bytes = Self::raw_bytes().unwrap();
148 if buf.len() < bytes {
149 let msg = format!("not enough buffer for decode SnServiceReceiptVersion, except={}, got={}", bytes, buf.len());
150 error!("{}", msg);
151
152 return Err(BuckyError::new(
153 BuckyErrorCode::OutOfLimit,
154 msg,
155 ));
156 }
157 let v = Self::try_from(buf[0])?;
158 Ok((v, &buf[Self::raw_bytes().unwrap()..]))
159 }
160}
161
162struct SnServiceReceiptSignature {
163 sn_peerid: DeviceId,
164 receipt: SnServiceReceipt,
165}
166
167impl RawEncode for SnServiceReceiptSignature {
168 fn raw_measure(&self, purpose: &Option<RawEncodePurpose>) -> Result<usize, BuckyError> {
169 let len = self.sn_peerid.raw_measure(purpose)? + self.receipt.raw_measure(purpose)?;
170 Ok(len)
171 }
172
173 fn raw_encode<'a>(
174 &self,
175 buf: &'a mut [u8],
176 purpose: &Option<RawEncodePurpose>,
177 ) -> Result<&'a mut [u8], BuckyError> {
178 let buf = self.sn_peerid.raw_encode(buf, purpose)?;
179 self.receipt.raw_encode(buf, purpose)
180 }
181}
182
183#[derive(Copy, Clone, Debug)]
184pub struct SnServiceReceipt {
185 pub version: SnServiceReceiptVersion,
186 pub grade: SnServiceGrade,
187 pub rto: u16,
188 pub duration: Duration,
189 pub start_time: SystemTime,
190 pub ping_count: u32,
191 pub ping_resp_count: u32,
192 pub called_count: u32,
193 pub call_peer_count: u32,
194 pub connect_peer_count: u32,
195 pub call_delay: u16,
196}
197
198impl SnServiceReceipt {
199 pub fn sign(
200 &self,
201 sn_peerid: &DeviceId,
202 _private_key: &PrivateKey,
203 ) -> Result<Signature, BuckyError> {
204 let _sig_fields = SnServiceReceiptSignature {
205 sn_peerid: sn_peerid.clone(),
206 receipt: self.clone(),
207 };
208 unimplemented!()
210 }
212
213 pub fn verify(
214 &self,
215 sn_peerid: &DeviceId,
216 _sign: &Signature,
217 _const_info: &DeviceDesc,
218 ) -> bool {
219 let _sig_fields = SnServiceReceiptSignature {
220 sn_peerid: sn_peerid.clone(),
221 receipt: self.clone(),
222 };
223 unimplemented!()
225 }
227}
228
229impl Default for SnServiceReceipt {
230 fn default() -> Self {
231 SnServiceReceipt {
232 version: SnServiceReceiptVersion::Invalid,
233 grade: SnServiceGrade::None,
234 rto: 0,
235 duration: Duration::from_millis(0),
236 start_time: UNIX_EPOCH,
237 ping_count: 0,
238 ping_resp_count: 0,
239 called_count: 0,
240 call_peer_count: 0,
241 connect_peer_count: 0,
242 call_delay: 0,
243 }
244 }
245}
246
247impl RawEncode for SnServiceReceipt {
248 fn raw_measure(&self, purpose: &Option<RawEncodePurpose>) -> Result<usize, BuckyError> {
249 let mut size = self.version.raw_measure(purpose)?;
250 size += self.grade.raw_measure(purpose)?;
251 size += self.rto.raw_measure(purpose)?;
252 size += 0u32.raw_measure(purpose)?;
253 size += 0u64.raw_measure(purpose)?;
254 size += self.ping_count.raw_measure(purpose)?;
255 size += self.ping_resp_count.raw_measure(purpose)?;
256 size += self.called_count.raw_measure(purpose)?;
257 size += self.call_peer_count.raw_measure(purpose)?;
258 size += self.connect_peer_count.raw_measure(purpose)?;
259 size += self.call_delay.raw_measure(purpose)?;
260 Ok(size)
261 }
262
263 fn raw_encode<'a>(
264 &self,
265 buf: &'a mut [u8],
266 purpose: &Option<RawEncodePurpose>,
267 ) -> Result<&'a mut [u8], BuckyError> {
268 let buf = self.version.raw_encode(buf, purpose)?;
269 let buf = self.grade.raw_encode(buf, purpose)?;
270 let buf = self.rto.raw_encode(buf, purpose)?;
271 let buf = (self.duration.as_millis() as u32).raw_encode(buf, purpose)?;
272 let buf = system_time_to_bucky_time(&self.start_time).raw_encode(buf, purpose)?;
273 let buf = self.ping_count.raw_encode(buf, purpose)?;
274 let buf = self.ping_resp_count.raw_encode(buf, purpose)?;
275 let buf = self.called_count.raw_encode(buf, purpose)?;
276 let buf = self.call_peer_count.raw_encode(buf, purpose)?;
277 let buf = self.connect_peer_count.raw_encode(buf, purpose)?;
278 let buf = self.call_delay.raw_encode(buf, purpose)?;
279 Ok(buf)
280 }
281}
282
283impl<'de> RawDecode<'de> for SnServiceReceipt {
284 fn raw_decode(buf: &'de [u8]) -> Result<(Self, &'de [u8]), BuckyError> {
285 let (version, buf) = SnServiceReceiptVersion::raw_decode(buf)?;
286 let (grade, buf) = SnServiceGrade::raw_decode(buf)?;
287 let (rto, buf) = u16::raw_decode(buf)?;
288 let (duration, buf) = u32::raw_decode(buf)?;
289 let duration = Duration::from_millis(duration as u64);
290 let (timestamp, buf) = Timestamp::raw_decode(buf)?;
291 if timestamp < MIN_BUCKY_TIME {
292 return Err(BuckyError::new(
293 BuckyErrorCode::InvalidData,
294 "invalid timestamp",
295 ));
296 }
297 let start_time = bucky_time_to_system_time(timestamp);
298 let (ping_count, buf) = u32::raw_decode(buf)?;
299 let (ping_resp_count, buf) = u32::raw_decode(buf)?;
300 let (called_count, buf) = u32::raw_decode(buf)?;
301 let (call_peer_count, buf) = u32::raw_decode(buf)?;
302 let (connect_peer_count, buf) = u32::raw_decode(buf)?;
303 let (call_delay, buf) = u16::raw_decode(buf)?;
304 Ok((
305 SnServiceReceipt {
306 version,
307 grade,
308 rto,
309 duration,
310 start_time,
311 ping_count,
312 ping_resp_count,
313 called_count,
314 call_peer_count,
315 connect_peer_count,
316 call_delay,
317 },
318 buf,
319 ))
320 }
321}
322
323#[derive(Debug)]
324pub struct ReceiptWithSignature(SnServiceReceipt, Signature);
325
326impl ReceiptWithSignature {
327 pub fn receipt(&self) -> &SnServiceReceipt {
328 &self.0
329 }
330
331 pub fn signature(&self) -> &Signature {
332 &self.1
333 }
334}
335
336impl RawEncode for ReceiptWithSignature {
337 fn raw_measure(&self, purpose: &Option<RawEncodePurpose>) -> Result<usize, BuckyError> {
338 Ok(self.0.raw_measure(purpose)? + self.1.raw_measure(purpose)?)
339 }
340
341 fn raw_encode<'a>(
342 &self,
343 buf: &'a mut [u8],
344 purpose: &Option<RawEncodePurpose>,
345 ) -> Result<&'a mut [u8], BuckyError> {
346 let buf = self.0.raw_encode(buf, purpose)?;
347 let buf = self.1.raw_encode(buf, purpose)?;
348 Ok(buf)
349 }
350}
351
352impl<'de> RawDecode<'de> for ReceiptWithSignature {
353 fn raw_decode(buf: &'de [u8]) -> Result<(Self, &'de [u8]), BuckyError> {
354 let (receipt, buf) = RawDecode::raw_decode(buf)?;
355 let (sig, buf) = RawDecode::raw_decode(buf)?;
356 Ok((Self(receipt, sig), buf))
357 }
358}
359
360impl From<(SnServiceReceipt, Signature)> for ReceiptWithSignature {
361 fn from(v: (SnServiceReceipt, Signature)) -> Self {
362 Self(v.0, v.1)
363 }
364}