| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116 |
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Text;
- using System.Threading.Tasks;
- using System.IO;
- namespace System.Fire.Container {
- public partial class ContainerList {
- private long ChunkFile_Offset;
- private FileStream ChunkFile;
- private BinaryReader ChunkFileR;
- private BinaryWriter ChunkFileW;
- /*public bool ReadChunk(int pos, int ChunkNum, ref byte Group, ref byte Container, ref ushort ChunkIndex) {
- if (ChunkNum >= 0 && ChunkNum * 4 < this._chunks.Length - 4) {
- Group = this._chunks[pos * 4];
- Container = this._chunks[(pos * 4) + 1];
- ChunkIndex = (ushort)(this._chunks[(((pos * 4) + 2) * 256)] + this._chunks[(pos * 4) + 2]);
- return true;
- }
- return true;
- }
- public bool ReadChunk(int pos, int ChunkNum, ref byte Group, ref byte Container, ref ushort ChunkIndex) {
- this.ChunkFile.Seek(pos + (ChunkNum * 4), IO.SeekOrigin.Begin);
- Group = this.ChunkFileR.ReadByte();
- Container = this.ChunkFileR.ReadByte();
- ChunkIndex = this.ChunkFileR.ReadUInt16();
- return true;
- }*/
- /// <summary>
- /// Returns the length of a container, given by chunkfile-position and chunk number
- /// </summary>
- /// <param name="pos"></param>
- /// <param name="ChunkNum"></param>
- /// <returns></returns>
- private int GetContainerLenFromChunk(long pos, int ChunkNum) {
- this.ChunkFile.Position = (ChunkNum * 4) + pos;
- byte Group = this.ChunkFileR.ReadByte();
- byte Container = this.ChunkFileR.ReadByte();
- return this._container[Group][Container].ChunkSize;
- }
- private byte[] ReadChunk(long pos, int ChunkNum) {
- this.ChunkFile.Position = (ChunkNum * 4) + pos;
- byte Group = this.ChunkFileR.ReadByte();
- byte Container = this.ChunkFileR.ReadByte();
- byte ci1 = this.ChunkFileR.ReadByte();
- byte ci2 = this.ChunkFileR.ReadByte();
- ushort ChunkIndex = (ushort)((ci1 * 256) + ci2);
- //ushort ChunkIndex = this.ChunkFileR.ReadUInt16();
- System.Diagnostics.Debug.WriteLine("Read Chunk: " +
- Group.ToString().PadLeft(3) + " | " +
- Container.ToString().PadLeft(3) + " | " +
- ChunkIndex.ToString().PadLeft(5) +
- " (" + pos + " | " + ChunkNum + ")"
- );
- return this._container[Group][Container].GetChunk(ChunkIndex);
- }
- private long WriteChunk(byte[] b) {
- this.ChunkFile.Seek(0, SeekOrigin.End);
- long pos = ChunkFile.Position;
- System.Diagnostics.Debug.WriteLine("Writ Chunk: " +
- " (" + pos + " | " + (b.Length / 4) + ")"
- );
- this.ChunkFileW.Write(b);
- return pos;
- }
- private void OpenChunkFile(string Path) {
- bool bHasFileInfo = false;
- if (System.IO.File.Exists(Path)) {
- this.ChunkFile = new FileStream(Path, FileMode.Open);
- if (this.ChunkFile.Length > 6) {
- this.ChunkFileR = new BinaryReader(this.ChunkFile);
- this.ChunkFileW = new BinaryWriter(this.ChunkFile);
- byte[] Magic = this.ChunkFileR.ReadBytes(4);
- if (
- Magic[0] == 67 /* C */ &&
- Magic[1] == 111 /* o */ &&
- Magic[2] == 67 /* C */ &&
- Magic[3] == 72 /* H */
- ) {
- ushort version = this.ChunkFileR.ReadUInt16();
- bHasFileInfo = true;
- this.ChunkFile_Offset = this.ChunkFile.Position;
- }
- }
- if (bHasFileInfo == false) {
- this.ChunkFile.Close();
- File.Delete(Path);
- }
- }
- if (!bHasFileInfo) {
- this.ChunkFile = new FileStream(Path, FileMode.CreateNew);
- this.ChunkFileR = new BinaryReader(this.ChunkFile);
- this.ChunkFileW = new BinaryWriter(this.ChunkFile);
- this.ChunkFileW.Write(new byte[] { 67, 111, 67, 72 });
- this.ChunkFileW.Write(Version);
- this.ChunkFile_Offset = this.ChunkFile.Position;
- }
- }
- private void CloseChunkFile() {
- this.ChunkFile.Close();
- }
- }
- }
|