use std::io::Cursor;
use opcua_types::{EncodingResult, SimpleBinaryDecodable};
use super::{
message_chunk::{MessageChunk, MessageChunkHeader},
secure_channel::SecureChannel,
security_header::{SecurityHeader, SequenceHeader},
};
#[derive(Debug, Clone, PartialEq)]
pub struct ChunkInfo {
pub message_header: MessageChunkHeader,
pub security_header: SecurityHeader,
pub sequence_header: SequenceHeader,
pub security_header_offset: usize,
pub sequence_header_offset: usize,
pub body_offset: usize,
pub body_length: usize,
}
impl ChunkInfo {
pub fn new(chunk: &MessageChunk, secure_channel: &SecureChannel) -> EncodingResult<ChunkInfo> {
let mut stream = Cursor::new(&chunk.data);
let decoding_options = secure_channel.decoding_options();
let message_header = MessageChunkHeader::decode(&mut stream, &decoding_options)?;
let security_header_offset = stream.position() as usize;
let security_header = SecurityHeader::decode_from_stream(
&mut stream,
message_header.message_type.is_open_secure_channel(),
&decoding_options,
)?;
let sequence_header_offset = stream.position() as usize;
let sequence_header = SequenceHeader::decode(&mut stream, &decoding_options)?;
let body_offset = stream.position() as usize;
let body_length = chunk.data.len() - body_offset;
let chunk_info = ChunkInfo {
message_header,
security_header,
sequence_header,
security_header_offset,
sequence_header_offset,
body_offset,
body_length,
};
Ok(chunk_info)
}
}