Update VS project files
[mono.git] / mcs / class / System.Data / System.Data.SqlTypes / SqlXml.cs
index a75ee01541c81a50696d1a43e312372e48618867..31998b307667d6b682e6d6c24e76783cdeb41ab2 100644 (file)
@@ -3,6 +3,7 @@
 //
 // Author:
 //     Umadevi S (sumadevi@novell.com)
+//     Veerapuram Varadhan  (vvaradhan@novell.com>)
 //
 // Copyright (C) 2004 Novell, Inc (http://www.novell.com)
 //
@@ -33,6 +34,7 @@ using System.Xml.Schema;
 using System.Globalization;
 using System.Threading;
 using System.Xml.Serialization;
+using System.Text;
 
 #if NET_2_0
 
@@ -43,42 +45,84 @@ namespace System.Data.SqlTypes
        public sealed class SqlXml : INullable, IXmlSerializable
        {
                bool notNull;
-
-               [MonoTODO]
+               string xmlValue;
+               
                public SqlXml ()
                {
                        notNull = false;
+                       xmlValue = null;
                }
 
-               [MonoTODO]
                public SqlXml (Stream value)
                {
                        if (value == null) {
                                notNull = false;
+                               xmlValue = null;
                        } else {
+                               int len = (int) value.Length;
+                               
+                               if (len < 1) {
+                                       xmlValue = String.Empty;
+                               } else {
+                                       int bufSize = 8192;
+                                       StringBuilder sb = new StringBuilder (len);
+                               
+                                       value.Position = 0;
+                                       // Now read value into a byte buffer.
+                                       byte [] bytes = null;
+                               
+                                       if (len < bufSize)
+                                               bufSize = len;
+                                       bytes = new byte [bufSize];
+
+                                       while (len > 0) {
+                                               // Read may return anything from 0 to bufSize.
+                                               int n = value.Read(bytes, 0, bufSize);
+                                               sb.Append (Encoding.Unicode.GetString (bytes, 0, n));
+                                       
+                                               // The end of the file is reached.
+                                               if (n==0)
+                                                   break;
+                                               len -= n;
+                                       }
+                                       xmlValue = sb.ToString ();
+                               }
                                notNull = true;
                        }
                }
 
-               [MonoTODO]
                public SqlXml (XmlReader value)
                {
                        if (value == null) {
                                notNull = false;
+                               xmlValue = null;
                        } else {
+                               if (value.Read ()) {
+                                       value.MoveToContent ();
+                                       xmlValue = value.ReadOuterXml();
+                               } else 
+                                       xmlValue = String.Empty;
                                notNull = true;
                        }
                }
 
-                public bool IsNull {
-                        get { return !notNull; }
-                }
+               public bool IsNull {
+                       get { return !notNull; }
+               }
 
-                public static SqlXml Null {
-                        get {
+               public static SqlXml Null {
+                       get {
                                return new SqlXml ();
                        }
-                }
+               }
+
+               public string Value {
+                       get {
+                               if (notNull)
+                                       return xmlValue;
+                               throw new SqlNullValueException ();
+                       }
+               }
 
                public static XmlQualifiedName GetXsdType (XmlSchemaSet schemaSet)
                {
@@ -86,10 +130,14 @@ namespace System.Data.SqlTypes
                        return qualifiedName;
                }
 
-               [MonoNotSupported("")]
                public XmlReader CreateReader ()
                {
-                       throw new NotImplementedException ();
+                       if (notNull) {
+                               XmlReaderSettings xs = new XmlReaderSettings ();
+                               xs.ConformanceLevel = ConformanceLevel.Fragment;
+                               return XmlTextReader.Create (new StringReader (xmlValue), xs);
+                       } else
+                               throw new SqlNullValueException (); 
                }
 
                [MonoTODO]
@@ -99,7 +147,7 @@ namespace System.Data.SqlTypes
                }
                
                [MonoTODO]
-               void IXmlSerializable.ReadXml (XmlReader reader)
+               void IXmlSerializable.ReadXml (XmlReader r)
                {
                        throw new NotImplementedException ();
                }