From bc079ba932b290c0e7cb58391c75e5e0cca5c03e Mon Sep 17 00:00:00 2001 From: Radegast Date: Fri, 2 Nov 2012 11:28:37 +0000 Subject: [PATCH] inno_installer: downloads/copies W:ET 2.60b data files --- inno_installer/etl_innoinstaller.iss | 165 ++++++++++++++ inno_installer/intro.rtf | Bin 0 -> 1436 bytes inno_installer/it_download.iss | 318 +++++++++++++++++++++++++++ 3 files changed, 483 insertions(+) create mode 100644 inno_installer/etl_innoinstaller.iss create mode 100644 inno_installer/intro.rtf create mode 100644 inno_installer/it_download.iss diff --git a/inno_installer/etl_innoinstaller.iss b/inno_installer/etl_innoinstaller.iss new file mode 100644 index 0000000..92cfd3d --- /dev/null +++ b/inno_installer/etl_innoinstaller.iss @@ -0,0 +1,165 @@ +; Script generated by the Inno Setup Script Wizard. + +; TODO +; * fixme: missing file icons (add ader10's new icons) +; * fixme: windows text is scribbled on the Download page +; * (option) import etkey from W:ET 2.60b installation +; * (option) install omnibot files + +; Inno Downloader script (had to be updated) +#include <./it_download.iss> + +#define MyAppName "Enemy Territory - Legacy" +#define MyAppVersion "2.70" +#define MyAppPublisher "ET:L Team" +#define MyAppURL "http://www.etlegacy.com" +#define MyAppExeName "etl.exe" + +[Setup] +; NOTE: The value of AppId uniquely identifies this application. +; Do not use the same AppId value in installers for other applications. +; (To generate a new GUID, click Tools | Generate GUID inside the IDE.) +AppId={{9695CADB-4A88-444C-9A0F-B1D27D15AE5F} +AppName={#MyAppName} +AppVersion={#MyAppVersion} +;AppVerName={#MyAppName} {#MyAppVersion} +AppPublisher={#MyAppPublisher} +AppPublisherURL={#MyAppURL} +AppSupportURL={#MyAppURL} +AppUpdatesURL={#MyAppURL} +DefaultDirName={pf}\Enemy Territory - Legacy +DefaultGroupName={#MyAppName} +AllowNoIcons=yes +LicenseFile=files\COPYING.txt +InfoBeforeFile=intro.rtf +OutputBaseFilename=setup +Compression=lzma +SolidCompression=yes + +[Languages] +Name: "english"; MessagesFile: "compiler:Default.isl" +Name: "czech"; MessagesFile: "compiler:Languages\Czech.isl" +Name: "german"; MessagesFile: "compiler:Languages\German.isl" +Name: "polish"; MessagesFile: "compiler:Languages\Polish.isl" + +[Tasks] +Name: "desktopicon"; Description: "{cm:CreateDesktopIcon}"; GroupDescription: "{cm:AdditionalIcons}"; Flags: unchecked + +[Files] +Source: "files\etl.exe"; DestDir: "{app}"; Flags: ignoreversion +Source: "files\etlded.exe"; DestDir: "{app}"; Flags: ignoreversion +Source: "files\legacy\*"; DestDir: "{app}\legacy\"; Flags: ignoreversion recursesubdirs createallsubdirs +Source: "files\libcurl.dll"; DestDir: "{app}"; Flags: ignoreversion +Source: "files\SDL.dll"; DestDir: "{app}"; Flags: ignoreversion +; W:ET 2.60b game data +Source: "{code:GetPakPath|pak0}"; DestDir: "{app}\etmain"; Flags: ignoreversion external +Source: "{code:GetPakPath|pak1}"; DestDir: "{app}\etmain"; Flags: ignoreversion external +Source: "{code:GetPakPath|pak2}"; DestDir: "{app}\etmain"; Flags: ignoreversion external +Source: "{code:GetPakPath|mp_bin}"; DestDir: "{app}\etmain"; Flags: ignoreversion external +; NOTE: Don't use "Flags: ignoreversion" on any shared system files + +[Icons] +Name: "{group}\{#MyAppName}"; Filename: "{app}\{#MyAppExeName}" +Name: "{group}\{cm:ProgramOnTheWeb,{#MyAppName}}"; Filename: "{#MyAppURL}" +Name: "{group}\{cm:UninstallProgram,{#MyAppName}}"; Filename: "{uninstallexe}" +Name: "{commondesktop}\{#MyAppName}"; Filename: "{app}\{#MyAppExeName}"; Tasks: desktopicon + +[Code] +var + pak0, pak1, pak2, mp_bin: String; + InstallDataPage: TInputOptionWizardPage; + EtmainDirPage: TInputDirWizardPage; + DownloadFiles: Boolean; + +procedure InitializeWizard; +begin + InstallDataPage := CreateInputOptionPage(wpSelectDir, + 'Required game data', 'You must have W:ET game datafiles in order to play ET:L', + 'Do you want to download required data files (pak0.pk3, pak1.pk3, pak2.pk3, mp_bin.pk3)?'#10#10'If Wolfenstein: Enemy Territory 2.60b is already installed, select No, then click Next.', + True, False); + InstallDataPage.Add('Yes, download required files'); + InstallDataPage.Add('No, copy files from W:ET installation'); + // Set initial values (optional) + InstallDataPage.SelectedValueIndex := 0; // Default: Yes + + // Locate W:ET 2.60b etmain directory + EtmainDirPage := CreateInputDirPage(InstallDataPage.ID, + 'Select "etmain" directory inside W:ET 2.60b installation', '', + 'Select the "etmain" folder inside your Wolfenstein: Enemy Territory 2.60b installation, then click Next.', + False, ''); + EtmainDirPage.Add(''); + + // Download W:ET data files + itd_init; + itd_downloadafter(wpReady); +end; + +function ShouldSkipPage(PageID: Integer): Boolean; +begin + { Skip pages that shouldn't be shown } + if (PageID = EtmainDirPage.ID) and not (InstallDataPage.SelectedValueIndex <> 0) then + Result := True + else + Result := False; +end; + +function NextButtonClick(CurPageID: Integer): Boolean; +begin + if CurPageID = EtmainDirPage.ID then begin + pak0 := EtmainDirPage.Values[0] + '\pak0.pk3'; + pak1 := EtmainDirPage.Values[0] + '\pak1.pk3'; + pak2 := EtmainDirPage.Values[0] + '\pak2.pk3'; + mp_bin := EtmainDirPage.Values[0] + '\mp_bin.pk3'; + + Result := False; + if not FileExists(pak0) then begin + MsgBox('Sorry, pak0.pk3 not found in ' + pak0, mbError, MB_OK) + exit; + end; + if not FileExists(pak1) then begin + MsgBox('Sorry, pak1.pk3 not found in ' + pak1, mbError, MB_OK) + exit; + end; + if not FileExists(pak2) then begin + MsgBox('Sorry, pak2.pk3 not found in ' + pak2, mbError, MB_OK) + exit; + end; + if not FileExists(mp_bin) then begin + MsgBox('Sorry, mp_bin.pk3 not found in ' + mp_bin, mbError, MB_OK) + exit; + end; + Result := True; + end else if (CurPageID = InstallDataPage.ID) and not (InstallDataPage.SelectedValueIndex <> 0) then begin + DownloadFiles := (InstallDataPage.SelectedValueIndex <> 0); + pak0 := expandconstant('{tmp}\pak0.pk3'); + pak1 := expandconstant('{tmp}\pak1.pk3'); + pak2 := expandconstant('{tmp}\pak2.pk3'); + mp_bin := expandconstant('{tmp}\mp_bin.pk3'); + + itd_setstring(200, 'Downloading additional files'); + itd_setstring(201, 'Please wait while setup downloads additional files...'); + itd_addfile('http://mirror.etlegacy.com/etmain/pak0.pk3',pak0); + itd_addfile('http://mirror.etlegacy.com/etmain/pak1.pk3',pak1); + itd_addfile('http://mirror.etlegacy.com/etmain/pak2.pk3',pak2); + itd_addfile('http://mirror.etlegacy.com/etmain/mp_bin.pk3',mp_bin); + Result := True; + end else begin + Result := True; + end; +end; + +function GetPakPath(pak: String): String; +begin + if pak = 'pak0' then begin + Result := pak0 + end; + if pak = 'pak1' then begin + Result := pak1 + end; + if pak = 'pak2' then begin + Result := pak2 + end; + if pak = 'mp_bin' then begin + Result := mp_bin + end; +end; \ No newline at end of file diff --git a/inno_installer/intro.rtf b/inno_installer/intro.rtf new file mode 100644 index 0000000000000000000000000000000000000000..dd10e4547e11f9da1b13a6c88dafc4ba13333254 GIT binary patch literal 1436 zcmaJ>U2oeq6zy|?{)Y?fp+K>zveYJ7^0p#tg9b&B1qcf8g%Yo1wiKz7loi47fA1mf zWb>BJ5G;!K>)dlcw!+75C8P~nDDJvaSU2g`4Wo=((K#DqV{j-%XSESsyOut1tm-p* zCyj2rzSu#$Iu@5l!s=L9(O=8ZICHVvy?DMAtuxLe2we!zsy-9FXSR4ZX5#uR-+;o|GacIyS=)2Ev^*?y%ie2bve3LnE;P$Po(*SD zlU3}q<@?Xqo0^PnVa^5J!v7$(rQS)i_m1$RcVD@U2}yL+>3eFXKKu%QgWCXvQKWce zIJK?jK+-CB`NpIpjYclAG0?Ikjlum_(Cfy;v$j2j1+a&ZP(mq04ITIeh9uoLj!yQo zj_VBh@|LRNq-EzcS9k&7bnwI`;oADbLQmU|p*;yD_MJ7mU*f}SI-*^HUuFC5K&?!eZcX?0-E3JZY$&F(2=Da*&^NKB(T6Z%_5+G4S3HY$Pd zj7scpKYaOod2@aB=_9RU9M50Bp69uEfKZ_QX_xk)Q9hWs{fUm4Oo??;?(q9b&tkzn F`vK53`7Hnd literal 0 HcmV?d00001 diff --git a/inno_installer/it_download.iss b/inno_installer/it_download.iss new file mode 100644 index 0000000..79099f2 --- /dev/null +++ b/inno_installer/it_download.iss @@ -0,0 +1,318 @@ +[Files] +Source: {#emit ReadReg(HKEY_LOCAL_MACHINE,'Software\Sherlock Software\InnoTools\Downloader','InstallPath','')}\itdownload.dll; Flags: dontcopy; DestDir: {tmp} + +[Code] +(* + Inno Tools Downloader DLL + Copyright (C) Sherlock Software 2008 + Version 0.3.5 + + Contact: + The author, Nicholas Sherlock, at nick@sherlocksoftware.org. + Comments, questions and suggestions welcome. + + Website: + http://www.sherlocksoftware.org/ + + History: + 0.3.5 - Moved strings used in the updater example to the language file, so that they + may be more easily translated. + Added event functions to support the example of integration with InnoTools tray. + Fixes bugs that could cause the download to hang until + some mouse movements were received. + Allows "detailed mode" to be turned on with ITD_SetOption + Allows the HTTP agent to be set with ITD_SetOption + 0.3.4 - Added Brazilian Portuguese translation by Ronaldo Souza + 0.3.3 - The "Hilbrand Edskes" release :), lots of suggestions and corrections from him, thank you! + The "Retry" button is now translated. + The "Current file" progress bar is hidden if only one file is being downloaded. + The page's title and description are updated in the case of failed downloads. + Several updates to the translations. + Several small GUI fixes. + 0.3.2 - Minor tweaks to the English language file and the translation example script (example4.iss) + Added Dutch translation by Hilbrand Edskes + Added French translation by Néo + 0.3.1 - Added language file examples, fixed several missing language strings + Preliminary support for proxy server autodetection + Allows the size of a file to be queried with ITD_GetFileSize + Several small bugfixes + 0.3.0 - Properly supports timeouts. + Fixes bug with time remaining. + DLL is required again. + Supports localization through ITD_LoadStrings, ITD_SetString + Add mirrors for files + Post HTTP documents + Quick view and detailed view + 0.2.2 - Fixed empty strings '' in calls and added timeouts + 0.2.1 - Renamed identifiers to avoid name clashes + 0.2.0 - Converted from DLL to pure native code +*) + +procedure ITD_Cancel; + external 'itd_cancel@files:itdownload.dll stdcall'; + +procedure ITD_ClearFiles; + external 'itd_clearfiles@files:itdownload.dll stdcall'; + +function ITD_DownloadFile(url: PAnsiChar; destfilename: PAnsiChar): integer; + external 'itd_downloadfile@files:itdownload.dll stdcall'; + +function ITD_GetResultLen: integer; + external 'itd_getresultlen@files:itdownload.dll stdcall'; + +procedure ITD_GetResultString(buffer: pansichar; maxlen: integer); + external 'itd_getresultstring@files:itdownload.dll stdcall'; + +procedure ITD_Internal_InitUI(HostHwnd: dword); + external 'itd_initui@files:itdownload.dll stdcall'; + +function ITD_Internal_LoadStrings(filename: PAnsiChar): boolean; + external 'itd_loadstrings@files:itdownload.dll stdcall'; + +procedure ITD_Internal_SetOption(option, value: PAnsiChar); + external 'itd_setoption@files:itdownload.dll stdcall'; + +function ITD_Internal_GetFileSize(url: pansichar; var size: Cardinal): boolean; + external 'itd_getfilesize@files:itdownload.dll stdcall'; + +function ITD_Internal_GetString(index: integer): boolean; + external 'itd_getstring@files:itdownload.dll stdcall'; + +function ITD_Internal_GetOption(option: PAnsiChar; buffer: PAnsiChar; length: integer): integer; + external 'itd_getoption@files:itdownload.dll stdcall'; + +procedure ITD_Internal_SetString(index: integer; value: PAnsiChar); + external 'itd_setstring@files:itdownload.dll stdcall'; + +procedure ITD_Internal_AddFile(url: PAnsiChar; destfilename: PAnsiChar); + external 'itd_addfile@files:itdownload.dll stdcall'; + +procedure ITD_Internal_AddMirror(url: PAnsiChar; destfilename: PAnsiChar); + external 'itd_addmirror@files:itdownload.dll stdcall'; + +procedure ITD_Internal_AddFileSize(url: PAnsiChar; destfilename: PAnsiChar; size: integer); + external 'itd_addfilesize@files:itdownload.dll stdcall'; + +function ITD_Internal_DownloadFiles(surface: hwnd): integer; + external 'itd_downloadfiles@files:itdownload.dll stdcall'; + +function ITD_FileCount: integer; + external 'itd_filecount@files:itdownload.dll stdcall'; + +function ITD_Internal_PostPage(url, buffer: PAnsiChar; length: integer): boolean; + external 'itd_postpage@files:itdownload.dll stdcall'; + + +const + ITDERR_SUCCESS = 0; + ITDERR_USERCANCEL = 1; + ITDERR_ERROR = 3; + + {Constants for Language String indexes:} + ITDS_DownloadFailed = 104; + + ITDS_TitleCaption = 200; + ITDS_TitleDescription = 201; + + ITDS_MessageFailRetryContinue = 250; + ITDS_MessageFailRetry = 251; + + ITDS_Retry = 502; + + {Constants for language strings of updater example} + ITDS_Update_Caption = 600; + ITDS_Update_Description = 601; + ITDS_Update_Checking = 602; + ITDS_Update_NewAvailable = 603; + ITDS_Update_NoNewAvailable = 604; + ITDS_Update_WantToCheck = 605; + ITDS_Update_Failed = 606; + ITDS_Update_WillLaunch = 607; + ITDS_Update_WillLaunchWithPath = 608; + + ITD_Event_DownloadPageEntered = 1; + ITD_Event_DownloadPageLeft = 2; + ITD_Event_DownloadFailed = 3; + +var + itd_allowcontinue: boolean; + itd_retryonback: boolean; + + ITD_AfterSuccess: procedure(downloadPage: TWizardPage); + ITD_EventHandler: procedure(event: integer); + +procedure ITD_DownloadFiles(); +begin + ITD_Internal_DownloadFiles(0); +end; + +procedure ITD_AddFile(const URL, filename: string); +begin + ITD_Internal_AddFile(URL, filename); +end; + +procedure ITD_AddMirror(const URL, filename: string); +begin + ITD_Internal_AddMirror(URL, filename); +end; + +procedure ITD_AddFileSize(const URL, filename: string; size: integer); +begin + ITD_Internal_AddFileSize(URL, filename, size); +end; + +function ITD_HandleSkipPage(sender: TWizardPage): boolean; +begin + result := (itd_filecount = 0); +end; + +procedure ITD_SetString(index: integer; value: string); +begin + itd_internal_setstring(index, value); +end; + +function ITD_GetFileSize(const url: string; var size: cardinal): boolean; +begin + result := itd_internal_getfilesize(PAnsiChar(url), size); +end; + +function ITD_LoadStrings(const filename: string): boolean; +begin + result := itd_internal_loadstrings(filename); +end; + +function ITD_GetString(index: integer): string; +begin + itd_internal_getstring(index); + setlength(result, ITD_GetResultLen); + ITD_GetResultString(PAnsiChar(result), length(result)); +end; + +procedure ITD_NowDoDownload(sender: TWizardPage); +var err: integer; +begin + wizardform.backbutton.enabled := false; + wizardform.nextbutton.enabled := false; + + sender.caption := ITD_GetString(ITDS_TitleCaption); + sender.description := ITD_GetString(ITDS_TitleDescription); + + err := ITD_Internal_DownloadFiles(sender.surface.handle); + + case err of + ITDERR_SUCCESS: begin + wizardform.nextbutton.enabled := true; + wizardform.nextbutton.onclick(nil); + + if itd_aftersuccess <> nil then + itd_aftersuccess(sender); + end; + ITDERR_USERCANCEL: ; //Don't show a message, this happens on setup close and cancel click + else begin + //Some unexpected error, like connection interrupted + wizardform.backbutton.caption := ITD_GetString(ITDS_Retry); + wizardform.backbutton.enabled := true; + wizardform.backbutton.show(); + itd_retryonback := true; + + wizardform.nextbutton.enabled := itd_allowcontinue; + + if ITD_EventHandler <> nil then + ITD_EventHandler(ITD_Event_DownloadFailed); + + if itd_allowcontinue then begin //Download failed, we can retry, continue, or exit + sender.caption := ITD_GetString(ITDS_DownloadFailed); + sender.description := ITD_GetString(ITDS_MessageFailRetryContinue); + + MsgBox(ITD_GetString(ITDS_MessageFailRetryContinue), mbError, MB_OK) + end else begin //Download failed, we must retry or exit setup + sender.caption := ITD_GetString(ITDS_DownloadFailed); + sender.description := ITD_GetString(ITDS_MessageFailRetry); + + MsgBox(ITD_GetString(ITDS_MessageFailRetry), mbError, MB_OK) + end; + end; + end; +end; + +procedure ITD_HandleShowPage(sender: TWizardPage); +begin + wizardform.nextbutton.enabled := false; + wizardform.backbutton.hide(); + + if ITD_EventHandler <> nil then + ITD_EventHandler(ITD_Event_DownloadPageEntered); + + itd_nowdodownload(sender); +end; + +function ITD_HandleBackClick(sender: TWizardpage): boolean; +begin + result := false; + if itd_retryonback then begin + itd_retryonback := false; + wizardform.backbutton.hide(); + itd_nowdodownload(sender); + end; +end; + +function ITD_HandleNextClick(sender: TWizardpage): boolean; +begin + if ITD_EventHandler <> nil then + ITD_EventHandler(ITD_Event_DownloadPageLeft); + + result := true; +end; + +procedure ITD_Init; +begin + //Currently a NOP. Don't count on it in future. +end; + +function ITD_PostPage(const url, data: string; out response: string): boolean; +begin + result := ITD_Internal_PostPage(PAnsiChar(url), PAnsiChar(data), length(data)); + + if result then begin + setlength(response, ITD_GetResultLen); + ITD_GetResultString(PAnsiChar(response), length(response)); + end; +end; + +function ITD_DownloadAfter(afterID: integer): TWizardPage; +var itd_downloadPage: TWizardPage; +begin + itd_downloadpage := CreateCustomPage(afterID, ITD_GetString(ITDS_TitleCaption), ITD_GetString(ITDS_TitleDescription)); + + itd_downloadpage.onactivate := @itd_handleshowpage; + itd_downloadpage.onshouldskippage := @itd_handleskippage; + itd_downloadpage.onbackbuttonclick := @itd_handlebackclick; + itd_downloadpage.onnextbuttonclick := @itd_handlenextclick; + + itd_internal_initui(itd_downloadpage.surface.handle); + + result := itd_downloadpage; +end; + +procedure ITD_SetOption(const option, value: string); +begin + //The options which call ITD_SetString are depreciated, use ITD_SetString directly + if comparetext(option, 'UI_Caption') = 0 then + ITD_SetString(ITDS_TitleCaption, value) + else if comparetext(option, 'UI_Description') = 0 then + ITD_SetString(ITDS_TitleDescription, value) + else if comparetext(option, 'UI_FailMessage') = 0 then + ITD_SetString(ITDS_MessageFailRetry, value) + else if comparetext(option, 'UI_FailOrContinueMessage') = 0 then + ITD_SetString(ITDS_MessageFailRetryContinue, value) + else if comparetext(option, 'UI_AllowContinue') = 0 then + ITD_AllowContinue := (value = '1') + else + ITD_Internal_SetOption(option, value); +end; + +function ITD_GetOption(const option: string): string; +begin + setlength(result, 500); + setlength(result, itd_internal_getoption(pansichar(option), pansichar(result), length(result))); +end;