Katteker/Creator/AssemblyFileInfo.cs
Holger Boerchers d383f0ef1c Initial commit
2018-03-21 20:07:40 +01:00

93 lines
3.7 KiB
C#

using System;
using System.Drawing;
using System.IO;
using System.Linq;
using Katteker;
using TsudaKageyu;
using Vestris.ResourceLib;
namespace KattekerCreator
{
public class AssemblyFileInfo
{
private readonly string _company;
private readonly string _copyright;
private readonly string _description;
private readonly string _productName;
public AssemblyFileInfo(string fileName, string tempDir)
{
FileInfo = new FileInfo(fileName);
using (var resourceInfo = new ResourceInfo())
{
resourceInfo.Load(fileName);
var versionResource = (VersionResource) resourceInfo[Kernel32.ResourceTypes.RT_VERSION].First();
var stringFileInfo = ((StringFileInfo) versionResource[nameof(StringFileInfo)]).Strings.FirstOrDefault()
.Value;
AssemblyIconPath = GetAssemblyIcon(fileName, tempDir);
if (stringFileInfo.Strings.ContainsKey("CompanyName"))
_company = stringFileInfo.Strings["CompanyName"].StringValue;
if (stringFileInfo.Strings.ContainsKey("FileDescription"))
_description = stringFileInfo.Strings["FileDescription"].StringValue;
if (stringFileInfo.Strings.ContainsKey("LegalCopyright"))
_copyright = stringFileInfo.Strings["LegalCopyright"].StringValue;
if (stringFileInfo.Strings.ContainsKey("ProductName"))
_productName = stringFileInfo.Strings["ProductName"].StringValue;
if (!stringFileInfo.Strings.ContainsKey("ProductVersion")) return;
AssemblyVersion = GetSemanticVersion(stringFileInfo.Strings["ProductVersion"].StringValue);
}
}
public string AssemblyIconPath { get; }
public SemanticVersion AssemblyVersion { get; private set; }
public string Company => _company ?? string.Empty;
public string Copyright => _copyright ?? string.Empty;
public string Description => _description ?? string.Empty;
public FileInfo FileInfo { get; }
public string ProductName => _productName ?? Description;
private static string GetAssemblyIcon(string programFile, string tempDir)
{
var applicationIcon = Path.Combine(tempDir, "application.ico");
if (string.IsNullOrWhiteSpace(programFile)) throw new ApplicationException("Program not set.");
if (!File.Exists(programFile)) throw new ApplicationException("Program not found.");
if (File.Exists(applicationIcon)) File.Delete(applicationIcon);
using (var fileStream = new FileStream(applicationIcon, FileMode.CreateNew))
{
try
{
var ie = new IconExtractor(programFile);
using (var icon = ie.GetIcon(0))
{
icon?.Save(fileStream);
}
}
catch (Exception)
{
using (var icon = Icon.ExtractAssociatedIcon(programFile))
{
icon?.Save(fileStream);
}
}
}
return applicationIcon;
}
private static SemanticVersion GetSemanticVersion(string productVersion)
{
if (!SemanticVersion.TryParse(productVersion, out var semanticVersion))
{
Version.TryParse(productVersion, out var version);
return SemanticVersion.Parse(version.ToString(3));
}
return semanticVersion?.Change(build: string.Empty);
}
}
}