using System;
using System.Globalization;
namespace FastReport.Utils
{
///
/// Storage service that replaces direct manipulations with Config.Root xml storage.
///
public class StorageService
{
private string path;
private XmlItem root;
internal XmlItem Root
{
get
{
if (root == null)
Init();
return root;
}
}
private void Init()
{
string[] pathElements = path.Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries);
root = Config.Root;
foreach (string element in pathElements)
{
root = root.FindItem(element);
}
}
///
/// Determines if the key has a value.
///
/// The key to check.
/// True if the key has a non-empty value.
public bool Has(string key) => GetStr(key) != "";
///
/// Determines if the storage is not empty.
///
public bool HasProperties => !Root.IsNullOrEmptyProps();
///
/// Gets a string value.
///
/// The key.
/// Default value.
/// The value associated with a key, or default value.
public string GetStr(string key, string defaultValue = "")
{
string value = Root.GetProp(key);
if (value != "")
return value;
return defaultValue;
}
///
/// Gets a bool value.
///
/// The key.
/// Default value.
/// The value associated with a key, or default value.
public bool GetBool(string key, bool defaultValue = false)
{
string value = GetStr(key);
if (!string.IsNullOrEmpty(value))
return value == "1" || value.ToLower() == "true";
return defaultValue;
}
///
/// Gets an int value.
///
/// The key.
/// Default value.
/// The value associated with a key, or default value.
public int GetInt(string key, int defaultValue = 0)
{
if (int.TryParse(GetStr(key), out int val))
return val;
return defaultValue;
}
///
/// Gets a float value.
///
/// The key.
/// Default value.
/// The value associated with a key, or default value.
public float GetFloat(string key, float defaultValue = 0)
{
if (float.TryParse(GetStr(key).Replace(',', '.'), NumberStyles.Float, CultureInfo.InvariantCulture, out float val))
return val;
return defaultValue;
}
///
/// Gets an enum value.
///
/// The key.
/// Default value.
/// The value associated with a key, or default value.
public T GetEnum(string key, T defaultValue = default(T)) where T : struct
{
string value = GetStr(key);
if (Enum.TryParse(value, out T result))
return result;
return defaultValue;
}
///
/// Reads a serializable object.
///
/// The object to read.
public void Read(IFRSerializable obj)
{
using (FRReader reader = new FRReader(null, Root))
{
reader.Read(obj);
}
}
///
/// Sets a string value.
///
/// The key.
/// Value associated with a key.
public void SetStr(string key, string value)
{
Root.SetProp(key, value);
}
///
/// Sets a bool value as a 0/1.
///
/// The key.
/// Value associated with a key.
public void SetBool(string key, bool value)
{
SetStr(key, value ? "1" : "0");
}
///
/// Sets a bool value as a False/True.
///
/// The key.
/// Value associated with a key.
public void SetBoolStr(string key, bool value)
{
SetStr(key, value ? "True" : "False");
}
///
/// Sets an int value.
///
/// The key.
/// Value associated with a key.
public void SetInt(string key, int value)
{
SetStr(key, value.ToString());
}
///
/// Sets a float value.
///
/// The key.
/// Value associated with a key.
public void SetFloat(string key, float value)
{
SetStr(key, value.ToString(CultureInfo.InvariantCulture));
}
///
/// Sets an enum value.
///
/// The key.
/// Value associated with a key.
public void SetEnum(string key, T value) where T : struct
{
SetStr(key, value.ToString());
}
///
/// Writes a serializable object.
///
/// The object to write.
public void Write(IFRSerializable obj)
{
using (FRWriter writer = new FRWriter(Root))
{
Root.Items.Clear();
writer.Write(obj);
}
}
///
/// Initializes a new instance of a storage.
///
/// The comma-separated path.
public StorageService(string commaSeparatedPath)
{
path = commaSeparatedPath;
}
}
}