//#define HAVE_GRN_REFERENCE // when defined enabled GRN_REFERNCE in Header, else it is disabled
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using gr2lib.core.interfaces;
using gr2lib.core.helpers;
using System.Diagnostics;
using gr2lib.core.exceptions;
namespace gr2lib.core.coreclasses.header
{
///
/// granny_header class
///
public class granny_header : igranny_header
{
private const int GrannyGRNExtraTagCount = 4;
private const int GrannyGRNReservedUnusedCount = 3;
///
/// default constructor
///
public granny_header()
{
this.ExtraTags = new int[GrannyGRNExtraTagCount];
this.ReservedUnused = new int[GrannyGRNReservedUnusedCount];
this.Version = 0;
this.TotalSize = 0;
this.CRC = 0;
this.SectionArrayOffset = 0;
this.SectionArrayCount = 0;
#if HAVE_GRN_REFERENCE
this.RootObjectTypeDefinition = new granny_reference();
this.RootObject = new granny_reference();
#endif
this.TypeTag = 0;
this.StringDatabaseCRC = 0;
for (int i = 0; i < GrannyGRNExtraTagCount; i++) { this.ExtraTags[i] = 0; }
for (int i = 0; i < GrannyGRNReservedUnusedCount; i++) { this.ReservedUnused[i] = 0; }
}
internal static granny_header ReadFromMemory(IntPtr pointer)
{
try
{
if (pointer == IntPtr.Zero) return null;
gr2lib.core.coretypes.native.granny_grn_file_header native = Helpers.ReadFromMemory(pointer);
granny_header managed = ReadFromNative(native);
managed.NativePointer = pointer;
return managed;
}
catch (Exception ex)
{
StackTrace st = new StackTrace(true);
#if ENABLE_EXCEPTION_OUTPUT_TO_CONSOLE
Granny2ExceptionWriter.WriteToConsole(ex,st);
#endif
return default(granny_header);
}
}
internal static granny_header ReadFromNative(gr2lib.core.coretypes.native.granny_grn_file_header native)
{
try
{
granny_header managed = new granny_header();
managed.Version = native.Version;
managed.TotalSize = native.TotalSize;
managed.CRC = native.CRC;
managed.SectionArrayOffset = native.SectionArrayOffset;
managed.SectionArrayCount = native.SectionArrayCount;
// grn_reference
#if HAVE_GRN_REFERENCE
if (native.RootObjectTypeDefinition != IntPtr.Zero)
{
//managed.RootObjectTypeDefinition = granny_reference.ReadFromMemory(native.RootObjectTypeDefinition);
managed.RootObjectTypeDefinition = new granny_reference();
}
if (native.RootObject != IntPtr.Zero)
{
//managed.RootObject = granny_reference.ReadFromMemory(native.RootObject);
managed.RootObject = new granny_reference();
}
#endif
//managed.TypeTag = native.TypeTag;
managed.ExtraTags = native.ExtraTags;
managed.StringDatabaseCRC = native.StringDatabaseCRC;
managed.ReservedUnused = native.ReservedUnused;
//process header
return managed;
}
catch (Exception ex)
{
StackTrace st = new StackTrace(true);
#if ENABLE_EXCEPTION_OUTPUT_TO_CONSOLE
Granny2ExceptionWriter.WriteToConsole(ex,st);
#endif
return default(granny_header);
}
}
#region INativePointer Members
private IntPtr _NativePointer;
///
/// When used in a derived class, gets the native pointer for this instance
///
public IntPtr NativePointer { get { return _NativePointer; } set { _NativePointer = value; } }
#endregion
#region igranny_header members
private Int32 _Version;
private Int32 _TotalSize;
private Int32 _CRC;
private Int32 _SectionArrayOffset;
private Int32 _SectionArrayCount;
#if HAVE_GRN_REFERENCE
private granny_reference _RootObjectTypeDefinition;
private granny_reference _RootObject;
#endif
private Int32 _TypeTag;
private Int32[] _ExtraTags; //4
private Int32 _StringDatabaseCRC;
private Int32[] _ReservedUnused; //3
///
/// Version
///
public Int32 Version { get { return _Version; } set { _Version = value; } }
///
/// TotalSize
///
public Int32 TotalSize { get { return _TotalSize; } set { _TotalSize = value; } }
///
/// CRC
///
public Int32 CRC { get { return _CRC; } set { _CRC = value; } }
///
/// SectionArrayOffset
///
public Int32 SectionArrayOffset { get { return _SectionArrayOffset; } set { _SectionArrayOffset = value; } }
///
/// SectionArrayCount
///
public Int32 SectionArrayCount { get { return _SectionArrayCount; } set { _SectionArrayCount = value; } }
#if HAVE_GRN_REFERENCE
public granny_reference RootObjectTypeDefinition { get { return _RootObjectTypeDefinition; } set { _RootObjectTypeDefinition = value; } }
public granny_reference RootObject { get { return _RootObject; } set { _RootObject = value; } }
#endif
///
/// TypeTag
///
public Int32 TypeTag { get { return _TypeTag; } set { _TypeTag = value; } }
///
/// ExtraTags[4]
///
public Int32[] ExtraTags { get { return _ExtraTags; } set { if (value.Length > GrannyGRNExtraTagCount) throw new InvalidOperationException("The size of ExtraTags cannot be greater than " + GrannyGRNExtraTagCount); _ExtraTags = value; } } //4
///
/// StringDatabaseCRC
///
public Int32 StringDatabaseCRC { get { return _StringDatabaseCRC; } set { _StringDatabaseCRC = value; } }
///
/// ReservedUnused[3]
///
public Int32[] ReservedUnused { get { return _ReservedUnused; } set { if (value.Length > GrannyGRNReservedUnusedCount) throw new InvalidOperationException("The size of ReservedUnused cannot be greater than " + GrannyGRNReservedUnusedCount); _ReservedUnused = value; } } //3
#endregion
}
}