2 * Copyright (c) 2002 Sergey Chaban <serge@wildwestsoftware.com>
\r
7 using System.Collections;
\r
8 using System.Runtime.InteropServices;
\r
10 namespace Mono.PEToolkit.Metadata {
\r
12 public interface MDTable {
\r
14 /// Number of rows in the table.
\r
16 int NumberOfRows {get;}
\r
19 /// Gets ot sets a row in the metadata table.
\r
21 Row this [int rowNum] {get; set;}
\r
25 void FromRawData(byte [] buff, int offs, int numRows);
\r
33 void Dump(TextWriter writer);
\r
37 public abstract class MDTableBase : MDTable {
\r
38 protected ArrayList rows; // rows storage
\r
39 protected MDHeap heap; // base heap
\r
41 public MDTableBase(MDHeap heap)
\r
43 rows = new ArrayList();
\r
46 if (heap is TablesHeap) {
\r
47 (heap as TablesHeap).RegisterTable(this);
\r
51 public virtual int NumberOfRows {
\r
58 public virtual Row this [int rowNum] {
\r
60 if (rowNum < 0) throw new IndexOutOfRangeException("Row[]");
\r
62 // Zero row, special case
\r
63 if (rowNum == 0) return NullRow.Instance;
\r
64 return rows [rowNum - 1] as Row;
\r
67 rows.Insert(rowNum, value);
\r
71 public virtual void Add(Row row)
\r
76 public abstract void FromRawData(byte [] buff, int offs, int numRows);
\r
78 public abstract string Name {get;}
\r
80 public abstract TableId Id {get;}
\r
82 public virtual MDHeap Heap {
\r
88 public virtual void Dump(TextWriter writer)
\r
90 writer.WriteLine("=========================================");
\r
91 writer.WriteLine("Table '{0}', id = {1} (0x{2}), rows = {3}",
\r
92 Name, Id, ((int) Id).ToString("X"), NumberOfRows);
\r
94 foreach (Row row in rows) {
\r
96 writer.WriteLine("Row #{0}", n++);
\r
97 writer.WriteLine("-------------");
\r