ConfigAttr.cs
上传用户:szltgg
上传日期:2019-05-16
资源大小:604k
文件大小:8k
源码类别:

Telnet服务器

开发平台:

C#

  1. /*
  2.  Copyright (c) 2005 Poderosa Project, All Rights Reserved.
  3.  This file is a part of the Granados SSH Client Library that is subject to
  4.  the license included in the distributed package.
  5.  You may not use this file except in compliance with the license.
  6.  $Id: ConfigAttr.cs,v 1.2 2005/04/20 09:06:03 okajima Exp $
  7. */
  8. using System;
  9. using System.Diagnostics;
  10. using System.Reflection;
  11. using System.Text;
  12. namespace Poderosa.Config
  13. {
  14. [AttributeUsage(AttributeTargets.Field, AllowMultiple=false)]
  15. public abstract class ConfigElementAttribute : Attribute {
  16. protected string _externalName;
  17. protected FieldInfo _fieldInfo;
  18. public FieldInfo FieldInfo {
  19. get {
  20. return _fieldInfo;
  21. }
  22. set {
  23. _fieldInfo = value;
  24. _externalName = ToExternalName(_fieldInfo.Name);
  25. }
  26. }
  27. public string ExternalName {
  28. get {
  29. return _externalName;
  30. }
  31. }
  32. public static string ToExternalName(string value) {
  33. //if the field name starts with '_', strip it off
  34. if(value[0]=='_')
  35. return value.Substring(1);
  36. else
  37. return value;
  38. }
  39. public abstract void ExportTo(object holder, ConfigNode node);
  40. public abstract void ImportFrom(object holder, ConfigNode node);
  41. public abstract void Reset(object holder);
  42. }
  43. [AttributeUsage(AttributeTargets.Field, AllowMultiple=false)]
  44. public class ConfigIntElementAttribute : ConfigElementAttribute {
  45. private int _initial;
  46. public int Initial {
  47. get {
  48. return _initial;
  49. }
  50. set {
  51. _initial = value;
  52. }
  53. }
  54. public override void ExportTo(object holder, ConfigNode node) {
  55. int value = (int)_fieldInfo.GetValue(holder);
  56. if(value!=_initial)
  57. node[_externalName] = value.ToString();
  58. }
  59. public override void ImportFrom(object holder, ConfigNode node) {
  60. _fieldInfo.SetValue(holder, ParseInt(node[_externalName], _initial));
  61. }
  62. public override void Reset(object holder) {
  63. _fieldInfo.SetValue(holder, _initial);
  64. }
  65. public static int ParseInt(string value, int defaultvalue) {
  66. try {
  67. if(value==null || value.Length==0)
  68. return defaultvalue;
  69. else
  70. return Int32.Parse(value);
  71. }
  72. catch(Exception) {
  73. return defaultvalue;
  74. }
  75. }
  76. }
  77. [AttributeUsage(AttributeTargets.Field, AllowMultiple=false)]
  78. public class ConfigBoolElementAttribute : ConfigElementAttribute {
  79. private bool _initial;
  80. public bool Initial {
  81. get {
  82. return _initial;
  83. }
  84. set {
  85. _initial = value;
  86. }
  87. }
  88. public override void ExportTo(object holder, ConfigNode node) {
  89. bool value = (bool)_fieldInfo.GetValue(holder);
  90. if(value!=_initial)
  91. node[_externalName] = value.ToString();
  92. }
  93. public override void ImportFrom(object holder, ConfigNode node) {
  94. _fieldInfo.SetValue(holder, ParseBool(node[_externalName], _initial));
  95. }
  96. public override void Reset(object holder) {
  97. _fieldInfo.SetValue(holder, _initial);
  98. }
  99. public static bool ParseBool(string value, bool defaultvalue) {
  100. try {
  101. if(value==null || value.Length==0)
  102. return defaultvalue;
  103. else
  104. return Boolean.Parse(value);
  105. }
  106. catch(Exception) {
  107. return defaultvalue;
  108. }
  109. }
  110. }
  111. [AttributeUsage(AttributeTargets.Field, AllowMultiple=false)]
  112. public class ConfigFloatElementAttribute : ConfigElementAttribute {
  113. private float _initial;
  114. public float Initial {
  115. get {
  116. return _initial;
  117. }
  118. set {
  119. _initial = value;
  120. }
  121. }
  122. public override void ExportTo(object holder, ConfigNode node) {
  123. float value = (float)_fieldInfo.GetValue(holder);
  124. if(value!=_initial)
  125. node[_externalName] = value.ToString();
  126. }
  127. public override void ImportFrom(object holder, ConfigNode node) {
  128. _fieldInfo.SetValue(holder, ParseFloat(node[_externalName], _initial));
  129. }
  130. public override void Reset(object holder) {
  131. _fieldInfo.SetValue(holder, _initial);
  132. }
  133. public static float ParseFloat(string value, float defaultvalue) {
  134. try {
  135. if(value==null || value.Length==0)
  136. return defaultvalue;
  137. else
  138. return Single.Parse(value);
  139. }
  140. catch(Exception) {
  141. return defaultvalue;
  142. }
  143. }
  144. }
  145. [AttributeUsage(AttributeTargets.Field, AllowMultiple=false)]
  146. public class ConfigStringElementAttribute : ConfigElementAttribute {
  147. private string _initial;
  148. public string Initial {
  149. get {
  150. return _initial;
  151. }
  152. set {
  153. _initial = value;
  154. }
  155. }
  156. public override void ExportTo(object holder, ConfigNode node) {
  157. string value = _fieldInfo.GetValue(holder) as string;
  158. if(value!=_initial)
  159. node[_externalName] = value==null? "" : value;
  160. }
  161. public override void ImportFrom(object holder, ConfigNode node) {
  162. string t = node[_externalName];
  163. _fieldInfo.SetValue(holder, t==null? _initial : t);
  164. }
  165. public override void Reset(object holder) {
  166. _fieldInfo.SetValue(holder, _initial);
  167. }
  168. }
  169. [AttributeUsage(AttributeTargets.Field, AllowMultiple=false)]
  170. public class ConfigStringArrayElementAttribute : ConfigElementAttribute {
  171. private string[] _initial;
  172. public string[] Initial {
  173. get {
  174. return _initial;
  175. }
  176. set {
  177. _initial = value;
  178. }
  179. }
  180. public override void ExportTo(object holder, ConfigNode node) {
  181. string[] t = (string[])_fieldInfo.GetValue(holder);
  182. StringBuilder bld = new StringBuilder();
  183. foreach(string a in t) {
  184. if(bld.Length>0) bld.Append(',');
  185. bld.Append(a);
  186. }
  187. node[_externalName] = bld.ToString();
  188. }
  189. public override void ImportFrom(object holder, ConfigNode node) {
  190. string t = node[_externalName];
  191. _fieldInfo.SetValue(holder, t==null? _initial : t.Split(','));
  192. }
  193. public override void Reset(object holder) {
  194. _fieldInfo.SetValue(holder, _initial);
  195. }
  196. }
  197. [AttributeUsage(AttributeTargets.Field, AllowMultiple=false)]
  198. public class ConfigEnumElementAttribute : ConfigElementAttribute {
  199. private ValueType _initial;
  200. private Type _enumType;
  201. public ConfigEnumElementAttribute(Type t) {
  202. _enumType = t;
  203. }
  204. public int InitialAsInt {
  205. get {
  206. return (int)_initial;
  207. }
  208. set {
  209. _initial = (ValueType)value;
  210. }
  211. }
  212. public Type Type {
  213. get {
  214. return _enumType;
  215. }
  216. }
  217. public override void ExportTo(object holder, ConfigNode node) {
  218. ValueType value = (ValueType)_fieldInfo.GetValue(holder);
  219. if(value!=_initial)
  220. node[_externalName] = value.ToString();
  221. }
  222. public override void ImportFrom(object holder, ConfigNode node) {
  223. object v = ParseEnum(_enumType, node[_externalName], _initial);
  224. _fieldInfo.SetValue(holder, v);
  225. }
  226. public override void Reset(object holder) {
  227. _fieldInfo.SetValue(holder, Enum.ToObject(_enumType, (int)_initial));
  228. }
  229. public static ValueType ParseEnum(Type enumtype, string t, ValueType defaultvalue) {
  230. try {
  231. if(t==null || t.Length==0)
  232. return (ValueType)Enum.ToObject(enumtype, (int)defaultvalue);
  233. else
  234. return (ValueType)Enum.Parse(enumtype, t, false);
  235. }
  236. catch(FormatException) {
  237. return (ValueType)Enum.ToObject(enumtype, (int)defaultvalue);
  238. }
  239. }
  240. }
  241. [AttributeUsage(AttributeTargets.Field, AllowMultiple=false)]
  242. public class ConfigFlagElementAttribute : ConfigElementAttribute {
  243. private int _initial;
  244. private int _max;
  245. private Type _enumType;
  246. public ConfigFlagElementAttribute(Type t) {
  247. _enumType = t;
  248. }
  249. public int Initial {
  250. get {
  251. return _initial;
  252. }
  253. set {
  254. _initial = value;
  255. }
  256. }
  257. public int Max {
  258. get {
  259. return _max;
  260. }
  261. set {
  262. _max = value;
  263. }
  264. }
  265. public Type Type {
  266. get {
  267. return _enumType;
  268. }
  269. }
  270. public override void ExportTo(object holder, ConfigNode node) {
  271. int value = (int)_fieldInfo.GetValue(holder);
  272. StringBuilder bld = new StringBuilder();
  273. for(int i=1; i<=_max; i<<=1) {
  274. if((i & value)!=0) {
  275. if(bld.Length>0) bld.Append(',');
  276. bld.Append(Enum.GetName(_enumType, i));
  277. }
  278. }
  279. node[_externalName] = bld.ToString();
  280. }
  281. public override void ImportFrom(object holder, ConfigNode node) {
  282. string value = node[_externalName];
  283. if(value==null)
  284. _fieldInfo.SetValue(holder, Enum.ToObject(_enumType, (int)_initial));
  285. else {
  286. int r = 0;
  287. foreach(string t in value.Split(','))
  288. r |= (int)Enum.Parse(_enumType, t, false);
  289. _fieldInfo.SetValue(holder, Enum.ToObject(_enumType, (int)r));
  290. }
  291. }
  292. public override void Reset(object holder) {
  293. _fieldInfo.SetValue(holder, Enum.ToObject(_enumType, (int)_initial));
  294. }
  295. }
  296. }