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;
 | |
| 			}
 | |
| 		}
 | |
| 	}
 | |
| 
 | |
| }
 |