private IntPtr GetBinaryDataHook(IntPtr CodeBaseObject, IntPtr CampaignName, IntPtr VarName, IntPtr PlayerName, out Byte Cls, out UInt32 Size)
{
string CampaignNameStr = ServerInterop.ReadCExoString(CampaignName);
//
// If the campaign is the virtual database, call registered
// event handlers.
//
if (CampaignNameStr.StartsWith("VDB_"))
{
Cls = (byte)'O';
try
{
RetrieveCampaignDatabaseEventArgs EventArgs;
string VarNameStr = ServerInterop.ReadCExoString(VarName);
string PlayerNameStr = ServerInterop.ReadCExoString(PlayerName);
EventArgs = new RetrieveCampaignDatabaseEventArgs(CampaignNameStr.Substring(4), VarNameStr, PlayerNameStr);
CampaignDatabase.RetrieveCampaignDatabaseEvent(null, EventArgs);
//
// If no handler instantiated a GFF, then return no
// data found. Otherwise, allocate a buffer from the
// unmanaged server heap, and copy the contents of the
// GFF into the heap buffer and return the heap buffer.
//
if (EventArgs.GFF == null || EventArgs.GFF.Length == 0)
{
Size = 0;
return IntPtr.Zero;
}
else
{
IntPtr GFFBuffer = IntPtr.Zero;
try
{
GFFBuffer = ServerInterop.AllocateServerHeap((uint)EventArgs.GFF.Length);
Marshal.Copy(EventArgs.GFF, 0, GFFBuffer, EventArgs.GFF.Length);
Size = (uint)EventArgs.GFF.Length;
return GFFBuffer;
}
catch (Exception e)
{
Logger.Log("CampaignDatabaseHook.GetBinaryDataHook: Exception: {0}", e);
if (GFFBuffer != IntPtr.Zero)
{
ServerInterop.FreeServerHeap(GFFBuffer);
GFFBuffer = IntPtr.Zero;
}
}
}
}
catch (Exception e)
{
Logger.Log("CampaignDatabaseHook.GetBinaryDataHook: Exception: {0}", e);
Size = 0;
return IntPtr.Zero;
}
}
//
// Pass through to the original server implementation that uses
// the standard campaign database.
//
return CCodeBase_GetBinaryData_OriginalDelegate(CodeBaseObject, CampaignName, VarName, PlayerName, out Cls, out Size);
}