aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--StormLib.vcxproj.filters6
-rw-r--r--StormLib_dll.vcxproj.filters6
-rw-r--r--StormLib_test.vcxproj4
-rw-r--r--StormLib_test.vcxproj.filters6
-rw-r--r--src/SFileAddFile.cpp2
-rw-r--r--test/Test.cpp138
6 files changed, 151 insertions, 11 deletions
diff --git a/StormLib.vcxproj.filters b/StormLib.vcxproj.filters
index 4b59186..5dc3325 100644
--- a/StormLib.vcxproj.filters
+++ b/StormLib.vcxproj.filters
@@ -742,9 +742,6 @@
<ClCompile Include="src\zlib\adler32.c">
<Filter>Source Files\zlib</Filter>
</ClCompile>
- <ClCompile Include="src\zlib\compress2.c">
- <Filter>Source Files\zlib</Filter>
- </ClCompile>
<ClCompile Include="src\zlib\crc32.c">
<Filter>Source Files\zlib</Filter>
</ClCompile>
@@ -769,5 +766,8 @@
<ClCompile Include="src\jenkins\lookup3.c">
<Filter>Source Files\jenkins</Filter>
</ClCompile>
+ <ClCompile Include="src\zlib\compress.c">
+ <Filter>Source Files\zlib</Filter>
+ </ClCompile>
</ItemGroup>
</Project> \ No newline at end of file
diff --git a/StormLib_dll.vcxproj.filters b/StormLib_dll.vcxproj.filters
index e2cea5a..49e414b 100644
--- a/StormLib_dll.vcxproj.filters
+++ b/StormLib_dll.vcxproj.filters
@@ -745,9 +745,6 @@
<ClCompile Include="src\zlib\adler32.c">
<Filter>Source Files\zlib</Filter>
</ClCompile>
- <ClCompile Include="src\zlib\compress2.c">
- <Filter>Source Files\zlib</Filter>
- </ClCompile>
<ClCompile Include="src\zlib\crc32.c">
<Filter>Source Files\zlib</Filter>
</ClCompile>
@@ -772,6 +769,9 @@
<ClCompile Include="src\jenkins\lookup3.c">
<Filter>Source Files\jenkins</Filter>
</ClCompile>
+ <ClCompile Include="src\zlib\compress.c">
+ <Filter>Source Files\zlib</Filter>
+ </ClCompile>
</ItemGroup>
<ItemGroup>
<None Include="stormlib_dll\StormLib.def">
diff --git a/StormLib_test.vcxproj b/StormLib_test.vcxproj
index 26ae82f..514621f 100644
--- a/StormLib_test.vcxproj
+++ b/StormLib_test.vcxproj
@@ -98,6 +98,7 @@
<WarningLevel>Level1</WarningLevel>
<DebugInformationFormat>EditAndContinue</DebugInformationFormat>
<CompileAs>Default</CompileAs>
+ <ExceptionHandling>false</ExceptionHandling>
</ClCompile>
<Link>
<GenerateDebugInformation>true</GenerateDebugInformation>
@@ -105,6 +106,7 @@
<RandomizedBaseAddress>false</RandomizedBaseAddress>
<DataExecutionPrevention />
<TargetMachine>MachineX86</TargetMachine>
+ <ImageHasSafeExceptionHandlers>false</ImageHasSafeExceptionHandlers>
</Link>
<Manifest>
<VerboseOutput>false</VerboseOutput>
@@ -142,6 +144,7 @@
<PrecompiledHeader />
<WarningLevel>Level1</WarningLevel>
<DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
+ <ExceptionHandling>false</ExceptionHandling>
</ClCompile>
<Link>
<GenerateDebugInformation>true</GenerateDebugInformation>
@@ -151,6 +154,7 @@
<RandomizedBaseAddress>false</RandomizedBaseAddress>
<DataExecutionPrevention />
<TargetMachine>MachineX86</TargetMachine>
+ <ImageHasSafeExceptionHandlers>false</ImageHasSafeExceptionHandlers>
</Link>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
diff --git a/StormLib_test.vcxproj.filters b/StormLib_test.vcxproj.filters
index 3d0e2c3..21199d7 100644
--- a/StormLib_test.vcxproj.filters
+++ b/StormLib_test.vcxproj.filters
@@ -751,9 +751,6 @@
<ClCompile Include="src\zlib\adler32.c">
<Filter>Source Files\zlib</Filter>
</ClCompile>
- <ClCompile Include="src\zlib\compress2.c">
- <Filter>Source Files\zlib</Filter>
- </ClCompile>
<ClCompile Include="src\zlib\crc32.c">
<Filter>Source Files\zlib</Filter>
</ClCompile>
@@ -778,5 +775,8 @@
<ClCompile Include="src\jenkins\lookup3.c">
<Filter>Source Files\jenkins</Filter>
</ClCompile>
+ <ClCompile Include="src\zlib\compress.c">
+ <Filter>Source Files\zlib</Filter>
+ </ClCompile>
</ItemGroup>
</Project> \ No newline at end of file
diff --git a/src/SFileAddFile.cpp b/src/SFileAddFile.cpp
index 57bae82..36ffe1e 100644
--- a/src/SFileAddFile.cpp
+++ b/src/SFileAddFile.cpp
@@ -830,7 +830,7 @@ bool WINAPI SFileAddFileEx(
int nError = ERROR_SUCCESS;
// Check parameters
- if(szFileName == NULL || *szFileName == 0)
+ if(hMpq == NULL || szFileName == NULL || *szFileName == 0)
nError = ERROR_INVALID_PARAMETER;
// Open added file
diff --git a/test/Test.cpp b/test/Test.cpp
index c584578..a8708f9 100644
--- a/test/Test.cpp
+++ b/test/Test.cpp
@@ -1222,6 +1222,139 @@ static int TestArchiveOpenAndClose(const TCHAR * szMpqName)
return nError;
}
+static int TestArchiveOpenAndClose_VORTEX(const TCHAR * szMpqName)
+{
+ const char * szFileName1 = "D:\\!GIT\\StormLib\\bin\\MPQs\\sc2.txt";
+// const char * szFileName2 = "items\\map\\mapz_deleted.cel";
+ TMPQArchive * ha = NULL;
+ HANDLE hFile1 = NULL;
+// HANDLE hFile2 = NULL;
+ HANDLE hMpq = NULL;
+ HANDLE hMpq2 = NULL;
+ DWORD dwHashTableSize = 0;
+ const TCHAR * szMpqCopyName = MAKE_PATH("newmpq.mpq");
+ int nError = ERROR_SUCCESS;
+ TCHAR szLocalFile[MAX_PATH];
+
+ if(nError == ERROR_SUCCESS)
+ {
+ _tprintf(_T("Opening archive %s ...\n"), szMpqName);
+ if(!SFileOpenArchive(szMpqName, 0, MPQ_OPEN_READ_ONLY, &hMpq))
+ nError = GetLastError();
+ ha = (TMPQArchive *)hMpq;
+ }
+
+ if (nError == ERROR_SUCCESS)
+ {
+ _tprintf(_T("Creating new archive %s ... \n"), szMpqCopyName);
+ SFileGetFileInfo(hMpq, SFILE_INFO_HASH_TABLE_SIZE, &dwHashTableSize, 4, NULL);
+ _tprintf(_T("Hash table size: %d \n"), dwHashTableSize);
+ SFileCreateArchive(szMpqCopyName, MPQ_CREATE_ARCHIVE_V4 | MPQ_CREATE_ATTRIBUTES, dwHashTableSize, &hMpq2);
+ }
+
+ if(nError == ERROR_SUCCESS)
+ {
+ printf("Adding sc2.txt...\n");
+ SFileAddListFile(hMpq2, szFileName1);
+ }
+
+ // Copy all files from one archive to another
+ if(nError == ERROR_SUCCESS)
+ {
+ SFILE_FIND_DATA sf;
+ HANDLE hFind = SFileFindFirstFile(hMpq, "*", &sf, szFileName1);
+ bool bResult = true;
+
+ _tprintf(_T("Scanning files ...\n"));
+
+ if(hFind != NULL)
+ {
+ while(bResult)
+ {
+ if(strcmp(sf.cFileName, LISTFILE_NAME) && strcmp(sf.cFileName, ATTRIBUTES_NAME))
+ {
+ SFileSetLocale(sf.lcLocale);
+
+ // Create the local file name
+ MergeLocalPath(szLocalFile, szWorkDir, sf.szPlainName);
+ if(SFileExtractFile(hMpq, sf.cFileName, szLocalFile, SFILE_OPEN_FROM_MPQ))
+ {
+ //printf("Extracting %s ... OK\n", sf.cFileName);
+ if(!SFileAddFile(hMpq2, szLocalFile, sf.cFileName, sf.dwFileFlags))
+ {
+ nError = GetLastError();
+ printf("Adding %s ... Failed\n\n", sf.cFileName);
+ _tremove(szLocalFile);
+ break;
+ }
+ else
+ {
+ //printf("Adding %s ... OK\n", sf.cFileName);
+ }
+ }
+ else
+ {
+ printf("Extracting %s ... Failed\n", sf.cFileName);
+ }
+
+ // Delete the added file
+ _tremove(szLocalFile);
+ }
+
+ // Find the next file
+ bResult = SFileFindNextFile(hFind, &sf);
+ }
+
+ // Close the search handle
+ SFileFindClose(hFind);
+ printf("\n");
+ }
+ }
+
+ printf("DONE!\n");
+
+
+ // Verify the raw data in the archive
+ /*if(nError == ERROR_SUCCESS)
+ {
+ // Verify the archive
+ SFileVerifyRawData(hMpq, SFILE_VERIFY_FILE, szFileName1);
+
+ // Try to open a file
+ if(!SFileOpenFileEx(hMpq, szFileName1, SFILE_OPEN_FROM_MPQ, &hFile1))
+ {
+ nError = GetLastError();
+ printf("%s - file not found in the MPQ\n", szFileName1);
+ }
+ }
+
+ // Dummy read from the file
+ if(nError == ERROR_SUCCESS)
+ {
+ DWORD dwBytesRead = 0;
+ BYTE Buffer[0x1000];
+
+ SFileSetFilePointer(hFile1, 0x1000, NULL, FILE_BEGIN);
+ SFileReadFile(hFile1, Buffer, sizeof(Buffer), &dwBytesRead, NULL);
+ }
+
+ // Verify the MPQ listfile
+ if(nError == ERROR_SUCCESS)
+ {
+ SFileExtractFile(hMpq, szFileName1, _T("D:\\!GIT\\StormLib\\bin\\extracted.wav"), 0);
+ PlaySound(_T("D:\\!GIT\\StormLib\\bin\\extracted.wav"), NULL, SND_FILENAME);
+ }*/
+
+ if(hFile1 != NULL)
+ SFileCloseFile(hFile1);
+ if(hMpq != NULL)
+ SFileCloseArchive(hMpq);
+ if(hMpq2 != NULL)
+ SFileCloseArchive(hMpq2);
+ return nError;
+}
+
+
static int TestFindFiles(const TCHAR * szMpqName)
{
TMPQFile * hf;
@@ -2213,8 +2346,11 @@ int main(void)
// nError = TestSectorCompress(MPQ_SECTOR_SIZE);
// Test the archive open and close
+// if(nError == ERROR_SUCCESS)
+// nError = TestArchiveOpenAndClose(MAKE_PATH("Base.SC2Assets"));
+
if(nError == ERROR_SUCCESS)
- nError = TestArchiveOpenAndClose(MAKE_PATH("Base.SC2Assets"));
+ nError = TestArchiveOpenAndClose_VORTEX(MAKE_PATH("war3.mpq"));
// if(nError == ERROR_SUCCESS)
// nError = TestFindFiles(MAKE_PATH("2002 - Warcraft III/HumanEd.mpq"));