/trunk/Winify/Form1.cs |
@@ -4,12 +4,15 @@ |
using System.Configuration; |
using System.Diagnostics; |
using System.IO; |
using System.Text; |
using System.Threading.Tasks; |
using System.Windows.Forms; |
using AutoUpdaterDotNET; |
using Servers; |
using Winify.Gotify; |
using Winify.Properties; |
using Winify.Servers.Serialization; |
using Winify.Utilities; |
|
namespace Winify |
{ |
@@ -17,6 +20,8 @@ |
{ |
#region Private Delegates, Events, Enums, Properties, Indexers and Fields |
|
private readonly Announcements.Announcements _notifications; |
|
private readonly global::Servers.Servers _servers; |
|
private readonly TaskScheduler _taskScheduler; |
@@ -52,6 +57,8 @@ |
|
_servers = new global::Servers.Servers(); |
_servers.Server.CollectionChanged += Server_CollectionChanged; |
_notifications = new Announcements.Announcements(); |
_notifications.Announcement.CollectionChanged += Announcements_CollectionChanged; |
|
_taskScheduler = TaskScheduler.FromCurrentSynchronizationContext(); |
|
@@ -69,6 +76,16 @@ |
_servers.Server.Add(server); |
} |
}); |
|
LoadAnnouncements().ContinueWith(async task => |
{ |
var restoreAnnouncements = await task; |
|
foreach (var announcement in restoreAnnouncements.Announcement) |
{ |
_notifications.Announcement.Add(announcement); |
} |
}); |
} |
|
/// <summary> |
@@ -80,6 +97,7 @@ |
if (disposing && components != null) |
{ |
_servers.Server.CollectionChanged -= Server_CollectionChanged; |
_notifications.Announcement.CollectionChanged -= Announcements_CollectionChanged; |
|
Settings.Default.SettingsLoaded -= Default_SettingsLoaded; |
Settings.Default.SettingsSaving -= Default_SettingsSaving; |
@@ -102,16 +120,42 @@ |
|
#region Event Handlers |
|
private async void Announcements_CollectionChanged(object sender, NotifyCollectionChangedEventArgs e) |
{ |
switch (await ServersSerialization.Serialize(_notifications, Constants.NotificationsFile, "Announcements", |
"<!ATTLIST Announcements xmlns:xsi CDATA #IMPLIED xsi:noNamespaceSchemaLocation CDATA #IMPLIED>")) |
{ |
case SerializationFailure serializationFailure: |
Debug.WriteLine(serializationFailure.Exception.Message); |
break; |
} |
} |
|
private void GotifyConnectionManager_GotifyNotification(object sender, GotifyNotificationEventArgs e) |
{ |
_notificationManager.ShowNotification(e); |
_notificationManager.ShowNotification(e, _notifications); |
} |
|
private async void Server_CollectionChanged(object sender, NotifyCollectionChangedEventArgs e) |
{ |
switch (await ServersSerialization.Serialize(_servers, Constants.ServersFile)) |
// Encrypt password for all servers. |
var deviceId = Miscellaneous.GetMachineGuid(); |
var @protected = new global::Servers.Servers |
{ |
case ServersSerializationFailure serializationFailure: |
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); |
|
@protected.Server.Add(new Server(server.Name, server.Url, server.Username, armored)); |
} |
|
switch (await ServersSerialization.Serialize(@protected, Constants.ServersFile, "Servers", |
"<!ATTLIST Servers xmlns:xsi CDATA #IMPLIED xsi:noNamespaceSchemaLocation CDATA #IMPLIED>")) |
{ |
case SerializationFailure serializationFailure: |
Debug.WriteLine(serializationFailure.Exception.Message); |
break; |
} |
@@ -137,7 +181,7 @@ |
return; |
} |
|
_settingsForm = new SettingsForm(_servers); |
_settingsForm = new SettingsForm(_servers, _notifications); |
_settingsForm.Closing += SettingsForm_Closing; |
_settingsForm.Show(); |
} |
@@ -192,6 +236,26 @@ |
|
#region Private Methods |
|
private static async Task<Announcements.Announcements> LoadAnnouncements() |
{ |
if (!Directory.Exists(Constants.UserApplicationDirectory)) |
{ |
Directory.CreateDirectory(Constants.UserApplicationDirectory); |
} |
|
var deserializationResult = |
await ServersSerialization.Deserialize<Announcements.Announcements>(Constants.NotificationsFile, |
"urn:winify-announcements-schema", "Announcements.xsd"); |
|
switch (deserializationResult) |
{ |
case SerializationSuccess<Announcements.Announcements> serializationSuccess: |
return serializationSuccess.Result; |
default: |
return new Announcements.Announcements(); |
} |
} |
|
private static async Task<global::Servers.Servers> LoadServers() |
{ |
if (!Directory.Exists(Constants.UserApplicationDirectory)) |
@@ -199,13 +263,29 @@ |
Directory.CreateDirectory(Constants.UserApplicationDirectory); |
} |
|
var deserializationResult = await ServersSerialization.Deserialize(Constants.ServersFile); |
var deserializationResult = |
await ServersSerialization.Deserialize<global::Servers.Servers>(Constants.ServersFile, |
"urn:winify-servers-schema", "Servers.xsd"); |
|
switch (deserializationResult) |
{ |
case ServersSerializationSuccess serializationSuccess: |
return serializationSuccess.Servers; |
case SerializationSuccess<global::Servers.Servers> serializationSuccess: |
// Decrypt password. |
var deviceId = Miscellaneous.GetMachineGuid(); |
var @protected = new global::Servers.Servers |
{ |
Server = new BindingListWithCollectionChanged<Server>() |
}; |
foreach (var server in serializationSuccess.Result.Server) |
{ |
var unarmored = Convert.FromBase64String(server.Password); |
var decrypted = Encoding.UTF8.GetString(AES.Decrypt(unarmored, deviceId)); |
|
@protected.Server.Add(new Server(server.Name, server.Url, server.Username, decrypted)); |
} |
|
return @protected; |
|
default: |
return new global::Servers.Servers(); |
} |