[Gtk-sharp-list] Problems with Gtk# 0.10 installer for Windows

Willem.Smit@sanlam.co.za Willem.Smit@sanlam.co.za
Thu, 3 Jul 2003 07:57:35 +0200


--0__=CDBBE7CBDFB3D51A8f9e8a93df938690918cCDBBE7CBDFB3D51A
Content-type: text/plain; charset=iso-8859-1
Content-transfer-encoding: quoted-printable


Mathias,
You can set environment variables using the windows installer. Otherwis=
e if
you want to do it in code you can use the EnvironmentPermission class i=
n
.net or with the CRT you can use
                =20
 _putenv,       =20
 _wputenv       =20
                =20


Hope that helps
Willem Smit
SL IT
9471637
0724872442





|---------+------------------------------------->
|         |           Mathias Hasselmann        |
|         |           <mathias.hasselmann@gmx.de|
|         |           >                         |
|         |           Sent by:                  |
|         |           gtk-sharp-list-admin@lists|
|         |           .ximian.com               |
|         |                                     |
|         |                                     |
|         |           02/07/2003 04:51 PM       |
|         |                                     |
|---------+------------------------------------->
  >--------------------------------------------------------------------=
------------------------------------------|
  |                                                                    =
                                          |
  |        To:      Shane Hyde <shane@enactive.org>, gtk-sharp-list mai=
ling list                                 |
  |        <gtk-sharp-list@lists.ximian.com>                           =
                                          |
  |        cc:                                                         =
                                          |
  |        Subject: Re: [Gtk-sharp-list] Problems with Gtk# 0.10 instal=
ler for Windows                           |
  >--------------------------------------------------------------------=
------------------------------------------|




Shane Hyde wrote:

> Hi,
>
> Just some feedback about the 0.10 Win32 installer.
>
> 1. Even if Mono is installed, don't install the assemblies to Mono,
> as it becomes (almost) impossible to use GTK# with .NET as System.*
> assemblies get picked up with GTK# ones.

Valid point. But the installer allows you to select any installation
location for the assemblies (at least I designed it that way ;-). Mono'=
s
directory was choose 'cause I don't know a good way to tell Mono to
search assemblies outside of it's installation directory. Ok. There is
the MONO_PATH variable? But how to set this variable on the Windows
platform? C:\autoexec.bat munging? Behave! Well, maybe there is a hidde=
n
registry entry to modify the default environment I'm not aware of.

> 2. libglade is installed in the wrong directory, and is wrongly named=

> (should be libglade-2.0-0.dll)

D'uh. Same is true for libxml2.dll. Fixed that. New NSIS script attache=
d.

> 3. GTK# should not include GTK runtime.  Nor should it include a
> preinstalled theme.
 > 4. GTK# should install into an existing GTK Runtime.  This makes the=

 > most sense, and allows for all the Mono/.NET stuff to be removed fro=
m
 > the installer.

This is a really sensible point. Personally I also prefer a package
oriented installation scheme - as we know it from Unix. So I that's wha=
t
I did with the first versions of the 0.10 installer. But then I was tol=
d
from different sides that the Gtk+ runtime should be included sind
"Windows users don't like it to run four  installers (.NET/Mono, Gtk+,
Gtk#, $APPLICATION) to get a single application running". So what's the=

right way to do this? Gtk# installer with Gtk+ runtime? Gtk# installer
depending on the Gtk+ runtime installer? Both flavors and let the users=

vote (for instance by measuring download rates)?

For the multiple installer problem I suggested to use a component setup=

approach as I'm using for some software I do at work, or like Microsoft=

did for Visual Studio .NET (see the attached pictures for example).
Could donate code for that purpose. But isn't this component setup thin=
g
too much power user centric?

 > Changing the theme should ask the user beforehand.

Maybe. Have choosen the gtkwimp theme as default since IHMO this one
provides best intgration of Gtk+ into the Windows platform.

 > Doing this also fixes all the path munging.

AFAIK the need for %PATH% munging is not affected by this: The patch fo=
r
Gtk.Application.Init is needed, since Gtk# depends on pinvoking the Gtk=
+
libraries. To do this successfully we must allow all Gtk# applications
to find the Gtk+ libraries. Possible solutions:

             1) Gtk+ is installed in %SystemRoot%\System32
             2) every Gtk# application adjust HLKM\SOFTWARE\Microsoft\
                Windows\App Paths\$APPNAME\Path
             3) Gtk+ globally fixes %PATH% on installation

