コード例 #1
0
ファイル: LuaRemoteDebug.cpp プロジェクト: aronarts/FireNET
void CLuaRemoteDebug::ReceiveFileContentsRequest(CSerializationHelper &buffer)
{
	const char* fileName = buffer.ReadString();
	ICryPak* pCryPak = gEnv->pCryPak;
	FILE* pFile = pCryPak->FOpen(fileName + 1, "rb");
	if (pFile != NULL)
	{
		m_sendBuffer.Write((char)ePT_FileContents);
		m_sendBuffer.WriteString(fileName);

		// Get file length
		pCryPak->FSeek(pFile, 0, SEEK_END);
		uint32 length = (uint32)pCryPak->FTell(pFile);
		pCryPak->FSeek(pFile, 0, SEEK_SET);

		m_sendBuffer.Write(length);

		const int CHUNK_BUF_SIZE = 1024;
		char buf[CHUNK_BUF_SIZE];
		size_t lenRead;

		while (!pCryPak->FEof(pFile))
		{
			lenRead = pCryPak->FRead(buf, CHUNK_BUF_SIZE, pFile);
			m_sendBuffer.WriteBuffer(buf, (int)lenRead);
		}

		SendBuffer();
	}
	else
	{
		assert(false);
	}
}
コード例 #2
0
static bool ModInfo_LoadFromFile(ModInfo* pMod, const char* pFilename)
{
	if (!pMod)
		return false;

	if (!gEnv || !gEnv->pCryPak)
	{
		assert(0);
		return false;
	}

	ICryPak* pCryPak = gEnv->pCryPak;

	FILE* f = pCryPak->FOpen(pFilename, "rb", ICryPak::FOPEN_ONDISK);
	if (!f)
		return false;

	pCryPak->FSeek(f, 0, SEEK_END);
	const size_t fileSize = pCryPak->FTell(f);
	pCryPak->FSeek(f, 0, SEEK_SET);
	if (fileSize == 0)
	{
		pCryPak->FClose(f);
		return false;
	}

	std::vector<char> buffer;
	buffer.resize(fileSize);
	if (pCryPak->FRead(&buffer[0], fileSize, f) != fileSize)
	{
		pCryPak->FClose(f);
		return false;
	}
	pCryPak->FClose(f);
	
	std::auto_ptr<IXmlParser> pParser(GetISystem()->GetXmlUtils()->CreateXmlParser());
	XmlNodeRef pRoot = pParser->ParseBuffer(&buffer[0], buffer.size(), true);
	if (!pRoot)
		return false;

	if (!ModInfo_LoadFromXML(pMod, pRoot))
		return false;

	return true;
}
コード例 #3
0
bool GetFileHash(const char *pPath, uint32 &outResult)
{
	if (!gEnv || !gEnv->pCryPak)
	{
		assert(0);
		return false;
	}

	ICryPak* pCryPak = gEnv->pCryPak;

	// Try to open file on disk and hash it (using algorithm taken from CryHashStringId)
	FILE *file = pCryPak->FOpen( pPath,"rb",ICryPak::FOPEN_ONDISK );
	if (file)
	{
		pCryPak->FSeek( file,0,SEEK_END );
		unsigned int nFileSize = pCryPak->FTell(file);
		pCryPak->FSeek( file,0,SEEK_SET );

		outResult = FILE_HASH_SEED;

		unsigned char *pBuf = (unsigned char*)malloc( FILE_CHECK_BUFFER_SIZE );
		if (!pBuf)
		{
			pCryPak->FClose(file);
			return false;
		}

		while (nFileSize)
		{
			unsigned int fetchLength=min(nFileSize,(unsigned int)FILE_CHECK_BUFFER_SIZE);

			unsigned int result = pCryPak->FRead( pBuf,fetchLength,file );
			if (result != fetchLength)
			{
				free( pBuf );
				pCryPak->FClose(file);
				return false;
			}
			
			const char *pChar = (const char*)pBuf;
			for (unsigned int i = 0; i < fetchLength; ++ i, ++ pChar)
			{
				outResult += *pChar;
				outResult += (outResult << 10);
				outResult ^= (outResult >> 6);
			}

			nFileSize-=fetchLength;
		}

		outResult += (outResult << 3);
		outResult ^= (outResult >> 11);
		outResult += (outResult << 15);

		free( pBuf );
		pCryPak->FClose(file);

		return true;
	}

	return false;
}