2025-07-11 09:20:23 +08:00
using System ;
using System.Diagnostics ;
using System.IO ;
using System.IO.Packaging ;
2026-02-12 21:29:00 +08:00
namespace ShrlAlgoStudio.RevitLess
2025-07-11 09:20:23 +08:00
{
2026-02-12 21:29:00 +08:00
public class Storage : RevitLess . StorageBase , IDisposable
2025-07-11 09:20:23 +08:00
{
2026-01-02 16:37:37 +08:00
#region Private Variables
private BasicFileInfo basicInfo ;
private PreviewImage thumbnailImage ;
#endregion
#region Constructors
public Storage ( string fileName )
: base ( fileName )
{
if ( File . Exists ( fileName ) = = false )
{
throw new FileNotFoundException ( string . Format ( "The file \"{0}\" was not found." , fileName ) ) ;
}
FileName = fileName ;
OpenStructuredStorageFile ( ) ;
if ( IsInitialized = = false )
{
if ( StorageRoot ! = null )
{
CloseStorageRoot ( StorageRoot ) ;
}
return ;
}
BasicInfo = new BasicFileInfo ( FileName , StorageRoot ) ;
ThumbnailImage = new PreviewImage ( FileName , StorageRoot ) ;
if ( StorageRoot ! = null )
{
CloseStorageRoot ( StorageRoot ) ;
}
}
#endregion
#region IDisposable Implementation
private bool disposed ;
/// <summary>
/// <para>This method handles disposal of the OleDbAccess object.</para>
/// </summary>
/// <param name="disposing">A flag to check for redundant calls.</param>
protected virtual void Dispose ( bool disposing )
{
if ( disposed = = false )
{
// Release Unmanaged Resources
if ( disposing )
{
// Release Managed Resources
if ( StorageRoot ! = null )
{
CloseStorageRoot ( StorageRoot ) ;
}
}
disposed = true ;
}
}
/// <summary>
/// <para></para>
/// </summary>
public void Dispose ( )
{
Dispose ( true ) ;
GC . SuppressFinalize ( this ) ;
}
// This code is used to help detect any instances of this class that are not
// properly disposed. If this class is properly disposed, the finalizer is
// suppressed in the Dispose() method above and the finalizer method below
// is never called by runtime garbabe collection. If an instance of this
// is not properly disposed, the finalizer will be called, and the
// Debug.Assert method will display the StackTrace info, the thread and the time.
2025-07-11 09:20:23 +08:00
#if DEBUG
2026-01-02 16:37:37 +08:00
// /// <summary>
// /// <para>Finalizer method for the OleDbAccess class.</para>
// /// </summary>
// /// <remarks><para>
// /// This should never be called if the object is properly disposed.
// /// This method should never be removed or commented out.
// /// </para></remarks>
// ~UserPage()
// {
//// string newLine = Environment.NewLine;
//// string disposeFailMessage = string.Format("StackTrace for Disposal Failure: {0}{1}The Thread Name for the Disposal Failure: {2}{3}The Time of the Disposal Failure: {4}{5} @ {6}",
//// newLine, _debugStackTrace.ToString(),
//// newLine, _debugThreadName,
//// newLine, _debugTime.ToShortDateString(), _debugTime.ToShortTimeString());
//// LogManager.LogMessage(disposeFailMessage, LogManager.LogSeverityType.Error);
//// Debug.Assert(false, disposeFailMessage);
// }
2025-07-11 09:20:23 +08:00
#endif
2026-01-02 16:37:37 +08:00
#endregion
#region Public Properties
public BasicFileInfo BasicInfo
{
get
{
if ( basicInfo . IsInitialized = = false )
{
basicInfo . ReadStructuredStorageFile ( ) ;
}
return basicInfo ;
}
set
{
basicInfo = value ;
}
}
public PreviewImage ThumbnailImage
{
get
{
if ( thumbnailImage . IsInitialized = = false )
{
thumbnailImage . ReadStructuredStorageFile ( ) ;
}
return thumbnailImage ;
}
set
{
thumbnailImage = value ;
}
}
//public bool IsInitialized
//{
// get
// {
// return _isInitialized;
// }
// protected set
// {
// _isInitialized = value;
// }
//}
//public string FileName
//{
// get
// {
// return _fileName;
// }
// protected set
// {
// _fileName = value;
// }
//}
//public string FileExtension
//{
// get
// {
// if(string.IsNullOrEmpty(FileName))
// {
// return string.Empty;
// }
// return Path.GetExtension(FileName).Replace(".", string.Empty);
// }
//}
//public DocumentType DocType
//{
// get
// {
// if(string.IsNullOrEmpty(FileExtension))
// {
// return DocumentType.Unknown;
// }
// switch(FileExtension.ToUpper())
// {
// case "RVT":
// return DocumentType.Project;
// case "RTE":
// return DocumentType.ProjectTemplate;
// case "RFA":
// return DocumentType.Family;
// case "RFT":
// return DocumentType.FamilyTemplate;
// default:
// return DocumentType.Unknown;
// }
// }
//}
#endregion
#region Private Properties
private StorageInfo StorageRoot { get ; set ; }
#endregion
#region Private Methods
private void OpenStructuredStorageFile ( )
{
//int checkResult = IsStorageFile(FileName);
IsInitialized = false ;
//if(checkResult == 0)
//{
// return;
//}
try
{
StorageRoot = GetStorageRoot ( FileName ) ;
}
catch ( Exception ex )
{
Debug . WriteLine ( ex . Message ) ;
}
}
//private int IsStorageFile(string fileName)
//{
// return Ole32.StgIsStorageFile(FileName);
//}
private StorageInfo GetStorageRoot ( string fileName )
{
try
{
StorageInfo storageRoot = ( StorageInfo ) InvokeStorageRootMethod ( null ,
"Open" ,
fileName ,
FileMode . Open ,
FileAccess . Read ,
FileShare . Read ) ;
if ( storageRoot = = null )
{
IsInitialized = false ;
throw new Exception ( string . Format ( "Unable to open \"{0}\" as a structured storage file." , fileName ) ) ;
}
IsInitialized = true ;
return storageRoot ;
}
catch ( Exception ex )
{
IsInitialized = false ;
Debug . WriteLine ( ex . Message ) ;
}
return null ;
}
private void CloseStorageRoot ( StorageInfo storageRoot )
{
InvokeStorageRootMethod ( storageRoot , "Close" ) ;
}
#endregion
2025-07-11 09:20:23 +08:00
}
}