StorageService.cs 6.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210
  1. using System;
  2. using System.Globalization;
  3. namespace FastReport.Utils
  4. {
  5. /// <summary>
  6. /// Storage service that replaces direct manipulations with Config.Root xml storage.
  7. /// </summary>
  8. public class StorageService
  9. {
  10. private string path;
  11. private XmlItem root;
  12. internal XmlItem Root
  13. {
  14. get
  15. {
  16. if (root == null)
  17. Init();
  18. return root;
  19. }
  20. }
  21. private void Init()
  22. {
  23. string[] pathElements = path.Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries);
  24. root = Config.Root;
  25. foreach (string element in pathElements)
  26. {
  27. root = root.FindItem(element);
  28. }
  29. }
  30. /// <summary>
  31. /// Determines if the key has a value.
  32. /// </summary>
  33. /// <param name="key">The key to check.</param>
  34. /// <returns>True if the key has a non-empty value.</returns>
  35. public bool Has(string key) => GetStr(key) != "";
  36. /// <summary>
  37. /// Determines if the storage is not empty.
  38. /// </summary>
  39. public bool HasProperties => !Root.IsNullOrEmptyProps();
  40. /// <summary>
  41. /// Gets a string value.
  42. /// </summary>
  43. /// <param name="key">The key.</param>
  44. /// <param name="defaultValue">Default value.</param>
  45. /// <returns>The value associated with a key, or default value.</returns>
  46. public string GetStr(string key, string defaultValue = "")
  47. {
  48. string value = Root.GetProp(key);
  49. if (value != "")
  50. return value;
  51. return defaultValue;
  52. }
  53. /// <summary>
  54. /// Gets a bool value.
  55. /// </summary>
  56. /// <param name="key">The key.</param>
  57. /// <param name="defaultValue">Default value.</param>
  58. /// <returns>The value associated with a key, or default value.</returns>
  59. public bool GetBool(string key, bool defaultValue = false)
  60. {
  61. string value = GetStr(key);
  62. if (!string.IsNullOrEmpty(value))
  63. return value == "1" || value.ToLower() == "true";
  64. return defaultValue;
  65. }
  66. /// <summary>
  67. /// Gets an int value.
  68. /// </summary>
  69. /// <param name="key">The key.</param>
  70. /// <param name="defaultValue">Default value.</param>
  71. /// <returns>The value associated with a key, or default value.</returns>
  72. public int GetInt(string key, int defaultValue = 0)
  73. {
  74. if (int.TryParse(GetStr(key), out int val))
  75. return val;
  76. return defaultValue;
  77. }
  78. /// <summary>
  79. /// Gets a float value.
  80. /// </summary>
  81. /// <param name="key">The key.</param>
  82. /// <param name="defaultValue">Default value.</param>
  83. /// <returns>The value associated with a key, or default value.</returns>
  84. public float GetFloat(string key, float defaultValue = 0)
  85. {
  86. if (float.TryParse(GetStr(key).Replace(',', '.'), NumberStyles.Float, CultureInfo.InvariantCulture, out float val))
  87. return val;
  88. return defaultValue;
  89. }
  90. /// <summary>
  91. /// Gets an enum value.
  92. /// </summary>
  93. /// <param name="key">The key.</param>
  94. /// <param name="defaultValue">Default value.</param>
  95. /// <returns>The value associated with a key, or default value.</returns>
  96. public T GetEnum<T>(string key, T defaultValue = default(T)) where T : struct
  97. {
  98. string value = GetStr(key);
  99. if (Enum.TryParse<T>(value, out T result))
  100. return result;
  101. return defaultValue;
  102. }
  103. /// <summary>
  104. /// Reads a serializable object.
  105. /// </summary>
  106. /// <param name="obj">The object to read.</param>
  107. public void Read(IFRSerializable obj)
  108. {
  109. using (FRReader reader = new FRReader(null, Root))
  110. {
  111. reader.Read(obj);
  112. }
  113. }
  114. /// <summary>
  115. /// Sets a string value.
  116. /// </summary>
  117. /// <param name="key">The key.</param>
  118. /// <param name="value">Value associated with a key.</param>
  119. public void SetStr(string key, string value)
  120. {
  121. Root.SetProp(key, value);
  122. }
  123. /// <summary>
  124. /// Sets a bool value as a 0/1.
  125. /// </summary>
  126. /// <param name="key">The key.</param>
  127. /// <param name="value">Value associated with a key.</param>
  128. public void SetBool(string key, bool value)
  129. {
  130. SetStr(key, value ? "1" : "0");
  131. }
  132. /// <summary>
  133. /// Sets a bool value as a False/True.
  134. /// </summary>
  135. /// <param name="key">The key.</param>
  136. /// <param name="value">Value associated with a key.</param>
  137. public void SetBoolStr(string key, bool value)
  138. {
  139. SetStr(key, value ? "True" : "False");
  140. }
  141. /// <summary>
  142. /// Sets an int value.
  143. /// </summary>
  144. /// <param name="key">The key.</param>
  145. /// <param name="value">Value associated with a key.</param>
  146. public void SetInt(string key, int value)
  147. {
  148. SetStr(key, value.ToString());
  149. }
  150. /// <summary>
  151. /// Sets a float value.
  152. /// </summary>
  153. /// <param name="key">The key.</param>
  154. /// <param name="value">Value associated with a key.</param>
  155. public void SetFloat(string key, float value)
  156. {
  157. SetStr(key, value.ToString(CultureInfo.InvariantCulture));
  158. }
  159. /// <summary>
  160. /// Sets an enum value.
  161. /// </summary>
  162. /// <param name="key">The key.</param>
  163. /// <param name="value">Value associated with a key.</param>
  164. public void SetEnum<T>(string key, T value) where T : struct
  165. {
  166. SetStr(key, value.ToString());
  167. }
  168. /// <summary>
  169. /// Writes a serializable object.
  170. /// </summary>
  171. /// <param name="obj">The object to write.</param>
  172. public void Write(IFRSerializable obj)
  173. {
  174. using (FRWriter writer = new FRWriter(Root))
  175. {
  176. Root.Items.Clear();
  177. writer.Write(obj);
  178. }
  179. }
  180. /// <summary>
  181. /// Initializes a new instance of a storage.
  182. /// </summary>
  183. /// <param name="commaSeparatedPath">The comma-separated path.</param>
  184. public StorageService(string commaSeparatedPath)
  185. {
  186. path = commaSeparatedPath;
  187. }
  188. }
  189. }