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 } }