⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 resfile.cpp

📁 liu7788414
💻 CPP
字号:
/*
* ============================================================================
*  Name     : CResFile from ResFile.cpp
*  Part of  : Game
*  Created  : 2003-06-16 by Qiu Wei Min
*  Implementation notes:
*  Modified : 2003-09-03 by Zheng Jie Sheng
*      To decompress from zlib compressed package. Using old packing tool. 
*  Version  :
*  Copyright: Gameloft S.A.
*
* ============================================================================
*/

// INCLUDE FILES
//#include <AEE.h> 
//#include <AEEfile.h> 
//#include <AEEStdLib.h>
//#include "engine.h"
#include "simplememory.h"
#include "resfile.h"
#include "../zlib/zlib.h"
#include "gfx.h"
//#include "game.h"
// ================= MEMBER FUNCTIONS =======================
// Base
//const int Sign8_cos[] = {0, 1, 1, 1, 0, -1, -1, -1};
//const int Sign8_sin[] = {-1, -1, 0, 1, 1, 1, 0, -1};
extern CSimpleMemory *SMemory;
int FLength=0;

CResFile::CResFile(void)
{
//	m_pEngine = pEngine;
	m_nEntry = 0;
//	m_handle = NULL;
	m_pZlib  = NULL;
	m_pZlib = new CZLibBrew();
	SYS_ASSERT(NULL != m_pZlib);
	if(m_pZlib)
	{
		f = (FileIO*)MALLOC(sizeof(FileIO));
		SYS_ASSERT(NULL != f);
		if(NULL != f)
			CSimpleMemory::Fill((void*)f, 0, sizeof(FileIO));
	}
}

CResFile::~CResFile()
{
/*	if(m_handle)
	{
		IFILE_Release((IFile*)m_handle);
		m_handle = NULL;
	}
*/
	if( m_handle != CFile::hFileNull )
	{
		m_handle.Close();
	}
/*	if(m_pZlib)
	{
		delete m_pZlib;
		m_pZlib = NULL;
	}
*/
	if(f)
	{
		FREE(f);
		f = NULL;
	}
}

bool CResFile::Open(const char *fn)
{
	int iRet = 0;
	long nPak; //number of pakage entry

	if(NULL == f)
		return false;
/*    m_handle = IFILEMGR_OpenFile ((IFileMgr*) m_pEngine->pFileMgr ,fn, _OFM_READ);
	SYS_ASSERT(NULL != m_handle);
	if(NULL ==m_handle)
		return false;
*/
	CFileException ex;
	BOOL ret;

    ret = m_handle.Open(fn, CFile::modeRead | CFile::shareDenyWrite, &ex)
	SYS_ASSERT(NULL != ret);
	SYS_ASSERT(CFile::hFileNull != m_handle);
	if(CFile::hFileNull ==m_handle)
		return false;

	f->isPaked = (char)(m_handle !=NULL);

	int size;
//	iRet = IFILE_Read(m_handle, &nPak, sizeof(nPak)); 
	iRet = m_handle.Read(&nPak, sizeof(nPak));
	if(iRet != sizeof(nPak))
	{
		return false;
	}
	m_nEntry = (int)nPak;
	SYS_ASSERT(nPak >= 0 && nPak <=64000); //max file number on brew.
	size = sizeof(struct Pak ) + nPak *sizeof(struct PakEntry);


	f->pak = (struct Pak*)SMemory->GlobalMalloc(size);
	SYS_ASSERT(NULL != f->pak);
	if(NULL == f->pak)
		return false;
//	IFILE_Seek(m_handle,_SEEK_START,0);
//	IFILE_Read(m_handle, f->pak, size);
	m_handle.Seek(0, CFile::begin);
	m_handle.Read(f->pak, size);

	return true;
}

void* CResFile::FindRecord(const char *name)
{
	unsigned long h = ComputeHash(name);
	int i;
	struct PakEntry *p;
	for(i=0, p=f->pak->aPak; i<f->pak->nPak; i++, p++){
		if(p->nameHash == h)
			return	p;//(void*)i;
	}
	SYS_ASSERT(0);//open failed
	return NULL;
}

