private void ProcessRemoteSettingsFile(VersionedDeserializedRemoteSettings remoteSettings)
 {
     if (!cancellationTokenSource.IsCancellationRequested)
     {
         if (remoteSettingsStorageHandler.DoSettingsNeedToBeUpdated(remoteSettings.FileVersion))
         {
             IRemoteSettingsTelemetryActivity remoteSettingsTelemetryActivity = remoteSettingsTelemetry.CreateActivity("VS/Core/RemoteSettings/Apply");
             using (Mutex mutex = new Mutex(false, "Global\\7BCAEF5B-E7EA-428D-84AF-105BCD4D93FC-" + fileName.Replace('.', '-')))
             {
                 bool flag = false;
                 try
                 {
                     flag = mutex.WaitOne(-1, false);
                 }
                 catch (AbandonedMutexException)
                 {
                     flag = true;
                 }
                 if (flag)
                 {
                     if (!remoteSettingsStorageHandler.DoSettingsNeedToBeUpdated(remoteSettings.FileVersion))
                     {
                         return;
                     }
                     remoteSettingsTelemetryActivity.Start();
                     logger.LogVerbose("Applying new settings for " + Name);
                     if (remoteSettingsStorageHandler.FileVersion == string.Empty)
                     {
                         remoteSettingsStorageHandler.DeleteAllSettings();
                         remoteSettingsStorageHandler.SaveSettings(remoteSettings);
                     }
                     else
                     {
                         remoteSettingsStorageHandler.DeleteSettingsForFileVersion(remoteSettings.FileVersion);
                         remoteSettingsStorageHandler.SaveSettings(remoteSettings);
                         remoteSettingsStorageHandler.CleanUpOldFileVersions(remoteSettings.FileVersion);
                     }
                     remoteSettingsTelemetryActivity.End();
                     mutex.ReleaseMutex();
                 }
             }
             remoteSettingsTelemetryActivity.Post(new Dictionary <string, object>
             {
                 {
                     "VS.Core.RemoteSettings.SettingsCount",
                     remoteSettings.Settings.Count
                 }
             });
         }
         else
         {
             logger.LogVerbose("Settings for " + Name + " are the same as cached version");
             ValidateStoredRemoteSettings();
         }
     }
 }
        public void SaveSettings(VersionedDeserializedRemoteSettings remoteSettings)
        {
            string text = Path.Combine(CollectionPathPrefix, remoteSettings.FileVersion);

            SaveSettingsInternal(text, new GroupedRemoteSettings(remoteSettings, null));
            if (remoteSettings.Scopes != null)
            {
                foreach (Scope scope in remoteSettings.Scopes)
                {
                    remoteSettingsStorage.SetValue(Path.Combine(text, "Scopes"), scope.Name, scope.ScopeString);
                }
            }
            if (remoteSettingsStorage.CollectionExists(text))
            {
                FileVersion           = remoteSettings.FileVersion;
                StoredSettingsVersion = 2;
            }
        }
 /// <summary>
 /// Starts a background operation to check for new Remote Settings and apply them.
 /// </summary>
 /// <returns>Remote settings from file</returns>
 public override Task <GroupedRemoteSettings> Start()
 {
     RequiresNotDisposed();
     startTask = Task.Run(async delegate
     {
         string settingsFileEventName = "VS/Core/RemoteSettings/GetSettingsFileContent";
         Dictionary <string, object> settingsFileEventProperties = new Dictionary <string, object>();
         using (Stream stream = await remoteFileReader.Value.ReadFileAsync())
         {
             if (stream != null)
             {
                 settingsFileEventProperties["VS.Core.RemoteSettings.GetContentsSucceeded"] = true;
                 remoteSettingsTelemetry.PostEvent(settingsFileEventName, settingsFileEventProperties);
                 string name = "VS/Core/RemoteSettings/ParseSettings";
                 Dictionary <string, object> dictionary = new Dictionary <string, object>();
                 VersionedDeserializedRemoteSettings versionedDeserializedRemoteSettings = remoteSettingsParser.TryParseVersionedStream(stream);
                 if (!versionedDeserializedRemoteSettings.Successful)
                 {
                     logger.LogError("Error deserializing RemoteControl file: " + versionedDeserializedRemoteSettings.Error);
                     dictionary["VS.Core.RemoteSettings.ErrorMessage"] = versionedDeserializedRemoteSettings.Error;
                     remoteSettingsTelemetry.PostEvent(name, dictionary);
                     ValidateStoredRemoteSettings();
                     return(null);
                 }
                 logger.LogVerbose("Got " + Name + " settings of version " + versionedDeserializedRemoteSettings.FileVersion + " with ChangesetId " + versionedDeserializedRemoteSettings.ChangesetId);
                 dictionary["VS.Core.RemoteSettings.SettingsFileVersion"]   = versionedDeserializedRemoteSettings.FileVersion;
                 dictionary["VS.Core.RemoteSettings.SettingsFileChangeSet"] = versionedDeserializedRemoteSettings.ChangesetId;
                 remoteSettingsTelemetry.PostEvent(name, dictionary);
                 ProcessRemoteSettingsFile(versionedDeserializedRemoteSettings);
                 return(new GroupedRemoteSettings(versionedDeserializedRemoteSettings, Name));
             }
             if (startedDisposing == 0)
             {
                 settingsFileEventProperties["VS.Core.RemoteSettings.GetContentsSucceeded"] = false;
                 remoteSettingsTelemetry.PostEvent(settingsFileEventName, settingsFileEventProperties);
                 ValidateStoredRemoteSettings();
             }
         }
         return(null);
     });
     return(startTask);
 }