mirror of
https://github.com/Laupetin/OpenAssetTools.git
synced 2025-04-19 15:52:53 +00:00
106 lines
2.2 KiB
C++
106 lines
2.2 KiB
C++
#include "IPakEntryReadStream.h"
|
|
#include <cassert>
|
|
#include <stdexcept>
|
|
|
|
int64_t IPakEntryReadStream::Align(const int64_t num, const int64_t alignTo)
|
|
{
|
|
return (num + alignTo - 1) / alignTo * alignTo;
|
|
}
|
|
|
|
IPakEntryReadStream::IPakEntryReadStream(IFile* file, IPakStreamManager* streamManager, std::mutex* readMutex, const int64_t startOffset, const size_t length)
|
|
{
|
|
m_file = file;
|
|
m_base_pos = startOffset;
|
|
m_end_pos = startOffset + length;
|
|
m_buffer = new uint8_t[IPAK_CHUNK_SIZE * IPAK_CHUNK_COUNT_PER_READ];
|
|
m_stream_manager = streamManager;
|
|
m_read_mutex = readMutex;
|
|
|
|
m_buffer_pos = 0;
|
|
m_pos = m_base_pos;
|
|
}
|
|
|
|
IPakEntryReadStream::~IPakEntryReadStream()
|
|
{
|
|
Close();
|
|
}
|
|
|
|
bool IPakEntryReadStream::IsOpen()
|
|
{
|
|
return m_file != nullptr;
|
|
}
|
|
|
|
size_t IPakEntryReadStream::Read(void* buffer, const size_t elementSize, const size_t elementCount)
|
|
{
|
|
const size_t readSize = elementCount * elementSize;
|
|
size_t chunksToRead = Align((m_pos % IPAK_CHUNK_SIZE) + readSize, IPAK_CHUNK_SIZE) / IPAK_CHUNK_SIZE;
|
|
|
|
return 0;
|
|
}
|
|
|
|
size_t IPakEntryReadStream::Write(const void* data, size_t elementSize, size_t elementCount)
|
|
{
|
|
// This is not meant for writing.
|
|
assert(false);
|
|
throw std::runtime_error("This is not a stream for output!");
|
|
}
|
|
|
|
void IPakEntryReadStream::Skip(const int64_t amount)
|
|
{
|
|
if(amount > 0)
|
|
{
|
|
m_pos += amount;
|
|
|
|
if (m_pos > m_end_pos)
|
|
m_pos = m_end_pos;
|
|
else if (m_pos < m_base_pos)
|
|
m_pos = m_base_pos;
|
|
}
|
|
}
|
|
|
|
size_t IPakEntryReadStream::Printf(const char* fmt, ...)
|
|
{
|
|
// This is not meant for writing.
|
|
assert(false);
|
|
throw std::runtime_error("This is not a stream for output!");
|
|
}
|
|
|
|
int64_t IPakEntryReadStream::Pos()
|
|
{
|
|
return m_pos - m_base_pos;
|
|
}
|
|
|
|
void IPakEntryReadStream::Goto(const int64_t pos)
|
|
{
|
|
if(pos <= 0)
|
|
{
|
|
m_pos = m_base_pos;
|
|
}
|
|
else if(pos < m_end_pos - m_base_pos)
|
|
{
|
|
m_pos = pos + m_base_pos;
|
|
}
|
|
else
|
|
{
|
|
m_pos = m_end_pos;
|
|
}
|
|
}
|
|
|
|
void IPakEntryReadStream::GotoEnd()
|
|
{
|
|
m_pos = m_end_pos;
|
|
}
|
|
|
|
void IPakEntryReadStream::Close()
|
|
{
|
|
if(IsOpen())
|
|
{
|
|
m_file = nullptr;
|
|
|
|
delete[] m_buffer;
|
|
m_buffer = nullptr;
|
|
|
|
m_stream_manager->OnCloseStream(this);
|
|
}
|
|
}
|