summaryrefslogtreecommitdiff
path: root/StormLib/src/SFileExtractFile.cpp
diff options
context:
space:
mode:
authorNicholas Estelami <NEstelami@users.noreply.github.com>2022-06-01 16:05:05 -0400
committerNicholas Estelami <NEstelami@users.noreply.github.com>2022-06-01 16:05:05 -0400
commitfc7da35054a8e7a12fb6dd5dfa01082c2b049c63 (patch)
tree578be5f8a8608e45f550e6e7ba9f7128d8d88890 /StormLib/src/SFileExtractFile.cpp
parent6f5ce7d7157d60c22ca7cd43ff576fc54dc50dbc (diff)
Replaced StormLib .lib files with source code.
Some modifications to handle backslashes and forward slashes, along with some optimizations to speed up OTR generation.
Diffstat (limited to 'StormLib/src/SFileExtractFile.cpp')
-rw-r--r--StormLib/src/SFileExtractFile.cpp64
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);
+}