Author: gert
Date: 2007-09-09 05:18:01 -0400 (Sun, 09 Sep 2007)
New Revision: 85529

Modified:
   trunk/mcs/class/Managed.Windows.Forms/System.Resources/ChangeLog
   trunk/mcs/class/Managed.Windows.Forms/System.Resources/ResXResourceReader.cs
   
trunk/mcs/class/Managed.Windows.Forms/Test/System.Resources/ResXResourceReaderTest.cs
Log:
 * ResXResourceReaderTest.cs: Added type conversion test.
* ResXResourceReader.cs: First consider MIME type, if set, regardless
of the presence of a type attribute. Only convert from base64 string
if "mimetype" is "...bytearray.base64" and type is set. When no MIME
type is set, ignore value of resource with a type, if the type is not
byte [] or has no TypeConverter that can convert from string. On 1.0
profile, use string value if "mimetype" or "type" are set and no
conversion was done.


Modified: trunk/mcs/class/Managed.Windows.Forms/System.Resources/ChangeLog
===================================================================
--- trunk/mcs/class/Managed.Windows.Forms/System.Resources/ChangeLog    
2007-09-08 23:43:59 UTC (rev 85528)
+++ trunk/mcs/class/Managed.Windows.Forms/System.Resources/ChangeLog    
2007-09-09 09:18:01 UTC (rev 85529)
@@ -1,3 +1,13 @@
+2007-09-09  Gert Driesen  <[EMAIL PROTECTED]>
+
+       * ResXResourceReader.cs: First consider MIME type, if set, regardless
+       of the presence of a type attribute. Only convert from base64 string
+       if "mimetype" is "...bytearray.base64" and type is set. When no MIME
+       type is set, ignore value of resource with a type, if the type is not
+       byte [] or has no TypeConverter that can convert from string. On 1.0
+       profile, use string value if "mimetype" or "type" are set and no
+       conversion was done.
+
 2007-05-23  Andreia Gaita <[EMAIL PROTECTED]>
 
        * ResXResourceReader.cs: Ignore comment nodes, for now. Fix 

Modified: 
trunk/mcs/class/Managed.Windows.Forms/System.Resources/ResXResourceReader.cs
===================================================================
--- 
trunk/mcs/class/Managed.Windows.Forms/System.Resources/ResXResourceReader.cs    
    2007-09-08 23:43:59 UTC (rev 85528)
+++ 
trunk/mcs/class/Managed.Windows.Forms/System.Resources/ResXResourceReader.cs    
    2007-09-09 09:18:01 UTC (rev 85529)
@@ -269,48 +269,48 @@
                        string value = GetDataValue ();
                        object obj = null;
 
