pluginconfighandler.c 9.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534
  1. class PluginConfigHandler extends PluginFileHandler
  2. {
  3. ref array<ref CfgParam> m_CfgParams;
  4. void PluginConfigHandler()
  5. {
  6. m_CfgParams = new array<ref CfgParam>;
  7. LoadConfigFile();
  8. }
  9. override void OnInit()
  10. {
  11. super.OnInit();
  12. }
  13. override string GetFileName()
  14. {
  15. return CFG_FILE_USER_PROFILE;
  16. }
  17. void LoadConfigFile()
  18. {
  19. LoadFile();
  20. m_CfgParams.Clear();
  21. for ( int j = 0; j < m_FileContent.Count(); j++ )
  22. {
  23. m_CfgParams.Insert( ParseText(m_FileContent.Get(j)) );
  24. }
  25. }
  26. void SaveConfigToFile()
  27. {
  28. ClearFileNoSave();
  29. for ( int i = 0; i < m_CfgParams.Count(); ++i )
  30. {
  31. string s = ParseParam(m_CfgParams.Get(i));
  32. m_FileContent.Insert(s);
  33. }
  34. SaveFile();
  35. }
  36. CfgParam GetParamByName(string name, int cfg_type)
  37. {
  38. CfgParam param;
  39. for ( int i = 0; i < m_CfgParams.Count(); ++i )
  40. {
  41. param = m_CfgParams.Get(i);
  42. if ( param.GetName() == name )
  43. {
  44. return param;
  45. }
  46. }
  47. // cfg_type == -1 returns NULL
  48. param = CfgParam.CreateParam(name, cfg_type);
  49. m_CfgParams.Insert(param);
  50. return param;
  51. }
  52. array<ref CfgParam> GetAllParams()
  53. {
  54. return m_CfgParams;
  55. }
  56. void ClearParams()
  57. {
  58. m_CfgParams.Clear();
  59. }
  60. void RemoveParamByName( string name )
  61. {
  62. for ( int i = 0; i < m_CfgParams.Count(); ++i )
  63. {
  64. CfgParam param = m_CfgParams.Get(i);
  65. if ( param.GetName() == name )
  66. {
  67. m_CfgParams.Remove( i );
  68. return;
  69. }
  70. }
  71. }
  72. void RenameParam( string name, string new_name )
  73. {
  74. for ( int i = 0; i < m_CfgParams.Count(); ++i )
  75. {
  76. CfgParam param = m_CfgParams.Get(i);
  77. if ( param.GetName() == name )
  78. {
  79. param.SetName( new_name );
  80. return;
  81. }
  82. }
  83. }
  84. bool ParamExist(string name)
  85. {
  86. CfgParam param;
  87. for ( int i = 0; i < m_CfgParams.Count(); ++i )
  88. {
  89. param = m_CfgParams.Get(i);
  90. if ( param.GetName() == name )
  91. {
  92. return true;
  93. }
  94. }
  95. return false;
  96. }
  97. string ParseParam(CfgParam param)
  98. {
  99. string text = STRING_EMPTY;
  100. if ( param.GetName() != STRING_EMPTY )
  101. {
  102. text += param.GetName()+"=";
  103. }
  104. switch ( param.GetType() )
  105. {
  106. case CFG_TYPE_ARRAY:
  107. {
  108. CfgParamArray param_array = CfgParamArray.Cast( param );
  109. array<ref CfgParam> params = param_array.GetValues();
  110. text += "{";
  111. for ( int i = 0; i < params.Count(); ++i )
  112. {
  113. if ( i > 0 )
  114. {
  115. text += ",";
  116. }
  117. text += ParseParam(params.Get(i));
  118. }
  119. text += "}";
  120. break;
  121. }
  122. case CFG_TYPE_STRING:
  123. {
  124. CfgParamString param_string = CfgParamString.Cast( param );
  125. text += "\""+param_string.GetValue()+"\"";
  126. break;
  127. }
  128. case CFG_TYPE_INT:
  129. {
  130. CfgParamInt param_int = CfgParamInt.Cast( param );
  131. text += param_int.GetValue().ToString();
  132. break;
  133. }
  134. case CFG_TYPE_FLOAT:
  135. {
  136. CfgParamFloat param_float = CfgParamFloat.Cast( param );
  137. string s = param_float.GetValue().ToString();
  138. if ( s.IndexOf(".") == -1 )
  139. {
  140. s += ".0";
  141. }
  142. text += s;
  143. break;
  144. }
  145. case CFG_TYPE_BOOL:
  146. {
  147. CfgParamBool param_bool = CfgParamBool.Cast( param );
  148. if ( param_bool.GetValue() )
  149. {
  150. text += "true";
  151. }
  152. else
  153. {
  154. text += "false";
  155. }
  156. break;
  157. }
  158. }
  159. return text;
  160. }
  161. CfgParam ParseText(string text)
  162. {
  163. string param_name = STRING_EMPTY;
  164. string param_value = text.Trim();;
  165. int text_type = GetTextType(param_value);
  166. //Log("ParseText -> text_type: "+itoa(text_type));
  167. if ( text_type == CFG_TYPE_PARAM )
  168. {
  169. int pos = param_value.IndexOf("=");
  170. if ( pos > 0 )
  171. {
  172. param_name = param_value.Substring(0, pos).Trim();
  173. int pos_end = param_value.Length() - pos;
  174. param_value = param_value.Substring(pos + 1, pos_end - 1).Trim();
  175. //Log("ParseText -> param -> "+param_name+" = "+param_value);
  176. CfgParam param = ParseText(param_value);
  177. param.SetName(param_name);
  178. return param;
  179. }
  180. }
  181. else if ( text_type == CFG_TYPE_ARRAY )
  182. {
  183. //Log("ParseText -> array -> "+param_name+" = "+param_value);
  184. CfgParamArray param_array = new CfgParamArray(param_name);
  185. array<ref CfgParam> array_params = ParseToValueArray(param_value);
  186. param_array.SetParams(array_params);
  187. return param_array;
  188. }
  189. else if ( text_type == CFG_TYPE_STRING )
  190. {
  191. //Log("ParseText -> string -> "+param_value);
  192. CfgParamString param_string = new CfgParamString(param_name);
  193. param_string.SetValue( ParseToValueString(param_value) );
  194. return param_string;
  195. }
  196. else if ( text_type == CFG_TYPE_INT )
  197. {
  198. //Log("ParseText -> int -> "+param_name+" = "+param_value);
  199. CfgParamInt param_int = new CfgParamInt(param_name);
  200. param_int.SetValue( ParseToValueInt(param_value) );
  201. return param_int;
  202. }
  203. else if ( text_type == CFG_TYPE_FLOAT )
  204. {
  205. //Log("ParseText -> float -> "+param_name+" = "+param_value);
  206. CfgParamFloat param_float = new CfgParamFloat(param_name);
  207. param_float.SetValue( ParseToValueFloat(param_value) );
  208. return param_float;
  209. }
  210. else if ( text_type == CFG_TYPE_BOOL )
  211. {
  212. //Log("ParseText -> bool -> "+param_name+" = "+param_value);
  213. CfgParamBool param_bool = new CfgParamBool(param_name);
  214. param_bool.SetValue( ParseToValueBool(param_value) );
  215. return param_bool;
  216. }
  217. //Log("ParseText -> none -> "+param_name+" = "+param_value);
  218. return NULL;
  219. }
  220. protected int GetTextType(string text)
  221. {
  222. int lenght = text.Length();
  223. // Check Array
  224. int pos1 = text.IndexOf("{");
  225. if ( pos1 == 0 && text.Substring(lenght - 1, 1) == "}" )
  226. {
  227. return CFG_TYPE_ARRAY;
  228. }
  229. // Check String
  230. pos1 = text.IndexOf("\"");
  231. if ( pos1 == 0 && text.Substring(lenght - 1, 1) == "\"" )
  232. {
  233. string string_text = text.Substring(1, lenght - 2);
  234. if ( string_text.IndexOf("\"") == -1 )
  235. {
  236. return CFG_TYPE_STRING;
  237. }
  238. }
  239. // Check Param
  240. pos1 = text.IndexOf("=");
  241. if ( pos1 > -1 )
  242. {
  243. return CFG_TYPE_PARAM;
  244. }
  245. // Check Param True
  246. pos1 = text.IndexOf("true");
  247. if ( lenght == 4 && pos1 > -1 )
  248. {
  249. return CFG_TYPE_BOOL;
  250. }
  251. // Check Param False
  252. pos1 = text.IndexOf("false");
  253. if ( lenght == 5 && pos1 > -1 )
  254. {
  255. return CFG_TYPE_BOOL;
  256. }
  257. // Check Param Float
  258. pos1 = text.IndexOf(".");
  259. if ( pos1 > -1 )
  260. {
  261. return CFG_TYPE_FLOAT;
  262. }
  263. // Is Int
  264. return CFG_TYPE_INT;
  265. }
  266. protected bool IsString(string text)
  267. {
  268. if ( GetTextType(text) == CFG_TYPE_STRING )
  269. {
  270. return true;
  271. }
  272. return false;
  273. }
  274. protected bool IsParam(string text)
  275. {
  276. if ( GetTextType(text) == CFG_TYPE_PARAM )
  277. {
  278. return true;
  279. }
  280. return false;
  281. }
  282. protected bool IsArray(string text)
  283. {
  284. if ( GetTextType(text) == CFG_TYPE_ARRAY )
  285. {
  286. return true;
  287. }
  288. return false;
  289. }
  290. protected bool IsFloat(string text)
  291. {
  292. if ( GetTextType(text) == CFG_TYPE_FLOAT )
  293. {
  294. return true;
  295. }
  296. return false;
  297. }
  298. protected bool IsInt(string text)
  299. {
  300. if ( GetTextType(text) == CFG_TYPE_INT )
  301. {
  302. return true;
  303. }
  304. return false;
  305. }
  306. protected bool IsBool(string text)
  307. {
  308. if ( GetTextType(text) == CFG_TYPE_BOOL )
  309. {
  310. return true;
  311. }
  312. return false;
  313. }
  314. protected string ParseToValueString(string param_value)
  315. {
  316. return param_value.Substring(1, param_value.Length() - 2);
  317. }
  318. protected float ParseToValueFloat(string param_value)
  319. {
  320. return param_value.ToFloat();
  321. }
  322. protected int ParseToValueInt(string param_value)
  323. {
  324. return param_value.ToInt();
  325. }
  326. protected bool ParseToValueBool(string param_value)
  327. {
  328. if ( param_value.Contains("true") )
  329. {
  330. return true;
  331. }
  332. return false;
  333. }
  334. protected array<ref CfgParam> ParseToValueArray(string param_value)
  335. {
  336. array<ref CfgParam> param_parent = new array<ref CfgParam>;
  337. TStringArray strings = new TStringArray;
  338. array<int> a = new array<int>;
  339. array<int> b = new array<int>;
  340. int pos_a = 0;
  341. int pos_b = 0;
  342. int element = 0;
  343. int value_start = 0;
  344. int value_end = 0;
  345. while ( pos_a > -1 || pos_b > -1 )
  346. {
  347. pos_a = param_value.IndexOfFrom(pos_a, "{" );
  348. if ( pos_a > -1 )
  349. {
  350. a.Insert(pos_a);
  351. pos_a++;
  352. }
  353. pos_b = param_value.IndexOfFrom(pos_b, "}" );
  354. if ( pos_b > -1 )
  355. {
  356. b.Insert(pos_b);
  357. pos_b++;
  358. }
  359. }
  360. pos_a = 0;
  361. pos_b = 0;
  362. for ( pos_a = 0; pos_a < a.Count(); ++pos_a )
  363. {
  364. if ( a.Get(pos_a) > b.Get(pos_b) )
  365. {
  366. element--;
  367. if ( element <= 1 )
  368. {
  369. value_end = b.Get(pos_b) - value_start + 1;
  370. //Log("1 -> "+substr(param_value, value_start, value_end))
  371. strings.Insert( param_value.Substring(value_start, value_end) );
  372. value_start = b.Get(pos_b) + 1;
  373. }
  374. pos_a--;
  375. pos_b++;
  376. }
  377. else if ( a.Get(pos_a) < b.Get(pos_b) )
  378. {
  379. if ( pos_a == a.Count() - 1 && pos_b < b.Count() - 1 )
  380. {
  381. element--;
  382. if ( element == 0 )
  383. {
  384. value_end = b.Get(pos_b) - value_start;
  385. //Log("2 -> "+substr(param_value, value_start + 1, value_end))
  386. strings.Insert( param_value.Substring(value_start + 1, value_end) );
  387. value_start = b.Get(pos_b) + 1;
  388. }
  389. pos_a--;
  390. pos_b++;
  391. }
  392. else
  393. {
  394. element++;
  395. if ( element == 2 )
  396. {
  397. value_start = a.Get(pos_a);
  398. }
  399. }
  400. }
  401. }
  402. //Log(param_value+" => "+itoa(a.Count())+" / "+itoa(b.Count())+" count: "+itoa(strings.Count()));
  403. if ( strings.Count() == 0 )
  404. {
  405. //Log(param_value+" -> ZERO {}");
  406. string param_value_content = param_value.Substring(1, param_value.Length() - 2);
  407. //Log(param_value+" -> Trimmed -> "+param_value_content);
  408. param_value_content.Split(",", strings);
  409. }
  410. for ( int i = 0; i < strings.Count(); ++i )
  411. {
  412. string str = strings.Get(i);
  413. //Log("To Parse => "+str);
  414. CfgParam param = ParseText(str);
  415. param_parent.Insert(param);
  416. }
  417. return param_parent;
  418. }
  419. }