// ======================================================================== // Copyright 2006 - Volian Enterprises, Inc. All rights reserved. // Volian Enterprises - Proprietary Information - DO NOT COPY OR DISTRIBUTE // ------------------------------------------------------------------------ // $Workfile: $ $Revision: $ // $Author: $ $Date: $ // // $History: $ // ======================================================================== using System; using System.Collections.Generic; using System.Collections.Specialized; using System.Text; using System.IO; using System.Xml.Serialization; using System.Xml; using System.Xml.XPath; using System.Text.RegularExpressions; //using Config; namespace VEPROMS.CSLA.Library { public partial class ROFst { [NonSerialized] private ROFSTLookup _ROFSTLookup; public ROFSTLookup ROFSTLookup { get { if (_ROFSTLookup == null) { _ROFSTLookup = new ROFSTLookup(this); } return _ROFSTLookup; } } } public partial class ROFstInfo { #region Log4Net private static readonly log4net.ILog log = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType); #endregion #region PropertiesAndData private DocVersion _docVer; public DocVersion docVer { get { if (_docVer == null) { if (ROFstAssociations.Count == 0) return null; _docVer = DocVersion.Get(this.ROFstAssociations[0].MyDocVersion.VersionID); } return _docVer; } set { _docVer = value; } } [NonSerialized] private ROFSTLookup _ROFSTLookup; public ROFSTLookup ROFSTLookup { get { if (_ROFSTLookup == null) { _ROFSTLookup = new ROFSTLookup(this); } return _ROFSTLookup; } } #endregion #region AppSupport //public static ROImageInfo Get(RODbInfo rodbinfo, string filename) //{ // if (rodbinfo.RODbROImageCount != 0) // { // foreach (ROImageInfo ri in rodbinfo.RODbROImages) // { // if (ri.FileName == filename) return ri; // } // } // return null; //} public string GetDefaultROPrefix() { if (docVer != null) return docVer.DocVersionConfig.RODefaults_setpointprefix; else return "SP1"; // Not Sure about this... } public string GetDefaultGraphicsPrefix() { if (docVer != null) return docVer.DocVersionConfig.RODefaults_graphicsprefix; else return "IG1"; // Not Sure about this... } #region Add New Ro Fst /// /// Adds an ro.fst into a sql database. /// /// /// ROFst: Returns the created rofst object public static ROFst AddRoFst(RODbInfo rdi, DocVersion docver) { string rofstfilepath = rdi.FolderPath + @"\ro.fst"; DirectoryInfo di = new DirectoryInfo(rdi.FolderPath); // check if this rofst has been loaded, i.e. dts on file versus dts in db... // if so, just make association with docversion. ROFst rofst = ROFst.GetByRODbID_DTS(rdi.RODbID, di.LastWriteTime); if (rofst != null) { docver.DocVersionAssociations.Add(rofst); docver.Save(); return rofst; } // Next read in the rofst & make the rofst record. FileStream fsIn = new FileStream(rofstfilepath, FileMode.Open, FileAccess.Read, FileShare.Read); // Create an instance of StreamReader that can read characters from the FileStream. BinaryReader r = new BinaryReader(fsIn); byte[] ab = r.ReadBytes((int)fsIn.Length); fsIn.Close(); using (RODb rd = RODb.Get(rdi.RODbID)) { rofst = ROFst.MakeROFst(rd, ab, null, di.LastWriteTime, rdi.UserID); // Hook this into the current docversion by replacing the rofstid field in the doc version // association object: docver.DocVersionAssociations.Add(rofst); docver.Save(); // Now load any images in... type 8 - integrated graphics ro type for (int i = 0; i < rofst.ROFSTLookup.myHdr.myDbs.Length; i++) { // walk through the rofst 'database' searching for all nodes that are integrated graphics, type 8: if (rofst.ROFSTLookup.myHdr.myDbs[i].children != null) { using (ROFstInfo rfi = ROFstInfo.Get(rofst.ROFstID)) { rfi.MigrateRoFstGraphics(rdi, rofst.ROFSTLookup.myHdr.myDbs[i].children); } } } return rofst; } } #endregion #region Update Ro Values /// /// Updates an ro.fst into a sql database. /// /// /// ROFst: Returns the created rofst object public static ROFst UpdateRoFst(RODbInfo rdi, DocVersionAssociation dva, DocVersion docver, ROFstInfo origROFst) { // file validity checks are done before getting here - just do the import // here. string rofstfilepath = rdi.FolderPath + @"\ro.fst"; DirectoryInfo di = new DirectoryInfo(rdi.FolderPath); // There may be more than 1 'ro' as the 'ROName' field (ROName is derived from the ropath). // Get new name be incrementing, if so. string newname = NewROName(di.Name); // Next read in the rofst & make the rofst record. FileStream fsIn = new FileStream(rofstfilepath, FileMode.Open, FileAccess.Read, FileShare.Read); // Create an instance of StreamReader that can read characters from the FileStream. BinaryReader r = new BinaryReader(fsIn); byte[] ab = r.ReadBytes((int)fsIn.Length); fsIn.Close(); using (RODb rd = RODb.Get(rdi.RODbID)) { ROFst rofst = ROFst.MakeROFst(rd, ab, null, di.LastWriteTime, rdi.UserID); // Hook this into the current docversion by replacing the rofstid field in the doc version // association object: dva.MyROFst = rofst; docver.Save(); // Now load any images in... type 8 - integrated graphics ro type for (int i = 0; i < rofst.ROFSTLookup.myHdr.myDbs.Length; i++) { // walk through the rofst 'database' searching for all nodes that are integrated graphics, type 8: if (rofst.ROFSTLookup.myHdr.myDbs[i].children != null) { using (ROFstInfo rfi = ROFstInfo.Get(rofst.ROFstID)) { rfi.MigrateRoFstGraphics(rdi, rofst.ROFSTLookup.myHdr.myDbs[i].children); } } } // Now update the usages: compare old to new rofsts and update usages accordingly, i.e. modified // values, deleted ros, etc. UpdateROValuesText(origROFst, rofst); return rofst; } } private static void UpdateROValuesText(ROFstInfo origROFstInfo, ROFst newROFst) { ROFSTLookup origLU = new ROFSTLookup(origROFstInfo); ROFSTLookup newLU = new ROFSTLookup(newROFst); List delList = new List(); List chgList = newLU.GetValueDifferences(origLU, ref delList); foreach (string chg in chgList) { string newvalue = newLU.GetRoValue(chg); string desc = string.Format("Change in RO Values: Old value = {0}, New value = {1}", origLU.GetRoValue(chg), newvalue); // roid's are stored in database as 16 characters long in the rousages table. They may be stored // as 12 characters in the ro.fst. string padroid = chg.Length <= 12 ? chg + "0000" : chg; using (RoUsageInfoList affected = RoUsageInfoList.GetAffected(origROFstInfo.MyRODb.RODbID, padroid, desc, "Changed")) { foreach (RoUsageInfo roUsg in affected) { using (Content content = Content.Get(roUsg.MyContent.ContentID)) { content.FixContentText(roUsg, newvalue); if (content.IsDirty) content.Save(); } } } using (DROUsageInfoList affected = DROUsageInfoList.GetAffected(origROFstInfo.MyRODb.RODbID, padroid, desc, "Changed")) { foreach (DROUsageInfo droUsg in affected) { using (Document document = Document.Get(droUsg.DocID)) { if (document.DocPdf != null) { document.DocPdf = null; document.Save(); } } } } } foreach (string del in delList) { Console.WriteLine("Deleted ROID = {0}", del); string desc = string.Format("Deleted RO: Value = {0}", origLU.GetRoValue(del)); string padroiddel = del.Length <= 12 ? del + "0000" : del; using (RoUsageInfoList affected = RoUsageInfoList.GetAffected(origROFstInfo.MyRODb.RODbID, padroiddel, desc, "Deleted")) ; using (DROUsageInfoList Daffected = DROUsageInfoList.GetAffected(origROFstInfo.MyRODb.RODbID, padroiddel, desc, "Deleted")) ; } } private static string NewROName(string roName) { string retval = roName; int iSuffix = -1; RODbInfoList rodblist = RODbInfoList.Get(); foreach (RODbInfo rdi in rodblist) { if (rdi.ROName.StartsWith(roName)) { if (rdi.ROName == roName) iSuffix = 0; else if (Regex.IsMatch(rdi.ROName, roName + "[_][0-9]+")) { int ii = int.Parse(rdi.ROName.Substring(1 + roName.Length)); if (ii > iSuffix) iSuffix = ii; } } } if (iSuffix >= 0) retval = string.Format("{0}_{1}", roName, iSuffix + 1); return retval; } private void MigrateRoFstGraphics(RODbInfo rdi, ROFSTLookup.rochild[] rochild) { for (int i = 0; i < rochild.Length; i++) { if (rochild[i].type == 8) this.AddGraphic(rdi, rochild[i].value); if (rochild[i].children != null) this.MigrateRoFstGraphics(rdi, rochild[i].children); } } private void AddGraphic(RODbInfo rdi, string p) { if (p == null) return; string imgname = p.Substring(0, p.IndexOf('\n')); int thedot = imgname.LastIndexOf('.'); string fname = imgname; if (thedot == -1 || (thedot != (imgname.Length - 4))) { RODbConfig roDbCfg = new RODbConfig(rdi.Config); fname += string.Format(".{0}", roDbCfg.GetDefaultGraphicExtension()); } string imgfile = rdi.FolderPath + @"\" + fname; ROImage roImg = null; if (File.Exists(imgfile)) { FileInfo fi = new FileInfo(imgfile); // if the roimage record exists, don't create a new one... using (roImg = ROImage.GetByRODbID_FileName_DTS(rdi.RODbID, imgname,fi.LastWriteTime)) { if (roImg == null) { FileStream fsIn = new FileStream(imgfile, FileMode.Open, FileAccess.Read, FileShare.Read); BinaryReader r = new BinaryReader(fsIn); byte[] ab = r.ReadBytes((int)fsIn.Length); r.Close(); fsIn.Close(); using (RODb rodb = RODb.Get(rdi.RODbID)) { roImg = ROImage.MakeROImage(rodb, imgname, ab, null, fi.LastWriteTime, "Migration"); } } Figure figure = Figure.GetByROFstID_ImageID(this.ROFstID, roImg.ImageID); if (figure != null) return; using (ROFst rofst = ROFst.Get(this.ROFstID)) { figure = Figure.MakeFigure(rofst, roImg, null); } } } else Console.WriteLine(string.Format("{0}", imgfile), "Cannot Find Image File"); } #endregion #endregion public bool IsSetpointDB(int id) { ROFSTLookup.rodbi[] dbs = ROFSTLookup.GetRODatabaseList(); foreach (ROFSTLookup.rodbi rodbi in dbs) { if (id == rodbi.dbiID) return (rodbi.dbiAP.StartsWith("SP")); } return false; } } }