437 lines
		
	
	
		
			14 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
			
		
		
	
	
			437 lines
		
	
	
		
			14 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
/*********************************************************************************************
 | 
						|
 * 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>
 | 
						|
	/// Summary description for ROFST. Provides support/interface to/from RO.fst file.
 | 
						|
	/// </summary>
 | 
						|
	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;i<numDatabases;i++)
 | 
						|
			{
 | 
						|
				// Go through the list entries recursively finding any graphics images to copy
 | 
						|
				// to approved.
 | 
						|
				uint start = ((ROFST_DbInfo)DatabasesInfo[i]).dbiGL;
 | 
						|
				ushort level = ((ROFST_DbInfo)DatabasesInfo[i]).dbiID;
 | 
						|
				ProcessGroupsForImages(appdir,null,0,null,brROFst,start,0,level, StatMsgWindow);
 | 
						|
			}
 | 
						|
		}
 | 
						|
 | 
						|
		private bool wasused (ushort tblid, uint id)
 | 
						|
		{
 | 
						|
			string pth = DirPath.Substring(0,DirPath.Length-6);
 | 
						|
			vdb_ROUsage ROusage = new vdb_ROUsage(pth + "usagero.dbf"); // need path
 | 
						|
			string roid = tblid.ToString("X4") + id.ToString("X8");
 | 
						|
			string WhereStr = "WHERE ROID LIKE '" + roid.ToLower() + "%'";
 | 
						|
			DataSet RODataSet = ROusage.GetSortedByROID(WhereStr);
 | 
						|
			DataTable roTbl = RODataSet.Tables[0];
 | 
						|
			if (roTbl.Rows.Count>0) 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; i<howmany; i++) 
 | 
						|
					{
 | 
						|
						offset[i]=br.ReadUInt32();
 | 
						|
						type[i]=br.ReadUInt16();
 | 
						|
						title[i] = ROFST.GetAsciiString(br);
 | 
						|
					}
 | 
						|
					for (int i=0; i<howmany; i++)
 | 
						|
					{
 | 
						|
						if ((type[i]&8)>0)
 | 
						|
							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;
 | 
						|
			}
 | 
						|
		}
 | 
						|
	}
 | 
						|
 | 
						|
}
 |