Name "My Application"
outfile 'test.exe'
showinstdetails show
licenseData '${NSISDIR}\License.txt'

page license
page custom CustomCreate CustomLeave
page instfiles

section -
;;;;;;;;;;;;;;
sectionend

function .onInit
initpluginsdir
gettempfilename $0
rename $0 '$PLUGINSDIR\custom.ini'
call WriteIni
functionend

function CustomCreate
ClearErrors
ReadRegStr $R1 HKLM "SOFTWARE\Microsoft\Windows\CurrentVersion" "RegisteredOwner"
IfErrors is_NT
WriteIniStr '$PLUGINSDIR\custom.ini' 'Field 2' 'State' '$R1'
ReadRegStr $R1 HKLM "SOFTWARE\Microsoft\Windows\CurrentVersion" "RegisteredOrganization"
WriteIniStr '$PLUGINSDIR\custom.ini' 'Field 3' 'State' '$R1'
goto DrawPage
is_NT:
ClearErrors
ReadRegStr $R1 HKLM "SOFTWARE\Microsoft\Windows NT\CurrentVersion" "RegisteredOwner"
WriteIniStr '$PLUGINSDIR\custom.ini' 'Field 2' 'State' '$R1'
ReadRegStr $R1 HKLM "SOFTWARE\Microsoft\Windows NT\CurrentVersion" "RegisteredOrganization"
WriteIniStr '$PLUGINSDIR\custom.ini' 'Field 3' 'State' '$R1'
DrawPage:
push $1
InstallOptions::Dialog '$PLUGINSDIR\custom.ini'
pop $1
functionend

function CustomLeave
Push $8
Push $7
Push $6
Push $5
Push $4
Push $3
Push $2
Push $1
Push $0

readinistr $1 '$PLUGINSDIR\custom.ini' 'Field 2' 'State'
strcmp $1 '' 0 +3
messagebox mb_ok|mb_iconexclamation 'plz enter user name'
abort

readinistr $1 '$PLUGINSDIR\custom.ini' 'Field 3' 'State'
strcmp $1 '' 0 +3
messagebox mb_ok|mb_iconexclamation 'plz enter company name'
abort

readinistr $2 '$PLUGINSDIR\custom.ini' 'Field 2' 'State'
readinistr $3 '$PLUGINSDIR\custom.ini' 'Field 3' 'State'
readinistr $5 '$PLUGINSDIR\custom.ini' 'Field 5' 'State'
readinistr $6 '$PLUGINSDIR\custom.ini' 'Field 6' 'State'
readinistr $7 '$PLUGINSDIR\custom.ini' 'Field 7' 'State'
readinistr $8 '$PLUGINSDIR\custom.ini' 'Field 8' 'State'

messagebox mb_yesno|mb_iconinformation \
"You have entered $\r$\n$\r$\n\
User Name: $2$\r$\n\
Company Name: $3$\r$\n\
Serial Number: $5 - $6 - $7 - $8$\r$\n$\r$\n\
Do you want to add these informations to the registry?" idno end
WriteRegStr HKCU "SOFTWARE\$(^name)" 'User Name' '$2'
WriteRegStr HKCU "SOFTWARE\$(^name)" 'Company Name' '$3'
WriteRegStr HKCU "SOFTWARE\$(^name)" 'Serial Number' '$5 - $6 - $7 - $8'
messagebox mb_yesno|mb_iconinformation \
"Informations successfully added to the registry.$\r$\n$\r$\n\
Do you wish to read them now?" idno end
ReadRegStr $0  HKCU "SOFTWARE\$(^name)" 'User Name'
ReadREgStr $1  HKCU "SOFTWARE\$(^name)" 'Company Name'
ReadREgStr $2  HKCU "SOFTWARE\$(^name)" 'Serial Number'
messagebox mb_yesno|mb_iconinformation \
"This is what we got from the registry.$\r$\n$\r$\n\
$$0 == $0$\r$\n\
$$1 == $1$\r$\n\
$$2 == $2$\r$\n$\r$\n\
Do you wish to Delete these registry records now?" idno end

StrCpy $0 0
loop:
EnumRegValue $1 HKCU "SOFTWARE\$(^name)" $0
StrCmp $1 "" done
IntOp $0 $0 + 1

ReadRegStr $2 HKCU "SOFTWARE\$(^name)" $1

MessageBox mb_yesno|mb_iconquestion "Value Name: $1 $\r$\n\
Value Data: $2$\n$\nClear value data?" idno loop ;+3
WriteRegStr HKCU "SOFTWARE\$(^name)" "$1" ""
ReadRegStr $2 HKCU "SOFTWARE\$(^name)" "$1"

