Author: olivier
Date: 2007-12-07 03:05:41 -0500 (Fri, 07 Dec 2007)
New Revision: 90895
Modified:
trunk/mcs/class/Managed.Windows.Forms/System.Resources/ChangeLog
trunk/mcs/class/Managed.Windows.Forms/System.Resources/ResXResourceReader.cs
Log:
2007-12-01 Olivier Dufour <[EMAIL PROTECTED]>
* ResXResourceReader.cs: Add support of assemblyName, metadata and
useResXDataNode.
Modified: trunk/mcs/class/Managed.Windows.Forms/System.Resources/ChangeLog
===================================================================
--- trunk/mcs/class/Managed.Windows.Forms/System.Resources/ChangeLog
2007-12-07 08:04:51 UTC (rev 90894)
+++ trunk/mcs/class/Managed.Windows.Forms/System.Resources/ChangeLog
2007-12-07 08:05:41 UTC (rev 90895)
@@ -1,3 +1,7 @@
+2007-12-01 Olivier Dufour <[EMAIL PROTECTED]>
+
+ * ResXResourceReader.cs: Add support of assemblyName, metadata and
useResXDataNode.
+
2007-09-09 Gert Driesen <[EMAIL PROTECTED]>
* ResXResourceReader.cs: First consider MIME type, if set, regardless
Modified:
trunk/mcs/class/Managed.Windows.Forms/System.Resources/ResXResourceReader.cs
===================================================================
---
trunk/mcs/class/Managed.Windows.Forms/System.Resources/ResXResourceReader.cs
2007-12-07 08:04:51 UTC (rev 90894)
+++
trunk/mcs/class/Managed.Windows.Forms/System.Resources/ResXResourceReader.cs
2007-12-07 08:05:41 UTC (rev 90895)
@@ -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 (false);
break;
+#if NET_2_0
+ case "metadata":
+ ParseDataNode (true);
+ break;
+#endif
}
}
#if NET_2_0
@@ -165,6 +217,7 @@
stream.Close ();
stream = null;
}
+ xmlReader = null;
}
}
@@ -213,12 +266,12 @@
return null;
}
- private string GetDataValue ()
+ private string GetDataValue (bool meta)
{
string value = null;
#if NET_2_0
while (xmlReader.Read ()) {
- if (xmlReader.NodeType ==
XmlNodeType.EndElement && xmlReader.LocalName == "data")
+ if (xmlReader.NodeType ==
XmlNodeType.EndElement && xmlReader.LocalName == (meta ? "metadata" : "data"))
break;
if (xmlReader.NodeType == XmlNodeType.Element) {
@@ -228,7 +281,7 @@
xmlReader.WhitespaceHandling =
WhitespaceHandling.None;
} else if (xmlReader.Name.Equals
("comment")) {
xmlReader.Skip ();
- if (xmlReader.NodeType ==
XmlNodeType.EndElement && xmlReader.LocalName == "data")
+ if (xmlReader.NodeType ==
XmlNodeType.EndElement && xmlReader.LocalName == (meta ? "metadata" : "data"))
break;
}
}
@@ -249,11 +302,12 @@
return value;
}
- private void ParseDataNode ()
+ private void ParseDataNode (bool meta)
{
string name = GetAttribute ("name");
string type_name = GetAttribute ("type");
string mime_type = GetAttribute ("mimetype");
+ Hashtable hashtable = (meta ? hashtm : hasht);
Type type = type_name == null ? null : ResolveType
(type_name);
@@ -262,11 +316,17 @@
"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;
}
- string value = GetDataValue ();
+ string value = GetDataValue (meta);
object obj = null;
if (mime_type != null && mime_type.Length > 0) {
@@ -315,17 +375,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 assem in assemblyNames) {
+ Assembly myAssembly = Assembly.Load
(assem);
+ 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 +419,6 @@
public IDictionaryEnumerator GetEnumerator ()
{
if (hasht == null) {
- hasht = new Hashtable ();
LoadData ();
}
return hasht.GetEnumerator ();
@@ -374,7 +451,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.GetEnumerator ();
+ }
+#endif
#endregion // Public Methods
#region Internal Classes
_______________________________________________
Mono-patches maillist - [email protected]
http://lists.ximian.com/mailman/listinfo/mono-patches