Пример #1
0
        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));
        }
Пример #2
0
        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));
        }
Пример #3
0
        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;
            }
        }