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; } } }