private static void WriteCommand(dynamic dynamicElement, Command command) { switch (command.CommandType) { case CommandType.Login: LoginCommand loginCommand = (LoginCommand)command; dynamicElement.command.userInfo.name = loginCommand.UserInfo.Name; break; case CommandType.Ack: AckCommand ackCommand = (AckCommand)command; dynamicElement.command.messageId = ackCommand.MessageId; break; case CommandType.UserState: UserStateCommand userStateCommand = (UserStateCommand)command; dynamicElement.command.userInfo.name = userStateCommand.UserInfo.Name; dynamicElement.command.userState = userStateCommand.UserState; break; case CommandType.TextMessage: TextMessageCommand textMessageCommand = (TextMessageCommand)command; dynamicElement.command.from.userInfo.name = textMessageCommand.From.Name; dynamicElement.command.to.userInfo.name = textMessageCommand.To.Name; dynamicElement.command.textMessage = textMessageCommand.Message; break; default: throw new InvalidOperationException("Unsupported command type: " + command.CommandType); } }
public void UserStateCommandTest() { string stringMessage = @"<message> <version>1</version> <messageId>123</messageId> <command type=""UserState""> <userInfo> <name>Another user name</name> </userInfo> <userState>Some user state</userState> </command> </message>"; XElement xml = XElement.Parse(stringMessage); DynamicXmlMessageConverter converter = new DynamicXmlMessageConverter(); Message message = converter.ConvertFromXml(xml); // Checking command Command command = message.Command; Assert.That(command.CommandType, Is.EqualTo(CommandType.UserState)); UserStateCommand userStateCommand = (UserStateCommand)command; UserInfo userInfo = userStateCommand.UserInfo; Assert.That(userInfo.Name, Is.EqualTo("Another user name")); string userState = userStateCommand.UserState; Assert.That(userState, Is.EqualTo("Some user state")); }
private void HandleUserStateCommand(long incomingMessageId, UserStateCommand command) { using (usersSync.UseReadLock()) { var userInfo = users.SingleOrDefault(ui => ui.UserInfo.Name == command.UserInfo.Name); if (userInfo == null) { // Nothing to handle. This user unknown return; } userInfo.ChangeUserState(command.UserState); SendUpdatedUserState(userInfo); } }
private void SendUpdatedUserState(FullUserInfo userInfo) { Contract.Requires(userInfo != null); // Creating message to send var userStateCommand = new UserStateCommand(userInfo.UserInfo, userInfo.UserState); var message = new Message(1, messageId, userStateCommand); string xml = messageConverter.ConvertToXml(message).ToString(); // Finding all connected users (without this particular user) var collectionToSend = users.Where(ui => ui.EndPoint != null && ui != userInfo); // And sending user information to them foreach (var ui in collectionToSend) { tcpServer.SendString(ui.EndPoint, xml); } }
public void ConvertUserInfoCommandTest() { long version = 1; long messageId = 123123; UserStateCommand command = new UserStateCommand(new UserInfo("userName"), "userState"); Message message = new Message(version, messageId, command); //Converting to xml DynamicXmlMessageConverter converter = new DynamicXmlMessageConverter(); XElement xml = converter.ConvertToXml(message); // And back again Message message2 = converter.ConvertFromXml(xml); UserStateCommand command2 = (UserStateCommand)message2.Command; Assert.That(command2.UserInfo.Name, Is.EqualTo(command.UserInfo.Name)); Assert.That(command2.UserState, Is.EqualTo(command.UserState)); }