using System; using System.Collections.Generic; using System.Text; using System.ComponentModel; using System.Text.RegularExpressions; using System.Data; using System.Data.SqlClient; using System.Linq; using Csla.Data; using System.Threading; using System.Threading.Tasks; namespace VEPROMS.CSLA.Library { [Flags] public enum E_ROValueType : uint { All = 0, Text = 1, Table = 2, Graph = 4, Image = 8, Video = 16, Hologram = 32 } [Serializable] [TypeConverter(typeof(ExpandableObjectConverter))] public class ROFSTLookup { #region Log4Net private static readonly log4net.ILog _MyLog = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType); #endregion #region Enums [Flags] public enum SearchTypes { StartsWith = 1, EndsWith = 2, Contains = 3, ExactMatch = 4 } public enum HeaderStatuses { Unknown = 0, NotLoaded = 1, InProgress = 2, LoadComplete = 3, LoadFailed = 4 } #endregion #region Structs / Internal Classes [Serializable] public struct roHdr { public int hSize; public int hYear; public byte hMonth; public byte hDay; public int hcYear; public byte hcMonth; public byte hcDay; public byte hcHour; public byte hcMin; public byte hcSec; public byte hcHund; public rodbi[] myDbs; }; [Serializable] public struct rodbi { public int dbiID; public int dbiType; public int dbiAW; public string dbiTitle; public string dbiAP; public int ID; public int ParentID; public rochild[] children; }; [Serializable] public struct rogrp { public string value; public string appid; public int ID; public int ParentID; public rochild[] children; }; [Serializable] public struct rochild { public int ID; public int ParentID; public int type; public string title; // gets used for treeview public string roid; // roid unique identifier public string appid; // accessory page id - user specified unique id public string value; // return value, can be multiple values public rochild[] children; }; public class roChild { //private static int _roChildUnique = 0; //private static int roChildUnique //{ get { return ++_roChildUnique; } } //private int _MyRoChildUnique = roChildUnique; //public int MyRoChildUnique // Absolutely Unique ID - Info //{ get { return _MyRoChildUnique; } } rochild _MyChild; public rochild MyChild { get { return _MyChild; } set { _MyChild = value; } } public roChild(rochild myChild) { _MyChild = myChild; } public override string ToString() { return _MyChild.title.Replace("\\u160?", " "); } }; #endregion #region Fields public static Regex regRoKeyHigh = new Regex("( |-|_)(HIGH|HI)([0-9])"); public static Regex regRoKeyLow = new Regex("( |-|_)(LOW|LO)([0-9])"); // RofstLookup/Conversion Variables private int _rofstID; private DocVersionInfo _myDocVersionInfo; private int _selectedSlave; private string _otherChild = string.Empty; private List _lstRoValues; private List _multiRoValues; private Dictionary _dicRoVars; private ItemInfo _itemInfo; #endregion #region Properties public int RofstID { get { return _rofstID; } } public DocVersionInfo MyDocVersionInfo { get { return _myDocVersionInfo; } set { _myDocVersionInfo = value; _selectedSlave = (_myDocVersionInfo == null) ? 0 : _myDocVersionInfo.DocVersionConfig.SelectedSlave; } } // C2021-065 see if we need to get the RO information for the "Other" Child applicability value public int SelectedSlave { get { return (!string.IsNullOrEmpty(_otherChild)) ? Convert.ToInt32(_otherChild) : _selectedSlave; } } //C2021-065 used by Barakah Alarms so that we get ROLookUp for the Other applicability public string OtherChild { get { return _otherChild; } set { _otherChild = value; } } // B2022-020 to pass information into error log if needed public ItemInfo MyItemInfo { get { return _itemInfo; } set { _itemInfo = value; } } #endregion #region Constructors public ROFSTLookup(int rofstID, DocVersionInfo dvi, string otherChild) { _rofstID = rofstID; MyDocVersionInfo = dvi; _otherChild = otherChild; if (!RofstDataExists(rofstID)) { Load(rofstID); } } public ROFSTLookup(int rofstID, DocVersionInfo dvi) { _rofstID = rofstID; MyDocVersionInfo = dvi; if (!RofstDataExists(rofstID)) { Load(rofstID); } } public ROFSTLookup(int rofstID) { _rofstID = rofstID; MyDocVersionInfo = null; if (!RofstDataExists(rofstID)) { Load(rofstID); } } #endregion #region Public Methods #region (RO Info) public bool HasChildren(ref ROFSTLookup.rochild child) { LoadChildren(ref child); return child.children.Any(); } public bool HasChildren(ref ROFSTLookup.rodbi db) { LoadChildren(ref db); return db.children.Any(); } public void LoadChildren(ref ROFSTLookup.rochild child) { // If Children is null then it hasn't been loaded yet if (child.children == null || child.children.Length <= 0) { if (!string.IsNullOrEmpty(child.appid)) child = GetRoChild12(child.roid, true); else child.children = GetRoChildrenByRoid(child.roid, true); } } public void LoadChildren(ref ROFSTLookup.rodbi db) { // If Children is null then it hasn't been loaded yet if (db.children == null || db.children.Length <= 0) db.children = GetRoChildrenByID(db.ID, db.dbiID, true); } public ROFSTLookup.rochild GetRoChild(string ROID, bool loadChildren = false, bool loadAllChildren = false) { ROFSTLookup.rochild rc = new ROFSTLookup.rochild() { ID = -1 }; if (ROID.StartsWith("FFFF")) { rc.ID = 0; rc.ParentID = 0; rc.roid = ROID; rc.type = 1; rc.value = GetRoValue(ROID); if (ROID == "FFFF00000001") rc.appid = "U-Number"; else if (ROID == "FFFF00000002") rc.appid = "U-Other Number"; else if (ROID == "FFFF00000003") rc.appid = "U-Text"; else if (ROID == "FFFF00000004") rc.appid = "U-Other Text"; else if (ROID == "FFFF00000005") rc.appid = "U-ID"; else if (ROID == "FFFF00000006") rc.appid = "U-Other ID"; else if (ROID == "FFFF00000007") rc.appid = "U-Name"; else if (ROID == "FFFF00000008") rc.appid = "U-Other Name"; else rc.appid = "U-Unknown"; } else { rc = GetRoChild12(ROID, loadChildren, loadAllChildren); if (rc.children != null && rc.children.Length > 0) { foreach (ROFSTLookup.rochild c in rc.children) { if (c.roid.ToUpper() == ROID.ToUpper()) { return c; } } } } return rc; } public string GetRoValue(string ROID16) { // This only gets rochild values, not groups string ROID = ROID16.Substring(0, 12); if (ROID.StartsWith("FFFF")) { DocVersionConfig dvc = _myDocVersionInfo.DocVersionConfig; if (ROID == "FFFF00000001") return dvc.Unit_Number; if (ROID == "FFFF00000002") return dvc.Other_Unit_Number; if (ROID == "FFFF00000003") return dvc.Unit_Text; if (ROID == "FFFF00000004") return dvc.Other_Unit_Text; if (ROID == "FFFF00000005") return dvc.Unit_ID; if (ROID == "FFFF00000006") return dvc.Other_Unit_ID; if (ROID == "FFFF00000007") return dvc.Unit_Name; if (ROID == "FFFF00000008") return dvc.Other_Unit_Name; } ROFSTLookup.rochild rc = GetRoChild12(ROID); if (rc.ID > 0) { if (!string.IsNullOrEmpty(rc.value)) { return FixUnitROs(GetParentChildROValue(rc)); } if (rc.children != null && rc.children.Length > 0) { foreach (ROFSTLookup.rochild c in rc.children) { if (c.roid.ToUpper() == ROID16.ToUpper() || (c.roid.EndsWith("0041") && ROID16.EndsWith("0000"))) { return FixUnitROs(GetParentChildROValue(c) ?? "?"); } } // if there isn't a specific match for multi-return values, default to the first child. return FixUnitROs(GetParentChildROValue(rc.children[0]) ?? "?"); } } return "?"; } public string GetParentChildROValue(ROFSTLookup.rochild roc) { // C2021-026 Get the child RO value if it exists, otherwise to the default (parent) RO value // C2022-001 new logic to handle new format of Parent/Child RO.FST // The RO.FST will not have a specific child value if that child value is the same as the default value string roval = roc.value; // B2021-093 Don't look for child RO values if "roval" is null if (roval == null) return null; // B2022-020 remove a un-needed question mark that was in the search criteria "(" // B2022-050 change the search string from "(" to "" to handle when RO values have less then sign MatchCollection mm = Regex.Matches(roval, ""); // C2022-014 commented write to error log. Keep for debugging purposes. //if (mm.Count == 0) // B2022-020 will now write in error log if there is a problem // _MyLog.WarnFormat("Parent/Child Values not parsable for \r\nItemId={0}\r\nROValue={1} ",MyDocVersionInfo.ItemID,roval); StringBuilder sb = new StringBuilder(); int lastIndex = 0; // Get selected child Idx int selChldIdx = this.SelectedSlave; // Get Selected Child Value foreach (Match m in mm) { sb.Append(roval.Substring(lastIndex, m.Index - lastIndex)); string aplString = m.Value; string chldValStr = string.Format("UnitIdx={0} Value=", selChldIdx); int offsetIdx = aplString.IndexOf(chldValStr); int nextIDX = -1; if (offsetIdx == -1) { offsetIdx = aplString.IndexOf("DefaultVal=") + 11; } else { offsetIdx += chldValStr.Length; } nextIDX = aplString.IndexOf(",UnitIdx", offsetIdx); if (nextIDX == -1) nextIDX = aplString.IndexOf(" /APL>"); sb.Append(aplString.Substring(offsetIdx, nextIDX - offsetIdx)); lastIndex = m.Index + m.Length; } // B2022-018 append any remaining text if (lastIndex < roval.Length) { sb.Append(roval.Substring(lastIndex)); } return sb.ToString(); } public string GetTranslatedRoValue(string ROID16, bool DoCaret, bool DoDOSSuperSubScript) { string retval = GetRoValue(ROID16); retval = ReplaceUnicode(retval, DoCaret); retval = ConvertFortranFormatToScienctificNotation(retval); // B2019-037 handle the super an sub scripts after getting the RO value from the FST // the corrected RO text is added to the display text in the link info if (DoDOSSuperSubScript) { retval = Regex.Replace(retval, "[#](.*?)[#]", "\\up2 $1\\up0 ");// Superscript retval = Regex.Replace(retval, "[~](.*?)[~]", "\\dn2 $1\\up0 ");// Subscript } return retval.Replace("\r\n", @"\par "); } public Dictionary Search(string value, int searchTypeID, int? maxNumRecords = null) { if (string.IsNullOrEmpty(value)) return null; return RofstDataSearch(_rofstID, value, searchTypeID, maxNumRecords); } public ROFSTLookup.rochild[] GetRoChildrenByID(int id, int dbiID, bool loadChildren = false, bool loadAllChildren = false) { return RofstDataGetChildrenByID(_rofstID, dbiID, id, loadChildren, loadAllChildren); } public ROFSTLookup.rochild[] GetRoChildrenByRoid(string roid, bool loadChildren = false, bool loadAllChildren = false) { return RofstDataGetChildrenByRoid(_rofstID, roid, loadChildren, loadAllChildren); } public ROFSTLookup.rochild[] GetRoChildrenByType(E_ROValueType valueTypes, bool loadChildren = false, bool loadAllChildren = false) { return RofstDataGetRoChildrenByType(_rofstID, valueTypes, loadChildren, loadAllChildren); } public List GetValueDifferences(int originalRofstID, ref List delList) { return RofstDataGetValueDifferences(originalRofstID, _rofstID, ref delList); } public List GetROTitleAndGroupPath(string ROID, bool reportMissingROs, bool convertCaretToDelta) { // Return the RO Title in a list of strings. The last item in the list is the actual RO title, // the items preceding it are the titles of the groups and sub-groups containing the RO List titlePath = new List(); ROFSTLookup.rochild roc = GetRoChild12(ROID); if (roc.appid != null) { string tmp = roc.title; if (roc.appid != string.Empty && roc.title.Contains(roc.appid)) { tmp = roc.title.Replace(roc.appid, "").Trim(); } tmp = string.Format("[{0}] {1}", roc.appid, tmp); tmp = tmp.Replace("`", "\u00B0"); //degree tmp = tmp.Replace("\xF8", "\u00B0"); //degree if (convertCaretToDelta) tmp = tmp.Replace("^", "\u0394"); // delta titlePath.Add(tmp); do { string parent = ROID.Substring(0, 4) + string.Format("{0:X8}", roc.ParentID); roc = GetRoChild12(parent); if (roc.ID > 0) titlePath.Add(roc.title.Trim()); } while (roc.ID > 0); titlePath.Reverse(); } else if (reportMissingROs) // Missing RO, put a message with the ROID on the report... { titlePath.Add(string.Format("Missing RO for ROID {0}", ROID)); } return titlePath; } public string GetROTitle(string ROID) { StringBuilder sb = new StringBuilder(); ROFSTLookup.rochild rc = GetRoChild12(ROID); if (rc.value == null) rc = GetRoChild(ROID); // B2020-125: View of Consistency check report displaying error message and crashing. And also in 'else' check for null if (rc.ID == -1) { sb.Append("Could not find RO data"); } else { string tmp = string.Empty; if (!string.IsNullOrEmpty(rc.title)) tmp = rc.title; if (!string.IsNullOrEmpty(rc.appid)) tmp = tmp.Replace(rc.appid, string.Empty); if (!string.IsNullOrEmpty(rc.value)) tmp = tmp.Replace(rc.value, string.Empty); sb.Append(tmp.Trim()); } do { string parentROID = ROID.Substring(0, 4) + string.Format("{0:X8}", rc.ParentID); rc = GetRoChild12(parentROID); if (rc.ID > 0) sb.Insert(0, rc.title + " - "); } while (rc.ID > 0); return sb.ToString(); } public DateTime GetRoFSTdts() { return GetRofstDtsByID(_rofstID); } public static byte[] GetRofstLookupBytes(int rofstID) { return RofstDataGetRofstLookupBytes(rofstID); } #endregion #region (RO Database Info) public int GetRODatabaseTitleIndex(string roid) { return Convert.ToInt32("0x" + roid.Substring(0, 4), 16); } public string GetRODatabaseTitle(int idx) { ROFSTLookup.rodbi rd = RofstDataGetDatabaseByID(_rofstID, idx); return (!string.IsNullOrEmpty(rd.dbiTitle) ? rd.dbiTitle : "RO Database Title Not Found"); } public ROFSTLookup.rodbi GetRODatabase(string roid, bool loadChildren = false, bool loadAllChildren = false) { int idx = GetRODatabaseTitleIndex(roid); ROFSTLookup.rodbi rd = RofstDataGetDatabaseByID(_rofstID, idx, loadChildren, loadAllChildren); return (rd.dbiID > 0) ? rd : RofstDataGetDatabaseByID(_rofstID, 1, loadChildren, loadAllChildren); } public ROFSTLookup.rodbi[] GetRODatabaseList(bool loadChildren = false, bool loadAllChildren = false) { return RofstDataGetDatabases(_rofstID, loadChildren, loadAllChildren); } #endregion #region (RO Info By AccPageID) public string GetROValueByAccPagID(string accPageID, string spDefault, string igDefault) { ROFSTLookup.rochild? child = GetROChildByAccPageID(accPageID, spDefault, igDefault); if (child == null) return null; return GetParentChildROValue((ROFSTLookup.rochild)child); // C2021-026 get the P/C value if it exists, otherwise get the non-P/C value } public int? GetROTypeByAccPagID(string accPageID, string spDefault, string igDefault) { ROFSTLookup.rochild? child = GetROChildByAccPageID(accPageID, spDefault, igDefault); if (child == null) return null; return ((ROFSTLookup.rochild)child).type; } public string GetROIDByAccPagID(string accPageID, string spDefault, string igDefault) { ROFSTLookup.rochild? child = GetROChildByAccPageID(accPageID, spDefault, igDefault); if (child == null) return null; return ((ROFSTLookup.rochild)child).roid; } public ROFSTLookup.rochild? GetROChildByAccPageID(string accPageID, string spDefault, string igDefault) { ROFSTLookup.rochild? child = GetRoChildByAccPagID(accPageID, spDefault, igDefault); if (child == null) { if (Regex.IsMatch(accPageID, @".*\.[A-Z]")) { string accpage = accPageID.Substring(0, accPageID.Length - 3); int index = accPageID.Substring(accPageID.Length - 2, 1)[0] - 'A'; child = GetRoChildByAccPagID(accpage.TrimStart("<".ToCharArray()), spDefault, igDefault); if (child == null) return null; if (((ROFSTLookup.rochild)child).children != null && ((ROFSTLookup.rochild)child).children.Length > 0 && ((ROFSTLookup.rochild)child).children.Length > index) { return ((ROFSTLookup.rochild)child).children[index]; } } return null; } if (((ROFSTLookup.rochild)child).children != null && ((ROFSTLookup.rochild)child).children.Length > 0) return ((ROFSTLookup.rochild)child).children[0]; return (ROFSTLookup.rochild)child; } public ROFSTLookup.rochild? GetRoChildByAccPagID(string accPageID, string spDefault, string igDefault) { accPageID = accPageID.Replace("".ToCharArray()); // String < and > string key = FormatKey(accPageID); ROFSTLookup.rochild rc = RofstDataGetChildByAccPageID(_rofstID, key); if (rc.ID > 0) return rc; return null; } #endregion #endregion #region Private Methods #region (Database Calls) private bool RofstDataExists(int rofstID) { int headerStatusID = RofstDataGetHeaderLoadStatus(rofstID); while (headerStatusID == (int)HeaderStatuses.InProgress) { // Wait 5 sec(s) then Check Header Status Again Thread.Sleep(5000); headerStatusID = RofstDataGetHeaderLoadStatus(rofstID); } return (headerStatusID == (int)HeaderStatuses.LoadComplete); // false includes [NotLoaded = 1 || LoadFailed = 4 || Unknown = 0] } private int RofstDataGetHeaderLoadStatus(int rofstID) { try { using (SqlConnection cn = Database.VEPROMS_SqlConnection) { using (SqlCommand cmd = cn.CreateCommand()) { cmd.CommandTimeout = Database.DefaultTimeout; cmd.CommandType = CommandType.StoredProcedure; cmd.CommandText = "vesp_RofstDataGetHeaderRofstByID"; cmd.Parameters.Add(new SqlParameter("@RofstID", SqlDbType.Int)).Value = rofstID; using (SafeDataReader dr = new SafeDataReader(cmd.ExecuteReader())) { if (dr.Read()) return Convert.ToInt32(dr.GetValue("RofstHeaderStatusID")); } } } return 0; // Unknown Status } catch (Exception ex) { throw new DbCslaException("RofstData.vesp_RofstDataGetHeaderRofstByID", ex); } } private static byte[] RofstDataGetRofstLookupBytes(int rofstID) { try { using (SqlConnection cn = Database.VEPROMS_SqlConnection) { using (SqlCommand cmd = cn.CreateCommand()) { cmd.CommandTimeout = Database.DefaultTimeout; cmd.CommandType = CommandType.StoredProcedure; cmd.CommandText = "vesp_RofstDataGetRofstByID"; cmd.Parameters.Add(new SqlParameter("@RofstID", SqlDbType.Int)).Value = rofstID; cmd.Parameters.Add(new SqlParameter("@IncludeRoLookup", SqlDbType.Bit)).Value = 1; using (SafeDataReader dr = new SafeDataReader(cmd.ExecuteReader())) { if (dr.Read()) return (byte[])dr.GetValue("ROLookup"); } } } return null; } catch (Exception ex) { throw new DbCslaException("RofstData.vesp_RofstDataGetRofstByID", ex); } } private DateTime GetRofstDtsByID(int rofstID) { try { using (SqlConnection cn = Database.VEPROMS_SqlConnection) { using (SqlCommand cmd = cn.CreateCommand()) { cmd.CommandTimeout = Database.DefaultTimeout; cmd.CommandType = CommandType.StoredProcedure; cmd.CommandText = "vesp_RofstDataGetRofstByID"; cmd.Parameters.Add(new SqlParameter("@RofstID", SqlDbType.Int)).Value = rofstID; cmd.Parameters.Add(new SqlParameter("@IncludeRoLookup", SqlDbType.Bit)).Value = 0; using (SafeDataReader dr = new SafeDataReader(cmd.ExecuteReader())) { if (dr.Read()) return (DateTime)dr.GetValue("DTS"); } } } return new DateTime(); } catch (Exception ex) { throw new DbCslaException("RofstData.vesp_RofstDataGetRofstByID", ex); } } private void RofstHeaderInsert(int rofstID, int hSize, int hMonth, int hDay, int hcYear, int hcMonth, int hcDay, int hcHour, int hcMin, int hcSec, int hcHund, string userID) { try { using (SqlConnection cn = Database.VEPROMS_SqlConnection) { using (SqlCommand cmd = cn.CreateCommand()) { cmd.CommandTimeout = Database.DefaultTimeout; cmd.CommandType = CommandType.StoredProcedure; cmd.CommandText = "vesp_RofstHeaderInsert"; cmd.Parameters.Add(new SqlParameter("@RofstID", SqlDbType.Int)).Value = rofstID; cmd.Parameters.Add(new SqlParameter("@hSize", SqlDbType.Int)).Value = hSize; cmd.Parameters.Add(new SqlParameter("@hMonth", SqlDbType.Int)).Value = hMonth; cmd.Parameters.Add(new SqlParameter("@hDay", SqlDbType.Int)).Value = hDay; cmd.Parameters.Add(new SqlParameter("@hcYear", SqlDbType.Int)).Value = hcYear; cmd.Parameters.Add(new SqlParameter("@hcMonth", SqlDbType.Int)).Value = hcMonth; cmd.Parameters.Add(new SqlParameter("@hcDay", SqlDbType.Int)).Value = hcDay; cmd.Parameters.Add(new SqlParameter("@hcHour", SqlDbType.Int)).Value = hcHour; cmd.Parameters.Add(new SqlParameter("@hcMin", SqlDbType.Int)).Value = hcMin; cmd.Parameters.Add(new SqlParameter("@hcSec", SqlDbType.Int)).Value = hcSec; cmd.Parameters.Add(new SqlParameter("@hcHund", SqlDbType.Int)).Value = hcHund; cmd.Parameters.Add(new SqlParameter("@userID", SqlDbType.VarChar)).Value = userID; cmd.ExecuteNonQuery(); } } } catch (Exception ex) { throw new DbCslaException("RofstData.vesp_RofstHeaderInsert", ex); } } private void RofstHeaderFinalizeLoad(int rofstID) { try { using (SqlConnection cn = Database.VEPROMS_SqlConnection) { using (SqlCommand cmd = cn.CreateCommand()) { cmd.CommandTimeout = Database.DefaultTimeout; cmd.CommandType = CommandType.StoredProcedure; cmd.CommandText = "vesp_RofstHeaderFinalizeLoad"; cmd.Parameters.Add(new SqlParameter("@RofstID", SqlDbType.Int)).Value = rofstID; cmd.ExecuteNonQuery(); } } } catch (Exception ex) { throw new DbCslaException("RofstData.vesp_RofstHeaderFinalizeLoad", ex); } } private void RofstDatabaseInsert(int rofstID, int dbiID, int dbiType, int dbiAW, string dbiTitle, string dbiAP, int id, int parentID) { try { using (SqlConnection cn = Database.VEPROMS_SqlConnection) { using (SqlCommand cmd = cn.CreateCommand()) { cmd.CommandTimeout = Database.DefaultTimeout; cmd.CommandType = CommandType.StoredProcedure; cmd.CommandText = "vesp_RofstDatabaseInsert"; cmd.Parameters.Add(new SqlParameter("@RofstID", SqlDbType.Int)).Value = rofstID; cmd.Parameters.Add(new SqlParameter("@dbiID", SqlDbType.Int)).Value = dbiID; cmd.Parameters.Add(new SqlParameter("@dbiType", SqlDbType.Int)).Value = dbiType; cmd.Parameters.Add(new SqlParameter("@dbiAW", SqlDbType.Int)).Value = dbiAW; cmd.Parameters.Add(new SqlParameter("@dbiTitle", SqlDbType.VarChar)).Value = dbiTitle; cmd.Parameters.Add(new SqlParameter("@dbiAP", SqlDbType.VarChar)).Value = dbiAP; cmd.Parameters.Add(new SqlParameter("@ID", SqlDbType.Int)).Value = id; cmd.Parameters.Add(new SqlParameter("@ParentID", SqlDbType.Int)).Value = parentID; cmd.ExecuteNonQuery(); } } } catch (Exception ex) { throw new DbCslaException("RofstData.vesp_RofstDatabaseInsert", ex); } } private void RofstChildInsert(int rofstID, int id, int parentID, int dbiID, int type, string title, string roid, string appid, string value) { try { using (SqlConnection cn = Database.VEPROMS_SqlConnection) { using (SqlCommand cmd = cn.CreateCommand()) { cmd.CommandTimeout = Database.DefaultTimeout; cmd.CommandType = CommandType.StoredProcedure; cmd.CommandText = "vesp_RofstChildInsert"; cmd.Parameters.Add(new SqlParameter("@RofstID", SqlDbType.Int)).Value = rofstID; cmd.Parameters.Add(new SqlParameter("@ID", SqlDbType.Int)).Value = id; cmd.Parameters.Add(new SqlParameter("@ParentID", SqlDbType.Int)).Value = parentID; cmd.Parameters.Add(new SqlParameter("@dbiID", SqlDbType.Int)).Value = dbiID; cmd.Parameters.Add(new SqlParameter("@type", SqlDbType.Int)).Value = type; cmd.Parameters.Add(new SqlParameter("@title", SqlDbType.VarChar)).Value = title; cmd.Parameters.Add(new SqlParameter("@roid", SqlDbType.VarChar)).Value = roid; if (!string.IsNullOrEmpty(appid)) cmd.Parameters.Add(new SqlParameter("@appid", SqlDbType.VarChar)).Value = appid; if (!string.IsNullOrEmpty(value)) cmd.Parameters.Add(new SqlParameter("@value", SqlDbType.VarChar)).Value = value; cmd.ExecuteNonQuery(); } } } catch (Exception ex) { throw new DbCslaException("RofstData.vesp_RofstChildInsert", ex); } } private ROFSTLookup.rodbi RofstDataGetDatabaseByID(int rofstID, int dbiID, bool loadChildren = false, bool loadAllChildren = false) { try { using (SqlConnection cn = Database.VEPROMS_SqlConnection) { using (SqlCommand cmd = cn.CreateCommand()) { cmd.CommandTimeout = Database.DefaultTimeout; cmd.CommandType = CommandType.StoredProcedure; cmd.CommandText = "vesp_RofstDataGetDatabaseByID"; cmd.Parameters.Add(new SqlParameter("@RofstID", SqlDbType.Int)).Value = rofstID; cmd.Parameters.Add(new SqlParameter("@dbiID", SqlDbType.Int)).Value = dbiID; using (SafeDataReader dr = new SafeDataReader(cmd.ExecuteReader())) { if (dr.Read()) { return ConvertToRodbiObject(dr, loadChildren, loadAllChildren); } } } } return new ROFSTLookup.rodbi(); } catch (Exception ex) { throw new DbCslaException("RofstData.vesp_RofstDataGetDatabaseByID", ex); } } private ROFSTLookup.rodbi[] RofstDataGetDatabases(int rofstID, bool loadChildren = false, bool loadAllChildren = false) { try { List dbs = new List(); using (SqlConnection cn = Database.VEPROMS_SqlConnection) { using (SqlCommand cmd = cn.CreateCommand()) { cmd.CommandTimeout = Database.DefaultTimeout; cmd.CommandType = CommandType.StoredProcedure; cmd.CommandText = "vesp_RofstDataGetDatabases"; cmd.Parameters.Add(new SqlParameter("@RofstID", SqlDbType.Int)).Value = rofstID; using (SafeDataReader dr = new SafeDataReader(cmd.ExecuteReader())) { while (dr.Read()) { dbs.Add(ConvertToRodbiObject(dr, loadChildren, loadAllChildren)); } } } } return dbs.ToArray(); } catch (Exception ex) { throw new DbCslaException("RofstData.vesp_RofstDataGetDatabases", ex); } } private ROFSTLookup.rochild[] RofstDataGetChildrenByID(int rofstID, int dbiID, int id, bool loadChildren = false, bool loadAllChildren = false) { try { List lst = new List(); using (SqlConnection cn = Database.VEPROMS_SqlConnection) { using (SqlCommand cmd = cn.CreateCommand()) { cmd.CommandTimeout = Database.DefaultTimeout; cmd.CommandType = CommandType.StoredProcedure; cmd.CommandText = "vesp_RofstDataGetChildrenByID"; cmd.Parameters.Add(new SqlParameter("@RofstID", SqlDbType.Int)).Value = rofstID; cmd.Parameters.Add(new SqlParameter("@DbiID", SqlDbType.Int)).Value = dbiID; cmd.Parameters.Add(new SqlParameter("@ID", SqlDbType.Int)).Value = id; using (SafeDataReader dr = new SafeDataReader(cmd.ExecuteReader())) { while (dr.Read()) { lst.Add(ConvertToRochildObject(dr, loadChildren, loadAllChildren)); } } } } return lst.ToArray(); } catch (Exception ex) { throw new DbCslaException("RofstData.vesp_RofstDataGetChildrenByID", ex); } } private ROFSTLookup.rochild RofstDataGetChildByRoid(int rofstID, string roid, bool loadChildren = false, bool loadAllChildren = false) { try { using (SqlConnection cn = Database.VEPROMS_SqlConnection) { using (SqlCommand cmd = cn.CreateCommand()) { cmd.CommandTimeout = Database.DefaultTimeout; cmd.CommandType = CommandType.StoredProcedure; cmd.CommandText = "vesp_RofstDataGetChildByRoid"; cmd.Parameters.Add(new SqlParameter("@RofstID", SqlDbType.Int)).Value = rofstID; cmd.Parameters.Add(new SqlParameter("@Roid", SqlDbType.VarChar)).Value = roid; using (SafeDataReader dr = new SafeDataReader(cmd.ExecuteReader())) { if (dr.Read()) { return ConvertToRochildObject(dr, loadChildren, loadAllChildren); } } } } return new ROFSTLookup.rochild() { ID = -1 }; } catch (Exception ex) { throw new DbCslaException("RofstData.vesp_RofstDataGetChildByRoid", ex); } } private ROFSTLookup.rochild RofstDataGetChildByAccPageID(int rofstID, string accPageID, bool loadChildren = false, bool loadAllChildren = false) { try { using (SqlConnection cn = Database.VEPROMS_SqlConnection) { using (SqlCommand cmd = cn.CreateCommand()) { cmd.CommandTimeout = Database.DefaultTimeout; cmd.CommandType = CommandType.StoredProcedure; cmd.CommandText = "vesp_RofstDataGetChildByAccPageID"; cmd.Parameters.Add(new SqlParameter("@RofstID", SqlDbType.Int)).Value = rofstID; cmd.Parameters.Add(new SqlParameter("@AccPageID", SqlDbType.VarChar)).Value = accPageID; using (SafeDataReader dr = new SafeDataReader(cmd.ExecuteReader())) { if (dr.Read()) { return ConvertToRochildObject(dr, loadChildren, loadAllChildren); } } } } return new ROFSTLookup.rochild() { ID = -1 }; } catch (Exception ex) { throw new DbCslaException("RofstData.vesp_RofstDataGetChildByAccPageID", ex); } } private ROFSTLookup.rochild[] RofstDataGetChildrenByRoid(int rofstID, string roid, bool loadChildren = false, bool loadAllChildren = false) { try { List lst = new List(); using (SqlConnection cn = Database.VEPROMS_SqlConnection) { using (SqlCommand cmd = cn.CreateCommand()) { cmd.CommandTimeout = Database.DefaultTimeout; cmd.CommandType = CommandType.StoredProcedure; cmd.CommandText = "vesp_RofstDataGetChildrenByRoid"; cmd.Parameters.Add(new SqlParameter("@RofstID", SqlDbType.Int)).Value = rofstID; cmd.Parameters.Add(new SqlParameter("@Roid", SqlDbType.VarChar)).Value = roid; using (SafeDataReader dr = new SafeDataReader(cmd.ExecuteReader())) { while (dr.Read()) { lst.Add(ConvertToRochildObject(dr, loadChildren, loadAllChildren)); } } } } return lst.ToArray(); } catch (Exception ex) { throw new DbCslaException("RofstData.vesp_RofstDataGetChildrenByRoid", ex); } } private List RofstDataGetValueDifferences(int originalRofstID, int currentRofstID, ref List delList) { // use this list to see what differences are between the current and the original List modList = new List(); List roidList = new List(); try { using (SqlConnection cn = Database.VEPROMS_SqlConnection) { using (SqlCommand cmd = cn.CreateCommand()) { cmd.CommandTimeout = Database.DefaultTimeout; cmd.CommandType = CommandType.StoredProcedure; cmd.CommandText = "vesp_RofstDataGetValueDifferences"; cmd.Parameters.Add(new SqlParameter("@OriginalRofstID", SqlDbType.Int)).Value = originalRofstID; cmd.Parameters.Add(new SqlParameter("@CurrentRofstID", SqlDbType.Int)).Value = currentRofstID; using (SafeDataReader dr = new SafeDataReader(cmd.ExecuteReader())) { while (dr.Read()) { roidList.Add((string)dr.GetValue("Roid")); } } } } ROFSTLookup.rochild originalRoChild; ROFSTLookup.rochild currentRoChild; Dictionary originalRos = new Dictionary(); Dictionary currentRos = new Dictionary(); foreach (string roid in roidList) { originalRoChild = RofstDataGetChildByRoid(originalRofstID, roid); originalRos.Add(originalRoChild.roid, originalRoChild.value); if (originalRoChild.children != null && originalRoChild.children.Length > 0) { foreach (ROFSTLookup.rochild roc in originalRoChild.children) { originalRos.Add(roc.roid, roc.value); } } currentRoChild = RofstDataGetChildByRoid(currentRofstID, roid); currentRos.Add(currentRoChild.roid, currentRoChild.value); if (currentRoChild.children != null && currentRoChild.children.Length > 0) { foreach (ROFSTLookup.rochild roc in currentRoChild.children) { currentRos.Add(roc.roid, roc.value); } } } string cvalue = string.Empty; string ovalue = string.Empty; foreach (string key in originalRos.Keys) { cvalue = null; ovalue = originalRos[key]; if (currentRos.ContainsKey(key)) cvalue = currentRos[key]; if (cvalue == null && cvalue != ovalue) delList.Add(key); else if (cvalue != ovalue) modList.Add(key); } return modList; } catch (Exception ex) { throw new DbCslaException("RofstData.vesp_RofstDataGetValueDifferences", ex); } } private Dictionary RofstDataSearch(int rofstID, string value, int searchTypeID, int? maxNumRecords) { Dictionary dic = new Dictionary(); if (string.IsNullOrEmpty(value)) return dic; try { using (SqlConnection cn = Database.VEPROMS_SqlConnection) { using (SqlCommand cmd = cn.CreateCommand()) { cmd.CommandTimeout = Database.DefaultTimeout; cmd.CommandType = CommandType.StoredProcedure; cmd.CommandText = "vesp_RofstDataSearch"; cmd.Parameters.Add(new SqlParameter("@RofstID", SqlDbType.Int)).Value = rofstID; cmd.Parameters.Add(new SqlParameter("@Value", SqlDbType.VarChar)).Value = value; cmd.Parameters.Add(new SqlParameter("@SearchTypeID", SqlDbType.Int)).Value = searchTypeID; if (maxNumRecords != null) cmd.Parameters.Add(new SqlParameter("@MaxNumOfRecords", SqlDbType.Int)).Value = (int)maxNumRecords; using (SafeDataReader dr = new SafeDataReader(cmd.ExecuteReader())) { while (dr.Read()) { dic.Add((string)dr.GetValue("roid"), (string)dr.GetValue("value")); } } } } return dic; } catch (Exception ex) { throw new DbCslaException("RofstData.vesp_RofstDataSearch", ex); } } private ROFSTLookup.rochild RofstDataGetChildByID(int rofstID, int dbiID, int id, bool loadChildren = false, bool loadAllChildren = false) { try { using (SqlConnection cn = Database.VEPROMS_SqlConnection) { using (SqlCommand cmd = cn.CreateCommand()) { cmd.CommandTimeout = Database.DefaultTimeout; cmd.CommandType = CommandType.StoredProcedure; cmd.CommandText = "vesp_RofstDataGetChildByID"; cmd.Parameters.Add(new SqlParameter("@RofstID", SqlDbType.Int)).Value = rofstID; cmd.Parameters.Add(new SqlParameter("@DbiID", SqlDbType.Int)).Value = dbiID; cmd.Parameters.Add(new SqlParameter("@ID", SqlDbType.Int)).Value = id; using (SafeDataReader dr = new SafeDataReader(cmd.ExecuteReader())) { if (dr.Read()) { return ConvertToRochildObject(dr, loadChildren, loadAllChildren); } } } } return new ROFSTLookup.rochild() { ID = -1 }; } catch (Exception ex) { throw new DbCslaException("RofstData.vesp_RofstDataGetChildByID", ex); } } private ROFSTLookup.rochild[] RofstDataGetRoChildrenByType(int rofstID, E_ROValueType valueTypes, bool loadChildren = false, bool loadAllChildren = false) { try { List lst = new List(); using (SqlConnection cn = Database.VEPROMS_SqlConnection) { using (SqlCommand cmd = cn.CreateCommand()) { cmd.CommandTimeout = Database.DefaultTimeout; cmd.CommandType = CommandType.StoredProcedure; cmd.CommandText = "vesp_RofstDataGetChildrenByType"; cmd.Parameters.Add(new SqlParameter("@RofstID", SqlDbType.Int)).Value = rofstID; cmd.Parameters.Add(new SqlParameter("@ValueTypes", SqlDbType.VarChar)).Value = valueTypes.ToCommaDelimString(); using (SafeDataReader dr = new SafeDataReader(cmd.ExecuteReader())) { while (dr.Read()) { lst.Add(ConvertToRochildObject(dr, loadChildren, loadAllChildren)); } } } } return lst.ToArray(); } catch (Exception ex) { throw new DbCslaException("RofstData.RofstDataGetRoChildrenByType", ex); } } #endregion #region (Parse/Load) private ROFSTLookup.roHdr ConvertFst2Objects(byte[] ab) { ROFSTLookup.roHdr roh = new ROFSTLookup.roHdr(); roh.hSize = BitConverter.ToInt32(ab, 0); roh.hYear = BitConverter.ToInt16(ab, 4); roh.hMonth = ab[6]; roh.hDay = ab[7]; roh.hcYear = BitConverter.ToInt16(ab, 8); roh.hcMonth = ab[10]; roh.hcDay = ab[11]; roh.hcHour = ab[12]; roh.hcMin = ab[13]; roh.hcSec = ab[14]; roh.hcHund = ab[15]; int hdrOffset = BitConverter.ToInt32(ab, 16); int dbs = BitConverter.ToInt16(ab, hdrOffset + 4); roh.myDbs = new ROFSTLookup.rodbi[dbs]; for (int i = 0; i < dbs; i++) { int offset = hdrOffset + 6 + (i * 30); roh.myDbs[i].dbiID = BitConverter.ToInt16(ab, offset + 0); int tableID = roh.myDbs[i].dbiID; roh.myDbs[i].dbiType = BitConverter.ToInt16(ab, offset + 2); roh.myDbs[i].dbiAW = BitConverter.ToInt16(ab, offset + 4); int iPtr = BitConverter.ToInt32(ab, offset + 22) + hdrOffset + 6; roh.myDbs[i].dbiTitle = Encoding.Default.GetString(ab, iPtr, StringLength(ab, iPtr)); iPtr = BitConverter.ToInt32(ab, offset + 26) + hdrOffset + 6; roh.myDbs[i].dbiAP = Encoding.Default.GetString(ab, iPtr, StringLength(ab, iPtr)); ROFSTLookup.rogrp tmp = LoadGroup(ab, BitConverter.ToInt32(ab, offset + 6), tableID); roh.myDbs[i].ID = tmp.ID; roh.myDbs[i].children = tmp.children; } return roh; } private ROFSTLookup.rogrp LoadGroup(byte[] ab, int offset, int tableID) { ROFSTLookup.rogrp myGrp = new ROFSTLookup.rogrp(); myGrp.ID = BitConverter.ToInt32(ab, offset); myGrp.ParentID = BitConverter.ToInt32(ab, offset + 4); int numChildren = BitConverter.ToInt16(ab, offset + 8); if (numChildren > 0) { myGrp.children = new ROFSTLookup.rochild[numChildren]; int myOffset = offset + 10; for (int i = 0; i < myGrp.children.Length; i++) { ROFSTLookup.rochild tmp = new ROFSTLookup.rochild(); int childOffset = BitConverter.ToInt32(ab, myOffset); tmp.type = BitConverter.ToInt16(ab, myOffset + 4); int slen = StringLength(ab, myOffset + 6); tmp.title = Encoding.Default.GetString(ab, myOffset + 6, slen); myOffset += (7 + slen); ROFSTLookup.rogrp tmpg = LoadGroup(ab, childOffset, tableID); //MultipleReturnValuesInheritType(ref tmpg, tmp.type); tmp.ID = tmpg.ID; tmp.ParentID = tmpg.ParentID; tmp.value = tmpg.value; tmp.appid = tmpg.appid; tmp.roid = tableID.ToString("X4") + tmp.ID.ToString("X8"); tmp.children = tmpg.children; int j; for (j = i - 1; j >= 0 && tmp.ID < myGrp.children[j].ID; j--) { myGrp.children[j + 1] = myGrp.children[j]; } myGrp.children[j + 1] = tmp; } } else { int slen = StringLength(ab, offset + 12); myGrp.value = Encoding.Default.GetString(ab, offset + 12, slen); //ProcessROReturnValue(ref myGrp, Encoding.Default.GetString(ab, offset + 12, slen), tableID, dvi); int slen2 = StringLength(ab, offset + 13 + slen); myGrp.appid = Encoding.Default.GetString(ab, offset + 13 + slen, slen2); } return myGrp; } private void Load(int rofstID) { //Get Original ROLookup Bytes byte[] bytes = RofstDataGetRofstLookupBytes(rofstID); //Convert Bytes to Objects ROFSTLookup.roHdr roh = ConvertFst2Objects(bytes); //Save FstObjects to Database string userID = "System"; //Insert Rofst Header RofstHeaderInsert(rofstID, roh.hSize, roh.hMonth, roh.hDay, roh.hcYear, roh.hcMonth, roh.hcDay, roh.hcHour, roh.hcMin, roh.hcSec, roh.hcHund, userID); for (int i = 0; i < roh.myDbs.Length; i++) { ROFSTLookup.rodbi rodbi = roh.myDbs[i]; //Insert Rofst Database RofstDatabaseInsert(rofstID, rodbi.dbiID, rodbi.dbiType, rodbi.dbiAW, rodbi.dbiTitle, rodbi.dbiAP, rodbi.ID, rodbi.ParentID); if (rodbi.children != null && rodbi.children.Length > 0) { for (int j = 0; j < rodbi.children.Length; j++) { //Insert Rofst Child LoadChild(rofstID, rodbi.dbiID, rodbi.children[j]); } } } //Finalized Load for Rofst Header / Rebuild Indexes RofstHeaderFinalizeLoad(rofstID); } private void LoadChild(int rofstID, int dbiID, ROFSTLookup.rochild child) { //Insert Rofst Child RofstChildInsert(rofstID, child.ID, child.ParentID, dbiID, child.type, child.title, child.roid, child.appid, child.value); if (child.children != null && child.children.Length > 0) { for (int i = 0; i < child.children.Length; i++) { //Insert Rofst Child LoadChild(rofstID, dbiID, child.children[i]); } } } #endregion #region (Convert To Objects) private ROFSTLookup.roHdr ConvertToRoHdrObject(SafeDataReader dr, bool loadChildren) { ROFSTLookup.roHdr rh = new ROFSTLookup.roHdr(); rh.hSize = (int)dr.GetValue("hSize"); rh.hYear = (int)dr.GetValue("hYear"); rh.hMonth = (byte)dr.GetValue("hMonth"); rh.hDay = (byte)dr.GetValue("hDay"); rh.hcYear = (int)dr.GetValue("hcYear"); rh.hcMonth = (byte)dr.GetValue("hcMonth"); rh.hcDay = (byte)dr.GetValue("hcDay"); rh.hcHour = (byte)dr.GetValue("hcHour"); rh.hcMin = (byte)dr.GetValue("hcMin"); rh.hcSec = (byte)dr.GetValue("hcSec"); rh.hcHund = (byte)dr.GetValue("hcHund"); if (loadChildren) { rh.myDbs = RofstDataGetDatabases(_rofstID); } return rh; } private ROFSTLookup.rodbi ConvertToRodbiObject(SafeDataReader dr, bool loadChildren, bool loadAllChildren) { ROFSTLookup.rodbi rd = new ROFSTLookup.rodbi(); rd.dbiID = (int)dr.GetValue("dbiID"); rd.dbiType = (int)dr.GetValue("dbiType"); rd.dbiAW = (int)dr.GetValue("dbiAW"); rd.dbiAP = (string)dr.GetValue("dbiAP"); rd.dbiTitle = (string)dr.GetValue("dbiTitle"); rd.ID = (int)dr.GetValue("ID"); rd.ParentID = (int)dr.GetValue("ParentID"); if (loadChildren || loadAllChildren) { rd.children = RofstDataGetChildrenByID(_rofstID, rd.dbiID, rd.ID, false, loadAllChildren); } return rd; } private ROFSTLookup.rochild ConvertToRochildObject(SafeDataReader dr, bool loadChildren, bool loadAllChildren) { ROFSTLookup.rochild rc = new ROFSTLookup.rochild(); rc.ID = (int)dr.GetValue("ID"); rc.ParentID = (int)dr.GetValue("ParentID"); rc.type = (int)dr.GetValue("type"); rc.title = (string)dr.GetValue("title"); rc.roid = (string)dr.GetValue("roid"); if (!string.IsNullOrEmpty((string)dr.GetValue("appid"))) rc.appid = (string)dr.GetValue("appid"); if (!string.IsNullOrEmpty((string)dr.GetValue("value"))) { rc.value = (string)dr.GetValue("value"); ProcessROReturnValue(ref rc, rc.value, GetRODatabaseTitleIndex(rc.roid)); } else if (loadChildren || loadAllChildren) { rc.children = RofstDataGetChildrenByRoid(_rofstID, rc.roid, false, loadAllChildren); } return rc; } #endregion #region (RO Values) private ROFSTLookup.rochild GetRoChild12(string ROID16, bool loadChildren = false, bool loadAllChildren = false) { string ROID = (ROID16.Length < 12) ? ROID16 : ROID16.Substring(0, 12); ROFSTLookup.rochild rc = RofstDataGetChildByRoid(_rofstID, ROID, loadChildren, loadAllChildren); if (rc.ID <= 0 && ROID16.Length == 4) { rc.title = GetRODatabaseTitle(GetRODatabaseTitleIndex(ROID16)); } return rc; } private List GetROReturnValue(string roval) { _lstRoValues = new List(); _multiRoValues = new List(); _dicRoVars = new Dictionary(); string tmp = ProcessRO(_myDocVersionInfo == null ? roval : _myDocVersionInfo.ProcessDocVersionSpecificInfo(roval), false); if (!string.IsNullOrEmpty(tmp) && _lstRoValues.Count == 0) // was not a multiple return value { _lstRoValues.Add(tmp); } return _lstRoValues; } private void ProcessROReturnValue(ref ROFSTLookup.rochild child, string rawvalue, int tableID) { // This function will take the raw RO return value and resolve any macros, conditionals, // and generate the return value or a list of multiple return values. List lstValues = GetROReturnValue(rawvalue); if (lstValues.Count > 1) // Multiple Return Values { child.children = new ROFSTLookup.rochild[lstValues.Count]; for (int i = 0; i < lstValues.Count; i++) { string tsts = Convert.ToInt32(_multiRoValues[i][0]).ToString("X4"); child.children[i].value = lstValues[i].Replace("\xFF", "\xa0"); child.children[i].roid = tableID.ToString("X4") + child.ID.ToString("X8") + tsts; child.children[i].type = child.type; // Multiple return value inherit type from parent child.children[i].title = lstValues[i].Replace("\xFF", "\xa0"); child.children[i].appid = child.appid; } child.value = null; } else { child.value = lstValues[0]; } _lstRoValues.Clear(); _multiRoValues.Clear(); return; } private string ProcessRO(string roval, bool multiRtnVal) { string str = roval; string rtnstr = ""; int len = roval.Length; while (len > 0) { int ptr = NextDelimiter("{", str); if (ptr == -1) { rtnstr += str; // add remaining text len = 0; // break out of while loop } else { int cnt = ptr; if (cnt > 0) { // add text rtnstr += str.Substring(0, cnt); len -= cnt; str = str.Substring(ptr); } ptr = MatchingBrace(str) + 1; cnt = ptr; bool nfnd = false; string pbstr = ProcessBrace(str.Substring(1, cnt - 2), cnt - 2, ref nfnd, multiRtnVal); if (pbstr == null) return null; if (nfnd) rtnstr += str.Substring(0, cnt); else rtnstr += pbstr; len -= cnt; str = str.Substring(ptr); } } return ProcessMacros(rtnstr); } private string ProcessBrace(string str, int l, ref bool nfnd, bool multiRtnVal) { string rtnstr = ""; int nxt = NextDelimiter("{=", str); if (nxt == -1) // no delimiter found { if (_dicRoVars.ContainsKey(str)) rtnstr = _dicRoVars[str]; else nfnd = true; } else { if (str[nxt] == '{') { if (nxt == 0) // Multiple Return Values { ProcessMultiReturnValues(str, l); } else // Conditional { rtnstr = ProcessConditional(str, str.Substring(nxt), nxt, str.Length - nxt - 1, multiRtnVal); } } else // must be variable definition { // 'l' is the length up to the matching brace of the variable definition string tmpval = ProcessRO(str.Substring(nxt + 1, l - nxt - 1), multiRtnVal); if (string.IsNullOrEmpty(tmpval)) tmpval = " "; // nothing assigned to variable if (!_dicRoVars.ContainsKey(str.Substring(0, nxt))) { _dicRoVars.Add(str.Substring(0, nxt), tmpval); if (nxt == 1) _multiRoValues.Add(str.Substring(0, nxt)); } else { return null; } if (multiRtnVal) rtnstr = tmpval; } } return rtnstr; } private void ProcessMultiReturnValues(string str, int len) { string tstr = (!string.IsNullOrEmpty(str)) ? str.Substring(0, len) : string.Empty; while (tstr.Length > 0) { int idx = MatchingBrace(tstr); string tmpVal = ProcessRO(tstr.Substring(0, idx + 1), true); if (tmpVal != null) _lstRoValues.Add(tmpVal); // duplicates get returned as null tstr = tstr.Substring(idx + 1); } } private string ProcessConditional(string cnd, string opt, int lencnd, int lenopt, bool multiRtnVal) { // Evaluate Condition string stat = (_myDocVersionInfo != null) ? _myDocVersionInfo.Evaluate(cnd, lencnd) : string.Empty; // if evaluation not defined then return an empty string - no matches can be made, look for match - remember default if (stat.Length == 0) return string.Empty; int ls = stat.Length; string match = null; string def = null; int deflen = 0; while (lenopt > 0 && match == null) { int end = MatchingBrace(opt); int eq = opt.IndexOf('='); int len = end + 1; int li = eq - 1; int ld = len - li - 3; if (def == null || eq == 1) { def = opt.Substring(eq + 1); deflen = ld; } if (ls == li && opt.Substring(1).StartsWith(stat + "=")) { match = opt.Substring(eq + 1, ld); } opt = opt.Substring(len); // point to the next piece lenopt -= len; } // if match process option - or process default if (match == null) //(!match) { match = def.Substring(0, deflen); } return ProcessRO(match, multiRtnVal); } private string ProcessMacros(string str) { // Takes the RO text value and sees if a macro has been used. // If so it will perform the macro operation on the substring in the text value // Note** Right now the only macro is @HSP(), where every space between the "(" and ")" will be replaced with a hard space if (string.IsNullOrEmpty(str)) return str; string rtnstr = str; int indx; while ((indx = rtnstr.ToUpper().IndexOf("@HSP(")) > -1) { string resstr = rtnstr.Substring(0, indx); int endHsp = rtnstr.IndexOf(")", indx); string tmpstr = rtnstr.Substring(indx + 5, endHsp - indx - 5); // B2017-012 Don't convert space to hard spaces for XY Plots. if (!tmpstr.Contains("< 0 && idx++ < str.Length) { switch (str[idx]) { case '{': level++; break; case '}': level--; break; } } } return (level != 0) ? -1 : idx; //return -1 if didn't find matching brace otherwise length including end brace } private string FormatKey(string keyStr) { if (!string.IsNullOrEmpty(keyStr)) { keyStr = keyStr.ToUpper(); keyStr = regRoKeyHigh.Replace(keyStr, "_HIGH$3"); keyStr = regRoKeyLow.Replace(keyStr, "_LOW$3"); } return keyStr; } private string ReplaceUnicode(string s2, bool DoCaret) { string orig = s2; s2 = s2.Replace(@"\u160?", ""); // convert hard spaces bug fix: B2016-206 s2 = s2.Replace(@"\", @"\u9586?"); // convert backslashes to a backslash symbol s2 = s2.Replace("", @"\u160?"); // convert hard spaces bug fix: B2016-206 s2 = s2.Replace("`", @"\'b0"); // convert backquote to degree - left over from DOS days. s2 = s2.Replace("\xf8", @"\'b0"); // convert \xf8 to degree. s2 = s2.Replace("\xa0", @"\u160?"); // hardspace s2 = s2.Replace("\xb0", @"\'b0"); // degree s2 = s2.Replace("\x7f", @"\u916?"); // delta s2 = s2.Replace("\x2265", @"\u8805?"); // greater than or equal s2 = s2.Replace("\x2264", @"\u8804?"); // less than or equal s2 = s2.Replace("\xB1", @"\'b1"); // plus minus s2 = s2.Replace("\x3A3", @"\u931?"); // sigma s2 = s2.Replace("\x3C4", @"\u947?"); // gamma s2 = s2.Replace("\xBD", @"\'bd"); // half s2 = s2.Replace("\x25A0", @"\u9604?"); // accum 2584 s2 = s2.Replace("\x7", @"\u9679?"); // bullet 25CF s2 = s2.Replace("\x2248", @"\u8776?"); // approx eq s2 = s2.Replace("\x2261", @"\u8773?"); // similar eq 2245 s2 = s2.Replace("\xF7", @"\'f7"); // division s2 = s2.Replace("\x221A", @"\u8730?"); // square root s2 = s2.Replace("\x393", @"\u961?"); // rho 3C1 s2 = s2.Replace("\x3C0", @"\u960?"); // pi s2 = s2.Replace("\xb5", @"\u956?"); // micro 3BC (try e6, if not work try 109) s2 = s2.Replace("\x3B4", @"\u948?"); // lower case delta s2 = s2.Replace("\x3C3", @"\u963?"); // lower case sigma s2 = s2.Replace("\xBC", @"\'bc"); // quarter s2 = s2.Replace("\x3C6", @"\'d8"); // dist zero, D8 s2 = s2.Replace("\xC9", @"\u274?"); // energy, 112 s2 = s2.Replace("\xEC", @"\'ec"); // grave s2 = s2.Replace("\x2502", @"\u9474?"); // bar s2 = s2.Replace("\x3B5", @"\u949?"); // epsilon s2 = s2.Replace("\x398", @"\u952?"); // theta, 3B8 s2 = s2.Replace("\x221E", @"\u8857?"); // dot in oval, 2299 s2 = s2.Replace("\xBF", @"\u964?"); // tau, 3C4 s2 = s2.Replace("\x2310", @"\u9830?"); // diamond, 2666 s2 = s2.Replace("\x2192", @"\u8594?"); // Rightwards Arrow s2 = s2.Replace("\x2190", @"\u8592?"); // Leftwards Arrow s2 = s2.Replace("\x2191", @"\u8593?"); // Upwards Arrow s2 = s2.Replace("\x2193", @"\u8595?"); // Downwards Arrow s2 = s2.Replace("\x2207", @"\u8711?"); // Nabla s2 = s2.Replace("\x2591", @"\'b0"); // Degree Symbol s2 = s2.Replace("\xFF", @"\u8593?"); // Up Arrow s2 = s2.Replace("\xD6", @"\u8595?"); // Down Arrow if (DoCaret) s2 = s2.Replace("^", @"\u916?"); // Convert dash to a non-breaking dash. This is a unicode character. // This character will be used in veproms rather than a dash. //if the dash is preceeded byte a token remove the space following the token s2 = Regex.Replace(s2, @"(\\[^ \\?]*) \-", @"$1\u8209?"); s2 = s2.Replace("-", @"\u8209?"); return s2; } private string FixUnitROs(string val) { DocVersionInfo dvi = _myDocVersionInfo; if (dvi != null && !string.IsNullOrEmpty(val) && val.StartsWith("") val = dvi.DocVersionConfig.Unit_Text; else if (val.ToUpper() == "") val = dvi.DocVersionConfig.Unit_Number; else if (val.ToUpper() == "") val = dvi.DocVersionConfig.Unit_Name; else if (val.ToUpper() == "") val = dvi.DocVersionConfig.Unit_ID; // B2021-145: For applicability, the tree view & pdf file name are not getting resolved when using any of the ‘OTHER’ tokens // B2022-023 also check for other followed by a space else if (val.ToUpper() == "" || val.ToUpper() == "") val = dvi.DocVersionConfig.Other_Unit_Text; else if (val.ToUpper() == "" || val.ToUpper() == "") val = dvi.DocVersionConfig.Other_Unit_Number; else if (val.ToUpper() == "" || val.ToUpper() == "") val = dvi.DocVersionConfig.Other_Unit_Name; else if (val.ToUpper() == "" || val.ToUpper() == "") val = dvi.DocVersionConfig.Other_Unit_ID; } return val; } #endregion #endregion #region Public Static Methods #region (FortranFormat) public static string ConvertFortranFormatToScienctificNotation(string str) { // ([+-]?|\\u8209\?) either an optional single character Plus (+) or Minus (-) or non-breaking dash (\u8209?) // ([0-9]+) a group of at least one digits // [.] a decimal point // ([0-9]*?) a group of zero or more digits // 0*E optional zeros (spare zeros) followed // ([+-]?|\\u8209\?) either an optional single character Plus (+) or Minus (-) or non-breaking dash (\u8209?) // ([0-9]+) a group of at least one digits return Regex.Replace(str, @"([+-]?|\\u8209\?)([0-9]+)[.]([0-9]*?)0*E([+-]?|\\u8209\?)([0-9]+)", new MatchEvaluator(FixFortranNumber)); } public static string FixFortranNumber(Match match) { StringBuilder sb = new StringBuilder(match.Groups[1].Value.Replace("-", @"\u8209?")); if (match.Groups[3].Length == 0) // Nothing to the right of the decimal { if (match.Groups[2].Value != "1") // Other than "1", multiply it times 10 raised to a power { sb.Append(match.Groups[2].Value + "x10"); } else // The number is simply 1 so it can be ignored and 10 can be raised to a power { sb.Append("10"); } } else // A number with a decimal point { sb.Append(match.Groups[2].Value + "." + match.Groups[3].Value + "x10"); } // Add the exponent as superscript return sb.ToString() + "\\up2 " + match.Groups[4].Value.Replace("-", @"\u8209?") + match.Groups[5].Value + "\\up0 "; } #endregion #endregion } }