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-14 01:13:18 -0400
commitb83cd172b2a56a2867cac6b4a34400db8bf93d40 (patch)
tree1de08eb2af73e60f99b3b449d5aa647153d66a6e /StormLib/src/SFileExtractFile.cpp
parentb889880cc7aca3833803d56232a03fe1efc4a067 (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);
+}