PageRenderTime 51ms CodeModel.GetById 26ms RepoModel.GetById 0ms app.codeStats 0ms

/Prebuild/src/Core/Nodes/OptionsNode.cs

https://github.com/UbitUmarov/Ubit-opensim
C# | 634 lines | 437 code | 78 blank | 119 comment | 16 complexity | 691dd5f7e7ce2a06814cdcae611fc40e MD5 | raw file
  1. #region BSD License
  2. /*
  3. Copyright (c) 2004-2005 Matthew Holmes (matthew@wildfiregames.com), Dan Moorehead (dan05a@gmail.com)
  4. Redistribution and use in source and binary forms, with or without modification, are permitted
  5. provided that the following conditions are met:
  6. * Redistributions of source code must retain the above copyright notice, this list of conditions
  7. and the following disclaimer.
  8. * Redistributions in binary form must reproduce the above copyright notice, this list of conditions
  9. and the following disclaimer in the documentation and/or other materials provided with the
  10. distribution.
  11. * The name of the author may not be used to endorse or promote products derived from this software
  12. without specific prior written permission.
  13. THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,
  14. BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
  15. ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
  16. EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
  17. OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
  18. OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
  19. IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  20. */
  21. #endregion
  22. using System;
  23. using System.Collections.Generic;
  24. using System.Reflection;
  25. using System.Xml;
  26. using Prebuild.Core.Attributes;
  27. using Prebuild.Core.Interfaces;
  28. using Prebuild.Core.Utilities;
  29. namespace Prebuild.Core.Nodes
  30. {
  31. /// <summary>
  32. ///
  33. /// </summary>
  34. [DataNode("Options")]
  35. public class OptionsNode : DataNode
  36. {
  37. #region Fields
  38. private static readonly Dictionary<string,FieldInfo> m_OptionFields = new Dictionary<string, FieldInfo>();
  39. [OptionNode("CompilerDefines")]
  40. private string m_CompilerDefines = "";
  41. /// <summary>
  42. ///
  43. /// </summary>
  44. public string CompilerDefines
  45. {
  46. get
  47. {
  48. return m_CompilerDefines;
  49. }
  50. set
  51. {
  52. m_CompilerDefines = value;
  53. }
  54. }
  55. [OptionNode("OptimizeCode")]
  56. private bool m_OptimizeCode;
  57. /// <summary>
  58. ///
  59. /// </summary>
  60. public bool OptimizeCode
  61. {
  62. get
  63. {
  64. return m_OptimizeCode;
  65. }
  66. set
  67. {
  68. m_OptimizeCode = value;
  69. }
  70. }
  71. [OptionNode("CheckUnderflowOverflow")]
  72. private bool m_CheckUnderflowOverflow;
  73. /// <summary>
  74. ///
  75. /// </summary>
  76. public bool CheckUnderflowOverflow
  77. {
  78. get
  79. {
  80. return m_CheckUnderflowOverflow;
  81. }
  82. set
  83. {
  84. m_CheckUnderflowOverflow = value;
  85. }
  86. }
  87. [OptionNode("AllowUnsafe")]
  88. private bool m_AllowUnsafe;
  89. /// <summary>
  90. ///
  91. /// </summary>
  92. public bool AllowUnsafe
  93. {
  94. get
  95. {
  96. return m_AllowUnsafe;
  97. }
  98. set
  99. {
  100. m_AllowUnsafe = value;
  101. }
  102. }
  103. [OptionNode("PreBuildEvent")]
  104. private string m_PreBuildEvent;
  105. /// <summary>
  106. ///
  107. /// </summary>
  108. public string PreBuildEvent
  109. {
  110. get
  111. {
  112. return m_PreBuildEvent;
  113. }
  114. set
  115. {
  116. m_PreBuildEvent = value;
  117. }
  118. }
  119. [OptionNode("PostBuildEvent")]
  120. private string m_PostBuildEvent;
  121. /// <summary>
  122. ///
  123. /// </summary>
  124. public string PostBuildEvent
  125. {
  126. get
  127. {
  128. return m_PostBuildEvent;
  129. }
  130. set
  131. {
  132. m_PostBuildEvent = value;
  133. }
  134. }
  135. [OptionNode("PreBuildEventArgs")]
  136. private string m_PreBuildEventArgs;
  137. /// <summary>
  138. ///
  139. /// </summary>
  140. public string PreBuildEventArgs
  141. {
  142. get
  143. {
  144. return m_PreBuildEventArgs;
  145. }
  146. set
  147. {
  148. m_PreBuildEventArgs = value;
  149. }
  150. }
  151. [OptionNode("PostBuildEventArgs")]
  152. private string m_PostBuildEventArgs;
  153. /// <summary>
  154. ///
  155. /// </summary>
  156. public string PostBuildEventArgs
  157. {
  158. get
  159. {
  160. return m_PostBuildEventArgs;
  161. }
  162. set
  163. {
  164. m_PostBuildEventArgs = value;
  165. }
  166. }
  167. [OptionNode("RunPostBuildEvent")]
  168. private string m_RunPostBuildEvent;
  169. /// <summary>
  170. ///
  171. /// </summary>
  172. public string RunPostBuildEvent
  173. {
  174. get
  175. {
  176. return m_RunPostBuildEvent;
  177. }
  178. set
  179. {
  180. m_RunPostBuildEvent = value;
  181. }
  182. }
  183. [OptionNode("RunScript")]
  184. private string m_RunScript;
  185. /// <summary>
  186. ///
  187. /// </summary>
  188. public string RunScript
  189. {
  190. get
  191. {
  192. return m_RunScript;
  193. }
  194. set
  195. {
  196. m_RunScript = value;
  197. }
  198. }
  199. [OptionNode("WarningLevel")]
  200. private int m_WarningLevel = 4;
  201. /// <summary>
  202. ///
  203. /// </summary>
  204. public int WarningLevel
  205. {
  206. get
  207. {
  208. return m_WarningLevel;
  209. }
  210. set
  211. {
  212. m_WarningLevel = value;
  213. }
  214. }
  215. [OptionNode("WarningsAsErrors")]
  216. private bool m_WarningsAsErrors;
  217. /// <summary>
  218. ///
  219. /// </summary>
  220. public bool WarningsAsErrors
  221. {
  222. get
  223. {
  224. return m_WarningsAsErrors;
  225. }
  226. set
  227. {
  228. m_WarningsAsErrors = value;
  229. }
  230. }
  231. [OptionNode("SuppressWarnings")]
  232. private string m_SuppressWarnings = "";
  233. /// <summary>
  234. ///
  235. /// </summary>
  236. public string SuppressWarnings
  237. {
  238. get
  239. {
  240. return m_SuppressWarnings;
  241. }
  242. set
  243. {
  244. m_SuppressWarnings = value;
  245. }
  246. }
  247. [OptionNode("OutputPath")]
  248. private string m_OutputPath = "bin/";
  249. /// <summary>
  250. ///
  251. /// </summary>
  252. public string OutputPath
  253. {
  254. get
  255. {
  256. return m_OutputPath;
  257. }
  258. set
  259. {
  260. m_OutputPath = value;
  261. }
  262. }
  263. [OptionNode("GenerateDocumentation")]
  264. private bool m_GenerateDocumentation;
  265. /// <summary>
  266. ///
  267. /// </summary>
  268. public bool GenerateDocumentation
  269. {
  270. get
  271. {
  272. return m_GenerateDocumentation;
  273. }
  274. set
  275. {
  276. m_GenerateDocumentation = value;
  277. }
  278. }
  279. [OptionNode("GenerateXmlDocFile")]
  280. private bool m_GenerateXmlDocFile;
  281. /// <summary>
  282. ///
  283. /// </summary>
  284. public bool GenerateXmlDocFile
  285. {
  286. get
  287. {
  288. return m_GenerateXmlDocFile;
  289. }
  290. set
  291. {
  292. m_GenerateXmlDocFile = value;
  293. }
  294. }
  295. [OptionNode("XmlDocFile")]
  296. private string m_XmlDocFile = "";
  297. /// <summary>
  298. ///
  299. /// </summary>
  300. public string XmlDocFile
  301. {
  302. get
  303. {
  304. return m_XmlDocFile;
  305. }
  306. set
  307. {
  308. m_XmlDocFile = value;
  309. }
  310. }
  311. [OptionNode("KeyFile")]
  312. private string m_KeyFile = "";
  313. /// <summary>
  314. ///
  315. /// </summary>
  316. public string KeyFile
  317. {
  318. get
  319. {
  320. return m_KeyFile;
  321. }
  322. set
  323. {
  324. m_KeyFile = value;
  325. }
  326. }
  327. [OptionNode("DebugInformation")]
  328. private bool m_DebugInformation;
  329. /// <summary>
  330. ///
  331. /// </summary>
  332. public bool DebugInformation
  333. {
  334. get
  335. {
  336. return m_DebugInformation;
  337. }
  338. set
  339. {
  340. m_DebugInformation = value;
  341. }
  342. }
  343. [OptionNode("RegisterComInterop")]
  344. private bool m_RegisterComInterop;
  345. /// <summary>
  346. ///
  347. /// </summary>
  348. public bool RegisterComInterop
  349. {
  350. get
  351. {
  352. return m_RegisterComInterop;
  353. }
  354. set
  355. {
  356. m_RegisterComInterop = value;
  357. }
  358. }
  359. [OptionNode("RemoveIntegerChecks")]
  360. private bool m_RemoveIntegerChecks;
  361. /// <summary>
  362. ///
  363. /// </summary>
  364. public bool RemoveIntegerChecks
  365. {
  366. get
  367. {
  368. return m_RemoveIntegerChecks;
  369. }
  370. set
  371. {
  372. m_RemoveIntegerChecks = value;
  373. }
  374. }
  375. [OptionNode("IncrementalBuild")]
  376. private bool m_IncrementalBuild;
  377. /// <summary>
  378. ///
  379. /// </summary>
  380. public bool IncrementalBuild
  381. {
  382. get
  383. {
  384. return m_IncrementalBuild;
  385. }
  386. set
  387. {
  388. m_IncrementalBuild = value;
  389. }
  390. }
  391. [OptionNode("BaseAddress")]
  392. private string m_BaseAddress = "285212672";
  393. /// <summary>
  394. ///
  395. /// </summary>
  396. public string BaseAddress
  397. {
  398. get
  399. {
  400. return m_BaseAddress;
  401. }
  402. set
  403. {
  404. m_BaseAddress = value;
  405. }
  406. }
  407. [OptionNode("FileAlignment")]
  408. private int m_FileAlignment = 4096;
  409. /// <summary>
  410. ///
  411. /// </summary>
  412. public int FileAlignment
  413. {
  414. get
  415. {
  416. return m_FileAlignment;
  417. }
  418. set
  419. {
  420. m_FileAlignment = value;
  421. }
  422. }
  423. [OptionNode("NoStdLib")]
  424. private bool m_NoStdLib;
  425. /// <summary>
  426. ///
  427. /// </summary>
  428. public bool NoStdLib
  429. {
  430. get
  431. {
  432. return m_NoStdLib;
  433. }
  434. set
  435. {
  436. m_NoStdLib = value;
  437. }
  438. }
  439. private readonly List<string> m_FieldsDefined = new List<string>();
  440. #endregion
  441. #region Constructors
  442. /// <summary>
  443. /// Initializes the <see cref="OptionsNode"/> class.
  444. /// </summary>
  445. static OptionsNode()
  446. {
  447. Type t = typeof(OptionsNode);
  448. foreach(FieldInfo f in t.GetFields(BindingFlags.NonPublic | BindingFlags.Instance))
  449. {
  450. object[] attrs = f.GetCustomAttributes(typeof(OptionNodeAttribute), false);
  451. if(attrs == null || attrs.Length < 1)
  452. {
  453. continue;
  454. }
  455. OptionNodeAttribute ona = (OptionNodeAttribute)attrs[0];
  456. m_OptionFields[ona.NodeName] = f;
  457. }
  458. }
  459. #endregion
  460. #region Properties
  461. /// <summary>
  462. /// Gets the <see cref="Object"/> at the specified index.
  463. /// </summary>
  464. /// <value></value>
  465. public object this[string index]
  466. {
  467. get
  468. {
  469. if(!m_OptionFields.ContainsKey(index))
  470. {
  471. return null;
  472. }
  473. FieldInfo f = m_OptionFields[index];
  474. return f.GetValue(this);
  475. }
  476. }
  477. /// <summary>
  478. /// Gets the <see cref="Object"/> at the specified index.
  479. /// </summary>
  480. /// <value></value>
  481. public object this[string index, object defaultValue]
  482. {
  483. get
  484. {
  485. object valueObject = this[index];
  486. if(valueObject != null && valueObject is string && ((string)valueObject).Length == 0)
  487. {
  488. return defaultValue;
  489. }
  490. return valueObject;
  491. }
  492. }
  493. #endregion
  494. #region Private Methods
  495. private void FlagDefined(string name)
  496. {
  497. if(!m_FieldsDefined.Contains(name))
  498. {
  499. m_FieldsDefined.Add(name);
  500. }
  501. }
  502. private void SetOption(string nodeName, string val)
  503. {
  504. lock(m_OptionFields)
  505. {
  506. if(!m_OptionFields.ContainsKey(nodeName))
  507. {
  508. return;
  509. }
  510. FieldInfo f = m_OptionFields[nodeName];
  511. f.SetValue(this, Helper.TranslateValue(f.FieldType, val));
  512. FlagDefined(f.Name);
  513. }
  514. }
  515. #endregion
  516. #region Public Methods
  517. /// <summary>
  518. /// Parses the specified node.
  519. /// </summary>
  520. /// <param name="node">The node.</param>
  521. public override void Parse(XmlNode node)
  522. {
  523. if( node == null )
  524. {
  525. throw new ArgumentNullException("node");
  526. }
  527. foreach(XmlNode child in node.ChildNodes)
  528. {
  529. SetOption(child.Name, Helper.InterpolateForEnvironmentVariables(child.InnerText));
  530. }
  531. }
  532. /// <summary>
  533. /// Copies to.
  534. /// </summary>
  535. /// <param name="opt">The opt.</param>
  536. public void CopyTo(OptionsNode opt)
  537. {
  538. if(opt == null)
  539. {
  540. return;
  541. }
  542. foreach(FieldInfo f in m_OptionFields.Values)
  543. {
  544. if(m_FieldsDefined.Contains(f.Name))
  545. {
  546. f.SetValue(opt, f.GetValue(this));
  547. opt.m_FieldsDefined.Add(f.Name);
  548. }
  549. }
  550. }
  551. #endregion
  552. }
  553. }