IHMO "solution" 1 and 2 definitly are out of discussion. Solution 3
doesn't work since appearently nobody in the Gtk+/Gtk# community knows,=

how to cleanly set global environment variables on the Windows platform=
.

> 5. If Mono is not installed, the default install dir is blank.

Yet another prove for Dijkstra being right, when considering "goto"
being harmful. ;-)

Ciao,
Mathias
(See attached file: ComponentSetup.png)(See attached file:
VisualStudio.png)#
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D
# Installation script for Gtk#
# Copyright (C) 2003 Mathias Hasselmann <mathias@taschenorakel.de>
# ---------------------------------------------------------------------=

# Author: Mathias Hasselmann
# ---------------------------------------------------------------------=

# Plugins: AdvSplash,ModernUI
# Last modified: 2003/06/24
# ---------------------------------------------------------------------=

# Globals:
#   $0 - Location of the .NET Framework
# =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D

# *********************************************************************=

# INSTALLER SETTINGS
# *********************************************************************=


!define Product "Gtk# Runtime and Development Environment"
!define Vendor "http://gtk-sharp.sf.net/"
!define Version "0.10"
!define Build "-5"

!define Package "Gtk#-${Version}"
!define PackageKey "Software\Gtk#\${Version}"
!define UninstallBase "Software\Microsoft\Windows\CurrentVersion\Uninst=
all"
!define UninstallKey "${UninstallBase}\${Product}"
!define UninstallApp "$INSTDIR\gtk-sharp-${Version}.uninstall.exe"

# =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D
# Output options
# =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D

SetCompressor bzip2
SetCompress force
CRCCheck force

InstallDir "$PROGRAMFILES\${Package}"
LicenseData "gtk-sharp-${Version}\COPYING"
OutFile "gtk-sharp-${Version}-win32${Build}.exe"

# =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D
# Modern UI options
# =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D

!define MUI_VENDOR  "${Vendor}"
!define MUI_PRODUCT "${Product}"
!define MUI_VERSION "${Version}"
#!define MUI_ICON "images\install.ico"
#!define MUI_UNICON "images\uninstall.ico"
!define MUI_ABORTWARNING

# Custom event handlers
# ---------------------------------------------------------------------=


# Pages of the installation wizard
# ---------------------------------------------------------------------=

!define MUI_CUSTOMPAGECOMMANDS
!define MUI_WELCOMEPAGE
!define MUI_LICENSEPAGE
!define MUI_DIRECTORYPAGE
!define MUI_FINISHPAGE
!define MUI_FINISHPAGE_NOAUTOCLOSE

# Pages of the deinstallation wizard
# ---------------------------------------------------------------------=

!define MUI_UNINSTALLER
!define MUI_UNCONFIRMPAGE

# Include modern UI code
# ---------------------------------------------------------------------=

!include "MUI.nsh"
!insertmacro MUI_LANGUAGE "English"

!insertmacro MUI_PAGECOMMAND_WELCOME
!insertmacro MUI_PAGECOMMAND_LICENSE
Page custom MonoSelector "" ""
Page custom DotNETSelector "" ""
!insertmacro MUI_PAGECOMMAND_DIRECTORY
!insertmacro MUI_PAGECOMMAND_INSTFILES
!insertmacro MUI_PAGECOMMAND_FINISH

!insertmacro MUI_SECTIONS_FINISHHEADER

# *********************************************************************=

# INSTALLER SECTIONS
# *********************************************************************=


# =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D
# This section installs the library on the computer
# =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D

!macro InstallAssembly FILENAME
  File ${FILENAME}

  Push $0
  Push ${FILENAME}
  Call InstallAssembly
!macroend

Section "!Gtk+ Runtime Environment"
  SetOutPath $TEMP
    File packages\GtkRuntime.exe

  SetOutPath $INSTDIR
    DetailPrint "Installing Gtk+ Runtime Environment..."
    nsExec::ExecToLog "$TEMP\GtkRuntime.exe -y"
    Pop $R0
    Delete "$TEMP\GtkRuntime.exe"

  SetOutPath $INSTDIR\share\themes\Default\gtk-2.0
    File gtkrc

