Skip to main content

SqpkFile

Struct SqpkFile 

Source
pub struct SqpkFile {
    pub operation: SqpkFileOperation,
    pub file_offset: u64,
    pub file_size: u64,
    pub expansion_id: u16,
    pub path: String,
    pub block_source_offsets: Vec<u64>,
    pub blocks: Vec<SqpkCompressedBlock>,
}
Expand description

SQPK F command body: a file-level operation on the game install tree.

Unlike the block-oriented commands (A, D, E) that target SqPack archive internals, F operates on whole files in the install directory. The operation to perform is selected by operation.

§Wire format

┌──────────────────────────────────────────────────────────────────────────┐
│ operation    : u8      b'A', b'R', b'D', or b'M'                        │  byte 0
│ <padding>    : [u8; 2] (always zero)                                     │  bytes 1–2
│ file_offset  : u64 BE  destination byte offset within the target file    │  bytes 3–10
│ file_size    : u64 BE  declared size of the target file after operation  │  bytes 11–18
│ path_len     : u32 BE  byte length of the path field (including NUL)     │  bytes 19–22
│ expansion_id : u16 BE  expansion folder selector for `RemoveAll`         │  bytes 23–24
│ <padding>    : [u8; 2] (always zero)                                     │  bytes 25–26
│ path         : [u8; path_len]  NUL-terminated UTF-8 path                │  bytes 27–…
│ [blocks]     : SqpkCompressedBlock…  (only for `AddFile`)                │
└──────────────────────────────────────────────────────────────────────────┘

file_offset and file_size are stored as big-endian u64 in the wire format. file_offset is range-checked against i64::MAX at parse time — values with the high bit set (which would round-trip as a negative i64 in the legacy wire interpretation) are rejected with ParseError::NegativeFileOffset before the chunk is constructed.

The NUL terminator in path is stripped during parsing; path always contains a clean UTF-8 string.

For AddFile operations the remaining bytes in the command body after the path form a sequence of SqpkCompressedBlocks (see that type’s documentation for the block wire format). For all other operations the block list is empty.

§Reference

§Errors

Parsing returns a crate::ParseError if:

Fields§

§operation: SqpkFileOperation

The file operation to perform.

§file_offset: u64

Destination byte offset within the target file.

For AddFile: if zero, the target file is truncated to zero before writing (complete replacement); if positive, writing begins at this byte offset in the existing file. Values with the high bit set in the wire u64 are rejected at parse time with ParseError::NegativeFileOffset, so every value reaching here fits in an i64.

Unused by RemoveAll, DeleteFile, and MakeDirTree.

§file_size: u64

Declared total size of the target file after the operation, in bytes.

Informational; the apply layer does not use this to pre-allocate or truncate the file (truncation is controlled by file_offset == 0).

§expansion_id: u16

Expansion folder selector used by RemoveAll.

0ffxiv (base game), n > 0ex<n>. Corresponds to the high byte of sub_id in block-oriented commands.

§path: String

Relative path to the target file or directory under the game install root.

NUL terminator is stripped during parsing. For AddFile / DeleteFile this is joined with the install root via generic_path. For MakeDirTree it is the directory tree to create.

§block_source_offsets: Vec<u64>

Byte offset of each block’s data payload — measured from the start of the SQPK command body slice — after skipping the block’s 16-byte header.

block_source_offsets[i] corresponds to blocks[i]. Adding the chunk’s absolute position in the patch file to this offset gives the patch-file byte offset where the block’s data begins, enabling IndexedZiPatch random-access reads that do not need to decompress the full stream.

Empty for all operations other than AddFile.

§blocks: Vec<SqpkCompressedBlock>

Inline compressed-or-raw block payloads that make up the file content.

Only populated for AddFile; empty for RemoveAll, DeleteFile, and MakeDirTree. Each block is decompressed in sequence into the target file by the apply layer. See SqpkCompressedBlock for the block wire format and DEFLATE discrimination logic.

Trait Implementations§

Source§

impl Debug for SqpkFile

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T> Instrument for T

Source§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided Span, returning an Instrumented wrapper. Read more
Source§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an Instrumented wrapper. Read more
Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T> IntoEither for T

Source§

fn into_either(self, into_left: bool) -> Either<Self, Self>

Converts 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 more
Source§

fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
where F: FnOnce(&Self) -> bool,

Converts 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
Source§

impl<T> Pointable for T

Source§

const ALIGN: usize

The alignment of pointer.
Source§

type Init = T

The type for initializers.
Source§

unsafe fn init(init: <T as Pointable>::Init) -> usize

Initializes a with the given initializer. Read more
Source§

unsafe fn deref<'a>(ptr: usize) -> &'a T

Dereferences the given pointer. Read more
Source§

unsafe fn deref_mut<'a>(ptr: usize) -> &'a mut T

Mutably dereferences the given pointer. Read more
Source§

unsafe fn drop(ptr: usize)

Drops the object pointed to by the given pointer. Read more
Source§

impl<T> Same for T

Source§

type Output = T

Should always be Self
Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
Source§

impl<T> WithSubscriber for T

Source§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a WithDispatch wrapper. Read more
Source§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a WithDispatch wrapper. Read more