/// <summary>
        /// Add / Edit a collector via device twin.
        /// </summary>
        private async void SetCollectorButton_ClickAsync(object sender, RoutedEventArgs e)
        {
            string collectorName    = CollectorNameInput.Text;
            string collectorMaxSize = CollectorMaxSizeInput.Text;

            if (collectorName.Length == 0 || collectorMaxSize.Length == 0)
            {
                _mainPage.ShowDialogAsync("Invaid Input", "Please make sure Collector Name and Max Size is not empty");
                return;
            }
            int collectorMaxFileSize = 0;

            if (!Int32.TryParse(CollectorMaxSizeInput.Text, out collectorMaxFileSize))
            {
                _mainPage.ShowDialogAsync("Invaid Input", " Max Size is not Integer");
                return;
            }

            EventTracingDataContract.CollectorInner collectorInner = new EventTracingDataContract.CollectorInner
            {
                name               = collectorName,
                traceMode          = EventTracingDataContract.TraceModeFromJsonString(CollectorModeCombobox.SelectedValue.ToString()),
                logFileSizeLimitMB = collectorMaxFileSize,
                logFileFolder      = CollectorFolderNameInput.Text,
                logFileName        = CollectorFileNameInput.Text,
                started            = CollectorStartedChckbx.IsChecked == true
            };

            if (AddProviderChckbx.IsChecked == true)
            {
                if (ProviderGUIDInput.Text.Length == 0)
                {
                    _mainPage.ShowDialogAsync("Invaid Input", "Please make sure Provider GUID is not empty");
                    return;
                }
                EventTracingDataContract.Provider provider = new EventTracingDataContract.Provider();
                provider.guid       = ProviderGUIDInput.Text;
                provider.traceLevel = EventTracingDataContract.TraceLevelFromJsonString(ProviderTraceLevelCombobox.SelectedValue.ToString());
                provider.keywords   = ProviderKeywordsInput.Text;
                provider.enabled    = ProviderEnabledChckbx.IsChecked == true;
                collectorInner.providers.Add(provider);
            }

            string refreshingValue = "\"refreshing\"";
            string finalValue      = "{ \"eventTracingCollectors\" : {\"" + collectorName + "\": {\"applyProperties\" : " + JsonConvert.SerializeObject(collectorInner.ToJsonObject()) + ", \"reportProperties\": \"yes\"}}}";
            await _mainPage.UpdateTwinData(refreshingValue, finalValue);
        }
        public static EventTracingDataContract.CollectorInner CollectorInnerFromMessage(CollectorReportedConfiguration msgCollector)
        {
            EventTracingDataContract.CollectorInner collectorInner = new EventTracingDataContract.CollectorInner();

            collectorInner.name               = msgCollector.Name;
            collectorInner.logFileFolder      = msgCollector.CSPConfiguration.LogFileFolder;
            collectorInner.logFileName        = msgCollector.CSPConfiguration.LogFileName;
            collectorInner.logFileSizeLimitMB = msgCollector.CSPConfiguration.LogFileSizeLimitMB;
            collectorInner.started            = msgCollector.CSPConfiguration.Started;

            foreach (ProviderConfiguration msgProvider in msgCollector.CSPConfiguration.Providers)
            {
                collectorInner.providers.Add(ProviderFromMessage(msgProvider));
            }

            return(collectorInner);
        }
        private static CollectorCSPConfiguration CollectorInternalToMessage(EventTracingDataContract.CollectorInner collector)
        {
            Logger.Log("Reading collector CSP desired configuration...", LoggingLevel.Information);

            CollectorCSPConfiguration cspConfiguration = new CollectorCSPConfiguration();

            cspConfiguration.LogFileFolder      = collector.logFileFolder;
            cspConfiguration.LogFileName        = collector.logFileName;
            cspConfiguration.LogFileSizeLimitMB = collector.logFileSizeLimitMB;
            cspConfiguration.TraceLogFileMode   = EventTracingDataContract.TraceModeToJsonString(collector.traceMode);
            cspConfiguration.Started            = collector.started;
            foreach (EventTracingDataContract.Provider provider in collector.providers)
            {
                ProviderConfiguration msgProvider = ProviderToMessage(provider);
                cspConfiguration.Providers.Add(msgProvider);
            }
            return(cspConfiguration);
        }
        /// <summary>
        /// Update collector list view with json parameter.
        /// </summary>
        /// <param name="token">The json object that describes the collector list.</param>
        private void EventTracingJsonToUI(JToken twinResult)
        {
            if (!(twinResult is JObject))
            {
                _mainPage.ShowDialogAsync("Read Diagnistic Log Twin Error", "Invalid apps node json format!");
                return;
            }

            List <CollectorReported> collectorList = new List <CollectorReported>();
            List <EventTracingDataContract.CollectorInner> collectorInners = new List <EventTracingDataContract.CollectorInner>();
            string lastChangeTime = string.Empty;

            JObject root = (JObject)twinResult;

            foreach (JToken p in root.Children())
            {
                if (!(p is JProperty))
                {
                    continue;
                }

                JProperty childProperty = (JProperty)p;
                if (childProperty.Name == "lastChange")
                {
                    var timeToken = childProperty.Value.SelectToken("time");
                    if (timeToken != null)
                    {
                        lastChangeTime = "Last Update: " + timeToken.ToString();
                    }
                }
                else
                {
                    CollectorReported collectorReported = new CollectorReported();

                    collectorReported.Name = childProperty.Name;
                    EventTracingDataContract.CollectorInner collectorInner = EventTracingDataContract.CollectorInner.FromJsonObject((JObject)childProperty.Value);
                    collectorReported.CollectorInners = collectorInner;
                    collectorList.Add(collectorReported);
                }
            }
            LastChangeTime.Text            = lastChangeTime;
            CollectorsListView.ItemsSource = collectorList;
        }