Hi all,

Here is a small patch to add missing things to ResXResourceReader.
Can someone check it before I commit.

Thanks,
cheers,
olivier
Index: ResXResourceReader.cs
===================================================================
--- ResXResourceReader.cs       (révision 90372)
+++ ResXResourceReader.cs       (copie de travail)
@@ -37,6 +37,7 @@
 using System.Resources;
 using System.Runtime.Serialization.Formatters.Binary;
 using System.Xml;
+using System.Reflection;
 
 namespace System.Resources
 {
@@ -48,11 +49,14 @@
                private TextReader reader;
                private Hashtable hasht;
                private ITypeResolutionService typeresolver;
-
                private XmlTextReader xmlReader;
 
+
 #if NET_2_0
                private string basepath;
+        private bool useResXDataNodes;
+        private AssemblyName[] assemblyNames;
+        private Hashtable hashtm;
 #endif
                #endregion      // Local Variables
 
@@ -66,7 +70,10 @@
                                throw new ArgumentException ("Stream was not 
readable.");
 
                        this.stream = stream;
-               }
+#if NET_2_0
+            this.useResXDataNodes = false;
+#endif
+        }
 
                public ResXResourceReader (Stream stream, 
ITypeResolutionService typeresolver)
                        : this (stream)
@@ -77,7 +84,10 @@
                public ResXResourceReader (string fileName)
                {
                        this.fileName = fileName;
-               }
+#if NET_2_0
+            this.useResXDataNodes = false;
+#endif
+        }
 
                public ResXResourceReader (string fileName, 
ITypeResolutionService typeresolver)
                        : this (fileName)
@@ -88,6 +98,9 @@
                public ResXResourceReader (TextReader reader)
                {
                        this.reader = reader;
+#if NET_2_0
+            this.useResXDataNodes = false;
+#endif
                }
 
                public ResXResourceReader (TextReader reader, 
ITypeResolutionService typeresolver)
@@ -96,6 +109,28 @@
                        this.typeresolver = typeresolver;
                }
 
+#if NET_2_0
+
+        public ResXResourceReader(Stream stream, AssemblyName[] assemblyNames)
+            : this(stream)
+        {
+            this.assemblyNames = assemblyNames;
+        }
+
+        public ResXResourceReader(string fileName, AssemblyName[] 
assemblyNames)
+            : this(fileName)
+        {
+            this.assemblyNames = assemblyNames;
+        }
+
+        public ResXResourceReader(TextReader reader, AssemblyName[] 
assemblyNames)
+            : this(reader)
+        {
+            this.assemblyNames = assemblyNames;
+        }
+
+
+#endif
                ~ResXResourceReader ()
                {
                        Dispose (false);
@@ -107,11 +142,23 @@
                        get { return basepath; }
                        set { basepath = value; }
                }
+        public bool UseResXDataNodes {
+            get { return useResXDataNodes; }
+            set {
+                if (xmlReader != null)
+                    throw new InvalidOperationException();
+                useResXDataNodes = value; 
+            }
+        }
 #endif
 
                #region Private Methods
                private void LoadData ()
                {
+            hasht = new Hashtable();
+#if NET_2_0
+            hashtm = new Hashtable();
+#endif
                        if (fileName != null) {
                                stream = File.OpenRead (fileName);
                        }
@@ -141,8 +188,13 @@
                                                        ParseHeaderNode 
(header);
                                                        break;
                                                case "data":
-                                                       ParseDataNode ();
+                            ParseDataNode(hasht);
                                                        break;
+#if NET_2_0
+                        case "metadata":
+                            ParseDataNode(hashtm);
+                            break;
+#endif
                                                }
                                        }
 #if NET_2_0
@@ -165,6 +217,7 @@
                                        stream.Close ();
                                        stream = null;
                                }
+                xmlReader = null;
                        }
                }
 
@@ -249,7 +302,7 @@
                        return value;
                }
 
-               private void ParseDataNode ()
+        private void ParseDataNode (Hashtable hashtable)
                {
                        string name = GetAttribute ("name");
                        string type_name = GetAttribute ("type");
@@ -262,7 +315,13 @@
                                        "The type '{0}' of the element '{1}' 
could not be resolved.", type_name, name));
 
                        if (type == typeof (ResXNullRef)) {
-                               hasht [name] = null;
+                               
+#if NET_2_0
+                if (useResXDataNodes)
+                    hashtable[name] = new ResXDataNode(name, null);
+                else
+#endif
+                    hashtable[name] = null;
                                return;
                        }
 
@@ -315,17 +374,35 @@
                                throw new ArgumentException (string.Format 
(CultureInfo.CurrentCulture,
                                        "Could not find a name for a resource. 
The resource value "
                                        + "was '{0}'.", obj));
-
-                       hasht [name] = obj;
+#if NET_2_0
+            if (useResXDataNodes)
+                hashtable[name] = new ResXDataNode(name, obj);
+            else
+#endif
+                hashtable[name] = obj;
                }
 
                private Type ResolveType (string type)
                {
-                       if (typeresolver == null) {
-                               return Type.GetType (type);
-                       } else {
+                       if (typeresolver != null) {
                                return typeresolver.GetType (type);
-                       }
+                       } 
+#if NET_2_0
+            if (assemblyNames != null) {
+                Type result;
+                foreach (AssemblyName ass in assemblyNames) {
+                    Assembly myAssembly = Assembly.Load(AssemblyName);
+                    result = myAssembly.GetType(type, false);
+                    if (result != null)
+                        return result;
+                    //else loop
+                }
+                //if type not found on assembly list we return null or we get 
from current assembly?
+                //=> unit test needed
+            }
+#endif
+            return Type.GetType(type);
+
                }
                #endregion      // Private Methods
 
@@ -341,7 +418,6 @@
                public IDictionaryEnumerator GetEnumerator ()
                {
                        if (hasht == null) {
-                               hasht = new Hashtable ();
                                LoadData ();
                        }
                        return hasht.GetEnumerator ();
@@ -374,7 +450,19 @@
                {
                        return new ResXResourceReader (new StringReader 
(fileContents), typeResolver);
                }
+#if NET_2_0
+        public static ResXResourceReader FromFileContents(string fileContents, 
AssemblyName[] assemblyNames)
+               {
+            return new ResXResourceReader(new StringReader(fileContents), 
assemblyNames);
+               }
 
+        public IDictionaryEnumerator GetMetadataEnumerator()
+        {
+            if (hashtm == null)
+                LoadData();
+            return hashtm;
+        }
+#endif
                #endregion      // Public Methods
 
                #region Internal Classes
@@ -432,4 +520,4 @@
                }
                #endregion
        }
-}
+}
\ Pas de fin de ligne à la fin du fichier
_______________________________________________
Mono-devel-list mailing list
Mono-devel-list@lists.ximian.com
http://lists.ximian.com/mailman/listinfo/mono-devel-list

Reply via email to