コード例 #1
0
        /// <summary>
        /// Gets the web request status.
        /// </summary>
        /// <returns>The web request status.</returns>
        /// <param name="in_requestState">In_request state.</param>
        private eWebRequestStatus GetWebRequestStatus(RequestState in_requestState)
        {
            eWebRequestStatus status = eWebRequestStatus.STATUS_PENDING;

            // for testing packet loss, some packets are flagged to be lost
            // and should always return status pending no matter what the real
            // status is
            if (m_activeRequest.LoseThisPacket)
            {
                return(status);
            }

#if !(DOT_NET)
            if (m_activeRequest.WebRequest.error != null)
            {
                status = eWebRequestStatus.STATUS_ERROR;
            }
            else if (m_activeRequest.WebRequest.isDone)
            {
                status = eWebRequestStatus.STATUS_DONE;
            }
#endif
            return(status);
        }
コード例 #2
0
        /// <summary>
        /// The update method needs to be called periodically to send/receive responses
        /// and run the associated callbacks.
        /// </summary>
        public void Update()
        {
            // basic flow here is to:
            // 1- process existing requests
            // 2- send next request
            // 3- handle heartbeat/timeouts

            if (!m_initialized)
            {
                return;
            }
            if (!m_enabled)
            {
                return;
            }

            // process current request
            if (m_activeRequest != null)
            {
                eWebRequestStatus status = GetWebRequestStatus(m_activeRequest);
                if (status == eWebRequestStatus.STATUS_ERROR)
                {
                    // do nothing with the error right now - let the timeout code handle it
                }
                else if (status == eWebRequestStatus.STATUS_DONE)
                {
                    ResetIdleTimer();

                    // note that active request is set to null if exception is to be thrown
                    HandleResponseBundle(GetWebRequestResponse(m_activeRequest));

                    m_activeRequest = null;
                }
            }

            // send the next message if we're ready
            if (m_activeRequest == null)
            {
                m_activeRequest = CreateAndSendNextRequestBundle();
            }

            // is it time for a retry?
            if (m_activeRequest != null)
            {
                if (DateTime.Now.Subtract(m_activeRequest.TimeSent) >= GetPacketTimeout(m_activeRequest.Retries))
                {
                    if (!ResendMessage(m_activeRequest))
                    {
                        // we've reached the retry limit - send timeout error to all client callbacks

                        eWebRequestStatus status = GetWebRequestStatus(m_activeRequest);
                        if (status == eWebRequestStatus.STATUS_ERROR)
                        {
                            m_brainCloudClientRef.Log("Timeout with network error: " + GetWebRequestResponse(m_activeRequest));
                        }
                        else
                        {
                            m_brainCloudClientRef.Log("Timeout no reply from server");
                        }

                        m_activeRequest = null;

                        // Fake a message bundle to keep the callback logic in one place
                        TriggerCommsError(StatusCodes.CLIENT_NETWORK_ERROR, ReasonCodes.CLIENT_NETWORK_ERROR_TIMEOUT, "Timeout trying to reach brainCloud server");
                    }
                }
            }

            // is it time for a heartbeat?
            if (Authenticated)
            {
                if (DateTime.Now.Subtract(m_lastTimePacketSent) >= m_idleTimeout)
                {
                    SendHeartbeat();
                }
            }
        }