2 // System.Resources.ResXResourceReader.cs
5 // Duncan Mak <duncan@ximian.com>
6 // Nick Drochak <ndrochak@gol.com>
7 // Paolo Molaro <lupus@ximian.com>
9 // 2001 (C) Ximian Inc, http://www.ximian.com
13 using System
.Collections
;
14 using System
.Resources
;
18 namespace System
.Resources
20 public sealed class ResXResourceReader
: IResourceReader
, IDisposable
27 public ResXResourceReader (Stream stream
)
30 throw new ArgumentNullException ("Value cannot be null.");
33 throw new ArgumentException ("Stream was not readable.");
39 public ResXResourceReader (string fileName
)
41 stream
= File
.OpenRead (fileName
);
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.");
55 static string get_attr (XmlTextReader reader
, string name
) {
56 if (!reader
.HasAttributes
)
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 ();
66 reader
.MoveToElement ();
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) {
80 while (reader
.Read ()) {
81 if (reader
.NodeType
== XmlNodeType
.Text
|| reader
.NodeType
== XmlNodeType
.CDATA
) {
82 string v
= reader
.Value
;
85 else if (reader
.NodeType
== XmlNodeType
.EndElement
&& reader
.Value
== string.Empty
)
87 string v
= reader
.Value
;
94 private bool IsStreamValid() {
98 while (reader
.Read ()) {
99 if (reader
.NodeType
== XmlNodeType
.Element
&& String
.Compare (reader
.Name
, "root", true) == 0) {
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) {
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");
122 string v
= get_value (reader
, "value");
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");
136 string v
= get_value (reader
, "value");
149 public IDictionaryEnumerator
GetEnumerator () {
151 throw new InvalidOperationException("ResourceReader is closed.");
154 return hasht
.GetEnumerator ();
158 IEnumerator IEnumerable
.GetEnumerator ()
160 return ((IResourceReader
) this).GetEnumerator();
164 void IDisposable
.Dispose ()
166 // FIXME: is this all we need to do?
170 } // public sealed class ResXResourceReader
171 } // namespace System.Resources