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++; }
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; } }
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); }
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); } }
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); }