diff --git a/resources/nsis/NSIS.definitions.nsh.in b/resources/nsis/NSIS.definitions.nsh.in new file mode 100755 index 000000000..c067619b4 --- /dev/null +++ b/resources/nsis/NSIS.definitions.nsh.in @@ -0,0 +1,27 @@ +; This file is part of RSS Guard. +; +; Copyright (C) 2011-2015 by Martin Rotter +; +; RSS Guard is free software: you can redistribute it and/or modify +; it under the terms of the GNU General Public License as published by +; the Free Software Foundation, either version 3 of the License, or +; (at your option) any later version. +; +; RSS Guard is distributed in the hope that it will be useful, +; but WITHOUT ANY WARRANTY; without even the implied warranty of +; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +; GNU General Public License for more details. +; +; You should have received a copy of the GNU General Public License +; along with RSS Guard. If not, see . + + +!define VERSION "@APP_VERSION@" +!define APP_VERSION "@APP_VERSION@" +!define APP_NAME "@APP_NAME@" +!define EXE_NAME "@EXE_NAME@" +!define README_FILE "README" +!define LICENSE_FILE "@PROJECT_SOURCE_DIR@\resources\text\COPYING_GNU_GPL" +!define MUI_ICON "@PROJECT_SOURCE_DIR@\resources\graphics\@APP_LOW_NAME@.ico" +!define MUI_UNICON "@PROJECT_SOURCE_DIR@\resources\graphics\@APP_LOW_NAME@.ico" +!define PATCH "0" \ No newline at end of file diff --git a/resources/nsis/NSIS.template.in b/resources/nsis/NSIS.template.in new file mode 100755 index 000000000..db16900af --- /dev/null +++ b/resources/nsis/NSIS.template.in @@ -0,0 +1,208 @@ +; This file is part of RSS Guard. +; +; Copyright (C) 2011-2014 by Martin Rotter +; +; RSS Guard is free software: you can redistribute it and/or modify +; it under the terms of the GNU General Public License as published by +; the Free Software Foundation, either version 3 of the License, or +; (at your option) any later version. +; +; RSS Guard is distributed in the hope that it will be useful, +; but WITHOUT ANY WARRANTY; without even the implied warranty of +; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +; GNU General Public License for more details. +; +; You should have received a copy of the GNU General Public License +; along with RSS Guard. If not, see . + + +;-------------------------------- +; Do necessary inclusions. +!include ..\..\..\resources\nsis\NSIS.definitions.nsh +!include MUI2.nsh + +;-------------------------------- +; Basic values definitions. +!define INST_DIR "@CPACK_TEMPORARY_DIRECTORY@" + +; Name and file. +Name "${APP_NAME} portable" +OutFile "@CPACK_TOPLEVEL_DIRECTORY@/@CPACK_OUTPUT_FILE_NAME@" + +; Set custom branding text. +BrandingText "${APP_NAME}" + +; Set compression. +SetCompressor /SOLID /FINAL lzma + +; Default installation folder. +InstallDir "@CPACK_NSIS_INSTALL_ROOT@\${APP_NAME}" +InstallDirRegKey HKCU "Software\${APP_NAME}" "Install Directory" + +; Require administrator access. +RequestExecutionLevel admin + +;-------------------------------- +; Interface Settings + +; Show "are you sure" dialog when cancelling installation. +!define MUI_ABORTWARNING + +;-------------------------------- +; Pages + +; Pages for installator. +!insertmacro MUI_PAGE_WELCOME +!insertmacro MUI_PAGE_LICENSE "${LICENSE_FILE}" +!insertmacro MUI_PAGE_DIRECTORY +!insertmacro MUI_PAGE_COMPONENTS + +; Start menu folder page configuration. +!define MUI_STARTMENUPAGE_REGISTRY_ROOT "HKCU" +!define MUI_STARTMENUPAGE_REGISTRY_KEY "Software\${APP_NAME}" +!define MUI_STARTMENUPAGE_REGISTRY_VALUENAME "Start Menu Folder" + +!insertmacro MUI_PAGE_INSTFILES + +; Offer user to launch the application right when it is installed. +!define MUI_FINISHPAGE_RUN "$INSTDIR\${EXE_NAME}" + +!insertmacro MUI_PAGE_FINISH + +; Pages for uninstallator. +!insertmacro MUI_UNPAGE_CONFIRM +!insertmacro MUI_UNPAGE_INSTFILES +!insertmacro MUI_UNPAGE_FINISH + +;-------------------------------- +; Languages. + +!insertmacro MUI_LANGUAGE "English" + +;-------------------------------- +; Helper macros. + +!macro ExecWaitJob _exec +StrCpy $9 0 +System::Call 'kernel32::CreateIoCompletionPort(i -1,i0,i0,i0)i.r1' +${IfThen} $1 != 0 ${|} IntOp $9 $9 + 1 ${|} +System::Call 'kernel32::CreateJobObject(i0,i0)i.r2' +${IfThen} $2 != 0 ${|} IntOp $9 $9 + 1 ${|} +System::Call '*(i 0,i $1)i.r0' +System::Call 'kernel32::SetInformationJobObject(i $2,i 7,i $0,i 8)i.r3' +${IfThen} $3 != 0 ${|} IntOp $9 $9 + 1 ${|} +System::Free $0 +System::Call '*(i,i,i,i)i.r0' +System::Alloc 72 +pop $4 +System::Call "*$4(i 72)" +System::Call 'kernel32::CreateProcess(i0,t ${_exec},i0,i0,i0,i 0x01000004,i0,i0,i $4,i $0)i.r3' +${IfThen} $3 != 0 ${|} IntOp $9 $9 + 1 ${|} +System::Free $4 +System::Call "*$0(i.r3,i.r4,i,i)" +System::Free $0 +System::Call 'kernel32::AssignProcessToJobObject(i $2,i $3)i.r0' +${IfThen} $0 != 0 ${|} IntOp $9 $9 + 1 ${|} +System::Call 'kernel32::ResumeThread(i $4)i.r0' +${IfThen} $0 != -1 ${|} IntOp $9 $9 + 1 ${|} +System::Call 'kernel32::CloseHandle(i $3)' +System::Call 'kernel32::CloseHandle(i $4)' +!define __ExecWaitJob__ ExecWaitJob${__LINE__} +${__ExecWaitJob__}ioportwait: +System::Call 'kernel32::GetQueuedCompletionStatus(i $1,*i.r3,*i,*i.r4,i -1)i.r0' +${IfThen} $0 = 0 ${|} StrCpy $9 0 ${|} +${IfThen} $3 != 4 ${|} goto ${__ExecWaitJob__}ioportwait ${|} +System::Call 'kernel32::CloseHandle(i $2)' +System::Call 'kernel32::CloseHandle(i $1)' +!undef __ExecWaitJob__ +${IfThen} $9 < 6 ${|} MessageBox mb_iconstop `ExecWaitJob "${_exec}" failed!` ${|} +!macroend + +; If you are using solid compression, files that are required before +; the actual installation should be stored first in the data block, +; because this will make your installer start faster. +!insertmacro MUI_RESERVEFILE_LANGDLL + +;-------------------------------- +; Sections. + +; Installer sections. +Section "!Core" Core + IfFileExists $INSTDIR\Uninstall.exe +1 NotInstalled + MessageBox MB_OK|MB_ICONEXCLAMATION "${APP_NAME} is already installed. $\n$\nClick 'OK' to automatically uninstall it, installer will then automatically continue with current installation." IDOK Uninstall + +Uninstall: + !insertmacro ExecWaitJob '"$INSTDIR\Uninstall.exe /S"' + +NotInstalled: + SetOutPath "$INSTDIR" + + ; Install core application files. + @CPACK_NSIS_FULL_INSTALL@ + + ; Store installation folder. + WriteRegStr HKCU "Software\${APP_NAME}" "Install Directory" $INSTDIR + + ; Create uninstaller. + WriteUninstaller "$INSTDIR\Uninstall.exe" +SectionEnd + +Section "Desktop Icon" DesktopIcon + CreateShortCut "$DESKTOP\${APP_NAME}.lnk" "$INSTDIR\${EXE_NAME}" +SectionEnd + +Section "Start Menu Shortcuts" StartMenuShortcuts + CreateDirectory "$SMPROGRAMS\${APP_NAME}" + CreateShortCut "$SMPROGRAMS\${APP_NAME}\${APP_NAME}.lnk" "$INSTDIR\${EXE_NAME}" + CreateShortCut "$SMPROGRAMS\${APP_NAME}\Uninstall.lnk" "$INSTDIR\Uninstall.exe" +SectionEnd + +LangString DESC_Core ${LANG_ENGLISH} "Core installation files for ${APP_NAME}." +LangString DESC_DesktopIcon ${LANG_ENGLISH} "Desktop icon for ${APP_NAME}." +LangString DESC_StartMenuShortcuts ${LANG_ENGLISH} "Start Menu Shortcuts for ${APP_NAME}." + +!insertmacro MUI_FUNCTION_DESCRIPTION_BEGIN + !insertmacro MUI_DESCRIPTION_TEXT ${Core} $(DESC_Core) + !insertmacro MUI_DESCRIPTION_TEXT ${DesktopIcon} $(DESC_DesktopIcon) + !insertmacro MUI_DESCRIPTION_TEXT ${StartMenuShortcuts} $(DESC_StartMenuShortcuts) +!insertmacro MUI_FUNCTION_DESCRIPTION_END + +; Uninstaller section. +Section "Uninstall" + ; Remove core application files & directories. + @CPACK_NSIS_DELETE_FILES@ + @CPACK_NSIS_DELETE_DIRECTORIES@ + + ; Remove uninstaller. + Delete "$INSTDIR\Uninstall.exe" + + ; Remove rest of installed files. + ; Custom files are left intact. + RMDir "$INSTDIR" + + Delete "$SMPROGRAMS\${APP_NAME}\${APP_NAME}.lnk" + Delete "$SMPROGRAMS\${APP_NAME}\Uninstall.lnk" + RMDir "$SMPROGRAMS\${APP_NAME}" + + Delete "$DESKTOP\${APP_NAME}.lnk" + + DeleteRegKey /ifempty HKCU "Software\${APP_NAME}" +SectionEnd + +;-------------------------------- +; Custom functions. + +; Executed when installer starts. +Function .onInit + IntOp $0 ${SF_SELECTED} | ${SF_RO} + SectionSetFlags ${Core} $0 +FunctionEnd + +; Conditional saving to registry. +Function ConditionalAddToRegisty + Pop $0 + Pop $1 + StrCmp "$0" "" ConditionalAddToRegisty_EmptyString + WriteRegStr SHCTX "Software\Microsoft\Windows\CurrentVersion\Uninstall\${APP_NAME}" "$1" "$0" + ConditionalAddToRegisty_EmptyString: +FunctionEnd \ No newline at end of file