|  |  |  | @ -15,7 +15,10 @@ | 
		
	
		
			
				|  |  |  |  |  * 02110-1301, USA. | 
		
	
		
			
				|  |  |  |  |  */ | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  | use nom::combinator::rest; | 
		
	
		
			
				|  |  |  |  | use nom7::bytes::streaming::take; | 
		
	
		
			
				|  |  |  |  | use nom7::combinator::rest; | 
		
	
		
			
				|  |  |  |  | use nom7::number::streaming::be_u32; | 
		
	
		
			
				|  |  |  |  | use nom7::IResult; | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  | pub const NBSS_MSGTYPE_SESSION_MESSAGE:         u8 = 0x00; | 
		
	
		
			
				|  |  |  |  | pub const NBSS_MSGTYPE_SESSION_REQUEST:         u8 = 0x81; | 
		
	
	
		
			
				
					|  |  |  | @ -62,36 +65,37 @@ impl<'a> NbssRecord<'a> { | 
		
	
		
			
				|  |  |  |  |     } | 
		
	
		
			
				|  |  |  |  | } | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  | named!(pub parse_nbss_record<NbssRecord>, | 
		
	
		
			
				|  |  |  |  |    do_parse!( | 
		
	
		
			
				|  |  |  |  |        type_and_len: bits!(tuple!( | 
		
	
		
			
				|  |  |  |  |                take_bits!(8u8), | 
		
	
		
			
				|  |  |  |  |                take_bits!(24u32))) | 
		
	
		
			
				|  |  |  |  |        >> data: take!(type_and_len.1 as usize) | 
		
	
		
			
				|  |  |  |  |        >> (NbssRecord { | 
		
	
		
			
				|  |  |  |  |             message_type:type_and_len.0, | 
		
	
		
			
				|  |  |  |  |             length:type_and_len.1, | 
		
	
		
			
				|  |  |  |  |             data:data, | 
		
	
		
			
				|  |  |  |  |         }) | 
		
	
		
			
				|  |  |  |  | )); | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  | named!(pub parse_nbss_record_partial<NbssRecord>, | 
		
	
		
			
				|  |  |  |  |    do_parse!( | 
		
	
		
			
				|  |  |  |  |        type_and_len: bits!(tuple!( | 
		
	
		
			
				|  |  |  |  |                take_bits!(8u8), | 
		
	
		
			
				|  |  |  |  |                take_bits!(24u32))) | 
		
	
		
			
				|  |  |  |  |        >> data: rest | 
		
	
		
			
				|  |  |  |  |        >> (NbssRecord { | 
		
	
		
			
				|  |  |  |  |             message_type:type_and_len.0, | 
		
	
		
			
				|  |  |  |  |             length:type_and_len.1, | 
		
	
		
			
				|  |  |  |  |             data:data, | 
		
	
		
			
				|  |  |  |  |         }) | 
		
	
		
			
				|  |  |  |  | )); | 
		
	
		
			
				|  |  |  |  | pub fn parse_nbss_record(i: &[u8]) -> IResult<&[u8], NbssRecord> { | 
		
	
		
			
				|  |  |  |  |     let (i, buf) = be_u32(i)?; | 
		
	
		
			
				|  |  |  |  |     let message_type = (buf >> 24) as u8; | 
		
	
		
			
				|  |  |  |  |     let length = buf & 0xff_ffff; | 
		
	
		
			
				|  |  |  |  |     let (i, data) = take(length as usize)(i)?; | 
		
	
		
			
				|  |  |  |  |     let record = NbssRecord { | 
		
	
		
			
				|  |  |  |  |         message_type, | 
		
	
		
			
				|  |  |  |  |         length, | 
		
	
		
			
				|  |  |  |  |         data, | 
		
	
		
			
				|  |  |  |  |     }; | 
		
	
		
			
				|  |  |  |  |     Ok((i, record)) | 
		
	
		
			
				|  |  |  |  | } | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  | pub fn parse_nbss_record_partial(i: &[u8]) -> IResult<&[u8], NbssRecord> { | 
		
	
		
			
				|  |  |  |  |     let (i, buf) = be_u32(i)?; | 
		
	
		
			
				|  |  |  |  |     let message_type = (buf >> 24) as u8; | 
		
	
		
			
				|  |  |  |  |     let length = buf & 0xff_ffff; | 
		
	
		
			
				|  |  |  |  |     let (i, data) = rest(i)?; | 
		
	
		
			
				|  |  |  |  |     let record = NbssRecord { | 
		
	
		
			
				|  |  |  |  |         message_type, | 
		
	
		
			
				|  |  |  |  |         length, | 
		
	
		
			
				|  |  |  |  |         data, | 
		
	
		
			
				|  |  |  |  |     }; | 
		
	
		
			
				|  |  |  |  |     Ok((i, record)) | 
		
	
		
			
				|  |  |  |  | } | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  | #[cfg(test)] | 
		
	
		
			
				|  |  |  |  | mod tests { | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  |     use super::*; | 
		
	
		
			
				|  |  |  |  |     use nom7::Err; | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  |     #[test] | 
		
	
		
			
				|  |  |  |  |     fn test_parse_nbss_record() { | 
		
	
	
		
			
				
					|  |  |  | @ -126,10 +130,10 @@ mod tests { | 
		
	
		
			
				|  |  |  |  |                 // there should be nothing left
 | 
		
	
		
			
				|  |  |  |  |                 assert_eq!(remainder.len(), 0); | 
		
	
		
			
				|  |  |  |  |             } | 
		
	
		
			
				|  |  |  |  |             Err(nom::Err::Error((_remainder, err))) => { | 
		
	
		
			
				|  |  |  |  |                 panic!("Result should not be an error: {:?}.", err); | 
		
	
		
			
				|  |  |  |  |             Err(Err::Error(err)) => { | 
		
	
		
			
				|  |  |  |  |                 panic!("Result should not be an error: {:?}.", err.code); | 
		
	
		
			
				|  |  |  |  |             } | 
		
	
		
			
				|  |  |  |  |             Err(nom::Err::Incomplete(_)) => { | 
		
	
		
			
				|  |  |  |  |             Err(Err::Incomplete(_)) => { | 
		
	
		
			
				|  |  |  |  |                 panic!("Result should not have been incomplete."); | 
		
	
		
			
				|  |  |  |  |             } | 
		
	
		
			
				|  |  |  |  |             _ => { | 
		
	
	
		
			
				
					|  |  |  | @ -170,10 +174,10 @@ mod tests { | 
		
	
		
			
				|  |  |  |  |                 // there should be nothing left
 | 
		
	
		
			
				|  |  |  |  |                 assert_eq!(remainder.len(), 0); | 
		
	
		
			
				|  |  |  |  |             } | 
		
	
		
			
				|  |  |  |  |             Err(nom::Err::Error((_remainder, err))) => { | 
		
	
		
			
				|  |  |  |  |                 panic!("Result should not be an error: {:?}.", err); | 
		
	
		
			
				|  |  |  |  |             Err(Err::Error(err)) => { | 
		
	
		
			
				|  |  |  |  |                 panic!("Result should not be an error: {:?}.", err.code); | 
		
	
		
			
				|  |  |  |  |             } | 
		
	
		
			
				|  |  |  |  |             Err(nom::Err::Incomplete(_)) => { | 
		
	
		
			
				|  |  |  |  |             Err(Err::Incomplete(_)) => { | 
		
	
		
			
				|  |  |  |  |                 panic!("Result should not have been incomplete."); | 
		
	
		
			
				|  |  |  |  |             } | 
		
	
		
			
				|  |  |  |  |             _ => { | 
		
	
	
		
			
				
					|  |  |  | @ -210,10 +214,10 @@ mod tests { | 
		
	
		
			
				|  |  |  |  |                 // there should be nothing left
 | 
		
	
		
			
				|  |  |  |  |                 assert_eq!(remainder.len(), 0); | 
		
	
		
			
				|  |  |  |  |             } | 
		
	
		
			
				|  |  |  |  |             Err(nom::Err::Error((_remainder, err))) => { | 
		
	
		
			
				|  |  |  |  |                 panic!("Result should not be an error: {:?}.", err); | 
		
	
		
			
				|  |  |  |  |             Err(Err::Error(err)) => { | 
		
	
		
			
				|  |  |  |  |                 panic!("Result should not be an error: {:?}.", err.code); | 
		
	
		
			
				|  |  |  |  |             } | 
		
	
		
			
				|  |  |  |  |             Err(nom::Err::Incomplete(_)) => { | 
		
	
		
			
				|  |  |  |  |             Err(Err::Incomplete(_)) => { | 
		
	
		
			
				|  |  |  |  |                 panic!("Result should not have returned as incomplete."); | 
		
	
		
			
				|  |  |  |  |             } | 
		
	
		
			
				|  |  |  |  |             _ => { | 
		
	
	
		
			
				
					|  |  |  | 
 |