/* FBuildPatchHTTP implementation *****************************************************************************/ bool FBuildPatchHTTP::Tick( float Delta ) { // Process the http request and cancel queues { FScopeLock ScopeLock( &HttpRequestQueueCS ); if( FBuildPatchInstallError::HasFatalError() ) { // Make sure all requests get canceled if we get fatal error TArray< int32 > RequestKeys; HttpRequestMap.GetKeys( RequestKeys ); CancelRequestQueue.Append( RequestKeys ); while( HttpRequestQueue.Num() > 0 ) { FHttpRequestInfo HttpRequestInfo = HttpRequestQueue.Pop(); HttpRequestInfo.OnCompleteDelegate.ExecuteIfBound( NULL, NULL, false ); } } else { while( HttpRequestQueue.Num() > 0 ) { FHttpRequestInfo HttpRequestInfo = HttpRequestQueue.Pop(); TSharedRef< IHttpRequest > HttpRequest = FHttpModule::Get().CreateRequest(); HttpRequest->OnProcessRequestComplete() = HttpRequestInfo.OnCompleteDelegate; HttpRequest->OnRequestProgress() = HttpRequestInfo.OnProgressDelegate; HttpRequest->SetURL( HttpRequestInfo.UrlRequest ); HttpRequest->ProcessRequest(); HttpRequestMap.Add( HttpRequestInfo.RequestID, HttpRequest ); } } while( CancelRequestQueue.Num() > 0 ) { const int32 CancelID = CancelRequestQueue.Pop(); TWeakPtr< IHttpRequest > HttpRequest = HttpRequestMap.FindRef( CancelID ); HttpRequestMap.Remove( CancelID ); TSharedPtr< IHttpRequest > HttpRequestPinned = HttpRequest.Pin(); if( HttpRequestPinned.IsValid() ) { HttpRequestPinned->CancelRequest(); } } } // Process the Analytics Event queue { FScopeLock ScopeLock( &AnalyticsEventQueueCS ); while( AnalyticsEventQueue.Num() > 0 ) { const FAnalyticsEventInfo& EventInfo = AnalyticsEventQueue[ AnalyticsEventQueue.Num() -1 ]; FBuildPatchAnalytics::RecordEvent( EventInfo.EventName, EventInfo.Attributes ); AnalyticsEventQueue.Pop(); } } return true; }