SectionEnd

Section "!libxml2"
  SetOutPath "$INSTDIR\lib"
    File libxml2.dll
SectionEnd

Section "!libglade"
  SetOutPath "$INSTDIR\lib"
    File /oname=3Dlibglade-2.0-0.dll libglade.dll
SectionEnd

Section "!${Product} ${Version}"
  DetailPrint "Installing Gtk# Runtime Environment"

  WriteRegStr HKLM "${PackageKey}" Path $INSTDIR
  WriteRegStr HKLM "${PackageKey}" Version ${Version}

  SetOutPath $INSTDIR
    File gtksharp.snk

  SetOutPath $INSTDIR\lib
    !insertmacro InstallAssembly glib-sharp.dll
    !insertmacro InstallAssembly pango-sharp.dll
    !insertmacro InstallAssembly atk-sharp.dll
    !insertmacro InstallAssembly gdk-sharp.dll
    !insertmacro InstallAssembly gtk-sharp.dll
    !insertmacro InstallAssembly glade-sharp.dll
    File gtksharpglue.dll
SectionEnd

# =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D
# This section creates the uninstall program
# =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D

Section "-UninstallProgram"
  WriteUninstaller "${UninstallApp}"

# Some essential information describing program operation
# ---------------------------------------------------------------------=

  WriteRegStr HKLM "${UninstallKey}" UninstallString "${UninstallApp}"
  WriteRegDWORD HKLM "${UninstallKey}" NoModify 1
  WriteRegDWORD HKLM "${UninstallKey}" NoRepair 1

# Some support information for the product
# ---------------------------------------------------------------------=

  WriteRegStr HKLM "${UninstallKey}" InstallLocation "$INSTDIR"
  WriteRegStr HKLM "${UninstallKey}" DisplayName "${Product} ${Version}=
"
  WriteRegStr HKLM "${UninstallKey}" DisplayVersion "${Version}"
  WriteRegStr HKLM "${UninstallKey}" Publisher "${Vendor}"
  WriteRegStr HKLM "${UninstallKey}" URLInfoAbout "http://gtk-sharp.sf.=
net/
"
  WriteRegStr HKLM "${UninstallKey}" URLUpdateInfo "
http://sf.net/project/showfiles.php?group_id=3D40240"
  WriteRegStr HKLM "${UninstallKey}" HelpLink "
http://gtk-sharp.sf.net/faq.html"
  WriteRegStr HKLM "${UninstallKey}" Readme "
http://www.nullenvoid.com/gtksharp/wiki/"
SectionEnd

# =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D
# This section removes the program from your computer
# =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D

Section "Uninstall"
# Cleanup the program folder
# ---------------------------------------------------------------------=

MessageBox MB_OK|MB_ICONEXCLAMATION "TODO:$\n - Remove Gtk+ Runtime Fil=
es
$\n - Remove Assemblies from native and global cache"

  Delete "$INSTDIR\lib\libxml2.dll"
  Delete "$INSTDIR\lib\libglade.dll"
  Delete "$INSTDIR\lib\gtksharpglue.dll"

  Delete "$INSTDIR\lib\glib-sharp.dll"
  Delete "$INSTDIR\lib\pango-sharp.dll"
  Delete "$INSTDIR\lib\atk-sharp.dll"
  Delete "$INSTDIR\lib\gdk-sharp.dll"
  Delete "$INSTDIR\lib\gtk-sharp.dll"
  Delete "$INSTDIR\lib\glade-sharp.dll"
  Delete "${UninstallApp}"

  RMDir  "$INSTDIR\lib"
  RMDir  "$INSTDIR"

# Cleanup the registry
# ---------------------------------------------------------------------=

  DeleteRegKey HKLM "${PackageKey}"
  DeleteRegKey HKLM "${UninstallKey}"
SectionEnd

# *********************************************************************=

# UTILITY FUNCTIONS
# *********************************************************************=


# =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D
# Extract the next item from a string storing a vbar-separated list.
# ---------------------------------------------------------------------=

# Arguments:
#   iFirst - Character index of list's current item.
#   strItemList - The vbar-separated item list.
#
# Return Values:
#   iLast - Character index of the next list item.
#   strItem - The current item or the empty string if no more items
#             exist.
# ---------------------------------------------------------------------=

