using SabreTools.Data.Models.InstallShieldCabinet;
namespace SabreTools.Data.Extensions
{
public static class InstallShieldCabinetExtensions
{
#region File Descriptors
///
/// Indicate if a file descriptor represents a compressed file
///
/// File descriptor to check
/// True if the file is flagged as compressed, false otherwise
public static bool IsCompressed(this FileDescriptor? fileDescriptor)
{
// Ignore invalid descriptors
if (fileDescriptor is null)
return true;
#if NET20 || NET35
return (fileDescriptor.Flags & FileFlags.FILE_COMPRESSED) != 0;
#else
return fileDescriptor.Flags.HasFlag(FileFlags.FILE_COMPRESSED);
#endif
}
///
/// Indicate if a file descriptor represents an invalid file
///
/// File descriptor to check
/// True if the file is flagged as invalid, false otherwise
public static bool IsInvalid(this FileDescriptor? fileDescriptor)
{
// Ignore invalid descriptors
if (fileDescriptor is null)
return true;
#if NET20 || NET35
return (fileDescriptor.Flags & FileFlags.FILE_INVALID) != 0;
#else
return fileDescriptor.Flags.HasFlag(FileFlags.FILE_INVALID);
#endif
}
///
/// Indicate if a file descriptor represents an obfuscated file
///
/// File descriptor to check
/// True if the file is flagged as obfuscated, false otherwise
public static bool IsObfuscated(this FileDescriptor? fileDescriptor)
{
// Ignore invalid descriptors
if (fileDescriptor is null)
return false;
#if NET20 || NET35
return (fileDescriptor.Flags & FileFlags.FILE_OBFUSCATED) != 0;
#else
return fileDescriptor.Flags.HasFlag(FileFlags.FILE_OBFUSCATED);
#endif
}
///
/// Indicate if a file descriptor represents a split file
///
/// File descriptor to check
/// True if the file is flagged as split, false otherwise
public static bool IsSplit(this FileDescriptor? fileDescriptor)
{
// Ignore invalid descriptors
if (fileDescriptor is 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
///
/// Get the major version of an InstallShield Cabinet
///
/// Cabinet to derive the version from
/// Major version of the cabinet, -1 on error
public static int GetMajorVersion(this Cabinet? cabinet)
{
// Ignore invalid cabinets
if (cabinet is null)
return -1;
return cabinet.CommonHeader.GetMajorVersion();
}
///
/// Get the major version of an InstallShield Cabinet
///
/// CommonHeader to derive the version from
/// Major version of the cabinet, -1 on error
public static int GetMajorVersion(this CommonHeader? commonHeader)
{
// Ignore invalid headers
if (commonHeader is null)
return -1;
uint majorVersion = commonHeader.Version;
if (majorVersion >> 24 == 1)
{
majorVersion = (majorVersion >> 12) & 0x0F;
}
else if (majorVersion >> 24 == 2 || majorVersion >> 24 == 4)
{
majorVersion &= 0xFFFF;
if (majorVersion != 0)
majorVersion /= 100;
}
return (int)majorVersion;
}
#endregion
}
}