unsigned long CResFile::ComputeHash(const char *s)
{
	unsigned long h=0;
	const char *p;
	for(p = s; *p ; p ++) 
		h = ( h << 5 ) - h + *p;
  return h;
}

//void* CResFile::ReadToStack(void *hRecord)
void* CResFile::ReadToStack(const char *fName)
{
/*	int len = GetDecompressedSize(hRecord);
	if(len>=0)
	{
		void* p = SMemory->StackMalloc(len);
		if(NULL != p)
		{
			if(Read(hRecord, p, len))
				return p;
			SMemory->StackFree(p);
		}
	}
	return NULL;
*/
	CFile file;

	if( file.Open(fName, CFile::modeRead | CFile::shareDenyWrite) )
	{
		int len = file.GetLength();
		if( len>0 )
		{
			void *p = SMemory->StackMalloc(len);
			if( p != NULL )
			{
//				if(Read(file, p, len))
				if(file.Read(p, len) == len)
				{
					FLength = len;
					return p;
				}
				else
					SMemory->StackFree(p);
			}
		}
	}

	return NULL;
}

int CResFile::LoadFileToStack(const char *fName, void **pData)
{
	*pData = NULL;
/*	void *h = FindRecord(fName);
	SYS_ASSERT(NULL != h);
	if(NULL == h)
		return -1;
*/
//	void *p = ReadToStack(h);
	void *p = ReadToStack(fName);
	if(p)
	{
//		int size = GetDecompressedSize(h);
//		if(size >= 0)
		{
			*pData = p;
			return FLength;// read to stack ok
		}
//		SMemory->StackFree(NULL);
	}
	return -1;
}

// Size after compression
int CResFile::GetRecordSize(void *hRecord)
{
	
	PakEntry *p = (PakEntry*)hRecord;
	SYS_ASSERT(p != NULL);
	if(NULL == p)
		return -1;
	return p->len;

	/*
	int iRet = -1;
	PakEntry *p = (PakEntry*)hRecord;
	struct lzo *lzo;
	
	//read to temp buf
	lzo = (struct lzo*)SMemory->StackMalloc(sizeof(struct lzo));
	if(NULL == lzo)
		return -1;
	if(SUCCESS != IFILE_Seek((IFile*)m_handle, _SEEK_START, (p->start<<2)))
	{
		SMemory->StackFree(NULL);
		return -1;
	}
	if(IFILE_Read((IFile*)m_handle, lzo, sizeof(struct lzo)) != sizeof(struct lzo)){
		SMemory->StackFree(NULL);
		return -1;
	}
	//len after compress
	iRet = lzo->fileLen;
	SMemory->StackFree(NULL);
	return iRet;*/
}

// Size before compression
int CResFile::GetDecompressedSize(void *hRecord)
{
	int iRet = -1;
	PakEntry *p = (PakEntry*)hRecord;
	struct lzo *lzo;

	//read to temp buf
	lzo = (struct lzo*)SMemory->StackMalloc(sizeof(struct lzo));
	if(NULL == lzo)
		return -1;
//	if(SUCCESS != IFILE_Seek((IFile*)m_handle, _SEEK_START, (p->start<<2)))
	if( !m_handle.Seek((p->start<<2), CFile::begin ))
	{
		SMemory->StackFree(NULL);
		return -1;
	}
//	if(IFILE_Read((IFile*)m_handle, lzo, sizeof(struct lzo)) != sizeof(struct lzo)){
	if(m_handle.Read(lzo, sizeof(struct lzo)) != sizeof(struct lzo)){
		SMemory->StackFree(NULL);
		return -1;
	}
	//len after decompress
	iRet = lzo->uncompLen;
	SMemory->StackFree(NULL);
	return iRet;
}

