internal StringArchive(AssetManager manager, BinaryReader reader, string name, long length)
: base(manager, name)
{
ByteOrder = ByteOrder.LittleEndian;
Encoding = Encoding.Unicode;
if (reader is BigEndianBinaryReader)
Encoding = Encoding.BigEndianUnicode;
using (reader) {
reader.Require(Magic1);
int totalFileLength = reader.ReadInt32();
if (totalFileLength != length) {
if (totalFileLength.ReverseBytes() == length) {
ByteOrder = ByteOrder.BigEndian;
Encoding = Encoding.BigEndianUnicode;
} else
throw new InvalidDataException();
}
int magic2 = reader.ReadInt32();
if (magic2 != Magic2 && magic2 != Magic2BE)
throw new InvalidDataException();
int groupCount = reader.ReadInt32(ByteOrder);
int stringCount = reader.ReadInt32(ByteOrder);
int stringOffset = reader.ReadInt32(ByteOrder);
reader.RequireZeroes(4 * 1);
for (int index = 0; index < groupCount; index++)
groups.Add(new StringGroup(reader, ByteOrder));
int[] stringOffsets = reader.ReadArrayInt32(stringCount, ByteOrder);
for (int index = 0; index < stringCount; index++) {
int offset = stringOffsets[index];
if (offset == 0)
strings.Add(null);
else {
reader.BaseStream.Position = offset;
string value = reader.ReadStringz(Encoding);
strings.Add(value);
}
}
foreach (StringGroup group in groups) {
for (int index = 0; index < group.StringCount; index++) {
int stringIndex = group.StringsIndex + index;
string stringValue = strings[stringIndex];
int realIndex = group.IndexStart + index;
if (stringValue != null)
stringsById[realIndex] = stringValue;
}
}
}
}