/trunk/WingMan/MouseKey/MouseKeyBinding.cs |
@@ -1,18 +1,16 @@ |
using System; |
using System.Collections.Generic; |
using System.Linq; |
using System.Text; |
using System.Threading.Tasks; |
|
namespace WingMan |
namespace WingMan.MouseKey |
{ |
public class MouseKeyBinding |
public class MouseKeyBinding : IEquatable<MouseKeyBinding> |
{ |
public MouseKeyBinding() |
{ |
} |
|
} |
public MouseKeyBinding(string name, List<string> keys) :this() |
public MouseKeyBinding(string name, List<string> keys) : this() |
{ |
Name = name; |
Keys = keys; |
@@ -23,5 +21,28 @@ |
public string Name { get; set; } = string.Empty; |
|
public List<string> Keys { get; set; } = new List<string>(); |
|
public bool Equals(MouseKeyBinding other) |
{ |
if (ReferenceEquals(null, other)) return false; |
if (ReferenceEquals(this, other)) return true; |
return string.Equals(Name, other.Name) && Keys.SequenceEqual(other.Keys); |
} |
|
public override bool Equals(object obj) |
{ |
if (ReferenceEquals(null, obj)) return false; |
if (ReferenceEquals(this, obj)) return true; |
if (obj.GetType() != GetType()) return false; |
return Equals((MouseKeyBinding) obj); |
} |
|
public override int GetHashCode() |
{ |
unchecked |
{ |
return ((Name != null ? Name.GetHashCode() : 0) * 397) ^ (Keys != null ? Keys.GetHashCode() : 0); |
} |
} |
} |
} |
/trunk/WingMan/MouseKey/MouseKeyBindingsSynchronizer.cs |
@@ -1,13 +1,10 @@ |
using System; |
using System.Collections.Concurrent; |
using System.Collections.Concurrent; |
using System.Collections.Generic; |
using System.IO; |
using System.Linq; |
using System.Text; |
using System.Threading; |
using System.Threading.Tasks; |
using MQTTnet; |
using MQTTnet.Extensions.ManagedClient; |
using WingMan.Communication; |
|
namespace WingMan.MouseKey |
@@ -15,31 +12,34 @@ |
public class MouseKeyBindingsSynchronizer |
{ |
public delegate void MouseKeyBindingsSynchronized(object sender, MouseKeyBindingsSynchronizedEventArgs e); |
public event MouseKeyBindingsSynchronized OnMouseKeyBindingsSynchronized; |
|
private MouseKeyBindings MouseKeyBindings { get; set; } |
|
private ConcurrentDictionary<string, List<MouseKeyBindingExchange>> SynchronizedMouseKeyBindings { get; set; } |
|
private MQTTCommunication MQTTCommunication { get; set; } |
|
private CancellationTokenSource SynchronizationCancellationTokenSource { get; set; } |
|
public MouseKeyBindingsSynchronizer(MouseKeyBindings mouseKeyBindings, MQTTCommunication MQTTCommunication) |
public MouseKeyBindingsSynchronizer(MouseKeyBindings mouseKeyBindings, MQTTCommunication MQTTCommunication, |
TaskScheduler taskScheduler, CancellationToken cancellationToken) |
{ |
MouseKeyBindings = mouseKeyBindings; |
this.MQTTCommunication = MQTTCommunication; |
CancellationToken = cancellationToken; |
TaskScheduler = taskScheduler; |
|
SynchronizedMouseKeyBindings = new ConcurrentDictionary<string, List<MouseKeyBindingExchange>>(); |
SynchronizedMouseKeyBindings = new ConcurrentDictionary<string, List<MouseKeyBinding>>(); |
|
MQTTCommunication.OnMessageReceived += MqttCommunicationOnOnMessageReceived; |
|
SynchronizationCancellationTokenSource = new CancellationTokenSource(); |
|
Task.Run(Synchronize, SynchronizationCancellationTokenSource.Token); |
Task.Run(Synchronize, CancellationToken); |
} |
|
private void MqttCommunicationOnOnMessageReceived(object sender, MqttApplicationMessageReceivedEventArgs e) |
private MouseKeyBindings MouseKeyBindings { get; } |
|
private ConcurrentDictionary<string, List<MouseKeyBinding>> SynchronizedMouseKeyBindings { get; } |
|
private MQTTCommunication MQTTCommunication { get; } |
|
private CancellationToken CancellationToken { get; } |
private TaskScheduler TaskScheduler { get; } |
public event MouseKeyBindingsSynchronized OnMouseKeyBindingsSynchronized; |
|
private async void MqttCommunicationOnOnMessageReceived(object sender, |
MqttApplicationMessageReceivedEventArgs e) |
{ |
if (e.ApplicationMessage.Topic != "exchange") |
return; |
@@ -48,19 +48,23 @@ |
{ |
memoryStream.Position = 0L; |
|
var mouseKeyBindingsExchange = (MouseKeyBindingsExchange)MouseKeyBindingsExchange.XmlSerializer.Deserialize(memoryStream); |
var mouseKeyBindingsExchange = |
(MouseKeyBindingExchange) MouseKeyBindingExchange.XmlSerializer.Deserialize(memoryStream); |
|
if (SynchronizedMouseKeyBindings.TryGetValue(mouseKeyBindingsExchange.Nick, out var mouseKeyBinding) && |
mouseKeyBinding.SequenceEqual(mouseKeyBindingsExchange.ExchangeBindings)) |
mouseKeyBinding.SequenceEqual(mouseKeyBindingsExchange.MouseKeyBindings)) |
return; |
|
// Nick does not exist so the bindings will be added. |
SynchronizedMouseKeyBindings.AddOrUpdate(mouseKeyBindingsExchange.Nick, |
mouseKeyBindingsExchange.ExchangeBindings, (s, list) => mouseKeyBindingsExchange.ExchangeBindings); |
mouseKeyBindingsExchange.MouseKeyBindings, (s, list) => mouseKeyBindingsExchange.MouseKeyBindings); |
|
OnMouseKeyBindingsSynchronized?.Invoke(sender, |
new MouseKeyBindingsSynchronizedEventArgs( |
mouseKeyBindingsExchange.ExchangeBindings)); |
await Task.Delay(0) |
.ContinueWith( |
_ => OnMouseKeyBindingsSynchronized?.Invoke(sender, |
new MouseKeyBindingsSynchronizedEventArgs( |
mouseKeyBindingsExchange)), |
CancellationToken, TaskContinuationOptions.None, TaskScheduler); |
} |
} |
|
@@ -68,21 +72,21 @@ |
{ |
do |
{ |
await Task.Delay(1000).ConfigureAwait(false); |
await Task.Delay(1000, CancellationToken).ConfigureAwait(false); |
|
if (!MouseKeyBindings.Bindings.Any()) |
if (!MQTTCommunication.Running) |
continue; |
|
using (var memoryStream = new MemoryStream()) |
{ |
MouseKeyBindingsExchange.XmlSerializer.Serialize(memoryStream, new MouseKeyBindingsExchange(MQTTCommunication.Nick, MouseKeyBindings)); |
MouseKeyBindingExchange.XmlSerializer.Serialize(memoryStream, |
new MouseKeyBindingExchange(MQTTCommunication.Nick, MouseKeyBindings.Bindings)); |
|
memoryStream.Position = 0L; |
|
await MQTTCommunication.Broadcast("exchange", memoryStream.ToArray()).ConfigureAwait(false); |
} |
|
} while (!SynchronizationCancellationTokenSource.Token.IsCancellationRequested); |
} while (!CancellationToken.IsCancellationRequested); |
} |
} |
} |