625 lines
		
	
	
		
			21 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
			
		
		
	
	
			625 lines
		
	
	
		
			21 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
| /*********************************************************************************************
 | |
|  * Copyright 2004 - Volian Enterprises, Inc. All rights reserved.
 | |
|  * Volian Enterprises - Proprietary Information - DO NOT COPY OR DISTRIBUTE
 | |
|  * ------------------------------------------------------------------------------
 | |
|  * $Workfile: UsrRunTime.cs $     $Revision: 9 $
 | |
|  * $Author: Jsj $   $Date: 10/31/07 10:11a $
 | |
|  *
 | |
|  * $History: UsrRunTime.cs $
 | |
|  * 
 | |
|  * *****************  Version 9  *****************
 | |
|  * User: Jsj          Date: 10/31/07   Time: 10:11a
 | |
|  * Updated in $/LibSource/Utils
 | |
|  * Bug fix to ExeAdjust()
 | |
|  * 
 | |
|  * *****************  Version 8  *****************
 | |
|  * User: Jsj          Date: 7/21/06    Time: 2:57p
 | |
|  * Updated in $/LibSource/Utils
 | |
|  * added comment of logic that might be needed in future.
 | |
|  * 
 | |
|  * *****************  Version 7  *****************
 | |
|  * User: Jsj          Date: 5/17/05    Time: 11:54a
 | |
|  * Updated in $/LibSource/Utils
 | |
|  * cleanup
 | |
|  * 
 | |
|  * *****************  Version 6  *****************
 | |
|  * User: Kathy        Date: 4/21/05    Time: 10:17a
 | |
|  * Updated in $/LibSource/Utils
 | |
|  * issingleuser
 | |
|  * 
 | |
|  * *****************  Version 5  *****************
 | |
|  * User: Kathy        Date: 4/12/05    Time: 1:00p
 | |
|  * Updated in $/LibSource/Utils
 | |
|  * B2004-050: single user needed network info
 | |
|  * 
 | |
|  * *****************  Version 4  *****************
 | |
|  * User: Kathy        Date: 1/24/05    Time: 2:44p
 | |
|  * Updated in $/LibSource/Utils
 | |
|  * B2005-004 fixes
 | |
|  * 
 | |
|  * *****************  Version 3  *****************
 | |
|  * User: Kathy        Date: 1/10/05    Time: 12:57p
 | |
|  * Updated in $/LibSource/Utils
 | |
|  * B2004-063 fix
 | |
|  * 
 | |
|  * *****************  Version 2  *****************
 | |
|  * User: Jsj          Date: 11/12/04   Time: 10:32a
 | |
|  * Updated in $/LibSource/Utils
 | |
|  * Save the user's TEMP dir path ExeAjust() handles TEMP dir and Data Dir
 | |
|  * 
 | |
|  * *****************  Version 1  *****************
 | |
|  * User: Kathy        Date: 7/27/04    Time: 8:34a
 | |
|  * Created in $/LibSource/Utils
 | |
|  *********************************************************************************************/
 | |
| 
 | |
| using System;
 | |
| using System.IO;
 | |
| using System.Windows.Forms;
 | |
| using System.Text;
 | |
| using Org.Mentalis.Files;
 | |
| 
 | |
| namespace Utils
 | |
