/trunk/Winify/Servers/Serialization/ServersSerialization.cs |
@@ -6,26 +6,18 @@ |
using System.Xml; |
using System.Xml.Schema; |
using System.Xml.Serialization; |
using Servers; |
using Winify.Utilities; |
|
namespace Winify.Servers.Serialization |
{ |
public static class ServersSerialization |
{ |
#region Public Enums, Properties and Fields |
|
/// <summary> |
/// Cached XML serializer for the configuration. |
/// </summary> |
public static XmlSerializer XmlSerializer { get; } = new XmlSerializer(typeof(global::Servers.Servers)); |
|
#endregion |
|
#region Public Methods |
|
public static async Task<ServersSerializationState> Deserialize(string file) |
public static async Task<SerializationState> Deserialize<T>(string file, string targetNamespace, |
string schemeUri) |
{ |
var xmlSerializer = new XmlSerializer(typeof(T)); |
|
var validationEventArgs = new List<ValidationEventArgs>(); |
|
void XmlReaderSettingsValidationEventHandler(object sender, ValidationEventArgs e) |
@@ -33,7 +25,7 @@ |
validationEventArgs.Add(e); |
} |
|
global::Servers.Servers servers; |
T servers; |
|
var settings = new XmlReaderSettings(); |
|
@@ -52,7 +44,7 @@ |
|
settings.ValidationEventHandler += XmlReaderSettingsValidationEventHandler; |
|
settings.Schemas.Add("urn:winify-servers-schema", "Servers.xsd"); |
settings.Schemas.Add(targetNamespace, schemeUri); |
|
using (var fileStream = |
new FileStream(file, FileMode.Open, FileAccess.Read, FileShare.ReadWrite)) |
@@ -73,7 +65,7 @@ |
using (var stringReader = new StringReader(stringBuilder.ToString())) |
{ |
servers = |
(global::Servers.Servers) XmlSerializer |
(T) xmlSerializer |
.Deserialize(stringReader); |
} |
} |
@@ -81,7 +73,7 @@ |
} |
catch (Exception ex) |
{ |
return new ServersSerializationFailure(ex, validationEventArgs); |
return new SerializationFailure(ex, validationEventArgs); |
} |
finally |
{ |
@@ -89,25 +81,13 @@ |
XmlReaderSettingsValidationEventHandler; |
} |
|
// Decrypt password. |
var deviceId = Miscellaneous.GetMachineGuid(); |
var protectedServers = new global::Servers.Servers |
{ |
Server = new BindingListWithCollectionChanged<Server>() |
}; |
foreach (var server in servers.Server) |
{ |
var unarmored = Convert.FromBase64String(server.Password); |
var decrypted = Encoding.UTF8.GetString(AES.Decrypt(unarmored, deviceId)); |
|
protectedServers.Server.Add(new Server(server.Name, server.Url, server.Username, decrypted)); |
return new SerializationSuccess<T>(servers, validationEventArgs); |
} |
|
return new ServersSerializationSuccess(protectedServers, validationEventArgs); |
} |
public static async Task<SerializationState> Serialize<T>(T servers, string file, string name, string subset) |
{ |
var xmlSerializer = new XmlSerializer(typeof(T)); |
|
public static async Task<ServersSerializationState> Serialize(global::Servers.Servers servers, string file) |
{ |
try |
{ |
using (var memoryStream = new MemoryStream()) |
@@ -122,27 +102,13 @@ |
OmitXmlDeclaration = false |
})) |
{ |
await xmlWriter.WriteDocTypeAsync("Servers", |
await xmlWriter.WriteDocTypeAsync(name, |
null, |
null, |
"<!ATTLIST Servers xmlns:xsi CDATA #IMPLIED xsi:noNamespaceSchemaLocation CDATA #IMPLIED>"); |
subset); |
|
// Encrypt password for all servers. |
var deviceId = Miscellaneous.GetMachineGuid(); |
var protectedServers = new global::Servers.Servers |
{ |
Server = new BindingListWithCollectionChanged<Server>() |
}; |
foreach (var server in servers.Server) |
{ |
var encrypted = AES.Encrypt(Encoding.UTF8.GetBytes(server.Password), deviceId); |
var armored = Convert.ToBase64String(encrypted); |
xmlSerializer.Serialize(xmlWriter, servers); |
|
protectedServers.Server.Add(new Server(server.Name, server.Url, server.Username, armored)); |
} |
|
XmlSerializer.Serialize(xmlWriter, protectedServers); |
|
using (var fileStream = |
new FileStream(file, FileMode.Create, FileAccess.Write, FileShare.ReadWrite)) |
{ |
@@ -155,64 +121,12 @@ |
} |
catch (Exception ex) |
{ |
return new ServersSerializationFailure(ex); |
return new SerializationFailure(ex); |
} |
|
return new ServersSerializationSuccess(); |
return new SerializationSuccess<T>(); |
} |
|
public static async Task<ServersSerializationState> Serialize(global::Servers.Servers servers, |
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("Servers", |
null, |
null, |
"<!ATTLIST Servers xmlns:xsi CDATA #IMPLIED xsi:noNamespaceSchemaLocation CDATA #IMPLIED>"); |
|
// Encrypt password for all servers. |
var deviceId = Miscellaneous.GetMachineGuid(); |
var protectedServers = new global::Servers.Servers |
{ |
Server = new BindingListWithCollectionChanged<Server>() |
}; |
foreach (var server in servers.Server) |
{ |
var encrypted = AES.Encrypt(Encoding.UTF8.GetBytes(server.Password), deviceId); |
var armored = Convert.ToBase64String(encrypted); |
|
protectedServers.Server.Add(new Server(server.Name, server.Url, server.Username, armored)); |
} |
|
XmlSerializer.Serialize(xmlWriter, protectedServers); |
|
memoryStream.Position = 0L; |
|
await memoryStream.CopyToAsync(outputStream); |
} |
} |
} |
catch (Exception ex) |
{ |
return new ServersSerializationFailure(ex); |
} |
|
return new ServersSerializationSuccess(); |
} |
|
#endregion |
} |
} |