Exemple #1
0
        public CR2WFile()
        {
            Names      = new List <ICR2WName>();            //block 2
            Imports    = new List <ICR2WImport>();          //block 3
            Properties = new List <CR2WPropertyWrapper>();  //block 4
            Chunks     = new List <ICR2WExport>();          //block 5
            Buffers    = new List <ICR2WBuffer>();          //block 6
            Embedded   = new List <CR2WEmbeddedWrapper>();  //block 7

            m_fileheader = new CR2WFileHeader()
            {
                version   = 195,
                numChunks = 6
            };

            StringDictionary = new Dictionary <uint, string>();
            m_tableheaders   = new CR2WTable[10];
        }
Exemple #2
0
        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, null, "");

            m_hasInternalBuffer = m_fileheader.buffersEnd > m_fileheader.objectsEnd;
            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);
        }