Mercurial > core / rust/lib/net/src/codec/dm/build.rs
changeset 698: |
96958d3eb5b0 |
parent: |
c7165d93a9eb
|
author: |
Richard Westhaver <ellis@rwest.io> |
date: |
Fri, 04 Oct 2024 22:04:59 -0400 |
permissions: |
-rw-r--r-- |
description: |
fixes |
1 //! builder for dm protocol prefab 2 use tokio_util::codec::{Framed, FramedRead, FramedWrite}; 3 use super::{DecodeState, DmCodec}; 6 use tokio::io::{AsyncRead, AsyncWrite}; 8 // use bytes::{Buf, BufMut, Bytes, BytesMut}; 10 #[derive(Debug, Clone, Copy)] 12 // Maximum frame length 14 // Number of bytes representing the field length 15 length_field_len: usize, 16 // Number of bytes in the header before the length field 17 length_field_offset: usize, 18 // Adjust the length specified in the header field by this amount 19 length_adjustment: isize, 20 // Total number of bytes to skip before reading the payload, if not set, 21 // `length_field_len + length_field_offset` 22 num_skip: Option<usize>, 23 // Length field byte order (little or big endian) 24 length_field_is_big_endian: bool, 28 pub fn new() -> Self { 30 // Default max frame length of 4KB 31 max_frame_len: 4 * 1_024, 32 // Default byte length of 4 34 // Default to the header field being at the start of the header. 35 length_field_offset: 0, 37 // Total number of bytes to skip before reading the payload, if not set, 38 // `length_field_len + length_field_offset` 40 // Default to reading the length field in network (big) endian. 41 length_field_is_big_endian: true, 45 pub fn big_endian(&mut self) -> &mut Self { 46 self.length_field_is_big_endian = true; 50 pub fn native_endian(&mut self) -> &mut Self { 51 if cfg!(target_endian = "big") { 58 pub fn max_frame_length(&mut self, val: usize) -> &mut Self { 59 self.max_frame_len = val; 63 pub fn length_field_length(&mut self, val: usize) -> &mut Self { 64 assert!(val > 0 && val <= 8, "invalid length field length"); 65 self.length_field_len = val; 69 pub fn length_field_offset(&mut self, val: usize) -> &mut Self { 70 self.length_field_offset = val; 74 pub fn length_adjustment(&mut self, val: isize) -> &mut Self { 75 self.length_adjustment = val; 79 pub fn num_skip(&mut self, val: usize) -> &mut Self { 80 self.num_skip = Some(val); 84 pub fn new_codec(&self) -> DmCodec { 87 state: DecodeState::Head, 91 pub fn new_read<T>(&self, upstream: T) -> FramedRead<T, DmCodec> 95 FramedRead::new(upstream, self.new_codec()) 98 pub fn new_write<T>(&self, inner: T) -> FramedWrite<T, DmCodec> 102 FramedWrite::new(inner, self.new_codec()) 105 pub fn new_framed<T>(&self, inner: T) -> Framed<T, DmCodec> 107 T: AsyncRead + AsyncWrite, 109 Framed::new(inner, self.new_codec()) 112 fn num_head_bytes(&self) -> usize { 113 let num = self.length_field_offset + self.length_field_len; 114 cmp::max(num, self.num_skip.unwrap_or(0)) 117 fn get_num_skip(&self) -> usize { 119 .unwrap_or(self.length_field_offset + self.length_field_len) 123 impl Default for Builder { 124 fn default() -> Self {