diff --git a/justfile b/justfile index 485fc5b7f..20f2a5bf8 100644 --- a/justfile +++ b/justfile @@ -55,11 +55,11 @@ tr1-build-win-installer: (tr1-image-win-installer "0") (_docker_run "r tr1-package-linux target='release': (tr1-build-linux target) (_docker_run "rrdash/tr1x-linux" "package") tr1-package-win target='release': (tr1-build-win target) (_docker_run "rrdash/tr1x" "package") tr1-package-win-all target='release': (tr1-build-win target) (tr1-build-win-config) (_docker_run "rrdash/tr1x" "package") -tr1-package-win-installer target='release': (tr1-build-win target) (tr1-build-win-config) (_docker_run "rrdash/tr1x" "package" "-o" "tools/tr1/installer/Installer/Resources/release.zip") (tr1-build-win-installer) +tr1-package-win-installer target='release': (tr1-build-win target) (tr1-build-win-config) (_docker_run "rrdash/tr1x" "package" "-o" "tools/installer/TR1X_Installer/Resources/release.zip") (tr1-build-win-installer) #!/bin/sh - git checkout "tools/tr1/installer/Installer/Resources/release.zip" + git checkout "tools/installer/TR1X_Installer/Resources/release.zip" exe_name=TR1X-$(tools/get_version 1)-Installer.exe - cp tools/tr1/installer/out/TR1X_Installer.exe "${exe_name}" + cp tools/installer/out/TR1X_Installer.exe "${exe_name}" echo "Created ${exe_name}" tr2-image-linux force="1": (_docker_build "tools/tr2/docker/game-linux/Dockerfile" "rrdash/tr2x-linux" force) diff --git a/tools/installer/TR1X_Installer/App.xaml b/tools/installer/TR1X_Installer/App.xaml new file mode 100644 index 000000000..ebf518429 --- /dev/null +++ b/tools/installer/TR1X_Installer/App.xaml @@ -0,0 +1,4 @@ + diff --git a/tools/installer/TR1X_Installer/App.xaml.cs b/tools/installer/TR1X_Installer/App.xaml.cs new file mode 100644 index 000000000..05615d2ef --- /dev/null +++ b/tools/installer/TR1X_Installer/App.xaml.cs @@ -0,0 +1,22 @@ +using System.Windows; +using TR1X_Installer.Installers; +using TRX_InstallerLib.Controls; +using TRX_InstallerLib.Installers; + +namespace TR1X_Installer; + +public partial class App : Application +{ + public App() + { + Current.MainWindow = new TRXInstallWindow(new List + { + new SteamInstallSource(), + new GOGInstallSource(), + new TombATIInstallSource(), + new CDRomInstallSource(), + new TR1XInstallSource(), + }); + Current.MainWindow.Show(); + } +} diff --git a/tools/tr1/installer/Installer/Installers/CDRomInstallSource.cs b/tools/installer/TR1X_Installer/Installers/CDRomInstallSource.cs similarity index 87% rename from tools/tr1/installer/Installer/Installers/CDRomInstallSource.cs rename to tools/installer/TR1X_Installer/Installers/CDRomInstallSource.cs index 9080bdfcc..9d94d9e8b 100644 --- a/tools/tr1/installer/Installer/Installers/CDRomInstallSource.cs +++ b/tools/installer/TR1X_Installer/Installers/CDRomInstallSource.cs @@ -1,10 +1,9 @@ -using System; -using System.Collections.Generic; -using System.IO; +using System.IO; using System.Text.RegularExpressions; -using System.Threading.Tasks; +using TRX_InstallerLib.Installers; +using TRX_InstallerLib.Utils; -namespace Installer.Installers; +namespace TR1X_Installer.Installers; public class CDRomInstallSource : BaseInstallSource { @@ -47,7 +46,7 @@ public class CDRomInstallSource : BaseInstallSource return true; } - public override bool IsDownloadingUnfinishedBusinessNeeded(string sourceDirectory) + public override bool IsDownloadingExpansionNeeded(string sourceDirectory) { return true; } diff --git a/tools/tr1/installer/Installer/Installers/GOGInstallSource.cs b/tools/installer/TR1X_Installer/Installers/GOGInstallSource.cs similarity index 81% rename from tools/tr1/installer/Installer/Installers/GOGInstallSource.cs rename to tools/installer/TR1X_Installer/Installers/GOGInstallSource.cs index 7c0f5dd5f..e56b2ca10 100644 --- a/tools/tr1/installer/Installer/Installers/GOGInstallSource.cs +++ b/tools/installer/TR1X_Installer/Installers/GOGInstallSource.cs @@ -1,15 +1,13 @@ using DiscUtils.Iso9660; using DiscUtils.Streams; -using Installer.Utils; using Microsoft.Win32; -using System; -using System.Collections.Generic; using System.IO; -using System.Linq; using System.Text.RegularExpressions; -using System.Threading.Tasks; +using TRX_InstallerLib.Installers; +using TRX_InstallerLib.Models; +using TRX_InstallerLib.Utils; -namespace Installer.Installers; +namespace TR1X_Installer.Installers; public class GOGInstallSource : BaseInstallSource { @@ -50,7 +48,7 @@ public class GOGInstallSource : BaseInstallSource } catch (Exception e) { - throw new ApplicationException($"Could not read CUE {cuePath}:\n{e.Message}"); + throw new ApplicationException(string.Format(Language.Instance.Controls!["progress_cue_failure"], cuePath, e.Message)); } try @@ -60,7 +58,7 @@ public class GOGInstallSource : BaseInstallSource } catch (Exception e) { - throw new ApplicationException($"Could not convert BIN to ISO: {e.Message}"); + throw new ApplicationException(string.Format(Language.Instance.Controls!["progress_converting_bin_failure"], e.Message)); } try @@ -73,14 +71,14 @@ public class GOGInstallSource : BaseInstallSource { MaximumValue = 1, CurrentValue = 0, - Description = "Scanning the source directory", + Description = Language.Instance.Controls!["progress_scanning_source"], }); var filesToExtract = GetFilesToExtract(reader.Root); progress.Report(new InstallProgress { MaximumValue = filesToExtract.Count(), CurrentValue = 0, - Description = "Preparing to extract the ISO", + Description = Language.Instance.Controls!["progress_preparing_extract"], }); foreach (var path in filesToExtract) { @@ -90,7 +88,7 @@ public class GOGInstallSource : BaseInstallSource Directory.CreateDirectory(Path.GetDirectoryName(targetPath)!); using SparseStream sourceStream = reader.OpenFile(path, FileMode.Open, FileAccess.Read); - var readAllByte = new Byte[sourceStream.Length]; + var readAllByte = new byte[sourceStream.Length]; sourceStream.Read(readAllByte, 0, readAllByte.Length); using FileStream targetStream = new(targetPath, FileMode.Create); @@ -102,13 +100,13 @@ public class GOGInstallSource : BaseInstallSource { MaximumValue = filesToExtract.Count(), CurrentValue = ++currentProgress, - Description = $"Extracting {path}", + Description = string.Format(Language.Instance.Controls!["progress_extracting"], path) }); } } catch (Exception e) { - throw new ApplicationException($"Could not open converted ISO: {e.Message}"); + throw new ApplicationException(string.Format(Language.Instance.Controls!["progress_converting_iso_failure"], e.Message)); } File.Delete(isoPath); @@ -121,7 +119,7 @@ public class GOGInstallSource : BaseInstallSource return true; } - public override bool IsDownloadingUnfinishedBusinessNeeded(string sourceDirectory) + public override bool IsDownloadingExpansionNeeded(string sourceDirectory) { return true; } diff --git a/tools/tr1/installer/Installer/Installers/SteamInstallSource.cs b/tools/installer/TR1X_Installer/Installers/SteamInstallSource.cs similarity index 91% rename from tools/tr1/installer/Installer/Installers/SteamInstallSource.cs rename to tools/installer/TR1X_Installer/Installers/SteamInstallSource.cs index b2c8017ba..03a12edbe 100644 --- a/tools/tr1/installer/Installer/Installers/SteamInstallSource.cs +++ b/tools/installer/TR1X_Installer/Installers/SteamInstallSource.cs @@ -1,8 +1,7 @@ using Microsoft.Win32; -using System.Collections.Generic; using System.IO; -namespace Installer.Installers; +namespace TR1X_Installer.Installers; public class SteamInstallSource : GOGInstallSource { diff --git a/tools/tr1/installer/Installer/Installers/TR1XInstallSource.cs b/tools/installer/TR1X_Installer/Installers/TR1XInstallSource.cs similarity index 83% rename from tools/tr1/installer/Installer/Installers/TR1XInstallSource.cs rename to tools/installer/TR1X_Installer/Installers/TR1XInstallSource.cs index c91d38945..2ea7f6d94 100644 --- a/tools/tr1/installer/Installer/Installers/TR1XInstallSource.cs +++ b/tools/installer/TR1X_Installer/Installers/TR1XInstallSource.cs @@ -1,10 +1,9 @@ -using System; -using System.Collections.Generic; using System.IO; using System.Text.RegularExpressions; -using System.Threading.Tasks; +using TRX_InstallerLib.Installers; +using TRX_InstallerLib.Utils; -namespace Installer.Installers; +namespace TR1X_Installer.Installers; public class TR1XInstallSource : BaseInstallSource { @@ -27,10 +26,7 @@ public class TR1XInstallSource : BaseInstallSource public override string SuggestedInstallationDirectory { - get - { - return InstallUtils.GetPreviousInstallationPath() ?? base.SuggestedInstallationDirectory; - } + get => InstallUtils.GetPreviousInstallationPath() ?? base.SuggestedInstallationDirectory; } public override bool IsImportingSavesSupported => true; @@ -57,7 +53,7 @@ public class TR1XInstallSource : BaseInstallSource return !Directory.Exists(Path.Combine(sourceDirectory, "music")); } - public override bool IsDownloadingUnfinishedBusinessNeeded(string sourceDirectory) + public override bool IsDownloadingExpansionNeeded(string sourceDirectory) { return !File.Exists(Path.Combine(sourceDirectory, "data", "cat.phd")); } diff --git a/tools/tr1/installer/Installer/Installers/TombATIInstallSource.cs b/tools/installer/TR1X_Installer/Installers/TombATIInstallSource.cs similarity index 89% rename from tools/tr1/installer/Installer/Installers/TombATIInstallSource.cs rename to tools/installer/TR1X_Installer/Installers/TombATIInstallSource.cs index f668465bb..7d1cc8335 100644 --- a/tools/tr1/installer/Installer/Installers/TombATIInstallSource.cs +++ b/tools/installer/TR1X_Installer/Installers/TombATIInstallSource.cs @@ -1,10 +1,9 @@ -using System; -using System.Collections.Generic; using System.IO; using System.Text.RegularExpressions; -using System.Threading.Tasks; +using TRX_InstallerLib.Installers; +using TRX_InstallerLib.Utils; -namespace Installer.Installers; +namespace TR1X_Installer.Installers; public class TombATIInstallSource : BaseInstallSource { @@ -48,7 +47,7 @@ public class TombATIInstallSource : BaseInstallSource return !Directory.Exists(Path.Combine(sourceDirectory, "music")); } - public override bool IsDownloadingUnfinishedBusinessNeeded(string sourceDirectory) + public override bool IsDownloadingExpansionNeeded(string sourceDirectory) { return !File.Exists(Path.Combine(sourceDirectory, "data", "cat.phd")); } diff --git a/tools/tr1/installer/Installer/Resources/CDRom.png b/tools/installer/TR1X_Installer/Resources/CDRom.png similarity index 100% rename from tools/tr1/installer/Installer/Resources/CDRom.png rename to tools/installer/TR1X_Installer/Resources/CDRom.png diff --git a/tools/tr1/installer/Installer/Resources/GOG.png b/tools/installer/TR1X_Installer/Resources/GOG.png similarity index 100% rename from tools/tr1/installer/Installer/Resources/GOG.png rename to tools/installer/TR1X_Installer/Resources/GOG.png diff --git a/tools/installer/TR1X_Installer/Resources/Lang/en.json b/tools/installer/TR1X_Installer/Resources/Lang/en.json new file mode 100644 index 000000000..5eec7f72f --- /dev/null +++ b/tools/installer/TR1X_Installer/Resources/Lang/en.json @@ -0,0 +1,12 @@ +{ + "Controls": { + "window_title_main": "TR1X Installer", + "step_source_content": "TR1X requires original game files to run.\nPlease choose the source location where to install the data files from.\nIf you're upgrading an existing installation, please choose TR1X.", + "step_settings_music_content": "Neither the Steam nor GOG versions of the game ship with the full soundtrack found on the PlayStation or Saturn retail releases. This option lets you download the missing tracks automatically (164 MB). The legality of these files is disputable; the most legal way to import the music to PC is to rip the audio tracks yourself from a physical PlayStation or Saturn disc.", + "step_settings_expansion_heading": "Download Unfinished Business expansion pack", + "step_settings_expansion_content": "The Unfinished Business expansion pack was made freeware. However, the Steam and GOG versions do not ship it. This option lets you download the expansion files automatically (6 MB).", + "step_settings_expansion_music": "Fan-made edition (includes music triggers)", + "step_settings_expansion_vanilla": "Original edition (does not include music triggers)", + "step_settings_saves_content": "Imports existing savegame files. Only TombATI and TR1X savegame format is supported at this time." + } +} diff --git a/tools/tr1/installer/Installer/Resources/Steam.png b/tools/installer/TR1X_Installer/Resources/Steam.png similarity index 100% rename from tools/tr1/installer/Installer/Resources/Steam.png rename to tools/installer/TR1X_Installer/Resources/Steam.png diff --git a/tools/tr1/installer/Installer/Resources/TR1X.png b/tools/installer/TR1X_Installer/Resources/TR1X.png similarity index 100% rename from tools/tr1/installer/Installer/Resources/TR1X.png rename to tools/installer/TR1X_Installer/Resources/TR1X.png diff --git a/tools/tr1/installer/Installer/Resources/TombATI.png b/tools/installer/TR1X_Installer/Resources/TombATI.png similarity index 100% rename from tools/tr1/installer/Installer/Resources/TombATI.png rename to tools/installer/TR1X_Installer/Resources/TombATI.png diff --git a/tools/installer/TR1X_Installer/Resources/const.json b/tools/installer/TR1X_Installer/Resources/const.json new file mode 100644 index 000000000..65b48f7f1 --- /dev/null +++ b/tools/installer/TR1X_Installer/Resources/const.json @@ -0,0 +1,4 @@ +{ + "Game": "TR1X", + "AllowExpansionTypeSelection": true +} diff --git a/tools/tr1/installer/Installer/Resources/icon.ico b/tools/installer/TR1X_Installer/Resources/icon.ico similarity index 100% rename from tools/tr1/installer/Installer/Resources/icon.ico rename to tools/installer/TR1X_Installer/Resources/icon.ico diff --git a/tools/tr1/installer/Installer/Resources/release.zip b/tools/installer/TR1X_Installer/Resources/release.zip similarity index 100% rename from tools/tr1/installer/Installer/Resources/release.zip rename to tools/installer/TR1X_Installer/Resources/release.zip diff --git a/tools/tr1/installer/Installer/Resources/side1.jpg b/tools/installer/TR1X_Installer/Resources/side1.jpg similarity index 100% rename from tools/tr1/installer/Installer/Resources/side1.jpg rename to tools/installer/TR1X_Installer/Resources/side1.jpg diff --git a/tools/tr1/installer/Installer/Resources/side2.jpg b/tools/installer/TR1X_Installer/Resources/side2.jpg similarity index 100% rename from tools/tr1/installer/Installer/Resources/side2.jpg rename to tools/installer/TR1X_Installer/Resources/side2.jpg diff --git a/tools/tr1/installer/Installer/Resources/side3.jpg b/tools/installer/TR1X_Installer/Resources/side3.jpg similarity index 100% rename from tools/tr1/installer/Installer/Resources/side3.jpg rename to tools/installer/TR1X_Installer/Resources/side3.jpg diff --git a/tools/tr1/installer/Installer/Resources/side4.jpg b/tools/installer/TR1X_Installer/Resources/side4.jpg similarity index 100% rename from tools/tr1/installer/Installer/Resources/side4.jpg rename to tools/installer/TR1X_Installer/Resources/side4.jpg diff --git a/tools/installer/TR1X_Installer/TR1X_Installer.csproj b/tools/installer/TR1X_Installer/TR1X_Installer.csproj new file mode 100644 index 000000000..cb8b6781e --- /dev/null +++ b/tools/installer/TR1X_Installer/TR1X_Installer.csproj @@ -0,0 +1,56 @@ + + + WinExe + net6.0-windows + enable + enable + true + false + + true + TR1X_Installer + True + true + true + false + true + false + false + win-x64 + Resources\icon.ico + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tools/installer/TRX_InstallerLib.sln b/tools/installer/TRX_InstallerLib.sln index 087f2e568..c48ed6325 100644 --- a/tools/installer/TRX_InstallerLib.sln +++ b/tools/installer/TRX_InstallerLib.sln @@ -5,6 +5,8 @@ VisualStudioVersion = 17.11.35219.272 MinimumVisualStudioVersion = 10.0.40219.1 Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "TRX_InstallerLib", "TRX_InstallerLib\TRX_InstallerLib.csproj", "{27F08E8C-2910-4682-B8BC-96ED4C1ECE54}" EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "TR1X_Installer", "TR1X_Installer\TR1X_Installer.csproj", "{5B32640D-3997-472F-A1BA-FCE4128E0688}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -15,6 +17,10 @@ Global {27F08E8C-2910-4682-B8BC-96ED4C1ECE54}.Debug|Any CPU.Build.0 = Debug|Any CPU {27F08E8C-2910-4682-B8BC-96ED4C1ECE54}.Release|Any CPU.ActiveCfg = Release|Any CPU {27F08E8C-2910-4682-B8BC-96ED4C1ECE54}.Release|Any CPU.Build.0 = Release|Any CPU + {5B32640D-3997-472F-A1BA-FCE4128E0688}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {5B32640D-3997-472F-A1BA-FCE4128E0688}.Debug|Any CPU.Build.0 = Debug|Any CPU + {5B32640D-3997-472F-A1BA-FCE4128E0688}.Release|Any CPU.ActiveCfg = Release|Any CPU + {5B32640D-3997-472F-A1BA-FCE4128E0688}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE diff --git a/tools/installer/TRX_InstallerLib/Controls/InstallStepControl.xaml.cs b/tools/installer/TRX_InstallerLib/Controls/InstallStepControl.xaml.cs index 1dca0228e..55cd53812 100644 --- a/tools/installer/TRX_InstallerLib/Controls/InstallStepControl.xaml.cs +++ b/tools/installer/TRX_InstallerLib/Controls/InstallStepControl.xaml.cs @@ -1,5 +1,4 @@ -using Installer.Models; -using System.Windows; +using System.Windows; using TRX_InstallerLib.Models; using WC = System.Windows.Controls; diff --git a/tools/installer/TRX_InstallerLib/Models/InstallStep.cs b/tools/installer/TRX_InstallerLib/Models/InstallStep.cs index 3ebadfbca..175fa1b60 100644 --- a/tools/installer/TRX_InstallerLib/Models/InstallStep.cs +++ b/tools/installer/TRX_InstallerLib/Models/InstallStep.cs @@ -1,4 +1,3 @@ -using Installer.Models; using TRX_InstallerLib.Installers; using TRX_InstallerLib.Utils; diff --git a/tools/installer/TRX_InstallerLib/Models/Logger.cs b/tools/installer/TRX_InstallerLib/Models/Logger.cs index 0c25c9318..3a3a7b622 100644 --- a/tools/installer/TRX_InstallerLib/Models/Logger.cs +++ b/tools/installer/TRX_InstallerLib/Models/Logger.cs @@ -1,4 +1,4 @@ -namespace Installer.Models; +namespace TRX_InstallerLib.Models; public class LogEventArgs { diff --git a/tools/installer/TRX_InstallerLib/TRX_InstallerLib.csproj b/tools/installer/TRX_InstallerLib/TRX_InstallerLib.csproj index 238366c20..478161f7d 100644 --- a/tools/installer/TRX_InstallerLib/TRX_InstallerLib.csproj +++ b/tools/installer/TRX_InstallerLib/TRX_InstallerLib.csproj @@ -6,21 +6,23 @@ true enable false + true + + + + + - - - - - - - + MSBuild:Compile + + diff --git a/tools/tr1/docker/installer/entrypoint.sh b/tools/tr1/docker/installer/entrypoint.sh index fdd1be54f..45126b19f 100755 --- a/tools/tr1/docker/installer/entrypoint.sh +++ b/tools/tr1/docker/installer/entrypoint.sh @@ -2,11 +2,11 @@ set -x set -e -cd /app/tools/tr1/installer/ +cd /app/tools/installer/ export DOTNET_CLI_HOME="/tmp/DOTNET_CLI_HOME" shopt -s globstar rm -rf **/bin **/obj **/out/* dotnet restore -dotnet publish -c Release -o out +dotnet publish TR1X_Installer -c Release -o out diff --git a/tools/tr1/installer/.gitignore b/tools/tr1/installer/.gitignore deleted file mode 100644 index e76c073eb..000000000 --- a/tools/tr1/installer/.gitignore +++ /dev/null @@ -1,3 +0,0 @@ -bin/ -obj/ -out/ diff --git a/tools/tr1/installer/Installer/App.xaml b/tools/tr1/installer/Installer/App.xaml deleted file mode 100644 index 72af0457e..000000000 --- a/tools/tr1/installer/Installer/App.xaml +++ /dev/null @@ -1,8 +0,0 @@ - - - - - diff --git a/tools/tr1/installer/Installer/App.xaml.cs b/tools/tr1/installer/Installer/App.xaml.cs deleted file mode 100644 index 88e5206ff..000000000 --- a/tools/tr1/installer/Installer/App.xaml.cs +++ /dev/null @@ -1,12 +0,0 @@ -using System.Windows; - -namespace Installer -{ - public partial class App : Application - { - public App() - { - InitializeComponent(); - } - } -} diff --git a/tools/tr1/installer/Installer/Controls/FinishStepControl.xaml b/tools/tr1/installer/Installer/Controls/FinishStepControl.xaml deleted file mode 100644 index ca8905a79..000000000 --- a/tools/tr1/installer/Installer/Controls/FinishStepControl.xaml +++ /dev/null @@ -1,34 +0,0 @@ - - - - - - - - - - - - Step 4: Done - - - - Installation complete. To configure more advanced features, you can edit the JSON files in the cfg/ directory with a text editor. - - - - Happy raiding :) - - - - - - diff --git a/tools/tr1/installer/Installer/Controls/FinishStepControl.xaml.cs b/tools/tr1/installer/Installer/Controls/FinishStepControl.xaml.cs deleted file mode 100644 index 4e49298de..000000000 --- a/tools/tr1/installer/Installer/Controls/FinishStepControl.xaml.cs +++ /dev/null @@ -1,11 +0,0 @@ -using System.Windows.Controls; - -namespace Installer.Controls; - -public partial class FinishStepControl : UserControl -{ - public FinishStepControl() - { - InitializeComponent(); - } -} diff --git a/tools/tr1/installer/Installer/Controls/InstallSettingsStepControl.xaml b/tools/tr1/installer/Installer/Controls/InstallSettingsStepControl.xaml deleted file mode 100644 index 55d1bc9af..000000000 --- a/tools/tr1/installer/Installer/Controls/InstallSettingsStepControl.xaml +++ /dev/null @@ -1,153 +0,0 @@ - - - - - - - - - - - - - - - - - Step 2: Installation options - - - - - - - - - - - - - - - - - - - - - - - - - - Download music tracks - - - - Neither the Steam nor GOG versions of the game ship with the - full soundtrack found on the PlayStation or Saturn retail - releases. This option lets you download the missing tracks - automatically (164 MB). The legality of these files is - disputable; the most legal way to import the music to PC is to - rip the audio tracks yourself from a physical PlayStation or - Saturn disc. - - - - - - - - - - - Download Unfinished Business expansion pack - - - - The Unfinished Business expansion pack was made freeware. However, the Steam and GOG versions do not ship it. This option lets you download the expansion files automatically (6 MB). - - - - - - - - - - Import saves - - - Imports existing savegame files. Only TombATI and TR1X savegame format is supported at this time. - - - - - - Create desktop shortcut - - - - - - - - - - -