private void RetrieveSubstitution(XmlTextWriter writer, IJPSubstitutionRule srs, Ba rule, int start, int end) { int n = end - start + 1; string[] subCode = new string[n]; for (int i = 0; i < n; i++) { switch (rule) { case Ba.Year: subCode[i] = srs.GetYearSetup(i + start); break; case Ba.Month: subCode[i] = srs.GetMonthSetup(i + start); break; case Ba.Day: subCode[i] = srs.GetDaySetup(i + start); break; case Ba.Hour: subCode[i] = srs.GetHourSetup(i + start); break; case Ba.Minute: subCode[i] = srs.GetMinuteSetup(i + start); break; case Ba.WeekNumber: subCode[i] = srs.GetWeekNumberSetup(i); break; case Ba.DayOfWeek: subCode[i] = srs.GetWeekSetup((DayOfWeek)i); break; } } for (int i = 0; i < n; i += 10) { writer.WriteStartElement("Rule"); { writer.WriteAttributeString("Type", rule.ToString()); writer.WriteAttributeString("Base", (i + start).ToString()); writer.WriteString(string.Join("/", subCode, i, Math.Min(10, n - i))); } writer.WriteEndElement(); // Rule } }
// Set valuse within a substiturion rule private void SetSubValues(IJPSubstitutionRule sr, MsgToXml.Ba type, XmlNode c, string delimiter) { bool success = true; // Avoid user errors if (int.TryParse(GetXmlAttr(c, "Base"), out int b)) { string[] s = GetXmlValue(c).Split(delimiter[0]); for (int i = 0; i < s.Length && success; i++) { int n = b + i; // Avoid user errors switch (type) { case MsgToXml.Ba.Year: sr.SetYearSetup(n, s[i]); break; case MsgToXml.Ba.Month: sr.SetMonthSetup(n, s[i]); break; case MsgToXml.Ba.Day: sr.SetDaySetup(n, s[i]); break; case MsgToXml.Ba.Hour: sr.SetHourSetup(n, s[i]); break; case MsgToXml.Ba.Minute: sr.SetMinuteSetup(n, s[i]); break; case MsgToXml.Ba.WeekNumber: sr.SetWeekNumberSetup(n, s[i]); break; case MsgToXml.Ba.DayOfWeek: sr.SetWeekSetup((DayOfWeek)(n - 1), s[i]); // break; } } } }
// Load substitutions private void LoadBuildSubstitution(XmlNode p) { // Get the standard attributes for substitution string rule = GetXmlAttr(p, "RuleNumber"); string startYear = GetXmlAttr(p, "StartYear"); string delimiter = GetXmlAttr(p, "Delimiter"); // Avoid user errors if (int.TryParse(rule, out int ruleNumber) && ushort.TryParse(startYear, out ushort year) && delimiter.Length == 1) { // Sub Substitution rule in Index class IJPSubstitutionRule sr = (IJPSubstitutionRule)ijp.GetSubstitutionRule(ruleNumber); // Set the start year in the substitution rule sr.StartYear = year; // Load the individual rules foreach (XmlNode c in p.ChildNodes) { if (c is XmlWhitespace) { continue; } switch (c.Name) { case "Rule": if (Enum.TryParse(GetXmlAttr(c, "Type"), true, out MsgToXml.Ba type)) { SetSubValues(sr, type, c, delimiter); } else { Log?.Invoke(this, $"Unknown substitution rule type =>{GetXmlAttr(c, "Type")}<="); } break; } } ijp.SetSubstitutionRule(sr); } }
private void RetrieveSubstitutions(XmlTextWriter writer, IJPMessage m, IJP ijp) { int maxSZ = -1; int[] sr = new int[100]; // They are assumed to be 0 for (int i = 0; i < m.CalendarConditions.Count; i++) { IJPCalendarCondition cc = m.CalendarConditions[i]; int n = cc.SubstitutionRuleNumber; maxSZ = Math.Max(maxSZ, n); if (cc.YearSubstitutionRule) { sr[n] |= (int)Ba.Year; } if (cc.MonthSubstitutionRule) { sr[n] |= (int)Ba.Month; } if (cc.DaySubstitutionRule) { sr[n] |= (int)Ba.Day; } if (cc.HourSubstitutionRule) { sr[n] |= (int)Ba.Hour; } if (cc.MinuteSubstitutionRule) { sr[n] |= (int)Ba.Minute; } if (cc.WeekNumberSubstitutionRule) { sr[n] |= (int)Ba.WeekNumber; } if (cc.WeekSubstitutionRule) { sr[n] |= (int)Ba.DayOfWeek; } } for (int i = 1; i <= maxSZ; i++) { if (sr[i] > 0) { IJPSubstitutionRule srs = (IJPSubstitutionRule)ijp.GetSubstitutionRule(i); writer.WriteStartElement("Substitution"); { writer.WriteAttributeString("Delimiter", "/"); writer.WriteAttributeString("StartYear", srs.StartYear.ToString()); writer.WriteAttributeString("RuleNumber", i.ToString()); writer.WriteAttributeString("RuleName", srs.Name); if ((sr[i] & (int)Ba.Year) > 0) { RetrieveSubstitution(writer, srs, Ba.Year, 0, 23); } if ((sr[i] & (int)Ba.Month) > 0) { RetrieveSubstitution(writer, srs, Ba.Month, 1, 12); } if ((sr[i] & (int)Ba.Day) > 0) { RetrieveSubstitution(writer, srs, Ba.Day, 1, 31); } if ((sr[i] & (int)Ba.Hour) > 0) { RetrieveSubstitution(writer, srs, Ba.Hour, 0, 23); } if ((sr[i] & (int)Ba.Minute) > 0) { RetrieveSubstitution(writer, srs, Ba.Minute, 0, 59); } if ((sr[i] & (int)Ba.WeekNumber) > 0) { RetrieveSubstitution(writer, srs, Ba.WeekNumber, 1, 53); } if ((sr[i] & (int)Ba.DayOfWeek) > 0) { RetrieveSubstitution(writer, srs, Ba.DayOfWeek, 1, 7); } } writer.WriteEndElement(); // Substitution } } }