enderalse/SKSE/Plugins/fs_skse_plugin_functions/common/IArchive.cpp
2021-10-06 02:45:46 +02:00

103 lines
1.7 KiB
C++

#include "IArchive.h"
#include "IErrors.h"
#if ENABLE_IDYNAMICCREATE
IDynamic * IArchive::iterator::Instantiate(void)
{
IDataSubStream subStream(owner->theStream, GetDataOffset(), GetDataLength());
return IClassRegistry::Instantiate(GetTypeID(), &subStream);
}
void * IArchive::iterator::GetBuffer(UInt32 * outLength)
{
HeaderEntry * entry = GetData();
UInt8 * buf = new UInt8[entry->dataLength];
owner->theStream->SetOffset(entry->dataOffset);
owner->theStream->ReadBuf(buf, entry->dataLength);
if(outLength)
*outLength = entry->dataLength;
return buf;
}
void IArchive::iterator::NextOfType(UInt32 typeID)
{
idx++;
while((GetData()->typeID != typeID) && (idx < owner->header.numEntries))
idx++;
}
void IArchive::iterator::PrevOfType(UInt32 typeID)
{
idx--;
while((GetData()->typeID != typeID) && (idx > 0))
idx--;
}
IArchive::IArchive()
:theStream(NULL), entries(NULL), nameTable(NULL)
{
}
IArchive::IArchive(IDataStream * stream)
:theStream(NULL), entries(NULL), nameTable(NULL)
{
AttachStream(stream);
}
IArchive::~IArchive()
{
Dispose();
}
void IArchive::AttachStream(IDataStream * inStream)
{
Dispose();
theStream = inStream;
}
void IArchive::Dispose(void)
{
if(entries)
{
delete entries;
entries = NULL;
}
if(nameTable)
{
delete nameTable;
nameTable = NULL;
}
}
void IArchive::ReadHeader(void)
{
ASSERT(theStream);
theStream->Rewind();
theStream->ReadBuf(&header, sizeof(FileHeader));
entries = new HeaderEntry[header.numEntries];
theStream->ReadBuf(entries, header.numEntries * sizeof(HeaderEntry));
if(header.nameTableLength)
{
nameTable = new char[header.nameTableLength];
theStream->SetOffset(header.nameTableOffset);
theStream->ReadBuf(nameTable, header.nameTableLength);
}
}
#endif