//#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 { public class granny_header : igranny_header { private const int GrannyGRNExtraTagCount = 4; private const int GrannyGRNReservedUnusedCount = 3; 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; 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 public Int32 Version { get { return _Version; } set { _Version = value; } } public Int32 TotalSize { get { return _TotalSize; } set { _TotalSize = value; } } public Int32 CRC { get { return _CRC; } set { _CRC = value; } } public Int32 SectionArrayOffset { get { return _SectionArrayOffset; } set { _SectionArrayOffset = value; } } 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 public Int32 TypeTag { get { return _TypeTag; } set { _TypeTag = value; } } 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 public Int32 StringDatabaseCRC { get { return _StringDatabaseCRC; } set { _StringDatabaseCRC = value; } } 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 } }