05ceb2e081055dc4926ac64fb95280af4aa9e29f
[mono.git] / mcs / class / corlib / System.Resources / ResourceSet.cs
1 //
2 // System.Resources.ResourceSet.cs
3 //
4 // Authors:
5 //      Duncan Mak (duncan@ximian.com)
6 //      Dick Porter (dick@ximian.com)
7 //      Andreas Nahr (ClassDevelopment@A-SoftTech.com)
8 //
9 // (C) 2001, 2002 Ximian, Inc.          http://www.ximian.com
10 // Copyright (C) 2004-2005 Novell, Inc (http://www.novell.com)
11 //
12 // Permission is hereby granted, free of charge, to any person obtaining
13 // a copy of this software and associated documentation files (the
14 // "Software"), to deal in the Software without restriction, including
15 // without limitation the rights to use, copy, modify, merge, publish,
16 // distribute, sublicense, and/or sell copies of the Software, and to
17 // permit persons to whom the Software is furnished to do so, subject to
18 // the following conditions:
19 // 
20 // The above copyright notice and this permission notice shall be
21 // included in all copies or substantial portions of the Software.
22 // 
23 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
24 // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
25 // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
26 // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
27 // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
28 // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
29 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
30 //
31
32 using System.Collections;
33 using System.IO;
34 using System.Globalization;
35 using System.Runtime.InteropServices;
36 using System.Security.Permissions;
37
38 namespace System.Resources
39 {
40         [Serializable]
41 #if NET_2_0
42         [ComVisible (true)]
43 #endif
44         public class ResourceSet : IDisposable
45
46 #if (NET_1_1)
47                                                 , IEnumerable
48 #endif
49
50         {
51
52 #if NET_2_0
53                 [NonSerialized]
54 #endif
55                 protected IResourceReader Reader;
56                 protected Hashtable Table;
57
58                 // Constructors
59                 protected ResourceSet () {}
60
61                 public ResourceSet (IResourceReader reader)
62                 {
63                         if (reader == null)
64                                 throw new ArgumentNullException ("The reader is null.");
65                         Reader = reader;
66                 }
67
68                 [SecurityPermission (SecurityAction.LinkDemand, SerializationFormatter = true)]
69                 public ResourceSet (Stream stream)
70                 {
71                         if(stream==null) {
72                                 throw new ArgumentNullException("stream is null");
73                         }
74
75                         if(!stream.CanRead) {
76                                 throw new ArgumentException("stream is not readable");
77                         }
78                         
79                         Reader = new ResourceReader (stream);
80                 }
81
82                 public ResourceSet (String fileName)
83                 {
84                         if(fileName==null) {
85                                 throw new ArgumentNullException("filename is null");
86                         }
87                         
88                         Reader = new ResourceReader (fileName);
89                 }
90
91                 public virtual void Close ()
92                 {
93                         Dispose (true);
94                 }
95
96                 public void Dispose()
97                 {
98                         Dispose (true);
99                 }
100
101                 protected virtual void Dispose (bool disposing)
102                 {
103                         if (disposing) {
104                                 if(Reader!=null) {
105                                         Reader.Close();
106                                 }
107                         }
108
109                         Reader = null;
110                         Table = null;
111                 }
112
113                 public virtual Type GetDefaultReader ()
114                 {
115                         return (typeof (ResourceReader));
116                 } 
117                 public virtual Type GetDefaultWriter ()
118                 {
119                         return (typeof (ResourceWriter));
120                 }
121
122 #if (NET_1_1)
123
124                 [ComVisible (false)]
125                 public virtual IDictionaryEnumerator GetEnumerator ()
126                 {
127                         if (Table == null)
128                                 ReadResources ();
129                         return Table.GetEnumerator(); 
130                 }
131
132                 IEnumerator IEnumerable.GetEnumerator ()
133                 {
134                         return this.GetEnumerator (); 
135                 }
136
137 #endif
138
139                 public virtual object GetObject (string name)
140                 {
141                         if (name == null)
142                                 throw new ArgumentNullException ("The name parameter is null.");
143                         if (Reader == null)
144                                 throw new InvalidOperationException ("The ResourceSet has been closed.");
145
146                         if (Table == null) { 
147                                 ReadResources ();
148                         }
149                         
150                         return(Table[name]);
151                 }
152
153                 public virtual object GetObject (string name, bool ignoreCase)
154                 {
155                         if (name == null)
156                                 throw new ArgumentNullException ("The name parameter is null.");
157                         if (Reader == null)
158                                 throw new InvalidOperationException ("ResourceSet has been closed.");
159                         if (Table == null)
160                                 ReadResources ();
161
162                         if (ignoreCase) {
163                                 foreach (DictionaryEntry de in Table) {
164                                         string key = (string) de.Key;
165                                         if (String.Compare (key, name, true, CultureInfo.InvariantCulture) == 0)
166                                                 return de.Value;
167                                 }
168                                 return null;
169                         } else
170                                 return Table[name];
171                 }
172
173                 public virtual string GetString (string name)
174                 {
175                         Object o = GetObject (name);
176                         if (o == null)
177                                 return null;
178                         if (o is string)
179                                 return (string) o;
180                         throw new InvalidOperationException("Not a string");
181                 }
182
183                 public virtual string GetString (string name, bool ignoreCase)
184                 {
185                         Object o = GetObject (name, ignoreCase);
186                         if (o == null)
187                                 return null;
188                         if (o is string)
189                                 return (string) o;
190                         throw new InvalidOperationException("Not a string");
191                 }
192
193                 protected virtual void ReadResources ()
194                 {
195                         if (Reader == null)
196                                 throw new InvalidOperationException ("ResourceSet is closed.");
197                         
198                         IDictionaryEnumerator i = Reader.GetEnumerator();
199
200                         if (Table == null)
201                                 Table = new Hashtable ();
202                         i.Reset ();
203
204                         while (i.MoveNext ()) 
205                                 Table.Add (i.Key, i.Value);
206                 }
207
208 #if NET_2_0
209                 internal UnmanagedMemoryStream GetStream (string name)
210                 {
211                         if (Reader == null)
212                                 throw new InvalidOperationException ("ResourceSet is closed.");
213
214                         IDictionaryEnumerator i = Reader.GetEnumerator();
215                         i.Reset ();
216                         while (i.MoveNext ())
217                                 if (name == (string) i.Key)
218                                         return ((ResourceReader.ResourceEnumerator) i).ValueAsStream;
219                         return null;
220                 }
221 #endif
222         }
223 }