public CR2WFile() { names = new List <CR2WNameWrapper>(); //block 2 imports = new List <CR2WImportWrapper>(); //block 3 properties = new List <CR2WPropertyWrapper>(); //block 4 chunks = new List <CR2WExportWrapper>(); //block 5 buffers = new List <CR2WBufferWrapper>(); //block 6 embedded = new List <CR2WEmbeddedWrapper>(); //block 7 m_fileheader = new CR2WFileHeader() { version = 162, }; }
public CR2WFile() { names = new List <CR2WString> { new CR2WString() }; imports = new List <CR2WHandle>(); chunks = new List <CR2WChunk>(); //table4 = new List<CR2WHeaderBlock4>(); buffers = new List <CR2WBuffer>(); embedded = new List <CR2WEmbedded>(); m_fileheader = new CR2WFileHeader(); m_fileheader.version = 162; }
public CR2WFile() { Names = new List <CR2WNameWrapper>(); //block 2 Imports = new List <CR2WImportWrapper>(); //block 3 Properties = new List <CR2WPropertyWrapper>(); //block 4 Chunks = new List <CR2WExportWrapper>(); //block 5 Buffers = new List <CR2WBufferWrapper>(); //block 6 Embedded = new List <CR2WEmbeddedWrapper>(); //block 7 m_fileheader = new CR2WFileHeader() { version = 162, }; Logger = ServiceLocator.Default.ResolveType <ILoggerService>(); StringDictionary = new Dictionary <uint, string>(); m_tableheaders = new CR2WTable[10]; }
private void ProcessFile() { var id = ReadStruct <uint>(); if (id != MAGIC) { throw new FormatException($"Not a CR2W file, Magic read as 0x{id:X8}"); } m_fileheader = ReadStruct <CR2WFileHeader>(); if (m_fileheader.version > 163 || m_fileheader.version < 159) { throw new FormatException($"Unknown Version {m_fileheader.version}. Supported versions: 159 - 163."); } var dt = new CDateTime(m_fileheader.timeStamp); m_hasInternalBuffer = m_fileheader.bufferSize > m_fileheader.fileSize; m_tableheaders = ReadStructs <CR2WTable>(10); m_strings = ReadStringsBuffer(); m_names = ReadTable <CR2WName>(1); m_imports = ReadTable <CR2WImport>(2); m_table4 = ReadTable <CR2WProperty>(3); m_exports = ReadTable <CR2WExport>(4); m_buffers = ReadTable <CR2WBuffer>(5); m_embedded = ReadTable <CR2WEmbedded>(6); // Fixing for (int i = 0; i < m_names.Length; i++) { FixNameFNV1A(ref m_names[i]); } for (int i = 0; i < m_exports.Length; i++) { FixExportCRC32(ref m_exports[i]); } for (int i = 0; i < m_buffers.Length; i++) { FixBufferCRC32(ref m_buffers[i]); } // Write File m_stream.Seek(160, SeekOrigin.Begin); WriteStringBuffer(); WriteTable <CR2WName>(m_names, 1); WriteTable <CR2WImport>(m_imports, 2); WriteTable <CR2WProperty>(m_table4, 3); WriteTable <CR2WExport>(m_exports, 4); WriteTable <CR2WBuffer>(m_buffers, 5); WriteTable <CR2WEmbedded>(m_embedded, 6); // Write Header again m_stream.Seek(0, SeekOrigin.Begin); m_fileheader.timeStamp = CDateTime.Now.ToUInt64(); m_fileheader.crc32 = CalculateHeaderCRC32(); WriteStruct <uint>(MAGIC); WriteStruct <CR2WFileHeader>(m_fileheader); WriteStructs <CR2WTable>(m_tableheaders); }
public void Read(BinaryReader file) { m_stream = file.BaseStream; #region Read Headers // read file header var id = ReadStruct <uint>(); if (id != MAGIC) { throw new FormatException($"Not a CR2W file, Magic read as 0x{id:X8}"); } m_fileheader = ReadStruct <CR2WFileHeader>(); if (m_fileheader.version > 163 || m_fileheader.version < 159) { throw new FormatException($"Unknown Version {m_fileheader.version}. Supported versions: 159 - 163."); } var dt = new CDateTime(m_fileheader.timeStamp); m_tableheaders = ReadStructs <CR2WTable>(10); // read strings m_strings = ReadStringsBuffer(); // read tables names = ReadTable <CR2WName>(1).Select(_ => new CR2WNameWrapper(_) { Str = m_dictionary[_.value], }).ToList(); imports = ReadTable <CR2WImport>(2).Select(_ => new CR2WImportWrapper(_) { DepotPathStr = m_dictionary[_.depotPath], ClassNameStr = names[_.className].Str, }).ToList(); properties = ReadTable <CR2WProperty>(3).Select(_ => new CR2WPropertyWrapper(_)).ToList(); chunks = ReadTable <CR2WExport>(4).Select(_ => new CR2WExportWrapper(this, _) { //ParentChunkId = _.parentID }).ToList(); buffers = ReadTable <CR2WBuffer>(5).Select(_ => new CR2WBufferWrapper(_)).ToList(); embedded = ReadTable <CR2WEmbedded>(6).Select(_ => new CR2WEmbeddedWrapper(_) { ParentImports = imports, Handle = m_dictionary[_.path], }).ToList(); #endregion #region Read Data // Read object data //block 5 foreach (var chunk in chunks) { chunk.ReadData(file); } // Read buffer data //block 6 foreach (var buffer in buffers) { //buffer.ReadData(file); } // Read embedded files //block 7 foreach (var emb in embedded) { emb.ReadData(file); } #endregion //this never actually triggers /*#region Read Buffer * file.BaseStream.Seek(m_fileheader.fileSize, SeekOrigin.Begin); * m_hasInternalBuffer = m_fileheader.bufferSize > m_fileheader.fileSize; * byte[] bufferdata; * var actualbuffersize = (int)(m_fileheader.bufferSize - m_fileheader.fileSize); * if (actualbuffersize > 0) * { * bufferdata = new byte[actualbuffersize]; * file.BaseStream.Read(bufferdata, 0, actualbuffersize); * } #endregion*/ m_stream = null; }
public void Read(BinaryReader file) { m_stream = file.BaseStream; #region Read Headers var id = ReadStruct <uint>(); if (id != MAGIC) { throw new FormatException($"Not a CR2W file, Magic read as 0x{id:X8}"); } m_fileheader = ReadStruct <CR2WFileHeader>(); if (m_fileheader.version > 163 || m_fileheader.version < 159) { throw new FormatException($"Unknown Version {m_fileheader.version}. Supported versions: 159 - 163."); } var dt = new CDateTime(m_fileheader.timeStamp); m_hasInternalBuffer = m_fileheader.bufferSize > m_fileheader.fileSize; m_tableheaders = ReadStructs <CR2WTableHeader>(10); m_strings = ReadStringsBuffer(); m_names = ReadTable <CR2WName>(1); m_imports = ReadTable <CR2WImportHeader>(2); m_table4 = ReadTable <CR2WTable4Item>(3); m_exports = ReadTable <CR2WExportHeader>(4); m_buffers = ReadTable <CR2WBufferHeader>(5); m_embedded = ReadTable <CR2WEmbeddedHeader>(6); #endregion #region Read Data // read Name data names = (from n in m_names let str = new CR2WString() { hash = n.hash, offset = n.value, str = m_dictionary[n.value] } select str).ToList(); // Read Handle data (imports) imports = (from i in m_imports let handle = new CR2WHandle() { offset = i.depotPath, filetype = i.className, flags = i.flags, str = m_dictionary[i.depotPath] } select handle).ToList(); // Read Chunk data (exports) chunks = new List <CR2WChunk>(); foreach (var c in m_exports) { var chunk = new CR2WChunk(this) { typeId = c.className, Flags = c.objectFlags, ParentChunkId = c.parentID, size = c.dataSize, offset = c.dataOffset, template = c.template, crc = c.crc32 }; chunks.Add(chunk); chunk.ReadData(file); } // Read Buffer Data (block 6) buffers = new List <CR2WBuffer>(); foreach (var b in m_buffers) { var buffer = new CR2WBuffer() { flags = b.flags, index = b.index, offset = b.offset, size = b.diskSize, memsize = b.memSize, crc = b.crc32 }; buffers.Add(buffer); } // Read Embedded Data (Block 7) embedded = new List <CR2WEmbedded>(); foreach (var e in m_embedded) { var emb = new CR2WEmbedded() { handle_name_count = e.importIndex, handle_name_offset = e.path, pathHash = e.pathHash, offset = e.dataOffset, size = e.dataSize }; var offset = e.path; for (int i = 0; i < e.importIndex; i++) { if (offset > m_dictionary.Last().Key) { continue; } emb.handles.Add(m_dictionary[offset]); offset += (uint)m_dictionary[offset].Length + 1; } embedded.Add(emb); emb.ReadData(file); } #endregion #region Read Buffer file.BaseStream.Seek(m_fileheader.fileSize, SeekOrigin.Begin); var actualbuffersize = (int)(m_fileheader.bufferSize - m_fileheader.fileSize); if (actualbuffersize > 0) { bufferdata = new byte[actualbuffersize]; file.BaseStream.Read(bufferdata, 0, actualbuffersize); } #endregion m_stream = null; }