# Example:
#
#   StrCpy $R0 0
#   StrCpy $R1 "item1|item2|item3"
#
# Enum:
#   Push $R0             ; iFirst
#   Push $R1             ; strItemList
#   Call EnumItems
#   Pop $R1        ; strItem
#   Pop $R0        ; iLast
#
#   StrCmp $R1 "" Done
#   MessageBox MB_OK "Item: $R1"
#   Goto Enum
#
# Done:
#
# =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D

Function EnumItems                         ; Stack: [iFirst|strItemList=
]
  Exch $R0         ; strItemList           ; Stack: [iFirst|$R0]
  Exch                                                 ; Stack:
[$R0|iFirst]
  Exch $R1         ; iFirst          ; Stack: [$R0|$R1]
  Push $R2         ; iLast                       ; Stack: [$R0|$R1|$R2]=

  Push $R3         ; iCount          ; Stack: [$R0|$R1|$R2|$R3]
  Push $R4         ; ch                    ; Stack: [$R0|$R1|$R2|$R3|$R=
4]

  StrCpy $R2 $R1                     ; iLast =3D iFirst
  StrLen $R3 $R0                     ; iCount =3D strlen(strItemList)

EnumChars:
  IntCmp $R2 $R3 Done "" Done
  StrCpy $R4 $R0 1 $R2                     ; ch =3D strItemList[iLast]
  IntOp $R2 $R2 + 1                        ; iLast =3D iLast + 1

  StrCmp $R4 "|" Done EnumChars

Done:
  IntOp $R3 $R2 - $R1                      ; iCount =3D iLast - iFirst
  StrCpy $R0 $R0 $R3 $R1             ; strItem =3D SubStr(strItemList,
iFirst, iCount)
  StrCpy $R1 $R2                     ; iFirst =3D iLast

  IntOp $R3 $R3 - 1                        ; remove trailing separator
  StrCpy $R4 $R0 1 $R3
  StrCmp $R4 "|" "" Leave
  StrCpy $R0 $R0 $R3

Leave:                                                 ; Stack:
[$R0|$R1|$R2|$R3|$R4]
  Pop $R4                                  ; Stack: [$R0|$R1|$R2|$R3]
  Pop $R3                                  ; Stack: [$R0|$R1|$R2]
  Pop $R2                                  ; Stack: [$R0|$R1]
  Exch $R1                                 ; Stack: [$R0|iLast]
  Exch                                                 ; Stack: [iLast|=
$R0]
  Exch $R0                                 ; Stack: [iLast|strItem]
FunctionEnd

# =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D
# Install an assembly in the .NET Framework's native image and
# global assembly cache.
# ---------------------------------------------------------------------=

# Arguments:
#   strFrameworkList - Vbar-separated list of .NET framework paths.
#   strAssemblyPath - Path of the file storing the assembly.
# =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D

Function InstallAssembly
  Exch $R0         ; strAssemblyPath
  Exch
  Exch $R1         ; strFrameworkList
  Push $R2         ; iFirst
  Push $R3         ; strFrameWorkPath
  Push $R4         ; waste

  StrCpy $R2 0           ; iFirst =3D 0

EnumFrameworks:
  Push $R2         ; iFirst
  Push $R1         ; strFrameworkList
  Call EnumItems
  Pop $R3          ; strFrameworkPath
  Pop $R2          ; iLast

  StrCmp $R3 "" Done NativeImageCache

NativeImageCache:
  IfFileExists '$R3\ngen.exe' +1 Next
    DetailPrint 'Registering $R0 in native image cache...'
    nsExec::ExecToLog '"$R3\ngen.exe" /nologo "$R0"'
    Pop $R4

Next:
  Goto EnumFrameworks

Done:
  nsExec::ExecToLog '"$TEMP\mygacutil.exe" install "$R0"'
  Pop $R4

  Pop $R4
  Pop $R3
  Pop $R2
  Pop $R1
  Pop $R0
FunctionEnd

# *********************************************************************=

# CALLBACK FUNCTIONS
# *********************************************************************=


# =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D
# This callback is called on initialization of the installer.
# Here it displays a splash screen and it initializes $0 with the
# short product name.
# =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D

