Skip to content

Commit

Permalink
Merge pull request #1172 from Catel/feature/#1027
Browse files Browse the repository at this point in the history
(+) #1027 Allow configuration service to choose path format
  • Loading branch information
GeertvanHorrik committed Mar 22, 2018
2 parents cf0b9ae + a13b6cd commit c0137c5
Show file tree
Hide file tree
Showing 3 changed files with 105 additions and 51 deletions.
1 change: 1 addition & 0 deletions doc/history.txt
Expand Up @@ -38,6 +38,7 @@ Classes / members marked as obsolete:

Added/fixed:
============
(+) #1027 Allow configuration service to choose path format
(*) #1166 Nesting with ChildAwareModelBase now supports more than one layer
(*) #1169 Improve FormattingConverter to allow more usages

Expand Down
141 changes: 90 additions & 51 deletions src/Catel.Core/Catel.Core.Shared/Configuration/ConfigurationService.cs
Expand Up @@ -34,18 +34,22 @@ namespace Catel.Configuration
/// </summary>
public partial class ConfigurationService : IConfigurationService
{
private static readonly string DefaultLocalConfigFilePath = Path.Combine(Path.GetApplicationDataDirectory(Catel.IO.ApplicationDataTarget.UserLocal), "configuration.xml");

private static readonly string DefaultRoamingConfigFilePath = Path.Combine(Path.GetApplicationDataDirectory(Catel.IO.ApplicationDataTarget.UserRoaming), "configuration.xml");

private static readonly ILog Log = LogManager.GetCurrentClassLogger();

private readonly ISerializationManager _serializationManager;
private readonly IObjectConverterService _objectConverterService;
private readonly ISerializer _serializer;

#if NET || NETSTANDARD
private readonly DynamicConfiguration _localConfiguration;
private readonly DynamicConfiguration _roamingConfiguration;
private DynamicConfiguration _localConfiguration;
private DynamicConfiguration _roamingConfiguration;

private readonly string _localConfigFilePath;
private readonly string _roamingConfigFilePath;
private string _localConfigFilePath;
private string _roamingConfigFilePath;
#elif ANDROID
private readonly global::Android.Content.ISharedPreferences _preferences =
global::Android.Preferences.PreferenceManager.GetDefaultSharedPreferences(global::Android.App.Application.Context);
Expand Down Expand Up @@ -84,60 +88,19 @@ public partial class ConfigurationService : IConfigurationService
_serializer = serializer;

#if NET || NETSTANDARD
_localConfigFilePath = Path.Combine(Path.GetApplicationDataDirectory(Catel.IO.ApplicationDataTarget.UserLocal), "configuration.xml");

try
{
if (File.Exists(_localConfigFilePath))
{
using (var fileStream = new FileStream(_localConfigFilePath, FileMode.Open))
{
_localConfiguration = SavableModelBase<DynamicConfiguration>.Load(fileStream, _serializer);
}
}
}
catch (Exception ex)
{
Log.Error(ex, "Failed to load local configuration, using default settings");
}

if (_localConfiguration == null)
{
_localConfiguration = new DynamicConfiguration();
}

_roamingConfigFilePath = Path.Combine(Path.GetApplicationDataDirectory(Catel.IO.ApplicationDataTarget.UserRoaming), "configuration.xml");

try
{
if (File.Exists(_roamingConfigFilePath))
{
using (var fileStream = new FileStream(_roamingConfigFilePath, FileMode.Open))
{
_roamingConfiguration = SavableModelBase<DynamicConfiguration>.Load(fileStream, _serializer);
}
}
}
catch (Exception ex)
{
Log.Error(ex, "Failed to load roaming configuration, using default settings");
}

if (_roamingConfiguration == null)
{
_roamingConfiguration = new DynamicConfiguration();
}
SetLocalConfigFilePath(DefaultLocalConfigFilePath);
SetRoamingConfigFilePath(DefaultRoamingConfigFilePath);
#endif
}

#region Events
#region Events
/// <summary>
/// Occurs when the configuration has changed.
/// </summary>
public event EventHandler<ConfigurationChangedEventArgs> ConfigurationChanged;
#endregion
#endregion

#region Methods
#region Methods
/// <summary>
/// Suspends the notifications of this service until the returned object is disposed.
/// </summary>
Expand Down Expand Up @@ -262,6 +225,82 @@ public void InitializeValue(ConfigurationContainer container, string key, object
}
}

#if NET || NETSTANDARD
/// <summary>
/// Sets the roaming config file path.
/// </summary>
/// <param name="filePath">The file path. </param>
public void SetRoamingConfigFilePath(string filePath)
{
Argument.IsNotNullOrEmpty(nameof(filePath), filePath);

_roamingConfigFilePath = filePath;

try
{
if (File.Exists(_roamingConfigFilePath))
{
using (var fileStream = new FileStream(_roamingConfigFilePath, FileMode.Open))
{
_roamingConfiguration = SavableModelBase<DynamicConfiguration>.Load(fileStream, _serializer);
}
}
else
{
_roamingConfiguration?.SaveAsXml(_roamingConfigFilePath);
}
}
catch (Exception ex)
{
Log.Error(ex, "Failed to load roaming configuration, using default settings");

_roamingConfigFilePath = DefaultRoamingConfigFilePath;
}

if (_roamingConfiguration == null)
{
_roamingConfiguration = new DynamicConfiguration();
}
}

/// <summary>
/// Sets the roaming config file path.
/// </summary>
/// <param name="filePath">The file path. </param>
public void SetLocalConfigFilePath(string filePath)
{
Argument.IsNotNullOrEmpty(nameof(filePath), filePath);

_localConfigFilePath = filePath;

try
{
if (File.Exists(_localConfigFilePath))
{
using (var fileStream = new FileStream(_localConfigFilePath, FileMode.Open))
{
_localConfiguration = SavableModelBase<DynamicConfiguration>.Load(fileStream, _serializer);
}
}
else
{
_localConfiguration?.SaveAsXml(_localConfigFilePath);
}
}
catch (Exception ex)
{
Log.Error(ex, "Failed to load local configuration, using default settings");

_localConfigFilePath = DefaultLocalConfigFilePath;
}

if (_localConfiguration == null)
{
_localConfiguration = new DynamicConfiguration();
}
}
#endif

/// <summary>
/// Determines whether the specified key value exists in the configuration.
/// </summary>
Expand Down Expand Up @@ -373,6 +412,6 @@ private void RaiseConfigurationChanged(ConfigurationContainer container, string

ConfigurationChanged.SafeInvoke(this, () => new ConfigurationChangedEventArgs(container, key, value));
}
#endregion
#endregion
}
}
Expand Up @@ -63,5 +63,19 @@ public interface IConfigurationService
/// <param name="defaultValue">The default value.</param>
/// <exception cref="ArgumentException">The <paramref name="key" /> is <c>null</c> or whitespace.</exception>
void InitializeValue(ConfigurationContainer container, string key, object defaultValue);

#if NET || NETSTANDARD
/// <summary>
/// Sets the roaming config file path.
/// </summary>
/// <param name="filePath">The file path. </param>
void SetRoamingConfigFilePath(string filePath);

/// <summary>
/// Sets the local config file path.
/// </summary>
/// <param name="filePath">The file path. </param>
void SetLocalConfigFilePath(string filePath);
#endif
}
}

0 comments on commit c0137c5

Please sign in to comment.