/// <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;
        }
Example #4
0
 /// <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;
     }
 }