811 lines
		
	
	
		
			22 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
			
		
		
	
	
			811 lines
		
	
	
		
			22 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
| /*********************************************************************************************
 | |
|  * Copyright 2004 - Volian Enterprises, Inc. All rights reserved.
 | |
|  * Volian Enterprises - Proprietary Information - DO NOT COPY OR DISTRIBUTE
 | |
|  * ------------------------------------------------------------------------------
 | |
|  * $Workfile: VEObject.cs $     $Revision: 9 $
 | |
|  * $Author: Jsj $   $Date: 8/30/06 10:04a $
 | |
|  *
 | |
|  * $History: VEObject.cs $
 | |
|  * 
 | |
|  * *****************  Version 9  *****************
 | |
|  * User: Jsj          Date: 8/30/06    Time: 10:04a
 | |
|  * Updated in $/LibSource/VEObject
 | |
|  * Added Multi Procedure Data Checker
 | |
|  * 
 | |
|  * *****************  Version 8  *****************
 | |
|  * User: Kathy        Date: 6/21/05    Time: 7:27a
 | |
|  * Updated in $/LibSource/VEObject
 | |
|  * edit for approve if from procset/procedures node
 | |
|  * 
 | |
|  * *****************  Version 7  *****************
 | |
|  * User: Kathy        Date: 5/11/05    Time: 9:29a
 | |
|  * Updated in $/LibSource/VEObject
 | |
|  * approve menu from procedures tree node
 | |
|  * 
 | |
|  * *****************  Version 6  *****************
 | |
|  * User: Kathy        Date: 4/21/05    Time: 10:24a
 | |
|  * Updated in $/LibSource/VEObject
 | |
|  * remove upgrade2005 define
 | |
|  * 
 | |
|  * *****************  Version 5  *****************
 | |
|  * User: Kathy        Date: 3/22/05    Time: 10:14a
 | |
|  * Updated in $/LibSource/VEObject
 | |
|  * approve: remove revise menu enable
 | |
|  * 
 | |
|  * *****************  Version 4  *****************
 | |
|  * User: Kathy        Date: 2/03/05    Time: 11:20a
 | |
|  * Updated in $/LibSource/VEObject
 | |
|  * Change 'DUMMY' node to 'TEMP' node (just in case user sees it)
 | |
|  * 
 | |
|  * *****************  Version 3  *****************
 | |
|  * User: Kathy        Date: 1/31/05    Time: 11:06a
 | |
|  * Updated in $/LibSource/VEObject
 | |
|  * Fix B2005-005 (connection & delete directory errors). also, fix icon
 | |
|  * 
 | |
|  * *****************  Version 2  *****************
 | |
|  * User: Kathy        Date: 10/25/04   Time: 10:24a
 | |
|  * Updated in $/LibSource/VEObject
 | |
|  * Fix B2004-049
 | |
|  * 
 | |
|  * *****************  Version 1  *****************
 | |
|  * User: Kathy        Date: 7/27/04    Time: 8:53a
 | |
|  * Created in $/LibSource/VEObject
 | |
|  *********************************************************************************************/
 | |
| 
 | |
| using System;
 | |
| using System.Text;
 | |
| using System.Collections;
 | |
| using System.Windows.Forms;
 | |
| using System.Runtime.InteropServices;
 | |
| using Utils;
 | |
| using VENetwork;
 | |
| using VEMessageNS;
 | |
| 
 | |
| namespace VEObject
 | |
