Widow – Rev 1

Subversion Repositories:
Rev:
using System;
using System.Collections.Generic;
using System.IO;
using System.Text;
using System.Threading.Tasks;
using System.Xml;
using System.Xml.Schema;
using System.Xml.Serialization;

namespace Widow.Serialization
{
    public static class WindowsSerialization
    {
        #region Public Enums, Properties and Fields

        /// <summary>
        ///     Cached XML serializer for the configuration.
        /// </summary>
        [XmlIgnore]
        public static XmlSerializer XmlSerializer { get; } = new XmlSerializer(typeof(Windows.Windows));

        #endregion

        #region Public Methods

        public static async Task<SerializationState> Deserialize(string file)
        {
            var validationEventArgs = new List<ValidationEventArgs>();

            void XmlReaderSettingsValidationEventHandler(object sender, ValidationEventArgs e)
            {
                validationEventArgs.Add(e);
            }

            Windows.Windows windows;

            var settings = new XmlReaderSettings();

            try
            {
                settings.Async = true;
                settings.DtdProcessing = DtdProcessing.Parse;
                settings.ValidationType = ValidationType.Schema;

                settings.ValidationFlags = XmlSchemaValidationFlags.ProcessInlineSchema |
                                           XmlSchemaValidationFlags.ProcessSchemaLocation |
                                           XmlSchemaValidationFlags.ReportValidationWarnings |
                                           XmlSchemaValidationFlags.ProcessIdentityConstraints;

                settings.Schemas = new XmlSchemaSet();

                settings.ValidationEventHandler += XmlReaderSettingsValidationEventHandler;

                settings.Schemas.Add("urn:widow-windows-schema", "Windows.xsd");

                using (var fileStream =
                    new FileStream(file, FileMode.Open, FileAccess.Read, FileShare.ReadWrite))
                {
                    using (var xmlReader = XmlReader.Create(fileStream,
                        settings))
                    {
                        var stringBuilder = new StringBuilder();

                        using (var stringWriter = new StringWriter(stringBuilder))
                        {
                            while (await xmlReader.ReadAsync())
                            {
                                await stringWriter.WriteAsync(await xmlReader.ReadOuterXmlAsync());
                            }
                        }

                        using (var stringReader = new StringReader(stringBuilder.ToString()))
                        {
                            windows =
                                (Windows.Windows) XmlSerializer
                                    .Deserialize(stringReader);
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                return new SerializationFailure(ex, validationEventArgs);
            }
            finally
            {
                settings.ValidationEventHandler -=
                    XmlReaderSettingsValidationEventHandler;
            }

            return new SerializationSuccess(windows, validationEventArgs);
        }

        public static async Task<SerializationState> Serialize(Windows.Windows windows, string file)
        {
            try
            {
                using (var memoryStream = new MemoryStream())
                {
                    using (var xmlWriter =
                        XmlWriter.Create(memoryStream,
                            new XmlWriterSettings
                            {
                                Async = true,
                                Indent = true,
                                IndentChars = "    ",
                                OmitXmlDeclaration = false
                            }))
                    {
                        await xmlWriter.WriteDocTypeAsync("Windows",
                            null,
                            null,
                            "<!ATTLIST Windows xmlns:xsi CDATA #IMPLIED xsi:noNamespaceSchemaLocation CDATA #IMPLIED>");

                        XmlSerializer.Serialize(xmlWriter, windows);

                        using (var fileStream =
                            new FileStream(file, FileMode.Create, FileAccess.Write, FileShare.ReadWrite))
                        {
                            memoryStream.Position = 0L;

                            await memoryStream.CopyToAsync(fileStream);
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                return new SerializationFailure(ex);
            }

            return new SerializationSuccess();
        }

        public static async Task<SerializationState> Serialize(Windows.Windows windows,
                                                               MemoryStream outputStream)
        {
            try
            {
                using (var memoryStream = new MemoryStream())
                {
                    using (var xmlWriter =
                        XmlWriter.Create(memoryStream,
                            new XmlWriterSettings
                            {
                                Async = true,
                                Indent = true,
                                IndentChars = "    ",
                                OmitXmlDeclaration = false
                            }))
                    {
                        await xmlWriter.WriteDocTypeAsync("Windows",
                            null,
                            null,
                            "<!ATTLIST Windows xmlns:xsi CDATA #IMPLIED xsi:noNamespaceSchemaLocation CDATA #IMPLIED>");

                        XmlSerializer.Serialize(xmlWriter, windows);

                        memoryStream.Position = 0L;

                        await memoryStream.CopyToAsync(outputStream);
                    }
                }
            }
            catch (Exception ex)
            {
                return new SerializationFailure(ex);
            }

            return new SerializationSuccess();
        }

        #endregion
    }
}

Generated by GNU Enscript 1.6.5.90.