cWSSCompact::cPAKFile::cPAKFile(const AString & a_FileName, int a_LayerX, int a_LayerZ, int a_CompressionFactor) : m_FileName(a_FileName), m_CompressionFactor(a_CompressionFactor), m_LayerX(a_LayerX), m_LayerZ(a_LayerZ), m_NumDirty(0), m_ChunkVersion( CHUNK_VERSION ), // Init with latest version m_PakVersion( PAK_VERSION ) { cFile f; if (!f.Open(m_FileName, cFile::fmRead)) { return; } // Read headers: READ(m_PakVersion); if (m_PakVersion != 1) { LOGERROR("File \"%s\" is in an unknown pak format (%d)", m_FileName.c_str(), m_PakVersion); return; } READ(m_ChunkVersion); switch( m_ChunkVersion ) { case 1: m_ChunkSize.Set(16, 128, 16); break; case 2: case 3: m_ChunkSize.Set(16, 256, 16); break; default: LOGERROR("File \"%s\" is in an unknown chunk format (%d)", m_FileName.c_str(), m_ChunkVersion); return; }; short NumChunks = 0; READ(NumChunks); // Read chunk headers: for (int i = 0; i < NumChunks; i++) { sChunkHeader * Header = new sChunkHeader; // Here we do not use the READ macro, as it does not free the resources // allocated with new in case of error. if (f.Read(Header, sizeof(*Header)) != sizeof(*Header)) { LOGERROR("ERROR READING %s FROM FILE %s (line %d); file offset %d", "Header", m_FileName.c_str(), __LINE__, f.Tell()); delete Header; return; } m_ChunkHeaders.push_back(Header); } // for i - chunk headers // Read chunk data: if (f.ReadRestOfFile(m_DataContents) == -1) { LOGERROR("Cannot read file \"%s\" contents", m_FileName.c_str()); return; } if( m_ChunkVersion == 1 ) // Convert chunks to version 2 { UpdateChunk1To2(); } #if AXIS_ORDER == AXIS_ORDER_XZY if( m_ChunkVersion == 2 ) // Convert chunks to version 3 { UpdateChunk2To3(); } #endif }
cWSSCompact::cPAKFile::cPAKFile(const AString & a_FileName, int a_LayerX, int a_LayerZ) : m_FileName(a_FileName), m_LayerX(a_LayerX), m_LayerZ(a_LayerZ), m_NumDirty(0), m_ChunkVersion( CHUNK_VERSION ), // Init with latest version m_PakVersion( PAK_VERSION ) { cFile f; if (!f.Open(m_FileName, cFile::fmRead)) { return; } // Read headers: READ(m_PakVersion); if (m_PakVersion != 1) { LOGERROR("File \"%s\" is in an unknown pak format (%d)", m_FileName.c_str(), m_PakVersion); return; } READ(m_ChunkVersion); switch( m_ChunkVersion ) { case 1: m_ChunkSize.Set(16, 128, 16); break; case 2: case 3: m_ChunkSize.Set(16, 256, 16); break; default: LOGERROR("File \"%s\" is in an unknown chunk format (%d)", m_FileName.c_str(), m_ChunkVersion); return; }; short NumChunks = 0; READ(NumChunks); // Read chunk headers: for (int i = 0; i < NumChunks; i++) { sChunkHeader * Header = new sChunkHeader; READ(*Header); m_ChunkHeaders.push_back(Header); } // for i - chunk headers // Read chunk data: if (f.ReadRestOfFile(m_DataContents) == -1) { LOGERROR("Cannot read file \"%s\" contents", m_FileName.c_str()); return; } if( m_ChunkVersion == 1 ) // Convert chunks to version 2 { UpdateChunk1To2(); } #if AXIS_ORDER == AXIS_ORDER_XZY if( m_ChunkVersion == 2 ) // Convert chunks to version 3 { UpdateChunk2To3(); } #endif }