| {
 | |
| 	/// <summary>
 | |
| 	/// VEObject namespace provides classes for the Volian Enterprises Objects DataRoot, DataPath,
 | |
| 	/// Plant, Procedure Set, Procedures, Library Documents and Archives.
 | |
| 	/// 
 | |
| 	/// This file has the base class, VEO_Base, which all other objects inherits from.
 | |
| 	/// </summary>
 | |
| 
 | |
| 	public enum VEObjectTypesDefs
 | |
| 	{
 | |
| 		Generic = 0, ProcedureSet = 1, Procedure = 2, Archive = 3, LibraryDoc =4, System = 5, Plant = 6, DummySet = 7
 | |
| 	};
 | |
| 
 | |
| 	public enum VEO_IconStates
 | |
| 	{
 | |
| 		Normal=0, LckByMe=1, LckByOther=2, LckPending=3, Empty=4
 | |
| 	};
 | |
| 	public enum ProcTypeOptions
 | |
| 	{
 | |
| //		Standard=0, Background=1, Deviation=2, Slave=3
 | |
| 		Standard=0, Slave=1, Background=2, Deviation=3
 | |
| 	};
 | |
| 	public class VEO_Base
 | |
| 	{
 | |
| 		public int [] iconStates;
 | |
| 		public int icon;
 | |
| 		public string _Title;
 | |
| 		public string _Location;
 | |
| 		public ArrayList Children;
 | |
| 		public Object parentObj;
 | |
| 		public UserRunTime usrRunTime;
 | |
| 		public bool isOpen;
 | |
| 		private bool Expanded;
 | |
| 		public bool IsEmpty;
 | |
| 		public int VEObjectType;
 | |
| 		public bool isNew;
 | |
| 		public bool AllowListViewSort;
 | |
| 		public VELock Lock;
 | |
| 		public VEConnection Connection;
 | |
| 		public TreeNode treeNode;
 | |
| 
 | |
| 		public enum ProcColumnOptions
 | |
| 		{
 | |
| 			OneColumn=0, TwoColumn=1, ThreeColumn=2
 | |
| 		};
 | |
| 		public enum ArchiveTypeOptions
 | |
| 		{
 | |
| 			Full=0, Partial=1
 | |
| 		};
 | |
| 
 | |
| 		// constructor
 | |
| 		public VEO_Base()
 | |
| 		{
 | |
| 			Expanded = false;
 | |
| 			isOpen = false;
 | |
| 			AllowListViewSort = false;
 | |
| 			Children = new ArrayList();
 | |
| 			VEObjectType = (int)VEObjectTypesDefs.Generic;
 | |
| 		}
 | |
| 
 | |
| 		~ VEO_Base()
 | |
| 		{
 | |
| 			if (Connection!=null) Connection.Exit();
 | |
| 		}
 | |
| 
 | |
| 		public virtual void LoadLockInfo()
 | |
| 		{
 | |
| 			Lock = new VELock(_Location, usrRunTime==null?null:usrRunTime.myUserData, VENetwork.LockTypes.None);
 | |
| 		}
 | |
| 
 | |
| 		public virtual bool mnuAllowDelete()
 | |
| 		{
 | |
| 			return true;
 | |
| 		}
 | |
| 
 | |
| 		public virtual bool mnuAllowApprove()
 | |
| 		{
 | |
| 			return false;
 | |
| 		}
 | |
| 
 | |
| 		public virtual bool mnuAllowApproveSel()
 | |
| 		{
 | |
| 			return false;
 | |
| 		}
 | |
| 		
 | |
| 		public virtual bool mnuAllowApproveAll()
 | |
| 		{
 | |
| 			return false;
 | |
| 		}
 | |
| 
 | |
| 		public virtual bool mnuAllowProperties()
 | |
| 		{
 | |
| 			return true;
 | |
| 		}
 | |
| 
 | |
| 		public virtual bool mnuAllowNew()
 | |
| 		{
 | |
| 			return true;
 | |
| 		}
 | |
| 
 | |
| 		public virtual bool mnuAllowUpdRO()
 | |
| 		{
 | |
| 			return false;
 | |
| 		}
 | |
| 		
 | |
| 		public virtual bool mnuAllowClean()
 | |
| 		{
 | |
| 			return false;
 | |
| 		}
 | |
| 
 | |
| 		public virtual bool mnuAllowDataCheck()
 | |
| 		{
 | |
| 			return false;
 | |
| 		}
 | |
| 
 | |
| 		public virtual bool mnuAllowChgDef()
 | |
| 		{
 | |
| 			return false;
 | |
| 		}
 | |
| 
 | |
| 		public virtual bool mnuAllowUpdateArch()
 | |
| 		{
 | |
| 			return false;
 | |
| 		}
 | |
| 
 | |
| 		public virtual bool mnuAllowTestArchive()
 | |
| 		{
 | |
| 			return false;
 | |
| 		}
 | |
| 
 | |
| 		public virtual bool mnuAllowExtractArch()
 | |
| 		{
 | |
| 			return false;
 | |
| 		}
 | |
| 		public virtual bool mnuAllowLckDB()
 | |
| 		{
 | |
| 			return false;
 | |
| 		}
 | |
| 		public virtual bool mnuAllowUnlckDB()
 | |
| 		{
 | |
| 			return false;
 | |
| 		}
 | |
| 		public virtual bool mnuAllowMonUsr()
 | |
| 		{
 | |
| 			if (usrRunTime.InMultiUserMode && !(Lock.LockType==VENetwork.LockTypes.None) && 
 | |
| 				!(Lock.LockStatus==VENetwork.Status.LockedByOther)) return true;
 | |
| 			return false;
 | |
| 		}
 | |
| 		public virtual bool canEdit()
 | |
| 		{
 | |
| 			return true;
 | |
| 		}
 | |
| 		// used to flag whether all siblings of a node should be collapsed before expanding the
 | |
| 		// node. This is needed for multi-user support for the plant & procedure set levels so
 | |
| 		// that a user does not have open connections all over the tree.
 | |
| 		public virtual bool CollapseSibling()
 | |
| 		{
 | |
| 			return false;
 | |
| 		}
 | |
| 		public virtual bool amILockedByMe()
 | |
| 		{
 | |
| 			// if not a newtork serial number, treat it as anything is locked.
 | |
| 			if (!usrRunTime.InMultiUserMode)return true;
 | |
| 			VEO_Base obj = this;
 | |
| 			while (obj!=null)
 | |
| 			{
 | |
| 				if (obj.Lock.LockStatus == VENetwork.Status.Locked) return true;
 | |
| 				obj = (VEO_Base) obj.parentObj;
 | |
| 			}
 | |
| 			return false;
 | |
| 		}
 | |
| 		public virtual bool isProcSet()
 | |
| 		{
 | |
| 			return false;
 | |
| 		}
 | |
| 
 | |
| 		public virtual bool isArchiveSet()
 | |
| 		{
 | |
| 			return false;
 | |
| 		}
 | |
| 
 | |
| 		public virtual bool updateROValues()
 | |
| 		{
 | |
| 			return false;
 | |
| 		}
 | |
| 
 | |
| 		public virtual void CleanTransitionsAndROsUsages(int clntype,string ProcName) 
 | |
| 		{
 | |
| 			return;
 | |
| 		}
 | |
| 
 | |
| 		public virtual void ApproveProcedures(int ApproveType, ArrayList prcs)
 | |
| 		{
 | |
| 			return;
 | |
| 		}
 | |
| 
 | |
| 		public virtual void DataIntegrityCheck(string ProcName) 
 | |
| 		{
 | |
| 			return;
 | |
| 		}
 | |
| 
 | |
| 		// Add TreeNodes to the input TreeNode parent. 
 | |
| 		public virtual void AddToTree(TreeNode parentnd)
 | |
| 		{
 | |
| 			for(int i=0; i<Children.Count; i++)
 | |
| 			{
 | |
| 				VEO_Base veo = (VEO_Base) Children[i];
 | |
| 				veo.treeNode = new TreeNode(veo.GetTreeNodeText(),veo.icon,veo.icon);
 | |
| 				parentnd.Nodes.Add(veo.treeNode);
 | |
| 				veo.treeNode.Tag = veo;
 | |
| 			}
 | |
| 		}
 | |
| 		
 | |
| 		public virtual void Restore()
 | |
| 		{
 | |
| 		}
 | |
| 
 | |
| 		public virtual bool PropertiesDlg(Object parent)
 | |
| 		{
 | |
| 			Properties propdlg = new Properties(parent, this);
 | |
| 			DialogResult dr = propdlg.ShowDialog();
 | |
| 			if (dr == DialogResult.OK) return true;
 | |
| 			// restore the data (user may have changed in properties dialog, 
 | |
| 			// but need to restore original.
 | |
| 			this.Restore();
 | |
| 			return false;
 | |
| 		}
 | |
| 
 | |
| 		public virtual bool EditNode()
 | |
| 		{
 | |
| 			return true;
 | |
| 		}
 | |
| 
 | |
| 		public virtual bool canDoDragDrop()
 | |
| 		{
 | |
| 			return false;
 | |
| 		}
 | |
| 
 | |
| 		public void RefreshTreeNode(TreeNode nd)
 | |
| 		{
 | |
| 			VEO_Base veo = (VEO_Base) nd.Tag;		
 | |
| 
 | |
| 			//refresh the connect & lock.
 | |
| 			if (veo.Connection != null) veo.Connection.Enter(false);
 | |
| 
 | |
| 			// if the object doesn't have a lock type (i.e. isn't where the system,
 | |
| 			// plant or procset lock would be set) read in data & add it to the tree.
 | |
| 			if (veo.Lock.LockType == VENetwork.LockTypes.None && !(veo is VEO_DummySet))
 | |
| 			{
 | |
| 				if (veo.Children.Count>0) veo.Children.Clear();
 | |
| 				if (nd.Nodes.Count>0) nd.Nodes.Clear();
 | |
| 				veo.Read(false);
 | |
| 				veo.AddToTree(nd);		
 | |
| 			}
 | |
| 
 | |
| 			// if the object can have a lock at this level, but it currently doesnot
 | |
| 			// have a lock, if it has children add a temp node to the treeview. This
 | |
| 			// is done so that if this becomes expanded, the lock is checked again.
 | |
| 			else if (veo.Lock.LockStatus!=VENetwork.Status.LockedByOther)
 | |
| 			{
 | |
| 				veo.Read(true);
 | |
| 				if (veo.Children.Count>0)
 | |
| 				{
 | |
| 					veo.Children.Clear();
 | |
| 					TreeNode dmy = new TreeNode("TEMP");
 | |
| 					nd.Nodes.Add(dmy);
 | |
| 				}	
 | |
| 			}
 | |
| 
 | |
| 			// if multi-user serial number, may have to reset lock status icon.
 | |
| 			if (usrRunTime.InMultiUserMode)
 | |
| 			{   
 | |
| 				// if no lock & emtpy, show empty. Otherwise, show lock icon
 | |
| 				if (IsEmpty && veo.Lock.LockStatus==VENetwork.Status.NoLock)
 | |
| 					veo.icon = veo.iconStates[(int)VEO_IconStates.Empty];
 | |
| 				else
 | |
| 					veo.icon = veo.iconStates[(int)veo.Lock.LockStatus];
 | |
| 				nd.ImageIndex = veo.icon;
 | |
| 				nd.SelectedImageIndex = veo.icon;
 | |
| 			}
 | |
| 		}
 | |
| 		
 | |
| 		// When the user collapses the treenode, also, do some object cleanup.
 | |
| 		// This removes children, exits connections  for all sub-tree children
 | |
| 		// and also refreshes locks, updates icons based on lock changes and
 | |
| 		// load in children at the current node level.
 | |
| 		public void Collapse(TreeNode nd, TreeViewAction act, bool dorefresh,bool closeconn)
 | |
| 		{
 | |
| 			Expanded=false;
 | |
| 			Children.Clear();			
 | |
| 			if (Connection != null && closeconn) Connection.Exit();
 | |
| 
 | |
| 			// if this is the actual node that was collapsed, then refresh at this level, 
 | |
| 			// i.e. refresh the lock, update the icon (in case of lock status change)
 | |
| 			// and load children (may make into temp child if necessary)
 | |
| 			if (act == TreeViewAction.Collapse||dorefresh) {
 | |
| 				RefreshTreeNode(nd);
 | |
| 				// need to exit again because refresh tree node opens the connection
 | |
| 				// to determine locking status.
 | |
| 				if (Connection != null && closeconn) Connection.Exit();
 | |
| 			}
 | |
| 		}
 | |
| 
 | |
| 		// Expand the TreeNode. This makes a new/reenters connection at the level, sets up
 | |
| 		// icons for the level, enters it by loading its children (if it successfully
 | |
| 		// entered it, i.e. it's not locked.
 | |
| 		public virtual bool Expand(TreeNode mytreend)
 | |
| 		{
 | |
| 			if (Connection==null)
 | |
| 				Connection = new VEConnection(Lock, usrRunTime);
 | |
| 			// Enter the connection, i.e. refresh the lock & then see if can get into the
 | |
| 			// data level.
 | |
| 			bool canenter = Connection.Enter(false);
 | |
| 			// update icons (in case of lock status change)
 | |
| 			if (usrRunTime.InMultiUserMode)
 | |
| 			{
 | |
| 				// if no lock & emtpy, show empty. Otherwise, show lock icon
 | |
| 				if (IsEmpty && Lock.LockStatus==VENetwork.Status.NoLock)
 | |
| 					icon = iconStates[(int)VEO_IconStates.Empty];
 | |
| 				else
 | |
| 					icon = iconStates[(int)Lock.LockStatus];
 | |
| 				mytreend.ImageIndex = icon;
 | |
| 				mytreend.SelectedImageIndex = icon;
 | |
| 			}
 | |
| 			// if user cannot enter, it must be locked. Return a false.
 | |
| 			if (canenter==false) 
 | |
| 			{
 | |
| 				Collapse(mytreend,TreeViewAction.Unknown,true,false);
 | |
| 				mytreend.Nodes.Clear();
 | |
| 				mytreend.TreeView.Refresh();
 | |
| 				return false;
 | |
| 			}
 | |
| 			if (Expanded) return true;
 | |
| 			Expanded = true;
 | |
| 
 | |
| 			// load the children. First check for either no children (in case this was locked on
 | |
| 			// load, and then subsequently unlocked before the selection or check for a 'TEMP' 
 | |
| 			// node. If it exists, remove it. Then if this has a lock type of none, load it's 
 | |
| 			// children. Otherwise, load a temp child under each child. The temp child is
 | |
| 			// used because when the user actually expands this node, a recheck of the lock
 | |
| 			// status is needed and a change may have occurred (another user may have added, 
 | |
| 			// deleted or modified children by the time this is entered).
 | |
| 			TreeNode frstchld = mytreend.FirstNode;
 | |
| 			if (frstchld==null || frstchld.Text == "TEMP")
 | |
| 			{
 | |
| 				mytreend.Nodes.Clear();
 | |
| 				Read(false);
 | |
| 				AddToTree(mytreend);
 | |
| 			}
 | |
| 			VEO_Base veo;
 | |
| 			for (int i=0; i<mytreend.Nodes.Count; i++)
 | |
| 			{
 | |
| 				veo = (VEO_Base) mytreend.Nodes[i].Tag;
 | |
| 				// if the object doesn't have a lock type (i.e. isn't where the system,
 | |
| 				// plant or procset lock would be set) read in data & add it to the tree.
 | |
| 				if (veo.Lock.LockType == VENetwork.LockTypes.None && !(veo is VEO_DummySet))
 | |
| 				{
 | |
| 					veo.Read(false);
 | |
| 					veo.AddToTree(mytreend.Nodes[i]);		
 | |
| 				}
 | |
| 
 | |
| 					// if the object can have a lock at this level, but it currently does not
 | |
| 					// have a lock, if it has children, add a temp node to the treeview. This
 | |
| 					// is done so that if this becomes expanded, the lock is checked again.
 | |
| 				else if (veo.Lock.LockStatus!=VENetwork.Status.LockedByOther)
 | |
| 				{
 | |
| 					veo.Read(true);
 | |
| 					if (veo.Children.Count>0)
 | |
| 					{
 | |
| 						veo.Children.Clear();
 | |
| 						TreeNode dmy = new TreeNode("TEMP");
 | |
| 						mytreend.Nodes[i].Nodes.Add(dmy);
 | |
| 					}	
 | |
| 				}
 | |
| 			}
 | |
| 			return true;
 | |
| 		}
 | |
| 
 | |
| 		public virtual void LockedDlg()
 | |
| 		{
 | |
| 		}
 | |
| 
 | |
| 		// virtual read
 | |
| 		public virtual bool Read(bool dummy)
 | |
| 		{
 | |
| 			return true;
 | |
| 		}
 | |
| 		
 | |
| 		// virtual write
 | |
| 		public virtual bool Write()
 | |
| 		{
 | |
| 			return false;
 | |
| 		}
 | |
| 
 | |
| 		public virtual bool Open()
 | |
| 		{
 | |
| 			return false;
 | |
| 		}
 | |
| 		
 | |
| 		public virtual bool Close()
 | |
| 		{
 | |
| 			return false;
 | |
| 		}
 | |
| 
 | |
| 		// virtual cancel write (save)
 | |
| 		public virtual void CancelWrite()
 | |
| 		{
 | |
| 		}
 | |
| 
 | |
| 		public virtual bool Delete()
 | |
| 		{
 | |
| 			return true;
 | |
| 		}
 | |
| 
 | |
| 		// make a new plain vanilla object (this is really a virtual.
 | |
| 		public virtual Object MakeNewChild()
 | |
| 		{
 | |
| 			return (new Object());
 | |
| 		}
 | |
| 
 | |
| 		public virtual Object Copy()
 | |
| 		{
 | |
| 			return this;			//default to returning self
 | |
| 		}
 | |
| 
 | |
| 		public virtual Object AddNewChild()
 | |
| 		{
 | |
| 			VEO_Base newobj =  (VEO_Base) this.MakeNewChild();
 | |
| 			if (newobj==null) return null;  // something happened, just return
 | |
| 			newobj.parentObj = (VEO_Base) this;
 | |
| 			newobj.isNew=true;
 | |
| 			bool prpchg = newobj.PropertiesDlg(this);
 | |
| 			if (prpchg == true)
 | |
| 			{
 | |
| 				// Copy is used so that a VEO-object is created that has editable
 | |
| 				// (versus new) properties. When the object is 'new' many fields
 | |
| 				// are editable that should not be editable when not new (this is
 | |
| 				// mainly an issue with the property grid, since the ReadOnly
 | |
| 				// setting can only be done at compile/build time - it CANNOT be
 | |
| 				// done at run-time. So when a new object is created, if it's 
 | |
| 				// successful, it's copied to an object which is edit (not new)
 | |
| 				// for the treeview & any further operations.
 | |
| 				VEO_Base cpyobj = (VEO_Base) newobj.Copy();
 | |
| 				Children.Add(cpyobj);    // add the new one to the children
 | |
| 				if(newobj!=cpyobj)Children.Remove(newobj);
 | |
| 				cpyobj.Read(false);			 // read any child data
 | |
| 				return cpyobj;
 | |
| 			}
 | |
| 			else
 | |
| 				return null;
 | |
| 		}
 | |
| 
 | |
| 		public virtual string GetTreeNodeText()
 | |
| 		{
 | |
| 			return _Title;
 | |
| 		}
 | |
| 
 | |
| 		public virtual bool SaveChild(Object obj)
 | |
| 		{
 | |
| 			return false;
 | |
| 		}
 | |
| 
 | |
| 		// virtual SaveNew
 | |
| 		public virtual bool SaveNew(string pth)
 | |
| 		{
 | |
| 			return false;
 | |
| 		}
 | |
| 		
 | |
| 		public virtual void DoListView(ListView veoListView)
 | |
| 		{
 | |
| 			return;
 | |
| 		}
 | |
| 
 | |
| 		public virtual void DoWizzard()
 | |
| 		{
 | |
| 			return;
 | |
| 		}
 | |
| 
 | |
| 		// Comunication between this object & vfw
 | |
| 		struct COPYDATASTRUCT
 | |
| 		{
 | |
| 			public IntPtr dwData;
 | |
| 			public int cbData;
 | |
| 			public IntPtr lpData;
 | |
| 		}
 | |
| 		const int WM_COPYDATA = 0x004A;
 | |
| 
 | |
| 		// sending side
 | |
| 		[DllImport("user32.dll")]
 | |
| 		static extern bool SendMessage(  
 | |
| 			IntPtr hWnd,
 | |
| 			UInt32 Msg,
 | |
| 			UInt32 wParam,
 | |
| 			ref COPYDATASTRUCT lParam);
 | |
| 
 | |
| 		public struct RqstAttachMsg 
 | |
| 		{
 | |
| 			public Int16 level;
 | |
| 			public Int16 flag;
 | |
| 			public Int32 longval;
 | |
| 		}
 | |
| 
 | |
| 		public struct AnswerMsg 
 | |
| 		{
 | |
| 			public Int16 done;
 | |
| 			public Int16 intAnswer;
 | |
| 			public Int32 longAnswer;
 | |
| 		}
 | |
| 		
 | |
| 		public struct PRecordMsg 
 | |
| 		{
 | |
| 			public Int16 done;
 | |
| 			public Int16 cnt;
 | |
| 			[MarshalAs(UnmanagedType.ByValTStr,SizeConst=140)] public String buff;
 | |
| 		}
 | |
| 
 | |
| 		[StructLayout(LayoutKind.Sequential)]
 | |
| 			public struct PosUpdateStr
 | |
| 		{
 | |
| 			[MarshalAs(UnmanagedType.ByValTStr,SizeConst=16)] public String sender;
 | |
| 			[MarshalAs(UnmanagedType.ByValTStr,SizeConst=80)] public String directory;			
 | |
| 			public Int32 docnumindx;
 | |
| 			public Int32 recID;
 | |
| 		}
 | |
| 
 | |
| 		private VEO_Base GetObjectAtLevel(int level)
 | |
| 		{
 | |
| 			try
 | |
| 			{
 | |
| 				VEO_Base veo = this;
 | |
| 				while (veo != null)
 | |
| 				{
 | |
| 					if (level == 2 && veo.VEObjectType == (int)VEObjectTypesDefs.ProcedureSet)
 | |
| 						return veo;
 | |
| 					else if (level == 1 && veo.VEObjectType == (int)VEObjectTypesDefs.Plant)
 | |
| 						return veo;
 | |
| 					else if (level == 0 && veo.VEObjectType == (int)VEObjectTypesDefs.System)
 | |
| 						return veo;
 | |
| 					veo = (VEO_Base)veo.parentObj;
 | |
| 				}
 | |
| 			}
 | |
| 			catch (Exception e)
 | |
| 			{
 | |
| 				MessageBox.Show(e.Message.ToString());
 | |
| 			}
 | |
| 			return null;
 | |
| 		}
 | |
| 
 | |
| 		private bool ReturnProcRecord(VEO_Base veo,Int16 size, IntPtr vfwhndl)
 | |
| 		{
 | |
| 			bool success=true;
 | |
| 			COPYDATASTRUCT cds = new COPYDATASTRUCT();
 | |
| 			PRecordMsg prmsg;
 | |
| 			prmsg.done = 1;
 | |
| 
 | |
| 			byte [] bt = new byte[size+4];
 | |
| 			prmsg.cnt = veo.Connection.GetProcRecBuff(size, ref bt);
 | |
| 			if (prmsg.cnt != size)
 | |
| 			{
 | |
| 				MessageBox.Show("Could not read multi-user connection information");
 | |
| 				return false;
 | |
| 			}
 | |
| 			prmsg.buff = Encoding.ASCII.GetString(bt,0,size);
 | |
| 			IntPtr p = Marshal.AllocHGlobal(size+4);
 | |
| 			Marshal.StructureToPtr(prmsg,p,true);
 | |
| 
 | |
| 			cds.dwData = (IntPtr)VEMessageNS.MessageOps.GETPROCESSREC;
 | |
| 			// the following would be 'size+4', however marshalling requires space to be
 | |
| 			// a multiple of 8
 | |
| 			cds.cbData = 160;
 | |
| 			cds.lpData = p;
 | |
| 			try
 | |
| 			{
 | |
| 				SendMessage(vfwhndl,WM_COPYDATA,(UInt32)8, ref cds);
 | |
| 			}
 | |
| 			catch (Exception e)
 | |
| 			{
 | |
| 				MessageBox.Show(e.Message.ToString());
 | |
| 				success=false;
 | |
| 			}
 | |
| 			Marshal.FreeHGlobal(p);
 | |
| 			return success;
 | |
| 		}
 | |
| 
 | |
| 		private bool Reply(Int16 done, Int16 intAnswer, Int32 longAnswer, IntPtr vfwhndl)
 | |
| 		{
 | |
| 			bool success=true;
 | |
| 			COPYDATASTRUCT cds = new COPYDATASTRUCT();
 | |
| 			AnswerMsg ans;
 | |
| 			ans.done = done;
 | |
| 			ans.intAnswer = intAnswer;
 | |
| 			ans.longAnswer = longAnswer;
 | |
| 			
 | |
| 			IntPtr p=Marshal.AllocHGlobal(8);
 | |
| 			Marshal.StructureToPtr(ans,p,true);
 | |
| 						
 | |
| 			cds.dwData = (IntPtr)VEMessageNS.MessageOps.GETANSWER;
 | |
| 			cds.cbData = 8;
 | |
| 			cds.lpData = p;
 | |
| 			try
 | |
| 			{
 | |
| 				SendMessage(vfwhndl,WM_COPYDATA,(UInt32)8, ref cds);
 | |
| 			}
 | |
| 			catch (Exception e)
 | |
| 			{
 | |
| 				MessageBox.Show(e.Message.ToString());
 | |
| 				success=false;
 | |
| 			}
 | |
| 			Marshal.FreeHGlobal(p);
 | |
| 			return success;
 | |
| 		}
 | |
| 
 | |
| 		public virtual void ProcessMessage(Message m, IntPtr vfwhndl)
 | |
| 		{			
 | |
| 			VEO_Base veo = null;
 | |
| 			bool success=false;
 | |
| 
 | |
| 			if (m.Msg==(int)VEMessageNS.MessageOps.POSQUERY)
 | |
| 			{
 | |
| 				// POSQUERY is only called to get initial procedure - make the main
 | |
| 				// form invisible when this request is made. Wait until now so that
 | |
| 				// the main form is visible until vfw window is just about to be
 | |
| 				// made visible.
 | |
| 				IntPtr handle = 
 | |
| 					System.Diagnostics.Process.GetCurrentProcess().MainWindowHandle;
 | |
| 				Form mainForm = (Form)Form.FromHandle(handle);
 | |
| 				mainForm.Visible = false;
 | |
| 
 | |
| 				COPYDATASTRUCT cds = new COPYDATASTRUCT();
 | |
| 				PosUpdateStr pu;						
 | |
| 				pu.sender = "NEWBROWSER";
 | |
| 				VEO_Proc prc = null;
 | |
| 				if (!(this is VEO_Proc))
 | |
| 				{
 | |
| 					// get to a proc, this is either a set or 'procedures' node
 | |
| 					// from an approve selected.
 | |
| 					VEO_ProcSet ps = null;
 | |
| 					if (this is VEO_ProcSet)
 | |
| 						ps = (VEO_ProcSet) this;
 | |
| 					else if (this is VEO_DummySet)
 | |
| 						ps = (VEO_ProcSet) this.parentObj;
 | |
| 					else
 | |
| 					{
 | |
| 						MessageBox.Show("Error finding procedure for edit","VE-PROMS");
 | |
| 						return;
 | |
| 					}
 | |
| 					prc=ps.AppSelForEdit;
 | |
| 				}
 | |
| 				else
 | |
| 					prc = (VEO_Proc) this;
 | |
| 				VEO_DummySet ds = (VEO_DummySet) prc.parentObj;
 | |
| 				pu.directory = ds._Location;
 | |
| 				pu.docnumindx = ds.Children.IndexOf(prc);
 | |
| 				pu.recID = System.Convert.ToInt32(prc.recid,10);
 | |
| 
 | |
| 				IntPtr p=Marshal.AllocHGlobal(130);
 | |
| 				Marshal.StructureToPtr(pu,p,true);
 | |
| 						
 | |
| 				cds.dwData = (IntPtr)VEMessageNS.MessageOps.POSUPDATE;
 | |
| 				cds.cbData = 130;
 | |
| 				cds.lpData = p;
 | |
| 				try
 | |
| 				{
 | |
| 					SendMessage(vfwhndl,WM_COPYDATA,(UInt32)8, ref cds);
 | |
| 				}
 | |
| 				catch (Exception e)
 | |
| 				{
 | |
| 					MessageBox.Show(e.Message.ToString());
 | |
| 				}
 | |
| 				Marshal.FreeHGlobal(p);
 | |
| 			}
 | |
| 			else if (m.Msg==WM_COPYDATA)
 | |
| 			{
 | |
| 				bool reply = true;
 | |
| 				Int16 int1=0, int2=0;
 | |
| 				int int3=0;
 | |
| 				int lvl = 0;
 | |
| 				COPYDATASTRUCT cds = (COPYDATASTRUCT) m.GetLParam(typeof(COPYDATASTRUCT));
 | |
| 				int tmpmsg = (int)cds.dwData;
 | |
| 				VEMessageNS.MessageOps msg = (VEMessageNS.MessageOps) tmpmsg;				
 | |
| 				RqstAttachMsg ramsg = (RqstAttachMsg)Marshal.PtrToStructure(cds.lpData,typeof(RqstAttachMsg));
 | |
| 				// get level veobject associated with this request, i.e. system, plant, or procset
 | |
| 				// and then connect at level
 | |
| 				lvl = ramsg.level;
 | |
| 				try
 | |
| 				{
 | |
| 					veo = GetObjectAtLevel(lvl);
 | |
| 					switch (msg)
 | |
| 					{
 | |
| 						case VEMessageNS.MessageOps.RQSTATTACH:
 | |
| 							success = veo.Connection.Enter(false);
 | |
| 							int2 = (short)(success?1:0);						
 | |
| 							break;
 | |
| 						case VEMessageNS.MessageOps.RQSTFILEOFFSET:
 | |
| 							if (ramsg.flag==0)
 | |
| 								int3 = (int)veo.Connection.FileOffset;
 | |
| 							//else
 | |
| 							//	MessageBox.Show("Set file offset" + ramsg.longval.ToString());
 | |
| 							break;
 | |
| 						case VEMessageNS.MessageOps.RQSTFILEMODE:
 | |
| 							int2 = (short) veo.Connection.GetVfwMode();
 | |
| 							break;
 | |
| 						case VEMessageNS.MessageOps.RQSTFILEOWNER:
 | |
| 							int2 = 1;
 | |
| 							break;
 | |
| 						case VEMessageNS.MessageOps.RQSTFILESEEK:
 | |
| 							int3 = (int)veo.Connection.Seek(ramsg.longval, ramsg.flag);
 | |
| 							break;
 | |
| 						case VEMessageNS.MessageOps.RQSTFILECLOSE:	//used in lock/unlock
 | |
| 							veo.Connection.Close();
 | |
| 							break;
 | |
| 						case VEMessageNS.MessageOps.RQSTFILEOPEN:	//used in lock/unlock
 | |
| 							int2 = (short) veo.Connection.Open(ramsg.flag);
 | |
| 							break;
 | |
| 							// RQSTFILEREAD - not used in vfw <-> browser communication
 | |
| 						case VEMessageNS.MessageOps.RQSTFILEREAD:		
 | |
| 							MessageBox.Show("RqstFileRead"); 
 | |
| 							break;
 | |
| 						case VEMessageNS.MessageOps.RQSTFILEWRITE:	//used in lock/unlock
 | |
| 							MessageBox.Show("RqstFileWrite");
 | |
| 							break;
 | |
| 						case VEMessageNS.MessageOps.RQSTPROCESSRECORD:
 | |
| 							reply=false;
 | |
| 							success=ReturnProcRecord(veo,ramsg.flag,vfwhndl);
 | |
| 							break;
 | |
| 						case VEMessageNS.MessageOps.SETLOCKBYUSER:	//do set lock yet.
 | |
| 							if (ramsg.flag >= 0)
 | |
| 							{
 | |
| 								if (ramsg.flag==0)
 | |
| 									veo.Lock.LockStatus=VENetwork.Status.NoLock;
 | |
| 								else
 | |
| 									veo.Lock.LockStatus=VENetwork.Status.Locked;
 | |
| 							}
 | |
| 							int2 = (Int16)((veo.Lock.LockStatus==VENetwork.Status.Locked)?1:0);
 | |
| 							break;
 | |
| 					}
 | |
| 					if (reply) success = Reply(int1,int2,int3,vfwhndl);
 | |
| 				}
 | |
| 				catch (Exception e)
 | |
| 				{
 | |
| 					MessageBox.Show(e.Message);
 | |
| 				}
 | |
| 			}
 | |
| 		}
 | |
| 	}
 | |
| }
 |