Function .onInit
  Push $R0

  ReserveFile splash.bmp MonoSelector.ini MonoSelector.ini mygacutil.ex=
e

# Display the splash screen
# ---------------------------------------------------------------------=

  GetTempFileName $R0
  File "/oname=3D$R0" splash.bmp
  AdvSplash::Show 5000 600 400 -1 $R0
  Delete "$R0"

# Extract GUI descriptions
# ---------------------------------------------------------------------=

  !insertmacro MUI_INSTALLOPTIONS_EXTRACT MonoSelector.ini
  !insertmacro MUI_INSTALLOPTIONS_EXTRACT DOTNetSelector.ini

# Extract mygacutil
# ---------------------------------------------------------------------=

  File "/oname=3D$TEMP\mygacutil.exe" mygacutil.exe

  Pop $R0
FunctionEnd

# =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D
# This callback is called to create the MonoSelector page. This page
# allows selection of a Mono SDK as installation location. If no copy
# of Mono is found, no page is displayed and "$PROGRAMFILES\${Package}"=

# is used as installation location. If exactly one copy is found, also
# no page is displayed, but the SDK's location is used as installation
# location. If multiply installations of Mono have been found a page
# allowing the selection of one of them.
# =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D

Function MonoSelector
  Push $R0 ; strListItems
  Push $R1 ; iMonoKey
  Push $R2 ; iMonoCount
  Push $R3 ; strMonoVersion/strMonoPath
  Push $R4 ; strDefaultCLR

# Make a default selection for the case Mono is not found
# ---------------------------------------------------------------------=

  !insertmacro MUI_INSTALLOPTIONS_WRITE "MonoSelector.ini" \
    "MonoLocations" "Path0" "$PROGRAMFILES\${Package}"

# Figure out default CLR
# ---------------------------------------------------------------------=

  ReadRegStr $R4 HKLM "SOFTWARE\Mono" "DefaultCLR"

# Enumerate the Mono installations
# ---------------------------------------------------------------------=

  StrCpy $R0 ""
  StrCpy $R1 0
  StrCpy $R2 0

EnumVersions:
  EnumRegKey $R3 HKLM "SOFTWARE\Mono" $R1
  IntOp $R1 $R1 + 1
  StrCmp $R3 "" EndOfVersions

  ClearErrors
  ReadRegStr $R3 HKLM "SOFTWARE\Mono\$R3" "SdkInstallRoot"
  IfErrors EnumVersions
  IfFileExists "$R3\*.*" MonoFound EnumVersions

MonoFound:
  IntOp $R2 $R2 + 1
  StrCpy $R0 "$R0$R3|"

# Select ListItem, if current CLR is DefaultCLR
# ---------------------------------------------------------------------=

  StrCmp $R2 $R4 EnumVersions
  !insertmacro MUI_INSTALLOPTIONS_WRITE \
    "MonoSelector.ini" "Field 2" "State" $R3

  Goto EnumVersions

EndOfVersions:

# Fill the listbox
# ---------------------------------------------------------------------=

  StrCpy $R0 $R0 -1

  !insertmacro MUI_INSTALLOPTIONS_WRITE \
    "MonoSelector.ini" "Field 2" "ListItems" "$R0"

# Display the page only, if more than one version has been found
# ---------------------------------------------------------------------=

  IntCmp $R2 0 RestoreStack
  IntCmp $R2 1 SetInstdir

  !insertmacro MUI_HEADER_TEXT "Select Mono Runtime" \
    "Choose the Mono Runtime into which to integrate ${Product}."
  !insertmacro MUI_INSTALLOPTIONS_INITDIALOG "MonoSelector.ini"
  !insertmacro MUI_INSTALLOPTIONS_SHOW

# Adjust installation directory
# ---------------------------------------------------------------------=

SetInstdir:
  !insertmacro MUI_INSTALLOPTIONS_READ $R0 \
    "MonoSelector.ini" "Field 2" "State"
  StrCpy $INSTDIR $R0

# Restore stack
# ---------------------------------------------------------------------=

RestoreStack:
  Pop $R4
  Pop $R3
  Pop $R2
  Pop $R1
  Pop $R0
FunctionEnd

# =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D
# This callback is called to create the DotNETSelector page.
# =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D

