/** 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);
	}
Exemple #3
0
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;
}