Blame PACKAGE/lynx.iss

Packit f574b8
; $LynxId: lynx.iss,v 1.29 2018/03/21 14:56:20 tom Exp $
Packit f574b8
; vile:ts=4 sw=4 notabinsert fk=8bit
Packit f574b8
;
Packit f574b8
; This is the BASE script for different flavors of the installer for Lynx.
Packit f574b8
; It can be overridden to select different source-executables (and their associated
Packit f574b8
; screen library, e.g., pdcurses or slang).
Packit f574b8
;
Packit f574b8
; The script assumes environment variables have been set, e.g., to point to
Packit f574b8
; data which is used by the installer:
Packit f574b8
;
Packit f574b8
; LYNX_BINDIR - directory containing lynx.exe (or different names)
Packit f574b8
; LYNX_DLLSDIR - directory containing curses or slang dlls.
Packit f574b8
; LYNX_DOCSDIR - files and subdirectories installed from Unix with "make install-doc"
Packit f574b8
; LYNX_HELPDIR - files and subdirectories installed from Unix with "make install-help"
Packit f574b8

Packit f574b8
#include "version.iss"
Packit f574b8

Packit f574b8
#ifndef MyAppExeName
Packit f574b8
#define MyAppExeName "lynx.exe"
Packit f574b8
#endif
Packit f574b8

Packit f574b8
#define MySendTo '{sendto}\' + myAppName + '.lnk'
Packit f574b8
#define MyQuickLaunch '{userappdata}\Microsoft\Internet Explorer\Quick Launch\' + myAppName + '.lnk'
Packit f574b8

Packit f574b8
#ifndef SourceExeName
Packit f574b8
#define SourceExeName "lynx.exe"
Packit f574b8
#endif
Packit f574b8

Packit f574b8
#ifndef NoScreenDll
Packit f574b8
#ifndef ScreenDllName
Packit f574b8
#define ScreenDllName "pdcurses.dll"
Packit f574b8
#endif
Packit f574b8
#endif
Packit f574b8

Packit f574b8
#ifndef BzipDllName
Packit f574b8
#define BzipDllName "libbz2.dll"
Packit f574b8
#endif
Packit f574b8

Packit f574b8
#ifndef ZlibDllName
Packit f574b8
#define ZlibDllName "zlib1.dll"
Packit f574b8
#endif
Packit f574b8

Packit f574b8
#ifndef BzipExeName
Packit f574b8
#define BzipExeName "bzip2.exe"
Packit f574b8
#endif
Packit f574b8

Packit f574b8
#ifndef GzipExeName
Packit f574b8
#define GzipExeName "gzip.exe"
Packit f574b8
#endif
Packit f574b8

Packit f574b8
#ifndef SetupBaseName
Packit f574b8
#define SetupBaseName "lynx"
Packit f574b8
#endif
Packit f574b8

Packit f574b8
#ifndef BinsSrcDir
Packit f574b8
#define BinsSrcDir GetEnv("LYNX_BINDIR")
Packit f574b8
#if BinsSrcDir == ""
Packit f574b8
#define BinsSrcDir "..\bin"
Packit f574b8
#endif
Packit f574b8
#endif
Packit f574b8

Packit f574b8
#ifndef DllsSrcDir
Packit f574b8
#define DllsSrcDir GetEnv("LYNX_DLLSDIR")
Packit f574b8
#if DllsSrcDir == ""
Packit f574b8
#define DllsSrcDir "..\bin"
Packit f574b8
#endif
Packit f574b8
#endif
Packit f574b8

Packit f574b8
#ifndef DocsSrcDir
Packit f574b8
#define DocsSrcDir GetEnv("LYNX_DOCSDIR")
Packit f574b8
#if DocsSrcDir == ""
Packit f574b8
#define DocsSrcDir "..\docs"
Packit f574b8
#endif
Packit f574b8
#endif
Packit f574b8

Packit f574b8
#ifndef HelpSrcDir
Packit f574b8
#define HelpSrcDir GetEnv("LYNX_HELPDIR")
Packit f574b8
#if HelpSrcDir == ""
Packit f574b8
#define HelpSrcDir "..\lynx_help"
Packit f574b8
#endif
Packit f574b8
#endif
Packit f574b8

