2004-05-11 Gonzalo Paniagua Javier <gonzalo@ximian.com>
authorGonzalo Paniagua Javier <gonzalo.mono@gmail.com>
Tue, 11 May 2004 07:37:19 +0000 (07:37 -0000)
committerGonzalo Paniagua Javier <gonzalo.mono@gmail.com>
Tue, 11 May 2004 07:37:19 +0000 (07:37 -0000)
* System.Resources/ResXResourceWriter.cs: implemented.

svn path=/trunk/mcs/; revision=27069

mcs/class/System.Windows.Forms/ChangeLog
mcs/class/System.Windows.Forms/System.Resources/ResXResourceWriter.cs

index 15f3e98f48f80a7b20227ca9806a1170f56cc2e9..0dddc0e9a17e7e891b705a09de5e7d99f094d4cf 100644 (file)
@@ -1,64 +1,68 @@
+2004-05-11  Gonzalo Paniagua Javier <gonzalo@ximian.com>
+
+       * System.Resources/ResXResourceWriter.cs: implemented.
+
 2004-03-15  Andreas Nahr <ClassDevelopment@A-SoftTech.com>
 
        * System.Windows.Forms.dll.sources: Added files
 
-2004-01-22  Gonzalo Paniagua Javier <gonzalo@ximian.com>\r
-\r
-       * System.Resources/ResXResourceReader.cs: read empty tags properly.\r
-       Fixes bug #53174. Patch by Tomasz Kaszuba.\r
-\r
-2003-08-31  Jerome Laban <jlaban@wanadoo.fr>\r
-       * Label.cs: Fixed Text property not redrawing the label correctly.\r
-\r
-2003-08-31  Jerome Laban <jlaban@wanadoo.fr>\r
-       * win32functions.cs: Added GetUpdateRect function. \r
-       * Control.cs: Make sure to call OnPaint even if UserPaint style is not\r
-       enabled. Get the appropriate DC for WM_PAINT operations.\r
-\r
-2003-07-16  Peter Williams  <peter@newton.cx>\r
-\r
-       * System.Windows.Forms.dll.sources: Don't build with two\r
-       AssemblyInfo.cs files.\r
-\r
-2003-07-07  Martin Willemoes Hansen <mwh@sysrq.dk>\r
-\r
-       * System.Windows.Forms.Design/AnchorEditor.cs\r
-         System.Windows.Forms.Design/AxImporter.cs\r
-         System.Windows.Forms.Design/ComponentDocumentDesigner.cs\r
-         System.Windows.Forms.Design/ComponentTray.cs\r
-         System.Windows.Forms.Design/ControlDesigner.cs\r
-         System.Windows.Forms.Design/DocumentDesigner.cs\r
-         System.Windows.Forms.Design/FileNameEditor.cs\r
-         System.Windows.Forms.Design/IMenuEditorService.cs\r
-         System.Windows.Forms.Design/MenusCommands.cs\r
-         System.Windows.Forms.Design/ParentControlDesigner.cs\r
-         System.Windows.Forms.Design/ScrollableControlDesigner.cs\r
-         System.Windows.Forms.Design/SelectionRules.cs: Moved to System.Design assembly\r
-       \r
-2003-05-31  Paolo Molaro <lupus@ximian.com>\r
-\r
-       * System.Resources/ResXResourceReader.cs: get simple reading and error\r
-       checks working.\r
-\r
-2003-03-31  Alan Tam <Tam@SiuLung.com>\r
-\r
-       * UITypeEditor.cs: Removed.\r
-\r
-2003-03-29  Martin Willemoes Hansen <mwh@sysrq.dk>\r
-       * Added stub for System.Windows.Forms/IWindowsFormsEditorService.cs\r
-\r
-2003-02-07  Alexandre Pigokine <pigolkine@gmx.de>\r
-       * list.unix      removed System.Windows.Forms\Font.cs\r
-\r
-2003-01-31  John Sohn <jsohn@columbus.rr.com>\r
-       * README: updated for latest WineLib and Mono\r
-\r
-2003-01-15  Duncan Mak  <duncan@ximian.com>\r
-\r
-       * Make it not spam all those warnings. Blocking errors 0108 and also\r
-       0114.\r
-\r
-2002-12-10  Jeroen Janssen <japj@darius.demon.nl>\r
-       \r
-       * added ChangeLog\r
-       * fixed MonoTodo compile errors with csc\r
+2004-01-22  Gonzalo Paniagua Javier <gonzalo@ximian.com>
+
+       * System.Resources/ResXResourceReader.cs: read empty tags properly.
+       Fixes bug #53174. Patch by Tomasz Kaszuba.
+
+2003-08-31  Jerome Laban <jlaban@wanadoo.fr>
+       * Label.cs: Fixed Text property not redrawing the label correctly.
+
+2003-08-31  Jerome Laban <jlaban@wanadoo.fr>
+       * win32functions.cs: Added GetUpdateRect function. 
+       * Control.cs: Make sure to call OnPaint even if UserPaint style is not
+       enabled. Get the appropriate DC for WM_PAINT operations.
+
+2003-07-16  Peter Williams  <peter@newton.cx>
+
+       * System.Windows.Forms.dll.sources: Don't build with two
+       AssemblyInfo.cs files.
+
+2003-07-07  Martin Willemoes Hansen <mwh@sysrq.dk>
+
+       * System.Windows.Forms.Design/AnchorEditor.cs
+         System.Windows.Forms.Design/AxImporter.cs
+         System.Windows.Forms.Design/ComponentDocumentDesigner.cs
+         System.Windows.Forms.Design/ComponentTray.cs
+         System.Windows.Forms.Design/ControlDesigner.cs
+         System.Windows.Forms.Design/DocumentDesigner.cs
+         System.Windows.Forms.Design/FileNameEditor.cs
+         System.Windows.Forms.Design/IMenuEditorService.cs
+         System.Windows.Forms.Design/MenusCommands.cs
+         System.Windows.Forms.Design/ParentControlDesigner.cs
+         System.Windows.Forms.Design/ScrollableControlDesigner.cs
+         System.Windows.Forms.Design/SelectionRules.cs: Moved to System.Design assembly
+       
+2003-05-31  Paolo Molaro <lupus@ximian.com>
+
+       * System.Resources/ResXResourceReader.cs: get simple reading and error
+       checks working.
+
+2003-03-31  Alan Tam <Tam@SiuLung.com>
+
+       * UITypeEditor.cs: Removed.
+
+2003-03-29  Martin Willemoes Hansen <mwh@sysrq.dk>
+       * Added stub for System.Windows.Forms/IWindowsFormsEditorService.cs
+
+2003-02-07  Alexandre Pigokine <pigolkine@gmx.de>
+       * list.unix      removed System.Windows.Forms\Font.cs
+
+2003-01-31  John Sohn <jsohn@columbus.rr.com>
+       * README: updated for latest WineLib and Mono
+
+2003-01-15  Duncan Mak  <duncan@ximian.com>
+
+       * Make it not spam all those warnings. Blocking errors 0108 and also
+       0114.
+
+2002-12-10  Jeroen Janssen <japj@darius.demon.nl>
+       
+       * added ChangeLog
+       * fixed MonoTodo compile errors with csc
index b228bed4a3a6919d83509225a01941d66d80073c..9666a1282005851a974c0bd620445bc7027307e5 100644 (file)
 //
 // System.Resources.ResXResourceWriter.cs
 //
