2009-03-28 22:20:51 +00:00

345 lines
8.3 KiB
C#

using System;
using System.Collections.Generic;
using System.Text;
using System.IO;
using Csla;
using Csla.Data;
using System.Data;
using System.Data.SqlClient;
using EPocalipse.IFilter;
namespace VEPROMS.CSLA.Library
{
public partial class Document
{
public string DocumentTitle
{
get
{
if (_LibTitle == "") return string.Format("Document {0}", _DocID);
return _LibTitle;
}
}
public void UpdateDocAscii(string fileName)
{
try
{
DocAscii = null;
// Opening the file directly gives a sharing violation.
// Therefore, the file is copied and the copy is used and then deleted.
FileInfo myFile = new FileInfo(fileName);
FileInfo tempFile = new FileInfo(myFile.DirectoryName + "\\tmp_" + myFile.Name);
myFile.CopyTo(tempFile.FullName); // Copy to the temporary file
using (FilterReader reader = new FilterReader(tempFile.FullName)) // Open the IFilter Reader
{
DocAscii = FixString(reader.ReadToEnd()); // Read the ascii text
reader.Close(); // Close the reader
}
tempFile.Delete();
}
catch (Exception ex)
{
// Handle exceptions
}
}
/// <summary>
/// FixString processes the string returned and changes any symbols (0xF0??) to normal characters
/// </summary>
/// <param name="str"></param>
/// <returns></returns>
private static string FixString(string str)
{
StringBuilder results = new StringBuilder();
foreach (char c in str)
{
if ((c & 0xFF00) == 0xF000)
results.Append((char)(c & 0xFF));
else
results.Append((char)(c));
}
return results.ToString();
}
}
public partial class DocumentInfo
{
public string DocumentTitle
{
get
{
if (_LibTitle == "") return string.Format("Document {0}", _DocID);
return _LibTitle;
}
}
public string LibraryDocumentUsage
{
get
{
StringBuilder sb = new StringBuilder();
string sep = "\r\nUsed In:\r\n ";
if (DocumentEntries == null)
sb.Append("None");
else
{
foreach (EntryInfo myEntry in DocumentEntries)
{
foreach (ItemInfo myItem in myEntry.MyContent.ContentItems)
{
ItemInfo proc = myItem.MyProcedure;
sb.Append(sep + proc.MyContent.Number + " - " + proc.MyContent.Text);
sep = "\r\n ";
}
}
}
return sb.ToString();
}
}
public ItemInfoList LibraryDocumentUsageList
{
get
{
bool first = true;
ItemInfoList iil = null;
if (DocumentEntries == null) return null;
foreach (EntryInfo myEntry in DocumentEntries)
{
foreach (ItemInfo myitem in myEntry.MyContent.ContentItems)
{
if (first)
{
iil = new ItemInfoList(myitem);
first = false;
}
else
iil.AddItem(myitem);
}
}
return iil;
}
}
}
public partial class DocumentInfoList
{
public static DocumentInfoList GetLibraries(bool forceload)
{
try
{
if (!forceload && _DocumentInfoList != null)
return _DocumentInfoList;
DocumentInfoList tmp = DataPortal.Fetch<DocumentInfoList>(new LibraryCriteria(true));
DocumentInfo.AddList(tmp);
tmp.AddEvents();
_DocumentInfoList = tmp;
return tmp;
}
catch (Exception ex)
{
throw new DbCslaException("Error on DocumentInfoList.Get", ex);
}
}
[Serializable()]
protected class LibraryCriteria
{
private bool _IsLibrary;
public bool IsLibrary
{
get { return _IsLibrary; }
set { _IsLibrary = value; }
}
public LibraryCriteria(bool islibrary)
{
_IsLibrary = islibrary;
}
}
private void DataPortal_Fetch(LibraryCriteria criteria)
{
this.RaiseListChangedEvents = false;
if (_MyLog.IsDebugEnabled) _MyLog.DebugFormat("[{0}] DocumentInfoList.DataPortal_Fetch", GetHashCode());
try
{
using (SqlConnection cn = Database.VEPROMS_SqlConnection)
{
using (SqlCommand cm = cn.CreateCommand())
{
cm.CommandType = CommandType.StoredProcedure;
cm.CommandText = "getLibraryDocuments";
using (SafeDataReader dr = new SafeDataReader(cm.ExecuteReader()))
{
IsReadOnly = false;
while (dr.Read()) this.Add(new DocumentInfo(dr));
IsReadOnly = true;
}
}
}
}
catch (Exception ex)
{
if (_MyLog.IsErrorEnabled) _MyLog.Error("DocumentInfoList.DataPortal_Fetch", ex);
throw new DbCslaException("DocumentInfoList.DataPortal_Fetch", ex);
}
this.RaiseListChangedEvents = true;
}
}
public class DSOFile : IDisposable
{
private static readonly log4net.ILog _MyLog = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);
#region Fields
private bool _IsDisposed;
private static string _TemporaryFolder = null;
private DocumentInfo _MyDocument = null;
private FileInfo _MyFile = null;
private string _Extension = "DOC";
#endregion
#region Properties
public static string TemporaryFolder
{
get
{
if (_TemporaryFolder == null)
{
// This will create a Temp\VE-PROMS folder in the LocalSettings Folder.
//XP - C:\Documents and Settings\{user}\Local Settings\Application Data\Temp\VE-PROMS
//Vista - C:\Users\{user}\AppData\Local\Temp\VE-PROMS
_TemporaryFolder = Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData) + @"\Temp";
if (!Directory.Exists(TemporaryFolder)) Directory.CreateDirectory(TemporaryFolder);
_TemporaryFolder += @"\VE-PROMS";
if (!Directory.Exists(TemporaryFolder)) Directory.CreateDirectory(TemporaryFolder);
}
return _TemporaryFolder;
}
}
public DocumentInfo MyDocument
{
get { return _MyDocument; }
set
{
TryDelete();
_MyDocument = value;
CreateFile();
}
}
public FileInfo MyFile
{
get { return _MyFile; }
}
public string Extension
{
get { return _Extension; }
set { _Extension = value; }
}
#endregion
#region Private Methods
private void TryDelete()
{
if (_MyDocument == null) return;
if (_MyFile == null) return;
if (_MyFile.Exists)
{
try
{
_MyFile.Delete();
}
catch (IOException ex)
{
_MyLog.Error("TryDelete",ex);
}
finally
{
_MyFile = null;
_MyDocument = null;
}
}
}
private bool _Created = false;
private int _Unique = 0;
private string Unique
{
get
{
string retval = "";
if (_Unique != 0) retval = "_" + _Unique.ToString();
_Unique++;
return retval;
}
}
private void CreateFile()
{
while (!_Created)
CreateTemporaryFile();
}
private void CreateTemporaryFile()
{
try
{
if (_MyDocument != null)
{
_MyFile = new FileInfo(string.Format(@"{0}\tmp_{1}{2}{3}", TemporaryFolder, MyDocument.DocID, Unique, MyDocument.FileExtension));
FileStream fs = _MyFile.Create();
fs.Write(MyDocument.DocContent, 0, MyDocument.DocContent.Length);
fs.Close();
_MyFile.CreationTime = _MyDocument.DTS;
_MyFile.LastWriteTime = _MyDocument.DTS;
_Created = true;
}
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
}
public string FullName
{
get { return _MyFile.FullName; }
set
{
if(FullName != value)
_MyFile = new FileInfo(value);
}
}
public void SaveFile()
{
// TODO: Add Try & Catch logic
if (_MyDocument == null) return;
Document doc = _MyDocument.Get();
FileStream fs = _MyFile.Open(FileMode.Open, FileAccess.Read, FileShare.ReadWrite);
Byte[] buf = new byte[_MyFile.Length];
fs.Read(buf,0,buf.Length);
fs.Close();
doc.FileExtension = MyFile.Extension;
doc.DocContent = buf;
doc.UpdateDocAscii(_MyFile.FullName);
doc.UserID = Environment.UserName;
doc.DTS = _MyFile.LastWriteTime;
doc.Save();
}
#endregion
#region Constructors
public DSOFile(DocumentInfo myDocument)
{
MyDocument = myDocument;
}
#endregion
#region Destructor
~DSOFile()
{
Dispose(false);
}
public void Dispose()
{
Dispose(false);
GC.SuppressFinalize(this);
}
protected void Dispose(bool disposing)
{
if (!_IsDisposed)
{
_IsDisposed = true;
TryDelete();
}
}
#endregion
}
}