Add some more IS-CAB extensions

This commit is contained in:
Matt Nadareski
2025-07-31 13:44:15 -04:00
parent 6ffb3f4bbd
commit 2cc19a9c36
2 changed files with 86 additions and 23 deletions

View File

@@ -4,6 +4,84 @@ namespace SabreTools.Serialization
{
public static partial class Extensions
{
#region File Descriptors
/// <summary>
/// Indicate if a file descriptor represents a compressed file
/// </summary>
/// <param name="fileDescriptor">File descriptor to check</param>
/// <returns>True if the file is flagged as compressed, false otherwise</returns>
public static bool IsCompressed(this FileDescriptor? fileDescriptor)
{
// Ignore invalid descriptors
if (fileDescriptor == null)
return true;
#if NET20 || NET35
return (fileDescriptor.Flags & FileFlags.FILE_COMPRESSED) != 0;
#else
return fileDescriptor.Flags.HasFlag(FileFlags.FILE_COMPRESSED);
#endif
}
/// <summary>
/// Indicate if a file descriptor represents an invalid file
/// </summary>
/// <param name="fileDescriptor">File descriptor to check</param>
/// <returns>True if the file is flagged as invalid, false otherwise</returns>
public static bool IsInvalid(this FileDescriptor? fileDescriptor)
{
// Ignore invalid descriptors
if (fileDescriptor == null)
return true;
#if NET20 || NET35
return (fileDescriptor.Flags & FileFlags.FILE_INVALID) != 0;
#else
return fileDescriptor.Flags.HasFlag(FileFlags.FILE_INVALID);
#endif
}
/// <summary>
/// Indicate if a file descriptor represents an obfuscated file
/// </summary>
/// <param name="fileDescriptor">File descriptor to check</param>
/// <returns>True if the file is flagged as obfuscated, false otherwise</returns>
public static bool IsObfuscated(this FileDescriptor? fileDescriptor)
{
// Ignore invalid descriptors
if (fileDescriptor == null)
return false;
#if NET20 || NET35
return (fileDescriptor.Flags & FileFlags.FILE_OBFUSCATED) != 0;
#else
return fileDescriptor.Flags.HasFlag(FileFlags.FILE_OBFUSCATED);
#endif
}
/// <summary>
/// Indicate if a file descriptor represents a split file
/// </summary>
/// <param name="fileDescriptor">File descriptor to check</param>
/// <returns>True if the file is flagged as split, false otherwise</returns>
public static bool IsSplit(this FileDescriptor? fileDescriptor)
{
// Ignore invalid descriptors
if (fileDescriptor == null)
return false;
#if NET20 || NET35
return (fileDescriptor.Flags & FileFlags.FILE_SPLIT) != 0;
#else
return fileDescriptor.Flags.HasFlag(FileFlags.FILE_SPLIT);
#endif
}
#endregion
#region Version
/// <summary>
/// Get the major version of an InstallShield Cabinet
/// </summary>
@@ -43,5 +121,7 @@ namespace SabreTools.Serialization
return (int)majorVersion;
}
#endregion
}
}

View File

@@ -361,11 +361,7 @@ namespace SabreTools.Serialization.Wrappers
if (descriptor == null)
return false;
#if NET20 || NET35
if ((descriptor.Flags & FileFlags.FILE_INVALID) != 0)
#else
if (descriptor.Flags.HasFlag(FileFlags.FILE_INVALID))
#endif
if (descriptor.IsInvalid())
return false;
if (descriptor.NameOffset == default)
@@ -416,11 +412,7 @@ namespace SabreTools.Serialization.Wrappers
return false;
}
#if NET20 || NET35
if ((fileDescriptor.Flags & FileFlags.FILE_INVALID) != 0 || fileDescriptor.DataOffset == 0)
#else
if (fileDescriptor.Flags.HasFlag(FileFlags.FILE_INVALID) || fileDescriptor.DataOffset == 0)
#endif
if (fileDescriptor.IsInvalid() || fileDescriptor.DataOffset == 0)
{
Console.Error.WriteLine($"File at {index} is marked as invalid");
return false;
@@ -435,11 +427,7 @@ namespace SabreTools.Serialization.Wrappers
public string? GetFileName(int index)
{
var descriptor = GetFileDescriptor(index);
#if NET20 || NET35
if (descriptor == null || (descriptor.Flags & FileFlags.FILE_INVALID) != 0)
#else
if (descriptor == null || descriptor.Flags.HasFlag(FileFlags.FILE_INVALID))
#endif
if (descriptor == null || descriptor.IsInvalid())
return null;
return descriptor.Name;
@@ -453,14 +441,9 @@ namespace SabreTools.Serialization.Wrappers
if (descriptor == null)
return 0;
#if NET20 || NET35
if ((descriptor.Flags & FileFlags.FILE_COMPRESSED) != 0)
#else
if (descriptor.Flags.HasFlag(FileFlags.FILE_COMPRESSED))
#endif
return descriptor.CompressedSize;
else
return descriptor.ExpandedSize;
return descriptor.IsCompressed()
? descriptor.CompressedSize
: descriptor.ExpandedSize;
}
#endregion