/********************************************************************************************* * Copyright 2004 - Volian Enterprises, Inc. All rights reserved. * Volian Enterprises - Proprietary Information - DO NOT COPY OR DISTRIBUTE * ------------------------------------------------------------------------------ * $Workfile: RO.cs $ $Revision: 6 $ * $Author: Kathy $ $Date: 5/02/06 9:46a $ * * $History: RO.cs $ * * ***************** Version 6 ***************** * User: Kathy Date: 5/02/06 Time: 9:46a * Updated in $/LibSource/VEObject * B2006-018: ro usages for procnums with single quote * * ***************** Version 5 ***************** * User: Jsj Date: 6/02/05 Time: 11:36a * Updated in $/LibSource/VEObject * fix for approving with conditional ROs and code cleanup * * ***************** Version 4 ***************** * User: Kathy Date: 5/19/05 Time: 11:08a * Updated in $/LibSource/VEObject * speed up approve * * ***************** Version 3 ***************** * User: Jsj Date: 5/17/05 Time: 12:00p * Updated in $/LibSource/VEObject * Approve graphic fix * * ***************** Version 2 ***************** * User: Jsj Date: 3/10/05 Time: 4:02p * Updated in $/LibSource/VEObject * hooks to new namespace for RO FST file * * ***************** Version 1 ***************** * User: Kathy Date: 3/08/05 Time: 1:51p * Created in $/LibSource/VEObject * Approval *********************************************************************************************/ using System; using System.IO; using System.Data; using System.Windows.Forms; using System.Collections; using Utils; using ROFST_FILE; using VDB_ROUsage; using VlnStatus; namespace VEObject { /// /// Summary description for ROFST. Provides support/interface to/from RO.fst file. /// public class ROFST : ROFST_File { // constructor loads ro.fst databases public ROFST(string path):base(path) { } ~ ROFST() { } public void CopyImagesToApproved(string appdir, VlnStatusMessage StatMsgWindow) { for(int i=0;i0) return true; return false; } private void CopyROFile(string fname, string ApprovedDir) { PrivateProfile ropathINI = new PrivateProfile("PROC.INI"); string ropath = ropathINI.Attr("RO Defaults","ROPATH"); if (ropath == null || ropath == "") ropath = "..\\RO"; string src = ropath + "\\" + fname; string dst = ApprovedDir + "\\" + fname; if (File.Exists(src)) { File.Copy(src,dst,true); FileInfo fi_src = new FileInfo(src); FileInfo fi_dst = new FileInfo(dst); fi_dst.LastWriteTime = fi_src.LastWriteTime; } else MessageBox.Show("Could not copy " + src); } private long CalculatePromsDate(DateTime imgdate) { /* * do some conversion so that comparison can be made on date/time * stored on image data from ro.fst to a datetime from .net. * Proms had it in seconds since 00:00:00 1/1/1970. * .NET has it in ticks since 00:00:00 1/1/1 */ DateTime promsdt = new DateTime(1970,1,1,0,0,0); // Jan 1, 1970 // Convert the promsdt to UTC (GMT) DateTime promsdtU = promsdt.ToUniversalTime(); long promsdtU_num = promsdtU.Ticks / 10000000; // Convert the image file datetime to UTC DateTime imgdateU = imgdate.ToUniversalTime(); long imgdateu_num = imgdateU.Ticks / 10000000; /** * Get the time adjustment for the current Time Zone with respect * to the coordinated universal time (UTC) - a.k.a. Greenwich mean time (GMT). * The time gotten for the Jan 1, 1970 is in UTC time, the imgdate time is * in EST. * * Get the offset time between this time zone and UTC (GMT) time. * Convert the offset to seconds. * Subtract the offset from the UTC time gotten for Jan 1, 1970 */ ThisTimeZone TZ = new ThisTimeZone(); TimeSpan TimeZoneSpan = TZ.GetUtcOffset(promsdt); // Time Zone offset from UTC long TimeZoneAdj = Math.Abs(TimeZoneSpan.Ticks / 10000000); // convert to seconds /* * The file date/time and the Jan 1, 1970 adjustment date are in UTC. * Subtract the "Jan 1, 1970" date/time from the file date/time * the add the Time Zone offset to place the date/time value into * local time. */ long lsec = (imgdateu_num - promsdtU_num) + TimeZoneAdj; return lsec; } public void ApproveGraphicsFile(string fstRec, string appdir, VlnStatusMessage StatMsgWindow) { long dt; // position to Graphics file name int nlindx = fstRec.IndexOf("\n"); // Graphics file name string fbuf = fstRec.Substring(0,nlindx); // Grpahics file date/time (stored in RO.FST) dt = System.Convert.ToInt32(fstRec.Substring(nlindx+1,8),16); // Add the graphics file extension if needed int indx = fbuf.IndexOf("."); if (indx<0 || (fbuf.Length>indx+1 && fbuf[indx+1]=='\\')) { if (DefaultGraphicFileExt[0] != '.') fbuf = fbuf + "."; fbuf = fbuf + DefaultGraphicFileExt; } // if file doesn't exist in approved // or if it is more recent than approved, // copy it to approved. string appfbuf = appdir + "\\" + fbuf; FileInfo app_fi = new FileInfo(fbuf); if (!File.Exists(appfbuf) || (CalculatePromsDate(app_fi.LastWriteTime)!=dt)) { if (StatMsgWindow !=null) StatMsgWindow.StatusMessage = "Updating graphic " + fbuf; CopyROFile(fbuf,appdir); } } private void ProcessGroupsForImages(string appdir, string tmp,uint x1,string ttl,BinaryReader br, uint start, short level, ushort tblid, VlnStatusMessage StatMsgWindow) { uint id, parid; short howmany; long wasAt = br.BaseStream.Position; br.BaseStream.Seek((long) start, SeekOrigin.Begin); id = br.ReadUInt32(); parid = br.ReadUInt32(); howmany = br.ReadInt16(); if (howmany <= 0 && (ttl!=null && ttl!="") && wasused(tblid,id)) { byte bt = br.ReadByte(); // skip type bt = br.ReadByte(); // Read the Graphics File ROFST record string dtl = ROFST.GetAsciiString(br); // Approve the Graphics file ApproveGraphicsFile(dtl, appdir, StatMsgWindow); } // if count in howmany is greater than zero, this must be a group // recursively call this to find ros. if (howmany>0) { if (level>=0) { string [] title = new string [howmany]; UInt32 [] offset = new UInt32 [howmany]; UInt16 [] type = new UInt16 [howmany]; for (int i=0; i0) ProcessGroupsForImages(appdir,null,type[i],title[i],br,offset[i],System.Convert.ToInt16(level+1),tblid,StatMsgWindow); } } } br.BaseStream.Seek(wasAt,SeekOrigin.Begin); } } public class Usages { static Usages() { } public static int CheckRoReferences(VEO_ProcSet ps, string path, ArrayList al, ArrayList ModROs, string keystr) { // get usage records for the input string 'keystr' and then check to // see if the RO is in the input Modified list. // If keystr is a lib-doc (i.e. starts with "DOC") then just return the // whether there is modified ro in here. // If keystr is a procedure num, check to see if other procedures use this // modified RO and add them to the list of items to approve (al). // -1 flags failure on return. Otherwise, return count of those found. int retval=0; vdb_ROUsage rousg=null; DataSet dataset=null; string us_path = path + "\\usagero.dbf"; try { rousg = new vdb_ROUsage(us_path); dataset = rousg.GetSortedByProc("[NUMBER] = \'"+keystr.Replace("'","''")+"\'"); } catch (Exception e) { MessageBox.Show("Could not get RO usages for this item " + keystr + ", " + e.Message); return -1; } foreach (DataRow dr in dataset.Tables[0].Rows) { // if we find an RO that's in the ModROs list, then here's where // we see if it's used by other procedures too. string roid = dr["ROID"].ToString(); if (roid.Length == 12) roid = roid + "0000"; else if (!roid.EndsWith("0000")) roid = roid.Substring(0,12) + "0000"; ModRO wasModRO = null; foreach (ModRO mro in ModROs) { string tmpROID = mro.roid; if (tmpROID.Length == 12) tmpROID = tmpROID + "0000"; if (tmpROID.Equals(roid)) { mro.roid = tmpROID; wasModRO = mro; mro.IsUsed = true; break; } } // if just checking if the library document has any modified ROs, then // just return (return with a number greater than 0 to flag that it had // modified ROs. Doc is only passed in as the keystr when checking for // modified library documents. if (keystr.Substring(0,3).ToUpper()=="DOC") { if (wasModRO != null) return 1; return 0; } // if this was a procedure, then we'll see if other procedures use this. if (wasModRO != null) { us_path = path + "\\approved\\usagero.dbf"; rousg = null; rousg = new vdb_ROUsage(us_path); DataSet dataset_prc = null; string keyroid = roid.Substring(0,12)+"%"; try { dataset_prc = rousg.GetSortedByROID("[ROID] LIKE \'"+keyroid+"\'"); //dataset_prc = rousg.GetSortedByROID("[ROID] = \'"+roid+"\'"); } catch (Exception e) { MessageBox.Show("Could not get procedures using modified RO " + roid + ", " + e.Message); return -1; } foreach (DataRow drroid in dataset_prc.Tables[0].Rows) { // first see if this prpc is already in list of procedures to approve // if so, don't add it, but check to be sure this ro is in the conflict // list. bool inlist = false; AppIndItem cur=null; foreach (object obal in al) { AppIndItem aiiobj = (AppIndItem) obal; if (aiiobj.Proc._Prcnum == (string)drroid["NUMBER"]) { cur=aiiobj; inlist=true; break; } } if (!inlist) { VEO_DummySet ds = (VEO_DummySet) ps.Children[1]; // find the procedure object to add it the the approve list foreach (object ob in ds.Children) { VEO_Proc pr = (VEO_Proc) ob; if (pr._Prcnum == (string) drroid["NUMBER"]) { cur = new AppIndItem(pr); al.Add(cur); retval++; break; } } if (cur==null) { retval++; cur = new AppIndItem(null); } } // is this ROID already in the conflict list. inlist = false; foreach (AppConflict aco in cur.ConflictList) { if (aco.CType == AppConflictTypes.RO) { AppROConflict raco = (AppROConflict) aco; if (raco.ROID == roid) { inlist=true; break; } } } if (!inlist) { string val1 = (drroid["NUMBER"]==System.DBNull.Value)?null:(string)drroid["NUMBER"]; string val2 = (drroid["SEQUENCE"]==System.DBNull.Value)?null:(string)drroid["SEQUENCE"]; AppROConflict roc = new AppROConflict((VEO_DummySet)ps.Children[1],roid, val1, val2,wasModRO.IsImage,wasModRO.Val1,wasModRO.Val2); cur.AddConflict(roc); } } } } return retval; } // For approve individual, update the approved version with the ro usages for the // procedure or library defined by input 'WdNum'. 'ApNum' is the procedure number if // this is a procedure - if libdoc this will be same as 'WdNum', in case of change // in procedure number. public static void FixROUsages(string WdPath, string ApprovedPath, string ApNum, string WdNum) { string appath=ApprovedPath+"\\usagero.dbf"; try { vdb_ROUsage arousg = new vdb_ROUsage(appath); // remove ro usages from the approved ro usage file. ApNum will be null // if this is a new procedure - in this case we don't need to remove anything // from the approved usages file. if (ApNum != null) { DataSet adset = arousg.GetSortedByProc("[NUMBER]=\'"+ApNum.Replace("'","''")+"\'"); int ndr = adset.Tables[0].Rows.Count; if (ndr>0) { int errs = arousg.DeleteSelected("[NUMBER]=\'"+ApNum.Replace("'","''")+"\'"); if (errs>0) { MessageBox.Show("Error resolving transition records"); return; } arousg.Pack(); } adset=null; } // now update the approved ro usages from data based on data in the working // draft. vdb_ROUsage rousg = new vdb_ROUsage(WdPath+"\\usagero.dbf"); DataSet wdset = rousg.GetSortedByProc("[NUMBER] = \'"+WdNum.Replace("'","''")+"\'"); if (wdset.Tables[0].Rows.Count>0) { int errs = rousg.InsertInto(WdPath+"\\"+ApprovedPath+"\\usagero.dbf","[NUMBER] = \'"+WdNum.Replace("'","''")+"\'"); if (errs>0) { MessageBox.Show("Error resolving RO usage records."); return; } } wdset.Dispose(); rousg=null; arousg=null; } catch (Exception e) { MessageBox.Show("Could not approve ro usages for " + WdNum + ", "+e.Message); return; } } } }