111 lines
2.4 KiB
C#
111 lines
2.4 KiB
C#
|
using System;
|
||
|
using System.Collections;
|
||
|
using System.IO;
|
||
|
using System.Text;
|
||
|
|
||
|
namespace BinLogReader
|
||
|
{
|
||
|
/// <summary>
|
||
|
/// Aggregates plugin information
|
||
|
/// </summary>
|
||
|
public class PluginDb
|
||
|
{
|
||
|
private static uint BINDB_MAGIC = 0x414D4244;
|
||
|
private static short BINDB_VERSION = 0x0100;
|
||
|
private ArrayList PluginList;
|
||
|
|
||
|
public PluginDb(uint plugins)
|
||
|
{
|
||
|
PluginList = new ArrayList((int)plugins);
|
||
|
}
|
||
|
|
||
|
public Plugin GetPluginById(ushort id)
|
||
|
{
|
||
|
return GetPluginById((int)id);
|
||
|
}
|
||
|
|
||
|
public Plugin GetPluginById(int id)
|
||
|
{
|
||
|
if (id < 0 || id >= PluginList.Count)
|
||
|
return null;
|
||
|
|
||
|
return (Plugin)PluginList[id];
|
||
|
}
|
||
|
|
||
|
public static PluginDb FromFile(string filename)
|
||
|
{
|
||
|
if (!File.Exists(filename))
|
||
|
return null;
|
||
|
|
||
|
System.IO.FileStream stream = File.Open(filename, System.IO.FileMode.Open);
|
||
|
if (stream == null)
|
||
|
return null;
|
||
|
BinaryReader br = new BinaryReader(stream);
|
||
|
if (br == null)
|
||
|
return null;
|
||
|
|
||
|
PluginDb db;
|
||
|
|
||
|
try
|
||
|
{
|
||
|
//check header
|
||
|
uint magic = br.ReadUInt32();
|
||
|
if (magic != BINDB_MAGIC)
|
||
|
throw new Exception("Invalid magic number");
|
||
|
//check version
|
||
|
ushort vers = br.ReadUInt16();
|
||
|
if (vers > BINDB_VERSION)
|
||
|
throw new Exception("Unknown version");
|
||
|
//read plugins
|
||
|
uint plugins = br.ReadUInt32();
|
||
|
db = new PluginDb(plugins);
|
||
|
for (uint i=0; i<plugins; i++)
|
||
|
{
|
||
|
byte status = br.ReadByte();
|
||
|
byte length = br.ReadByte();
|
||
|
byte [] name = br.ReadBytes(length + 1);
|
||
|
uint natives = br.ReadUInt32();
|
||
|
uint publics = br.ReadUInt32();
|
||
|
int id = db.CreatePlugin(
|
||
|
Encoding.ASCII.GetString(name, 0, length),
|
||
|
(int)natives,
|
||
|
(int)publics,
|
||
|
status);
|
||
|
Plugin pl = db.GetPluginById(id);
|
||
|
for (uint j=0; j<natives; j++)
|
||
|
{
|
||
|
length = br.ReadByte();
|
||
|
name = br.ReadBytes(length + 1);
|
||
|
pl.AddNative(Encoding.ASCII.GetString(name, 0, length));
|
||
|
}
|
||
|
for (uint j=0; j<publics; j++)
|
||
|
{
|
||
|
length = br.ReadByte();
|
||
|
name = br.ReadBytes(length + 1);
|
||
|
pl.AddPublic(Encoding.ASCII.GetString(name, 0, length));
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
catch
|
||
|
{
|
||
|
throw new Exception("File is corrupt");
|
||
|
}
|
||
|
finally
|
||
|
{
|
||
|
br.Close();
|
||
|
stream.Close();
|
||
|
GC.Collect();
|
||
|
}
|
||
|
|
||
|
return db;
|
||
|
}
|
||
|
|
||
|
private int CreatePlugin(string file, int natives, int publics, byte status)
|
||
|
{
|
||
|
Plugin pl = new Plugin(file, natives, publics, status);
|
||
|
PluginList.Add(pl);
|
||
|
return PluginList.Count - 1;
|
||
|
}
|
||
|
}
|
||
|
}
|