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); } }
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; }
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; }