aboutsummaryrefslogtreecommitdiff
path: root/src/tools/extractor_common
diff options
context:
space:
mode:
authorShauren <shauren.trinity@gmail.com>2019-06-08 13:19:48 +0200
committerShauren <shauren.trinity@gmail.com>2019-06-08 17:10:00 +0200
commitbcaaa3d6f69cd60b25a25fc69904f9a8ece24250 (patch)
tree585dac52b621b55b5f380a8cdc6725b4b2df6129 /src/tools/extractor_common
parentfc330fd8ff0115804d9c4b53a1f810c00dd63de9 (diff)
Core/DataStores: Updated db2 structures to 8.1.5
Diffstat (limited to 'src/tools/extractor_common')
-rw-r--r--src/tools/extractor_common/CascHandles.cpp25
-rw-r--r--src/tools/extractor_common/CascHandles.h2
-rw-r--r--src/tools/extractor_common/DB2CascFileSource.cpp19
-rw-r--r--src/tools/extractor_common/DB2CascFileSource.h4
-rw-r--r--src/tools/extractor_common/ExtractorDB2LoadInfo.h16
5 files changed, 55 insertions, 11 deletions
diff --git a/src/tools/extractor_common/CascHandles.cpp b/src/tools/extractor_common/CascHandles.cpp
index 9487b3de093..eb84a084a11 100644
--- a/src/tools/extractor_common/CascHandles.cpp
+++ b/src/tools/extractor_common/CascHandles.cpp
@@ -38,6 +38,7 @@ char const* CASC::HumanReadableCASCError(DWORD error)
case ERROR_INVALID_HANDLE: return "INVALID_HANDLE";
case ERROR_ACCESS_DENIED: return "ACCESS_DENIED";
case ERROR_FILE_NOT_FOUND: return "FILE_NOT_FOUND";
+ case ERROR_FILE_ENCRYPTED: return "FILE_ENCRYPTED";
default: return "UNKNOWN";
}
}
@@ -98,10 +99,15 @@ DWORD CASC::GetInstalledLocalesMask(StorageHandle const& storage)
return 0;
}
+bool CASC::HasTactKey(StorageHandle const& storage, ULONGLONG keyLookup)
+{
+ return CascFindEncryptionKey(storage.get(), keyLookup) != nullptr;
+}
+
CASC::FileHandle CASC::OpenFile(StorageHandle const& storage, char const* fileName, DWORD localeMask, bool printErrors /*= false*/)
{
HANDLE handle = nullptr;
- if (!::CascOpenFile(storage.get(), fileName, localeMask, 0, &handle))
+ if (!::CascOpenFile(storage.get(), fileName, localeMask, CASC_OPEN_BY_NAME, &handle))
{
DWORD lastError = GetLastError(); // support checking error set by *Open* call, not the next *Close*
if (printErrors)
@@ -115,6 +121,23 @@ CASC::FileHandle CASC::OpenFile(StorageHandle const& storage, char const* fileNa
return FileHandle(handle);
}
+CASC::FileHandle CASC::OpenFile(StorageHandle const& storage, DWORD fileDataId, DWORD localeMask, bool printErrors /*= false*/)
+{
+ HANDLE handle = nullptr;
+ if (!::CascOpenFile(storage.get(), CASC_FILE_DATA_ID(fileDataId), localeMask, CASC_OPEN_BY_FILEID, &handle))
+ {
+ DWORD lastError = GetLastError(); // support checking error set by *Open* call, not the next *Close*
+ if (printErrors)
+ fprintf(stderr, "Failed to open 'FileDataId %u' in CASC storage: %s\n", fileDataId, HumanReadableCASCError(lastError));
+
+ CascCloseFile(handle);
+ SetLastError(lastError);
+ return FileHandle();
+ }
+
+ return FileHandle(handle);
+}
+
DWORD CASC::GetFileSize(FileHandle const& file, PDWORD fileSizeHigh)
{
return ::CascGetFileSize(file.get(), fileSizeHigh);
diff --git a/src/tools/extractor_common/CascHandles.h b/src/tools/extractor_common/CascHandles.h
index c191cc25045..9feafdbf4af 100644
--- a/src/tools/extractor_common/CascHandles.h
+++ b/src/tools/extractor_common/CascHandles.h
@@ -51,8 +51,10 @@ namespace CASC
StorageHandle OpenStorage(boost::filesystem::path const& path, DWORD localeMask);
DWORD GetBuildNumber(StorageHandle const& storage);
DWORD GetInstalledLocalesMask(StorageHandle const& storage);
+ bool HasTactKey(StorageHandle const& storage, ULONGLONG keyLookup);
FileHandle OpenFile(StorageHandle const& storage, char const* fileName, DWORD localeMask, bool printErrors = false);
+ FileHandle OpenFile(StorageHandle const& storage, DWORD fileDataId, DWORD localeMask, bool printErrors = false);
DWORD GetFileSize(FileHandle const& file, PDWORD fileSizeHigh);
DWORD GetFilePointer(FileHandle const& file);
bool SetFilePointer(FileHandle const& file, LONGLONG position);
diff --git a/src/tools/extractor_common/DB2CascFileSource.cpp b/src/tools/extractor_common/DB2CascFileSource.cpp
index c2478b21def..58f8567dda3 100644
--- a/src/tools/extractor_common/DB2CascFileSource.cpp
+++ b/src/tools/extractor_common/DB2CascFileSource.cpp
@@ -16,14 +16,21 @@
*/
#include "DB2CascFileSource.h"
+#include "StringFormat.h"
#include <CascLib.h>
-DB2CascFileSource::DB2CascFileSource(CASC::StorageHandle const& storage, std::string fileName)
+DB2CascFileSource::DB2CascFileSource(CASC::StorageHandle const& storage, std::string fileName, bool printErrors /*= true*/)
{
- _fileHandle = CASC::OpenFile(storage, fileName.c_str(), CASC_LOCALE_NONE, true);
+ _fileHandle = CASC::OpenFile(storage, fileName.c_str(), CASC_LOCALE_NONE, printErrors);
_fileName = std::move(fileName);
}
+DB2CascFileSource::DB2CascFileSource(CASC::StorageHandle const& storage, uint32 fileDataId, bool printErrors /*= true*/)
+{
+ _fileHandle = CASC::OpenFile(storage, fileDataId, CASC_LOCALE_NONE, printErrors);
+ _fileName = Trinity::StringFormat("FileDataId: %u", fileDataId);
+}
+
bool DB2CascFileSource::IsOpen() const
{
return _fileHandle != nullptr;
@@ -50,9 +57,17 @@ std::size_t DB2CascFileSource::GetFileSize() const
DWORD sizeLow = 0;
DWORD sizeHigh = 0;
sizeLow = CASC::GetFileSize(_fileHandle, &sizeHigh);
+ if (sizeLow == CASC_INVALID_SIZE)
+ return std::size_t(-1);
+
return std::size_t(uint64(sizeLow) | (uint64(sizeHigh) << 32));
}
+CASC::FileHandle const& DB2CascFileSource::GetHandle() const
+{
+ return _fileHandle;
+}
+
char const* DB2CascFileSource::GetFileName() const
{
return _fileName.c_str();
diff --git a/src/tools/extractor_common/DB2CascFileSource.h b/src/tools/extractor_common/DB2CascFileSource.h
index bfe580714be..80559ff8d41 100644
--- a/src/tools/extractor_common/DB2CascFileSource.h
+++ b/src/tools/extractor_common/DB2CascFileSource.h
@@ -24,12 +24,14 @@
struct DB2CascFileSource : public DB2FileSource
{
- DB2CascFileSource(CASC::StorageHandle const& storage, std::string fileName);
+ DB2CascFileSource(CASC::StorageHandle const& storage, std::string fileName, bool printErrors = true);
+ DB2CascFileSource(CASC::StorageHandle const& storage, uint32 fileDataId, bool printErrors = true);
bool IsOpen() const override;
bool Read(void* buffer, std::size_t numBytes) override;
std::size_t GetPosition() const override;
bool SetPosition(std::size_t position) override;
std::size_t GetFileSize() const override;
+ CASC::FileHandle const& GetHandle() const;
char const* GetFileName() const override;
private:
diff --git a/src/tools/extractor_common/ExtractorDB2LoadInfo.h b/src/tools/extractor_common/ExtractorDB2LoadInfo.h
index 6ee6a9c6355..0f4833af253 100644
--- a/src/tools/extractor_common/ExtractorDB2LoadInfo.h
+++ b/src/tools/extractor_common/ExtractorDB2LoadInfo.h
@@ -43,7 +43,7 @@ struct CinematicCameraLoadInfo
{ FT_FLOAT, 1, true },
{ FT_INT, 1, false },
};
- static DB2Meta meta(-1, 4, 0x20C5E540, fields, -1);
+ static DB2Meta meta(1294214, -1, 4, 0x20C5E540, fields, -1);
static DB2FileLoadInfo const loadInfo(&loadedFields[0], std::extent<decltype(loadedFields)>::value, &meta);
return &loadInfo;
}
@@ -75,7 +75,7 @@ struct GameobjectDisplayInfoLoadInfo
{ FT_FLOAT, 1, true },
{ FT_FLOAT, 1, true },
};
- static DB2Meta meta(-1, 5, 0x7A816799, fields, -1);
+ static DB2Meta meta(1266277, -1, 5, 0x7A816799, fields, -1);
static DB2FileLoadInfo const loadInfo(&loadedFields[0], std::extent<decltype(loadedFields)>::value, &meta);
return &loadInfo;
}
@@ -96,7 +96,7 @@ struct LiquidMaterialLoadInfo
{ FT_BYTE, 1, true },
{ FT_BYTE, 1, true },
};
- static DB2Meta meta(-1, 2, 0x6A7287A2, fields, -1);
+ static DB2Meta meta(1132538, -1, 2, 0x6A7287A2, fields, -1);
static DB2FileLoadInfo const loadInfo(&loadedFields[0], std::extent<decltype(loadedFields)>::value, &meta);
return &loadInfo;
}
@@ -123,7 +123,7 @@ struct LiquidObjectLoadInfo
{ FT_BYTE, 1, false },
{ FT_BYTE, 1, false },
};
- static DB2Meta meta(-1, 5, 0x7AF380AA, fields, -1);
+ static DB2Meta meta(1308058, -1, 5, 0x7AF380AA, fields, -1);
static DB2FileLoadInfo const loadInfo(&loadedFields[0], std::extent<decltype(loadedFields)>::value, &meta);
return &loadInfo;
}
@@ -216,7 +216,7 @@ struct LiquidTypeLoadInfo
{ FT_INT, 4, false },
{ FT_FLOAT, 4, true },
};
- static DB2Meta meta(-1, 21, 0x29F8C65E, fields, -1);
+ static DB2Meta meta(1371380, -1, 21, 0x29F8C65E, fields, -1);
static DB2FileLoadInfo const loadInfo(&loadedFields[0], std::extent<decltype(loadedFields)>::value, &meta);
return &loadInfo;
}
@@ -251,10 +251,11 @@ struct MapLoadInfo
{ false, FT_BYTE, "MaxPlayers" },
{ true, FT_SHORT, "WindSettingsID" },
{ true, FT_INT, "ZmpFileDataID" },
+ { true, FT_INT, "WdtFileDataID" },
{ true, FT_INT, "Flags1" },
{ true, FT_INT, "Flags2" },
};
- static DB2MetaField const fields[22] =
+ static DB2MetaField const fields[23] =
{
{ FT_STRING_NOT_LOCALIZED, 1, true },
{ FT_STRING, 1, true },
@@ -277,9 +278,10 @@ struct MapLoadInfo
{ FT_BYTE, 1, false },
{ FT_SHORT, 1, true },
{ FT_INT, 1, true },
+ { FT_INT, 1, true },
{ FT_INT, 2, true },
};
- static DB2Meta meta(-1, 22, 0x503A3E58, fields, -1);
+ static DB2Meta meta(1349477, -1, 23, 0xB290D217, fields, -1);
static DB2FileLoadInfo const loadInfo(&loadedFields[0], std::extent<decltype(loadedFields)>::value, &meta);
return &loadInfo;
}