encode in Decoder trait now returns Result, so encoding errors will be handled
This commit is contained in:
parent
0cd80927be
commit
2ac56b9f01
5 changed files with 17 additions and 17 deletions
|
|
@ -4,7 +4,7 @@ use super::raw::Raw;
|
||||||
|
|
||||||
pub trait Decoder: Sized {
|
pub trait Decoder: Sized {
|
||||||
fn decode(raw: &Raw, offset: usize, size: usize) -> Result<Self>;
|
fn decode(raw: &Raw, offset: usize, size: usize) -> Result<Self>;
|
||||||
fn encode(&self) -> Raw;
|
fn encode(&self) -> Result<Raw>;
|
||||||
fn get_enc_size(&self) -> usize;
|
fn get_enc_size(&self) -> usize;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -17,10 +17,10 @@ impl Decoder for String {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn encode(&self) -> Raw {
|
fn encode(&self) -> Result<Raw> {
|
||||||
let mut str = self.as_bytes().to_vec();
|
let mut str = self.as_bytes().to_vec();
|
||||||
str.push(0);
|
str.push(0);
|
||||||
Raw { offset: 0, size: str.len(), mem: str}
|
Ok(Raw { offset: 0, size: str.len(), mem: str})
|
||||||
}
|
}
|
||||||
|
|
||||||
fn get_enc_size(&self) -> usize {
|
fn get_enc_size(&self) -> usize {
|
||||||
|
|
|
||||||
|
|
@ -38,21 +38,21 @@ impl Decoder for FString {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn encode(&self) -> Raw {
|
fn encode(&self) -> Result<Raw> {
|
||||||
let mut buf = vec![0u8; 4];
|
let mut buf = vec![0u8; 4];
|
||||||
let mut wdr = Cursor::new(&mut buf[..]);
|
let mut wdr = Cursor::new(&mut buf[..]);
|
||||||
if self.encoding == FStringEncoding::ANSI {
|
if self.encoding == FStringEncoding::ANSI {
|
||||||
let _ = wdr.write_u32::<LittleEndian>(self.str.len() as u32 ^ (1<<31));
|
wdr.write_u32::<LittleEndian>(self.str.len() as u32 ^ (1<<31))?;
|
||||||
buf.append(&mut self.str.clone().into_bytes());
|
buf.append(&mut self.str.clone().into_bytes());
|
||||||
} else { // WCS2
|
} else { // WCS2
|
||||||
let (chars, _, _) = WINDOWS_1251.encode(self.str.as_str());
|
let (chars, _, _) = WINDOWS_1251.encode(self.str.as_str());
|
||||||
let _ = wdr.write_u32::<LittleEndian>(chars.len() as u32 | (1<<31));
|
wdr.write_u32::<LittleEndian>(chars.len() as u32 | (1<<31))?;
|
||||||
for &c in chars.iter() {
|
for &c in chars.iter() {
|
||||||
buf.push(c);
|
buf.push(c);
|
||||||
buf.push(0);
|
buf.push(0);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
Raw { offset: 0, size: buf.len(), mem: buf }
|
Ok(Raw { offset: 0, size: buf.len(), mem: buf })
|
||||||
}
|
}
|
||||||
|
|
||||||
fn get_enc_size(&self) -> usize {
|
fn get_enc_size(&self) -> usize {
|
||||||
|
|
|
||||||
|
|
@ -52,7 +52,7 @@ impl Save {
|
||||||
|
|
||||||
pub fn save(&self, path: &Path) -> Result<()> {
|
pub fn save(&self, path: &Path) -> Result<()> {
|
||||||
self.raw.assemble_file(path, vec![
|
self.raw.assemble_file(path, vec![
|
||||||
self.world.encode()
|
self.world.encode()?
|
||||||
])?;
|
])?;
|
||||||
|
|
||||||
Ok(())
|
Ok(())
|
||||||
|
|
|
||||||
|
|
@ -15,11 +15,11 @@ impl Decoder for Tag {
|
||||||
Ok(Tag {name, version})
|
Ok(Tag {name, version})
|
||||||
}
|
}
|
||||||
|
|
||||||
fn encode(&self) -> Raw {
|
fn encode(&self) -> Result<Raw> {
|
||||||
Raw::join(0, self.get_enc_size(), &mut [
|
Ok(Raw::join(0, self.get_enc_size(), &mut [
|
||||||
self.name.encode(),
|
self.name.encode()?,
|
||||||
self.version.encode()
|
self.version.encode()?
|
||||||
])
|
]))
|
||||||
}
|
}
|
||||||
|
|
||||||
fn get_enc_size(&self) -> usize {
|
fn get_enc_size(&self) -> usize {
|
||||||
|
|
|
||||||
|
|
@ -45,7 +45,7 @@ impl Decoder for World {
|
||||||
Ok(World { tag, uncompressed_size, data: Raw { offset, size, mem: data } })
|
Ok(World { tag, uncompressed_size, data: Raw { offset, size, mem: data } })
|
||||||
}
|
}
|
||||||
|
|
||||||
fn encode(&self) -> Raw {
|
fn encode(&self) -> Result<Raw> {
|
||||||
let mut hdr = [0u8; 8];
|
let mut hdr = [0u8; 8];
|
||||||
{
|
{
|
||||||
let mut wdr = Cursor::new(&mut hdr[..]);
|
let mut wdr = Cursor::new(&mut hdr[..]);
|
||||||
|
|
@ -54,11 +54,11 @@ impl Decoder for World {
|
||||||
}
|
}
|
||||||
let data = deflate_bytes_zlib(&self.data.mem);
|
let data = deflate_bytes_zlib(&self.data.mem);
|
||||||
|
|
||||||
Raw::join(self.data.offset, self.data.size, &mut [
|
Ok(Raw::join(self.data.offset, self.data.size, &mut [
|
||||||
self.tag.encode(),
|
self.tag.encode()?,
|
||||||
Raw { offset: Self::WORLD_TAG_LEN, size: 8, mem: hdr.to_vec()},
|
Raw { offset: Self::WORLD_TAG_LEN, size: 8, mem: hdr.to_vec()},
|
||||||
Raw { offset: Self::WORLD_HDR_LEN, size: data.len(), mem: data}
|
Raw { offset: Self::WORLD_HDR_LEN, size: data.len(), mem: data}
|
||||||
])
|
]))
|
||||||
}
|
}
|
||||||
|
|
||||||
fn get_enc_size(&self) -> usize {
|
fn get_enc_size(&self) -> usize {
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue