MpalHandle RMResUpdate::queryResource(uint32 dwRes) { // If there isn't an update file, return NULL if (!_hFile.isOpen()) return NULL; uint32 i; for (i = 0; i < _numUpd; ++i) if (_infos[i]._dwRes == dwRes) // Found the index break; if (i == _numUpd) // Couldn't find a matching resource, so return NULL return NULL; const ResUpdInfo &info = _infos[i]; byte *cmpBuf = new byte[info._cmpSize]; uint32 dwRead; // Move to the correct offset and read in the compressed data _hFile.seek(info._offset); dwRead = _hFile.read(cmpBuf, info._cmpSize); if (info._cmpSize > dwRead) { // Error occurred reading data, so return NULL delete[] cmpBuf; return NULL; } // Allocate space for the output resource MpalHandle destBuf = globalAllocate(0, info._size); byte *lpDestBuf = (byte *)globalLock(destBuf); uint32 dwSize; // Decompress the data lzo1x_decompress(cmpBuf, info._cmpSize, lpDestBuf, &dwSize); // Delete buffer for compressed data delete [] cmpBuf; // Return the resource globalUnlock(destBuf); return destBuf; }
/** * Destructor */ RMRes::~RMRes() { if (_h != NULL) { globalUnlock(_h); globalFree(_h); } }