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