aboutsummaryrefslogtreecommitdiff
path: root/dep/StormLib/src/SFileExtractFile.cpp
diff options
context:
space:
mode:
authorShauren <shauren.trinity@gmail.com>2013-03-15 20:09:48 +0100
committerShauren <shauren.trinity@gmail.com>2013-03-15 20:09:48 +0100
commite58e05d9d5da894447b81ded17c3b8fd9f4820a8 (patch)
treee41b9ed702da6dc1063e8bddd0f270c2d47f0d7b /dep/StormLib/src/SFileExtractFile.cpp
parent51b9e6d2c947d2151af09d7a25af45ff75b0d530 (diff)
parent11846f5990f5af421ff2fc087925245f61b4ac84 (diff)
Merge branch '4.3.4' of github.com:TrinityCore/TrinityCore into 4.3.4
Diffstat (limited to 'dep/StormLib/src/SFileExtractFile.cpp')
-rw-r--r--dep/StormLib/src/SFileExtractFile.cpp67
1 files changed, 67 insertions, 0 deletions
diff --git a/dep/StormLib/src/SFileExtractFile.cpp b/dep/StormLib/src/SFileExtractFile.cpp
new file mode 100644
index 00000000000..c8053ed4e62
--- /dev/null
+++ b/dep/StormLib/src/SFileExtractFile.cpp
@@ -0,0 +1,67 @@
+/*****************************************************************************/
+/* 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;
+ int nError = ERROR_SUCCESS;
+
+ // Open the MPQ file
+ if(nError == ERROR_SUCCESS)
+ {
+ if(!SFileOpenFileEx(hMpq, szToExtract, dwSearchScope, &hMpqFile))
+ nError = GetLastError();
+ }
+
+ // Create the local file
+ if(nError == ERROR_SUCCESS)
+ {
+ pLocalFile = FileStream_CreateFile(szExtracted, STREAM_PROVIDER_LINEAR | BASE_PROVIDER_FILE);
+ if(pLocalFile == NULL)
+ nError = GetLastError();
+ }
+
+ // Copy the file's content
+ if(nError == ERROR_SUCCESS)
+ {
+ char szBuffer[0x1000];
+ DWORD dwTransferred;
+
+ for(;;)
+ {
+ // dwTransferred is only set to nonzero if something has been read.
+ // nError can be ERROR_SUCCESS or ERROR_HANDLE_EOF
+ if(!SFileReadFile(hMpqFile, szBuffer, sizeof(szBuffer), &dwTransferred, NULL))
+ nError = GetLastError();
+ if(nError == ERROR_HANDLE_EOF)
+ nError = ERROR_SUCCESS;
+ if(dwTransferred == 0)
+ break;
+
+ // If something has been actually read, write it
+ if(!FileStream_Write(pLocalFile, NULL, szBuffer, dwTransferred))
+ nError = GetLastError();
+ }
+ }
+
+ // Close the files
+ if(hMpqFile != NULL)
+ SFileCloseFile(hMpqFile);
+ if(pLocalFile != NULL)
+ FileStream_Close(pLocalFile);
+ if(nError != ERROR_SUCCESS)
+ SetLastError(nError);
+ return (nError == ERROR_SUCCESS);
+}