MessageBox mb_yesno|mb_iconquestion "Value Name: $1 $\r$\n\
Delete value?" idno loop

DeleteRegValue HKCU "SOFTWARE\$(^name)" "$1"
IntOp $0 $0 - 1
goto loop

done:
StrCpy $0 0
EnumRegValue $1 HKCU "SOFTWARE\$(^name)" $0
StrCmp $1 "" empty
StrCpy $0 0
StrCpy $3 ""

start:
EnumRegValue $1 HKCU "SOFTWARE\$(^name)" $0
StrCmp $1 "" values
IntOp $0 $0 + 1
ReadRegStr $2 HKCU "SOFTWARE\$(^name)" $1
StrCpy $3 "$3$1=$2$\r$\n" ${NSIS_MAX_STRLEN}
goto start

values:
MessageBox mb_yesno|mb_iconexclamation "Remaining values:$\r$\n$3 $\r$\n\
Delete registry key anyway?" idno end
DeleteRegKey HKCU "SOFTWARE\$(^name)"
goto end

empty:
MessageBox mb_yesno|mb_iconexclamation "Registry Key is empty$\r$\n\
Delete the key now?" idno end
DeleteRegKey HKCU "SOFTWARE\$(^name)"

end:
Pop $0
Pop $1
Pop $2
Pop $3
Pop $4
Pop $5
Pop $6
Pop $7
Pop $8
functionend


#################################################################################
# This function builds the custom.ini at runtime rather than to
# add it as file at compile time and then extract it at runtime.
#################################################################################
Function WriteIni
WriteIniStr '$PLUGINSDIR\custom.ini' 'Settings' 'NumFields' '8'

WriteIniStr '$PLUGINSDIR\custom.ini' 'Field 1' 'Type' 'GroupBox'
WriteIniStr '$PLUGINSDIR\custom.ini' 'Field 1' 'Left' '20'
WriteIniStr '$PLUGINSDIR\custom.ini' 'Field 1' 'Top' '10'
WriteIniStr '$PLUGINSDIR\custom.ini' 'Field 1' 'Right' '-21'
WriteIniStr '$PLUGINSDIR\custom.ini' 'Field 1' 'Bottom' '-18'
WriteIniStr '$PLUGINSDIR\custom.ini' 'Field 1' 'Text' 'User Details'

WriteIniStr '$PLUGINSDIR\custom.ini' 'Field 2' 'Type' 'Text'
WriteIniStr '$PLUGINSDIR\custom.ini' 'Field 2' 'Left' '60'
WriteIniStr '$PLUGINSDIR\custom.ini' 'Field 2' 'Top' '26'
WriteIniStr '$PLUGINSDIR\custom.ini' 'Field 2' 'Right' '-61'
WriteIniStr '$PLUGINSDIR\custom.ini' 'Field 2' 'Bottom' '40'
WriteIniStr '$PLUGINSDIR\custom.ini' 'Field 2' 'State' 'user name here'

WriteIniStr '$PLUGINSDIR\custom.ini' 'Field 3' 'Type' 'Text'
WriteIniStr '$PLUGINSDIR\custom.ini' 'Field 3' 'Left' '60'
WriteIniStr '$PLUGINSDIR\custom.ini' 'Field 3' 'Top' '50'
WriteIniStr '$PLUGINSDIR\custom.ini' 'Field 3' 'Right' '-61'
WriteIniStr '$PLUGINSDIR\custom.ini' 'Field 3' 'Bottom' '64'
WriteIniStr '$PLUGINSDIR\custom.ini' 'Field 3' 'State' 'company name here'

WriteIniStr '$PLUGINSDIR\custom.ini' 'Field 4' 'Type' 'Label'
WriteIniStr '$PLUGINSDIR\custom.ini' 'Field 4' 'Left' '58'
WriteIniStr '$PLUGINSDIR\custom.ini' 'Field 4' 'Top' '76'
WriteIniStr '$PLUGINSDIR\custom.ini' 'Field 4' 'Right' '-25'
WriteIniStr '$PLUGINSDIR\custom.ini' 'Field 4' 'Bottom' '88'
WriteIniStr '$PLUGINSDIR\custom.ini' 'Field 4' 'Text' \
'plz enter your serial number in the boxes below.'

