pub struct SqpkAddData {
pub target_file: SqpackFile,
pub block_offset: u64,
pub data_bytes: u64,
pub block_delete_number: u64,
pub data: Vec<u8>,
}Expand description
SQPK A command body: write an inline data payload into a .dat file,
then zero a trailing region.
The A command is the primary mechanism for patching game data. It carries
its payload inline in the patch file: the bytes at data[0..data_bytes] are
written to the resolved .dat file starting at block_offset, and then
block_delete_number additional bytes are zeroed out immediately after the
payload. This zeroing step logically marks the trailing range of blocks as
deleted / available.
§Wire format (all big-endian)
┌────────────────────────────────────────────────────────────────────────┐
│ <padding> : [u8; 3] (reserved, always zero) │ bytes 0–2
│ main_id : u16 BE │ bytes 3–4
│ sub_id : u16 BE │ bytes 5–6
│ file_id : u32 BE │ bytes 7–10
│ block_offset_raw : u32 BE multiply by 128 to get byte offset │ bytes 11–14
│ data_bytes_raw : u32 BE multiply by 128 to get payload size │ bytes 15–18
│ block_delete_number_raw: u32 BE multiply by 128 to get zero length │ bytes 19–22
│ data : [u8; data_bytes] inline payload │ bytes 23–…
└────────────────────────────────────────────────────────────────────────┘All three raw u32 size/offset fields are in 128-byte SqPack block units
and are multiplied by 128 (<< 7) during parsing; the decoded fields
(block_offset, data_bytes, block_delete_number) are already in bytes.
§Reference
See SqpkAddData.cs in the XIVLauncher reference implementation.
§Errors
Parsing returns crate::ZiPatchError::BinrwError if the body is too
short to contain the fixed header or the declared data_bytes payload.
Fields§
§target_file: SqpackFileSqPack file to write into.
Preceded by 3 bytes of alignment padding in the wire format.
block_offset: u64Byte offset within the target .dat file at which to begin writing.
Decoded from a raw big-endian u32 by multiplying by 128 (raw << 7).
The raw value is in 128-byte SqPack block units.
data_bytes: u64Length in bytes of the inline data payload.
Decoded from a raw big-endian u32 by multiplying by 128 (raw << 7).
Used to determine how many bytes to read into data.
block_delete_number: u64Number of bytes to zero immediately after writing data.
Decoded from a raw big-endian u32 by multiplying by 128 (raw << 7).
If non-zero, the apply layer writes this many zero bytes starting at
block_offset + data_bytes, logically marking those blocks as freed.
data: Vec<u8>Inline data payload of exactly data_bytes bytes.
Written verbatim to the target .dat file at block_offset. The
content is raw SqPack block data — compressed game assets, index
tables, etc. — as the game engine expects them.
Implementations§
Source§impl SqpkAddData
impl SqpkAddData
Sourcepub const DATA_SOURCE_OFFSET: u64 = SQPK_ADDDATA_HEADER_SIZE
pub const DATA_SOURCE_OFFSET: u64 = SQPK_ADDDATA_HEADER_SIZE
Byte offset of the data field within the SQPK
command body slice (i.e. the byte slice starting after the SQPK
inner_size + sub-command tag).
This constant (23) is the size of the fixed header preceding the inline
payload: 3 bytes padding + 8 bytes SqpackFile + 4 + 4 + 4 bytes for
the three raw size/offset u32s.
Adding this constant to the chunk’s absolute position in the patch file
gives the patch-file offset where data begins — the value needed for
IndexedZiPatch random-access reads that skip decompressing the full
patch stream.
Trait Implementations§
Source§impl BinRead for SqpkAddData
impl BinRead for SqpkAddData
Source§fn read_options<R: Read + Seek>(
__binrw_generated_var_reader: &mut R,
__binrw_generated_var_endian: Endian,
__binrw_generated_var_arguments: Self::Args<'_>,
) -> BinResult<Self>
fn read_options<R: Read + Seek>( __binrw_generated_var_reader: &mut R, __binrw_generated_var_endian: Endian, __binrw_generated_var_arguments: Self::Args<'_>, ) -> BinResult<Self>
Source§fn read<R>(reader: &mut R) -> Result<Self, Error>
fn read<R>(reader: &mut R) -> Result<Self, Error>
Self from the reader using default arguments. Read moreSource§fn read_be<R>(reader: &mut R) -> Result<Self, Error>
fn read_be<R>(reader: &mut R) -> Result<Self, Error>
Self from the reader using default arguments and assuming
big-endian byte order. Read moreSource§fn read_le<R>(reader: &mut R) -> Result<Self, Error>
fn read_le<R>(reader: &mut R) -> Result<Self, Error>
Self from the reader using default arguments and assuming
little-endian byte order. Read moreSource§fn read_ne<R>(reader: &mut R) -> Result<Self, Error>
fn read_ne<R>(reader: &mut R) -> Result<Self, Error>
T from the reader assuming native-endian byte order. Read moreSource§fn read_args<R>(reader: &mut R, args: Self::Args<'_>) -> Result<Self, Error>
fn read_args<R>(reader: &mut R, args: Self::Args<'_>) -> Result<Self, Error>
Self from the reader using the given arguments. Read moreSource§fn read_be_args<R>(reader: &mut R, args: Self::Args<'_>) -> Result<Self, Error>
fn read_be_args<R>(reader: &mut R, args: Self::Args<'_>) -> Result<Self, Error>
Self from the reader, assuming big-endian byte order, using the
given arguments. Read moreSource§impl Clone for SqpkAddData
impl Clone for SqpkAddData
Source§fn clone(&self) -> SqpkAddData
fn clone(&self) -> SqpkAddData
1.0.0 (const: unstable) · Source§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
source. Read moreSource§impl Debug for SqpkAddData
impl Debug for SqpkAddData
Source§impl PartialEq for SqpkAddData
impl PartialEq for SqpkAddData
Source§fn eq(&self, other: &SqpkAddData) -> bool
fn eq(&self, other: &SqpkAddData) -> bool
self and other values to be equal, and is used by ==.Source§impl ReadEndian for SqpkAddData
impl ReadEndian for SqpkAddData
Source§const ENDIAN: EndianKind
const ENDIAN: EndianKind
impl Eq for SqpkAddData
impl StructuralPartialEq for SqpkAddData
Auto Trait Implementations§
impl Freeze for SqpkAddData
impl RefUnwindSafe for SqpkAddData
impl Send for SqpkAddData
impl Sync for SqpkAddData
impl Unpin for SqpkAddData
impl UnsafeUnpin for SqpkAddData
impl UnwindSafe for SqpkAddData
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Source§impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
Source§impl<T> Instrument for T
impl<T> Instrument for T
Source§fn instrument(self, span: Span) -> Instrumented<Self>
fn instrument(self, span: Span) -> Instrumented<Self>
Source§fn in_current_span(self) -> Instrumented<Self>
fn in_current_span(self) -> Instrumented<Self>
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self>
fn into_either(self, into_left: bool) -> Either<Self, Self>
self into a Left variant of Either<Self, Self>
if into_left is true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
self into a Left variant of Either<Self, Self>
if into_left(&self) returns true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read more