private LocalizedStringDict LoadPluginStrings(System.Text.Encoding encoding, LocalizedStringFormat format, BinaryReader reader)
{
if (encoding == null)
{
encoding = Encoding.Instance;
}
var dict = new LocalizedStringDict();
int length = reader.ReadInt32();
int size = reader.ReadInt32(); // size of data section
var list = new List<Pair<uint, uint>>();
for (uint i = 0; i < length; ++i)
{
uint id = reader.ReadUInt32();
uint off = reader.ReadUInt32();
list.Add(new Pair<uint, uint>(id, off));
}
long offset = reader.BaseStream.Position;
var data = new byte[size];
using (var stream = new MemoryStream(data, 0, size, true, false))
{
var buffer = new byte[65536];
int left = size;
while (left > 0)
{
int read = Math.Min(left, buffer.Length);
int nread = reader.BaseStream.Read(buffer, 0, read);
if (nread == 0)
{
break;
}
stream.Write(buffer, 0, nread);
left -= nread;
}
}
foreach (var kvp in list)
{
var start = (int)kvp.Value;
int len = 0;
switch (format)
{
case LocalizedStringFormat.Base:
while (data[start + len] != 0)
{
++len;
}
break;
case LocalizedStringFormat.DL:
case LocalizedStringFormat.IL:
len = BitConverter.ToInt32(data, start) - 1;
start = start + sizeof(int);
if (start + len > data.Length)
{
len = data.Length - start;
}
if (len < 0)
{
len = 0;
}
break;
}
string str = encoding.GetString(data, start, len);
dict.Add(kvp.Key, str);
}
return dict;
}