Chore: Change software year to 2025.

This commit is contained in:
Adrien Allard 2025-02-14 19:47:07 +01:00
parent cb13a2fe55
commit d6afefe01a
5 changed files with 358 additions and 358 deletions

View File

@ -1,7 +1,7 @@
// <copyright file="Application.xaml.cs" company="AAllard">License: http://www.gnu.org/licenses/gpl.html GPL version 3.</copyright> // <copyright file="Application.xaml.cs" company="AAllard">License: http://www.gnu.org/licenses/gpl.html GPL version 3.</copyright>
/* File Converter - This program allow you to convert file format to another. /* File Converter - This program allow you to convert file format to another.
Copyright (C) 2024 Adrien Allard Copyright (C) 2025 Adrien Allard
email: adrien.allard.pro@gmail.com email: adrien.allard.pro@gmail.com
This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by

View File

@ -1,359 +1,359 @@
// <copyright file="Helpers.cs" company="AAllard">License: http://www.gnu.org/licenses/gpl.html GPL version 3.</copyright> // <copyright file="Helpers.cs" company="AAllard">License: http://www.gnu.org/licenses/gpl.html GPL version 3.</copyright>
namespace FileConverter namespace FileConverter
{ {
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Globalization; using System.Globalization;
using System.IO; using System.IO;
using System.Reflection; using System.Reflection;
using System.Threading; using System.Threading;
using FileConverter.ConversionJobs; using FileConverter.ConversionJobs;
using FileConverter.Services; using FileConverter.Services;
using SharpShell.Helpers; using SharpShell.Helpers;
using Microsoft.Win32; using Microsoft.Win32;
using CommunityToolkit.Mvvm.DependencyInjection; using CommunityToolkit.Mvvm.DependencyInjection;
public static class Helpers public static class Helpers
{ {
public static readonly string[] CompatibleInputExtensions = { public static readonly string[] CompatibleInputExtensions = {
"3gp","3gpp","aac","aiff","ape","arw","avi","bik","bmp","cda","cr2","dds","dng","doc","docx", "3gp","3gpp","aac","aiff","ape","arw","avi","bik","bmp","cda","cr2","dds","dng","doc","docx",
"exr","flac","flv","gif","heic","ico","jfif","jpg","jpeg","m4a","m4b","m4v","mkv","mov","mp3","mp4", "exr","flac","flv","gif","heic","ico","jfif","jpg","jpeg","m4a","m4b","m4v","mkv","mov","mp3","mp4",
"mpg","mpeg","nef","odp","ods","odt","oga","ogg","ogv","opus","pdf","png","ppt","pptx","psd", "mpg","mpeg","nef","odp","ods","odt","oga","ogg","ogv","opus","pdf","png","ppt","pptx","psd",
"raf", "rm","svg","tga","tif","tiff", "ts", "vob","wav","webm","webp","wma","wmv","xls","xlsx" "raf", "rm","svg","tga","tif","tiff", "ts", "vob","wav","webm","webp","wma","wmv","xls","xlsx"
}; };
public static string GetExtensionCategory(string extension) public static string GetExtensionCategory(string extension)
{ {
switch (extension) switch (extension)
{ {
case "aac": case "aac":
case "aiff": case "aiff":
case "ape": case "ape":
case "cda": case "cda":
case "flac": case "flac":
case "mp3": case "mp3":
case "m4a": case "m4a":
case "m4b": case "m4b":
case "oga": case "oga":
case "ogg": case "ogg":
case "opus": case "opus":
case "wav": case "wav":
case "wma": case "wma":
return InputCategoryNames.Audio; return InputCategoryNames.Audio;
case "3gp": case "3gp":
case "3gpp": case "3gpp":
case "avi": case "avi":
case "bik": case "bik":
case "flv": case "flv":
case "m4v": case "m4v":
case "mp4": case "mp4":
case "mpg": case "mpg":
case "mpeg": case "mpeg":
case "mov": case "mov":
case "mkv": case "mkv":
case "ogv": case "ogv":
case "rm": case "rm":
case "ts": case "ts":
case "vob": case "vob":
case "webm": case "webm":
case "wmv": case "wmv":
return InputCategoryNames.Video; return InputCategoryNames.Video;
case "arw": case "arw":
case "bmp": case "bmp":
case "cr2": case "cr2":
case "dds": case "dds":
case "dng": case "dng":
case "exr": case "exr":
case "heic": case "heic":
case "ico": case "ico":
case "jfif": case "jfif":
case "jpg": case "jpg":
case "jpeg": case "jpeg":
case "nef": case "nef":
case "png": case "png":
case "psd": case "psd":
case "raf": case "raf":
case "tga": case "tga":
case "tif": case "tif":
case "tiff": case "tiff":
case "svg": case "svg":
case "xcf": case "xcf":
case "webp": case "webp":
return InputCategoryNames.Image; return InputCategoryNames.Image;
case "gif": case "gif":
return InputCategoryNames.AnimatedImage; return InputCategoryNames.AnimatedImage;
case "pdf": case "pdf":
case "doc": case "doc":
case "docx": case "docx":
case "ppt": case "ppt":
case "pptx": case "pptx":
case "odp": case "odp":
case "ods": case "ods":
case "odt": case "odt":
case "xls": case "xls":
case "xlsx": case "xlsx":
return InputCategoryNames.Document; return InputCategoryNames.Document;
} }
return InputCategoryNames.Misc; return InputCategoryNames.Misc;
} }
public static bool RegisterShellExtension(string shellExtensionPath) public static bool RegisterShellExtension(string shellExtensionPath)
{ {
if (!Application.IsInAdmininstratorPrivileges) if (!Application.IsInAdmininstratorPrivileges)
{ {
Diagnostics.Debug.LogError("File Converter needs administrator privileges to register the shell extension."); Diagnostics.Debug.LogError("File Converter needs administrator privileges to register the shell extension.");
return false; return false;
} }
if (!File.Exists(shellExtensionPath)) if (!File.Exists(shellExtensionPath))
{ {
Diagnostics.Debug.LogError($"Shell extension {shellExtensionPath} does not exists."); Diagnostics.Debug.LogError($"Shell extension {shellExtensionPath} does not exists.");
return false; return false;
} }
Diagnostics.Debug.Log($"Install and register shell extension: {shellExtensionPath}."); Diagnostics.Debug.Log($"Install and register shell extension: {shellExtensionPath}.");
var regasm = new RegAsm(); var regasm = new RegAsm();
var success = regasm.Register64(shellExtensionPath, true); var success = regasm.Register64(shellExtensionPath, true);
if (success) if (success)
{ {
Diagnostics.Debug.Log($"{shellExtensionPath} installed and registered."); Diagnostics.Debug.Log($"{shellExtensionPath} installed and registered.");
Diagnostics.Debug.Log(regasm.StandardOutput); Diagnostics.Debug.Log(regasm.StandardOutput);
return true; return true;
} }
else else
{ {
Diagnostics.Debug.LogError(errorCode: 0x05, $"{shellExtensionPath} failed to register."); Diagnostics.Debug.LogError(errorCode: 0x05, $"{shellExtensionPath} failed to register.");
Diagnostics.Debug.LogError(regasm.StandardError); Diagnostics.Debug.LogError(regasm.StandardError);
return false; return false;
} }
} }
public static bool UnregisterExtension(string shellExtensionPath) public static bool UnregisterExtension(string shellExtensionPath)
{ {
if (!Application.IsInAdmininstratorPrivileges) if (!Application.IsInAdmininstratorPrivileges)
{ {
Diagnostics.Debug.LogError("File Converter needs administrator privileges to unregister the shell extension."); Diagnostics.Debug.LogError("File Converter needs administrator privileges to unregister the shell extension.");
return false; return false;
} }
if (!File.Exists(shellExtensionPath)) if (!File.Exists(shellExtensionPath))
{ {
Diagnostics.Debug.LogError($"Shell extension {shellExtensionPath} does not exists."); Diagnostics.Debug.LogError($"Shell extension {shellExtensionPath} does not exists.");
return false; return false;
} }
Diagnostics.Debug.Log($"Unregister and uninstall shell extension: {shellExtensionPath}."); Diagnostics.Debug.Log($"Unregister and uninstall shell extension: {shellExtensionPath}.");
var regasm = new RegAsm(); var regasm = new RegAsm();
var success = regasm.Unregister64(shellExtensionPath); var success = regasm.Unregister64(shellExtensionPath);
if (success) if (success)
{ {
Diagnostics.Debug.Log($"{shellExtensionPath} uninstalled."); Diagnostics.Debug.Log($"{shellExtensionPath} uninstalled.");
Diagnostics.Debug.Log(regasm.StandardOutput); Diagnostics.Debug.Log(regasm.StandardOutput);
return true; return true;
} }
else else
{ {
Diagnostics.Debug.LogError(errorCode: 0x05, $"{shellExtensionPath} failed to uninstall."); Diagnostics.Debug.LogError(errorCode: 0x05, $"{shellExtensionPath} failed to uninstall.");
Diagnostics.Debug.LogError(regasm.StandardError); Diagnostics.Debug.LogError(regasm.StandardError);
return false; return false;
} }
} }
public static IEnumerable<CultureInfo> GetSupportedCultures() public static IEnumerable<CultureInfo> GetSupportedCultures()
{ {
// Get all cultures. // Get all cultures.
CultureInfo[] cultures = CultureInfo.GetCultures(CultureTypes.AllCultures); CultureInfo[] cultures = CultureInfo.GetCultures(CultureTypes.AllCultures);
// Find the location where application installed. // Find the location where application installed.
string exeLocation = Path.GetDirectoryName(Uri.UnescapeDataString(new UriBuilder(Assembly.GetExecutingAssembly().CodeBase).Path)); string exeLocation = Path.GetDirectoryName(Uri.UnescapeDataString(new UriBuilder(Assembly.GetExecutingAssembly().CodeBase).Path));
// Return all culture for which satellite folder found with culture code. // Return all culture for which satellite folder found with culture code.
foreach (CultureInfo cultureInfo in cultures) foreach (CultureInfo cultureInfo in cultures)
{ {
if (!string.IsNullOrEmpty(cultureInfo.Name) && Directory.Exists(Path.Combine(exeLocation, "Languages", cultureInfo.Name))) if (!string.IsNullOrEmpty(cultureInfo.Name) && Directory.Exists(Path.Combine(exeLocation, "Languages", cultureInfo.Name)))
{ {
yield return cultureInfo; yield return cultureInfo;
} }
} }
} }
public static bool IsOutputTypeCompatibleWithCategory(OutputType outputType, string category) public static bool IsOutputTypeCompatibleWithCategory(OutputType outputType, string category)
{ {
if (category == InputCategoryNames.Misc) if (category == InputCategoryNames.Misc)
{ {
// Misc category contains unsorted input extensions, so we consider that they are compatible to be tolerant. // Misc category contains unsorted input extensions, so we consider that they are compatible to be tolerant.
return true; return true;
} }
switch (outputType) switch (outputType)
{ {
case OutputType.Aac: case OutputType.Aac:
case OutputType.Flac: case OutputType.Flac:
case OutputType.Mp3: case OutputType.Mp3:
case OutputType.Ogg: case OutputType.Ogg:
case OutputType.Wav: case OutputType.Wav:
return category == InputCategoryNames.Audio || category == InputCategoryNames.Video; return category == InputCategoryNames.Audio || category == InputCategoryNames.Video;
case OutputType.Avi: case OutputType.Avi:
case OutputType.Mkv: case OutputType.Mkv:
case OutputType.Mp4: case OutputType.Mp4:
case OutputType.Ogv: case OutputType.Ogv:
case OutputType.Webm: case OutputType.Webm:
return category == InputCategoryNames.Video || category == InputCategoryNames.AnimatedImage; return category == InputCategoryNames.Video || category == InputCategoryNames.AnimatedImage;
case OutputType.Ico: case OutputType.Ico:
case OutputType.Jpg: case OutputType.Jpg:
case OutputType.Png: case OutputType.Png:
case OutputType.Webp: case OutputType.Webp:
return category == InputCategoryNames.Image || category == InputCategoryNames.Document || category == InputCategoryNames.AnimatedImage; return category == InputCategoryNames.Image || category == InputCategoryNames.Document || category == InputCategoryNames.AnimatedImage;
case OutputType.Gif: case OutputType.Gif:
return category == InputCategoryNames.Image || category == InputCategoryNames.Video || category == InputCategoryNames.AnimatedImage; return category == InputCategoryNames.Image || category == InputCategoryNames.Video || category == InputCategoryNames.AnimatedImage;
case OutputType.Pdf: case OutputType.Pdf:
return category == InputCategoryNames.Image || category == InputCategoryNames.Document; return category == InputCategoryNames.Image || category == InputCategoryNames.Document;
default: default:
return false; return false;
} }
} }
public static Thread InstantiateThread(string name, ThreadStart threadStart) public static Thread InstantiateThread(string name, ThreadStart threadStart)
{ {
ISettingsService settingsService = Ioc.Default.GetRequiredService<ISettingsService>(); ISettingsService settingsService = Ioc.Default.GetRequiredService<ISettingsService>();
CultureInfo currentCulture = settingsService?.Settings?.ApplicationLanguage; CultureInfo currentCulture = settingsService?.Settings?.ApplicationLanguage;
Thread thread = new Thread(threadStart); Thread thread = new Thread(threadStart);
thread.Name = name; thread.Name = name;
if (currentCulture != null) if (currentCulture != null)
{ {
thread.CurrentCulture = currentCulture; thread.CurrentCulture = currentCulture;
thread.CurrentUICulture = currentCulture; thread.CurrentUICulture = currentCulture;
} }
return thread; return thread;
} }
public static Thread InstantiateThread(string name, ParameterizedThreadStart parameterizedThreadStart) public static Thread InstantiateThread(string name, ParameterizedThreadStart parameterizedThreadStart)
{ {
ISettingsService settingsService = Ioc.Default.GetRequiredService<ISettingsService>(); ISettingsService settingsService = Ioc.Default.GetRequiredService<ISettingsService>();
CultureInfo currentCulture = settingsService?.Settings?.ApplicationLanguage; CultureInfo currentCulture = settingsService?.Settings?.ApplicationLanguage;
Thread thread = new Thread(parameterizedThreadStart); Thread thread = new Thread(parameterizedThreadStart);
thread.Name = name; thread.Name = name;
if (currentCulture != null) if (currentCulture != null)
{ {
thread.CurrentCulture = currentCulture; thread.CurrentCulture = currentCulture;
thread.CurrentUICulture = currentCulture; thread.CurrentUICulture = currentCulture;
} }
return thread; return thread;
} }
/// <summary> /// <summary>
/// Check whether Microsoft office is available or not. /// Check whether Microsoft office is available or not.
/// </summary> /// </summary>
/// <param name="application">The office application name.</param> /// <param name="application">The office application name.</param>
/// <returns>Returns true if Office is installed on the computer.</returns> /// <returns>Returns true if Office is installed on the computer.</returns>
/// source: http://stackoverflow.com/questions/3266675/how-to-detect-installed-version-of-ms-office/3267832#3267832 /// source: http://stackoverflow.com/questions/3266675/how-to-detect-installed-version-of-ms-office/3267832#3267832
/// source: http://www.codeproject.com/Articles/26520/Getting-Office-s-Version /// source: http://www.codeproject.com/Articles/26520/Getting-Office-s-Version
public static bool IsMicrosoftOfficeApplicationAvailable(ConversionJobs.ConversionJob_Office.ApplicationName application) public static bool IsMicrosoftOfficeApplicationAvailable(ConversionJobs.ConversionJob_Office.ApplicationName application)
{ {
string registryKeyPattern = @"Software\Microsoft\Windows\CurrentVersion\App Paths\"; string registryKeyPattern = @"Software\Microsoft\Windows\CurrentVersion\App Paths\";
switch (application) switch (application)
{ {
case ConversionJob_Office.ApplicationName.Word: case ConversionJob_Office.ApplicationName.Word:
registryKeyPattern += "winword.exe"; registryKeyPattern += "winword.exe";
break; break;
case ConversionJob_Office.ApplicationName.PowerPoint: case ConversionJob_Office.ApplicationName.PowerPoint:
registryKeyPattern += "powerpnt.exe"; registryKeyPattern += "powerpnt.exe";
break; break;
case ConversionJob_Office.ApplicationName.Excel: case ConversionJob_Office.ApplicationName.Excel:
registryKeyPattern += "excel.exe"; registryKeyPattern += "excel.exe";
break; break;
case ConversionJob_Office.ApplicationName.None: case ConversionJob_Office.ApplicationName.None:
return false; return false;
} }
// Looks inside CURRENT_USER. // Looks inside CURRENT_USER.
RegistryKey winwordKey = Microsoft.Win32.Registry.CurrentUser.OpenSubKey(registryKeyPattern, false); RegistryKey winwordKey = Microsoft.Win32.Registry.CurrentUser.OpenSubKey(registryKeyPattern, false);
if (winwordKey != null) if (winwordKey != null)
{ {
string winwordPath = winwordKey.GetValue(string.Empty).ToString(); string winwordPath = winwordKey.GetValue(string.Empty).ToString();
if (!string.IsNullOrEmpty(winwordPath)) if (!string.IsNullOrEmpty(winwordPath))
{ {
return true; return true;
} }
} }
// If not found, looks inside LOCAL_MACHINE. // If not found, looks inside LOCAL_MACHINE.
winwordKey = Microsoft.Win32.Registry.LocalMachine.OpenSubKey(registryKeyPattern, false); winwordKey = Microsoft.Win32.Registry.LocalMachine.OpenSubKey(registryKeyPattern, false);
if (winwordKey != null) if (winwordKey != null)
{ {
string winwordPath = winwordKey.GetValue(string.Empty).ToString(); string winwordPath = winwordKey.GetValue(string.Empty).ToString();
if (!string.IsNullOrEmpty(winwordPath)) if (!string.IsNullOrEmpty(winwordPath))
{ {
return true; return true;
} }
} }
return false; return false;
} }
public static ConversionJob_Office.ApplicationName GetOfficeApplicationCompatibleWithExtension(string extension) public static ConversionJob_Office.ApplicationName GetOfficeApplicationCompatibleWithExtension(string extension)
{ {
switch (extension) switch (extension)
{ {
case "doc": case "doc":
case "docx": case "docx":
case "odt": case "odt":
return ConversionJob_Office.ApplicationName.Word; return ConversionJob_Office.ApplicationName.Word;
case "ppt": case "ppt":
case "pptx": case "pptx":
case "odp": case "odp":
return ConversionJob_Office.ApplicationName.PowerPoint; return ConversionJob_Office.ApplicationName.PowerPoint;
case "ods": case "ods":
case "xls": case "xls":
case "xlsx": case "xlsx":
return ConversionJob_Office.ApplicationName.Excel; return ConversionJob_Office.ApplicationName.Excel;
} }
return ConversionJob_Office.ApplicationName.None; return ConversionJob_Office.ApplicationName.None;
} }
public static class InputCategoryNames public static class InputCategoryNames
{ {
public const string Audio = "Audio"; public const string Audio = "Audio";
public const string Video = "Video"; public const string Video = "Video";
public const string Image = "Image"; public const string Image = "Image";
public const string AnimatedImage = "Animated Image"; public const string AnimatedImage = "Animated Image";
public const string Document = "Document"; public const string Document = "Document";
public const string Misc = "Misc"; public const string Misc = "Misc";
} }
public enum HardwareAccelerationMode public enum HardwareAccelerationMode
{ {
Off, Off,
CUDA CUDA
} }
} }
} }

View File

@ -10,7 +10,7 @@ using System.Windows;
[assembly: AssemblyConfiguration("")] [assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("")] [assembly: AssemblyCompany("")]
[assembly: AssemblyProduct("FileConverter")] [assembly: AssemblyProduct("FileConverter")]
[assembly: AssemblyCopyright("Copyright © 2024")] [assembly: AssemblyCopyright("Copyright © 2025")]
[assembly: AssemblyTrademark("")] [assembly: AssemblyTrademark("")]
[assembly: AssemblyCulture("")] [assembly: AssemblyCulture("")]

View File

@ -487,7 +487,7 @@
</Button> </Button>
</StackPanel> </StackPanel>
<Label Grid.Row="3" Grid.Column="0" Content="Copyright @ 2024, Adrien Allard. All right reserved." Foreground="{DynamicResource LighterForegroundBrush}" Margin="0,2,0,2"/> <Label Grid.Row="3" Grid.Column="0" Content="Copyright @ 2025, Adrien Allard. All right reserved." Foreground="{DynamicResource LighterForegroundBrush}" Margin="0,2,0,2"/>
</Grid> </Grid>
</TabItem> </TabItem>
</TabControl> </TabControl>

View File

@ -9,7 +9,7 @@ using System.Runtime.InteropServices;
[assembly: AssemblyConfiguration("")] [assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("")] [assembly: AssemblyCompany("")]
[assembly: AssemblyProduct("FileConverterExtension")] [assembly: AssemblyProduct("FileConverterExtension")]
[assembly: AssemblyCopyright("Copyright © 2024")] [assembly: AssemblyCopyright("Copyright © 2025")]
[assembly: AssemblyTrademark("")] [assembly: AssemblyTrademark("")]
[assembly: AssemblyCulture("")] [assembly: AssemblyCulture("")]