From 2cef7e56fdd641a83461eafd698fc394608a70cc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marc-Andr=C3=A9=20Lureau?= Date: Wed, 20 Mar 2024 14:19:03 +0400 Subject: [PATCH] refactor(server): factor out UpdateEncoder::encode_pdu() MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The function is reusable. Signed-off-by: Marc-André Lureau --- crates/ironrdp-server/src/encoder/mod.rs | 39 ++++++++++++++---------- 1 file changed, 23 insertions(+), 16 deletions(-) diff --git a/crates/ironrdp-server/src/encoder/mod.rs b/crates/ironrdp-server/src/encoder/mod.rs index 274cae5d..9b46854c 100644 --- a/crates/ironrdp-server/src/encoder/mod.rs +++ b/crates/ironrdp-server/src/encoder/mod.rs @@ -52,6 +52,26 @@ impl UpdateEncoder { } } + fn encode_pdu(&mut self, pdu: impl PduEncode) -> Option { + loop { + let mut cursor = WriteCursor::new(self.buffer.as_mut_slice()); + match pdu.encode(&mut cursor) { + Err(e) => match e.kind() { + ironrdp_pdu::PduErrorKind::NotEnoughBytes { .. } => { + self.buffer.resize(self.buffer.len() * 2, 0); + debug!("encoder buffer resized to: {}", self.buffer.len() * 2); + } + + _ => { + debug!("encode error: {:?}", e); + return None; + } + }, + Ok(()) => return Some(cursor.pos()), + } + } + } + pub(crate) fn bitmap(&mut self, bitmap: BitmapUpdate) -> Option> { let update = self.update; @@ -99,23 +119,10 @@ impl UpdateEncoder { extended_bitmap_data, }; let cmd = SurfaceCommand::SetSurfaceBits(pdu); - let len = loop { - let mut cursor = WriteCursor::new(self.buffer.as_mut_slice()); - match cmd.encode(&mut cursor) { - Err(e) => match e.kind() { - ironrdp_pdu::PduErrorKind::NotEnoughBytes { .. } => { - self.buffer.resize(self.buffer.len() * 2, 0); - debug!("encoder buffer resized to: {}", self.buffer.len() * 2); - } - - _ => { - debug!("bitmap encode error: {:?}", e); - return None; - } - }, - Ok(()) => break cursor.pos(), - } + let Some(len) = self.encode_pdu(cmd) else { + return None; }; + Some(UpdateFragmenter::new(UpdateCode::SurfaceCommands, &self.buffer[..len])) }