200 lines
		
	
	
		
			5.8 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
			
		
		
	
	
			200 lines
		
	
	
		
			5.8 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
/*********************************************************************************************
 | 
						|
 * Copyright 2004 - Volian Enterprises, Inc. All rights reserved.
 | 
						|
 * Volian Enterprises - Proprietary Information - DO NOT COPY OR DISTRIBUTE
 | 
						|
 * ------------------------------------------------------------------------------
 | 
						|
 * $Workfile: VETempFile.cs $     $Revision: 1 $
 | 
						|
 * $Author: Kathy $   $Date: 7/27/04 8:45a $
 | 
						|
 *
 | 
						|
 * $History: VETempFile.cs $
 | 
						|
 * 
 | 
						|
 * *****************  Version 1  *****************
 | 
						|
 * User: Kathy        Date: 7/27/04    Time: 8:45a
 | 
						|
 * Created in $/LibSource/VENetwork
 | 
						|
 *********************************************************************************************/
 | 
						|
 | 
						|
using System;
 | 
						|
using System.IO;
 | 
						|
using System.Windows.Forms;
 | 
						|
 | 
						|
 | 
						|
namespace VENetwork
 | 
						|
{
 | 
						|
	// this class manages the temps directory for multi-user support in ve-proms.
 | 
						|
	// The temps directory is used to handle a user's temporary files in support of 
 | 
						|
	// printing, etc.
 | 
						|
	public class VETempFile
 | 
						|
	{
 | 
						|
		public string TemporaryDirectoryName;
 | 
						|
		private string TemporaryFileName;
 | 
						|
		public string TempNum;
 | 
						|
		FileStream tmpFs;
 | 
						|
		private string CurrentDir;
 | 
						|
 | 
						|
		public VETempFile(string cd)
 | 
						|
		{
 | 
						|
			CurrentDir = cd;
 | 
						|
			tmpFs=null;
 | 
						|
		}
 | 
						|
	
 | 
						|
		~ VETempFile()
 | 
						|
		{
 | 
						|
			CloseTempProc();
 | 
						|
		}
 | 
						|
		
 | 
						|
		// Converts the userid, num & PorD (characters 'P' or 'D') into a file-
 | 
						|
		// name to be used for temporary file support. This creates the file-
 | 
						|
		// name. The userid is extended to 8 characters with '_'s.
 | 
						|
		public string MakeTempName(string userid, string num, char PorD)
 | 
						|
		{
 | 
						|
			// first, make the temp directory, i.e. temps, if it doesn't
 | 
						|
			// exist.
 | 
						|
			DirectoryInfo di = new DirectoryInfo(CurrentDir + "temps");
 | 
						|
			if (!di.Exists) di.Create();
 | 
						|
			string tmpuid = userid.PadRight(8,'_');
 | 
						|
			string tpath = "temps" + "\\" + tmpuid + "." + PorD.ToString() + num;
 | 
						|
			return tpath;
 | 
						|
		}
 | 
						|
 | 
						|
		// This method truncates the temp file (user___.P##) and then closes it.
 | 
						|
		public void CloseTempProc()
 | 
						|
		{
 | 
						|
			if(tmpFs!=null)
 | 
						|
			{
 | 
						|
				try
 | 
						|
				{
 | 
						|
					// if called from a destructor, the file may have been closed - reopen
 | 
						|
					// it if we can't write
 | 
						|
					if (tmpFs.CanWrite==false)
 | 
						|
					{
 | 
						|
						tmpFs=null;
 | 
						|
						tmpFs = new FileStream(TemporaryFileName,FileMode.OpenOrCreate,FileAccess.ReadWrite,FileShare.None);
 | 
						|
					}
 | 
						|
					tmpFs.Seek(0L,SeekOrigin.Begin);
 | 
						|
					tmpFs.SetLength(0L);   // truncate the file
 | 
						|
					tmpFs.Close();
 | 
						|
					tmpFs=null;
 | 
						|
					TemporaryDirectoryName=null;
 | 
						|
				}
 | 
						|
				catch (Exception e)
 | 
						|
				{
 | 
						|
					MessageBox.Show(e.Message,this.TemporaryDirectoryName);
 | 
						|
				}
 | 
						|
			}
 | 
						|
		}
 | 
						|
 | 
						|
		// make all subdirectories, if not exist
 | 
						|
		private void MakeAllNecessaryDirectories(string path)
 | 
						|
		{
 | 
						|
			if (Directory.Exists(CurrentDir + path)) return;
 | 
						|
 | 
						|
			// Create the directory, and any subdirectories
 | 
						|
			DirectoryInfo di = Directory.CreateDirectory(CurrentDir + path);
 | 
						|
		}
 | 
						|
 | 
						|
		// sets class variables based on input.
 | 
						|
		private void SetUpTempDir(string userid, string num)
 | 
						|
		{
 | 
						|
			string TempPath = MakeTempName(userid,num,'D'); 
 | 
						|
			MakeAllNecessaryDirectories(TempPath);
 | 
						|
			TemporaryDirectoryName = TempPath + "\\";
 | 
						|
		}
 | 
						|
 | 
						|
		// This method attempts to attach to the specified temp file.
 | 
						|
		// Userid and num are combined to create a process name and
 | 
						|
		// TempPathDirectory. If the file is successfully opened and
 | 
						|
		// a connection is established, a byte count matching the process
 | 
						|
		// number is written to the file and the file is held open. (This
 | 
						|
		// byte count is actually written in the connection logic,
 | 
						|
		// veconn.cs, after a connection is successfully made.)
 | 
						|
		public bool AttachSpecificTemp(string userid, string num)
 | 
						|
		{
 | 
						|
			// if already open, close.
 | 
						|
			CloseTempProc();
 | 
						|
			string pname = CurrentDir + MakeTempName(userid,num,'P');
 | 
						|
 | 
						|
			// check to see if this user can use the file, i.e. open
 | 
						|
			// exclusively.
 | 
						|
			try
 | 
						|
			{
 | 
						|
				tmpFs = new FileStream(pname,FileMode.OpenOrCreate,FileAccess.ReadWrite,FileShare.None);
 | 
						|
			}
 | 
						|
			catch
 | 
						|
			{
 | 
						|
				return false;
 | 
						|
			}
 | 
						|
			TemporaryFileName = pname;
 | 
						|
			TempNum = num;
 | 
						|
			SetUpTempDir(userid,num);
 | 
						|
			return true;
 | 
						|
		}
 | 
						|
 | 
						|
		// if len is !0, try to delete files of the specified length.
 | 
						|
		// zero length files are normally in transition and will be 
 | 
						|
		// deleted by their owners.
 | 
						|
		public void DeleteFiles(string tmp, int len)
 | 
						|
		{	
 | 
						|
			DirectoryInfo di = new DirectoryInfo(Directory.GetCurrentDirectory());
 | 
						|
			FileInfo [] fis = di.GetFiles(tmp);
 | 
						|
			foreach (FileInfo fi in fis)
 | 
						|
			{
 | 
						|
				if (len==0 || len==fi.Length) fi.Delete();
 | 
						|
			}
 | 
						|
		}
 | 
						|
 | 
						|
		// find the next available temp directory for a given userid.
 | 
						|
		public bool FindAvailableTempDir(string userid)
 | 
						|
		{
 | 
						|
			// first look for existing temp files for this user to see if any
 | 
						|
			// can be used.
 | 
						|
			int i;
 | 
						|
			string ptmp = MakeTempName(userid,"*",'P'); // create a template
 | 
						|
 | 
						|
			// check to see if any exist.
 | 
						|
			DirectoryInfo di = new DirectoryInfo(CurrentDir);
 | 
						|
			FileInfo [] fis = di.GetFiles(ptmp);
 | 
						|
			for (i=0;i<fis.Length;i++)
 | 
						|
			{
 | 
						|
				FileInfo fi = fis[i];
 | 
						|
				string ptr = fi.Name.Substring(fi.Name.IndexOf(".")+2);
 | 
						|
				if (AttachSpecificTemp(userid,ptr))
 | 
						|
				{
 | 
						|
					if (fi.Length>0)
 | 
						|
					{
 | 
						|
						// this was left from a reboot or something.
 | 
						|
						// delete ownership and wrq files of the
 | 
						|
						// specified size. Check to see if it is
 | 
						|
						// consistent with the process file first.
 | 
						|
						DeleteFiles("*.own",(int)fi.Length);
 | 
						|
						DeleteFiles("*.wrq",(int)fi.Length);
 | 
						|
					}
 | 
						|
					return true;
 | 
						|
				}
 | 
						|
			}
 | 
						|
			fis = null;
 | 
						|
 | 
						|
			// Couldn't use an existing one, find a new one.
 | 
						|
			for (i=0;i<99;i++)
 | 
						|
				if (AttachSpecificTemp(userid,i.ToString("d2"))) return true;
 | 
						|
			
 | 
						|
			// if the user got this far, something's wrong - report error & exit.
 | 
						|
			MessageBox.Show("Too many temporary process files for user.","VE-PROMS error");
 | 
						|
			return false;
 | 
						|
		}
 | 
						|
 | 
						|
		// this method writes out the requested number of bytes to the file.
 | 
						|
		public void WriteBytes(int num)
 | 
						|
		{
 | 
						|
			if (tmpFs != null)
 | 
						|
			{
 | 
						|
				while (num>0)
 | 
						|
				{	
 | 
						|
					tmpFs.WriteByte((byte)'x');
 | 
						|
					num--;
 | 
						|
				}
 | 
						|
				tmpFs.Flush();
 | 
						|
 | 
						|
			}
 | 
						|
		}
 | 
						|
	}
 | 
						|
}
 |