protected override void ReadChunk() { var start = this.Reader.BaseStream.Position; Operation = (OperationKind)this.Reader.ReadByte(); this.Reader.ReadBytes(2); // Alignment FileOffset = this.Reader.ReadInt64BE(); FileSize = this.Reader.ReadUInt64BE(); var pathLen = this.Reader.ReadUInt32BE(); ExpansionId = this.Reader.ReadUInt16BE(); this.Reader.ReadBytes(2); TargetFile = new SqexFile(this.Reader.ReadFixedLengthString(pathLen)); if (Operation == OperationKind.AddFile) { CompressedDataSourceOffsets = new(); CompressedData = new List <SqpkCompressedBlock>(); while (Size - this.Reader.BaseStream.Position + start > 0) { CompressedDataSourceOffsets.Add(Offset + this.Reader.BaseStream.Position); CompressedData.Add(new SqpkCompressedBlock(this.Reader)); CompressedDataSourceOffsets[CompressedDataSourceOffsets.Count - 1] += CompressedData[CompressedData.Count - 1].HeaderSize; } } this.Reader.ReadBytes(Size - (int)(this.Reader.BaseStream.Position - start)); }
protected override void ReadChunk() { var start = reader.BaseStream.Position; Operation = (OperationKind)reader.ReadByte(); reader.ReadBytes(2); // Alignment FileOffset = reader.ReadInt64BE(); FileSize = reader.ReadUInt64BE(); var pathLen = reader.ReadUInt32BE(); ExpansionId = reader.ReadUInt16BE(); reader.ReadBytes(2); TargetFile = new SqexFile(reader.ReadFixedLengthString(pathLen)); if (Operation == OperationKind.AddFile) { CompressedData = new List <SqpkCompressedBlock>(); while (Size - reader.BaseStream.Position + start > 0) { CompressedData.Add(new SqpkCompressedBlock(reader)); } } reader.ReadBytes(Size - (int)(reader.BaseStream.Position - start)); }
public override void ApplyChunk(ZiPatchConfig config) { switch (Operation) { // Default behaviour falls through to AddFile, though this shouldn't happen case OperationKind.AddFile: default: // TODO: Check this. I *think* boot usually creates all the folders like sqpack, movie, etc., so this might be kind of a hack TargetFile.CreateDirectoryTree(config.GamePath); var fileStream = config.Store == null? TargetFile.OpenStream(config.GamePath, FileMode.OpenOrCreate) : TargetFile.OpenStream(config.Store, config.GamePath, FileMode.OpenOrCreate); if (FileOffset == 0) { fileStream.SetLength(0); } fileStream.Seek(FileOffset, SeekOrigin.Begin); foreach (var block in CompressedData) { block.DecompressInto(fileStream); } break; case OperationKind.RemoveAll: foreach (var file in SqexFile.GetAllExpansionFiles(config.GamePath, ExpansionId).Where(RemoveAllFilter)) { File.Delete(file); } break; case OperationKind.DeleteFile: File.Delete(config.GamePath + "/" + TargetFile.RelativePath); break; case OperationKind.MakeDirTree: Directory.CreateDirectory(config.GamePath + "/" + TargetFile.RelativePath); break; } }