WingMan

Subversion Repositories:
Compare Path: Rev
With Path: Rev
?path1? @ 6  →  ?path2? @ 7
/trunk/WingMan/Lobby/LobbyMessage.cs
@@ -1,17 +1,11 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Xml.Serialization;
using System.Xml.Serialization;
 
namespace WingMan
namespace WingMan.Lobby
{
public class LobbyMessage
{
[XmlIgnore] public static XmlSerializer XmlSerializer = new XmlSerializer(typeof(LobbyMessage));
public string Message { get; set; }
public string Nick { get; set; }
 
[XmlIgnore] public static XmlSerializer XmlSerializer = new XmlSerializer(typeof(LobbyMessage));
}
}
/trunk/WingMan/Lobby/LobbyMessageReceivedEventArgs.cs
@@ -1,21 +1,17 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
 
namespace WingMan
namespace WingMan.Lobby
{
public class LobbyMessageReceivedEventArgs : EventArgs
{
public string Nick { get; set; }
 
public string Message { get; set; }
 
public LobbyMessageReceivedEventArgs(string nick, string message)
{
Nick = nick;
Message = message;
}
 
public string Nick { get; set; }
 
public string Message { get; set; }
}
}
/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;
}
}
}