/* 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;
}