mirror of
https://gitlab.com/OpenMW/openmw.git
synced 2025-02-21 09:39:56 +00:00
components/bsa cleanup
This commit is contained in:
parent
43614e2204
commit
d826fbdadf
@ -150,7 +150,7 @@ void BSAFile::readHeader()
|
|||||||
/// Get the index of a given file name, or -1 if not found
|
/// Get the index of a given file name, or -1 if not found
|
||||||
int BSAFile::getIndex(const char *str) const
|
int BSAFile::getIndex(const char *str) const
|
||||||
{
|
{
|
||||||
Lookup::const_iterator it = mLookup.find(str);
|
auto it = mLookup.find(str);
|
||||||
if(it == mLookup.end())
|
if(it == mLookup.end())
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
|
@ -24,7 +24,7 @@
|
|||||||
#ifndef BSA_BSA_FILE_H
|
#ifndef BSA_BSA_FILE_H
|
||||||
#define BSA_BSA_FILE_H
|
#define BSA_BSA_FILE_H
|
||||||
|
|
||||||
#include <stdint.h>
|
#include <cstdint>
|
||||||
#include <string>
|
#include <string>
|
||||||
#include <vector>
|
#include <vector>
|
||||||
#include <map>
|
#include <map>
|
||||||
@ -106,8 +106,7 @@ public:
|
|||||||
: mIsLoaded(false)
|
: mIsLoaded(false)
|
||||||
{ }
|
{ }
|
||||||
|
|
||||||
virtual ~BSAFile()
|
virtual ~BSAFile() = default;
|
||||||
{ }
|
|
||||||
|
|
||||||
/// Open an archive file.
|
/// Open an archive file.
|
||||||
void open(const std::string &file);
|
void open(const std::string &file);
|
||||||
|
@ -36,7 +36,6 @@
|
|||||||
#include <boost/iostreams/filtering_streambuf.hpp>
|
#include <boost/iostreams/filtering_streambuf.hpp>
|
||||||
#include <boost/iostreams/copy.hpp>
|
#include <boost/iostreams/copy.hpp>
|
||||||
#include <boost/iostreams/filter/zlib.hpp>
|
#include <boost/iostreams/filter/zlib.hpp>
|
||||||
#include <boost/iostreams/stream.hpp>
|
|
||||||
#include <boost/iostreams/device/array.hpp>
|
#include <boost/iostreams/device/array.hpp>
|
||||||
#include <components/bsa/memorystream.hpp>
|
#include <components/bsa/memorystream.hpp>
|
||||||
|
|
||||||
@ -103,8 +102,7 @@ CompressedBSAFile::CompressedBSAFile()
|
|||||||
: mCompressedByDefault(false), mEmbeddedFileNames(false)
|
: mCompressedByDefault(false), mEmbeddedFileNames(false)
|
||||||
{ }
|
{ }
|
||||||
|
|
||||||
CompressedBSAFile::~CompressedBSAFile()
|
CompressedBSAFile::~CompressedBSAFile() = default;
|
||||||
{ }
|
|
||||||
|
|
||||||
/// Read header information from the input source
|
/// Read header information from the input source
|
||||||
void CompressedBSAFile::readHeader()
|
void CompressedBSAFile::readHeader()
|
||||||
@ -183,7 +181,7 @@ void CompressedBSAFile::readHeader()
|
|||||||
else
|
else
|
||||||
input.read(reinterpret_cast<char*>(&fr.offset), 4); // not sure purpose of offset
|
input.read(reinterpret_cast<char*>(&fr.offset), 4); // not sure purpose of offset
|
||||||
|
|
||||||
std::map<std::uint64_t, FolderRecord>::const_iterator lb = mFolders.lower_bound(hash);
|
auto lb = mFolders.lower_bound(hash);
|
||||||
if (lb != mFolders.end() && !(mFolders.key_comp()(hash, lb->first)))
|
if (lb != mFolders.end() && !(mFolders.key_comp()(hash, lb->first)))
|
||||||
fail("Archive found duplicate folder name hash");
|
fail("Archive found duplicate folder name hash");
|
||||||
else
|
else
|
||||||
@ -194,7 +192,7 @@ void CompressedBSAFile::readHeader()
|
|||||||
std::uint64_t fileHash;
|
std::uint64_t fileHash;
|
||||||
FileRecord file;
|
FileRecord file;
|
||||||
|
|
||||||
std::string folder("");
|
std::string folder;
|
||||||
std::uint64_t folderHash;
|
std::uint64_t folderHash;
|
||||||
if ((archiveFlags & 0x1) == 0)
|
if ((archiveFlags & 0x1) == 0)
|
||||||
folderCount = 1; // TODO: not tested - unit test necessary
|
folderCount = 1; // TODO: not tested - unit test necessary
|
||||||
@ -209,7 +207,7 @@ void CompressedBSAFile::readHeader()
|
|||||||
|
|
||||||
folderHash = generateHash(folder, std::string());
|
folderHash = generateHash(folder, std::string());
|
||||||
|
|
||||||
std::map<std::uint64_t, FolderRecord>::iterator iter = mFolders.find(folderHash);
|
auto iter = mFolders.find(folderHash);
|
||||||
if (iter == mFolders.end())
|
if (iter == mFolders.end())
|
||||||
fail("Archive folder name hash not found");
|
fail("Archive folder name hash not found");
|
||||||
|
|
||||||
@ -219,13 +217,13 @@ void CompressedBSAFile::readHeader()
|
|||||||
input.read(reinterpret_cast<char*>(&file.size), 4);
|
input.read(reinterpret_cast<char*>(&file.size), 4);
|
||||||
input.read(reinterpret_cast<char*>(&file.offset), 4);
|
input.read(reinterpret_cast<char*>(&file.offset), 4);
|
||||||
|
|
||||||
std::map<std::uint64_t, FileRecord>::const_iterator lb = iter->second.files.lower_bound(fileHash);
|
auto lb = iter->second.files.lower_bound(fileHash);
|
||||||
if (lb != iter->second.files.end() && !(iter->second.files.key_comp()(fileHash, lb->first)))
|
if (lb != iter->second.files.end() && !(iter->second.files.key_comp()(fileHash, lb->first)))
|
||||||
fail("Archive found duplicate file name hash");
|
fail("Archive found duplicate file name hash");
|
||||||
|
|
||||||
iter->second.files.insert(lb, std::pair<std::uint64_t, FileRecord>(fileHash, file));
|
iter->second.files.insert(lb, std::pair<std::uint64_t, FileRecord>(fileHash, file));
|
||||||
|
|
||||||
FileStruct fileStruct;
|
FileStruct fileStruct{};
|
||||||
fileStruct.fileSize = file.getSizeWithoutCompressionFlag();
|
fileStruct.fileSize = file.getSizeWithoutCompressionFlag();
|
||||||
fileStruct.offset = file.offset;
|
fileStruct.offset = file.offset;
|
||||||
fileStruct.name = nullptr;
|
fileStruct.name = nullptr;
|
||||||
@ -308,12 +306,12 @@ CompressedBSAFile::FileRecord CompressedBSAFile::getFileRecord(const std::string
|
|||||||
std::string folder = p.string();
|
std::string folder = p.string();
|
||||||
std::uint64_t folderHash = generateHash(folder, std::string());
|
std::uint64_t folderHash = generateHash(folder, std::string());
|
||||||
|
|
||||||
std::map<std::uint64_t, FolderRecord>::const_iterator it = mFolders.find(folderHash);
|
auto it = mFolders.find(folderHash);
|
||||||
if (it == mFolders.end())
|
if (it == mFolders.end())
|
||||||
return FileRecord(); // folder not found, return default which has offset of sInvalidOffset
|
return FileRecord(); // folder not found, return default which has offset of sInvalidOffset
|
||||||
|
|
||||||
std::uint64_t fileHash = generateHash(stem, ext);
|
std::uint64_t fileHash = generateHash(stem, ext);
|
||||||
std::map<std::uint64_t, FileRecord>::const_iterator iter = it->second.files.find(fileHash);
|
auto iter = it->second.files.find(fileHash);
|
||||||
if (iter == it->second.files.end())
|
if (iter == it->second.files.end())
|
||||||
return FileRecord(); // file not found, return default which has offset of sInvalidOffset
|
return FileRecord(); // file not found, return default which has offset of sInvalidOffset
|
||||||
|
|
||||||
@ -430,12 +428,12 @@ BsaVersion CompressedBSAFile::detectVersion(std::string filePath)
|
|||||||
//mFiles used by OpenMW expects uncompressed sizes
|
//mFiles used by OpenMW expects uncompressed sizes
|
||||||
void CompressedBSAFile::convertCompressedSizesToUncompressed()
|
void CompressedBSAFile::convertCompressedSizesToUncompressed()
|
||||||
{
|
{
|
||||||
for (auto iter = mFiles.begin(); iter != mFiles.end(); ++iter)
|
for (auto & mFile : mFiles)
|
||||||
{
|
{
|
||||||
const FileRecord& fileRecord = getFileRecord(iter->name);
|
const FileRecord& fileRecord = getFileRecord(mFile.name);
|
||||||
if (!fileRecord.isValid())
|
if (!fileRecord.isValid())
|
||||||
{
|
{
|
||||||
fail("Could not find file " + std::string(iter->name) + " in BSA");
|
fail("Could not find file " + std::string(mFile.name) + " in BSA");
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!fileRecord.isCompressed(mCompressedByDefault))
|
if (!fileRecord.isCompressed(mCompressedByDefault))
|
||||||
@ -452,11 +450,11 @@ void CompressedBSAFile::convertCompressedSizesToUncompressed()
|
|||||||
getBZString(embeddedFileName, *(dataBegin.get()));
|
getBZString(embeddedFileName, *(dataBegin.get()));
|
||||||
}
|
}
|
||||||
|
|
||||||
dataBegin->read(reinterpret_cast<char*>(&(iter->fileSize)), sizeof(iter->fileSize));
|
dataBegin->read(reinterpret_cast<char*>(&(mFile.fileSize)), sizeof(mFile.fileSize));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
std::uint64_t CompressedBSAFile::generateHash(std::string stem, std::string extension) const
|
std::uint64_t CompressedBSAFile::generateHash(std::string stem, std::string extension)
|
||||||
{
|
{
|
||||||
size_t len = stem.length();
|
size_t len = stem.length();
|
||||||
if (len == 0)
|
if (len == 0)
|
||||||
|
@ -80,7 +80,7 @@ namespace Bsa
|
|||||||
//mFiles used by OpenMW will contain uncompressed file sizes
|
//mFiles used by OpenMW will contain uncompressed file sizes
|
||||||
void convertCompressedSizesToUncompressed();
|
void convertCompressedSizesToUncompressed();
|
||||||
/// \brief Normalizes given filename or folder and generates format-compatible hash. See https://en.uesp.net/wiki/Tes4Mod:Hash_Calculation.
|
/// \brief Normalizes given filename or folder and generates format-compatible hash. See https://en.uesp.net/wiki/Tes4Mod:Hash_Calculation.
|
||||||
std::uint64_t generateHash(std::string stem, std::string extension) const;
|
static std::uint64_t generateHash(std::string stem, std::string extension) ;
|
||||||
Files::IStreamPtr getFile(const FileRecord& fileRecord);
|
Files::IStreamPtr getFile(const FileRecord& fileRecord);
|
||||||
public:
|
public:
|
||||||
CompressedBSAFile();
|
CompressedBSAFile();
|
||||||
|
@ -37,8 +37,8 @@ Class used internally by MemoryInputStream.
|
|||||||
class MemoryInputStreamBuf : public std::streambuf {
|
class MemoryInputStreamBuf : public std::streambuf {
|
||||||
|
|
||||||
public:
|
public:
|
||||||
MemoryInputStreamBuf(size_t bufferSize);
|
explicit MemoryInputStreamBuf(size_t bufferSize);
|
||||||
char* getRawData();
|
virtual char* getRawData();
|
||||||
private:
|
private:
|
||||||
//correct call to delete [] on C++ 11
|
//correct call to delete [] on C++ 11
|
||||||
std::vector<char> mBufferPtr;
|
std::vector<char> mBufferPtr;
|
||||||
@ -54,8 +54,8 @@ private:
|
|||||||
*/
|
*/
|
||||||
class MemoryInputStream : virtual MemoryInputStreamBuf, std::istream {
|
class MemoryInputStream : virtual MemoryInputStreamBuf, std::istream {
|
||||||
public:
|
public:
|
||||||
MemoryInputStream(size_t bufferSize);
|
explicit MemoryInputStream(size_t bufferSize);
|
||||||
char* getRawData();
|
char* getRawData() override;
|
||||||
};
|
};
|
||||||
|
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user