Function DotNETSelector
  Push $R0 ; strInstallRoot
  Push $R1 ; iDotNETCount
  Push $R2 ; strListItems
  Push $R3 ; iVersionKey
  Push $R4 ; strVersion
  Push $R5 ; iPolicy
  Push $R6 ; strPolicy

# Figure out the .NET installation root
# ---------------------------------------------------------------------=

  StrCpy $0 ""
  ReadRegStr $R0 HKLM "SOFTWARE\Microsoft\.NETFramework" InstallRoot
  IfFileExists "$R0\*.*" "" Done

# Normalize InstallRoot
# ---------------------------------------------------------------------=

  Push $R0
  Exch $EXEDIR
  Exch $EXEDIR
  Pop $R0

# Enumerate the .NET Frameworks installed
# ---------------------------------------------------------------------=

  StrCpy $R1 0
  StrCpy $R2 ""
  StrCpy $R3 0

EnumVersions:
  EnumRegKey $R4 HKLM "SOFTWARE\Microsoft\.NETFramework\policy" $R3
  IntOp $R3 $R3 + 1
  StrCmp $R4 "" EndOfVersions
  StrCpy $R5 0

EnumPolicies:
  EnumRegValue $R6 HKLM "SOFTWARE\Microsoft\.NETFramework\policy\$R4" $=
R5
  IntOp $R5 $R5 + 1
  StrCmp $R6 "" EnumVersions

  IfFileExists "$R0\$R4.$R6\*.*" DotNETFound EnumPolicies

DotNETFound:
  IntOp $R1 $R1 + 1
  StrCpy $R2 "$R2$R0\$R4.$R6|"
  Goto EnumPolicies

EndOfVersions:

# Fill the listbox
# ---------------------------------------------------------------------=

  StrCpy $R0 $R0 -1

  !insertmacro MUI_INSTALLOPTIONS_WRITE \
    "DotNETSelector.ini" "Field 2" "ListItems" $R2
  !insertmacro MUI_INSTALLOPTIONS_WRITE \
    "DotNETSelector.ini" "Field 2" "State" $R2

# Display the page only, if more than one version has been found
# ---------------------------------------------------------------------=

  IntCmp $R1 2 "" Done

  !insertmacro MUI_HEADER_TEXT "Select .NET Frameworks" \
    "Choose the .NET Frameworks into which to integrate ${Product}."
  !insertmacro MUI_INSTALLOPTIONS_INITDIALOG "DotNETSelector.ini"
  !insertmacro MUI_INSTALLOPTIONS_SHOW

Done:
# Adjust installation directory
# ---------------------------------------------------------------------=

  !insertmacro MUI_INSTALLOPTIONS_READ $0 \
    "DotNETSelector.ini" "Field 2" "State"

# Restore stack
# ---------------------------------------------------------------------=

  Pop $R4
  Pop $R3
  Pop $R2
  Pop $R1
  Pop $R0
FunctionEnd




***************
Any views expressed in this message are those of the individual sender,=
 and
Sanlam accepts no liability therefore, except where the sender specific=
ally
states them to be those of Sanlam.
Enige sienswyses of stellings wat in hierdie boodskap uitgedruk word is=
 di=E9
van die individuele afsender, en Sanlam aanvaar geen aanspreeklikheid
daarvoor nie, behalwe waar die afsender uitdruklik vermeld dat dit di=E9=
 van
Sanlam is.
=

--0__=CDBBE7CBDFB3D51A8f9e8a93df938690918cCDBBE7CBDFB3D51A
Content-type: image/png; 
	name="=?iso-8859-1?Q?ComponentSetup.png?="
Content-Disposition: attachment; filename="=?iso-8859-1?Q?ComponentSetup.png?="
Content-transfer-encoding: base64

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

--0__=CDBBE7CBDFB3D51A8f9e8a93df938690918cCDBBE7CBDFB3D51A
Content-type: image/png; 
	name="=?iso-8859-1?Q?VisualStudio.png?="
Content-Disposition: attachment; filename="=?iso-8859-1?Q?VisualStudio.png?="
Content-transfer-encoding: base64

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

--0__=CDBBE7CBDFB3D51A8f9e8a93df938690918cCDBBE7CBDFB3D51A--