mirror of
https://github.com/redstrate/Kawari.git
synced 2025-04-24 08:07:45 +00:00
Move compression logic out of send_packet and into it's own function
This commit is contained in:
parent
a7f56a62a1
commit
974efe3824
2 changed files with 35 additions and 24 deletions
|
@ -1,4 +1,4 @@
|
||||||
use binrw::binrw;
|
use binrw::{BinWrite, binrw};
|
||||||
use std::io::Cursor;
|
use std::io::Cursor;
|
||||||
|
|
||||||
use binrw::{BinRead, BinResult};
|
use binrw::{BinRead, BinResult};
|
||||||
|
@ -8,7 +8,7 @@ use crate::{
|
||||||
packet::{PacketHeader, PacketSegment},
|
packet::{PacketHeader, PacketSegment},
|
||||||
};
|
};
|
||||||
|
|
||||||
use super::ReadWriteIpcSegment;
|
use super::{PacketState, ReadWriteIpcSegment};
|
||||||
|
|
||||||
#[binrw]
|
#[binrw]
|
||||||
#[brw(repr = u8)]
|
#[brw(repr = u8)]
|
||||||
|
@ -56,3 +56,30 @@ pub(crate) fn decompress<T: ReadWriteIpcSegment>(
|
||||||
|
|
||||||
Ok(segments)
|
Ok(segments)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub(crate) fn compress<T: ReadWriteIpcSegment>(
|
||||||
|
state: &mut PacketState,
|
||||||
|
compression_type: &CompressionType,
|
||||||
|
segments: &[PacketSegment<T>],
|
||||||
|
) -> (Vec<u8>, usize) {
|
||||||
|
let mut segments_buffer = Cursor::new(Vec::new());
|
||||||
|
for segment in segments {
|
||||||
|
segment
|
||||||
|
.write_le_args(
|
||||||
|
&mut segments_buffer,
|
||||||
|
(state.client_key.as_ref().map(|s: &[u8; 16]| s.as_slice()),),
|
||||||
|
)
|
||||||
|
.unwrap();
|
||||||
|
}
|
||||||
|
|
||||||
|
let segments_buffer = segments_buffer.into_inner();
|
||||||
|
let segments_buffer_len = segments_buffer.len();
|
||||||
|
|
||||||
|
match compression_type {
|
||||||
|
CompressionType::Uncompressed => (segments_buffer, 0),
|
||||||
|
CompressionType::Oodle => (
|
||||||
|
state.clientbound_oodle.encode(segments_buffer),
|
||||||
|
segments_buffer_len,
|
||||||
|
),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
@ -7,7 +7,11 @@ use std::{
|
||||||
use binrw::{BinRead, BinWrite, binrw};
|
use binrw::{BinRead, BinWrite, binrw};
|
||||||
use tokio::{io::AsyncWriteExt, net::TcpStream};
|
use tokio::{io::AsyncWriteExt, net::TcpStream};
|
||||||
|
|
||||||
use crate::{common::read_string, oodle::OodleNetwork, packet::encryption::decrypt};
|
use crate::{
|
||||||
|
common::read_string,
|
||||||
|
oodle::OodleNetwork,
|
||||||
|
packet::{compression::compress, encryption::decrypt},
|
||||||
|
};
|
||||||
|
|
||||||
use super::{
|
use super::{
|
||||||
CompressionType, compression::decompress, encryption::encrypt, ipc::ReadWriteIpcSegment,
|
CompressionType, compression::decompress, encryption::encrypt, ipc::ReadWriteIpcSegment,
|
||||||
|
@ -144,27 +148,7 @@ pub async fn send_packet<T: ReadWriteIpcSegment>(
|
||||||
.try_into()
|
.try_into()
|
||||||
.unwrap();
|
.unwrap();
|
||||||
|
|
||||||
let mut segments_buffer = Cursor::new(Vec::new());
|
let (data, uncompressed_size) = compress(state, &compression_type, segments);
|
||||||
for segment in segments {
|
|
||||||
segment
|
|
||||||
.write_le_args(
|
|
||||||
&mut segments_buffer,
|
|
||||||
(state.client_key.as_ref().map(|s: &[u8; 16]| s.as_slice()),),
|
|
||||||
)
|
|
||||||
.unwrap();
|
|
||||||
}
|
|
||||||
|
|
||||||
let segments_buffer = segments_buffer.into_inner();
|
|
||||||
|
|
||||||
let mut uncompressed_size = 0;
|
|
||||||
let data = match compression_type {
|
|
||||||
CompressionType::Uncompressed => segments_buffer,
|
|
||||||
CompressionType::Oodle => {
|
|
||||||
uncompressed_size = segments_buffer.len();
|
|
||||||
state.clientbound_oodle.encode(segments_buffer)
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
let size = std::mem::size_of::<PacketHeader>() + data.len();
|
let size = std::mem::size_of::<PacketHeader>() + data.len();
|
||||||
|
|
||||||
let header = PacketHeader {
|
let header = PacketHeader {
|
||||||
|
|
Loading…
Add table
Reference in a new issue