| {
 | |
| 	public enum UserCStatus
 | |
| 	{
 | |
| 		PRINACTIVE=0, PRACTIVE=1		// process record is NOT active, active respectively
 | |
| 	};
 | |
| 
 | |
| 	public class UserData
 | |
| 	{
 | |
| 		public byte   UserStatus;
 | |
| 		public string UserNetworkID;
 | |
| 		public string UserName;
 | |
| 		public string UserPhone1;
 | |
| 		public string UserPhone2;
 | |
| 		public string UserLoc1;
 | |
| 		public string UserLoc2;
 | |
| 		public string UserShell;			// 1 - vfw; 2 - browser; 3 - 32-bit browser
 | |
| 		public string UserProcess;
 | |
| 		
 | |
| 		// the first constructor loads data from a user's cfg file
 | |
| 		public UserData(string ucfgpath)
 | |
| 		{
 | |
| 			if (File.Exists(ucfgpath)==false) return;
 | |
| 			// create an xml node from the [User Data] in the cfg file & transfer
 | |
| 			// to this.  Note that the UserNetworkID is not set until the serial
 | |
| 			// number is read to determine whether in multi-user-mode (B2004-050)
 | |
| 			PrivateProfile ppUserData = new PrivateProfile(ucfgpath);
 | |
| 			UserName=ppUserData.Attr("User Data","UserName");
 | |
| 			UserPhone1=ppUserData.Attr("User Data","UserPhone1");
 | |
| 			UserPhone2=ppUserData.Attr("User Data","UserPhone2");
 | |
| 			UserLoc1=ppUserData.Attr("User Data","UserLoc1");
 | |
| 			UserLoc2=ppUserData.Attr("User Data","UserLoc2");
 | |
| 			char tmp = '\x03';
 | |
| 			UserShell = tmp.ToString();		// 1 - vfw; 2 - browser; 3 - 32-bit browser
 | |
| 			UserProcess="";
 | |
| 			ppUserData=null;
 | |
| 		}
 | |
| 		
 | |
| 		public void SetNetworkID(string ucfgpath, bool inmultiuser)
 | |
| 		{
 | |
| 			// create an xml node from the [User Data] in the cfg file & transfer
 | |
| 			// to this.
 | |
| 			PrivateProfile ppUserData = new PrivateProfile(ucfgpath);
 | |
| 			UserNetworkID=ppUserData.Attr("User Data","UserNetworkID");
 | |
| 			if (inmultiuser && (UserNetworkID == "" || UserNetworkID==null))
 | |
| 			{
 | |
| 				MessageBox.Show("Invalid UserNetworkID from " + ucfgpath +", set before reexecuting VE-PROMS.","VE-PROMS Error");
 | |
| 				Environment.Exit(-1);
 | |
| 			}
 | |
| 			ppUserData=null;
 | |
| 		}
 | |
| 		// the next constructor gets the input 'nth' record from the dat file (dat file is
 | |
| 		// passed in via a FileStream
 | |
| 		public UserData(FileStream dfs, int n)
 | |
| 		{
 | |
| 			// seek to the position as defined by n.
 | |
| 			long skpos = (long)(n * 140);   // 140 is the size of the record from old proms.
 | |
| 			dfs.Seek(skpos,SeekOrigin.Begin);
 | |
| 			byte [] test = new byte[140];
 | |
| 			dfs.Read(test,0,140);
 | |
| 			UserStatus = test[0];
 | |
| 			string tmp = Encoding.ASCII.GetString(test,0,140);
 | |
| 			UserNetworkID = tmp.Substring(1,9).Replace('\0',' ').Trim();
 | |
| 			UserName = tmp.Substring(10,31).Replace('\0',' ').Trim();
 | |
| 			UserPhone1 = tmp.Substring(41,16).Replace('\0',' ').Trim();
 | |
| 			UserPhone2 = tmp.Substring(57,16).Replace('\0',' ').Trim();
 | |
| 			UserLoc1 = tmp.Substring(73,31).Replace('\0',' ').Trim();
 | |
| 			UserLoc2 = tmp.Substring(104,31).Replace('\0',' ').Trim();
 | |
| 			UserShell = tmp.Substring(135,2).Replace('\0',' ').Trim();
 | |
| 			UserProcess = tmp.Substring(137,3).Replace('\0',' ').Trim();
 | |
| 		}
 | |
| 		
 | |
| 		// write this user data out to the filestream at the current position in file
 | |
| 		// defined in dfs
 | |
| 		public void Write(FileStream dfs)
 | |
| 		{
 | |
| 			dfs.WriteByte(UserStatus);
 | |
| 			byte[] btmp = Encoding.ASCII.GetBytes(UserNetworkID.PadRight(9,'\0'));
 | |
| 			dfs.Write(btmp,0,9);			
 | |
| 			btmp = Encoding.ASCII.GetBytes(UserName.PadRight(31,'\0'));
 | |
| 			dfs.Write(btmp,0,31);
 | |
| 			btmp = Encoding.ASCII.GetBytes(UserPhone1.PadRight(16,'\0'));
 | |
| 			dfs.Write(btmp,0,16);
 | |
| 			btmp = Encoding.ASCII.GetBytes(UserPhone2.PadRight(16,'\0'));
 | |
| 			dfs.Write(btmp,0,16);
 | |
| 			btmp = Encoding.ASCII.GetBytes(UserLoc1.PadRight(31,'\0'));
 | |
| 			dfs.Write(btmp,0,31);
 | |
| 			btmp = Encoding.ASCII.GetBytes(UserLoc2.PadRight(31,'\0'));
 | |
| 			dfs.Write(btmp,0,31);
 | |
| 			btmp = Encoding.ASCII.GetBytes(UserShell.PadRight(2,'\0'));
 | |
| 			dfs.Write(btmp,0,2);
 | |
| 			btmp = Encoding.ASCII.GetBytes(UserProcess.PadRight(3,'\0'));
 | |
| 			dfs.Write(btmp,0,3);
 | |
| 		}
 | |
| 	};
 | |
| 
 | |
| 	/// <summary>
 | |
| 	/// Summary description for UserRunTime. This class contains all pertinent information
 | |
| 	/// for the runtime for this instance of the program, including cfg, paths, menu file,
 | |
| 	/// security, serial number, options, etc.
 | |
| 	/// </summary>
 | |
| 	public class UserRunTime
 | |
| 	{
 | |
| 		public string exepath;
 | |
| 		public string syspath;
 | |
| 		public string netsyspath;
 | |
| 		public string TempDirPath;
 | |
| 
 | |
| 		public string ucfgpath;			// user config file name
 | |
| 		public string appcfgpath;		// app config file name
 | |
| 		
 | |
| 		public Security sec;
 | |
| 		public SerialNo SerialNumber;
 | |
| 		public string OptionsFile;
 | |
| 		public string initials; // user login name
 | |
| 		public string UserID; // cfg name and/or login
 | |
| 		public MenuXML menuwinXML;
 | |
| 		public MenuXML menuwin2XML;
 | |
| 		public string myUserNetworkID;
 | |
| 		public UserData myUserData;
 | |
| 		public bool InMultiUserMode;
 | |
| 
 | |
| 		// make some form properties  here, such as color. - make need it's own class,
 | |
| 		// 
 | |
| 		public UserRunTime()
 | |
| 		{
 | |
| 			menuwin2XML = null;
 | |
| 			SetExeName();
 | |
| 			// load in xml list of plants. Then do exist tests to see if they 
 | |
| 			// exist on the datapath.
 | |
| 			menuwinXML = new MenuXML(syspath + "\\menuwin.xml");
 | |
| 		}
 | |
| 
 | |
| 		public void SetSecurity(Security isec)
 | |
| 		{
 | |
| 			// set the user's run time security settings. also, flag whether this user is
 | |
| 			// running in multi user mode (just so we don't have to keep making this check
 | |
| 			// later)
 | |
| 			sec = isec;
 | |
| 			// Do this separate (SetUserMode()) to remove interdependent logic path between
 | |
| 			// security(vesam), user CFG file, and the serial number
 | |
| //			InMultiUserMode = (SerialNumber.GetSNOption((uint)Utils.SerialNo.SN_Flags.SN_NETWORK_ON)>0)?true:false;
 | |
| 		}
 | |
| 
 | |
| 		public void SetUserMode()
 | |
| 		{
 | |
| 			if (SerialNumber.SerialNum != -1)
 | |
| 				InMultiUserMode = (SerialNumber.GetSNOption((uint)Utils.SerialNo.SN_Flags.SN_NETWORK_ON)>0)?true:false;
 | |
| 			if (InMultiUserMode) myUserData.SetNetworkID(ucfgpath, InMultiUserMode);
 | |
| 		}
 | |
| 
 | |
| 		private bool IsSingleUserMode()
 | |
| 		{
 | |
| 			// Need to do:
 | |
| 			//     This needs to check if a lock is currently set as well
 | |
| 			// - jsj 7/20/06
 | |
| 			return !InMultiUserMode;
 | |
| 		}
 | |
| 
 | |
| 		// Adjust the input file with the required pathname as follows:
 | |
| 		// '~': (system path) i.e. c:\VE-PROMS
 | |
| 		// '@': (executable path) i.e. c:\VE-PROMS\BIN
 | |
| 		// '\342': current data directory  i.e. c:\VEHPR1B\PROCS
 | |
| 		// '\347': resolve for single user mode, append tempdir onto data dir i.e. TEMPS\JOHN____.D00
 | |
| 		public string ExeAdjust(string str)
 | |
| 		{
 | |
| 			if (exepath==null)SetExeName();
 | |
| 
 | |
| 			//	This logic will allow me to combine the use of our special
 | |
| 			//	tokens.  For example, I needed a user temp directory in the
 | |
| 			//	VE-PROMS root for the Search Across Procedure Sets option:
 | |
| 			//		"~\374results" --> C:\VE-PROMS\TEMPS\JOHN____.D00\RESUTLS
 | |
| 	 
 | |
| 			StringBuilder exebuff = new StringBuilder();
 | |
| 			StringBuilder exetkn = new StringBuilder(str);
 | |
| 			string exetkn_str = exetkn.ToString();
 | |
| 			int pos = 0;
 | |
| 			char[] tchar = "~@\xE7\xE2".ToCharArray();
 | |
| 			/** Bug Fix:  B2007-015
 | |
| 			 * If a short file/directory name contained a ~ character, it was
 | |
| 			 * being processed, when it should not  have.
 | |
| 			 * i.e.  we were getting the current directory, then looping back up
 | |
| 			 * and searching the directory string (finding a ~ char)
 | |
| 			 * 
 | |
| 			 * I added logic to use a starting position in the IndexOfAny() function
 | |
| 			 * so that we can skip past the portions already processes.
 | |
| 			 */
 | |
| 			while ((pos=exetkn_str.IndexOfAny(tchar,pos))>-1)
 | |
| 			{
 | |
| 				char[] chr;
 | |
| 				string curdir = Directory.GetCurrentDirectory(); // for use with '\xE2'
 | |
| 				chr = new char[exetkn_str.Length];
 | |
| 				chr = exetkn_str.ToCharArray();
 | |
| 				exetkn.Remove(pos,1);
 | |
| 				
 | |
| 				switch (chr[0]) 
 | |
| 				{
 | |
| 					case '~': exetkn.Insert(pos,syspath+"\\"); // i.e. c:\VE-PROMS
 | |
| 						pos += syspath.Length +1;
 | |
| 						break;
 | |
| 					case '@': exetkn.Insert(pos,exepath+"\\"); // i.e. c:\VE-PROMS\BIN
 | |
| 						pos += exepath.Length + 1;
 | |
| 						break;
 | |
| 					case '\xE2': // case '\342':
 | |
| 						exetkn.Insert(pos,curdir+"\\"); // i.e. c:\VEHPR1B\PROCS
 | |
| 						pos += curdir.Length + 1;
 | |
| 						break;
 | |
| 					case '\xE7': // case '\347':
 | |
| 						if (!IsSingleUserMode()&& TempDirPath!=null) 
 | |
| 						{
 | |
| 							exetkn.Insert(pos,TempDirPath+"\\"); // i.e. TEMPS\JOHN____.D00
 | |
| 							pos += TempDirPath.Length + 1;
 | |
| 						}
 | |
| 						break;
 | |
| 				}
 | |
| 				exetkn_str = exetkn.ToString();
 | |
| 			}
 | |
| 			return exetkn.ToString();
 | |
| 		}
 | |
| 
 | |
| 		private void SetExeName()
 | |
| 		{
 | |
| 			ShortName sname = new ShortName(System.Environment.CommandLine);
 | |
| 			string cmdlinepath = sname.ShortFileName;
 | |
| 			string upbuff = cmdlinepath.ToUpper();
 | |
| 			string tmp = upbuff.Substring(1,upbuff.LastIndexOf("\\")-1);
 | |
| 			int idx = tmp.IndexOf("VE-PROMS.NET");
 | |
| 			if (idx > 0)
 | |
| 			{
 | |
| 				exepath = tmp.Substring(0,idx+8) + tmp.Substring(idx+12);
 | |
| 				syspath = exepath.Substring(0,exepath.IndexOf("\\BIN"));
 | |
| 				netsyspath = syspath + ".NET";
 | |
| 			}
 | |
| 			else
 | |
| 			{
 | |
| 				exepath = tmp;
 | |
| 				syspath = exepath.Substring(0,exepath.IndexOf("\\BIN"));
 | |
| 				netsyspath = syspath + ".NET";
 | |
| 			}
 | |
| 		}
 | |
| 
 | |
| 		public void SetAppConfig(string pth)
 | |
| 		{
 | |
| 			appcfgpath = pth;
 | |
| 		}
 | |
| 
 | |
| 		public bool SetUserConfig()
 | |
| 		{
 | |
| 			bool Rtnval = true;
 | |
| 			PrivateProfile Veproms_ini = new PrivateProfile(ExeAdjust("~veproms.ini"));
 | |
| 			// Find the UserId (not the number, he name/initials)
 | |
| 			if (UserID==null || UserID.Equals(""))
 | |
| 			{
 | |
| 				// see if it's defined via an environment variable
 | |
| 				UserID = System.Environment.GetEnvironmentVariable("userid");
 | |
| 				if (UserID == null)
 | |
| 				{
 | |
| 					// Check the VEPROMS.INI file
 | |
| //					UserID = Veproms_ini.Attr("/ini/section[@name='veconfig']/param[@name='userid']/@value");
 | |
| 					UserID = Veproms_ini.Attr("veconfig","userid");
 | |
| 				}
 | |
| 				if (UserID == null || UserID.Equals(""))
 | |
| 				{
 | |
| 					if (sec.initials != null && !sec.initials.Equals(""))
 | |
| 					{
 | |
| 						// default to the user's login name
 | |
| 						UserID = sec.initials;
 | |
| 					}
 | |
| 					else
 | |
| 					{
 | |
| 						// default to VEPROMS.CFG
 | |
| 						UserID = "VEPROMS";
 | |
| 					}
 | |
| 				}
 | |
| 			}
 | |
| 			// Fing the VECONFIG path
 | |
| 			ucfgpath=System.Environment.GetEnvironmentVariable("veconfig");
 | |
| 			// If VECONFIG environment variable not set then check the
 | |
| 			// VEPROMS.INI file for VECONFIG settings.
 | |
| 			if (ucfgpath == null || ucfgpath.Equals(""))
 | |
| 			{
 | |
| //				ucfgpath = Veproms_ini.Attr("/ini/section[@name='veconfig']/param[@name='file']/@value");
 | |
| 				ucfgpath = Veproms_ini.Attr("veconfig","file");
 | |
| 				if (ucfgpath==null || ucfgpath.Equals(""))
 | |
| 				{
 | |
| 					// still no path, use default cfg file path
 | |
| 					ucfgpath = ExeAdjust("~CONFIG");
 | |
| 				}
 | |
| 			}
 | |
| 
 | |
| 			if (ucfgpath != null)
 | |
| 			{
 | |
| 				string tmp_UID="";
 | |
| 				// See it the VECONFIG path includes a CFG file name.
 | |
| 				// if no CFG file name, then build one based on userid
 | |
| 				bool atroot = ucfgpath.EndsWith(":\\");
 | |
| 				if (!atroot)
 | |
| 				{
 | |
| 					if (ucfgpath.EndsWith("\\"))
 | |
| 					{
 | |
| 						// trim the ending backslash
 | |
| 						ucfgpath = ucfgpath.Substring(0,ucfgpath.Length-1);
 | |
| 					}
 | |
| 				}
 | |
| 				//See if we need to build a CFG file name
 | |
| 				if (atroot || Directory.Exists(ucfgpath))
 | |
| 				{
 | |
| 					// use the no more than the first 8 chars of the userid
 | |
| 					tmp_UID = (UserID.Length > 8)?UserID.Substring(0,8) : UserID;
 | |
| 
 | |
| 					// Build the CFG file name and append to the VECONFIG path
 | |
| 					ucfgpath = ucfgpath + "\\" + tmp_UID + ".CFG";
 | |
| 				}
 | |
| 			}
 | |
| 			if (File.Exists(ucfgpath))
 | |
| 				myUserData = new UserData(ucfgpath);
 | |
| 			else
 | |
| 			{
 | |
| 				// error - cfg file does not exist
 | |
| 				Rtnval = false;
 | |
| 				MessageBox.Show("Configuration file:\n\n" + ucfgpath + "\n\nDoes not exist","Missing CFG file");
 | |
| 			}
 | |
| 			return Rtnval;
 | |
| 		}
 | |
| 
 | |
| 		public void FreeMenuWinXML()
 | |
| 		{
 | |
| 			menuwinXML=null;
 | |
| 		}
 | |
| 		public void LoadMenuWin2()
 | |
| 		{
 | |
| 			if (menuwin2XML == null)
 | |
| 				menuwin2XML = new MenuXML(syspath + "\\menuwin2.xml");
 | |
| 			//	menuwin2XML = new MenuXML("e:\\ve-proms\\menuwin2.xml");
 | |
| 		}
 | |
| 		public void FreeMenuWin2XML()
 | |
| 		{
 | |
| 			menuwin2XML=null;
 | |
| 		}
 | |
| 
 | |
| 		// The following methods update the cfg file (delete item, add item & mod)
 | |
| 		//public bool DeletePathFromCfg(string delpth)
 | |
| 		//{
 | |
| 		//  IniReader in1 = new IniReader(ucfgpath);
 | |
| 		//  string curpath = in1.ReadString("Menu","DataPath","");
 | |
| 		//  string modpath = curpath.Replace(delpth,"");
 | |
| 		//  inifile.WriteINIKeyValueStr("Menu","DataPath",modpath,ucfgpath);
 | |
| 		//  return true;
 | |
| 		//}
 | |
| 
 | |
| 		//public void AddPathToCfg(string pth)
 | |
| 		//{	
 | |
| 		//  string newpath=null;		
 | |
| 		//  INIFile inifile =  new INIFile();
 | |
| 		//  string curpath = inifile.GetINIKeyValueStr("Menu","DataPath","",132,ucfgpath);
 | |
| 		//  string tmp = curpath.TrimEnd(" \t".ToCharArray());
 | |
| 		//  // If none exists, just add that entered, if it ends with ';', don't add another
 | |
| 		//  if (tmp==null||tmp=="")
 | |
| 		//    newpath = pth;
 | |
| 		//  else if (tmp.Substring(tmp.Length-1,1)==";")
 | |
| 		//    newpath = tmp + pth;
 | |
| 		//  else
 | |
| 		//    newpath = tmp+";"+pth;
 | |
| 		//  inifile.WriteINIKeyValueStr("Menu","DataPath",newpath,ucfgpath);
 | |
| 		//}
 | |
| 
 | |
| 		//public void ModTitleToCfg(string oldtitle, string newtitle)
 | |
| 		//{		
 | |
| 		//  INIFile inifile =  new INIFile();
 | |
| 		//  string curpath = inifile.GetINIKeyValueStr("Menu","DataPath","",132,ucfgpath);
 | |
| 		//  string newpath=curpath.Replace(oldtitle,newtitle);
 | |
| 		//  inifile.WriteINIKeyValueStr("Menu","DataPath",newpath,ucfgpath);
 | |
| 		//}
 | |
| 
 | |
| 		// Check if plant (defined by location) is in the menuwin file. Return 0 if not,
 | |
| 		// 1 if in file and -1 if error reading file.
 | |
| 		public int IsInMenuWin(string location)
 | |
| 		{
 | |
| 			// see if this plant is already in the file, check menuwin
 | |
| 			// and if there, assume in both.
 | |
| 			try 
 | |
| 			{
 | |
| 				// Create an instance of StreamReader to read from a file.
 | |
| 				// The using statement also closes the StreamReader.
 | |
| 				using (StreamReader sr = new StreamReader(syspath+"\\menuwin")) 
 | |
| 				{
 | |
| 					string line;
 | |
| 					while ((line = sr.ReadLine()) != null) 
 | |
| 					{
 | |
| 						int indx;
 | |
| 						indx = line.ToUpper().IndexOf(location.ToUpper());
 | |
| 						if (indx>-1)
 | |
| 						{
 | |
| 							sr.Close();
 | |
| 							return 1;
 | |
| 						}
 | |
| 					}
 | |
| 				}
 | |
| 			}
 | |
| 			catch (Exception e) 
 | |
| 			{
 | |
| 				// Let the user know what went wrong.
 | |
| 				Console.WriteLine("Could not test " + e.Message + " for plant existence in menuwin file");
 | |
| 				return -1;
 | |
| 			}
 | |
| 			return 0;
 | |
| 		}
 | |
| 
 | |
| 		public bool AddToMenuWin(string title,string location)
 | |
| 		{
 | |
| 			int inmenufile = IsInMenuWin(location);
 | |
| 			if (inmenufile==-1)return false;		// error checking for it
 | |
| 			if (inmenufile==1)return true;			// already there.
 | |
| 
 | |
| 			// make backup files in case of failure.
 | |
| 			FileInfo menuwinbak = new FileInfo(syspath+"\\menuwin");
 | |
| 			menuwinbak.CopyTo(syspath+"\\menuwin.BAK",true);
 | |
| 			menuwinbak=null;
 | |
| 
 | |
| 			// add the title and location to the menuwin menuwin.xml files.
 | |
| 			// menuwin first.
 | |
| 			FileStream fs = new FileStream(syspath+"\\menuwin",
 | |
| 				FileMode.Open, FileAccess.ReadWrite, FileShare.None);
 | |
| 
 | |
| 			// if the file couldn't open, give an error.
 | |
| 			if (fs == null)
 | |
| 			{
 | |
| 				MessageBox.Show("Could not add plant to menuwin file.","VE-PROMS");
 | |
| 				menuwinbak = new FileInfo(syspath+"\\menuwin.BAK");
 | |
| 				menuwinbak.Delete();
 | |
| 				return false;
 | |
| 			}
 | |
| 			// go to last character of file & see if we have a /r/n. There
 | |
| 			// needs to be a single newline between plants in the menuwin file
 | |
| 			// or an error will occur.
 | |
| 			fs.Seek(-2,SeekOrigin.End);
 | |
| 			StreamReader tmpReader = new StreamReader(fs);
 | |
| 			int tmpi1 = tmpReader.Peek();
 | |
| 			bool hasnewline=false;
 | |
| 			if (tmpi1==0xD)hasnewline=true;
 | |
| 			fs.Seek(0,SeekOrigin.End);
 | |
| 			
 | |
| 			StreamWriter swFromFileStream = new StreamWriter(fs);
 | |
| 			if (hasnewline)
 | |
| 				swFromFileStream.Write(title);
 | |
| 			else
 | |
| 				swFromFileStream.Write("\r\n"+title);
 | |
| 			string tmpl = "\r\n{t}" + location + " menu ~menu1a\r\n";
 | |
| 			swFromFileStream.Write(tmpl);
 | |
| 			swFromFileStream.Flush();
 | |
| 			swFromFileStream.Close();
 | |
| 			fs.Close();
 | |
| 
 | |
| 			// now add menuwin.xml text, add this before the end tags for 
 | |
| 			// system attach & menuwin (i.e. that's the seek part of this
 | |
| 			// subtracting from end of file the number of characters for
 | |
| 			// these two tags.
 | |
| 			// make backup files in case of failure.
 | |
| 			FileInfo menuwinxbak = new FileInfo(syspath+"\\menuwin");
 | |
| 			menuwinxbak.CopyTo(syspath+"\\menuwinx.BAK",true);
 | |
| 			menuwinxbak=null;
 | |
| 
 | |
| 			fs = new FileStream(syspath+"\\menuwin.xml",
 | |
| 				FileMode.Open, FileAccess.Write, FileShare.None);
 | |
| 			if (fs == null)
 | |
| 			{
 | |
| 				MessageBox.Show("Could not add plant to menuwin.xml file.","VE-PROMS");
 | |
| 				//delete menuwin & rename the bak file.
 | |
| 				menuwinbak = new FileInfo(syspath+"\\menuwin");
 | |
| 				menuwinbak.Delete();
 | |
| 				menuwinbak = null;
 | |
| 				menuwinbak = new FileInfo(syspath+"\\menuwin.BAK");
 | |
| 				menuwinbak.CopyTo(syspath+"\\menuwin");
 | |
| 				menuwinbak.Delete();
 | |
| 				menuwinxbak = new FileInfo(syspath+"\\menuwinx.BAK");
 | |
| 				menuwinxbak.Delete();
 | |
| 				return false;
 | |
| 			}
 | |
| 			long flen = fs.Length;
 | |
| 			fs.SetLength(flen-27);  //remove tags.
 | |
| 			fs.Seek(0,SeekOrigin.End);
 | |
| 			swFromFileStream = new StreamWriter(fs);
 | |
| 			swFromFileStream.Write("<Plant>\r\n<MenuName>");
 | |
| 			swFromFileStream.Write(title);
 | |
| 			swFromFileStream.Write("</MenuName>\r\n<TemplateName>{t}");
 | |
| 			swFromFileStream.Write(location);
 | |
| 			swFromFileStream.Write(" menu menu1a</TemplateName>\r\n</Plant>\r\n");
 | |
| 			swFromFileStream.Write("</SystemAttach>\r\n</MenuWin>");
 | |
| 			
 | |
| 			swFromFileStream.Flush();
 | |
| 			swFromFileStream.Close();
 | |
| 			fs.Close();
 | |
| 			menuwinbak = new FileInfo(syspath+"\\menuwin.BAK");
 | |
| 			menuwinbak.Delete();
 | |
| 			menuwinxbak = new FileInfo(syspath+"\\menuwinx.BAK");
 | |
| 			menuwinxbak.Delete();
 | |
| 			// reload so that the new plant node gets added to the xml tree.
 | |
| 			menuwinXML = null;
 | |
| 			menuwinXML = new MenuXML(syspath + "\\menuwin.xml");
 | |
| 			MessageBox.Show("Please send \\ve-proms\\menuwin & \\ve-proms\\menuwin.xml files to Volian.","VE-PROMS");
 | |
| 			return true;
 | |
| 		}
 | |
| 
 | |
| 		public bool ModMenuWin(string newtitle, string oldtitle)
 | |
| 		{
 | |
| 			// replace the oldtitle with the new in both the menuwin file
 | |
| 			// and the menuwin.xml file.
 | |
| 			FileInfo menuwinbak = new FileInfo(syspath+"\\menuwin");
 | |
| 			menuwinbak.CopyTo(syspath+"\\menuwin.BAK",true);
 | |
| 			menuwinbak=null;
 | |
| 
 | |
| 			// read the whole file, replace the plant title string & save the file.
 | |
| 			StreamReader sr = File.OpenText(syspath+"\\menuwin");
 | |
| 			string input;
 | |
| 			if ((input=sr.ReadToEnd())!=null) 
 | |
| 			{
 | |
| 				sr.Close();
 | |
| 				string output = input.Replace(oldtitle,newtitle);
 | |
| 				StreamWriter sw = new StreamWriter(syspath+"\\menuwin",false);
 | |
| 				sw.Write(output);
 | |
| 				sw.Close();
 | |
| 			}
 | |
| 			else 
 | |
| 			{
 | |
| 				sr.Close();
 | |
| 				MessageBox.Show("Could not update menuwin file with new plant title","VE-PROMS");
 | |
| 				menuwinbak = new FileInfo(syspath+"\\menuwin.BAK");
 | |
| 				menuwinbak.CopyTo(syspath+"\\menuwin",true);
 | |
| 				menuwinbak.Delete();
 | |
| 				return false;
 | |
| 			}
 | |
| 
 | |
| 			// now do the xml file.
 | |
| 			menuwinbak = new FileInfo(syspath+"\\menuwin.xml");
 | |
| 			menuwinbak.CopyTo(syspath+"\\menuwinx.BAK",true);
 | |
| 			menuwinbak=null;
 | |
| 
 | |
| 			// read the whole file, replace the plant title string & save the file.
 | |
| 			sr = File.OpenText(syspath+"\\menuwin.xml");
 | |
| 			if ((input=sr.ReadToEnd())!=null) 
 | |
| 			{
 | |
| 				sr.Close();
 | |
| 				string output = input.Replace(oldtitle,newtitle);
 | |
| 				StreamWriter sw = new StreamWriter(syspath+"\\menuwin.xml",false);
 | |
| 				sw.Write(output);
 | |
| 				sw.Close();
 | |
| 			}
 | |
| 			else 
 | |
| 			{
 | |
| 				sr.Close();
 | |
| 				MessageBox.Show("Could not update menuwin.xml file with new plant title","VE-PROMS");
 | |
| 				menuwinbak = new FileInfo(syspath+"\\menuwin.BAK");
 | |
| 				menuwinbak.CopyTo(syspath+"\\menuwin",true);
 | |
| 				menuwinbak.Delete();
 | |
| 				menuwinbak = new FileInfo(syspath+"\\menuwinx.BAK");
 | |
| 				menuwinbak.CopyTo(syspath+"\\menuwin.xml",true);
 | |
| 				menuwinbak.Delete();
 | |
| 				return false;
 | |
| 			}
 | |
| 			
 | |
| 			return true;
 | |
| 		}
 | |
| 	}
 | |
| }
 |