-                       if (type != null) {
-                               TypeConverter c = TypeDescriptor.GetConverter 
(type);
-
-                               if (c == null) {
-                                       obj = null;
-                               } else if (c.CanConvertFrom (typeof (string))) {
-#if NET_2_0
-                                       if (BasePath != null && type == typeof 
(ResXFileRef)) {
-                                               string [] parts = 
ResXFileRef.Parse (value);
-                                               parts [0] = Path.Combine 
(BasePath, parts [0]);
-                                               obj = 
c.ConvertFromInvariantString (string.Join (";", parts));
-                                       } else {
-                                               obj = 
c.ConvertFromInvariantString (value);
-                                       }
-#else
-                                       obj = c.ConvertFromInvariantString 
(value);
-#endif
-                               } else if (c.CanConvertFrom (typeof (byte []))) 
{
-                                       obj = c.ConvertFrom 
(Convert.FromBase64String (value));
-                               } else {
-                                       // the type must be a byte[]
-                                       obj = Convert.FromBase64String (value);
-                               }
-                       } else if (mime_type != null && mime_type != 
String.Empty) {
+                       if (mime_type != null && mime_type.Length > 0) {
                                if (mime_type == 
ResXResourceWriter.BinSerializedObjectMimeType) {
                                        byte [] data = Convert.FromBase64String 
(value);
                                        BinaryFormatter f = new BinaryFormatter 
();
                                        using (MemoryStream s = new 
MemoryStream (data)) {
                                                obj = f.Deserialize (s);
                                        }
+                               } else if (mime_type == 
ResXResourceWriter.ByteArraySerializedObjectMimeType) {
+                                       if (type != null) {
+                                               TypeConverter c = 
TypeDescriptor.GetConverter (type);
+                                               if (c.CanConvertFrom (typeof 
(byte [])))
+                                                       obj = c.ConvertFrom 
(Convert.FromBase64String (value));
+                                       }
+                               }
+                       } else if (type != null) {
+                               if (type == typeof (byte [])) {
+                                       obj = Convert.FromBase64String (value);
                                } else {
-                                       // invalid mime type
+                                       TypeConverter c = 
TypeDescriptor.GetConverter (type);
+                                       if (c.CanConvertFrom (typeof (string))) 
{
 #if NET_2_0
-                                       obj = null;
+                                               if (BasePath != null && type == 
typeof (ResXFileRef)) {
+                                                       string [] parts = 
ResXFileRef.Parse (value);
+                                                       parts [0] = 
Path.Combine (BasePath, parts [0]);
+                                                       obj = 
c.ConvertFromInvariantString (string.Join (";", parts));
+                                               } else {
+                                                       obj = 
c.ConvertFromInvariantString (value);
+                                               }
 #else
-                                       obj = value;
+                                               obj = 
c.ConvertFromInvariantString (value);
 #endif
+                                       }
                                }
                        } else {
                                obj = value;
                        }
 
+#if ONLY_1_1
+                       if (obj == null)
+                               obj = value;
+#endif
+
                        if (name == null)
                                throw new ArgumentException (string.Format 
(CultureInfo.CurrentCulture,
                                        "Could not find a name for a resource. 
The resource value "

Modified: 
trunk/mcs/class/Managed.Windows.Forms/Test/System.Resources/ResXResourceReaderTest.cs
===================================================================
--- 
trunk/mcs/class/Managed.Windows.Forms/Test/System.Resources/ResXResourceReaderTest.cs
       2007-09-08 23:43:59 UTC (rev 85528)
+++ 
trunk/mcs/class/Managed.Windows.Forms/Test/System.Resources/ResXResourceReaderTest.cs
       2007-09-09 09:18:01 UTC (rev 85529)
@@ -12,6 +12,7 @@
 using System.IO;
 using System.Resources;
 using System.Text;
+using System.Windows.Forms;
 using System.Xml;
 
 using NUnit.Framework;
@@ -1471,6 +1472,161 @@
                        }
                }
 
+               [Test]
+               public void TypeConversion ()
+               {
+                       string resXContent = string.Format 
(CultureInfo.CurrentCulture,
+                               "<?xml version=\"1.0\" encoding=\"utf-8\"?>" +
+                               "<root>" +
+                               "       <resheader name=\"resmimetype\">" +
+                               "               <value>{0}</value>" +
+                               "       </resheader>" +
+                               "       <resheader name=\"reader\">" +
+                               "               
<value>System.Resources.ResXResourceReader, {1}</value>" +
+                               "       </resheader>" +
+                               "       <resheader name=\"writer\">" +
+                               "               
<value>System.Resources.ResXResourceWriter, {1}</value>" +
+                               "       </resheader>" +
+                               "       <data name=\"AnchorStyle\" 
type=\"System.Windows.Forms.AnchorStyles, {1}\">" +
+                               "               <value>Bottom, Left</value>" +
+                               "       </data>" +
+                               "       <data name=\"BackgroundImage\" 
type=\"{2}\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">" 
+
+                               "               <value>" +
+                               "                       
Qk12BQAAAAAAADYEAAAoAAAAEgAAABAAAAABAAgAAAAAAAAAAAAgHAAAIBwAAAABAAAAAQAAAAAA/wAA"
 +
+                               "                       
M/8AAGb/AACZ/wAAzP8AAP//ADMA/wAzM/8AM2b/ADOZ/wAzzP8AM///AGYA/wBmM/8AZmb/AGaZ/wBm"
 +
+                               "                       
zP8AZv//AJkA/wCZM/8AmWb/AJmZ/wCZzP8Amf//AMwA/wDMM/8AzGb/AMyZ/wDMzP8AzP//AP8A/wD/"
 +
+                               "                       
M/8A/2b/AP+Z/wD/zP8A////MwAA/zMAM/8zAGb/MwCZ/zMAzP8zAP//MzMA/zMzM/8zM2b/MzOZ/zMz"
 +
+                               "                       
zP8zM///M2YA/zNmM/8zZmb/M2aZ/zNmzP8zZv//M5kA/zOZM/8zmWb/M5mZ/zOZzP8zmf//M8wA/zPM"
 +
+                               "                       
M/8zzGb/M8yZ/zPMzP8zzP//M/8A/zP/M/8z/2b/M/+Z/zP/zP8z////ZgAA/2YAM/9mAGb/ZgCZ/2YA"
 +
+                               "                       
zP9mAP//ZjMA/2YzM/9mM2b/ZjOZ/2YzzP9mM///ZmYA/2ZmM/9mZmb/ZmaZ/2ZmzP9mZv//ZpkA/2aZ"
 +
+                               "                       
M/9mmWb/ZpmZ/2aZzP9mmf//ZswA/2bMM/9mzGb/ZsyZ/2bMzP9mzP//Zv8A/2b/M/9m/2b/Zv+Z/2b/"
 +
+                               "                       
zP9m////mQAA/5kAM/+ZAGb/mQCZ/5kAzP+ZAP//mTMA/5kzM/+ZM2b/mTOZ/5kzzP+ZM///mWYA/5lm"
 +
+                               "                       
M/+ZZmb/mWaZ/5lmzP+ZZv//mZkA/5mZM/+ZmWb/mZmZ/5mZzP+Zmf//mcwA/5nMM/+ZzGb/mcyZ/5nM"
 +
+                               "                       
zP+ZzP//mf8A/5n/M/+Z/2b/mf+Z/5n/zP+Z////zAAA/8wAM//MAGb/zACZ/8wAzP/MAP//zDMA/8wz"
 +
+                               "                       
M//MM2b/zDOZ/8wzzP/MM///zGYA/8xmM//MZmb/zGaZ/8xmzP/MZv//zJkA/8yZM//MmWb/zJmZ/8yZ"
 +
+                               "                       
zP/Mmf//zMwA/8zMM//MzGb/zMyZ/8zMzP/MzP//zP8A/8z/M//M/2b/zP+Z/8z/zP/M/////wAA//8A"
 +
+                               "                       
M///AGb//wCZ//8AzP//AP///zMA//8zM///M2b//zOZ//8zzP//M////2YA//9mM///Zmb//2aZ//9m"
 +
+                               "                       
zP//Zv///5kA//+ZM///mWb//5mZ//+ZzP//mf///8wA///MM///zGb//8yZ///MzP//zP////8A////"
 +
+                               "                       
M////2b///+Z////zP//////AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA"
 +
+                               "                       
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA"
 +
+                               "                       
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA"
 +
+                               "                       
AAAAAAAAAAwMDAwAAAAAAAAAAAAAAAAAAAAAAAwMDAwAAAAAAAAAAAAAAAAAAAAAAAwMDAAAAAAAAAAA"
 +
+                               "                       
AAAAAAAAAAAAAAwMDAAAAAAAAAAAAAAAAAAAAAAADAwMAAAAAAAAAAAADAAAAAAAAAAMDA0AAAAAAAAA"
 +
+                               "                       
AAwMDQAAABMTExMTExMTNwAAAAAMDAwMDQAAABMTExMTExMAAAAANzc3Nzc3NwAAAD4+Pj4+AAAAAD4+"
 +
+                               "                       
Pj4+Pj4+PgAAAGJiYgAAAAAAAAAAYmJiAAAAAAAAAGIAAAAAAAAAAABiYmIAAAAAAAAAAAAAAAAAAAAA"
 +
+                               "                       
AGJiYgAAAAAAAAAAAAAAAAAAAAAAAGJiYgAAAAAAAAAAAAAAAAAAAAAAAGJiYgAAAAAAAAAAAAAAAAAA"
 +
+                               "                       
AAAAAGJiYgAAAAAAAAAAAAAA" +
+                               "               </value>" +
+                               "       </data>" +
+                               "       <data name=\"Buffer\" type=\"{3}\">" +
+                               "               <value>BQIH</value>" +
+                               "       </data>" +
+                               "       <data name=\"Data\" 
mimetype=\"application/x-microsoft.net.object.bytearray.base64\">" +
+                               "               <value>Random Thoughts</value>" 
+
+                               "       </data>" +
+                               "       <data name=\"Foo\" 
type=\"System.Windows.Forms.Application, {1}\">" +
+                               "               <value>A B C</value>" +
+                               "       </data>" +
+                               "       <data name=\"Image\" type=\"{2}\">" +
+                               "               <value>Summer.jpg</value>" +
+                               "       </data>" +
+                               "       <data name=\"Text\">" +
+                               "               <value>OK</value>" +
+                               "       </data>" +
+                               "       <data name=\"Unknown\" 
mimetype=\"application/xxx\">" +
+                               "               <value>MIA</value>" +
+                               "       </data>" +
+                               "       <data name=\"Wrong\" typeof=\"{2}\" 
mimetype=\"application/xxx\">" +
+                               "               <value>SuperUnknown</value>" +
+                               "       </data>" +
+                               "       <data name=\"Xtra\" 
type=\"System.Windows.Forms.AnchorStyles, {1}\" 
mimetype=\"application/x-microsoft.net.object.bytearray.base64\">" +
+                               "               <value>LeftRight</value>" +
+                               "       </data>" +
+                               "</root>",
+                               ResXResourceWriter.ResMimeType, 
Consts.AssemblySystem_Windows_Forms,
+                               typeof (Bitmap).AssemblyQualifiedName, typeof 
(byte []).AssemblyQualifiedName);
+
+                       using (StringReader sr = new StringReader 
(resXContent)) {
+                               using (ResXResourceReader r = new 
ResXResourceReader (sr)) {
+                                       IDictionaryEnumerator enumerator = 
r.GetEnumerator ();
+                                       int entries = 0;
+                                       while (enumerator.MoveNext ()) {
+                                               entries++;
+                                               switch ((string) 
enumerator.Key) {
+                                               case "AnchorStyle":
+                                                       Assert.IsNotNull 
(enumerator.Value, "#A1");
+                                                       Assert.AreEqual 
(AnchorStyles.Bottom | AnchorStyles.Left, enumerator.Value, "#A2");
+                                                       break;
+                                               case "BackgroundImage":
+                                                       Assert.IsNotNull 
(enumerator.Value, "#B1");
+                                                       Assert.AreEqual (typeof 
(Bitmap), enumerator.Value.GetType (), "#B2");
+                                                       break;
+                                               case "Buffer":
+                                                       Assert.IsNotNull 
(enumerator.Value, "#C1");
+                                                       Assert.AreEqual (new 
byte [] { 5, 2, 7 }, enumerator.Value, "#C2");
+                                                       break;
+                                               case "Data":
+#if NET_2_0
+                                                       Assert.IsNull 
(enumerator.Value, "#D1");
+#else
+                                                       Assert.IsNotNull 
(enumerator.Value, "#D1");
+                                                       Assert.AreEqual 
("Random Thoughts", enumerator.Value, "#D2");
+#endif
+                                                       break;
+                                               case "Foo":
+#if NET_2_0
+                                                       Assert.IsNull 
(enumerator.Value, "#E1");
+#else
+                                                       Assert.IsNotNull 
(enumerator.Value, "#E1");
+                                                       Assert.AreEqual ("A B 
C", enumerator.Value, "#E2");
+#endif
+                                                       break;
+                                               case "Image":
+#if NET_2_0
+                                                       Assert.IsNull 
(enumerator.Value, "#F1");
+#else
+                                                       Assert.IsNotNull 
(enumerator.Value, "#F1");
+                                                       Assert.AreEqual 
("Summer.jpg", enumerator.Value, "#F2");
+#endif
+                                                       break;
+                                               case "Text":
+                                                       Assert.IsNotNull 
(enumerator.Value, "#G1");
+                                                       Assert.AreEqual ("OK", 
enumerator.Value, "#G2");
+                                                       break;
+                                               case "Unknown":
+#if NET_2_0
+                                                       Assert.IsNull 
(enumerator.Value, "#H1");
+#else
+                                                       Assert.IsNotNull 
(enumerator.Value, "#H1");
+                                                       Assert.AreEqual ("MIA", 
enumerator.Value, "#H2");
+#endif
+                                                       break;
+                                               case "Wrong":
+#if NET_2_0
+                                                       Assert.IsNull 
(enumerator.Value, "#I1");
+#else
+                                                       Assert.IsNotNull 
(enumerator.Value, "#I1");
+                                                       Assert.AreEqual 
("SuperUnknown", enumerator.Value, "#I2");
+#endif
+                                                       break;
+                                               case "Xtra":
+#if NET_2_0
+                                                       Assert.IsNull 
(enumerator.Value, "#J1");
+#else
+                                                       Assert.IsNotNull 
(enumerator.Value, "#J1");
+                                                       Assert.AreEqual 
("LeftRight", enumerator.Value, "#J2");
+#endif
+                                                       break;
+                                               default:
+                                                       Assert.Fail ("#J:" + 
enumerator.Key);
+                                                       break;
+                                               }
+                                       }
+                                       Assert.AreEqual (10, entries, "#G");
+                               }
+                       }
+               }
+
                private static void WriteEmbeddedResource (string name, string 
filename)
                {
                        const int size = 512;

_______________________________________________
Mono-patches maillist  -  [email protected]
http://lists.ximian.com/mailman/listinfo/mono-patches

Reply via email to