-// Author:
+// Authors:
 //     Duncan Mak <duncan@ximian.com>
+//     Gonzalo Paniagua Javier (gonzalo@ximian.com)
 //
 // 2001 (C) Ximian, Inc.       http://www.ximian.com
+// (c) 2004 Novell, Inc. (http://www.novell.com)
 //
 
+using System.ComponentModel;
 using System.IO;
+using System.Runtime.Serialization.Formatters.Binary;
+using System.Text;
+using System.Xml;
 
 namespace System.Resources
 {
-       public sealed class ResXResourceWriter : IResourceWriter
+       public sealed class ResXResourceWriter : IResourceWriter, IDisposable
        {
-               [MonoTODO]
+               string filename;
+               Stream stream;
+               TextWriter textwriter;
+               XmlTextWriter writer;
+               bool written;
+
                public ResXResourceWriter (Stream stream)
                {
                        if (stream == null)
-                               throw new ArgumentNullException ("stream is null");
+                               throw new ArgumentNullException ("stream");
+
                        if (stream.CanWrite == false)
-                               throw new ArgumentException ("stream is not writable.");
+                               throw new ArgumentException ("stream is not writable.", "stream");
+
+                       this.stream = stream;
+               }
+
+               public ResXResourceWriter (TextWriter textwriter)
+               {
+                       if (textwriter == null)
+                               throw new ArgumentNullException ("textwriter");
+
+                       this.textwriter = textwriter;
                }
                
-               [MonoTODO]
-               public ResXResourceWriter (String fileName)
+               public ResXResourceWriter (string fileName)
                {
                        if (fileName == null)
-                               throw new ArgumentNullException ("fileName is null.");
+                               throw new ArgumentNullException ("fileName");
+
+                       this.filename = fileName;
                }
                
-               [MonoTODO]
-               public void AddResource (string name, byte[] value)
+               void InitWriter ()
                {
-                       if (name == null || value == null)
-                               throw new ArgumentNullException ("Parameter is a null reference.");
+                       if (filename != null) {
+                               stream = File.OpenWrite (filename);
+                               textwriter = new StreamWriter (stream, Encoding.UTF8);
+                       }
+
+                       writer = new XmlTextWriter (textwriter);
+                       writer.Formatting = Formatting.Indented;
+                       writer.WriteStartDocument ();
+                       writer.WriteStartElement ("root");
+                       writer.WriteRaw (schema);
+                       WriteHeader ("resmimetype", "text/microsoft-resx");
+                       WriteHeader ("version", "1.3");
+                       WriteHeader ("reader", typeof (ResXResourceReader).AssemblyQualifiedName);
+                       WriteHeader ("writer", typeof (ResXResourceWriter).AssemblyQualifiedName);
                }
-               
-               [MonoTODO]
+
+               void WriteHeader (string name, string value)
+               {
+                       writer.WriteStartElement ("resheader");
+                       writer.WriteAttributeString ("name", name);
+                       writer.WriteStartElement ("value");
+                       writer.WriteString (value);
+                       writer.WriteEndElement ();
+                       writer.WriteEndElement ();
+               }
+
+               void WriteBytes (string name, string typename, byte [] value, int offset, int length)
+               {
+                       writer.WriteStartElement ("data");
+                       writer.WriteAttributeString ("name", name);
+                       if (typename != null) {
+                               writer.WriteAttributeString ("type", typename);
+                       } else {
+                               writer.WriteAttributeString ("mimetype",
+                                               "application/x-microsoft.net.object.binary.base64");
+                       }
+
+                       writer.WriteStartElement ("value");
+                       writer.WriteBase64 (value, offset, length);
+                       writer.WriteEndElement ();
+                       writer.WriteEndElement ();
+               }
+
+               void WriteBytes (string name, string typename, byte [] value)
+               {
+                       WriteBytes (name, typename, value, 0, value.Length);
+               }
+
+               void WriteString (string name, string value)
+               {
+                       writer.WriteStartElement ("data");
+                       writer.WriteAttributeString ("name", name);
+                       writer.WriteStartElement ("value");
+                       writer.WriteString (value);
+                       writer.WriteEndElement ();
+                       writer.WriteEndElement ();
+                       writer.WriteWhitespace ("\n  ");
+               }
+
+               public void AddResource (string name, byte [] value)
+               {
+                       if (name == null)
+                               throw new ArgumentNullException ("name");
+
+                       if (value == null)
+                               throw new ArgumentNullException ("value");
+
+                       if (written)
+                               throw new InvalidOperationException ("The resource is already generated.");
+
+                       if (writer == null)
+                               InitWriter ();
+
+                       WriteBytes (name, value.GetType ().AssemblyQualifiedName, value);
+               }
+
                public void AddResource (string name, object value)
-               {                        
-                       if (name == null || value == null)
-                               throw new ArgumentNullException ("Parameter is a null reference.");
+               {
+                       if (name == null)
+                               throw new ArgumentNullException ("name");
+
+                       if (value == null)
+                               throw new ArgumentNullException ("value");
+
+                       if (written)
+                               throw new InvalidOperationException ("The resource is already generated.");
+
+                       if (writer == null)
+                               InitWriter ();
+
+                       TypeConverter converter = TypeDescriptor.GetConverter (value);
+                       if (converter != null && converter.CanConvertTo (typeof (string))) {
+                               string str = (string) converter.ConvertTo (value, typeof (string));
+                               WriteString (name, str);
+                               return;
+                       }
+                       
+                       MemoryStream ms = new MemoryStream ();
+                       BinaryFormatter fmt = new BinaryFormatter ();
+                       try {
+                               fmt.Serialize (ms, value);
+                       } catch (Exception e) {
+                               throw new InvalidOperationException ("Cannot add a " + value.GetType () +
+                                                                    "because it cannot be serialized: " +
+                                                                    e.Message);
+                       }
+
+                       WriteBytes (name, null, ms.GetBuffer (), 0, (int) ms.Length);
+                       ms.Close ();
                }
                
-               [MonoTODO]
                public void AddResource (string name, string value)
                {
-                       if (name == null || value == null)
-                               throw new ArgumentNullException ("Parameter is a null reference.");
+                       if (name == null)
+                               throw new ArgumentNullException ("name");
+
+                       if (value == null)
+                               throw new ArgumentNullException ("value");
+
+                       if (written)
+                               throw new InvalidOperationException ("The resource is already generated.");
+
+                       if (writer == null)
+                               InitWriter ();
+
+                       WriteString (name, value);
                }
 
-               [MonoTODO]
-               public void Close () {}
+               public void Close ()
+               {
+                       if (!written) {
+                               Generate ();
+                       }
+
+                       if (writer != null) {
+                               writer.Close ();
+                               stream = null;
+                               filename = null;
+                               textwriter = null;
+                       }
+               }
                
                public void Dispose ()
                {
-                       Close();
+                       Close ();
+               }
+
+               public void Generate ()
+               {
+                       if (written)
+                               throw new InvalidOperationException ("The resource is already generated.");
+
+                       written = true;
+                       writer.WriteEndElement ();
+                       writer.Flush ();
                }
 
-               [MonoTODO]
-               public void Generate () {}
+               static string schema = @"
+  <xsd:schema id='root' xmlns='' xmlns:xsd='http://www.w3.org/2001/XMLSchema' xmlns:msdata='urn:schemas-microsoft-com:xml-msdata'>
+    <xsd:element name='root' msdata:IsDataSet='true'>
+      <xsd:complexType>
+        <xsd:choice maxOccurs='unbounded'>
+          <xsd:element name='data'>
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name='value' type='xsd:string' minOccurs='0' msdata:Ordinal='1' />
+                <xsd:element name='comment' type='xsd:string' minOccurs='0' msdata:Ordinal='2' />
+              </xsd:sequence>
+              <xsd:attribute name='name' type='xsd:string' msdata:Ordinal='1' />
+              <xsd:attribute name='type' type='xsd:string' msdata:Ordinal='3' />
+              <xsd:attribute name='mimetype' type='xsd:string' msdata:Ordinal='4' />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name='resheader'>
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name='value' type='xsd:string' minOccurs='0' msdata:Ordinal='1' />
+              </xsd:sequence>
+              <xsd:attribute name='name' type='xsd:string' use='required' />
+            </xsd:complexType>
+          </xsd:element>
+        </xsd:choice>
+      </xsd:complexType>
+    </xsd:element>
+  </xsd:schema>
+".Replace ("'", "\"");
        }
 }
+