**** Merged from MCS ****
[mono-project.git] / mcs / class / System.Windows.Forms / System.Resources / ResXResourceReader.cs
blob925b7671e96759c9043053c652ff209f7f36188d
1 //
2 // System.Resources.ResXResourceReader.cs
3 //
4 // Authors:
5 // Duncan Mak <duncan@ximian.com>
6 // Nick Drochak <ndrochak@gol.com>
7 // Paolo Molaro <lupus@ximian.com>
8 //
9 // 2001 (C) Ximian Inc, http://www.ximian.com
11 // TODO: Finish this
13 using System.Collections;
14 using System.Resources;
15 using System.IO;
16 using System.Xml;
18 namespace System.Resources
20 public sealed class ResXResourceReader : IResourceReader, IDisposable
22 Stream stream;
23 XmlTextReader reader;
24 Hashtable hasht;
26 // Constructors
27 public ResXResourceReader (Stream stream)
29 if (stream == null)
30 throw new ArgumentNullException ("Value cannot be null.");
32 if (!stream.CanRead)
33 throw new ArgumentException ("Stream was not readable.");
35 this.stream = stream;
36 basic_setup ();
39 public ResXResourceReader (string fileName)
41 stream = File.OpenRead (fileName);
42 basic_setup ();
45 void basic_setup () {
46 reader = new XmlTextReader (stream);
47 hasht = new Hashtable ();
49 if (!IsStreamValid()){
50 throw new ArgumentException("Stream is not a valid .resx file! It was possibly truncated.");
52 load_data ();
55 static string get_attr (XmlTextReader reader, string name) {
56 if (!reader.HasAttributes)
57 return null;
58 for (int i = 0; i < reader.AttributeCount; i++) {
59 reader.MoveToAttribute (i);
60 if (String.Compare (reader.Name, name, true) == 0) {
61 string v = reader.Value;
62 reader.MoveToElement ();
63 return v;
66 reader.MoveToElement ();
67 return null;
70 static string get_value (XmlTextReader reader, string name) {
71 bool gotelement = false;
72 while (reader.Read ()) {
73 if (reader.NodeType == XmlNodeType.Element && String.Compare (reader.Name, name, true) == 0) {
74 gotelement = true;
75 break;
78 if (!gotelement)
79 return null;
80 while (reader.Read ()) {
81 if (reader.NodeType == XmlNodeType.Text || reader.NodeType == XmlNodeType.CDATA) {
82 string v = reader.Value;
83 return v;
85 else if (reader.NodeType == XmlNodeType.EndElement && reader.Value == string.Empty)
87 string v = reader.Value;
88 return v;
91 return null;
94 private bool IsStreamValid() {
95 bool gotroot = false;
96 bool gotmime = false;
98 while (reader.Read ()) {
99 if (reader.NodeType == XmlNodeType.Element && String.Compare (reader.Name, "root", true) == 0) {
100 gotroot = true;
101 break;
104 if (!gotroot)
105 return false;
106 while (reader.Read ()) {
107 if (reader.NodeType == XmlNodeType.Element && String.Compare (reader.Name, "resheader", true) == 0) {
108 string v = get_attr (reader, "name");
109 if (v != null && String.Compare (v, "resmimetype", true) == 0) {
110 v = get_value (reader, "value");
111 if (String.Compare (v, "text/microsoft-resx", true) == 0) {
112 gotmime = true;
113 break;
116 } else if (reader.NodeType == XmlNodeType.Element && String.Compare (reader.Name, "data", true) == 0) {
117 /* resheader apparently can appear anywhere, so we collect
118 * the data even if we haven't validated yet.
120 string n = get_attr (reader, "name");
121 if (n != null) {
122 string v = get_value (reader, "value");
123 hasht [n] = v;
127 return gotmime;
130 private void load_data ()
132 while (reader.Read ()) {
133 if (reader.NodeType == XmlNodeType.Element && String.Compare (reader.Name, "data", true) == 0) {
134 string n = get_attr (reader, "name");
135 if (n != null) {
136 string v = get_value (reader, "value");
137 hasht [n] = v;
143 public void Close ()
145 stream.Close ();
146 stream = null;
149 public IDictionaryEnumerator GetEnumerator () {
150 if (null == stream){
151 throw new InvalidOperationException("ResourceReader is closed.");
153 else {
154 return hasht.GetEnumerator ();
158 IEnumerator IEnumerable.GetEnumerator ()
160 return ((IResourceReader) this).GetEnumerator();
163 [MonoTODO]
164 void IDisposable.Dispose ()
166 // FIXME: is this all we need to do?
167 Close();
170 } // public sealed class ResXResourceReader
171 } // namespace System.Resources