2
0
mirror of https://github.com/Laupetin/OpenAssetTools.git synced 2026-05-17 07:21:43 +00:00

ObjLoading: Initial commit for IPak entry reading

This commit is contained in:
Jan
2020-02-08 22:54:24 +01:00
parent 91d5439f25
commit 28bc614a6d
5 changed files with 412 additions and 81 deletions
@@ -2,28 +2,48 @@
#include "IPakStreamManager.h"
#include "Utils/FileAPI.h"
#include "ObjContainer/IPak/IPakTypes.h"
#include <mutex>
class IPakEntryReadStream final : public FileAPI::IFile
{
static constexpr size_t IPAK_CHUNK_SIZE = 0x8000;
static constexpr size_t IPAK_CHUNK_COUNT_PER_READ = 0x8;
uint8_t* m_chunk_buffer;
uint8_t* m_file_buffer;
uint8_t* m_buffer;
IFile* m_file;
IPakStreamManager* m_stream_manager;
std::mutex* m_read_mutex;
IPakStreamManagerActions* m_stream_manager_actions;
size_t m_file_offset;
size_t m_file_head;
size_t m_file_length;
int64_t m_pos;
int64_t m_base_pos;
int64_t m_end_pos;
int64_t m_buffer_pos;
int64_t m_buffer_start_pos;
int64_t m_buffer_end_pos;
static int64_t Align(int64_t num, int64_t alignTo);
template<typename T>
static T AlignForward(const T num, const T alignTo)
{
return (num + alignTo - 1) / alignTo * alignTo;
}
template<typename T>
static T AlignBackwards(const T num, const T alignTo)
{
return num / alignTo * alignTo;
}
bool SetChunkBufferWindow(int64_t startPos, size_t chunkCount);
bool ValidateBlockHeader(IPakDataBlockHeader* blockHeader) const;
bool AdjustChunkBufferWindowForBlockHeader(IPakDataBlockHeader* blockHeader, size_t blockOffsetInChunk);
bool ProcessCommand(size_t commandSize, bool compressed);
bool AdvanceStream();
public:
IPakEntryReadStream(IFile* file, IPakStreamManager* streamManager, std::mutex* readMutex, int64_t startOffset, size_t length);
IPakEntryReadStream(IFile* file, IPakStreamManagerActions* streamManagerActions, uint8_t* chunkBuffer, int64_t startOffset, size_t fileSize);
~IPakEntryReadStream() override;
bool IsOpen() override;
size_t Read(void* buffer, size_t elementSize, size_t elementCount) override;
size_t Write(const void* data, size_t elementSize, size_t elementCount) override;