void ProcessEvent(Log log)
        {
            if (log.Type != VideoLogTypes.Trace && log.Type != VideoLogTypes.VideoQualitySnapshot)
            {
                // weed these out, there are way too many of them. This is consistent with what a logagent that sends to the server would do too.
                Logs.Add(log);
            }

            IEnumerable<ChartViewModel> charts = ChartViewModel.Charts;
            switch (log.Type)
            {
                case VideoLogTypes.VideoQuality:
                    QualityData = new QualityDataViewModel(log.CastLog<VideoQualityLog>());
                    break;
                case VideoLogTypes.VideoQualitySnapshot:
                    VideoQualitySnapshotLog qualityLog = log.CastLog<VideoQualitySnapshotLog>();

                    foreach (ChartViewModel chartVM in charts)
                    {
                        if (log.Data.ContainsKey(chartVM.QualityAttribute))
                        {
                            if (chartVM.QualityAttribute == VideoLogAttributes.PerceivedBandwidth)
                                chartVM.AddDataPoint(qualityLog.PerceivedBandwidth.GetValueOrDefault(0) / 1024);
                            else
                                chartVM.AddDataPoint(Convert.ToDouble(log.Data[chartVM.QualityAttribute]));
                        }
                    }

                    ClientIP = qualityLog.ClientIP.ToString();
                    EdgeServerIP = qualityLog.EdgeIP;
                    SmoothStreamingUrl = qualityLog.VideoUrl;
                    ProcessCPU = qualityLog.ProcessCPULoad.GetValueOrDefault(0);
                    SystemCPU = qualityLog.SystemCPULoad.GetValueOrDefault(0);

                    break;
                case VideoLogTypes.VideoStarted:
                case VideoLogTypes.VideoLoaded:
                    VideoLoadLog loadLog = log.CastLog<VideoLoadLog>();

                    var bitrateChartData = charts.First(vm => vm.QualityAttribute == VideoLogAttributes.BitRate);
                    if (loadLog.MaxBitRate.HasValue)
                        bitrateChartData.MaxValue = loadLog.MaxBitRate.Value;
                    ClientIP = loadLog.ClientIP.ToString();
                    EdgeServerIP = loadLog.EdgeIP;
                    SmoothStreamingUrl = loadLog.VideoUrl;
                    break;
                case VideoLogTypes.Trace:
                    TraceLogs.Add(log.CastLog<TraceLog>());
                    break;
            }
        }
        void ProcessEvent(Log log)
        {
            if (log.Type != VideoLogTypes.Trace && log.Type != VideoLogTypes.VideoQualitySnapshot)
            {
                // weed these out, there are way too many of them. This is consistent with what a logagent that sends to the server would do too.
                Logs.Add(log);
            }

            IEnumerable <ChartViewModel> charts = ChartViewModel.Charts;

            switch (log.Type)
            {
            case VideoLogTypes.VideoQuality:
                QualityData = new QualityDataViewModel(log.CastLog <VideoQualityLog>());
                break;

            case VideoLogTypes.VideoQualitySnapshot:
                VideoQualitySnapshotLog qualityLog = log.CastLog <VideoQualitySnapshotLog>();

                foreach (ChartViewModel chartVM in charts)
                {
                    if (log.Data.ContainsKey(chartVM.QualityAttribute))
                    {
                        if (chartVM.QualityAttribute == VideoLogAttributes.PerceivedBandwidth)
                        {
                            chartVM.AddDataPoint(qualityLog.PerceivedBandwidth.GetValueOrDefault(0) / 1024);
                        }
                        else
                        {
                            chartVM.AddDataPoint(Convert.ToDouble(log.Data[chartVM.QualityAttribute]));
                        }
                    }
                }

                ClientIP           = qualityLog.ClientIP.ToString();
                EdgeServerIP       = qualityLog.EdgeIP;
                SmoothStreamingUrl = qualityLog.VideoUrl;
                ProcessCPU         = qualityLog.ProcessCPULoad.GetValueOrDefault(0);
                SystemCPU          = qualityLog.SystemCPULoad.GetValueOrDefault(0);

                break;

            case VideoLogTypes.VideoStarted:
            case VideoLogTypes.VideoLoaded:
                VideoLoadLog loadLog = log.CastLog <VideoLoadLog>();

                var bitrateChartData = charts.First(vm => vm.QualityAttribute == VideoLogAttributes.BitRate);
                if (loadLog.MaxBitRate.HasValue)
                {
                    bitrateChartData.MaxValue = loadLog.MaxBitRate.Value;
                }
                ClientIP           = loadLog.ClientIP.ToString();
                EdgeServerIP       = loadLog.EdgeIP;
                SmoothStreamingUrl = loadLog.VideoUrl;
                break;

            case VideoLogTypes.Trace:
                TraceLogs.Add(log.CastLog <TraceLog>());
                break;
            }
        }