bool WaitPlayerConfirm(ServerConnectionMessagesHandler receiver)
 {
     bool result = false;
       for(int i = 0; i < 20; i++)
       {
     if(receiver.Confirmed)
     {
       result = true;
       break;
     }
     Thread.Sleep(500);
       }
       return result;
 }
 void ValidatePlayer(ServerConnectionMessagesHandler receiver, out ConnectionResult result, out string refuseReason)
 {
     refuseReason = string.Empty;
       result = ConnectionResult.Accepted;
       Version clientVersion = System.Reflection.Assembly.GetExecutingAssembly().GetName().Version;
       if(!new Version(receiver.Handshake.ClientVersion).Equals(clientVersion))
       {
     result = ConnectionResult.VersionMismatch;
     refuseReason = servicesProvider.SystemStringsService.GetString("NEW_SERVER_GAME_DIALOG", "MSG_CONNECTIONREFUSED_VERSIONMISMATCH");
       }
       else if(gameIsRunning)
       {
     result = ConnectionResult.GameIsRunning;
     refuseReason = servicesProvider.SystemStringsService.GetString("NEW_SERVER_GAME_DIALOG", "MSG_CONNECTIONREFUSED_GAMEISRUNNING");
       }
       else if(receiver.Handshake.StartMode != this.startMode)
       {
     result = ConnectionResult.InvalidStartMode;
     refuseReason = servicesProvider.SystemStringsService.GetString("NEW_SERVER_GAME_DIALOG", "MSG_CONNECTIONREFUSED_INVALIDSTARTMODE");
       }
       else if(receiver.Handshake.PlayerInfo.NickName == Player.NickName ||
     connections.Any(e => e.Value.Handshake.PlayerInfo.NickName == receiver.Handshake.PlayerInfo.NickName))
       {
     result = ConnectionResult.NicknameDuplicated;
     refuseReason = servicesProvider.SystemStringsService.GetString("NEW_SERVER_GAME_DIALOG", "MSG_CONNECTIONREFUSED_NICKNAMEDUPLICATED");
       }
       else if(receiver.Handshake.GameDatabaseCRC != servicesProvider.GameDatabaseCrc)
       {
     result = ConnectionResult.GameDatabaseMismatch;
     refuseReason = servicesProvider.SystemStringsService.GetString("NEW_SERVER_GAME_DIALOG", "MSG_CONNECTIONREFUSED_GAMEDATAMISMATCH");
       }
       //else if(receiver.Handshake.CardDatabaseCRC != servicesProvider.CardDatabaseCrc)
       //{
       //  result = ConnectionResult.CardDatabaseMismatch;
       //  refuseReason = servicesProvider.StringService.GetString("NEW_SERVER_GAME_DIALOG", "MSG_CONNECTIONREFUSED_CARDDATAMISMATCH");
       //}
       else if(passwordRequired && string.IsNullOrEmpty(receiver.Handshake.Password))
       {
     result = ConnectionResult.PasswordRequired;
     refuseReason = servicesProvider.SystemStringsService.GetString("NEW_SERVER_GAME_DIALOG", "MSG_CONNECTIONREFUSED_PASSWORDREQUIRED");
       }
 }
 bool WaitHandshake(ServerConnectionMessagesHandler receiver)
 {
     bool result = false;
       for(int i = 0; i < 20; i++)
       {
     if(receiver.Handshake != null)
     {
       result = true;
       break;
     }
     Thread.Sleep(500);
       }
       return result;
 }
 void netMessageService_ClientConnected(object sender, ServiceNetClient client)
 {
     using(var connectionMessagesHandler = new ServerConnectionMessagesHandler(client))
       {
     if(!WaitHandshake(connectionMessagesHandler))
     {
       if(Console != null)
     Console.WriteLine(MessageCategory.Warning, "Opponent handshake not received");
     }
     else
     {
       ConnectionResult result;
       string refuseReason;
       ValidatePlayer(connectionMessagesHandler, out result, out refuseReason);
       HandshakeResponse handshakeResponse = new HandshakeResponse()
       {
     Deck = new DeckDataContract(deck),
     PlayerInfo = Player,
     ConnectionResult = result,
       };
       Thread.Sleep(100);
       client.SendMessage(handshakeResponse);
       if(result != ConnectionResult.Accepted)
       {
     if(Console != null)
       Console.WriteLine(MessageCategory.Warning, string.Concat("Player ", connectionMessagesHandler.Handshake.PlayerInfo.NickName, " refused: ", refuseReason));
       }
       else
       {
     if(!WaitPlayerConfirm(connectionMessagesHandler))
     {
       if(Console != null)
         Console.WriteLine(MessageCategory.Warning, string.Concat("Player ", connectionMessagesHandler.Handshake.PlayerInfo.NickName, " hasn't confirmed the connection."));
     }
     else
     {
       client.Disconnected += new EventHandler(client_Disconnected);
       lock(syncObject)
         connections.Add(client, connectionMessagesHandler);
       PlayerAccountData connectedPlayer = new PlayerAccountData()
       {
         Info = connectionMessagesHandler.Handshake.PlayerInfo,
         Deck = new DeckItem(connectionMessagesHandler.Handshake.Deck),
         Password = connectionMessagesHandler.Handshake.Password
       };
       OnPlayerConnected(client, connectedPlayer);
     }
       }
     }
       }
 }