/// <summary> /// Indicates if <see cref="QueuedRequestsPool"/> contains request from provided <see cref="UserConnection"/> object. /// </summary> /// <param name="connection"><see cref="UserConnection"/> to search requests from.</param> /// <param name="dropIfExists">If true, existing request will be dropped.</param> /// <returns>True, if there is <see cref="QueuedRequest"/> from from provided <see cref="UserConnection"/>, otherwise false.</returns> internal static bool HasRequest( UserConnection connection, bool dropIfExists ) { if ( m_RequestsBySession.ContainsKey(connection.Session.ID) ) { if ( dropIfExists ) Dequeue(connection.Session.ID); else return true; } return false; }
/// <summary> /// Closes active <see cref="UserConnection"/>. /// </summary> /// <param name="connection"><see cref="UserConnection"/> object, which network must be closed.</param> internal static void CloseActiveConnection( UserConnection connection ) { if ( connection != null ) { connection.CloseConnection(); if ( connection.Session.AccountID > 0 ) CacheServiceConnection.Send(new UnCacheUser(connection.Session.ID).ToPacket()); m_ActiveConnections.Remove(connection.Session.ID); Logger.WriteLine(Source.OuterNetwork, "Connection closed for session {0}.", connection.Session.ToString()); connection = null; } }
/// <summary> /// Enqueues new <see cref="QueuedRequest"/> to requests pool. /// </summary> /// <param name="userConnection"><see cref="UserConnection"/> object to create request for.</param> /// <param name="requestId">Request unique id reference.</param> /// <returns>True, if request was added, otherwise false.</returns> internal static bool Enqueue( UserConnection userConnection, ref long requestId ) { if ( m_RequestsBySession.ContainsKey(userConnection.Session.ID) ) { #if DropUnAnsweredPackets m_RequestsBySession.Remove(userConnection.Session.ID); Logger.WriteLine(Source.InnerNetwork, "Previous request was dropped for session {0}", userConnection.Session.ToString()); #else Logger.WriteLine(Source.InnerNetwork, "Can't add new request for session {0}, there is other unanswered request.", userConnection.Session.ToString()); return false; #endif } QueuedRequest request = new QueuedRequest(NextRequestID(), userConnection); requestId = request.RequestID; m_RequestsBySession.Add(userConnection.Session.ID, request); m_RequestsById.Add(request.RequestID, userConnection.Session.ID); return true; }
/// <summary> /// Initializes new instance of <see cref="QueuedRequest"/>. /// </summary> /// <param name="requestID"><see cref="QueuedRequest"/> unique id.</param> /// <param name="connection"><see cref="UserConnection"/> object.</param> internal QueuedRequest( long requestID, UserConnection connection ) { RequestID = requestID; UserConnection = connection; }
/// <summary> /// Executes after listener accepted new connection. /// </summary> /// <param name="socket">New connection socket.</param> private static void ListenerService_OnConnectionAccepted( Socket socket ) { if ( socket != null && socket.Connected ) { UserConnection userConnection = new UserConnection(socket); if ( m_ActiveConnections.Count >= Settings.Default.LoginServiceMaxAwaitingUsersCount ) { userConnection.Send(LoginFailed.ToPacket(UserAuthenticationResponseType.ServerOverloaded)); CloseActiveConnection(userConnection); return; } if ( m_ActiveConnections.ContainsKey(userConnection.Session.ID) ) { userConnection = null; ListenerService_OnConnectionAccepted(socket); return; } m_ActiveConnections.Add(userConnection.Session.ID, userConnection); userConnection.Send(InitializeConnection.ToPacket(userConnection.Session)); // say hello to client userConnection.BeginReceive(); } }
/// <summary> /// Removes provided <see cref="UserConnection"/> object from active connections list. /// </summary> /// <param name="connection"><see cref="UserConnection"/> object to remove from active connections list.</param> internal static void RemoveFromActiveConnections( UserConnection connection ) { if ( connection != null ) { if ( connection.Session.AccountID > 0 ) CacheServiceConnection.Send(new UnCacheUser(connection.Session.ID).ToPacket()); m_ActiveConnections.Remove(connection.Session.ID); connection = null; } }
/// <summary> ///Closes active <see cref="UserConnection"/> but not requests cache to drop user session ( when going to world ). /// </summary> /// <param name="connection"><see cref="UserConnection"/> object to remove from active connections list.</param> internal static void CloseConnectionWithoutLogout( UserConnection connection ) { if ( connection != null ) { connection.CloseConnection(); m_ActiveConnections.Remove(connection.Session.ID); connection = null; } }