From 7a75c170cc6f7dc2f6400396a35468d34474c2da Mon Sep 17 00:00:00 2001 From: Joshua Goins Date: Fri, 13 Oct 2023 16:16:04 -0400 Subject: [PATCH] Make a semantic difference between owned and non-owned byte data --- src/cfg.rs | 11 +++++------ src/chardat.rs | 8 ++++---- src/cmp.rs | 5 ++--- src/dat.rs | 10 +++++----- src/exd.rs | 8 ++++---- src/exh.rs | 4 ++-- src/exl.rs | 9 ++++----- src/fiin.rs | 8 ++++---- src/gamedata.rs | 5 ++--- src/lib.rs | 6 ++++++ src/log.rs | 5 ++--- src/model.rs | 19 +++++++++---------- src/mtrl.rs | 5 ++--- src/pbd.rs | 7 +++---- src/shpk.rs | 5 ++--- src/skeleton.rs | 4 ++-- src/tex.rs | 5 ++--- 17 files changed, 60 insertions(+), 64 deletions(-) diff --git a/src/cfg.rs b/src/cfg.rs index 16a09a2..cee876d 100644 --- a/src/cfg.rs +++ b/src/cfg.rs @@ -3,8 +3,7 @@ use std::collections::HashMap; use std::io::{BufRead, BufReader, BufWriter, Cursor, Write}; - -use crate::gamedata::MemoryBuffer; +use crate::{ByteBuffer, ByteSpan}; /// Represents a collection of keys, mapped to their values. #[derive(Debug)] @@ -24,7 +23,7 @@ pub struct ConfigFile { impl ConfigFile { /// Parses an existing config file. - pub fn from_existing(buffer: &MemoryBuffer) -> Option { + pub fn from_existing(buffer: ByteSpan) -> Option { let mut cfg = ConfigFile { categories: Vec::new(), settings: HashMap::new() @@ -55,8 +54,8 @@ impl ConfigFile { } /// Writes an existing config file to a buffer. - pub fn write_to_buffer(&self) -> Option { - let mut buffer = MemoryBuffer::new(); + pub fn write_to_buffer(&self) -> Option { + let mut buffer = ByteBuffer::new(); { let cursor = Cursor::new(&mut buffer); @@ -128,7 +127,7 @@ mod tests { ConfigFile::from_existing(&read(d).unwrap()).unwrap() } - fn common_setup_modified() -> MemoryBuffer { + fn common_setup_modified() -> ByteBuffer { let mut d = PathBuf::from(env!("CARGO_MANIFEST_DIR")); d.push("resources/tests"); d.push("FFXIV.modified.cfg"); diff --git a/src/chardat.rs b/src/chardat.rs index 388b3b8..4085b2b 100644 --- a/src/chardat.rs +++ b/src/chardat.rs @@ -5,8 +5,8 @@ use std::io::{BufWriter, Cursor}; use binrw::{BinRead, BinWrite}; use binrw::binrw; +use crate::{ByteBuffer, ByteSpan}; -use crate::gamedata::MemoryBuffer; use crate::race::{Gender, Race, Subrace}; fn convert_dat_race(x: u8) -> Race { @@ -201,15 +201,15 @@ pub struct CharacterData { // version 4 impl CharacterData { /// Parses existing character data. - pub fn from_existing(buffer: &MemoryBuffer) -> Option { + pub fn from_existing(buffer: ByteSpan) -> Option { let mut cursor = Cursor::new(buffer); CharacterData::read(&mut cursor).ok() } /// Write existing character data to a buffer. - pub fn write_to_buffer(&self) -> Option { - let mut buffer = MemoryBuffer::new(); + pub fn write_to_buffer(&self) -> Option { + let mut buffer = ByteBuffer::new(); { let cursor = Cursor::new(&mut buffer); diff --git a/src/cmp.rs b/src/cmp.rs index 3602f53..8079e7f 100644 --- a/src/cmp.rs +++ b/src/cmp.rs @@ -5,8 +5,7 @@ use std::io::{Cursor, Seek, SeekFrom}; use binrw::BinRead; use binrw::binrw; - -use crate::gamedata::MemoryBuffer; +use crate::ByteSpan; #[binrw] #[br(little)] @@ -41,7 +40,7 @@ pub struct CMP { impl CMP { /// Parses an existing FIIN file. - pub fn from_existing(buffer: &MemoryBuffer) -> Option { + pub fn from_existing(buffer: ByteSpan) -> Option { let mut cursor = Cursor::new(buffer); cursor.seek(SeekFrom::Start(0x2a800)).unwrap(); diff --git a/src/dat.rs b/src/dat.rs index b545294..91b0a28 100755 --- a/src/dat.rs +++ b/src/dat.rs @@ -7,8 +7,8 @@ use std::io::Write; use binrw::{BinReaderExt, binrw}; use binrw::BinRead; use binrw::BinWrite; +use crate::ByteBuffer; -use crate::gamedata::MemoryBuffer; #[cfg(feature = "visual_data")] use crate::model::ModelFileHeader; use crate::sqpack::read_data_block; @@ -191,7 +191,7 @@ impl DatFile { /// by the function. /// /// If the block of data is successfully parsed, it returns the file data - otherwise is None. - pub fn read_from_offset(&mut self, offset: u32) -> Option { + pub fn read_from_offset(&mut self, offset: u32) -> Option { let offset = (offset * 0x80) as u64; self.file @@ -219,7 +219,7 @@ impl DatFile { } /// Reads a standard file block. - fn read_standard_file(&mut self, offset: u64, file_info: &FileInfo) -> Option { + fn read_standard_file(&mut self, offset: u64, file_info: &FileInfo) -> Option { let standard_file_info = file_info.standard_info.as_ref().unwrap(); let mut blocks: Vec = Vec::with_capacity(standard_file_info.num_blocks as usize); @@ -247,7 +247,7 @@ impl DatFile { /// Reads a model file block. #[cfg(feature = "visual_data")] - fn read_model_file(&mut self, offset: u64, file_info: &FileInfo) -> Option { + fn read_model_file(&mut self, offset: u64, file_info: &FileInfo) -> Option { let mut buffer = Cursor::new(Vec::new()); let model_file_info = file_info.model_info.as_ref().unwrap(); @@ -397,7 +397,7 @@ impl DatFile { } /// Reads a texture file block. - fn read_texture_file(&mut self, offset: u64, file_info: &FileInfo) -> Option { + fn read_texture_file(&mut self, offset: u64, file_info: &FileInfo) -> Option { let mut data: Vec = Vec::with_capacity(file_info.file_size as usize); let texture_file_info = file_info.texture_info.as_ref().unwrap(); diff --git a/src/exd.rs b/src/exd.rs index abd76f6..1bfe0b7 100644 --- a/src/exd.rs +++ b/src/exd.rs @@ -8,7 +8,7 @@ use binrw::binrw; use crate::common::Language; use crate::exh::{ColumnDataType, ExcelColumnDefinition, ExcelDataPagination, EXH}; -use crate::gamedata::MemoryBuffer; +use crate::ByteSpan; #[binrw] #[brw(magic = b"EXDF")] @@ -70,7 +70,7 @@ pub struct ExcelRow { } impl EXD { - fn read_data_raw = ()>>(cursor: &mut Cursor<&MemoryBuffer>) -> Option + fn read_data_raw = ()>>(cursor: &mut Cursor) -> Option { Some( Z::read_options( @@ -83,7 +83,7 @@ impl EXD { } fn read_column( - cursor: &mut Cursor<&MemoryBuffer>, + cursor: &mut Cursor, exh: &EXH, offset: u32, column: &ExcelColumnDefinition, @@ -149,7 +149,7 @@ impl EXD { } } - pub fn from_existing(exh: &EXH, buffer: &MemoryBuffer) -> Option { + pub fn from_existing(exh: &EXH, buffer: ByteSpan) -> Option { let mut cursor = Cursor::new(buffer); let mut exd = EXD::read(&mut cursor).ok()?; diff --git a/src/exh.rs b/src/exh.rs index b1eb1b1..85c1a8c 100644 --- a/src/exh.rs +++ b/src/exh.rs @@ -7,7 +7,7 @@ use binrw::BinRead; use binrw::binrw; use crate::common::Language; -use crate::gamedata::MemoryBuffer; +use crate::ByteSpan; #[binrw] #[brw(magic = b"EXHF")] @@ -83,7 +83,7 @@ pub struct EXH { } impl EXH { - pub fn from_existing(buffer: &MemoryBuffer) -> Option { + pub fn from_existing(buffer: ByteSpan) -> Option { EXH::read(&mut Cursor::new(&buffer)).ok() } } diff --git a/src/exl.rs b/src/exl.rs index e1680a7..91c4db2 100755 --- a/src/exl.rs +++ b/src/exl.rs @@ -2,8 +2,7 @@ // SPDX-License-Identifier: GPL-3.0-or-later use std::io::{BufRead, BufReader, BufWriter, Cursor, Write}; - -use crate::gamedata::MemoryBuffer; +use crate::{ByteBuffer, ByteSpan}; /// Represents an Excel List. pub struct EXL { @@ -16,7 +15,7 @@ pub struct EXL { impl EXL { /// Initializes `EXL` from an existing list. - pub fn from_existing(buffer: &MemoryBuffer) -> Option { + pub fn from_existing(buffer: ByteSpan) -> Option { let mut exl = Self { version: 0, entries: Vec::new(), @@ -43,8 +42,8 @@ impl EXL { Some(exl) } - pub fn write_to_buffer(&self) -> Option { - let mut buffer = MemoryBuffer::new(); + pub fn write_to_buffer(&self) -> Option { + let mut buffer = ByteBuffer::new(); { let cursor = Cursor::new(&mut buffer); diff --git a/src/fiin.rs b/src/fiin.rs index 4ec9e4b..88d32e4 100644 --- a/src/fiin.rs +++ b/src/fiin.rs @@ -6,8 +6,8 @@ use std::io::Cursor; use binrw::{BinRead, BinWrite}; use binrw::binrw; +use crate::{ByteBuffer, ByteSpan}; -use crate::gamedata::MemoryBuffer; use crate::sha1::Sha1; #[binrw] @@ -47,13 +47,13 @@ pub struct FIINEntry { impl FileInfo { /// Parses an existing FIIN file. - pub fn from_existing(buffer: &MemoryBuffer) -> Option { + pub fn from_existing(buffer: ByteSpan) -> Option { let mut cursor = Cursor::new(buffer); FileInfo::read(&mut cursor).ok() } - pub fn write_to_buffer(&self) -> Option { - let mut buffer = MemoryBuffer::new(); + pub fn write_to_buffer(&self) -> Option { + let mut buffer = ByteBuffer::new(); { let mut cursor = Cursor::new(&mut buffer); diff --git a/src/gamedata.rs b/src/gamedata.rs index 9de7a85..90d2137 100755 --- a/src/gamedata.rs +++ b/src/gamedata.rs @@ -13,6 +13,7 @@ use crate::exd::EXD; use crate::exh::EXH; use crate::exl::EXL; use crate::index::IndexFile; +use crate::ByteBuffer; use crate::patch::{apply_patch, PatchError}; use crate::repository::{Category, Repository, string_to_category}; use crate::sqpack::calculate_hash; @@ -48,8 +49,6 @@ pub enum RepairError<'a> { FailedRepair(&'a Repository), } -pub type MemoryBuffer = Vec; - impl GameData { /// Read game data from an existing game installation. /// @@ -187,7 +186,7 @@ impl GameData { /// let mut file = std::fs::File::create("root.exl").unwrap(); /// file.write(data.as_slice()).unwrap(); /// ``` - pub fn extract(&self, path: &str) -> Option { + pub fn extract(&self, path: &str) -> Option { debug!(file=path, "Extracting file"); let hash = calculate_hash(path); diff --git a/src/lib.rs b/src/lib.rs index f5096c1..3edc979 100755 --- a/src/lib.rs +++ b/src/lib.rs @@ -5,6 +5,12 @@ extern crate core; +/// Represents a continuous block of memory which is not owned, and comes either from an in-memory location or from a file. +pub type ByteSpan<'a> = &'a[u8]; + +/// Represents a continuous block of memory which is owned. +pub type ByteBuffer = Vec; + /// Reading and writing game data repositories, such as "ffxiv" and "ex1", and so on. pub mod gamedata; diff --git a/src/log.rs b/src/log.rs index e00b485..41b5b28 100644 --- a/src/log.rs +++ b/src/log.rs @@ -5,8 +5,7 @@ use std::io::{Cursor, Seek, SeekFrom}; use binrw::BinRead; use binrw::binrw; - -use crate::gamedata::MemoryBuffer; +use crate::ByteSpan; #[binrw] #[allow(dead_code)] @@ -73,7 +72,7 @@ pub struct ChatLog { } impl ChatLog { - pub fn from_existing(buffer: &MemoryBuffer) -> Option { + pub fn from_existing(buffer: ByteSpan) -> Option { let mut cursor = Cursor::new(buffer); let header = ChatLogHeader::read(&mut cursor).expect("Cannot parse header."); diff --git a/src/model.rs b/src/model.rs index d197841..ec8ef6e 100755 --- a/src/model.rs +++ b/src/model.rs @@ -7,8 +7,7 @@ use binrw::{BinResult, binrw, BinWrite, BinWriterExt}; use binrw::BinRead; use binrw::BinReaderExt; use half::f16; - -use crate::gamedata::MemoryBuffer; +use crate::{ByteBuffer, ByteSpan}; #[binrw] #[derive(Debug)] @@ -342,7 +341,7 @@ pub struct MDL { } impl MDL { - pub fn from_existing(buffer: &MemoryBuffer) -> Option { + pub fn from_existing(buffer: ByteSpan) -> Option { let mut cursor = Cursor::new(buffer); let model_file_header = ModelFileHeader::read(&mut cursor).unwrap(); @@ -537,8 +536,8 @@ impl MDL { }) } - pub fn write_to_buffer(&self) -> Option { - let mut buffer = MemoryBuffer::new(); + pub fn write_to_buffer(&self) -> Option { + let mut buffer = ByteBuffer::new(); { let mut cursor = Cursor::new(&mut buffer); @@ -665,7 +664,7 @@ impl MDL { Some(buffer) } - fn read_byte_float4(cursor: &mut Cursor<&MemoryBuffer>) -> Option<[f32; 4]> { + fn read_byte_float4(cursor: &mut Cursor) -> Option<[f32; 4]> { Some([ f32::from(cursor.read_le::().ok()?) / 255.0, f32::from(cursor.read_le::().ok()?) / 255.0, @@ -674,7 +673,7 @@ impl MDL { ]) } - fn read_half4(cursor: &mut Cursor<&MemoryBuffer>) -> Option<[f32; 4]> { + fn read_half4(cursor: &mut Cursor) -> Option<[f32; 4]> { Some([ f16::from_bits(cursor.read_le::().ok()?).to_f32(), f16::from_bits(cursor.read_le::().ok()?).to_f32(), @@ -683,7 +682,7 @@ impl MDL { ]) } - fn read_uint(cursor: &mut Cursor<&MemoryBuffer>) -> BinResult<[u8; 4]> { + fn read_uint(cursor: &mut Cursor) -> BinResult<[u8; 4]> { cursor.read_le::<[u8; 4]>() } @@ -691,7 +690,7 @@ impl MDL { cursor.write_le(vec) } - fn read_single3(cursor: &mut Cursor<&MemoryBuffer>) -> BinResult<[f32; 3]> { + fn read_single3(cursor: &mut Cursor) -> BinResult<[f32; 3]> { cursor.read_le::<[f32; 3]>() } @@ -699,7 +698,7 @@ impl MDL { cursor.write_le(vec) } - fn read_single4(cursor: &mut Cursor<&MemoryBuffer>) -> BinResult<[f32; 4]> { + fn read_single4(cursor: &mut Cursor) -> BinResult<[f32; 4]> { cursor.read_le::<[f32; 4]>() } diff --git a/src/mtrl.rs b/src/mtrl.rs index 434fca8..a9aecca 100644 --- a/src/mtrl.rs +++ b/src/mtrl.rs @@ -4,8 +4,7 @@ use std::io::Cursor; use binrw::{BinRead, binrw}; - -use crate::gamedata::MemoryBuffer; +use crate::ByteSpan; #[binrw] #[derive(Debug)] @@ -128,7 +127,7 @@ pub struct Material { } impl Material { - pub fn from_existing(buffer: &MemoryBuffer) -> Option { + pub fn from_existing(buffer: ByteSpan) -> Option { let mut cursor = Cursor::new(buffer); let mat_data = MaterialData::read(&mut cursor).ok()?; diff --git a/src/pbd.rs b/src/pbd.rs index a562de7..520afa4 100644 --- a/src/pbd.rs +++ b/src/pbd.rs @@ -5,8 +5,7 @@ use std::io::{Cursor, Seek, SeekFrom}; use binrw::{BinRead, BinReaderExt, BinWrite}; use binrw::binrw; - -use crate::gamedata::MemoryBuffer; +use crate::ByteSpan; #[binrw] #[derive(Debug)] @@ -59,11 +58,11 @@ pub struct PreBoneDeformMatrices { } impl PreBoneDeformer { - pub fn from_existing(buffer: &MemoryBuffer) -> Option { + pub fn from_existing(buffer: ByteSpan) -> Option { let mut cursor = Cursor::new(buffer); let mut header = PreBoneDeformerHeader::read(&mut cursor).ok()?; - header.raw_data = buffer.clone(); + header.raw_data = buffer.to_vec(); Some(PreBoneDeformer { header diff --git a/src/shpk.rs b/src/shpk.rs index 012b26e..a5e2467 100644 --- a/src/shpk.rs +++ b/src/shpk.rs @@ -4,8 +4,7 @@ use std::io::{Cursor, Read, Seek, SeekFrom}; use binrw::{BinRead, binread}; - -use crate::gamedata::MemoryBuffer; +use crate::ByteSpan; #[binread] #[br(little)] @@ -88,7 +87,7 @@ pub struct ShaderPackage { } impl ShaderPackage { - pub fn from_existing(buffer: &MemoryBuffer) -> Option { + pub fn from_existing(buffer: ByteSpan) -> Option { let mut cursor = Cursor::new(buffer); let shpk_header = SHPKHeader::read(&mut cursor).unwrap(); diff --git a/src/skeleton.rs b/src/skeleton.rs index de4dad4..5865411 100644 --- a/src/skeleton.rs +++ b/src/skeleton.rs @@ -10,8 +10,8 @@ use binrw::{binread, BinRead}; use binrw::helpers::until_eof; use glam::Mat4; -use crate::gamedata::MemoryBuffer; use crate::havok::{HavokAnimationContainer, HavokBinaryTagFileReader}; +use crate::ByteSpan; #[binread] #[br(little)] @@ -69,7 +69,7 @@ pub struct Skeleton { } impl Skeleton { - pub fn from_existing(buffer: &MemoryBuffer) -> Option { + pub fn from_existing(buffer: ByteSpan) -> Option { let mut cursor = Cursor::new(buffer); let sklb = SKLB::read(&mut cursor).unwrap(); diff --git a/src/tex.rs b/src/tex.rs index d7a03e7..0869313 100644 --- a/src/tex.rs +++ b/src/tex.rs @@ -10,8 +10,7 @@ use binrw::BinRead; use binrw::binrw; use bitflags::bitflags; use texpresso::Format; - -use crate::gamedata::MemoryBuffer; +use crate::ByteSpan; // Attributes and Format are adapted from Lumina (https://github.com/NotAdam/Lumina/blob/master/src/Lumina/Data/Files/TexFile.cs) bitflags! { @@ -77,7 +76,7 @@ pub struct Texture { } impl Texture { - pub fn from_existing(buffer: &MemoryBuffer) -> Option { + pub fn from_existing(buffer: ByteSpan) -> Option { let mut cursor = Cursor::new(buffer); let header = TexHeader::read(&mut cursor).unwrap();