Packit f574b8
[Setup]
Packit f574b8
AppName={#MyAppName}
Packit f574b8
#emit 'AppVersion=' + LYNX_VERSION
Packit f574b8
#emit 'VersionInfoDescription=Setup for "' + MyAppName + '"'
Packit f574b8
#define LYNX_TARGET0 StringChange(LYNX_VERSION,LYNX_RELEASE + "rel.",LYNX_RELEASE + ".00")
Packit f574b8
#define LYNX_TARGET1 StringChange(LYNX_TARGET0,LYNX_TARGETS + "dev.",LYNX_RELEASE + ".10")
Packit f574b8
#define LYNX_TARGET2 StringChange(LYNX_TARGET1,LYNX_TARGETS + "pre.",LYNX_RELEASE + ".20")
Packit f574b8
#emit 'VersionInfoVersion=' + LYNX_TARGET1
Packit f574b8
AppVerName={#MyAppVerName}
Packit f574b8
AppPublisher={#MyAppPublisher}
Packit f574b8
AppCopyright=© 1997-2017,2018, Thomas E. Dickey
Packit f574b8
AppPublisherURL={#MyAppURL}
Packit f574b8
AppSupportURL={#MyAppURL}
Packit f574b8
AppUpdatesURL={#MyAppURL}
Packit f574b8
DefaultDirName={pf}\{#MyAppName}
Packit f574b8
DefaultGroupName={#MyAppName}
Packit f574b8
AllowNoIcons=yes
Packit f574b8
LicenseFile=..\COPYHEADER
Packit f574b8
InfoBeforeFile=..\README
Packit f574b8
OutputDir=..\PACKAGE\lynx-setup
Packit f574b8
#emit 'OutputBaseFilename=' + SetupBaseName + LYNX_VERSION + '-setup'
Packit f574b8
Compression=lzma
Packit f574b8
SolidCompression=yes
Packit f574b8
PrivilegesRequired=none
Packit f574b8
SetupLogging=no
Packit f574b8

Packit f574b8
[Languages]
Packit f574b8
Name: "english"; MessagesFile: "compiler:Default.isl"
Packit f574b8

Packit f574b8
[Components]
Packit f574b8
Name: main; Description: The Lynx executable; types: full custom compact
Packit f574b8
Name: explorer; Description: Windows Explorer integration; types: full custom
Packit f574b8

Packit f574b8
[Tasks]
Packit f574b8
Name: for_all_users; Description: Install for all users on this machine; GroupDescription: Configuration Settings; Components: main; Check: isGuru; Flags: unchecked
Packit f574b8
Name: register_vars; Description: Use registry for environment variables; GroupDescription: Configuration Settings; Components: main; Flags: unchecked
Packit f574b8
Name: use_sendto; Description: Add Send To Entry; GroupDescription: Windows Explorer; Components: explorer; Flags: unchecked
Packit f574b8
Name: desktopicon; Description: {cm:CreateDesktopIcon}; GroupDescription: {cm:AdditionalIcons}; Components: main; Flags: unchecked
Packit f574b8
Name: quicklaunchicon; Description: {cm:CreateQuickLaunchIcon}; GroupDescription: {cm:AdditionalIcons}; Components: main; Flags: unchecked
Packit f574b8

Packit f574b8

Packit f574b8
[Dirs]
Packit f574b8
Name: "{app}\doc"
Packit f574b8
Name: "{app}\doc\samples"
Packit f574b8
Name: "{app}\doc\test"
Packit f574b8
Name: "{app}\help"
Packit f574b8
Name: "{app}\help\keystrokes"
Packit f574b8
Name: "{app}\icon"
Packit f574b8

Packit f574b8
[Files]
Packit f574b8
#emit 'Source: "' + BinsSrcDir + '\' + SourceExeName + '"; DestDir: "{app}"; DestName: ' + MyAppExeName + '; AfterInstall: myPostExecutable; Flags: ignoreversion'
Packit f574b8
#ifndef NoScreenDll
Packit f574b8
#emit 'Source: "' + DllsSrcDir + '\' + ScreenDllName + '"; DestDir: "{app}"; DestName: ' + ScreenDllName + '; Flags: ignoreversion'
Packit f574b8
#endif
Packit f574b8
#emit 'Source: "' + DllsSrcDir + '\' + ZlibDllName + '"; DestDir: "{app}"; DestName: ' + ZlibDllName + '; Flags: ignoreversion'
Packit f574b8
#emit 'Source: "' + DllsSrcDir + '\' + BzipDllName + '"; DestDir: "{app}"; DestName: ' + BzipDllName + '; Flags: ignoreversion'
Packit f574b8
#emit 'Source: "' + DllsSrcDir + '\' + BzipExeName + '"; DestDir: "{app}"; DestName: ' + BzipExeName + '; Flags: ignoreversion'
Packit f574b8
#emit 'Source: "' + DllsSrcDir + '\' + GzipExeName + '"; DestDir: "{app}"; DestName: ' + GzipExeName + '; Flags: ignoreversion'
Packit f574b8
#emit 'Source: "' + DocsSrcDir + '\*.*"; DestDir: "{app}\doc"; Flags: '
Packit f574b8
#emit 'Source: "' + DocsSrcDir + '\..\samples\*.*"; DestDir: "{app}\doc\samples"; Flags: '
Packit f574b8
#emit 'Source: "' + DocsSrcDir + '\..\test\*.*"; DestDir: "{app}\doc\test"; Flags: '
Packit f574b8
#emit 'Source: "' + HelpSrcDir + '\*.*"; DestDir: "{app}\help"; Flags: '
Packit f574b8
#emit 'Source: "' + HelpSrcDir + '\keystrokes\*.*"; DestDir: "{app}\help\keystrokes"; Flags: '
Packit f574b8

Packit f574b8
; some of these data files are from an earlier installer by Claudio Santambrogio
Packit f574b8
Source: "..\lynx.cfg"; DestDir: "{app}" ; AfterInstall: myCustomCfg; Flags: ignoreversion
Packit f574b8
Source: "..\lynx.man"; DestDir: "{app}"
Packit f574b8
Source: "..\samples\*.lss"; DestDir: "{app}"
Packit f574b8
Source: "..\samples\home.htm"; DestDir: "{app}"
Packit f574b8
Source: "..\samples\jumps.htm"; DestDir: "{app}"
Packit f574b8
Source: "..\samples\lynx-demo.cfg"; DestDir: "{app}"
Packit f574b8
Source: "..\samples\lynx.bat"; DestDir: "{app}"
Packit f574b8
Source: "..\samples\lynx.ico"; DestDir: "{app}\icon"
Packit f574b8
Source: "..\samples\lynx_bookmarks.htm"; DestDir: "{app}"
Packit f574b8
Source: "..\samples\oldlynx.bat"; DestDir: "{app}"
Packit f574b8
; NOTE: Don't use "Flags: ignoreversion" on any shared system files
Packit f574b8

Packit f574b8
[Icons]
Packit f574b8
Name: "{group}\{#MyAppName}"; Filename: "{app}\{#MyAppExeName}"
Packit f574b8
Name: "{group}\{cm:UninstallProgram,{#MyAppName}}"; Filename: "{uninstallexe}"
Packit f574b8
Name: "{commondesktop}\{#MyAppName}"; Filename: "{app}\{#MyAppExeName}"; Tasks: desktopicon
Packit f574b8

Packit f574b8
[Run]
Packit f574b8
Filename: "{app}\{#MyAppExeName}"; Description: "{cm:LaunchProgram,{#MyAppName}}"; Flags: nowait postinstall skipifsilent
Packit f574b8

Packit f574b8
[UninstallDelete]
Packit f574b8
Type: files; Name: {app}\.lynx_cookies
Packit f574b8
Type: dirifempty; Name: {app}
Packit f574b8
#emit 'Type: files; Name: ' + mySendTo
Packit f574b8
#emit 'Type: files; Name: ' + myQuickLaunch
Packit f574b8

Packit f574b8
[Code]
Packit f574b8
#emit 'const MY_APP_NAME = ''{app}\' + myAppProg + '.exe'';'
Packit f574b8

Packit f574b8

Packit f574b8
function isGuru(): Boolean;
Packit f574b8
begin
Packit f574b8
    Result := isAdminLoggedOn();
Packit f574b8
end;
Packit f574b8

Packit f574b8
function environRootKey(): Integer;
Packit f574b8
begin
Packit f574b8
    Result := HKEY_CURRENT_USER;
Packit f574b8
end;
Packit f574b8

Packit f574b8
function appKey(): string;
Packit f574b8
begin
Packit f574b8
    Result := 'Software\Lynx';
Packit f574b8
end;
Packit f574b8

Packit f574b8
function envSubKey(): string;
Packit f574b8
begin
Packit f574b8
    Result := 'Environment';
Packit f574b8
end;
Packit f574b8

Packit f574b8
function appSubKey(): string;
Packit f574b8
begin
Packit f574b8
    Result := appKey() + '\' + envSubKey();
Packit f574b8
end;
Packit f574b8

Packit f574b8
function envSysKey(): string;
Packit f574b8
begin
Packit f574b8
    Result := 'System\CurrentControlSet\Control\Session Manager\Environment';
Packit f574b8
end;
Packit f574b8

Packit f574b8
// Set the environment variable ValueName.
Packit f574b8
procedure addVarToEnv(const RootKey: Integer; const SubKeyName, ValueName, toAdd: String);
Packit f574b8
var
Packit f574b8
    Updated : string;
Packit f574b8
begin
Packit f574b8
    Updated := ExpandConstant(toAdd);
Packit f574b8
    RegWriteStringValue(RootKey, SubKeyName, ValueName, Updated);
Packit f574b8
    Log('Added ' + toAdd + ' to ' + ValueName);
Packit f574b8
    // MsgBox('addVarToEnv: ' #13#13 + ValueName + '="' + Updated + '"', mbInformation, MB_OK)
Packit f574b8
end;
Packit f574b8

Packit f574b8
// Remove the given environment variable ValueName.
Packit f574b8
function removeVarFromEnv(const RootKey: Integer; const SubKeyName, ValueName: String): Boolean;
Packit f574b8
var
Packit f574b8
    Current : string;
Packit f574b8
begin
Packit f574b8
    Result := False;
Packit f574b8
    if RegQueryStringValue(RootKey, SubKeyName, ValueName, Current) then
Packit f574b8
    begin
Packit f574b8
        RegDeleteValue(RootKey, SubKeyName, ValueName);
Packit f574b8
        Result := True;
Packit f574b8
        Log('Removed ' + ValueName);
Packit f574b8
        // MsgBox('removeVarFromEnv: ' #13#13 + ValueName + '="' + Current + '"', mbInformation, MB_OK)
Packit f574b8
    end;
Packit f574b8
end;
Packit f574b8

Packit f574b8
function selectedVarsRootKey(): Integer;
Packit f574b8
begin
Packit f574b8
    if isTaskSelected('for_all_users') then
Packit f574b8
        Result := HKEY_LOCAL_MACHINE
Packit f574b8
    else
Packit f574b8
        Result := HKEY_CURRENT_USER;
Packit f574b8
end;
Packit f574b8

Packit f574b8
function selectedVarsSubKey(): String;
Packit f574b8
begin
Packit f574b8
    if isTaskSelected('for_all_users') then
Packit f574b8
    begin
Packit f574b8
        if isTaskSelected('register_vars') then
Packit f574b8
            Result := appSubKey()
Packit f574b8
        else
Packit f574b8
            Result := envSysKey();
Packit f574b8
    end else
Packit f574b8
    begin
Packit f574b8
        if isTaskSelected('register_vars') then
Packit f574b8
            Result := appSubKey()
Packit f574b8
        else
Packit f574b8
            Result := envSubKey();
Packit f574b8
    end;
Packit f574b8
end;
Packit f574b8

Packit f574b8
procedure addAnyVariable(const ValueName, newValue: String);
Packit f574b8
begin
Packit f574b8
    addVarToEnv(selectedVarsRootKey(), selectedVarsSubKey(), ValueName, NewValue);
Packit f574b8
end;
Packit f574b8

Packit f574b8
// FIXME: should only remove if it matches the installer's value
Packit f574b8
procedure removeAnyVariable(const ValueName: String);
Packit f574b8
begin
Packit f574b8
    removeVarFromEnv(HKEY_CURRENT_USER, envSubKey(), ValueName);
Packit f574b8
    removeVarFromEnv(HKEY_CURRENT_USER, appSubKey(), ValueName);
Packit f574b8
    removeVarFromEnv(HKEY_LOCAL_MACHINE, appSubKey(), ValueName);
Packit f574b8
    removeVarFromEnv(HKEY_LOCAL_MACHINE, envSysKey(), ValueName);
Packit f574b8
end;
Packit f574b8

Packit f574b8
// http://www.delphidabbler.com/articles?article=12
Packit f574b8
procedure AddSendTo();
Packit f574b8
begin
Packit f574b8
  CreateShellLink(
Packit f574b8
#emit 'ExpandConstant(''' + MySendTo + '''),'
Packit f574b8
#emit '''SendTo link for ' + myAppName + ''','
Packit f574b8
    ExpandConstant(MY_APP_NAME),      // program
Packit f574b8
    '',                               // option(s) will be followed by pathname
Packit f574b8
    '',                               // no target directory
Packit f574b8
    '',                               // no icon filename
Packit f574b8
    -1,                               // no icon index
Packit f574b8
    SW_SHOWNORMAL);
Packit f574b8
end;
Packit f574b8

Packit f574b8
procedure AddQuickLaunch();
Packit f574b8
begin
Packit f574b8
  CreateShellLink(
Packit f574b8
#emit 'ExpandConstant(''' + MyQuickLaunch + '''),'
Packit f574b8
#emit '''SendTo link for ' + myAppName + ''','
Packit f574b8
    ExpandConstant(MY_APP_NAME),      // program
Packit f574b8
    '',                               // option(s) will be followed by pathname
Packit f574b8
    '',                               // no target directory
Packit f574b8
    '',                               // no icon filename
Packit f574b8
    -1,                               // no icon index
Packit f574b8
    SW_SHOWNORMAL);
Packit f574b8
end;
Packit f574b8

Packit f574b8
// This is called after installing the executable.
Packit f574b8
procedure myPostExecutable();
Packit f574b8
var
Packit f574b8
  Keypath : String;
Packit f574b8
  AppDir  : String;
Packit f574b8
begin
Packit f574b8
  Keypath := appKey();
Packit f574b8
  AppDir := ExpandConstant('{app}');
Packit f574b8
  Log('Setting registry key "' + Keypath + '" to "' + AppDir + '"');
Packit f574b8
  if not RegWriteStringValue(selectedVarsRootKey(), Keypath, '', AppDir) then
Packit f574b8
    Log('Failed to set key');
Packit f574b8

Packit f574b8
  if isTaskSelected('use_sendto') then
Packit f574b8
    begin
Packit f574b8
    AddSendTo();
Packit f574b8
    Log('** added Send-To link');
Packit f574b8
    end;
Packit f574b8

Packit f574b8
  if isTaskSelected('quicklaunchicon') then
Packit f574b8
    begin
Packit f574b8
    AddQuickLaunch();
Packit f574b8
    Log('** added Quick-launch link');
Packit f574b8
    end;
Packit f574b8
end;
Packit f574b8

Packit f574b8
// This is called after installing the lynx.cfg file.
Packit f574b8
procedure myCustomCfg();
Packit f574b8
var
Packit f574b8
  AppDir  : String;
Packit f574b8
  CfgFile : String;
Packit f574b8
begin
Packit f574b8
  AppDir := ExpandConstant('{app}');
Packit f574b8
  CfgFile := AppDir + '\lynx.cfg';
Packit f574b8

Packit f574b8
  addAnyVariable('LYNX_CFG', CfgFile);
Packit f574b8
  Log('** set LYNX_CFG=' + CfgFile);
Packit f574b8

Packit f574b8
  SaveStringToFile(CfgFile, 'HELPFILE:' + AppDir + '/help/Lynx_help_main.html.gz' + #10, True);
Packit f574b8
  SaveStringToFile(CfgFile, 'COLOR_STYLE:' + AppDir + '/lynx.lss' + #10, True);
Packit f574b8

Packit f574b8
  SaveStringToFile(CfgFile, 'CHMOD_PATH:' + #10, True);
Packit f574b8
  SaveStringToFile(CfgFile, 'COPY_PATH:' + #10, True);
Packit f574b8
  SaveStringToFile(CfgFile, 'MKDIR_PATH:' + #10, True);
Packit f574b8
  SaveStringToFile(CfgFile, 'MV_PATH:' + #10, True);
Packit f574b8
  SaveStringToFile(CfgFile, 'RMDIR_PATH:' + #10, True);
Packit f574b8
  SaveStringToFile(CfgFile, 'RM_PATH:' + #10, True);
Packit f574b8
  SaveStringToFile(CfgFile, 'TOUCH_PATH:' + #10, True);
Packit f574b8

Packit f574b8
  Log('** customized ' + CfgFile);
Packit f574b8

Packit f574b8
  if isTaskSelected('use_sendto') then
Packit f574b8
    begin
Packit f574b8
    AddSendTo();
Packit f574b8
    Log('** added Send-To link');
Packit f574b8
    end;
Packit f574b8
end;
Packit f574b8

Packit f574b8
function CleanupMyKey(const theRootKey: Integer): Boolean;
Packit f574b8
var
Packit f574b8
  Path : String;
Packit f574b8
  Value : String;
Packit f574b8
begin
Packit f574b8
  Result := False;
Packit f574b8
  if RegQueryStringValue(theRootKey, appKey(), '', Value) then
Packit f574b8
    begin
Packit f574b8
      if Value <> '' then
Packit f574b8
        begin
Packit f574b8
        Result := True;
Packit f574b8
        Log('Deleting value of "' + appKey() + '" = "' + Value + '"');
Packit f574b8
        if not RegDeleteValue(theRootKey, appKey(), '') then
Packit f574b8
          Log('Failed to delete value');
Packit f574b8

Packit f574b8
        Path := appKey() + '\Environment';
Packit f574b8
        Log('Checking for subkey "' + Path + '"');
Packit f574b8
        if RegValueExists(theRootKey, Path, '') then
Packit f574b8
          begin
Packit f574b8
          if RegDeleteKeyIncludingSubkeys(theRootKey, Path) then
Packit f574b8
            Log('Deleted key "' + Path + '"')
Packit f574b8
          else
Packit f574b8
            Log('Failed to delete key "' + Path + '"');
Packit f574b8
          end;
Packit f574b8

Packit f574b8
        if RegDeleteKeyIfEmpty(theRootKey, appKey()) then
Packit f574b8
          Log('Deleted key "' + appKey() + '"')
Packit f574b8
        else
Packit f574b8
          Log('Failed to delete key "' + appKey() + '"');
Packit f574b8
        end
Packit f574b8
    end
Packit f574b8
end;
Packit f574b8

Packit f574b8
#ifdef SslGlob1
Packit f574b8
#emit "const SslGlob1 = " + SslGlob1 + ";"
Packit f574b8
#emit "const SslGlob2 = " + SslGlob2 + ";"
Packit f574b8
var
Packit f574b8
    SslDirPage     : TInputFileWizardPage;
Packit f574b8
    SslLibraryPath : String;
Packit f574b8

Packit f574b8
function DirContains(const PathList: string; const PathItem: string): Boolean;
Packit f574b8
var
Packit f574b8
    myList : string;
Packit f574b8
    myItem : string;
Packit f574b8
    myPart : string;
Packit f574b8
    offset : integer;
Packit f574b8
begin
Packit f574b8
    Result := False;
Packit f574b8
    myList := Uppercase(PathList);
Packit f574b8
    myItem := Uppercase(RemoveBackslashUnlessRoot(PathItem));
Packit f574b8
    offset := Pos(myItem, myList);
Packit f574b8
    if offset <> 0 then
Packit f574b8
        begin
Packit f574b8
        myPart := Copy( myList, offset + Length(myItem), Length(myList) );
Packit f574b8
        if ( Length(myPart) = 0 ) or ( Pos(';', myPart) = 1 ) or ( Pos('\;', myPart) = 1 ) then
Packit f574b8
            begin
Packit f574b8
            Result := True;
Packit f574b8
            end;
Packit f574b8
        end;
Packit f574b8
end;
Packit f574b8

Packit f574b8
function PathCat(const head, tail: string): string;
Packit f574b8
begin
Packit f574b8
    Result := RemoveBackslashUnlessRoot(head) + '\' + tail;
Packit f574b8
end;
Packit f574b8

Packit f574b8
procedure CopyFromTo(const source, target, name: string);
Packit f574b8
var
Packit f574b8
    FailExists : Boolean;
Packit f574b8
    Status:      Boolean;
Packit f574b8
begin
Packit f574b8
    Log('Copy from: ' + PathCat(source, name));
Packit f574b8
    Log('Copy   to: ' + PathCat(target, name));
Packit f574b8
    FailExists := False;
Packit f574b8
    Status := FileCopy(PathCat(source, name), PathCat(target, name), FailExists);
Packit f574b8
    if not Status then
Packit f574b8
        begin
Packit f574b8
        MsgBox('Failed to copy ' + name, mbError, MB_OK);
Packit f574b8
        Abort();
Packit f574b8
        end;
Packit f574b8
end;
Packit f574b8

Packit f574b8
procedure ReallyDelete(const fullPath: string);
Packit f574b8
begin
Packit f574b8
    if DeleteFile( fullPath ) then
Packit f574b8
        Log( '...successful' )
Packit f574b8
    else
Packit f574b8
        begin
Packit f574b8
        MsgBox('Failed to delete ' + fullPath, mbError, MB_OK);
Packit f574b8
        end;
Packit f574b8
end;
Packit f574b8

Packit f574b8
procedure DeleteAppFile(const name: string);
Packit f574b8
var
Packit f574b8
    AppDir   : string;
Packit f574b8
    fullPath : string;
Packit f574b8
    findRec  : TFindRec;
Packit f574b8
begin
Packit f574b8
    AppDir := ExpandConstant('{app}');
Packit f574b8
    fullPath := PathCat( AppDir, name );
Packit f574b8
    Log( 'Deleting ' + fullPath );
Packit f574b8
    if Pos('*', fullPath) <> 0 then
Packit f574b8
        begin
Packit f574b8
        if FindFirst(fullPath, findRec) then
Packit f574b8
            begin
Packit f574b8
            ReallyDelete( PathCat( AppDir, findRec.name ) );
Packit f574b8
            while FindNext( findRec ) do
Packit f574b8
                ReallyDelete( PathCat( AppDir, findRec.name ) );
Packit f574b8
            end
Packit f574b8
        end
Packit f574b8
    else
Packit f574b8
        begin
Packit f574b8
        ReallyDelete( fullPath );
Packit f574b8
        end;
Packit f574b8
end;
Packit f574b8

Packit f574b8
function checkSslDir(): Boolean;
Packit f574b8
begin
Packit f574b8
    Result := True;
Packit f574b8
    SslLibraryPath := Trim( SslDirPage.Values[0] );
Packit f574b8
    if ( Length( SslLibraryPath ) = 0 ) or ( not FileExists( SslLibraryPath ) ) then
Packit f574b8
        begin
Packit f574b8
        MsgBox('No SSL library found', mbError, MB_OK)
Packit f574b8
        Result := False;
Packit f574b8
        end;
Packit f574b8
end;
Packit f574b8

Packit f574b8
procedure copySslDlls();
Packit f574b8
var
Packit f574b8
    SslDirectory   : String;
Packit f574b8
    SslFilename    : String;
Packit f574b8
    TargetDir      : String;
Packit f574b8
begin
Packit f574b8
    Log('Copying SSL DLLs');
Packit f574b8
    SslDirectory := ExtractFilePath(SslLibraryPath);
Packit f574b8

Packit f574b8
    // If the directory is not already in the PATH, copy the DLLs to
Packit f574b8
    // the application directory.
Packit f574b8
    if DirContains( GetEnv('PATH'), SslDirectory) then
Packit f574b8
        Log( 'PATH contains SSL directory' )
Packit f574b8
    else
Packit f574b8
        begin
Packit f574b8
        TargetDir := ExpandConstant('{app}');
Packit f574b8
        CreateDir(TargetDir);
Packit f574b8
        if DirExists(TargetDir) then
Packit f574b8
            begin
Packit f574b8
            SslFilename := Lowercase( ExtractFileName( SslLibraryPath ) );
Packit f574b8
            CopyFromTo( SslDirectory, TargetDir, SslFilename );
Packit f574b8
            Log( 'comparing: ' + SslFilename + ' to ' + SslGlob1 );
Packit f574b8
            if CompareText( SslFilename, SslGlob1 ) = 0 then
Packit f574b8
                // old-ssl is literal, new is a glob...
Packit f574b8
                CopyFromTo( SslDirectory, TargetDir, SslGlob2 )
Packit f574b8
            else
Packit f574b8
                // new-ssl matches "libssl-x-x-z", s/libssl/libcrypto/
Packit f574b8
                SslFilename := 'libcrypto' + Copy(SslFilename, 7, Length(SslFilename));
Packit f574b8
                CopyFromTo( SslDirectory, TargetDir, SslFilename );
Packit f574b8
            CopyFromTo( SslDirectory, TargetDir, 'msvcr120.dll' );
Packit f574b8
            end
Packit f574b8
        else
Packit f574b8
            begin
Packit f574b8
            MsgBox( 'Cannot create application directory', mbError, MB_OK )
Packit f574b8
            Abort();
Packit f574b8
            end
Packit f574b8
        end;
Packit f574b8
    Log('done - Copying SSL DLLs');
Packit f574b8
end;
Packit f574b8

Packit f574b8
procedure RegisterPreviousData(PreviousDataKey: Integer);
Packit f574b8
begin
Packit f574b8
    SetPreviousData( PreviousDataKey, 'SSL PATH', SslLibraryPath );
Packit f574b8
end;
Packit f574b8

Packit f574b8
function NextButtonClick(CurPageId: integer): Boolean;
Packit f574b8
begin
Packit f574b8
    Result := True;
Packit f574b8
    if CurPageId = SslDirPage.Id then
Packit f574b8
        begin
Packit f574b8
        Result := checkSslDir();
Packit f574b8
        end;
Packit f574b8
end;
Packit f574b8

Packit f574b8
procedure CurStepChanged(CurStep: TSetupStep);
Packit f574b8
begin
Packit f574b8
    if CurStep = ssInstall then
Packit f574b8
    begin
Packit f574b8
        CopySslDlls();
Packit f574b8
    end;
Packit f574b8
end;
Packit f574b8

Packit f574b8
procedure InitializeWizard();
Packit f574b8
var
Packit f574b8
    myGlob: string;
Packit f574b8
begin
Packit f574b8
    // Create a page to locate the SSL library
Packit f574b8
    SslDirPage := CreateInputFilePage(wpSelectDir,
Packit f574b8
        'Select SSL Library Location',
Packit f574b8
        'Where is the SSL library located?',
Packit f574b8
        'Select it from the directory, then click Next.');
Packit f574b8

Packit f574b8
    myGlob := 'SSL dll|' + SslGlob1;
Packit f574b8
    Log( 'search for SSL libraries ' + myGlob );
Packit f574b8
    SslDirPage.Add( 'Locate SSL library:', myGlob, '*.dll' );
Packit f574b8
    SslDirPage.Values[0] := GetPreviousData( 'SSL PATH', '' );
Packit f574b8
end;
Packit f574b8
#endif
Packit f574b8

Packit f574b8
// On uninstall, we do not know which registry setting was selected during install, so we remove all.
Packit f574b8
procedure CurUninstallStepChanged(CurUninstallStep: TUninstallStep);
Packit f574b8
begin
Packit f574b8
  case CurUninstallStep of
Packit f574b8
    usUninstall:
Packit f574b8
      begin
Packit f574b8
      Log('CurUninstallStepChanged:' + 'Uninstall is about to start.')
Packit f574b8
        // ...insert code to perform pre-uninstall tasks here...
Packit f574b8
#ifdef SslGlob1
Packit f574b8
      DeleteAppFile( SslGlob1 );
Packit f574b8
      DeleteAppFile( SslGlob2 );
Packit f574b8
      DeleteAppFile( 'msvcr120.dll' );
Packit f574b8
#endif
Packit f574b8
      end;
Packit f574b8
    usPostUninstall:
Packit f574b8
      begin
Packit f574b8
        removeAnyVariable('LYNX_CFG');
Packit f574b8
      {
Packit f574b8
        If we don't find the settings in the current user, try the local machine.
Packit f574b8
        The setup program cannot pass the all-users flag to the uninstaller, so we
Packit f574b8
        have to try both.
Packit f574b8
      }
Packit f574b8
      Log('Checking current-user registry key');
Packit f574b8
      if not CleanupMyKey(HKEY_CURRENT_USER) then
Packit f574b8
        begin
Packit f574b8
        Log('Checking local-machine registry key');
Packit f574b8
        CleanupMyKey(HKEY_LOCAL_MACHINE);
Packit f574b8
        end;
Packit f574b8

Packit f574b8
        Log('CurUninstallStepChanged:' + 'Uninstall just finished.');
Packit f574b8
      end;
Packit f574b8
  end;
Packit f574b8
end;