static void ShowExtLineInfo(StringBuilder info, AllSubdivInfo asi, GarminCore.Files.StdFile_RGN rgn, TreeViewData tvd, NodeContent.Content4File filedata, int lineidx, int tab, out int hexlen, out long firsthexadr) { GarminCore.Files.StdFile_RGN.ExtRawPolyData poly = asi.GetExtLine(lineidx); GarminCore.DataBlock block = asi.GetDataBlock4ExtLine(lineidx); firsthexadr = rgn.ExtLinesBlock.Offset; firsthexadr += block.Offset; hexlen = (int)block.Length; info.AppendLine(FillWithSpace("Type (1 Byte) (Bit 0..6)", tab, false, DecimalAndHexAndBinary(poly.Type))); info.AppendLine(FillWithSpace("Subtype (1 Byte) (Bit 0..4)", tab, false, DecimalAndHexAndBinary(poly.Subtype))); info.AppendLine(FillWithSpace("HasLabel (Bit 5)", tab, false, poly.HasLabel.ToString())); info.AppendLine(FillWithSpace("HasUnknownFlag (Bit 6)", tab, false, poly.HasUnknownFlag.ToString())); info.AppendLine(FillWithSpace("HasExtraBytes (Bit 7)", tab, false, poly.HasExtraBytes.ToString())); info.AppendLine(FillWithSpace("DeltaLongitude (2 Byte)", tab, false, DecimalAndHexAndBinary((short)poly.RawDeltaLongitude.Value) + ", " + poly.RawDeltaLongitude.ValueDegree.ToString() + "°")); info.AppendLine(FillWithSpace("DeltaLatitude (2 Byte)", tab, false, DecimalAndHexAndBinary((short)poly.RawDeltaLatitude.Value) + ", " + poly.RawDeltaLatitude.ValueDegree.ToString() + "°")); info.AppendLine(FillWithSpace("RawBitStreamLengthBytes (" + poly.RawBitStreamLengthBytes.Length.ToString() + " Byte)", tab, false, HexString(poly.RawBitStreamLengthBytes))); info.AppendLine(FillWithSpace(" BitStreamLength", tab, false, poly.BitstreamLength.ToString())); info.AppendLine(FillWithSpace("BitstreamInfo (1 Byte)", tab, false, DecimalAndHexAndBinary(poly.bitstreamInfo))); info.AppendLine(FillWithSpace(" basebits4lat", tab, false, DecimalAndHexAndBinary(poly.bitstreamInfo >> 4))); info.AppendLine(FillWithSpace(" basebits4lon", tab, false, DecimalAndHexAndBinary(poly.bitstreamInfo & 0xF))); if (poly.HasLabel) { info.AppendLine(FillWithSpace("LabelOffsetInLBL (3 Byte) (Bit 0..21)", tab, false, DecimalAndHexAndBinary(poly.LabelOffsetInLBL))); GarminCore.Files.StdFile_LBL lbl = tvd.GetLBL(filedata.Basename); if (lbl != null) { info.AppendLine(FillWithSpace(" Text (from LBL)", tab, true, lbl.GetText(poly.LabelOffsetInLBL, true) + "'")); } } if (poly.HasExtraBytes) { int len = 7 + poly.RawBitStreamLengthBytes.Length; if (poly.HasLabel) { len += 3; } filedata.BinaryReader.Seek(block.Offset + (uint)len); info.AppendLine(FillWithSpace("ExtraBytes", tab, false, HexString(filedata.BinaryReader.ReadBytes((int)block.Length - len)))); } info.AppendLine("Deltas:"); List <GarminCore.Files.StdFile_RGN.GeoDataBitstream.RawPoint> points = poly.GetRawPoints(); for (int i = 0; i < points.Count; i++) { info.AppendLine(" " + points[i].ToString() + " / " + points[0].GetMapUnitPoint(rgn.TREFile.MaplevelList[asi.MaplevelNo].CoordBits, asi.SubdivfInfo.Center).ToString()); } }
static void ShowExtPointInfo(StringBuilder info, AllSubdivInfo asi, GarminCore.Files.StdFile_RGN rgn, TreeViewData tvd, NodeContent.Content4File filedata, int pointidx, int tab, out int hexlen, out long firsthexadr) { GarminCore.Files.StdFile_RGN.ExtRawPointData point = asi.GetExtPoint(pointidx); GarminCore.DataBlock block = asi.GetDataBlock4ExtPoint(pointidx); firsthexadr = rgn.ExtLinesBlock.Offset; firsthexadr += block.Offset; hexlen = (int)block.Length; info.AppendLine(FillWithSpace("Type (1 Byte) (Bit 0..6)", tab, false, DecimalAndHexAndBinary(point.Type))); info.AppendLine(FillWithSpace("Subtype (1 Byte) (Bit 0..4)", tab, false, DecimalAndHexAndBinary(point.Subtype))); info.AppendLine(FillWithSpace("HasLabel (Bit 5)", tab, false, point.HasLabel.ToString())); info.AppendLine(FillWithSpace("HasUnknownFlag (Bit 6)", tab, false, point.HasUnknownFlag.ToString())); info.AppendLine(FillWithSpace("HasExtraBytes (Bit 7)", tab, false, point.HasExtraBytes.ToString())); info.AppendLine(FillWithSpace("DeltaLongitude (2 Byte)", tab, false, DecimalAndHexAndBinary((short)point.RawDeltaLongitude.Value) + ", " + point.RawDeltaLongitude.ValueDegree.ToString() + "°")); info.AppendLine(FillWithSpace("DeltaLatitude (2 Byte)", tab, false, DecimalAndHexAndBinary((short)point.RawDeltaLatitude.Value) + ", " + point.RawDeltaLatitude.ValueDegree.ToString() + "°")); if (point.HasLabel) { info.AppendLine(FillWithSpace("LabelOffsetInLBL (3 Byte) (Bit 0..21)", tab, false, DecimalAndHexAndBinary(point.LabelOffsetInLBL))); GarminCore.Files.StdFile_LBL lbl = tvd.GetLBL(filedata.Basename); if (lbl != null) { info.AppendLine(FillWithSpace(" Text (from LBL)", tab, true, lbl.GetText(point.LabelOffsetInLBL, true))); } } if (point.HasExtraBytes) { int len = 6; if (point.HasLabel) { len += 3; } filedata.BinaryReader.Seek(firsthexadr + (uint)len); info.AppendLine(FillWithSpace("ExtraBytes", tab, false, HexString(filedata.BinaryReader.ReadBytes(point.ExtraBytes)))); } if (point.HasUnknownFlag) { info.AppendLine(FillWithSpace("UnknownKey", tab, false, HexString(point.UnknownKey))); if (point.UnknownBytes != null && point.UnknownBytes.Length > 0) { info.AppendLine(FillWithSpace("UnknownBytes", tab, false, HexString(point.UnknownBytes))); } } }
/// <summary> /// Funktion für alle TRE-Datei-Infos /// </summary> /// <param name="info"></param> /// <param name="hex"></param> /// <param name="firsthexadr"></param> /// <param name="filedata"></param> /// <param name="nodetype">"Thema" der Info</param> /// <param name="idx">wenn größer oder gleich 0, dann der Index auf ein Objekt einer Tabelle</param> /// <param name="tn"></param> public static void SectionAndIndex(StringBuilder info, out byte[] hex, out long firsthexadr, NodeContent.Content4File filedata, NodeContent.NodeType nodetype, int idx, TreeViewData tvd) { GarminCore.Files.StdFile_TRE tre = filedata.GetGarminFileAsTRE(); int hexlen = 0; firsthexadr = 0; hex = null; GarminCore.Files.StdFile_LBL lbl; GarminCore.DataBlock block; switch (nodetype) { case NodeContent.NodeType.TRE_DescriptionList: firsthexadr = tre.MapDescriptionBlock.Offset; if (idx < 0) { info.AppendLine("MapDescriptionList: " + tre.MapDescriptionList.Count.ToString()); info.AppendLine(" Block: " + tre.MapDescriptionBlock.ToString()); hexlen = (int)tre.MapDescriptionBlock.Length; } else { string mapdescription = tre.MapDescriptionList[idx]; info.AppendLine("MapDescription: " + tre.MapDescriptionList[idx]); for (int i = 0; i < idx; i++) { firsthexadr += tre.MapDescriptionList[i].Length + 1; } hexlen = tre.MapDescriptionList[idx].Length + 1; } break; case NodeContent.NodeType.TRE_MaplevelBlock: firsthexadr = tre.MaplevelBlock.Offset; if (idx < 0) { info.AppendLine("Maplevel: " + tre.MaplevelList.Count.ToString()); info.AppendLine(" Block: " + tre.MaplevelBlock.ToString()); hexlen = (int)tre.MaplevelBlock.Length; if (hexlen > 0 && tre.MaplevelList.Count == 0) { info.AppendLine("data propably encrypted"); } } else { GarminCore.Files.StdFile_TRE.MapLevel maplevel = tre.MaplevelList[idx]; info.AppendLine("SymbolicScaleDenominator (Bit 0..3): " + DecimalAndHexAndBinary((ulong)maplevel.SymbolicScaleDenominator)); info.AppendLine("(SymbolicScaleDenominator) Bit 4: " + maplevel.Bit4.ToString()); info.AppendLine("(SymbolicScaleDenominator) Bit 5: " + maplevel.Bit5.ToString()); info.AppendLine("(SymbolicScaleDenominator) Bit 6: " + maplevel.Bit6.ToString()); info.AppendLine("(SymbolicScaleDenominator) Bit 7, Inherited: " + maplevel.Inherited.ToString()); info.AppendLine("CoordBits (1 Byte): " + DecimalAndHexAndBinary((ulong)maplevel.CoordBits)); info.AppendLine("SubdivInfos (2 Byte): " + DecimalAndHexAndBinary(maplevel.SubdivInfos)); firsthexadr += idx * 4; hexlen = 4; } break; case NodeContent.NodeType.TRE_SubdivisionBlock: firsthexadr = tre.SubdivisionBlock.Offset; if (idx < 0) { info.AppendLine("Subdivision: " + tre.SubdivInfoList.Count.ToString()); info.AppendLine(" Block: " + tre.SubdivisionBlock.ToString()); hexlen = (int)tre.SubdivisionBlock.Length; if (hexlen > 0 && tre.MaplevelList.Count == 0) { info.AppendLine("data propably encrypted"); } } else { block = SampleInfo4SubdivInfo(info, tre, idx); firsthexadr += block.Offset; hexlen = (int)block.Length; } break; case NodeContent.NodeType.TRE_CopyrightBlock: firsthexadr = tre.CopyrightBlock.Offset; if (idx < 0) { info.AppendLine("Copyrights: " + tre.CopyrightOffsetsList.Count.ToString()); info.AppendLine(" Block: " + tre.CopyrightBlock.ToString()); hexlen = (int)tre.CopyrightBlock.Length; } else { info.AppendLine("Offset in LBL (" + tre.CopyrightBlock.Recordsize.ToString() + " Byte): " + DecimalAndHexAndBinary(tre.CopyrightOffsetsList[idx])); lbl = tvd.GetLBL(filedata.Basename); if (lbl != null) { info.AppendLine(" Text (from LBL): '" + lbl.GetText(tre.CopyrightOffsetsList[idx], true) + "'"); } firsthexadr += idx * tre.CopyrightBlock.Recordsize; hexlen = tre.CopyrightBlock.Recordsize; } break; case NodeContent.NodeType.TRE_LineOverviewBlock: firsthexadr = tre.LineOverviewBlock.Offset; if (idx < 0) { info.AppendLine("LineOverview: " + (tre.LineOverviewBlock.Length / tre.LineOverviewBlock.Recordsize).ToString()); info.AppendLine(" Block: " + tre.LineOverviewBlock.ToString()); hexlen = (int)tre.LineOverviewBlock.Length; } else { GarminCore.Files.StdFile_TRE.OverviewObject2Byte ov = tre.LineOverviewList[idx]; info.AppendLine("Type (1 Byte): " + DecimalAndHexAndBinary((ulong)ov.Type)); info.AppendLine("MaxLevel (1 Byte): " + DecimalAndHexAndBinary((ulong)ov.MaxLevel)); if (ov is GarminCore.Files.StdFile_TRE.OverviewObject3Byte || ov is GarminCore.Files.StdFile_TRE.OverviewObject4Byte) { info.AppendLine("SubType (1 Byte): " + DecimalAndHexAndBinary((ulong)(ov as GarminCore.Files.StdFile_TRE.OverviewObject3Byte).SubType)); } if (ov is GarminCore.Files.StdFile_TRE.OverviewObject4Byte) { info.AppendLine("Unknown (1 Byte): " + DecimalAndHexAndBinary((ulong)(ov as GarminCore.Files.StdFile_TRE.OverviewObject4Byte).Unknown)); } firsthexadr += idx * tre.LineOverviewBlock.Recordsize; hexlen = tre.LineOverviewBlock.Recordsize; } break; case NodeContent.NodeType.TRE_AreaOverviewBlock: firsthexadr = tre.AreaOverviewBlock.Offset; if (idx < 0) { info.AppendLine("AreaOverview: " + (tre.AreaOverviewBlock.Length / tre.AreaOverviewBlock.Recordsize).ToString()); info.AppendLine(" Block: " + tre.AreaOverviewBlock.ToString()); hexlen = (int)tre.AreaOverviewBlock.Length; } else { GarminCore.Files.StdFile_TRE.OverviewObject2Byte ov = tre.AreaOverviewList[idx]; info.AppendLine("Type (1 Byte): " + DecimalAndHexAndBinary((ulong)ov.Type)); info.AppendLine("MaxLevel (1 Byte): " + DecimalAndHexAndBinary((ulong)ov.MaxLevel)); if (ov is GarminCore.Files.StdFile_TRE.OverviewObject3Byte || ov is GarminCore.Files.StdFile_TRE.OverviewObject4Byte) { info.AppendLine("SubType (1 Byte): " + DecimalAndHexAndBinary((ulong)(ov as GarminCore.Files.StdFile_TRE.OverviewObject3Byte).SubType)); } if (ov is GarminCore.Files.StdFile_TRE.OverviewObject4Byte) { info.AppendLine("Unknown (1 Byte): " + DecimalAndHexAndBinary((ulong)(ov as GarminCore.Files.StdFile_TRE.OverviewObject4Byte).Unknown)); } firsthexadr = idx * tre.AreaOverviewBlock.Recordsize; hexlen = tre.AreaOverviewBlock.Recordsize; } break; case NodeContent.NodeType.TRE_PointOverviewBlock: firsthexadr = tre.PointOverviewBlock.Offset; if (idx < 0) { info.AppendLine("PointOverview: " + (tre.PointOverviewBlock.Length / tre.PointOverviewBlock.Recordsize).ToString()); info.AppendLine(" Block: " + tre.PointOverviewBlock.ToString()); hexlen = (int)tre.PointOverviewBlock.Length; } else { GarminCore.Files.StdFile_TRE.OverviewObject2Byte ov = tre.PointOverviewList[idx]; info.AppendLine("Type (1 Byte): " + DecimalAndHexAndBinary((ulong)ov.Type)); info.AppendLine("MaxLevel (1 Byte): " + DecimalAndHexAndBinary((ulong)ov.MaxLevel)); if (ov is GarminCore.Files.StdFile_TRE.OverviewObject3Byte || ov is GarminCore.Files.StdFile_TRE.OverviewObject4Byte) { info.AppendLine("SubType (1 Byte): " + DecimalAndHexAndBinary((ulong)(ov as GarminCore.Files.StdFile_TRE.OverviewObject3Byte).SubType)); } if (ov is GarminCore.Files.StdFile_TRE.OverviewObject4Byte) { info.AppendLine("Unknown (1 Byte): " + DecimalAndHexAndBinary((ulong)(ov as GarminCore.Files.StdFile_TRE.OverviewObject4Byte).Unknown)); } firsthexadr = idx * tre.PointOverviewBlock.Recordsize; hexlen = tre.PointOverviewBlock.Recordsize; } break; case NodeContent.NodeType.TRE_ExtTypeOffsetsBlock: firsthexadr = tre.ExtTypeOffsetsBlock.Offset; if (idx < 0) { info.AppendLine("ExtTypeOffsets: " + (tre.ExtTypeOffsetsBlock.Length / tre.ExtTypeOffsetsBlock.Recordsize).ToString()); info.AppendLine(" Block: " + tre.ExtTypeOffsetsBlock.ToString()); hexlen = (int)tre.ExtTypeOffsetsBlock.Length; } else { firsthexadr += idx * tre.ExtTypeOffsetsBlock.Recordsize; hexlen = tre.ExtTypeOffsetsBlock.Recordsize; GarminCore.Files.StdFile_TRE.ExtendedTypeOffsets extoffs = new GarminCore.Files.StdFile_TRE.ExtendedTypeOffsets(); filedata.BinaryReader.Seek(firsthexadr); extoffs.Read(filedata.BinaryReader, tre.ExtTypeOffsetsBlock.Recordsize); info.AppendLine("Offsets in RGN for each Subdiv"); info.AppendLine("AreasOffset (4 Byte): " + DecimalAndHexAndBinary((ulong)extoffs.AreasOffset)); info.AppendLine("LinesOffset (4 Byte): " + DecimalAndHexAndBinary((ulong)extoffs.LinesOffset)); info.AppendLine("PointsOffset (4 Byte): " + DecimalAndHexAndBinary((ulong)extoffs.PointsOffset)); if (extoffs.DataLength > 12) { info.AppendLine("Kinds (1 Byte): " + DecimalAndHexAndBinary((ulong)extoffs.Kinds)); } } break; case NodeContent.NodeType.TRE_ExtTypeOverviewsBlock: firsthexadr = tre.ExtTypeOverviewsBlock.Offset; if (idx < 0) { info.AppendLine("TRE_ExtTypeOverviews: " + (tre.ExtTypeOverviewsBlock.Length / tre.ExtTypeOverviewsBlock.Recordsize).ToString()); info.AppendLine(" Block: " + tre.ExtTypeOverviewsBlock.ToString()); info.AppendLine("ExtLineOverviewList: " + tre.ExtLineOverviewList.Count.ToString()); info.AppendLine("ExtAreaOverviewList: " + tre.ExtAreaOverviewList.Count.ToString()); info.AppendLine("ExtPointOverviewList: " + tre.ExtPointOverviewList.Count.ToString()); hexlen = (int)tre.ExtTypeOverviewsBlock.Length; } else { firsthexadr += idx * tre.ExtTypeOverviewsBlock.Recordsize; hexlen = tre.ExtTypeOverviewsBlock.Recordsize; GarminCore.Files.StdFile_TRE.OverviewObject2Byte ov = null; if (idx < tre.ExtLineCount && idx < tre.ExtLineOverviewList.Count) { info.AppendLine("ExtLine"); ov = tre.ExtLineOverviewList[idx]; } else if (idx < tre.ExtLineCount + tre.ExtAreaCount && idx - tre.ExtLineOverviewList.Count < tre.ExtAreaOverviewList.Count) { idx -= tre.ExtLineCount; info.AppendLine("ExtArea"); ov = tre.ExtAreaOverviewList[idx]; } else if (idx - tre.ExtLineOverviewList.Count - tre.ExtAreaOverviewList.Count < tre.ExtPointOverviewList.Count) { idx -= tre.ExtLineCount + tre.ExtAreaCount; info.AppendLine("ExtPoint"); ov = tre.ExtPointOverviewList[idx]; } if (ov != null) { info.AppendLine("Type (1 Byte): " + DecimalAndHexAndBinary((ulong)ov.Type)); info.AppendLine("MaxLevel (1 Byte): " + DecimalAndHexAndBinary((ulong)ov.MaxLevel)); info.AppendLine("SubType (1 Byte): " + DecimalAndHexAndBinary((ulong)(ov as GarminCore.Files.StdFile_TRE.OverviewObject3Byte).SubType)); if (ov is GarminCore.Files.StdFile_TRE.OverviewObject4Byte) { info.AppendLine("Unknown (1 Byte): " + DecimalAndHexAndBinary((ulong)(ov as GarminCore.Files.StdFile_TRE.OverviewObject4Byte).Unknown)); } } } break; case NodeContent.NodeType.TRE_UnknownBlock_xAE: if (idx < 0) { info.AppendLine("UnknownBlock 0xAE: " + tre.UnknownBlock_xAE.ToString()); firsthexadr = tre.UnknownBlock_xAE.Offset; hexlen = (int)tre.UnknownBlock_xAE.Length; } else { } break; case NodeContent.NodeType.TRE_UnknownBlock_xBC: if (idx < 0) { info.AppendLine("UnknownBlock 0xBC: " + tre.UnknownBlock_xBC.ToString()); firsthexadr = tre.UnknownBlock_xAE.Offset; hexlen = (int)tre.UnknownBlock_xAE.Length; } else { } break; case NodeContent.NodeType.TRE_UnknownBlock_xE3: if (idx < 0) { info.AppendLine("UnknownBlock 0xE3: " + tre.UnknownBlock_xE3.ToString()); firsthexadr = tre.UnknownBlock_xAE.Offset; hexlen = (int)tre.UnknownBlock_xAE.Length; } else { } break; default: info.AppendLine("internal error: no info for nodetype '" + nodetype.ToString() + "'"); break; } if (hexlen > 0) { hex = HexRange(firsthexadr, filedata.BinaryReader, hexlen); } }
/// <summary> /// Funktion für alle RGN-Datei-Infos /// </summary> /// <param name="info"></param> /// <param name="hex"></param> /// <param name="firsthexadr"></param> /// <param name="filedata"></param> /// <param name="nodetype"></param> /// <param name="idx"></param> /// <param name="tvd"></param> public static void SectionAndIndex(StringBuilder info, out byte[] hex, out long firsthexadr, NodeContent.Content4File filedata, NodeContent.NodeType nodetype, int idx, TreeViewData tvd) { GarminCore.Files.StdFile_RGN rgn = filedata.GetGarminFileAsRGN(tvd.GetTRE(filedata.Basename)); int hexlen = 0; firsthexadr = 0; hex = null; AllSubdivInfo asi = null; switch (nodetype) { case NodeContent.NodeType.RGN_PostHeaderData: firsthexadr = rgn.PostHeaderDataBlock.Offset; if (idx < 0) { info.AppendLine("PostHeaderDataBlock: " + rgn.PostHeaderDataBlock.ToString()); hexlen = (int)rgn.PostHeaderDataBlock.Length; } break; case NodeContent.NodeType.RGN_SubdivContentBlock: firsthexadr = rgn.SubdivContentBlock.Offset; if (idx < 0) { int tab = 22; info.AppendLine(FillWithSpace("SubdivContent", tab, false, rgn.SubdivList.Count.ToString())); info.AppendLine(FillWithSpace(" Block", tab, false, rgn.SubdivContentBlock.ToString())); hexlen = (int)rgn.SubdivContentBlock.Length; if (hexlen > 0 && rgn.SubdivList.Count == 0) { info.AppendLine("data propably encrypted"); } } else { asi = new AllSubdivInfo(rgn, filedata.BinaryReader, idx); info.AppendLine("Info from TRE:"); DataTRE.SampleInfo4SubdivInfo(info, rgn.TREFile, idx); info.AppendLine(); info.AppendLine("Info from RGN:"); GarminCore.DataBlock block = SampleInfo4SubdivData(info, rgn, asi); firsthexadr += block.Offset; hexlen = (int)block.Length; } break; case NodeContent.NodeType.RGN_ExtAreasBlock: firsthexadr = rgn.ExtAreasBlock.Offset; if (idx < 0) { info.AppendLine("ExtAreas"); info.AppendLine(" Block: " + rgn.ExtAreasBlock.ToString()); hexlen = (int)rgn.ExtAreasBlock.Length; } else { int subdividx = -1; int count = 0; idx &= RGN_IDX_MASK; // Gesamt-Index des ExtArea for (subdividx = 0; subdividx < rgn.SubdivList.Count; subdividx++) { count += rgn.SubdivList[subdividx].ExtAreaList.Count; if (idx < count) { break; } } if (subdividx < rgn.SubdivList.Count) { asi = new AllSubdivInfo(rgn, filedata.BinaryReader, subdividx); int idx2 = asi.SubdivData.ExtAreaList.Count - (count - idx); info.AppendLine("ExtArea " + idx2.ToString() + " from Subdiv " + subdividx.ToString()); ShowExtAreaInfo(info, asi, rgn, tvd, filedata, idx2, 40, out hexlen, out firsthexadr); } } break; case NodeContent.NodeType.RGN_ExtLinesBlock: firsthexadr = rgn.ExtLinesBlock.Offset; if (idx < 0) { info.AppendLine("ExtLines"); info.AppendLine(" Block: " + rgn.ExtLinesBlock.ToString()); hexlen = (int)rgn.ExtLinesBlock.Length; } else { int subdividx = -1; int count = 0; idx &= RGN_IDX_MASK; // Gesamt-Index des ExtArea for (subdividx = 0; subdividx < rgn.SubdivList.Count; subdividx++) { count += rgn.SubdivList[subdividx].ExtLineList.Count; if (idx < count) { break; } } if (subdividx < rgn.SubdivList.Count) { asi = new AllSubdivInfo(rgn, filedata.BinaryReader, subdividx); int idx2 = asi.SubdivData.ExtLineList.Count - (count - idx); info.AppendLine("ExtLine " + idx2.ToString() + " from Subdiv " + subdividx.ToString()); ShowExtLineInfo(info, asi, rgn, tvd, filedata, idx2, 40, out hexlen, out firsthexadr); } } break; case NodeContent.NodeType.RGN_ExtPointsBlock: firsthexadr = rgn.ExtPointsBlock.Offset; if (idx < 0) { info.AppendLine("ExtPoints"); info.AppendLine(" Block: " + rgn.ExtPointsBlock.ToString()); hexlen = (int)rgn.ExtPointsBlock.Length; } else { int subdividx = -1; int count = 0; idx &= RGN_IDX_MASK; // Gesamt-Index des ExtArea for (subdividx = 0; subdividx < rgn.SubdivList.Count; subdividx++) { count += rgn.SubdivList[subdividx].ExtPointList.Count; if (idx < count) { break; } } if (subdividx < rgn.SubdivList.Count) { asi = new AllSubdivInfo(rgn, filedata.BinaryReader, subdividx); int idx2 = asi.SubdivData.ExtPointList.Count - (count - idx); info.AppendLine("ExtPoint " + idx2.ToString() + " from Subdiv " + subdividx.ToString()); ShowExtPointInfo(info, asi, rgn, tvd, filedata, idx2, 40, out hexlen, out firsthexadr); } } break; case NodeContent.NodeType.RGN_UnknownBlock_0x71: firsthexadr = rgn.UnknownBlock_0x71.Offset; if (idx < 0) { info.AppendLine("UnknownBlock 0x71"); info.AppendLine(" Block: " + rgn.UnknownBlock_0x71.ToString()); hexlen = (int)rgn.UnknownBlock_0x71.Length; } break; case NodeContent.NodeType.Index: if (tvd.TreeView.SelectedNode != null) { int subdividx = -1; // etwas tricky ... NodeContent nc = NodeContent4TreeNode(tvd.TreeView.SelectedNode.Parent); switch (nc.Type) { case NodeContent.NodeType.Index: // wenn der übergeordnete Knoten ein Index ist, dann ist es ein Subdiv-Index subdividx = (int)nc.Data; if (subdividx >= 0) { asi = new AllSubdivInfo(rgn, filedata.BinaryReader, subdividx); } break; } } if (asi != null) { if ((idx & RGN_IDX_POINT1) != 0) { idx &= RGN_IDX_MASK; int tab = 40; GarminCore.Files.StdFile_RGN.RawPointData point = asi.GetPoint(idx); GarminCore.Files.StdFile_LBL lbl = tvd.GetLBL(filedata.Basename); info.AppendLine(FillWithSpace("Type (1 Byte)", tab, false, DecimalAndHexAndBinary(point.Type))); info.AppendLine(FillWithSpace("LabelOffsetInLBL (3 Byte) (Bit 0..21)", tab, false, DecimalAndHexAndBinary(point.LabelOffsetInLBL))); if (lbl != null) { info.AppendLine(FillWithSpace(" Text (from LBL)", tab, true, point.GetText(lbl, true))); } info.AppendLine(FillWithSpace("HasSubtype (Bit 23)", tab, false, point.HasSubtype.ToString())); info.AppendLine(FillWithSpace("IsPoiOffset (Bit 22)", tab, false, point.IsPoiOffset.ToString())); info.AppendLine(FillWithSpace("DeltaLongitude (2 Byte)", tab, false, DecimalAndHexAndBinary((short)point.RawDeltaLongitude.Value) + ", " + point.RawDeltaLongitude.ValueDegree.ToString() + "°")); info.AppendLine(FillWithSpace("DeltaLatitude (2 Byte)", tab, false, DecimalAndHexAndBinary((short)point.RawDeltaLatitude.Value) + ", " + point.RawDeltaLatitude.ValueDegree.ToString() + "°")); if (point.HasSubtype) { info.AppendLine(FillWithSpace("Subtype (1 Byte)", tab, false, DecimalAndHexAndBinary(point.Subtype))); } GarminCore.DataBlock block = asi.GetDataBlock4Object(GarminCore.Files.StdFile_TRE.SubdivInfoBasic.SubdivContent.poi, idx); firsthexadr = rgn.SubdivContentBlock.Offset; firsthexadr += block.Offset; hexlen = (int)block.Length; } else if ((idx & RGN_IDX_POINT2) != 0) { idx &= RGN_IDX_MASK; int tab = 40; GarminCore.Files.StdFile_RGN.RawPointData point = asi.GetIdxPoint(idx); GarminCore.Files.StdFile_LBL lbl = tvd.GetLBL(filedata.Basename); info.AppendLine(FillWithSpace("Type (1 Byte)", tab, false, DecimalAndHexAndBinary(point.Type))); info.AppendLine(FillWithSpace("LabelOffsetInLBL (3 Byte) (Bit 0..21)", tab, false, DecimalAndHexAndBinary(point.LabelOffsetInLBL))); if (lbl != null) { info.AppendLine(FillWithSpace(" Text (from LBL)", tab, true, point.GetText(lbl, true))); } info.AppendLine(FillWithSpace("HasSubtype (Bit 23)", tab, false, point.HasSubtype.ToString())); info.AppendLine(FillWithSpace("IsPoiOffset (Bit 22)", tab, false, point.IsPoiOffset.ToString())); info.AppendLine(FillWithSpace("DeltaLongitude (2 Byte)", tab, false, DecimalAndHexAndBinary((short)point.RawDeltaLongitude.Value) + ", " + point.RawDeltaLongitude.ValueDegree.ToString() + "°")); info.AppendLine(FillWithSpace("DeltaLatitude (2 Byte)", tab, false, DecimalAndHexAndBinary((short)point.RawDeltaLatitude.Value) + ", " + point.RawDeltaLatitude.ValueDegree.ToString() + "°")); if (point.HasSubtype) { info.AppendLine(FillWithSpace("Subtype (1 Byte)", tab, false, DecimalAndHexAndBinary(point.Subtype))); } GarminCore.DataBlock block = asi.GetDataBlock4Object(GarminCore.Files.StdFile_TRE.SubdivInfoBasic.SubdivContent.idxpoi, idx); firsthexadr = rgn.SubdivContentBlock.Offset; firsthexadr += block.Offset; hexlen = (int)block.Length; } else if ((idx & RGN_IDX_LINE) != 0) { idx &= RGN_IDX_MASK; int tab = 40; GarminCore.Files.StdFile_RGN.RawPolyData poly = asi.GetLine(idx); GarminCore.Files.StdFile_LBL lbl = tvd.GetLBL(filedata.Basename); GarminCore.Files.StdFile_NET net = tvd.GetNET(filedata.Basename); info.AppendLine(FillWithSpace("Type (1 Byte) (Bit 0..5)", tab, false, DecimalAndHexAndBinary(poly.Type))); info.AppendLine(FillWithSpace("TwoByteLength (Bit 7)", tab, false, poly.TwoByteLength.ToString())); if (!poly.IsPolygon) { info.AppendLine(FillWithSpace("Direction (Bit 6)", tab, false, poly.DirectionIndicator.ToString())); } info.AppendLine(FillWithSpace("LabelOffsetInLBL (3 Byte) (Bit 0..21)", tab, false, DecimalAndHexAndBinary(poly.LabelOffsetInLBL))); if (!poly.LabelInNET) { if (lbl != null) { info.AppendLine(FillWithSpace("Text (from LBL)", tab, true, poly.GetText(lbl, true))); } } else { if (net != null) { GarminCore.Files.StdFile_NET.RoadData rd = net.GetRoadData(poly.LabelOffsetInLBL); if (rd != null) { info.AppendLine(FillWithSpace("Text (from NET, LBL)", tab, true, rd.GetText(lbl, true))); } } } info.AppendLine(FillWithSpace("WithExtraBit (Bit 22)", tab, false, poly.WithExtraBit.ToString())); info.AppendLine(FillWithSpace("LabelInNET (Bit 23)", tab, false, poly.LabelInNET.ToString())); info.AppendLine(FillWithSpace("DeltaLongitude (2 Byte)", tab, false, DecimalAndHexAndBinary((short)poly.RawDeltaLongitude.Value) + ", " + poly.RawDeltaLongitude.ValueDegree.ToString() + "°")); info.AppendLine(FillWithSpace("DeltaLatitude (2 Byte)", tab, false, DecimalAndHexAndBinary((short)poly.RawDeltaLatitude.Value) + ", " + poly.RawDeltaLatitude.ValueDegree.ToString() + "°")); info.AppendLine(FillWithSpace("BitstreamInfo (1 Byte)", tab, false, DecimalAndHexAndBinary(poly.bitstreamInfo))); info.AppendLine(FillWithSpace(" basebits4lat", tab, false, DecimalAndHexAndBinary(poly.bitstreamInfo >> 4))); info.AppendLine(FillWithSpace(" basebits4lon", tab, false, DecimalAndHexAndBinary(poly.bitstreamInfo & 0xF))); info.AppendLine(FillWithSpace("BitstreamLength (" + (poly.TwoByteLength ? "2" : "1") + " Byte)", tab, false, DecimalAndHexAndBinary(poly.bitstream.Length))); if (poly.WithExtraBit) { info.AppendLine(FillWithSpace("ExtraBitList", tab, false, AllSubdivInfo.ExtraBits(poly))); } info.AppendLine("Deltas:"); List <GarminCore.Files.StdFile_RGN.GeoDataBitstream.RawPoint> points = poly.GetRawPoints(); for (int i = 0; i < points.Count; i++) { info.AppendLine(" " + points[i].ToString() + " / " + points[0].GetMapUnitPoint(rgn.TREFile.MaplevelList[asi.MaplevelNo].CoordBits, asi.SubdivfInfo.Center).ToString()); } GarminCore.DataBlock block = asi.GetDataBlock4Object(GarminCore.Files.StdFile_TRE.SubdivInfoBasic.SubdivContent.line, idx); firsthexadr = rgn.SubdivContentBlock.Offset; firsthexadr += block.Offset; hexlen = (int)block.Length; } else if ((idx & RGN_IDX_AREA) != 0) { idx &= RGN_IDX_MASK; int tab = 40; GarminCore.Files.StdFile_RGN.RawPolyData poly = asi.GetArea(idx); GarminCore.Files.StdFile_LBL lbl = tvd.GetLBL(filedata.Basename); GarminCore.Files.StdFile_NET net = tvd.GetNET(filedata.Basename); info.AppendLine(FillWithSpace("Type (1 Byte) (Bit 0..6) ", tab, false, DecimalAndHexAndBinary(poly.Type))); info.AppendLine(FillWithSpace("TwoByteLength (Bit 7)", tab, false, poly.TwoByteLength.ToString())); info.AppendLine(FillWithSpace("LabelOffsetInLBL (3 Byte) (Bit 0..21)", tab, false, DecimalAndHexAndBinary(poly.LabelOffsetInLBL))); if (!poly.LabelInNET) { if (lbl != null) { info.AppendLine(FillWithSpace("Text (from LBL)", tab, true, poly.GetText(lbl, true))); } } else { if (net != null) { GarminCore.Files.StdFile_NET.RoadData rd = net.GetRoadData(poly.LabelOffsetInLBL); if (rd != null) { info.AppendLine(FillWithSpace("Text (from NET, LBL)", tab, true, rd.GetText(lbl, true))); } } } info.AppendLine(FillWithSpace("WithExtraBit (Bit 22)", tab, false, poly.WithExtraBit.ToString())); info.AppendLine(FillWithSpace("LabelInNET (Bit 23)", tab, false, poly.LabelInNET.ToString())); info.AppendLine(FillWithSpace("DeltaLongitude (2 Byte)", tab, false, DecimalAndHexAndBinary((short)poly.RawDeltaLongitude.Value) + ", " + poly.RawDeltaLongitude.ValueDegree.ToString() + "°")); info.AppendLine(FillWithSpace("DeltaLatitude (2 Byte)", tab, false, DecimalAndHexAndBinary((short)poly.RawDeltaLatitude.Value) + ", " + poly.RawDeltaLatitude.ValueDegree.ToString() + "°")); info.AppendLine(FillWithSpace("BitstreamInfo (1 Byte)", tab, false, DecimalAndHexAndBinary(poly.bitstreamInfo))); info.AppendLine(FillWithSpace(" basebits4lat", tab, false, DecimalAndHexAndBinary(poly.bitstreamInfo >> 4))); info.AppendLine(FillWithSpace(" basebits4lon", tab, false, DecimalAndHexAndBinary(poly.bitstreamInfo & 0xF))); info.AppendLine(FillWithSpace("BitstreamLength (" + (poly.TwoByteLength ? "2" : "1") + " Byte)", tab, false, DecimalAndHexAndBinary(poly.bitstream.Length))); if (poly.WithExtraBit) { info.AppendLine(FillWithSpace("ExtraBitList", tab, false, AllSubdivInfo.ExtraBits(poly))); } info.AppendLine("Deltas:"); List <GarminCore.Files.StdFile_RGN.GeoDataBitstream.RawPoint> points = poly.GetRawPoints(); for (int i = 0; i < points.Count; i++) { info.AppendLine(" " + points[i].ToString() + " / " + points[0].GetMapUnitPoint(rgn.TREFile.MaplevelList[asi.MaplevelNo].CoordBits, asi.SubdivfInfo.Center).ToString()); } GarminCore.DataBlock block = asi.GetDataBlock4Object(GarminCore.Files.StdFile_TRE.SubdivInfoBasic.SubdivContent.area, idx); firsthexadr = rgn.SubdivContentBlock.Offset; firsthexadr += block.Offset; hexlen = (int)block.Length; } else if ((idx & RGN_IDX_EXTPOINT) != 0) { ShowExtPointInfo(info, asi, rgn, tvd, filedata, idx & RGN_IDX_MASK, 40, out hexlen, out firsthexadr); } else if ((idx & RGN_IDX_EXTLINE) != 0) { ShowExtLineInfo(info, asi, rgn, tvd, filedata, idx & RGN_IDX_MASK, 40, out hexlen, out firsthexadr); } else if ((idx & RGN_IDX_EXTAREA) != 0) { ShowExtAreaInfo(info, asi, rgn, tvd, filedata, idx & RGN_IDX_MASK, 40, out hexlen, out firsthexadr); } } break; default: info.AppendLine("internal error: no info for nodetype '" + nodetype.ToString() + "'"); break; } if (hexlen > 0) { hex = HexRange(firsthexadr, filedata.BinaryReader, hexlen); } }
/// <summary> /// Funktion für alle NET-Datei-Infos /// </summary> /// <param name="info"></param> /// <param name="hex"></param> /// <param name="firsthexadr"></param> /// <param name="filedata"></param> /// <param name="nodetype"></param> /// <param name="idx"></param> /// <param name="tvd"></param> public static void SectionAndIndex(StringBuilder info, out byte[] hex, out long firsthexadr, NodeContent.Content4File filedata, NodeContent.NodeType nodetype, int idx, TreeViewData tvd) { GarminCore.Files.StdFile_NET net = filedata.GetGarminFileAsNET(tvd.GetLBL(filedata.Basename)); int hexlen = 0; firsthexadr = 0; hex = null; int tab = 20; switch (nodetype) { case NodeContent.NodeType.RGN_PostHeaderData: firsthexadr = net.PostHeaderDataBlock.Offset; if (idx < 0) { info.AppendLine("PostHeaderDataBlock: " + net.PostHeaderDataBlock.ToString()); hexlen = (int)net.PostHeaderDataBlock.Length; } break; case NodeContent.NodeType.NET_RoadDefinitionsBlock: firsthexadr = net.RoadDefinitionsBlock.Offset; if (idx < 0) { tab = 15; info.AppendLine("RoadDefinitionsBlock"); info.AppendLine(FillWithSpace(" Block", tab, false, net.RoadDefinitionsBlock.ToString())); info.AppendLine(FillWithSpace(" Roads", tab, false, net.Roaddata.Count.ToString())); hexlen = (int)net.RoadDefinitionsBlock.Length; } else // einzelnes Element { if ((idx & NET_IDX_ROAD) != 0) { idx &= NET_IDX_MASK; tab = 25; GarminCore.Files.StdFile_NET.RoadData rd = net.Roaddata[idx]; //info.AppendLine(rd.ToString()); string labels = rd.LabelInfo.Count.ToString(); if (rd.LabelInfo.Count > 0) { labels += " -> "; for (int i = 0; i < rd.LabelInfo.Count; i++) { if (i > 0) { labels += ", "; } labels += DecimalAndHexAndBinary(rd.LabelInfo[i]); } } info.AppendLine(FillWithSpace("Labels", tab, false, labels)); for (int i = 0; i < rd.LabelInfo.Count; i++) { info.AppendLine(FillWithSpace(" Label (LBL)" + i.ToString(), tab, true, rd.GetText(net.Lbl, i, false))); } info.AppendLine(FillWithSpace("Roaddatainfos", tab, false, rd.Roaddatainfos.ToString())); info.AppendLine(FillWithSpace("RoadLength", tab, false, rd.RoadLength.ToString() + "m")); info.AppendLine(FillWithSpace("RgnIndexOverviews", tab, false, rd.RgnIndexOverview.Count.ToString())); for (int i = 0, j = 0; i < rd.RgnIndexOverview.Count; i++) { info.Append(FillWithSpace(" RgnIndexOverview " + i.ToString(), tab, false, rd.RgnIndexOverview[i].ToString())); if (rd.RgnIndexOverview[i] > 0) { info.Append(" -> "); for (int k = 0; k < rd.RgnIndexOverview[i]; k++) { info.Append(" " + rd.Indexdata[j++].ToString()); } } info.AppendLine(); } info.AppendLine(FillWithSpace("SegmentedRoadOffsets", tab, false, rd.SegmentedRoadOffsets.Count.ToString())); for (int i = 0; i < rd.SegmentedRoadOffsets.Count; i++) { info.AppendLine(FillWithSpace(" SegmentedRoadOffsets " + i.ToString(), tab, false, DecimalAndHexAndBinary(rd.SegmentedRoadOffsets[i]))); } if (rd.HasRoadDataInfo(GarminCore.Files.StdFile_NET.RoadData.RoadDataInfo.has_street_address_info)) { // Bit 0..9 'NodeCount', Bits 10,11 für Zip; Bits 12,13 für City; Bits 14,15 für Nummbers info.AppendLine(FillWithSpace("NodeCountAndFlags", tab, false, DecimalAndHexAndBinary(rd.NodeCountAndFlags, 16))); info.AppendLine(FillWithSpace(" NodeCount", tab, false, rd.NodeCount.ToString())); info.AppendLine(FillWithSpace(" ZipFlag", tab, false, DecimalAndHexAndBinary(rd.ZipFlag))); for (int side = 0; side < rd.ZipIndex4Node.Count; side++) { if (rd.ZipIndex4Node[side].Count > 0) { info.AppendLine(FillWithSpace(side == 0 ? " Left (LBL)" : " Right (LBL)", tab, true, rd.GetZipText(net.Lbl, side == 0 ? GarminCore.Files.StdFile_NET.RoadData.Side.Left : GarminCore.Files.StdFile_NET.RoadData.Side.Right, false))); } } info.AppendLine(FillWithSpace(" CityFlag", tab, false, DecimalAndHexAndBinary(rd.CityFlag))); for (int side = 0; side < rd.CityIndex4Node.Count; side++) { if (rd.CityIndex4Node[side].Count > 0) { info.AppendLine(FillWithSpace(side == 0 ? " Left (LBL)" : " Right (LBL)", tab, true, rd.GetCityText(net.Lbl, tvd.GetRGN(filedata.Basename), side == 0 ? GarminCore.Files.StdFile_NET.RoadData.Side.Left : GarminCore.Files.StdFile_NET.RoadData.Side.Right, false))); } } string bin = ""; for (int i = 0; i < rd.NumberStream.Length; i++) { bin += Binary(rd.NumberStream[i]); } bin = Binary(rd.NumberStream); info.AppendLine(FillWithSpace(" NumberFlag, -stream", tab, false, DecimalAndHexAndBinary(rd.NumberFlag) + " " + HexString(rd.NumberStream) + " " + bin)); if (rd.NumberStream.Length > 0) { GarminCore.Files.StdFile_NET.RoadData.Housenumbers numbers = new GarminCore.Files.StdFile_NET.RoadData.Housenumbers(rd.NumberStream); for (int n = 0; n < numbers.Numbers.Count; n++) { info.AppendLine(new string(' ', tab + 3) + numbers.Numbers[n].ToString() + " (raw: " + numbers.Numbers[n].rawdata.ToString() + ")"); } } } if (rd.HasRoadDataInfo(GarminCore.Files.StdFile_NET.RoadData.RoadDataInfo.has_nod_info)) { info.AppendLine(FillWithSpace("NODFlag", tab, false, rd.NODFlag.ToString())); info.AppendLine(FillWithSpace("NOD_Offset", tab, false, DecimalAndHexAndBinary(rd.NOD_Offset))); } // für die Hex-Anzeige firsthexadr = net.RoadDefinitionsBlock.Offset; for (int i = 0; i < idx; i++) { firsthexadr += net.Roaddata[i].RawBytes; } hexlen = (int)net.Roaddata[idx].RawBytes; } } break; case NodeContent.NodeType.NET_SegmentedRoadsBlock: firsthexadr = net.RoadDefinitionsBlock.Offset; if (idx < 0) { tab = 15; info.AppendLine("SegmentedRoadsBlock"); info.AppendLine(FillWithSpace(" Block", tab, false, net.SegmentedRoadsBlock.ToString())); hexlen = (int)net.SegmentedRoadsBlock.Length; } else // einzelnes Element { } break; case NodeContent.NodeType.NET_SortedRoadsBlock: firsthexadr = net.RoadDefinitionsBlock.Offset; if (idx < 0) { tab = 15; info.AppendLine("SortedRoadsBlock"); info.AppendLine(FillWithSpace(" Block", tab, false, net.SortedRoadsBlock.ToString())); info.AppendLine(FillWithSpace(" Offsets", tab, false, net.SortedOffsets.Count.ToString())); hexlen = (int)net.SortedRoadsBlock.Length; List <uint> t1 = new List <uint>(net.SortedOffsets); t1.Sort(); } else // einzelnes Element { tab = 20; if ((idx & NET_IDX_SORTEDOFFSET) != 0) { idx &= NET_IDX_MASK; info.AppendLine(FillWithSpace("Offset", tab, false, DecimalAndHexAndBinary(net.SortedOffsets[idx]))); int offs = (int)net.SortedOffsets[idx]; for (int i = 0; i < net.Roaddata.Count; i++) { offs -= net.Roaddata[i].RawBytes; if (offs == 0) { info.AppendLine(FillWithSpace("Roaddata-Index", tab, false, i.ToString())); break; } else if (offs < 0) { info.AppendLine("Roaddata-Index not found -> error ?"); break; } } } } break; default: info.AppendLine("internal error: no info for nodetype '" + nodetype.ToString() + "'"); break; } if (hexlen > 0) { hex = HexRange(firsthexadr, filedata.BinaryReader, hexlen); } }