class PluginConfigHandler extends PluginFileHandler { ref array m_CfgParams; void PluginConfigHandler() { m_CfgParams = new array; LoadConfigFile(); } override void OnInit() { super.OnInit(); } override string GetFileName() { return CFG_FILE_USER_PROFILE; } void LoadConfigFile() { LoadFile(); m_CfgParams.Clear(); for ( int j = 0; j < m_FileContent.Count(); j++ ) { m_CfgParams.Insert( ParseText(m_FileContent.Get(j)) ); } } void SaveConfigToFile() { ClearFileNoSave(); for ( int i = 0; i < m_CfgParams.Count(); ++i ) { string s = ParseParam(m_CfgParams.Get(i)); m_FileContent.Insert(s); } SaveFile(); } CfgParam GetParamByName(string name, int cfg_type) { CfgParam param; for ( int i = 0; i < m_CfgParams.Count(); ++i ) { param = m_CfgParams.Get(i); if ( param.GetName() == name ) { return param; } } // cfg_type == -1 returns NULL param = CfgParam.CreateParam(name, cfg_type); m_CfgParams.Insert(param); return param; } array GetAllParams() { return m_CfgParams; } void ClearParams() { m_CfgParams.Clear(); } void RemoveParamByName( string name ) { for ( int i = 0; i < m_CfgParams.Count(); ++i ) { CfgParam param = m_CfgParams.Get(i); if ( param.GetName() == name ) { m_CfgParams.Remove( i ); return; } } } void RenameParam( string name, string new_name ) { for ( int i = 0; i < m_CfgParams.Count(); ++i ) { CfgParam param = m_CfgParams.Get(i); if ( param.GetName() == name ) { param.SetName( new_name ); return; } } } bool ParamExist(string name) { CfgParam param; for ( int i = 0; i < m_CfgParams.Count(); ++i ) { param = m_CfgParams.Get(i); if ( param.GetName() == name ) { return true; } } return false; } string ParseParam(CfgParam param) { string text = STRING_EMPTY; if ( param.GetName() != STRING_EMPTY ) { text += param.GetName()+"="; } switch ( param.GetType() ) { case CFG_TYPE_ARRAY: { CfgParamArray param_array = CfgParamArray.Cast( param ); array params = param_array.GetValues(); text += "{"; for ( int i = 0; i < params.Count(); ++i ) { if ( i > 0 ) { text += ","; } text += ParseParam(params.Get(i)); } text += "}"; break; } case CFG_TYPE_STRING: { CfgParamString param_string = CfgParamString.Cast( param ); text += "\""+param_string.GetValue()+"\""; break; } case CFG_TYPE_INT: { CfgParamInt param_int = CfgParamInt.Cast( param ); text += param_int.GetValue().ToString(); break; } case CFG_TYPE_FLOAT: { CfgParamFloat param_float = CfgParamFloat.Cast( param ); string s = param_float.GetValue().ToString(); if ( s.IndexOf(".") == -1 ) { s += ".0"; } text += s; break; } case CFG_TYPE_BOOL: { CfgParamBool param_bool = CfgParamBool.Cast( param ); if ( param_bool.GetValue() ) { text += "true"; } else { text += "false"; } break; } } return text; } CfgParam ParseText(string text) { string param_name = STRING_EMPTY; string param_value = text.Trim();; int text_type = GetTextType(param_value); //Log("ParseText -> text_type: "+itoa(text_type)); if ( text_type == CFG_TYPE_PARAM ) { int pos = param_value.IndexOf("="); if ( pos > 0 ) { param_name = param_value.Substring(0, pos).Trim(); int pos_end = param_value.Length() - pos; param_value = param_value.Substring(pos + 1, pos_end - 1).Trim(); //Log("ParseText -> param -> "+param_name+" = "+param_value); CfgParam param = ParseText(param_value); param.SetName(param_name); return param; } } else if ( text_type == CFG_TYPE_ARRAY ) { //Log("ParseText -> array -> "+param_name+" = "+param_value); CfgParamArray param_array = new CfgParamArray(param_name); array array_params = ParseToValueArray(param_value); param_array.SetParams(array_params); return param_array; } else if ( text_type == CFG_TYPE_STRING ) { //Log("ParseText -> string -> "+param_value); CfgParamString param_string = new CfgParamString(param_name); param_string.SetValue( ParseToValueString(param_value) ); return param_string; } else if ( text_type == CFG_TYPE_INT ) { //Log("ParseText -> int -> "+param_name+" = "+param_value); CfgParamInt param_int = new CfgParamInt(param_name); param_int.SetValue( ParseToValueInt(param_value) ); return param_int; } else if ( text_type == CFG_TYPE_FLOAT ) { //Log("ParseText -> float -> "+param_name+" = "+param_value); CfgParamFloat param_float = new CfgParamFloat(param_name); param_float.SetValue( ParseToValueFloat(param_value) ); return param_float; } else if ( text_type == CFG_TYPE_BOOL ) { //Log("ParseText -> bool -> "+param_name+" = "+param_value); CfgParamBool param_bool = new CfgParamBool(param_name); param_bool.SetValue( ParseToValueBool(param_value) ); return param_bool; } //Log("ParseText -> none -> "+param_name+" = "+param_value); return NULL; } protected int GetTextType(string text) { int lenght = text.Length(); // Check Array int pos1 = text.IndexOf("{"); if ( pos1 == 0 && text.Substring(lenght - 1, 1) == "}" ) { return CFG_TYPE_ARRAY; } // Check String pos1 = text.IndexOf("\""); if ( pos1 == 0 && text.Substring(lenght - 1, 1) == "\"" ) { string string_text = text.Substring(1, lenght - 2); if ( string_text.IndexOf("\"") == -1 ) { return CFG_TYPE_STRING; } } // Check Param pos1 = text.IndexOf("="); if ( pos1 > -1 ) { return CFG_TYPE_PARAM; } // Check Param True pos1 = text.IndexOf("true"); if ( lenght == 4 && pos1 > -1 ) { return CFG_TYPE_BOOL; } // Check Param False pos1 = text.IndexOf("false"); if ( lenght == 5 && pos1 > -1 ) { return CFG_TYPE_BOOL; } // Check Param Float pos1 = text.IndexOf("."); if ( pos1 > -1 ) { return CFG_TYPE_FLOAT; } // Is Int return CFG_TYPE_INT; } protected bool IsString(string text) { if ( GetTextType(text) == CFG_TYPE_STRING ) { return true; } return false; } protected bool IsParam(string text) { if ( GetTextType(text) == CFG_TYPE_PARAM ) { return true; } return false; } protected bool IsArray(string text) { if ( GetTextType(text) == CFG_TYPE_ARRAY ) { return true; } return false; } protected bool IsFloat(string text) { if ( GetTextType(text) == CFG_TYPE_FLOAT ) { return true; } return false; } protected bool IsInt(string text) { if ( GetTextType(text) == CFG_TYPE_INT ) { return true; } return false; } protected bool IsBool(string text) { if ( GetTextType(text) == CFG_TYPE_BOOL ) { return true; } return false; } protected string ParseToValueString(string param_value) { return param_value.Substring(1, param_value.Length() - 2); } protected float ParseToValueFloat(string param_value) { return param_value.ToFloat(); } protected int ParseToValueInt(string param_value) { return param_value.ToInt(); } protected bool ParseToValueBool(string param_value) { if ( param_value.Contains("true") ) { return true; } return false; } protected array ParseToValueArray(string param_value) { array param_parent = new array; TStringArray strings = new TStringArray; array a = new array; array b = new array; int pos_a = 0; int pos_b = 0; int element = 0; int value_start = 0; int value_end = 0; while ( pos_a > -1 || pos_b > -1 ) { pos_a = param_value.IndexOfFrom(pos_a, "{" ); if ( pos_a > -1 ) { a.Insert(pos_a); pos_a++; } pos_b = param_value.IndexOfFrom(pos_b, "}" ); if ( pos_b > -1 ) { b.Insert(pos_b); pos_b++; } } pos_a = 0; pos_b = 0; for ( pos_a = 0; pos_a < a.Count(); ++pos_a ) { if ( a.Get(pos_a) > b.Get(pos_b) ) { element--; if ( element <= 1 ) { value_end = b.Get(pos_b) - value_start + 1; //Log("1 -> "+substr(param_value, value_start, value_end)) strings.Insert( param_value.Substring(value_start, value_end) ); value_start = b.Get(pos_b) + 1; } pos_a--; pos_b++; } else if ( a.Get(pos_a) < b.Get(pos_b) ) { if ( pos_a == a.Count() - 1 && pos_b < b.Count() - 1 ) { element--; if ( element == 0 ) { value_end = b.Get(pos_b) - value_start; //Log("2 -> "+substr(param_value, value_start + 1, value_end)) strings.Insert( param_value.Substring(value_start + 1, value_end) ); value_start = b.Get(pos_b) + 1; } pos_a--; pos_b++; } else { element++; if ( element == 2 ) { value_start = a.Get(pos_a); } } } } //Log(param_value+" => "+itoa(a.Count())+" / "+itoa(b.Count())+" count: "+itoa(strings.Count())); if ( strings.Count() == 0 ) { //Log(param_value+" -> ZERO {}"); string param_value_content = param_value.Substring(1, param_value.Length() - 2); //Log(param_value+" -> Trimmed -> "+param_value_content); param_value_content.Split(",", strings); } for ( int i = 0; i < strings.Count(); ++i ) { string str = strings.Get(i); //Log("To Parse => "+str); CfgParam param = ParseText(str); param_parent.Insert(param); } return param_parent; } }