/trunk/WingMan/Lobby/LobbyMessageSynchronizer.cs |
@@ -1,37 +1,53 @@ |
using System; |
using System.Collections.Generic; |
using System.IO; |
using System.Linq; |
using System.Text; |
using System.Threading; |
using System.Threading.Tasks; |
using MQTTnet; |
using WingMan.Communication; |
|
namespace WingMan |
namespace WingMan.Lobby |
{ |
public class LobbyMessageSynchronizer : IDisposable |
{ |
public delegate void LobbyMessageReceived(object sender, LobbyMessageReceivedEventArgs e); |
|
public event LobbyMessageReceived OnLobbyMessageReceived; |
private MQTTCommunication MQTTCommunication { get; set; } |
public LobbyMessageSynchronizer(MQTTCommunication MQTTCommunication) |
public LobbyMessageSynchronizer(MQTTCommunication MQTTCommunication, TaskScheduler taskScheduler, |
CancellationToken cancellationToken) |
{ |
this.MQTTCommunication = MQTTCommunication; |
CancellationToken = cancellationToken; |
TaskScheduler = taskScheduler; |
|
MQTTCommunication.OnMessageReceived += MqttCommunicationOnOnMessageReceived; |
} |
|
private void MqttCommunicationOnOnMessageReceived(object sender, MqttApplicationMessageReceivedEventArgs e) |
private MQTTCommunication MQTTCommunication { get; } |
|
private CancellationToken CancellationToken { get; } |
private TaskScheduler TaskScheduler { get; } |
|
public void Dispose() |
{ |
if(e.ApplicationMessage.Topic != "lobby") |
MQTTCommunication.OnMessageReceived -= MqttCommunicationOnOnMessageReceived; |
} |
|
public event LobbyMessageReceived OnLobbyMessageReceived; |
|
private async void MqttCommunicationOnOnMessageReceived(object sender, |
MqttApplicationMessageReceivedEventArgs e) |
{ |
if (e.ApplicationMessage.Topic != "lobby") |
return; |
|
using (var memoryStream = new MemoryStream(e.ApplicationMessage.Payload)) |
{ |
var lobbyMessage = (LobbyMessage)LobbyMessage.XmlSerializer.Deserialize(memoryStream); |
var lobbyMessage = (LobbyMessage) LobbyMessage.XmlSerializer.Deserialize(memoryStream); |
|
OnLobbyMessageReceived?.Invoke(sender, new LobbyMessageReceivedEventArgs(lobbyMessage.Nick, lobbyMessage.Message)); |
await Task.Delay(0) |
.ContinueWith( |
_ => OnLobbyMessageReceived?.Invoke(sender, |
new LobbyMessageReceivedEventArgs(lobbyMessage.Nick, lobbyMessage.Message)), |
CancellationToken, TaskContinuationOptions.None, TaskScheduler); |
} |
} |
|
@@ -50,10 +66,5 @@ |
await MQTTCommunication.Broadcast("lobby", memoryStream.ToArray()).ConfigureAwait(false); |
} |
} |
|
public void Dispose() |
{ |
MQTTCommunication.OnMessageReceived -= MqttCommunicationOnOnMessageReceived; |
} |
} |
} |