public void ParseConfig(string file) { Common.SendStatus(string.Format("Parsing {0}", file)); Common.Types.Clear(); using (var xml = XmlReader.Create(file)) { var dataCheckKey = 0; var dataCheckOk = false; var skUkey = 0; long size = 0; var skuWarn = false; var skuName = ""; var skuWarnMsg = ""; var skuMinVer = ""; while (xml.Read()) { if (!xml.IsStartElement()) { continue; } switch (xml.Name.ToLower()) { case "type": if (long.TryParse(xml["size"], out size)) { if (!Common.Types.ContainsKey(size)) { Common.Types.Add(size, new Common.TypeData()); } Common.Types[size].Name.Value = xml["name"]; } break; #region Statistics part case "stats": if (!Common.Types.ContainsKey(size)) { break; } xml.Read(); Common.Types[size].StatDescription.Value = xml.Value; if (!string.IsNullOrEmpty(Common.Types[size].StatDescription.Value)) { Common.Types[size].StatDescription.Value = Common.Types[size].StatDescription.Value.Trim(); Common.Types[size].StatDescription.Value += Environment.NewLine; Common.Types[size].StatDescription.Value.Replace("\\n", Environment.NewLine); } break; case "statspart": var key = xml["key"]; if (key == null) { break; } if (string.IsNullOrEmpty(key)) { key = "*"; } key = key.ToUpper(); if (!Common.Types[size].Statlist.Value.ContainsKey(key)) { double low; double high; var lowtxt = xml["low"]; if (lowtxt != null) { lowtxt = Regex.Replace(lowtxt, @"\s+", ""); lowtxt = lowtxt.Replace('.', ','); } var hightxt = xml["high"]; if (hightxt != null) { hightxt = Regex.Replace(hightxt, @"\s+", ""); hightxt = hightxt.Replace('.', ','); } if (!double.TryParse(lowtxt, NumberStyles.AllowDecimalPoint | NumberStyles.AllowThousands, CultureInfo.CurrentCulture, out low)) { low = 0; } else if (low < 0 || low > 100) { low = 0; } if (!double.TryParse(hightxt, NumberStyles.AllowDecimalPoint | NumberStyles.AllowThousands, CultureInfo.CurrentCulture, out high)) { high = 100; } else if (high > 100 || low > high || high < 0) { high = 100; } Common.Types[size].Statlist.Value.Add(key, new Holder <Common.StatCheck>(new Common.StatCheck(low, high))); } break; #endregion Statistics part #region Binary Check Entry case "binentry": if (!Common.Types.ContainsKey(size)) { break; } key = xml["name"]; if (String.IsNullOrEmpty(key)) { break; } if (!Common.Types[size].Bincheck.Value.ContainsKey(key)) { if (xml["ismulti"] != null && xml["ismulti"].Equals("true", StringComparison.CurrentCultureIgnoreCase)) { Common.Types[size].Bincheck.Value.Add(key, new Holder <Common.BinCheck>(new Common.BinCheck(new List <Common.MultiBin>(), true, xml["offset"], xml["description"], xml["ascii"]))); var id = xml["id"]; xml.Read(); Common.Types[size].Bincheck.Value[key].Value.ExpectedList.Value.Add(new Common.MultiBin(Regex.Replace(xml.Value, @"\s+", ""), id)); } else { var offset = xml["offset"]; var description = xml["description"]; var ascii = xml["ascii"]; xml.Read(); Common.Types[size].Bincheck.Value.Add(key, new Holder <Common.BinCheck>(new Common.BinCheck(null, false, offset, description, ascii, xml.Value))); } } else if (xml["ismulti"] != null && xml["ismulti"].Equals("true", StringComparison.CurrentCultureIgnoreCase)) { var id = xml["id"]; var disablepatch = !string.IsNullOrEmpty(xml["disablepatch"]) && xml["disablepatch"].Equals("true", StringComparison.CurrentCultureIgnoreCase); xml.Read(); var explist = Common.Types[size].Bincheck.Value[key].Value; explist.ExpectedList.Value.Add(new Common.MultiBin(Regex.Replace(xml.Value, @"\s+", ""), id, disablepatch)); } break; #endregion Binary Check Entry #region Data Check list case "datalist": if (!Common.Types.ContainsKey(size)) { break; } var dataCheckList = new Common.DataCheck { Name = xml["name"], ThresholdList = new Dictionary <string, double>() }; if (long.TryParse(xml["offset"], NumberStyles.HexNumber, CultureInfo.CurrentCulture, out dataCheckList.Offset)) { dataCheckOk = long.TryParse(xml["size"], NumberStyles.HexNumber, CultureInfo.CurrentCulture, out dataCheckList.Size); if (!dataCheckOk) { dataCheckOk = long.TryParse(xml["ldrsize"], NumberStyles.HexNumber, CultureInfo.CurrentCulture, out dataCheckList.LdrSize); } if (dataCheckOk) { dataCheckKey++; dataCheckList.DataKey = dataCheckKey; Common.Types[size].DataCheckList.Value.Add(dataCheckList); } } break; #region Data treshold case "datatreshold": if (!Common.Types.ContainsKey(size)) { break; } if (!dataCheckOk) { break; } foreach (var entry in Common.Types[size].DataCheckList.Value) { if (entry.DataKey != dataCheckKey) { continue; } var dkey = xml["key"]; if (dkey == null) { break; } if (string.IsNullOrEmpty(dkey)) { dkey = "*"; } dkey = dkey.ToUpper(); xml.Read(); var tmptxt = xml.Value; if (tmptxt != null) { tmptxt = Regex.Replace(tmptxt, @"\s+", ""); tmptxt = tmptxt.Replace('.', ','); } double tmpval; if (!double.TryParse(tmptxt, NumberStyles.AllowDecimalPoint | NumberStyles.AllowThousands, CultureInfo.CurrentCulture, out tmpval)) { tmpval = 49; } else if (tmpval < 0 || tmpval > 100) { tmpval = 49; } entry.ThresholdList.Add(dkey, tmpval); break; } break; #endregion Data treshold #endregion Data Check List #region SKU Data List case "skudataentry": if (!Common.Types.ContainsKey(size)) { break; } var skuDataEntry = new Common.SKUDataEntry(); var skuoffset = xml["offset"]; var isok = (uint.TryParse(skuoffset, NumberStyles.HexNumber, CultureInfo.CurrentCulture, out skuDataEntry.Offset)); if (isok) { var skusize = xml["size"]; isok = (uint.TryParse(skusize, NumberStyles.HexNumber, CultureInfo.CurrentCulture, out skuDataEntry.Size)); } xml.Read(); skuDataEntry.Type = xml.Value; if (isok) { Common.Types[size].SKUDataList.Value.Add(skuDataEntry); } break; #endregion SKU Data List #region SKU List case "skulist": if (!Common.Types.ContainsKey(size)) { break; } skUkey++; skuWarn = xml["warn"] != null && xml["warn"].Equals("true", StringComparison.CurrentCultureIgnoreCase); skuName = xml["name"]; skuWarnMsg = xml["warnmsg"]; skuMinVer = xml["minver"]; break; case "skuentry": if (!Common.Types.ContainsKey(size)) { break; } var exists = false; foreach (var entry in Common.Types[size].SKUList.Value) { if (entry.SKUKey != skUkey) { continue; } exists = true; break; } var skuEntry = new Common.SKUEntry(); if (!exists) { skuEntry.Warn = skuWarn; skuEntry.WarnMsg = skuWarnMsg; } skuEntry.SKUKey = skUkey; skuEntry.Name = skuName; skuEntry.Type = xml["type"]; skuEntry.MinVer = skuMinVer; xml.Read(); skuEntry.Data = Regex.Replace(xml.Value, @"\s+", ""); Common.Types[size].SKUList.Value.Add(skuEntry); break; #endregion SKU List #region RepCheck Entry case "repcheck": if (!Common.Types.ContainsKey(size)) { break; } var tmp = new Common.RepCheckData { Name = xml["name"] }; if (!int.TryParse(xml["offset"], NumberStyles.HexNumber, null, out tmp.Offset)) { break; // It's broken! } xml.Read(); if (!string.IsNullOrEmpty(xml.Value)) { var data = Encoding.Unicode.GetString(Common.HexToArray(Regex.Replace(xml.Value, @"\s+", "").ToUpper())); Common.Types[size].RepCheck.Value.Add(data, new Holder <Common.RepCheckData>(tmp)); } break; #endregion #region Datamatches Entries case "datamatchid": if (!Common.Types.ContainsKey(size)) { break; } var tmpid = xml["id"]; if (string.IsNullOrEmpty(tmpid)) { break; } if (!Common.Types[size].DataMatchList.Value.ContainsKey(tmpid)) { Common.Types[size].DataMatchList.Value.Add(tmpid, new Holder <Common.DataMatchID>(new Common.DataMatchID())); } xml.Read(); if (string.IsNullOrEmpty(xml.Value)) { break; } Common.Types[size].DataMatchList.Value[tmpid].Value.Name = xml.Value; break; case "datamatch": if (!Common.Types.ContainsKey(size)) { break; } var tmpid2 = xml["id"]; if (string.IsNullOrEmpty(tmpid2)) { break; } if (!Common.Types[size].DataMatchList.Value.ContainsKey(tmpid2)) { break; } var tmpmatch = new Common.DataMatch(); if (!int.TryParse(xml["offset"], NumberStyles.HexNumber, null, out tmpmatch.Offset)) { break; } if (!int.TryParse(xml["length"], NumberStyles.HexNumber, null, out tmpmatch.Length)) { break; } if (!int.TryParse(xml["seqrep"], NumberStyles.HexNumber, null, out tmpmatch.SequenceRepetitions)) { tmpmatch.SequenceRepetitions = 0; } tmpmatch.DisableDisplay = !string.IsNullOrEmpty(xml["nodisp"]) && xml["nodisp"].Equals("true", StringComparison.CurrentCultureIgnoreCase); xml.Read(); if (string.IsNullOrEmpty(xml.Value)) { break; } tmpmatch.Name = xml.Value; Common.Types[size].DataMatchList.Value[tmpid2].Value.Data.Add(tmpmatch); break; #endregion #region Datafill Entry case "datafill": if (!Common.Types.ContainsKey(size)) { break; } var datafill = new Common.DataFillEntry { Name = xml["name"] }; int.TryParse(xml["offset"], NumberStyles.HexNumber, null, out datafill.Offset); int.TryParse(xml["size"], NumberStyles.HexNumber, null, out datafill.Length); int.TryParse(xml["sizefrom"], NumberStyles.HexNumber, null, out datafill.Sizefrom); int.TryParse(xml["ldrsize"], NumberStyles.HexNumber, null, out datafill.LdrSize); int.TryParse(xml["regionsize"], NumberStyles.HexNumber, null, out datafill.RegionSize); int.TryParse(xml["regionstart"], NumberStyles.HexNumber, null, out datafill.RegionStart); int.TryParse(xml["vtrmentrycount_offset"], NumberStyles.HexNumber, null, out datafill.vtrmentrycount_offset); xml.Read(); if (!byte.TryParse(xml.Value, NumberStyles.HexNumber, null, out datafill.Data)) { break; } Common.Types[size].DataFillEntries.Value.Add(datafill); break; #endregion #region ROS#Offset case "ros0offset": if (!Common.Types.ContainsKey(size)) { break; } xml.Read(); if (!int.TryParse(xml.Value, NumberStyles.HexNumber, null, out Common.Types[size].ROS0Offset)) { Common.Types[size].ROS0Offset = -1; } break; case "ros1offset": if (!Common.Types.ContainsKey(size)) { break; } xml.Read(); if (!int.TryParse(xml.Value, NumberStyles.HexNumber, null, out Common.Types[size].ROS1Offset)) { Common.Types[size].ROS1Offset = -1; } break; #endregion } } } Common.SendStatus("Parsing done!"); checkbtn.Enabled = true; }
public void ParseConfig(string file) { Common.SendStatus(string.Format("Parsing {0}", file)); Common.Types.Clear(); using (var xml = XmlReader.Create(file)) { var dataCheckKey = 0; var dataCheckOk = false; var skUkey = 0; long size = 0; var skuWarn = false; var skuName = ""; var skuWarnMsg = ""; var skuMinVer = ""; while (xml.Read()) { if (!xml.IsStartElement()) continue; switch (xml.Name.ToLower()) { case "type": if (long.TryParse(xml["size"], out size)) { if (!Common.Types.ContainsKey(size)) Common.Types.Add(size, new Common.TypeData()); Common.Types[size].Name.Value = xml["name"]; } break; #region Statistics part case "stats": if (!Common.Types.ContainsKey(size)) break; xml.Read(); Common.Types[size].StatDescription.Value = xml.Value; if (!string.IsNullOrEmpty(Common.Types[size].StatDescription.Value)) { Common.Types[size].StatDescription.Value = Common.Types[size].StatDescription.Value.Trim(); Common.Types[size].StatDescription.Value += Environment.NewLine; Common.Types[size].StatDescription.Value.Replace("\\n", Environment.NewLine); } break; case "statspart": var key = xml["key"]; if (key == null) break; if (string.IsNullOrEmpty(key)) key = "*"; key = key.ToUpper(); if (!Common.Types[size].Statlist.Value.ContainsKey(key)) { double low; double high; var lowtxt = xml["low"]; if (lowtxt != null) { lowtxt = Regex.Replace(lowtxt, @"\s+", ""); lowtxt = lowtxt.Replace('.', ','); } var hightxt = xml["high"]; if (hightxt != null) { hightxt = Regex.Replace(hightxt, @"\s+", ""); hightxt = hightxt.Replace('.', ','); } if (!double.TryParse(lowtxt, NumberStyles.AllowDecimalPoint | NumberStyles.AllowThousands, CultureInfo.CurrentCulture, out low)) low = 0; else if (low < 0 || low > 100) low = 0; if (!double.TryParse(hightxt, NumberStyles.AllowDecimalPoint | NumberStyles.AllowThousands, CultureInfo.CurrentCulture, out high)) high = 100; else if (high > 100 || low > high || high < 0) high = 100; Common.Types[size].Statlist.Value.Add(key, new Holder <Common.StatCheck>(new Common.StatCheck(low, high))); } break; #endregion Statistics part #region Binary Check Entry case "binentry": if (!Common.Types.ContainsKey(size)) break; key = xml["name"]; if (String.IsNullOrEmpty(key)) break; if (!Common.Types[size].Bincheck.Value.ContainsKey(key)) { if (xml["ismulti"] != null && xml["ismulti"].Equals("true", StringComparison.CurrentCultureIgnoreCase)) { Common.Types[size].Bincheck.Value.Add(key, new Holder <Common.BinCheck>(new Common.BinCheck(new List <Common.MultiBin>(), true, xml["offset"], xml["description"], xml["ascii"]))); var id = xml["id"]; xml.Read(); Common.Types[size].Bincheck.Value[key].Value.ExpectedList.Value.Add(new Common.MultiBin(Regex.Replace(xml.Value, @"\s+", ""), id)); } else { var offset = xml["offset"]; var description = xml["description"]; var ascii = xml["ascii"]; xml.Read(); Common.Types[size].Bincheck.Value.Add(key, new Holder <Common.BinCheck>(new Common.BinCheck(null, false, offset, description, ascii, xml.Value))); } } else if (xml["ismulti"] != null && xml["ismulti"].Equals("true", StringComparison.CurrentCultureIgnoreCase)) { var id = xml["id"]; var disablepatch = !string.IsNullOrEmpty(xml["disablepatch"]) && xml["disablepatch"].Equals("true", StringComparison.CurrentCultureIgnoreCase); xml.Read(); var explist = Common.Types[size].Bincheck.Value[key].Value; explist.ExpectedList.Value.Add(new Common.MultiBin(Regex.Replace(xml.Value, @"\s+", ""), id, disablepatch)); } break; #endregion Binary Check Entry #region Data Check list case "datalist": if (!Common.Types.ContainsKey(size)) break; var dataCheckList = new Common.DataCheck { Name = xml["name"], ThresholdList = new Dictionary <string, double>() }; if (long.TryParse(xml["offset"], NumberStyles.HexNumber, CultureInfo.CurrentCulture, out dataCheckList.Offset)) { dataCheckOk = long.TryParse(xml["size"], NumberStyles.HexNumber, CultureInfo.CurrentCulture, out dataCheckList.Size); if (!dataCheckOk) dataCheckOk = long.TryParse(xml["ldrsize"], NumberStyles.HexNumber, CultureInfo.CurrentCulture, out dataCheckList.LdrSize); if (dataCheckOk) { dataCheckKey++; dataCheckList.DataKey = dataCheckKey; Common.Types[size].DataCheckList.Value.Add(dataCheckList); } } break; #region Data treshold case "datatreshold": if (!Common.Types.ContainsKey(size)) break; if (!dataCheckOk) break; foreach (var entry in Common.Types[size].DataCheckList.Value) { if (entry.DataKey != dataCheckKey) continue; var dkey = xml["key"]; if (dkey == null) break; if (string.IsNullOrEmpty(dkey)) dkey = "*"; dkey = dkey.ToUpper(); xml.Read(); var tmptxt = xml.Value; if (tmptxt != null) { tmptxt = Regex.Replace(tmptxt, @"\s+", ""); tmptxt = tmptxt.Replace('.', ','); } double tmpval; if (!double.TryParse(tmptxt, NumberStyles.AllowDecimalPoint | NumberStyles.AllowThousands, CultureInfo.CurrentCulture, out tmpval)) tmpval = 49; else if (tmpval < 0 || tmpval > 100) tmpval = 49; entry.ThresholdList.Add(dkey, tmpval); break; } break; #endregion Data treshold #endregion Data Check List #region SKU Data List case "skudataentry": if (!Common.Types.ContainsKey(size)) break; var skuDataEntry = new Common.SKUDataEntry(); var skuoffset = xml["offset"]; var isok = (uint.TryParse(skuoffset, NumberStyles.HexNumber, CultureInfo.CurrentCulture, out skuDataEntry.Offset)); if (isok) { var skusize = xml["size"]; isok = (uint.TryParse(skusize, NumberStyles.HexNumber, CultureInfo.CurrentCulture, out skuDataEntry.Size)); } xml.Read(); skuDataEntry.Type = xml.Value; if (isok) Common.Types[size].SKUDataList.Value.Add(skuDataEntry); break; #endregion SKU Data List #region SKU List case "skulist": if (!Common.Types.ContainsKey(size)) break; skUkey++; skuWarn = xml["warn"] != null && xml["warn"].Equals("true", StringComparison.CurrentCultureIgnoreCase); skuName = xml["name"]; skuWarnMsg = xml["warnmsg"]; skuMinVer = xml["minver"]; break; case "skuentry": if (!Common.Types.ContainsKey(size)) break; var exists = false; foreach (var entry in Common.Types[size].SKUList.Value) { if (entry.SKUKey != skUkey) continue; exists = true; break; } var skuEntry = new Common.SKUEntry(); if (!exists) { skuEntry.Warn = skuWarn; skuEntry.WarnMsg = skuWarnMsg; } skuEntry.SKUKey = skUkey; skuEntry.Name = skuName; skuEntry.Type = xml["type"]; skuEntry.MinVer = skuMinVer; xml.Read(); skuEntry.Data = Regex.Replace(xml.Value, @"\s+", ""); Common.Types[size].SKUList.Value.Add(skuEntry); break; #endregion SKU List #region RepCheck Entry case "repcheck": if (!Common.Types.ContainsKey(size)) break; var tmp = new Common.RepCheckData { Name = xml["name"] }; if (!int.TryParse(xml["offset"], NumberStyles.HexNumber, null, out tmp.Offset)) break; // It's broken! xml.Read(); if (!string.IsNullOrEmpty(xml.Value)) { var data = Encoding.Unicode.GetString(Common.HexToArray(Regex.Replace(xml.Value, @"\s+", "").ToUpper())); Common.Types[size].RepCheck.Value.Add(data, new Holder <Common.RepCheckData>(tmp)); } break; #endregion #region Datamatches Entries case "datamatchid": if (!Common.Types.ContainsKey(size)) break; var tmpid = xml["id"]; if (string.IsNullOrEmpty(tmpid)) break; if (!Common.Types[size].DataMatchList.Value.ContainsKey(tmpid)) Common.Types[size].DataMatchList.Value.Add(tmpid, new Holder <Common.DataMatchID>(new Common.DataMatchID())); xml.Read(); if (string.IsNullOrEmpty(xml.Value)) break; Common.Types[size].DataMatchList.Value[tmpid].Value.Name = xml.Value; break; case "datamatch": if (!Common.Types.ContainsKey(size)) break; var tmpid2 = xml["id"]; if (string.IsNullOrEmpty(tmpid2)) break; if (!Common.Types[size].DataMatchList.Value.ContainsKey(tmpid2)) break; var tmpmatch = new Common.DataMatch(); if (!int.TryParse(xml["offset"], NumberStyles.HexNumber, null, out tmpmatch.Offset)) break; if (!int.TryParse(xml["length"], NumberStyles.HexNumber, null, out tmpmatch.Length)) break; if (!int.TryParse(xml["seqrep"], NumberStyles.HexNumber, null, out tmpmatch.SequenceRepetitions)) tmpmatch.SequenceRepetitions = 0; tmpmatch.DisableDisplay = !string.IsNullOrEmpty(xml["nodisp"]) && xml["nodisp"].Equals("true", StringComparison.CurrentCultureIgnoreCase); xml.Read(); if (string.IsNullOrEmpty(xml.Value)) break; tmpmatch.Name = xml.Value; Common.Types[size].DataMatchList.Value[tmpid2].Value.Data.Add(tmpmatch); break; #endregion #region Datafill Entry case "datafill": if (!Common.Types.ContainsKey(size)) break; var datafill = new Common.DataFillEntry { Name = xml["name"] }; int.TryParse(xml["offset"], NumberStyles.HexNumber, null, out datafill.Offset); int.TryParse(xml["size"], NumberStyles.HexNumber, null, out datafill.Length); int.TryParse(xml["ldrsize"], NumberStyles.HexNumber, null, out datafill.LdrSize); int.TryParse(xml["regionsize"], NumberStyles.HexNumber, null, out datafill.RegionSize); int.TryParse(xml["regionstart"], NumberStyles.HexNumber, null, out datafill.RegionStart); int.TryParse(xml["vtrmentrycount_offset"], NumberStyles.HexNumber, null, out datafill.vtrmentrycount_offset); xml.Read(); if (!byte.TryParse(xml.Value, NumberStyles.HexNumber, null, out datafill.Data)) break; Common.Types[size].DataFillEntries.Value.Add(datafill); break; #endregion #region ROS#Offset case "ros0offset": if (!Common.Types.ContainsKey(size)) break; xml.Read(); if (!int.TryParse(xml.Value, NumberStyles.HexNumber, null, out Common.Types[size].ROS0Offset)) Common.Types[size].ROS0Offset = -1; break; case "ros1offset": if (!Common.Types.ContainsKey(size)) break; xml.Read(); if (!int.TryParse(xml.Value, NumberStyles.HexNumber, null, out Common.Types[size].ROS1Offset)) Common.Types[size].ROS1Offset = -1; break; #endregion } } } Common.SendStatus("Parsing done!"); checkbtn.Enabled = true; }