Esempio n. 1
0
    private void SendSubscriptionRequest(SystemChannel system)
    {
        int systemId = system.SystemId;

        if (system.Route == 0)
        {
            this.MoveRequestsFromPendingResponseToSend(system, RequestPhase.STARTUP, system.Phases.StartUp);
            this.MoveRequestsFromPendingResponseToSend(system, RequestPhase.RUNNING, system.Phases.Running);
        }
        ClientRequestType request = new ClientRequestType {
            Type              = 0x13a,
            SubID             = 0,
            Body              = ProtobufUtil.ToByteArray(this.m_subscribePacket),
            RequestId         = this.GetNextRequestId(),
            IsSubsribeRequest = true
        };

        system.SubscriptionStatus.CurrentState = SubscriptionStatusType.State.PENDING_RESPONSE;
        system.SubscriptionStatus.LastSend     = DateTime.Now;
        PendingMapType pendingMap = (system.CurrentPhase != RequestPhase.STARTUP) ? system.Phases.Running : system.Phases.StartUp;

        system.SubscriptionStatus.ContexId = this.SendToUtil(system, system.Route, request, pendingMap);
        system.SubscribeAttempt++;
        this.m_state.m_subscribePacketsSent++;
    }
Esempio n. 2
0
    private void ProcessClientRequests(SystemChannel system)
    {
        PendingMapType pendingMap = (system.CurrentPhase != RequestPhase.STARTUP) ? system.Phases.Running : system.Phases.StartUp;

        foreach (KeyValuePair <uint, ClientRequestType> pair in this.m_state.m_contextIdToRequestMap)
        {
            ClientRequestType type2 = pair.Value;
            if ((!type2.IsSubsribeRequest && (type2.System != null)) && ((type2.System.SystemId == system.SystemId) && (system.PendingResponseTimeout != 0)))
            {
                TimeSpan span = (TimeSpan)(DateTime.Now - type2.SendTime);
                if (span.TotalSeconds >= system.PendingResponseTimeout)
                {
                    this.ScheduleResubscribeWithNewRoute(system);
                    return;
                }
            }
        }
        if (pendingMap.PendingSend.Count > 0)
        {
            ClientRequestType request = pendingMap.PendingSend.Dequeue();
            this.SendToUtil(system, system.Route, request, pendingMap);
        }
        else if ((system.CurrentPhase == RequestPhase.STARTUP) && this.m_state.m_runningPhaseEnabled)
        {
            system.CurrentPhase = RequestPhase.RUNNING;
        }
    }
Esempio n. 3
0
    private uint SendToUtil(SystemChannel system, ulong route, ClientRequestType request, PendingMapType pendingMap)
    {
        uint key = this.GenerateContextId();

        BattleNet.SendUtilPacket(request.Type, system.SystemId, request.Body, request.Body.Length, request.SubID, (int)key, route);
        request.Context  = key;
        request.System   = system;
        request.SendTime = DateTime.Now;
        this.m_state.m_contextIdToRequestMap.Add(key, request);
        string str = !request.IsSubsribeRequest ? request.Phase.ToString() : "SUBSCRIBE";

        return(key);
    }
Esempio n. 4
0
    private void MoveRequestsFromPendingResponseToSend(SystemChannel system, RequestPhase phase, PendingMapType pendingMap)
    {
        List <uint> list  = new List <uint>();
        List <uint> list2 = new List <uint>();

        foreach (KeyValuePair <uint, ClientRequestType> pair in this.m_state.m_contextIdToRequestMap)
        {
            uint key = pair.Key;
            ClientRequestType type = pair.Value;
            if ((type.System.SystemId == system.SystemId) && (phase == type.Phase))
            {
                if (type.ShouldRetryOnError)
                {
                    list.Add(key);
                }
                else
                {
                    list2.Add(key);
                }
            }
        }
        foreach (uint num2 in list)
        {
            string            reason = (phase != RequestPhase.STARTUP) ? "moving_to_pending_running_phase" : "moving_to_pending_startup_phase";
            ClientRequestType item   = this.GetClientRequest(num2, reason, true);
            pendingMap.PendingSend.Enqueue(item);
            this.m_state.m_contextIdToDroppedPacketMap.Add(num2, item);
        }
        foreach (uint num3 in list2)
        {
            ClientRequestType type3 = this.GetClientRequest(num3, "moving_to_dropped", true);
            this.m_state.m_contextIdToDroppedPacketMap.Add(num3, type3);
        }
    }
Esempio n. 5
0
    private ClientRequestType GetPendingSendRequestForPhase(uint contextId, bool removeIfFound, PendingMapType pendingMap)
    {
        ClientRequestType         type  = null;
        Queue <ClientRequestType> queue = new Queue <ClientRequestType>();

        foreach (ClientRequestType type2 in pendingMap.PendingSend)
        {
            if ((type == null) && (type2.Context == contextId))
            {
                type = type2;
                if (!removeIfFound)
                {
                    queue.Enqueue(type2);
                }
            }
            else
            {
                queue.Enqueue(type2);
            }
        }
        pendingMap.PendingSend = queue;
        return(type);
    }