/// <summary>
 /// Logs an event with a stack trace and exception.
 /// </summary>
 /// <param name="level">The level.</param>
 /// <param name="message">The message.</param>
 /// <param name="stackTrace">The stack trace.</param>
 /// <param name="exception">The exception.</param>
 private void LogEvent(UserReportEventLevel level, string message, string stackTrace, Exception exception)
 {
     lock (this.events)
     {
         UserReportEvent userReportEvent = new UserReportEvent();
         userReportEvent.Level       = level;
         userReportEvent.Message     = message;
         userReportEvent.FrameNumber = this.frameNumber;
         userReportEvent.StackTrace  = stackTrace;
         userReportEvent.Timestamp   = DateTime.UtcNow;
         if (exception != null)
         {
             userReportEvent.Exception = new SerializableException(exception);
         }
         this.events.Add(userReportEvent);
     }
 }
        /// <inheritdoc cref="IUserReportingPlatform"/>
        public void Update(UserReportingClient client)
        {
            // Log Messages
            lock (this.logMessages)
            {
                foreach (LogMessage logMessage in this.logMessages)
                {
                    UserReportEventLevel eventLevel = UserReportEventLevel.Info;
                    if (logMessage.LogType == LogType.Warning)
                    {
                        eventLevel = UserReportEventLevel.Warning;
                    }
                    else if (logMessage.LogType == LogType.Error)
                    {
                        eventLevel = UserReportEventLevel.Error;
                    }
                    else if (logMessage.LogType == LogType.Exception)
                    {
                        eventLevel = UserReportEventLevel.Error;
                    }
                    else if (logMessage.LogType == LogType.Assert)
                    {
                        eventLevel = UserReportEventLevel.Error;
                    }
                    if (client.IsConnectedToLogger)
                    {
                        client.LogEvent(eventLevel, logMessage.LogString, logMessage.StackTrace);
                    }
                }
                this.logMessages.Clear();
            }

            // Metrics
            if (client.Configuration.MetricsGatheringMode == MetricsGatheringMode.Automatic)
            {
                // Sample Automatic Metrics
                this.SampleAutomaticMetrics(client);

                // Profiler Samplers
                foreach (ProfilerSampler profilerSampler in this.profilerSamplers)
                {
                    client.SampleMetric(profilerSampler.Name, profilerSampler.GetValue());
                }
            }

            // Post Operations
            int postOperationIndex = 0;

            while (postOperationIndex < this.postOperations.Count)
            {
                UnityUserReportingPlatform.PostOperation postOperation = this.postOperations[postOperationIndex];
                if (postOperation.WebRequest.isDone)
                {
                    bool isError = postOperation.WebRequest.error != null && postOperation.WebRequest.responseCode != 200;
                    if (isError)
                    {
                        string errorMessage = string.Format("UnityUserReportingPlatform.Post: {0} {1}", postOperation.WebRequest.responseCode, postOperation.WebRequest.error);
                        UnityEngine.Debug.Log(errorMessage);
                        client.LogEvent(UserReportEventLevel.Error, errorMessage);
                    }
                    postOperation.ProgressCallback(1, 1);
                    postOperation.Callback(!isError, postOperation.WebRequest.downloadHandler.data);
                    this.postOperations.Remove(postOperation);
                }
                else
                {
                    postOperation.ProgressCallback(postOperation.WebRequest.uploadProgress, postOperation.WebRequest.downloadProgress);
                    postOperationIndex++;
                }
            }
        }
 /// <summary>
 /// Logs an event.
 /// </summary>
 /// <param name="level">The level.</param>
 /// <param name="message">The message.</param>
 /// <param name="stackTrace">The stack trace.</param>
 public void LogEvent(UserReportEventLevel level, string message, string stackTrace)
 {
     this.LogEvent(level, message, stackTrace, null);
 }