Winify

Subversion Repositories:
Compare Path: Rev
With Path: Rev
?path1? @ 14  →  ?path2? @ 15
/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();
}