Skip to content

Commit

Permalink
New: Improve openBVE installer (Thanks SysVR!)
Browse files Browse the repository at this point in the history
* Allows selection of all data folders.
* Bundles .Net runtime installer
[ci skip]
  • Loading branch information
leezer3 committed Jan 12, 2017
1 parent 069d7fc commit b18976f
Show file tree
Hide file tree
Showing 3 changed files with 239 additions and 25 deletions.
Binary file not shown.
8 changes: 8 additions & 0 deletions wininstaller/InstallerData/filesystem.cfg
@@ -0,0 +1,8 @@
Data = $[AssemblyFolder]\Data
Settings = $[ApplicationData]\openBVE\UserData\Settings
InitialRoute = $[AssemblyFolder]\UserData\LegacyContent\Railway\Route
InitialTrain = $[AssemblyFolder]\UserData\LegacyContent\Train
RoutePackageInstall=$[AssemblyFolder]\UserData\LegacyContent\Railway
TrainPackageInstall=$[AssemblyFolder]\UserData\LegacyContent\Train
RestartProcess = $[AssemblyFile]
RestartArguments =
256 changes: 231 additions & 25 deletions wininstaller/openbve.iss
Expand Up @@ -14,45 +14,251 @@
AppId={{D617A45D-C2F6-44D1-A85C-CA7FFA91F7FC}
AppName={#MyAppName}
AppVersion={#MyAppVersion}
;AppVerName={#MyAppName} {#MyAppVersion}
AppPublisher={#MyAppPublisher}
AppPublisherURL={#MyAppURL}
AppSupportURL={#MyAppURL}
AppUpdatesURL={#MyAppURL}
DefaultDirName={pf}\{#MyAppName}
DisableProgramGroupPage=yes
OutputBaseFilename=setup
Compression=lzma
DefaultGroupName={#MyAppName}
AllowNoIcons=yes
DisableDirPage=auto
DisableProgramGroupPage=auto
OutputBaseFilename={#MyAppName}-{#MyAppVersion}-setup
Compression=lzma2
SolidCompression=yes
WizardSmallImageFile=installer_logo.bmp

[Languages]
Name: "english"; MessagesFile: "compiler:Default.isl"
Name: "brazilianportuguese"; MessagesFile: "compiler:Languages\BrazilianPortuguese.isl"
Name: "catalan"; MessagesFile: "compiler:Languages\Catalan.isl"
Name: "corsican"; MessagesFile: "compiler:Languages\Corsican.isl"
Name: "czech"; MessagesFile: "compiler:Languages\Czech.isl"
Name: "danish"; MessagesFile: "compiler:Languages\Danish.isl"
Name: "dutch"; MessagesFile: "compiler:Languages\Dutch.isl"
Name: "finnish"; MessagesFile: "compiler:Languages\Finnish.isl"
Name: "french"; MessagesFile: "compiler:Languages\French.isl"
Name: "german"; MessagesFile: "compiler:Languages\German.isl"
Name: "greek"; MessagesFile: "compiler:Languages\Greek.isl"
Name: "hebrew"; MessagesFile: "compiler:Languages\Hebrew.isl"
Name: "hungarian"; MessagesFile: "compiler:Languages\Hungarian.isl"
Name: "italian"; MessagesFile: "compiler:Languages\Italian.isl"
Name: "japanese"; MessagesFile: "compiler:Languages\Japanese.isl"
Name: "norwegian"; MessagesFile: "compiler:Languages\Norwegian.isl"
Name: "polish"; MessagesFile: "compiler:Languages\Polish.isl"
Name: "portuguese"; MessagesFile: "compiler:Languages\Portuguese.isl"
Name: "russian"; MessagesFile: "compiler:Languages\Russian.isl"
Name: "scottishgaelic"; MessagesFile: "compiler:Languages\ScottishGaelic.isl"
Name: "serbiancyrillic"; MessagesFile: "compiler:Languages\SerbianCyrillic.isl"
Name: "serbianlatin"; MessagesFile: "compiler:Languages\SerbianLatin.isl"
Name: "slovenian"; MessagesFile: "compiler:Languages\Slovenian.isl"
Name: "spanish"; MessagesFile: "compiler:Languages\Spanish.isl"
Name: "turkish"; MessagesFile: "compiler:Languages\Turkish.isl"
Name: "ukrainian"; MessagesFile: "compiler:Languages\Ukrainian.isl"

[Tasks]
Name: "desktopicon"; Description: "{cm:CreateDesktopIcon}"; GroupDescription: "{cm:AdditionalIcons}"; Flags: unchecked
Name: "desktopicon"; Description: "{cm:CreateDesktopIcon}"; GroupDescription: "{cm:AdditionalIcons}"; Flags: checkablealone
Name: "desktopicon2"; Description: "Create a desktop shortcut to the openBVE Addons folder"; GroupDescription: "{cm:AdditionalIcons}"; Flags: checkablealone

[Files]
Source: "C:\Program Files (x86)\openBVE\OpenBve.exe"; DestDir: "{app}"; Flags: ignoreversion
Source: "C:\Program Files (x86)\openBVE\AtsPluginProxy.dll"; DestDir: "{app}"; Flags: ignoreversion
Source: "C:\Program Files (x86)\openBVE\CSScriptLibrary.dll"; DestDir: "{app}"; Flags: ignoreversion
Source: "C:\Program Files (x86)\openBVE\Mono.CSharp.dll"; DestDir: "{app}"; Flags: ignoreversion
Source: "C:\Program Files (x86)\openBVE\NUniversalCharDet.dll"; DestDir: "{app}"; Flags: ignoreversion
Source: "C:\Program Files (x86)\openBVE\OpenBve.exe"; DestDir: "{app}"; Flags: ignoreversion
Source: "C:\Program Files (x86)\openBVE\OpenBve.exe.config"; DestDir: "{app}"; Flags: ignoreversion
Source: "C:\Program Files (x86)\openBVE\OpenBve.exe.mdb"; DestDir: "{app}"; Flags: ignoreversion
Source: "C:\Program Files (x86)\openBVE\OpenBve.XML"; DestDir: "{app}"; Flags: ignoreversion
Source: "C:\Program Files (x86)\openBVE\OpenBveApi.dll"; DestDir: "{app}"; Flags: ignoreversion
Source: "C:\Program Files (x86)\openBVE\OpenBveApi.xml"; DestDir: "{app}"; Flags: ignoreversion
Source: "C:\Program Files (x86)\openBVE\OpenTK.dll"; DestDir: "{app}"; Flags: ignoreversion
Source: "C:\Program Files (x86)\openBVE\OpenTK.dll.config"; DestDir: "{app}"; Flags: ignoreversion
Source: "C:\Program Files (x86)\openBVE\SharpCompress.Unsigned.dll"; DestDir: "{app}"; Flags: ignoreversion
Source: "C:\Program Files (x86)\openBVE\Data\*"; DestDir: "{app}\Data"; Flags: ignoreversion recursesubdirs createallsubdirs
; NOTE: Don't use "Flags: ignoreversion" on any shared system files

;Open BVE Main Folder.Source: "..\bin_release\*"; DestDir: "{app}"; Flags: recursesubdirs
;Custom Config FileSource: "InstallerData\filesystem.cfg"; DestDir: "{app}\UserData\Settings\";
;MS .NET 4.0 Full Web Installer.
Source: "InstallerData\dotNetFx40_Full_setup.exe"; DestDir: "{app}"; Flags: deleteafterinstall; AfterInstall: AfterMyProgInstall('AllFilesCopy')
[Icons]
Name: "{commonprograms}\{#MyAppName}"; Filename: "{app}\{#MyAppExeName}"
Name: "{commondesktop}\{#MyAppName}"; Filename: "{app}\{#MyAppExeName}"; Tasks: desktopicon
Name: "{userdesktop}\{#MyAppName}"; Filename: "{app}\{#MyAppExeName}"; Tasks: desktopicon
Name: "{userdesktop}\openBVE Addons"; Filename:"{code:GetDataDir}"; Tasks: desktopicon2
Name: "{group}\{#MyAppName}"; Filename: "{app}\OpenBVE.exe"
Name: "{group}\openBVE Addons"; Filename: "{code:GetDataDir}"
Name: "{group}\{cm:UninstallProgram,{#MyAppName}}"; Filename: "{uninstallexe}"
Name: "{app}\openBVE Addons"; Filename: "{code:GetDataDir}"; Flags: uninsneveruninstall

[Dirs]
Name: {code:GetDataDir}; Flags: uninsneveruninstall

[Run]
Filename: "{app}\{#MyAppExeName}"; Description: "{cm:LaunchProgram,{#StringChange(MyAppName, '&', '&&')}}"; Flags: nowait postinstall skipifsilent
Filename: "{app}\{#MyAppExeName}"; Description: "{cm:LaunchProgram,{#MyAppName}}"; Flags: postinstall shellexec skipifsilent runascurrentuser
Filename: "{code:GetDataDir}"; Description: "Open the openBVE Addons Folder" ; Flags: postinstall shellexec waituntilterminated skipifsilent unchecked

[Code]
var
UsagePage: TInputOptionWizardPage;
DataDirPage: TInputDirWizardPage;
use_Net4: Cardinal;
use_OpenAL: Cardinal;
ResultCode_Net4: Integer;
ResultCode_OpenAL: Integer;
procedure InitializeWizard;
begin
{ Create the pages }
UsagePage := CreateInputOptionPage(wpWelcome,
'Select Destination Location', 'Where should openBVE Addons be installed?',
'Please specify the installation location for openBVE Addons.'#13#10 +
'NOTE: This may be changed at a later date using the Options dialog.',
True, False);
UsagePage.Add('Default - Use AppData\Roaming\openBVE\UserData');
UsagePage.Add('Program - Use the UserData folder in the openBVE installation directory');
UsagePage.Add('Custom - Select a custom folder');
DataDirPage := CreateInputDirPage(wpSelectDir,
'Select openBVE Addons Directory', 'Where should openBVE Addons be installed?',
'Please select the folders in which you wish to install openBVE Addons, and then click Next.',
False, '');
DataDirPage.Add('Routes:');
//'Select Destination Location', 'Where should openBVE Addons be installed?'
DataDirPage.Add('Trains:');
DataDirPage.Add('Other:');
{ Set default values, using settings that were stored last time if possible }
case GetPreviousData('UsageMode', '') of
'Default': UsagePage.SelectedValueIndex := 0;
'Assembly': UsagePage.SelectedValueIndex := 1;
'Custom': UsagePage.SelectedValueIndex := 2;
else
UsagePage.SelectedValueIndex := 0;
end;
DataDirPage.Values[0] := GetPreviousData('DataDir0', '');
DataDirPage.Values[1] := GetPreviousData('DataDir1', '');
DataDirPage.Values[2] := GetPreviousData('DataDir2', '');
end;
procedure RegisterPreviousData(PreviousDataKey: Integer);
var
UsageMode: String;
begin
{ Store the settings so we can restore them next time }
case UsagePage.SelectedValueIndex of
0: UsageMode := 'Default';
1: UsageMode := 'Assembly';
2: UsageMode := 'Custom';
end;
SetPreviousData(PreviousDataKey, 'UsageMode', UsageMode);
SetPreviousData(PreviousDataKey, 'DataDir0', DataDirPage.Values[0]);
SetPreviousData(PreviousDataKey, 'DataDir1', DataDirPage.Values[1]);
SetPreviousData(PreviousDataKey, 'DataDir2', DataDirPage.Values[2]);
end;
function GetDataDir(Param: String): String;
begin
{ Return the selected DataDir }
Result := DataDirPage.Values[0];
end;
function ShouldSkipPage(PageID: Integer): Boolean;
begin
{ Skip pages that shouldn't be shown }
if (PageID = DataDirPage.ID) and (UsagePage.SelectedValueIndex <> 2) then
Result := True
else
Result := False;
end;
function GetHKLM: Integer;
begin
{ Determine whether it is 64bit OS. }
if IsWin64 then
Result := HKLM64
else
Result := HKLM32;
end;
procedure AfterMyProgInstall(S: String);
var
Installed: Cardinal;
FileLines: TArrayOfString;
begin
//Determine whether the component is installed.
if RegQueryDWordValue(GetHKLM(),'Software\Microsoft\NET Framework Setup\NDP\v4\Full', 'Install',Installed) then begin
use_Net4:=Installed
end;
begin
if RegKeyExists(HKLM32,'Software\OpenAL') then begin
use_OpenAL:=1
end
end;
begin
if use_Net4 = 1 then begin
end else begin
WizardForm.FilenameLabel.Caption := 'Installing Microsoft .NET Framework 4 Full';
if Exec(ExpandConstant('{app}\dotNetFx40_Full_setup.exe'), '/norestart /passive /showrmui', '', SW_SHOW,
ewWaitUntilTerminated, ResultCode_Net4) then
begin
IntToStr(ResultCode_Net4)
// handle success if necessary; ResultCode contains the exit code
end
else begin
// handle failure if necessary; ResultCode contains the error code;
end;
end;
begin
if use_OpenAL = 1 then begin
end else begin
WizardForm.FilenameLabel.Caption := 'Installing OpenAL';
if Exec(ExpandConstant('{app}\Data\Dependencies\Win32\oalinst.exe'), '-s', '', SW_SHOW,
ewWaitUntilTerminated, ResultCode_OpenAL) then
begin
Sleep(3000);
// handle success if necessary; ResultCode contains the exit code
end
// handle failure if necessary; ResultCode contains the error code
end;
end;
//OpenBVE filesystem.cfg
if (UsagePage.SelectedValueIndex = 0) then
begin
CreateDir(ExpandConstant('{userappdata}\{#MyAppName}'));
DataDirPage.Values[0] := ExpandConstant('{userappdata}\{#MyAppName}\LegacyContent\Railway');
DataDirPage.Values[1] := ExpandConstant('{userappdata}\{#MyAppName}\LegacyContent\Train');
end;
if (UsagePage.SelectedValueIndex = 1) then
begin
ForceDirectories(ExpandConstant('{app}\UserData\Settings'));
FileCopy(ExpandConstant('{app}\filesystem.cfg'), ExpandConstant('{app}\UserData\Settings\filesystem.cfg'), True);
DataDirPage.Values[0] := ExpandConstant('{app}\UserData');
end;
if (UsagePage.SelectedValueIndex = 2) then
begin
ForceDirectories(ExpandConstant('{app}\UserData\Settings'));
//Load filesystem.cfg
LoadStringsFromFile(ExpandConstant('{app}\UserData\Settings\filesystem.cfg'), FileLines);
FileLines[2]:='InitialRoute = '+DataDirPage.Values[0];
FileLines[3]:='InitialTrain = '+DataDirPage.Values[1];
FileLines[4]:='RoutePackageInstall = '+DataDirPage.Values[0];
FileLines[5]:='TrainPackageInstall = '+DataDirPage.Values[1];
//Save filesystem.cfg
SaveStringsToUTF8File(ExpandConstant('{app}\UserData\Settings\filesystem.cfg'),FileLines,false);
end;
ForceDirectories(DataDirPage.Values[0]);
ForceDirectories(DataDirPage.Values[1])
end;
end;
function NeedRestart(): Boolean;
begin
if ResultCode_Net4 = 3010 then
begin
Result := True;
end;
end;
//==========Uninstall Section==========
function InitializeUninstall(): Boolean;
begin
MsgBox('Add-on data will not be deleted during uninstallation.', mbError, MB_OK);
Result := True
end;
procedure CurUninstallStepChanged(CurUninstallStep: TUninstallStep);
var
ResultCode: Integer;
begin
case CurUninstallStep of usDone:
begin
Exec('explorer.exe',ExpandConstant('{app}') , '', SW_SHOW, ewNoWait,ResultCode);
end;
end;
end;
Expand Down

0 comments on commit b18976f

Please sign in to comment.