void* CResFile::ReadBMPToHeap(void *hRecord, bool bGlobal)
{
	int len = GetDecompressedSize(hRecord);
	if(len>=0)
	{
		void* p = SMemory->StackMalloc(len);
		SYS_ASSERT(NULL != p);
		if(NULL == p)
			return NULL;
		if(Read(hRecord, p, len))
		{
			GFXBMP *pBMPHeader;
			if(bGlobal)
				pBMPHeader = (GFXBMP*)SMemory->GlobalMalloc(sizeof(GFXBMP));
			else
				pBMPHeader = (GFXBMP*)SMemory->HeapMalloc(sizeof(GFXBMP));
			SYS_ASSERT(NULL != pBMPHeader);
			CSimpleMemory::Fill(pBMPHeader, 0, sizeof(GFXBMP));
#ifdef BREW11
			MEMCPY(pBMPHeader, p, sizeof(GFXBMP) - 4 - 4);
			int n = len - (sizeof(GFXBMP) - 4 - 4);
#else
			MEMCPY(pBMPHeader, p, sizeof(GFXBMP) - 4);
			int n = len - sizeof(GFXBMP) + 4;
#endif
			if(bGlobal)
				pBMPHeader->pData = (unsigned char*)SMemory->GlobalMalloc(n);
			else
				pBMPHeader->pData = (unsigned char*)SMemory->HeapMalloc(n);
			SYS_ASSERT(NULL != pBMPHeader->pData);
#ifdef BREW11
			MEMCPY(pBMPHeader->pData, (unsigned char*)p + sizeof(GFXBMP) - 4 - 4, n);
#else
			MEMCPY(pBMPHeader->pData, (unsigned char*)p + sizeof(GFXBMP) - 4, n);
#endif

			SMemory->StackFree(p);
			return pBMPHeader;
		}
		SMemory->StackFree(p);
	}
	return NULL;
}

bool CResFile::Read(void *hRecord, void *pBuf, int len, int ofs)
//bool CResFile::Read(CFile file, void *pBuf, int len, int ofs)
{
	struct PakEntry *p = (struct PakEntry*)hRecord;

	struct lzo *lzo;

	if(len == -1) 
		return false;		
	int iCompressedSize = GetRecordSize(hRecord);
	SYS_ASSERT( iCompressedSize >= 0);
	if(iCompressedSize < 0)
		return false;
	//read to temp buf
	lzo = (struct lzo*)SMemory->StackMalloc(iCompressedSize/*len*/);
	SYS_ASSERT(NULL != lzo);
	if(NULL == lzo)
		return false;
//	if(SUCCESS != IFILE_Seek((IFile*)m_handle, _SEEK_START, (p->start<<2)+ ofs))
	if( !m_handle.Seek((p->start<<2)+ ofs, CFile::begin ))
	{
		SMemory->StackFree(NULL);
		return false;
	}
	
//	if( IFILE_Read((IFile*)m_handle, lzo, iCompressedSize) != iCompressedSize)
	if(m_handle.Read(lzo, iCompressedSize) != iCompressedSize)
	{
		SMemory->StackFree(NULL);
		return false;
	}
	SYS_ASSERT(lzo->magic == 'lzod');

	//decompress
#define zbufSize  180000
	void *buf1 = SMemory->StackMalloc(zbufSize);
	SYS_ASSERT(NULL != buf1);
	if(NULL == buf1)
	{
		SMemory->StackFree(NULL);
		return false;
	}
	void *buf2 = SMemory->StackMalloc(zbufSize);
	SYS_ASSERT(NULL != buf2);
	if(NULL == buf2)
	{
		SMemory->StackFree(NULL);
		SMemory->StackFree(NULL);
		return false;
	}
	m_pZlib->initZlibTempBuff( buf1, zbufSize, buf2, zbufSize);

	int out_len = lzo->uncompLen;
	uncompress(	(unsigned char*)m_pZlib,
			(Bytef*)		pBuf,
			(uLongf*)		&out_len,
			(const Bytef*)	lzo->comp,
			(uLong)			lzo->compLen);
	m_pZlib->freeZlibTempBuff();

	SMemory->StackFree(NULL);
	SMemory->StackFree(NULL);
	SMemory->StackFree(NULL);

	return true;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -