forked from xNVSE/NVSE
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathIArchive.cpp
More file actions
102 lines (76 loc) · 1.73 KB
/
Copy pathIArchive.cpp
File metadata and controls
102 lines (76 loc) · 1.73 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
#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