/** Check might look into the file. \param file File handle to check. \return True if file seems to be loadable. */ bool CArchiveLoaderNPK::isALoadableFileFormat(io::IReadFile* file) const { SNPKHeader header; file->read(&header, sizeof(header)); return isHeaderValid(header); }
/** Check might look into the file. \param file File handle to check. \return True if file seems to be loadable. */ bool CArchiveLoaderPAK::isALoadableFileFormat(IReadFile* file) const { SPAKFileHeader header; file->read(&header, sizeof(header)); return isHeaderValid(header); }
bool CPakReader::scanLocalHeader() { SPAKFileHeader header; // Read and validate the header File->read(&header, sizeof(header)); if (!isHeaderValid(header)) return false; // Seek to the table of contents #ifdef __BIG_ENDIAN__ header.offset = os::Byteswap::byteswap(header.offset); header.length = os::Byteswap::byteswap(header.length); #endif File->seek(header.offset); const int numberOfFiles = header.length / sizeof(SPAKFileEntry); Offsets.reallocate(numberOfFiles); // Loop through each entry in the table of contents for(int i = 0; i < numberOfFiles; i++) { // read an entry SPAKFileEntry entry; File->read(&entry, sizeof(entry)); #ifdef _DEBUG os::Printer::log(entry.name); #endif #ifdef __BIG_ENDIAN__ entry.offset = os::Byteswap::byteswap(entry.offset); entry.length = os::Byteswap::byteswap(entry.length); #endif addItem(io::path(entry.name), entry.length, false, Offsets.size()); Offsets.push_back(entry.offset); } return true; }
bool CPakReader::scanLocalHeader() { SPAKFileHeader header; // Read and validate the header File->read(&header, sizeof(header)); if (!isHeaderValid(header)) return false; // Seek to the table of contents #if (SAPPHIRE_CONFIG_ENDIAN == SAPPHIRE_BIG_ENDIAN) header.offset = Byteswap::byteswap(header.offset); header.length = Byteswap::byteswap(header.length); #endif File->seek(header.offset); const int numberOfFiles = header.length / sizeof(SPAKFileEntry); // Loop through each entry in the table of contents for (int i = 0; i < numberOfFiles; i++) { // read an entry SPAKFileEntry entry; File->read(&entry, sizeof(entry)); #ifdef _DEBUG Printer::log(entry.name); #endif #if (SAPPHIRE_CONFIG_ENDIAN == SAPPHIRE_BIG_ENDIAN) entry.offset = Byteswap::byteswap(entry.offset); entry.length = Byteswap::byteswap(entry.length); #endif addItem(path(entry.name), entry.offset, entry.length, false); } return true; }
bool CNPKReader::scanLocalHeader() { SNPKHeader header; // Read and validate the header File->read(&header, sizeof(header)); if (!isHeaderValid(header)) return false; // Seek to the table of contents #ifdef __BIG_ENDIAN__ header.Offset = os::Byteswap::byteswap(header.Offset); header.Length = os::Byteswap::byteswap(header.Length); #endif header.Offset += 8; core::stringc dirName; bool inTOC=true; // Loop through each entry in the table of contents while (inTOC && (File->getPos() < File->getSize())) { // read an entry char tag[4]={0}; SNPKFileEntry entry; File->read(tag, 4); const int numTag = MAKE_IRR_ID(tag[3],tag[2],tag[1],tag[0]); int size; bool isDir=true; switch (numTag) { case MAKE_IRR_ID('D','I','R','_'): { File->read(&size, 4); readString(entry.Name); entry.Length=0; entry.Offset=0; #ifdef IRR_DEBUG_NPK_READER os::Printer::log("Dir", entry.Name); #endif } break; case MAKE_IRR_ID('F','I','L','E'): { File->read(&size, 4); File->read(&entry.Offset, 4); File->read(&entry.Length, 4); readString(entry.Name); isDir=false; #ifdef IRR_DEBUG_NPK_READER os::Printer::log("File", entry.Name); #endif #ifdef __BIG_ENDIAN__ entry.Offset = os::Byteswap::byteswap(entry.Offset); entry.Length = os::Byteswap::byteswap(entry.Length); #endif } break; case MAKE_IRR_ID('D','E','N','D'): { File->read(&size, 4); entry.Name=""; entry.Length=0; entry.Offset=0; const s32 pos = dirName.findLast('/', dirName.size()-2); if (pos==-1) dirName=""; else dirName=dirName.subString(0, pos); #ifdef IRR_DEBUG_NPK_READER os::Printer::log("Dirend", dirName); #endif } break; default: inTOC=false; } // skip root dir if (isDir) { if (!entry.Name.size() || (entry.Name==".") || (entry.Name=="<noname>")) continue; dirName += entry.Name; dirName += "/"; } #ifdef IRR_DEBUG_NPK_READER os::Printer::log("Name", entry.Name); #endif addItem((isDir?dirName:dirName+entry.Name), entry.Offset+header.Offset, entry.Length, isDir); } return true; }