diff options
| author | Kevin Alexis Contreras <36680385+KiritoDv@users.noreply.github.com> | 2022-06-01 15:12:28 -0500 |
|---|---|---|
| committer | Kevin Alexis Contreras <36680385+KiritoDv@users.noreply.github.com> | 2022-06-01 15:12:28 -0500 |
| commit | 332f8f93fb0b6a2587e6731198fdd40667c25524 (patch) | |
| tree | 820048ea5b6c557e13aac2c7d4426a38971388d7 /StormLib/src/SFileExtractFile.cpp | |
| parent | 0320107fc03bfb17192191ae12f4380d76d850cf (diff) | |
| parent | fc7da35054a8e7a12fb6dd5dfa01082c2b049c63 (diff) | |
Merge branch 'zapd_audio_support' into zelda64
Diffstat (limited to 'StormLib/src/SFileExtractFile.cpp')
| -rw-r--r-- | StormLib/src/SFileExtractFile.cpp | 64 |
1 files changed, 64 insertions, 0 deletions
diff --git a/StormLib/src/SFileExtractFile.cpp b/StormLib/src/SFileExtractFile.cpp new file mode 100644 index 000000000..6b3b76759 --- /dev/null +++ b/StormLib/src/SFileExtractFile.cpp @@ -0,0 +1,64 @@ +/*****************************************************************************/ +/* SFileExtractFile.cpp Copyright (c) Ladislav Zezula 2003 */ +/*---------------------------------------------------------------------------*/ +/* Simple extracting utility */ +/*---------------------------------------------------------------------------*/ +/* Date Ver Who Comment */ +/* -------- ---- --- ------- */ +/* 20.06.03 1.00 Lad The first version of SFileExtractFile.cpp */ +/*****************************************************************************/ + +#define __STORMLIB_SELF__ +#include "StormLib.h" +#include "StormCommon.h" + +bool WINAPI SFileExtractFile(HANDLE hMpq, const char * szToExtract, const TCHAR * szExtracted, DWORD dwSearchScope) +{ + TFileStream * pLocalFile = NULL; + HANDLE hMpqFile = NULL; + DWORD dwErrCode = ERROR_SUCCESS; + + // Open the MPQ file + if(dwErrCode == ERROR_SUCCESS) + { + if(!SFileOpenFileEx(hMpq, szToExtract, dwSearchScope, &hMpqFile)) + dwErrCode = GetLastError(); + } + + // Create the local file + if(dwErrCode == ERROR_SUCCESS) + { + pLocalFile = FileStream_CreateFile(szExtracted, 0); + if(pLocalFile == NULL) + dwErrCode = GetLastError(); + } + + // Copy the file's content + while(dwErrCode == ERROR_SUCCESS) + { + char szBuffer[0x1000]; + DWORD dwTransferred = 0; + + // dwTransferred is only set to nonzero if something has been read. + // dwErrCode can be ERROR_SUCCESS or ERROR_HANDLE_EOF + if(!SFileReadFile(hMpqFile, szBuffer, sizeof(szBuffer), &dwTransferred, NULL)) + dwErrCode = GetLastError(); + if(dwErrCode == ERROR_HANDLE_EOF) + dwErrCode = ERROR_SUCCESS; + if(dwTransferred == 0) + break; + + // If something has been actually read, write it + if(!FileStream_Write(pLocalFile, NULL, szBuffer, dwTransferred)) + dwErrCode = GetLastError(); + } + + // Close the files + if(hMpqFile != NULL) + SFileCloseFile(hMpqFile); + if(pLocalFile != NULL) + FileStream_Close(pLocalFile); + if(dwErrCode != ERROR_SUCCESS) + SetLastError(dwErrCode); + return (dwErrCode == ERROR_SUCCESS); +} |
