2005-01-31 Zoltan Varga <vargaz@freemail.hu>
[mono.git] / mcs / class / Mono.PEToolkit / metadata / MDTable.cs
1 /*\r
2  * Copyright (c) 2002 Sergey Chaban <serge@wildwestsoftware.com>\r
3  */\r
4 \r
5 using System;\r
6 using System.IO;\r
7 using System.Collections;\r
8 using System.Runtime.InteropServices;\r
9 \r
10 namespace Mono.PEToolkit.Metadata {\r
11 \r
12         public interface MDTable {\r
13                 /// <summary>\r
14                 /// Number of rows in the table.\r
15                 /// </summary>\r
16                 int NumberOfRows {get;}\r
17 \r
18                 /// <summary>\r
19                 /// Gets ot sets a row in the metadata table.\r
20                 /// </summary>\r
21                 Row this [int rowNum] {get; set;}\r
22 \r
23                 void Add(Row row);\r
24 \r
25                 void FromRawData(byte [] buff, int offs, int numRows);\r
26 \r
27                 string Name {get;}\r
28 \r
29                 TableId Id {get;}\r
30 \r
31                 MDHeap Heap {get;}\r
32 \r
33                 void Dump(TextWriter writer);\r
34         }\r
35 \r
36 \r
37         public abstract class MDTableBase : MDTable {\r
38                 protected ArrayList rows; // rows storage\r
39                 protected MDHeap heap;    // base heap\r
40 \r
41                 public MDTableBase(MDHeap heap)\r
42                 {\r
43                         rows = new ArrayList();\r
44                         this.heap = heap;\r
45 \r
46                         if (heap is TablesHeap) {\r
47                                 (heap as TablesHeap).RegisterTable(this);\r
48                         }\r
49                 }\r
50 \r
51                 public virtual int NumberOfRows {\r
52                         get {\r
53                                 return rows.Count;\r
54                         }\r
55                 }\r
56 \r
57 \r
58                 public virtual Row this [int rowNum] {\r
59                         get {\r
60                                 if (rowNum < 0) throw new IndexOutOfRangeException("Row[]");\r
61 \r
62                                 // Zero row, special case\r
63                                 if (rowNum == 0) return NullRow.Instance;\r
64                                 return rows [rowNum - 1] as Row;\r
65                         }\r
66                         set {\r
67                                 rows.Insert(rowNum, value);\r
68                         }\r
69                 }\r
70 \r
71                 public virtual void Add(Row row)\r
72                 {\r
73                         rows.Add(row);\r
74                 }\r
75 \r
76                 public abstract void FromRawData(byte [] buff, int offs, int numRows);\r
77 \r
78                 public abstract string Name {get;}\r
79 \r
80                 public abstract TableId Id {get;}\r
81 \r
82                 public virtual MDHeap Heap {\r
83                         get {\r
84                                 return heap;\r
85                         }\r
86                 }\r
87 \r
88                 public virtual void Dump(TextWriter writer)\r
89                 {\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
93                         int n = 1;\r
94                         foreach (Row row in rows) {\r
95                                 writer.WriteLine();\r
96                                 writer.WriteLine("Row #{0}", n++);\r
97                                 writer.WriteLine("-------------");\r
98                                 row.Dump(writer);\r
99                                 writer.WriteLine();\r
100                         }\r
101                 }\r
102 \r
103         }\r
104 \r
105 }\r