Winify – Blame information for rev 4

Subversion Repositories:
Rev:
Rev Author Line No. Line
4 office 1 using System;
2 using System.Collections.Generic;
3 using System.IO;
4 using System.Text;
5 using System.Threading.Tasks;
6 using System.Xml;
7 using System.Xml.Schema;
8 using System.Xml.Serialization;
9  
10 namespace Winify.Connections
11 {
12 public static class ServersSerialization
13 {
14 #region Public Enums, Properties and Fields
15  
16 /// <summary>
17 /// Cached XML serializer for the configuration.
18 /// </summary>
19 public static XmlSerializer XmlSerializer { get; } = new XmlSerializer(typeof(Servers));
20  
21 #endregion
22  
23 #region Public Methods
24  
25 public static async Task<SerializationState> Deserialize(string file)
26 {
27 var validationEventArgs = new List<ValidationEventArgs>();
28  
29 void XmlReaderSettingsValidationEventHandler(object sender, ValidationEventArgs e)
30 {
31 validationEventArgs.Add(e);
32 }
33  
34 Servers servers;
35  
36 var settings = new XmlReaderSettings();
37  
38 try
39 {
40 settings.Async = true;
41 settings.DtdProcessing = DtdProcessing.Parse;
42 settings.ValidationType = ValidationType.Schema;
43  
44 settings.ValidationFlags = XmlSchemaValidationFlags.ProcessInlineSchema |
45 XmlSchemaValidationFlags.ProcessSchemaLocation |
46 XmlSchemaValidationFlags.ReportValidationWarnings |
47 XmlSchemaValidationFlags.ProcessIdentityConstraints;
48  
49 settings.Schemas = new XmlSchemaSet();
50  
51 settings.ValidationEventHandler += XmlReaderSettingsValidationEventHandler;
52  
53 settings.Schemas.Add("urn:winify-servers-schema", "Servers.xsd");
54  
55 using (var fileStream =
56 new FileStream(file, FileMode.Open, FileAccess.Read, FileShare.ReadWrite))
57 {
58 using (var xmlReader = XmlReader.Create(fileStream,
59 settings))
60 {
61 var stringBuilder = new StringBuilder();
62  
63 using (var stringWriter = new StringWriter(stringBuilder))
64 {
65 while (await xmlReader.ReadAsync())
66 {
67 await stringWriter.WriteAsync(await xmlReader.ReadOuterXmlAsync());
68 }
69 }
70  
71 using (var stringReader = new StringReader(stringBuilder.ToString()))
72 {
73 servers =
74 (Servers) XmlSerializer
75 .Deserialize(stringReader);
76 }
77 }
78 }
79 }
80 catch (Exception ex)
81 {
82 return new SerializationFailure(ex, validationEventArgs);
83 }
84 finally
85 {
86 settings.ValidationEventHandler -=
87 XmlReaderSettingsValidationEventHandler;
88 }
89  
90 return new SerializationSuccess(servers, validationEventArgs);
91 }
92  
93 public static async Task<SerializationState> Serialize(Servers servers, string file)
94 {
95 try
96 {
97 using (var memoryStream = new MemoryStream())
98 {
99 using (var xmlWriter =
100 XmlWriter.Create(memoryStream,
101 new XmlWriterSettings
102 {
103 Async = true,
104 Indent = true,
105 IndentChars = " ",
106 OmitXmlDeclaration = false
107 }))
108 {
109 await xmlWriter.WriteDocTypeAsync("Servers",
110 null,
111 null,
112 "<!ATTLIST Servers xmlns:xsi CDATA #IMPLIED xsi:noNamespaceSchemaLocation CDATA #IMPLIED>");
113  
114 XmlSerializer.Serialize(xmlWriter, servers);
115  
116 using (var fileStream =
117 new FileStream(file, FileMode.Create, FileAccess.Write, FileShare.ReadWrite))
118 {
119 memoryStream.Position = 0L;
120  
121 await memoryStream.CopyToAsync(fileStream);
122 }
123 }
124 }
125 }
126 catch (Exception ex)
127 {
128 return new SerializationFailure(ex);
129 }
130  
131 return new SerializationSuccess();
132 }
133  
134 public static async Task<SerializationState> Serialize(Servers servers,
135 MemoryStream outputStream)
136 {
137 try
138 {
139 using (var memoryStream = new MemoryStream())
140 {
141 using (var xmlWriter =
142 XmlWriter.Create(memoryStream,
143 new XmlWriterSettings
144 {
145 Async = true,
146 Indent = true,
147 IndentChars = " ",
148 OmitXmlDeclaration = false
149 }))
150 {
151 await xmlWriter.WriteDocTypeAsync("Servers",
152 null,
153 null,
154 "<!ATTLIST Servers xmlns:xsi CDATA #IMPLIED xsi:noNamespaceSchemaLocation CDATA #IMPLIED>");
155  
156 XmlSerializer.Serialize(xmlWriter, servers);
157  
158 memoryStream.Position = 0L;
159  
160 await memoryStream.CopyToAsync(outputStream);
161 }
162 }
163 }
164 catch (Exception ex)
165 {
166 return new SerializationFailure(ex);
167 }
168  
169 return new SerializationSuccess();
170 }
171  
172 #endregion
173 }
174 }