WriteIniStr '$PLUGINSDIR\custom.ini' 'Field 5' 'Type' 'Password'
WriteIniStr '$PLUGINSDIR\custom.ini' 'Field 5' 'Left' '80'
WriteIniStr '$PLUGINSDIR\custom.ini' 'Field 5' 'Top' '88'
WriteIniStr '$PLUGINSDIR\custom.ini' 'Field 5' 'Right' '104'
WriteIniStr '$PLUGINSDIR\custom.ini' 'Field 5' 'Bottom' '100'
WriteIniStr '$PLUGINSDIR\custom.ini' 'Field 5' 'State' ''
WriteIniStr '$PLUGINSDIR\custom.ini' 'Field 5' 'MaxLen' '4'
WriteIniStr '$PLUGINSDIR\custom.ini' 'Field 5' 'MinLen' '4'
WriteIniStr '$PLUGINSDIR\custom.ini' 'Field 5' 'Flags' 'GROUP|ONLY_NUMBERS'
WriteIniStr '$PLUGINSDIR\custom.ini' 'Field 5' 'ValidateText' \
'Serial number syntax error.\r\n Type 4 digits (0 - 9) in first field.'

WriteIniStr '$PLUGINSDIR\custom.ini' 'Field 6' 'Type' 'Password'
WriteIniStr '$PLUGINSDIR\custom.ini' 'Field 6' 'Left' '108'
WriteIniStr '$PLUGINSDIR\custom.ini' 'Field 6' 'Top' '88'
WriteIniStr '$PLUGINSDIR\custom.ini' 'Field 6' 'Right' '132'
WriteIniStr '$PLUGINSDIR\custom.ini' 'Field 6' 'Bottom' '100'
WriteIniStr '$PLUGINSDIR\custom.ini' 'Field 6' 'State' ''
WriteIniStr '$PLUGINSDIR\custom.ini' 'Field 6' 'MaxLen' '4'
WriteIniStr '$PLUGINSDIR\custom.ini' 'Field 6' 'MinLen' '4'
WriteIniStr '$PLUGINSDIR\custom.ini' 'Field 6' 'Flags' 'ONLY_NUMBERS'
WriteIniStr '$PLUGINSDIR\custom.ini' 'Field 6' 'ValidateText' \
'Serial number syntax error.\r\n Type 4 digits (0 - 9) in second field.'

WriteIniStr '$PLUGINSDIR\custom.ini' 'Field 7' 'Type' 'Password'
WriteIniStr '$PLUGINSDIR\custom.ini' 'Field 7' 'Left' '136'
WriteIniStr '$PLUGINSDIR\custom.ini' 'Field 7' 'Top' '88'
WriteIniStr '$PLUGINSDIR\custom.ini' 'Field 7' 'Right' '160'
WriteIniStr '$PLUGINSDIR\custom.ini' 'Field 7' 'Bottom' '100'
WriteIniStr '$PLUGINSDIR\custom.ini' 'Field 7' 'State' ''
WriteIniStr '$PLUGINSDIR\custom.ini' 'Field 7' 'MaxLen' '4'
WriteIniStr '$PLUGINSDIR\custom.ini' 'Field 7' 'MinLen' '4'
WriteIniStr '$PLUGINSDIR\custom.ini' 'Field 7' 'Flags' 'ONLY_NUMBERS'
WriteIniStr '$PLUGINSDIR\custom.ini' 'Field 7' 'ValidateText' \
'Serial number syntax error.\r\n Type 4 digits (0 - 9) in third field.'

WriteIniStr '$PLUGINSDIR\custom.ini' 'Field 8' 'Type' 'Password'
WriteIniStr '$PLUGINSDIR\custom.ini' 'Field 8' 'Left' '164'
WriteIniStr '$PLUGINSDIR\custom.ini' 'Field 8' 'Top' '88'
WriteIniStr '$PLUGINSDIR\custom.ini' 'Field 8' 'Right' '188'
WriteIniStr '$PLUGINSDIR\custom.ini' 'Field 8' 'Bottom' '100'
WriteIniStr '$PLUGINSDIR\custom.ini' 'Field 8' 'State' ''
WriteIniStr '$PLUGINSDIR\custom.ini' 'Field 8' 'MaxLen' '4'
WriteIniStr '$PLUGINSDIR\custom.ini' 'Field 8' 'MinLen' '4'
WriteIniStr '$PLUGINSDIR\custom.ini' 'Field 8' 'Flags' 'ONLY_NUMBERS'
WriteIniStr '$PLUGINSDIR\custom.ini' 'Field 8' 'ValidateText' \
'Serial number syntax error.\r\n Type 4 digits (0 - 9) in fourth field.'
Functionend