summaryrefslogtreecommitdiff
path: root/shared/src/packets.rs
diff options
context:
space:
mode:
Diffstat (limited to 'shared/src/packets.rs')
-rw-r--r--shared/src/packets.rs27
1 files changed, 18 insertions, 9 deletions
diff --git a/shared/src/packets.rs b/shared/src/packets.rs
index 0f1a886..07c4345 100644
--- a/shared/src/packets.rs
+++ b/shared/src/packets.rs
@@ -103,14 +103,13 @@ impl ReadWrite for Packet {
fn write(&self, w: &mut dyn Write) -> Result<()> {
let mut buf = Vec::new();
self.serialize_inner(&mut buf)?;
- w.write_all(&(buf.len() as u16).to_be_bytes())?;
+ w.write_all(&(buf.len() as u32).to_be_bytes())?;
w.write_all(&buf)?;
Ok(())
}
fn read(r: &mut dyn Read) -> Result<Self> {
- let mut size_tag = [0u8; 3];
- r.read_exact(&mut size_tag)?;
- Ok(match size_tag[2] {
+ let packet_len = u32::read(r)?;
+ Ok(match u8::read(r)? {
0x00 => Packet::Connect(read_u128(r)?),
0x01 => Packet::RequestResource(Resource::read(r)?),
0x02 => Packet::RespondResource(Data::read(r)?),
@@ -125,8 +124,7 @@ impl ReadWrite for Packet {
0x07 => Packet::Parent(Object(read_u128(r)?), Object(read_u128(r)?)),
0x08 => Packet::Sound(Object(read_u128(r)?), Data::read(r)?),
_ => {
- let len = u16::from_be_bytes([size_tag[0], size_tag[1]]);
- for _ in 0..len.max(1) - 1 {
+ for _ in 0..packet_len.max(1) - 1 {
r.read_exact(&mut [0])?;
}
bail!("unknown packet tag");
@@ -153,14 +151,14 @@ impl ReadWrite for Resource {
}
impl ReadWrite for Data {
fn write(&self, w: &mut dyn Write) -> Result<()> {
- w.write_all(&(self.0.len() as u16).to_be_bytes())?;
+ w.write_all(&(self.0.len() as u32).to_be_bytes())?;
w.write_all(&self.0)?;
Ok(())
}
fn read(r: &mut dyn Read) -> Result<Self> {
- let mut size = [0; 2];
+ let mut size = [0; 4];
r.read_exact(&mut size)?;
- let size = u16::from_be_bytes(size);
+ let size = u32::from_be_bytes(size);
let mut buf = vec![0; size as usize];
r.read_exact(&mut buf)?;
Ok(Data(buf))
@@ -188,6 +186,17 @@ impl ReadWrite for f32 {
Ok(f32::from_be_bytes(buf))
}
}
+impl ReadWrite for u32 {
+ fn write(&self, w: &mut dyn Write) -> Result<()> {
+ w.write_all(&self.to_be_bytes())?;
+ Ok(())
+ }
+ fn read(r: &mut dyn Read) -> Result<Self> {
+ let mut buf = [0; 4];
+ r.read_exact(&mut buf)?;
+ Ok(u32::from_be_bytes(buf))
+ }
+}
impl Display for Resource {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {