From a081bc259268acf443139dde9a44c2b5f0a735e4 Mon Sep 17 00:00:00 2001 From: RoDuth Date: Fri, 13 Oct 2017 23:11:23 +1000 Subject: [PATCH 01/25] pep8 etc. --- bauble/utils/web.py | 11 ++++++----- scripts/bump_version.py | 3 ++- setup.py | 20 +++++++++++--------- 3 files changed, 19 insertions(+), 15 deletions(-) diff --git a/bauble/utils/web.py b/bauble/utils/web.py index b35f6ad1d..dee15791e 100644 --- a/bauble/utils/web.py +++ b/bauble/utils/web.py @@ -31,14 +31,15 @@ from bauble.i18n import _ -def _open_link(func, data=None): +def _open_link(data=None): + """Open a web link""" # windows generates odd characters in the uri unless its in ascii import sys - if sys.platform == 'win32' : - udata=data.decode("utf-8") - asciidata=udata.encode("ascii","ignore") + if sys.platform == 'win32': + udata = data.decode("utf-8") + asciidata = udata.encode("ascii", "ignore") desktop.open(asciidata) - else : desktop.open(data) + else: desktop.open(data) gtk.link_button_set_uri_hook(_open_link) diff --git a/scripts/bump_version.py b/scripts/bump_version.py index e29acaf22..0b8405933 100755 --- a/scripts/bump_version.py +++ b/scripts/bump_version.py @@ -137,7 +137,8 @@ def bump_nsi_file(filename, varname='version'): bump_py_file(os.path.join(root_of_clone(), 'doc/conf.py'), 'release') bump_desktop_file(os.path.join(root_of_clone(), 'data/ghini.desktop')) bump_nsi_file(os.path.join(root_of_clone(), 'scripts/build.nsi')) -bump_nsi_file(os.path.join(root_of_clone(), 'scripts/build-multiuser.nsi'), 'VERSION') +bump_nsi_file(os.path.join(root_of_clone(), 'scripts/build-multiuser.nsi'), + 'VERSION') rx = "(^VERSION=\").*?\..*?\..*?(\".*?%s.*?$)" % bump_tag bump_file(os.path.join(root_of_clone(), 'packages/builddeb.sh'), rx) diff --git a/setup.py b/setup.py index 2f22c1dcb..2d60fe14e 100755 --- a/setup.py +++ b/setup.py @@ -58,11 +58,12 @@ exclude=['test', 'bauble.*.test', 'ghini.*.test']) plugins_pkgs = ['bauble.plugins.%s' % p for p in plugins] all_packages = setuptools.find_packages(exclude=['test', 'bauble.*.test', - 'ghini.*.test']) + 'ghini.*.test']) package_data = {'': ['README.rst', 'CHANGES', 'LICENSE'], - 'bauble': ['*.ui', '*.glade', 'images/*.png', 'pixmaps/*.png', - 'images/*.svg', 'images/*.gif', 'images/*.ico', 'images/*.bmp']} + 'bauble': ['*.ui', '*.glade', 'images/*.png', 'pixmaps/*.png', + 'images/*.svg', 'images/*.gif', 'images/*.ico', + 'images/*.bmp']} # ceate a list of the data patterns to look for in the packages data_patterns = ['default/*.txt', '*.ui', '*.glade', '*.xsl', '*.xsd', @@ -85,8 +86,9 @@ sqlalchemy_includes = ['sqlalchemy.dialects.sqlite', 'sqlalchemy.dialects.postgresql'] py2exe_includes = ['sqlite3', 'lxml', 'gdata', 'fibra', 'psycopg2', - 'encodings', 'mako', 'mako.cache', 'pygments.styles.default', - 'pyparsing'] + gtk_pkgs + plugins_pkgs + sqlalchemy_includes + 'encodings', 'mako', 'mako.cache', + 'pygments.styles.default', 'pyparsing'] + gtk_pkgs \ + + plugins_pkgs + sqlalchemy_includes py2exe_setup_args = { 'windows': [{'script': 'scripts/ghini', 'icon_resources': [(1, "bauble/images/icon.ico")]}]} @@ -105,7 +107,7 @@ "libgtk-win32-2.0-0.dll", "libpango-1.0-0.dll", "libpangowin32-1.0-0.dll", "libxml2-2.dll", # windows dlls - "DNSAPI.DLL","MSIMG32.DLL", "Secur32.dll", "SHFOLDER.dll", + "DNSAPI.DLL", "MSIMG32.DLL", "Secur32.dll", "SHFOLDER.dll", "CRYPT32.dll", "MPR.dll" ] } @@ -176,8 +178,8 @@ def run(self): file_util.copy_file(gtheme, dest) # copy LICENSE to dist\share\LICENSE.ghini (for help>about) - file_util.copy_file("LICENSE", - os.path.join(self.dist_dir, 'share', 'LICENSE.ghini')) + file_util.copy_file("LICENSE", os.path.join(self.dist_dir, 'share', + 'LICENSE.ghini')) class nsis_cmd(Command): # 1. copy the gtk dist to the dist directory @@ -423,7 +425,7 @@ def run(self): scripts = ["scripts/ghini"] if sys.platform == 'win32': scripts = ["scripts/ghini", "scripts/ghini.bat", "scripts/ghini.vbs", - "scripts/ghini-update.bat"] + "scripts/ghini-update.bat"] # TODO: images in bauble/images should really be in data and copied as # package_data or data_files From fe2c16e8870c71594622f704d5c828e3084f59a3 Mon Sep 17 00:00:00 2001 From: RoDuth Date: Fri, 13 Oct 2017 23:22:33 +1000 Subject: [PATCH 02/25] change to non-capitalised name --- scripts/{Add_to_PATH.vbs => add_to_path.vbs} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename scripts/{Add_to_PATH.vbs => add_to_path.vbs} (100%) diff --git a/scripts/Add_to_PATH.vbs b/scripts/add_to_path.vbs similarity index 100% rename from scripts/Add_to_PATH.vbs rename to scripts/add_to_path.vbs From ad1798587f6f264cd0d3e23b4c7b5d894ccb0a15 Mon Sep 17 00:00:00 2001 From: RoDuth Date: Fri, 13 Oct 2017 23:33:18 +1000 Subject: [PATCH 03/25] changing add_to_path filename in nsi --- scripts/build-multiuser.nsi | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/scripts/build-multiuser.nsi b/scripts/build-multiuser.nsi index 44b8079e6..6eaba24ce 100755 --- a/scripts/build-multiuser.nsi +++ b/scripts/build-multiuser.nsi @@ -479,8 +479,8 @@ Function AddFOPtoPATH ; copy the script to a temp dir SetOutPath "$PLUGINSDIR\" SetOverwrite on - File /a "Add_to_PATH.vbs" - ExecWait '"$SYSDIR\wscript.exe" //E:vbscript "$PLUGINSDIR\Add_to_PATH.vbs" /path:"$R0\fop-${FOP_VERSION}\" /env:"$R1"' + File /a "add_to_path.vbs" + ExecWait '"$SYSDIR\wscript.exe" //E:vbscript "$PLUGINSDIR\add_to_path.vbs" /path:"$R0\fop-${FOP_VERSION}\" /env:"$R1"' DetailPrint "Apache FOP added to $R1 PATH as: $R0\fop-${FOP_VERSION}\" SetRebootFlag True DetailPrint "Reboot flag = True" From 79b00fb0ea8e913f1a71e6d840aa1f6f487e8abf Mon Sep 17 00:00:00 2001 From: RoDuth Date: Sat, 14 Oct 2017 10:29:30 +1000 Subject: [PATCH 04/25] changing variables to all capitals --- scripts/build-multiuser.nsi | 28 ++++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/scripts/build-multiuser.nsi b/scripts/build-multiuser.nsi index 6eaba24ce..c7ec9aa25 100755 --- a/scripts/build-multiuser.nsi +++ b/scripts/build-multiuser.nsi @@ -56,14 +56,14 @@ ; Global Name "ghini.desktop" !define VERSION "1.0.68" ; :bump -!define src_dir "..\dist" +!define SRC_DIR "..\dist" !define PRODUCT_NAME "ghini.desktop" Outfile "${PRODUCT_NAME}-${VERSION}-setup.exe" !define PROGEXE "ghini.exe" !define COMPANY_NAME "" -!define license_file "LICENSE" -!define readme "README.rst" -!define startmenu "$SMPROGRAMS\${PRODUCT_NAME}" +!define LICENSE_FILE "LICENSE" +!define README "README.rst" +!define START_MENU "$SMPROGRAMS\${PRODUCT_NAME}" !define UNINSTALL_FILENAME "uninstall.exe" ; FOP @@ -113,11 +113,11 @@ CRCCheck on ; Modern User Interface v2 Settings !define MUI_ABORTWARNING !define MUI_UNABORTWARNING -!define MUI_ICON "${src_dir}\bauble\images\icon.ico" -!define MUI_UNICON "${src_dir}\bauble\images\icon.ico" +!define MUI_ICON "${SRC_DIR}\bauble\images\icon.ico" +!define MUI_UNICON "${SRC_DIR}\bauble\images\icon.ico" !define MUI_HEADERIMAGE -!define MUI_HEADERIMAGE_BITMAP "${src_dir}\bauble\images\ghini_logo.bmp" -!define MUI_HEADERIMAGE_UNBITMAP "${src_dir}\bauble\images\ghini_logo.bmp" +!define MUI_HEADERIMAGE_BITMAP "${SRC_DIR}\bauble\images\ghini_logo.bmp" +!define MUI_HEADERIMAGE_UNBITMAP "${SRC_DIR}\bauble\images\ghini_logo.bmp" !define MUI_HEADERIMAGE_RIGHT !define MUI_COMPONENTSPAGE_SMALLDESC !define MUI_COMPONENTSPAGE_TEXT_COMPLIST "Or, select the optional components you wish to install: \ @@ -149,7 +149,7 @@ CRCCheck on ; PAGES ; Installer -!insertmacro MUI_PAGE_LICENSE "${src_dir}\${license_file}" +!insertmacro MUI_PAGE_LICENSE "${SRC_DIR}\${LICENSE_FILE}" !insertmacro MULTIUSER_PAGE_INSTALLMODE ; this will show the 2 install options, unless it's an elevated inner process ; (in that case we know we should install for all users) @@ -196,7 +196,7 @@ Section "!Ghini.desktop" SecMain SetOverwrite on ; package all files, recursively, preserving attributes ; assume files are in the correct places - File /a /r "${src_dir}\*.*" + File /a /r "${SRC_DIR}\*.*" ; Create uninstaller WriteUninstaller "$INSTDIR\${UNINSTALL_FILENAME}" @@ -204,8 +204,8 @@ Section "!Ghini.desktop" SecMain ; add registry keys !insertmacro MULTIUSER_RegistryAddInstallInfo ; create shortcuts - CreateDirectory "${startmenu}" - CreateShortcut "${startmenu}\${PRODUCT_NAME}.lnk" "$INSTDIR\${PROGEXE}" \ + CreateDirectory "${START_MENU}" + CreateShortcut "${START_MENU}\${PRODUCT_NAME}.lnk" "$INSTDIR\${PROGEXE}" \ "" "$INSTDIR\${PROGEXE}" "" SW_SHOWNORMAL \ "" "Ghini biodiversity collection manager" ; desktop shortcut @@ -415,11 +415,11 @@ UninstallText "This will uninstall ${PRODUCT_NAME}." Section "Uninstall" SecUnMain ; Remove registry keys !insertmacro MULTIUSER_RegistryRemoveInstallInfo - Delete "${startmenu}\*.*" + Delete "${START_MENU}\*.*" Delete "$DESKTOP\${PRODUCT_NAME}.lnk" SetOutPath $TEMP RMDir /r "$INSTDIR" - RMDir /r "${startmenu}" + RMDir /r "${START_MENU}" SectionEnd From ddf12b8da105547a5a3b5f2cc1a516c2438d4c4d Mon Sep 17 00:00:00 2001 From: RoDuth Date: Sat, 14 Oct 2017 12:34:51 +1000 Subject: [PATCH 05/25] else: to 2 lines --- bauble/utils/web.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/bauble/utils/web.py b/bauble/utils/web.py index dee15791e..e51af7d99 100644 --- a/bauble/utils/web.py +++ b/bauble/utils/web.py @@ -39,7 +39,8 @@ def _open_link(data=None): udata = data.decode("utf-8") asciidata = udata.encode("ascii", "ignore") desktop.open(asciidata) - else: desktop.open(data) + else: + desktop.open(data) gtk.link_button_set_uri_hook(_open_link) From 745e2da1123660a0a41f5b47df9f9b6cdee61d14 Mon Sep 17 00:00:00 2001 From: RoDuth Date: Sat, 14 Oct 2017 15:08:26 +1000 Subject: [PATCH 06/25] split py2exe_includes over 2 lines --- setup.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/setup.py b/setup.py index 2d60fe14e..81914ad93 100755 --- a/setup.py +++ b/setup.py @@ -87,8 +87,8 @@ 'sqlalchemy.dialects.postgresql'] py2exe_includes = ['sqlite3', 'lxml', 'gdata', 'fibra', 'psycopg2', 'encodings', 'mako', 'mako.cache', - 'pygments.styles.default', 'pyparsing'] + gtk_pkgs \ - + plugins_pkgs + sqlalchemy_includes + 'pygments.styles.default', 'pyparsing'] + py2exe_includes += gtk_pkgs + plugins_pkgs + sqlalchemy_includes py2exe_setup_args = { 'windows': [{'script': 'scripts/ghini', 'icon_resources': [(1, "bauble/images/icon.ico")]}]} From 2b530445d3be68ef4661f107d12af10ca9dbcc8a Mon Sep 17 00:00:00 2001 From: RoDuth Date: Sun, 15 Oct 2017 08:05:04 +1000 Subject: [PATCH 07/25] remove TODO --- scripts/build-multiuser.nsi | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/scripts/build-multiuser.nsi b/scripts/build-multiuser.nsi index 221a18126..3a74b16dc 100755 --- a/scripts/build-multiuser.nsi +++ b/scripts/build-multiuser.nsi @@ -169,7 +169,6 @@ CRCCheck on ; LANGUAGES ; MUIv2 macros (must be after scripts and pages) -; TODO add more languages? !insertmacro MUI_LANGUAGE English @@ -375,7 +374,7 @@ Section /o "MS Visual C runtime DLL (1.73MB Download)" SecMSC Goto DoneMSVC ; Install MS Visual C Runtime - ; TODO there seems to be a bug in the installer that leaves junk files in the root directory of the largest drive + ; there seems to be a bug in the installer that leaves junk files in the root directory of the largest drive. InstalMSVC: ; run installer silently (no user input, no cancel button) ExecWait '"$PLUGINSDIR\${MSVC_FILE}" /qb!' @@ -405,7 +404,6 @@ SectionGroupEnd ; UNINSTALLER SECTIONS ; ; All section names prefixed by "Un" will be in the uninstaller -; TODO include a FOP uninstaller ; Settings UninstallText "This will uninstall ${PRODUCT_NAME}." From 322a28a75aec6737088529ad2127a8275113225b Mon Sep 17 00:00:00 2001 From: RoDuth Date: Mon, 16 Oct 2017 16:40:06 +1000 Subject: [PATCH 08/25] pylintrc correction --- .pylintrc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.pylintrc b/.pylintrc index 594768d7c..0cf962b8d 100644 --- a/.pylintrc +++ b/.pylintrc @@ -66,7 +66,7 @@ load-plugins= # C0112: Empty docstrin # W0401: Wildcard import # R0801: Similar lines (refactor) -disable-msg=W0703,R0903,R0904,W0511,W0611,C0111,C0112,W0401,R0801 +disable=W0703,R0903,R0904,W0511,W0611,C0111,C0112,W0401,R0801 # W From c5797b8ca60b3c69be7f1671b15fa9d7fd2d8430 Mon Sep 17 00:00:00 2001 From: RoDuth Date: Mon, 16 Oct 2017 16:40:29 +1000 Subject: [PATCH 09/25] Delete old build.nsi Now that we have a completely new NSIS script there is no need for the original version. This version was written prior to the introduction of User Account Control and other modern MS Windows paradigms. It therefore does not work well with them. --- scripts/build.nsi | 145 ---------------------------------------------- 1 file changed, 145 deletions(-) delete mode 100755 scripts/build.nsi diff --git a/scripts/build.nsi b/scripts/build.nsi deleted file mode 100755 index 722bb927a..000000000 --- a/scripts/build.nsi +++ /dev/null @@ -1,145 +0,0 @@ -; Copyright (c) 2004-2017 lauchpad and github authors -; -; This file is part of ghini.desktop. -; -; ghini.desktop 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. -; -; ghini.desktop 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 ghini.desktop. If not, see . -; -; NSIS Install Script for ghini.desktop -; -; TODO: should create two version of this installer, one that bundles GTK and -; one that doesn't -; could also create one that asks the use if they would like to download and -; install the GTK libs if they aren't available, ala slickrun - -; include Modern UI -!include "MUI.nsh" - -; general -Name "Ghini" - -!define version "1.0.75" ; :bump -!define src_dir "../dist" -Outfile "ghini.desktop-${version}-setup.exe" - -!define prodname "ghini.desktop" -!define exec "ghini.exe" -!define license_file "LICENSE" -!define readme "README.rst" - -; icons must be Microsoft .ICO files -; !define icon "${src_dir}/bauble/images/icon.ico" - -; file containing list of file-installation commands -; !define files "files.nsi" - -; file containing list of file-uninstall commands -; !define unfiles "unfiles.nsi" - -; registry stuff -!define regkey "Software\${prodname}" -!define uninstkey "Software\Microsoft\Windows\CurrentVersion\Uninstall\${prodname}" - -!define startmenu "$SMPROGRAMS\${prodname}" -!define uninstaller "uninstall.exe" - -SetCompressor /SOLID lzma -SetDateSave on -SetDatablockOptimize on -CRCCheck on -SilentInstall normal - -InstallDir "$PROGRAMFILES\${prodname}" -InstallDirRegKey HKCU "${regkey}" "" - -;-------------------------------- -;Interface Settings -; MUI Settings - -!define MUI_ABORTWARNING -!define MUI_UNABORTWARNING -!define MUI_ICON "${src_dir}/bauble/images/icon.ico" -!define MUI_UNICON "${src_dir}/bauble/images/icon.ico" -!define MUI_HEADERIMAGE -!define MUI_HEADERIMAGE_BITMAP "${src_dir}\bauble\images\ghini_logo.bmp" -!define MUI_HEADERIMAGE_UNBITMAP "${src_dir}\bauble\images\ghini_logo.bmp" -!define MUI_HEADERIMAGE_RIGHT -; allow users to check install log before continuing -!define MUI_FINISHPAGE_NOAUTOCLOSE -!define MUI_FINISHPAGE_NOREBOOTSUPPORT -!define MUI_FINISHPAGE_RUN_TEXT "Start Ghini" -!define MUI_FINISHPAGE_RUN $INSTDIR\${exec} -!define MUI_FINISHPAGE_LINK "Visit the Ghini home page" -!define MUI_FINISHPAGE_LINK_LOCATION http://ghini.github.io/ - -;-------------------------------- -;Pages - -!insertmacro MUI_PAGE_LICENSE "${src_dir}/${license_file}" -!insertmacro MUI_PAGE_DIRECTORY -!insertmacro MUI_PAGE_INSTFILES -!insertmacro MUI_PAGE_FINISH - -!insertmacro MUI_UNPAGE_CONFIRM -!insertmacro MUI_UNPAGE_INSTFILES -;-------------------------------- -;Languages - -!insertmacro MUI_LANGUAGE "English" -;-------------------------------- -;Installer Sections - -Section "Dummy Section" SecDummy - SetOutPath "$INSTDIR" - ;Store installation folder - WriteRegStr HKCU "${regkey}" "" $INSTDIR - ; Uninstall reg keys - WriteRegStr HKLM "${uninstkey}" "DisplayName" "${prodname} ${version} (remove only)" - WriteRegStr HKLM "${uninstkey}" "UninstallString" '"$INSTDIR\${uninstaller}"' - ;Create uninstaller - WriteUninstaller "$INSTDIR\${uninstaller}" - - ; package all files, recursively, preserving attributes - ; assume files are in the correct places - File /a /r "${src_dir}\*.*" - -SectionEnd - -; create shortcuts -Section - SetOutPath $INSTDIR ; for working directory - CreateDirectory "${startmenu}" - CreateShortCut "${startmenu}\${prodname}.lnk" "$INSTDIR\${exec}" - ; run gdk-pixbuf-query-loaders, gtk-query-immodules & pango-querymodules - ReadEnvStr $0 COMSPEC - nsExec::ExecToLog '$0 /C gtk\bin\pango-querymodules.exe > gtk\etc\pango\pango.modules' - nsExec::ExecToLog '$0 /C gtk\bin\gtk-query-immodules-2.0.exe > gtk\etc\gtk-2.0\gtk.immodules' - nsExec::ExecToLog '$0 /C gtk\bin\gdk-pixbuf-query-loaders.exe > gtk\etc\gtk-2.0\gdk-pixbuf.loaders' - nsExec::ExecToLog '$0 /C gtk\bin\gdk-pixbuf-query-loaders.exe > gtk\lib\gdk-pixbuf-2.0\2.10.0\loaders.cache' -SectionEnd - -; Uninstaller -; All section names prefixed by "Un" will be in the uninstaller - -UninstallText "This will uninstall ${prodname}." - -Section "Uninstall" - DeleteRegKey HKLM "${uninstkey}" - DeleteRegKey HKLM "${regkey}" - Delete "${startmenu}\*.*" - Delete "${startmenu}" - SetOutPath $TEMP - RMDir /r "$INSTDIR" - RMDir /r ${startmenu} -SectionEnd - From ee77a52d516416cbb77a7dae26235700a065241e Mon Sep 17 00:00:00 2001 From: RoDuth Date: Tue, 17 Oct 2017 12:25:49 +1000 Subject: [PATCH 10/25] Start at simplifying the wininstall process Largely experimental at this point. More to come. --- scripts/devinstall-wininstaller.bat | 78 +++++++++++++++++++++++++++++ setup.cfg | 3 ++ setup.py | 5 +- 3 files changed, 84 insertions(+), 2 deletions(-) create mode 100644 scripts/devinstall-wininstaller.bat diff --git a/scripts/devinstall-wininstaller.bat b/scripts/devinstall-wininstaller.bat new file mode 100644 index 000000000..6a03f5696 --- /dev/null +++ b/scripts/devinstall-wininstaller.bat @@ -0,0 +1,78 @@ +@echo off +ECHO sanity check + +SET SHOULD_CANCEL=0 + +python -c "1" 2>NUL +IF %ERRORLEVEL% NEQ 0 ( + ECHO Python not properly installed + SET SHOULD_CANCEL=1 + goto SKIP_GTK_TEST +) +python -c "import gtk" 2>NUL +IF %ERRORLEVEL% NEQ 0 ( + ECHO PyGtk not properly installed + SET SHOULD_CANCEL=1 +) +:SKIP_GTK_TEST +git --version 2>NUL >NUL +IF %ERRORLEVEL% NEQ 0 ( + ECHO git not properly installed + SET SHOULD_CANCEL=1 +) + +IF %SHOULD_CANCEL% NEQ 0 exit /b +ECHO sanity check passed + +IF %1.==. GOTO DEFAULTCHOICE +set CHECKOUT=ghini-%1 +GOTO CONTINUE + +:DEFAULTCHOICE +set CHECKOUT=ghini-1.0-wininstaller + +:CONTINUE + +ECHO going to install %CHECKOUT% +cd "%HOMEDRIVE%%HOMEPATH%" + +ECHO installing dependencies +pip install virtualenv 2>NUL +virtualenv --system-site-packages .virtualenvs\ghi2exe + +ECHO clearing previous checkouts +for /F "delims=" %%i in ( + 'dir /b .virtualenvs\ghi2exe\Lib\site-packages\bauble-*egg' +) do ( + rmdir ".virtualenvs\ghi2exe\Lib\site-packages\""%%i" /s/q 2>NUL +) + +ECHO going to checkout %CHECKOUT% +call .virtualenvs\ghi2exe\Scripts\activate.bat +mkdir Local\github\Ghini 2>NUL +cd Local\github\Ghini +git clone https://github.com/RoDuth/ghini.desktop.git +cd ghini.desktop +git checkout %CHECKOUT% +git pull + +ECHO create the program shortcut +pip install pypiwin32 2>NUL +python scripts\mklnk.py + +ECHO going to build and install +python setup.py build +python setup.py install +mkdir "%APPDATA%\Ghini" 2>NUL +cd "%HOMEPATH%" + +ECHO create the globalizing script +IF DEFINED PUBLIC (SET AUDESKTOP=%PUBLIC%\Desktop) & (SET AUSTARTMENU=%PROGRAMDATA%\Microsoft\Windows\Start Menu) ELSE (SET AUDESKTOP=%ALLUSERSPROFILE%\Desktop) & (SET AUSTARTMENU=%ALLUSERSPROFILE%\Start Menu) +( +echo @echo off +echo mkdir "%AUSTARTMENU%\Programs\Ghini" +echo copy "%HOMEDRIVE%%HOMEPATH%"\Local\github\Ghini\ghini.desktop\scripts\ghini.lnk "%AUSTARTMENU%\Programs\Ghini" +) > devinstall-finalize.bat + +ECHO please run devinstall-finalize.bat as administrator. +pause diff --git a/setup.cfg b/setup.cfg index 5b261574e..6cd85b683 100644 --- a/setup.cfg +++ b/setup.cfg @@ -1,6 +1,9 @@ [sdist] formats=bztar,gztar,zip +[easy_install] +zip_ok = False + [nosetests] #match=^test #nocapture=0 diff --git a/setup.py b/setup.py index 81914ad93..a5bedfdbd 100755 --- a/setup.py +++ b/setup.py @@ -196,8 +196,9 @@ def finalize_options(self): pass def run(self): - print "**Error: Can't run this command." - print sys.exit(1) + nsis_compiler = 'makensis' + nsis_script = 'scripts\\build-multiuser.nsi' + os.system('%s %s' % (nsis_compiler, nsis_script)) else: py2exe_options = {} From 6bdab4816e2b47bc63e38e6bebdf16304dbd7717 Mon Sep 17 00:00:00 2001 From: RoDuth Date: Tue, 17 Oct 2017 12:42:00 +1000 Subject: [PATCH 11/25] more temp stuff --- scripts/devinstall-wininstaller.bat | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/scripts/devinstall-wininstaller.bat b/scripts/devinstall-wininstaller.bat index 6a03f5696..754ce3b9a 100644 --- a/scripts/devinstall-wininstaller.bat +++ b/scripts/devinstall-wininstaller.bat @@ -60,6 +60,11 @@ ECHO create the program shortcut pip install pypiwin32 2>NUL python scripts\mklnk.py +pip install psycopg2 +pip install lxml +pip install Pygments +pip install py2exe_py2 + ECHO going to build and install python setup.py build python setup.py install From 855b757543df7517344d64cafd3452598f8d309a Mon Sep 17 00:00:00 2001 From: RoDuth Date: Tue, 17 Oct 2017 17:44:43 +1000 Subject: [PATCH 12/25] Including plugins for NSIS installer --- data/nsis/Contrib/Inetc/afxres.h | 2 + data/nsis/Contrib/Inetc/api.h | 83 + data/nsis/Contrib/Inetc/crt.cpp | 105 + data/nsis/Contrib/Inetc/inetc.cpp | 1731 +++++++++++++++++ data/nsis/Contrib/Inetc/inetc.rc | 199 ++ data/nsis/Contrib/Inetc/inetc.sln | 42 + data/nsis/Contrib/Inetc/inetc.vcxproj | 441 +++++ data/nsis/Contrib/Inetc/inetc.vcxproj.filters | 52 + data/nsis/Contrib/Inetc/nsis_tchar.h | 229 +++ data/nsis/Contrib/Inetc/pluginapi.c | 294 +++ data/nsis/Contrib/Inetc/pluginapi.h | 104 + data/nsis/Contrib/Inetc/resource.h | 47 + data/nsis/Contrib/md5dll/MD5.cpp | 367 ++++ data/nsis/Contrib/md5dll/MD5.h | 100 + data/nsis/Contrib/md5dll/MD5Example.nsi | 55 + data/nsis/Contrib/md5dll/api.h | 83 + data/nsis/Contrib/md5dll/build.bat | 17 + data/nsis/Contrib/md5dll/md5dll.cpp | 140 ++ data/nsis/Contrib/md5dll/md5dll.def | 10 + data/nsis/Contrib/md5dll/md5dll.rc | 100 + data/nsis/Contrib/md5dll/nsis_tchar.h | 215 ++ data/nsis/Contrib/md5dll/pluginapi.h | 103 + .../nsis/Contrib/nsisunz/AggressiveOptimize.h | 92 + data/nsis/Contrib/nsisunz/example.nsi | 95 + data/nsis/Contrib/nsisunz/example_mui.nsi | 101 + data/nsis/Contrib/nsisunz/exdll.h | 116 ++ data/nsis/Contrib/nsisunz/info.rtf | Bin 0 -> 641 bytes data/nsis/Contrib/nsisunz/miniclib.c | 366 ++++ data/nsis/Contrib/nsisunz/miniclib.h | 110 ++ data/nsis/Contrib/nsisunz/nsisunz.cpp | 567 ++++++ data/nsis/Contrib/nsisunz/nsisunz.dsp | 170 ++ data/nsis/Contrib/nsisunz/nsisunz.dsw | 29 + data/nsis/Contrib/nsisunz/nsisunz.ncb | Bin 0 -> 82944 bytes data/nsis/Contrib/nsisunz/nsisunz.plg | 57 + data/nsis/Contrib/nsisunz/nsisunz.sln | 21 + data/nsis/Contrib/nsisunz/nsisunz.vcproj | 396 ++++ data/nsis/Contrib/nsisunz/nsisunz_readme.html | 361 ++++ data/nsis/Contrib/nsisunz/nsisunz_setup.nsi | 148 ++ data/nsis/Contrib/nsisunz/readme.kjd | 12 + data/nsis/Contrib/nsisunz/zippage.ini | 65 + data/nsis/Contrib/nsisunz/zlib/ADLER32.C | 74 + data/nsis/Contrib/nsisunz/zlib/CRC32.C | 333 ++++ data/nsis/Contrib/nsisunz/zlib/INFFAST.C | 305 +++ data/nsis/Contrib/nsisunz/zlib/INFFAST.H | 11 + data/nsis/Contrib/nsisunz/zlib/INFFIXED.H | 94 + data/nsis/Contrib/nsisunz/zlib/INFLATE.C | 1274 ++++++++++++ data/nsis/Contrib/nsisunz/zlib/INFTREES.C | 328 ++++ data/nsis/Contrib/nsisunz/zlib/INFTREES.H | 55 + data/nsis/Contrib/nsisunz/zlib/README | 126 ++ data/nsis/Contrib/nsisunz/zlib/UNZIP.H | 275 +++ data/nsis/Contrib/nsisunz/zlib/Unzip.c | 1297 ++++++++++++ data/nsis/Contrib/nsisunz/zlib/ZCONF.H | 330 ++++ data/nsis/Contrib/nsisunz/zlib/ZLIB.H | 1200 ++++++++++++ data/nsis/Contrib/nsisunz/zlib/ZUTIL.H | 254 +++ data/nsis/Contrib/nsisunz/zlib/Zutil.c | 44 + data/nsis/Contrib/nsisunz/zlib/crc32.h | 441 +++++ data/nsis/Contrib/nsisunz/zlib/inflate.h | 117 ++ data/nsis/Docs/Inetc/Readme.htm | 153 ++ data/nsis/Docs/Inetc/wiki.txt | 161 ++ data/nsis/Docs/md5dll/readme.txt | 68 + data/nsis/Docs/nsisunz/nsisunz_readme.html | 361 ++++ data/nsis/Examples/Inetc/Example.nsi | 54 + data/nsis/Examples/Inetc/auth_dlg.nsi | 32 + data/nsis/Examples/Inetc/ftp_auth.nsi | 32 + data/nsis/Examples/Inetc/head.nsi | 30 + data/nsis/Examples/Inetc/headers.nsi | 32 + data/nsis/Examples/Inetc/headers.php | 7 + data/nsis/Examples/Inetc/https.nsi | 27 + data/nsis/Examples/Inetc/inetc_local.nsi | 81 + data/nsis/Examples/Inetc/post.nsi | 31 + data/nsis/Examples/Inetc/post.php | 13 + data/nsis/Examples/Inetc/post_file.nsi | 31 + data/nsis/Examples/Inetc/post_file.php | 10 + data/nsis/Examples/Inetc/post_form.html | 18 + data/nsis/Examples/Inetc/put.nsi | 31 + data/nsis/Examples/Inetc/put.php | 19 + data/nsis/Examples/Inetc/recursive.nsi | 65 + data/nsis/Examples/Inetc/redirect.nsi | 31 + data/nsis/Examples/Inetc/redirect.php | 6 + data/nsis/Examples/Inetc/timeout.nsi | 32 + data/nsis/Examples/Inetc/tostack.nsi | 32 + data/nsis/Examples/Inetc/translate.nsi | 33 + data/nsis/Include/NsisMultiUser.nsh | 513 +++++ data/nsis/Include/UAC.nsh | 299 +++ data/nsis/Plugins/amd64-unicode/INetC.dll | Bin 0 -> 27136 bytes data/nsis/Plugins/x86-ansi/INetC.dll | Bin 0 -> 22016 bytes data/nsis/Plugins/x86-ansi/UAC.dll | Bin 0 -> 14848 bytes data/nsis/Plugins/x86-ansi/md5dll.dll | Bin 0 -> 6656 bytes data/nsis/Plugins/x86-ansi/nsisunz.dll | Bin 0 -> 40960 bytes data/nsis/Plugins/x86-unicode/INetC.dll | Bin 0 -> 25088 bytes data/nsis/Plugins/x86-unicode/UAC.dll | Bin 0 -> 14848 bytes data/nsis/Plugins/x86-unicode/md5dll.dll | Bin 0 -> 6656 bytes data/nsis/Plugins/x86-unicode/nsisunz.dll | Bin 0 -> 40960 bytes scripts/build-multiuser.nsi | 7 +- 94 files changed, 15990 insertions(+), 2 deletions(-) create mode 100644 data/nsis/Contrib/Inetc/afxres.h create mode 100644 data/nsis/Contrib/Inetc/api.h create mode 100644 data/nsis/Contrib/Inetc/crt.cpp create mode 100644 data/nsis/Contrib/Inetc/inetc.cpp create mode 100644 data/nsis/Contrib/Inetc/inetc.rc create mode 100644 data/nsis/Contrib/Inetc/inetc.sln create mode 100644 data/nsis/Contrib/Inetc/inetc.vcxproj create mode 100644 data/nsis/Contrib/Inetc/inetc.vcxproj.filters create mode 100644 data/nsis/Contrib/Inetc/nsis_tchar.h create mode 100644 data/nsis/Contrib/Inetc/pluginapi.c create mode 100644 data/nsis/Contrib/Inetc/pluginapi.h create mode 100644 data/nsis/Contrib/Inetc/resource.h create mode 100644 data/nsis/Contrib/md5dll/MD5.cpp create mode 100644 data/nsis/Contrib/md5dll/MD5.h create mode 100644 data/nsis/Contrib/md5dll/MD5Example.nsi create mode 100644 data/nsis/Contrib/md5dll/api.h create mode 100644 data/nsis/Contrib/md5dll/build.bat create mode 100644 data/nsis/Contrib/md5dll/md5dll.cpp create mode 100644 data/nsis/Contrib/md5dll/md5dll.def create mode 100644 data/nsis/Contrib/md5dll/md5dll.rc create mode 100644 data/nsis/Contrib/md5dll/nsis_tchar.h create mode 100644 data/nsis/Contrib/md5dll/pluginapi.h create mode 100644 data/nsis/Contrib/nsisunz/AggressiveOptimize.h create mode 100644 data/nsis/Contrib/nsisunz/example.nsi create mode 100644 data/nsis/Contrib/nsisunz/example_mui.nsi create mode 100644 data/nsis/Contrib/nsisunz/exdll.h create mode 100644 data/nsis/Contrib/nsisunz/info.rtf create mode 100644 data/nsis/Contrib/nsisunz/miniclib.c create mode 100644 data/nsis/Contrib/nsisunz/miniclib.h create mode 100644 data/nsis/Contrib/nsisunz/nsisunz.cpp create mode 100644 data/nsis/Contrib/nsisunz/nsisunz.dsp create mode 100644 data/nsis/Contrib/nsisunz/nsisunz.dsw create mode 100644 data/nsis/Contrib/nsisunz/nsisunz.ncb create mode 100644 data/nsis/Contrib/nsisunz/nsisunz.plg create mode 100644 data/nsis/Contrib/nsisunz/nsisunz.sln create mode 100644 data/nsis/Contrib/nsisunz/nsisunz.vcproj create mode 100644 data/nsis/Contrib/nsisunz/nsisunz_readme.html create mode 100644 data/nsis/Contrib/nsisunz/nsisunz_setup.nsi create mode 100644 data/nsis/Contrib/nsisunz/readme.kjd create mode 100644 data/nsis/Contrib/nsisunz/zippage.ini create mode 100644 data/nsis/Contrib/nsisunz/zlib/ADLER32.C create mode 100644 data/nsis/Contrib/nsisunz/zlib/CRC32.C create mode 100644 data/nsis/Contrib/nsisunz/zlib/INFFAST.C create mode 100644 data/nsis/Contrib/nsisunz/zlib/INFFAST.H create mode 100644 data/nsis/Contrib/nsisunz/zlib/INFFIXED.H create mode 100644 data/nsis/Contrib/nsisunz/zlib/INFLATE.C create mode 100644 data/nsis/Contrib/nsisunz/zlib/INFTREES.C create mode 100644 data/nsis/Contrib/nsisunz/zlib/INFTREES.H create mode 100644 data/nsis/Contrib/nsisunz/zlib/README create mode 100644 data/nsis/Contrib/nsisunz/zlib/UNZIP.H create mode 100644 data/nsis/Contrib/nsisunz/zlib/Unzip.c create mode 100644 data/nsis/Contrib/nsisunz/zlib/ZCONF.H create mode 100644 data/nsis/Contrib/nsisunz/zlib/ZLIB.H create mode 100644 data/nsis/Contrib/nsisunz/zlib/ZUTIL.H create mode 100644 data/nsis/Contrib/nsisunz/zlib/Zutil.c create mode 100644 data/nsis/Contrib/nsisunz/zlib/crc32.h create mode 100644 data/nsis/Contrib/nsisunz/zlib/inflate.h create mode 100644 data/nsis/Docs/Inetc/Readme.htm create mode 100644 data/nsis/Docs/Inetc/wiki.txt create mode 100644 data/nsis/Docs/md5dll/readme.txt create mode 100644 data/nsis/Docs/nsisunz/nsisunz_readme.html create mode 100644 data/nsis/Examples/Inetc/Example.nsi create mode 100644 data/nsis/Examples/Inetc/auth_dlg.nsi create mode 100644 data/nsis/Examples/Inetc/ftp_auth.nsi create mode 100644 data/nsis/Examples/Inetc/head.nsi create mode 100644 data/nsis/Examples/Inetc/headers.nsi create mode 100644 data/nsis/Examples/Inetc/headers.php create mode 100644 data/nsis/Examples/Inetc/https.nsi create mode 100644 data/nsis/Examples/Inetc/inetc_local.nsi create mode 100644 data/nsis/Examples/Inetc/post.nsi create mode 100644 data/nsis/Examples/Inetc/post.php create mode 100644 data/nsis/Examples/Inetc/post_file.nsi create mode 100644 data/nsis/Examples/Inetc/post_file.php create mode 100644 data/nsis/Examples/Inetc/post_form.html create mode 100644 data/nsis/Examples/Inetc/put.nsi create mode 100644 data/nsis/Examples/Inetc/put.php create mode 100644 data/nsis/Examples/Inetc/recursive.nsi create mode 100644 data/nsis/Examples/Inetc/redirect.nsi create mode 100644 data/nsis/Examples/Inetc/redirect.php create mode 100644 data/nsis/Examples/Inetc/timeout.nsi create mode 100644 data/nsis/Examples/Inetc/tostack.nsi create mode 100644 data/nsis/Examples/Inetc/translate.nsi create mode 100755 data/nsis/Include/NsisMultiUser.nsh create mode 100755 data/nsis/Include/UAC.nsh create mode 100644 data/nsis/Plugins/amd64-unicode/INetC.dll create mode 100644 data/nsis/Plugins/x86-ansi/INetC.dll create mode 100755 data/nsis/Plugins/x86-ansi/UAC.dll create mode 100644 data/nsis/Plugins/x86-ansi/md5dll.dll create mode 100644 data/nsis/Plugins/x86-ansi/nsisunz.dll create mode 100644 data/nsis/Plugins/x86-unicode/INetC.dll create mode 100755 data/nsis/Plugins/x86-unicode/UAC.dll create mode 100644 data/nsis/Plugins/x86-unicode/md5dll.dll create mode 100644 data/nsis/Plugins/x86-unicode/nsisunz.dll diff --git a/data/nsis/Contrib/Inetc/afxres.h b/data/nsis/Contrib/Inetc/afxres.h new file mode 100644 index 000000000..3fbfaa463 --- /dev/null +++ b/data/nsis/Contrib/Inetc/afxres.h @@ -0,0 +1,2 @@ +#include +#define IDC_STATIC (-1) diff --git a/data/nsis/Contrib/Inetc/api.h b/data/nsis/Contrib/Inetc/api.h new file mode 100644 index 000000000..e871de3d4 --- /dev/null +++ b/data/nsis/Contrib/Inetc/api.h @@ -0,0 +1,83 @@ +/* + * apih + * + * This file is a part of NSIS. + * + * Copyright (C) 1999-2013 Nullsoft and Contributors + * + * Licensed under the zlib/libpng license (the "License"); + * you may not use this file except in compliance with the License. + * + * Licence details can be found in the file COPYING. + * + * This software is provided 'as-is', without any express or implied + * warranty. + */ + +#ifndef _NSIS_EXEHEAD_API_H_ +#define _NSIS_EXEHEAD_API_H_ + +// Starting with NSIS 2.42, you can check the version of the plugin API in exec_flags->plugin_api_version +// The format is 0xXXXXYYYY where X is the major version and Y is the minor version (MAKELONG(y,x)) +// When doing version checks, always remember to use >=, ex: if (pX->exec_flags->plugin_api_version >= NSISPIAPIVER_1_0) {} + +#define NSISPIAPIVER_1_0 0x00010000 +#define NSISPIAPIVER_CURR NSISPIAPIVER_1_0 + +// NSIS Plug-In Callback Messages +enum NSPIM +{ + NSPIM_UNLOAD, // This is the last message a plugin gets, do final cleanup + NSPIM_GUIUNLOAD, // Called after .onGUIEnd +}; + +// Prototype for callbacks registered with extra_parameters->RegisterPluginCallback() +// Return NULL for unknown messages +// Should always be __cdecl for future expansion possibilities +typedef UINT_PTR (*NSISPLUGINCALLBACK)(enum NSPIM); + +// extra_parameters data structures containing other interesting stuff +// but the stack, variables and HWND passed on to plug-ins. +typedef struct +{ + int autoclose; + int all_user_var; + int exec_error; + int abort; + int exec_reboot; // NSIS_SUPPORT_REBOOT + int reboot_called; // NSIS_SUPPORT_REBOOT + int XXX_cur_insttype; // depreacted + int plugin_api_version; // see NSISPIAPIVER_CURR + // used to be XXX_insttype_changed + int silent; // NSIS_CONFIG_SILENT_SUPPORT + int instdir_error; + int rtl; + int errlvl; + int alter_reg_view; + int status_update; +} exec_flags_t; + +#ifndef NSISCALL +# define NSISCALL __stdcall +#endif + +typedef struct { + exec_flags_t *exec_flags; + int (NSISCALL *ExecuteCodeSegment)(int, HWND); + void (NSISCALL *validate_filename)(LPTSTR); + int (NSISCALL *RegisterPluginCallback)(HMODULE, NSISPLUGINCALLBACK); // returns 0 on success, 1 if already registered and < 0 on errors +} extra_parameters; + +// Definitions for page showing plug-ins +// See Ui.c to understand better how they're used + +// sent to the outer window to tell it to go to the next inner window +#define WM_NOTIFY_OUTER_NEXT (WM_USER+0x8) + +// custom pages should send this message to let NSIS know they're ready +#define WM_NOTIFY_CUSTOM_READY (WM_USER+0xd) + +// sent as wParam with WM_NOTIFY_OUTER_NEXT when user cancels - heed its warning +#define NOTIFY_BYE_BYE 'x' + +#endif /* _PLUGIN_H_ */ diff --git a/data/nsis/Contrib/Inetc/crt.cpp b/data/nsis/Contrib/Inetc/crt.cpp new file mode 100644 index 000000000..440533de2 --- /dev/null +++ b/data/nsis/Contrib/Inetc/crt.cpp @@ -0,0 +1,105 @@ +#include + +#if defined(_MSC_VER) && _MSC_VER+0 >= 1400 +#if defined(_MSC_FULL_VER) && _MSC_FULL_VER+0 >= 140050727 +#include +#else +EXTERN_C void __stosb(BYTE*,BYTE,size_t); +#endif +#pragma intrinsic(__stosb) +#define CRTINTRINSIC_memset(p,c,s) __stosb((BYTE*)(p),(BYTE)(c),(s)) +#endif + +extern "C" void* __cdecl memset(void *p, int c, size_t z) +{ +#ifdef CRTINTRINSIC_memset + CRTINTRINSIC_memset(p, c, z); +#else + BYTE *pb = reinterpret_cast(p); + for(size_t i=0; istring_size) +* HTTP POST added +* Jun 06, 2005 IDOK on "Enter" key locked +* POST HTTP header added +* Jun 22, 2005 non-interaptable mode /nocancel +* and direct connect /noproxy +* Jun 29, 2005 post.php written and tested +* Jul 05, 2005 60 sec delay on WinInet detach problem +* solved (not fine, but works including +* installer exit and system reboot) +* Jul 08, 2005 'set foreground' finally removed +* Jul 26, 2005 POPUP translate option +* Aug 23, 2005 https service type in InternetConnect +* and "ignore certificate" flags +* Sep 30, 2005 https with bad certificate from old OS; +* Forbidden handling +* Dec 23, 2005 'put' entry point, new names, 12003 +* ftp error handling (on ftp write permission) +* 405 http error (method not allowed) +* Mar 12, 2006 Internal authorization via InternetErrorDlg() +* and Unauthorized (401) handling. +* Jun 10, 2006 Caption text option for Resume download +* MessageBox +* Jun 24, 2006 HEAD method, silent mode clean up +* Sep 05, 2006 Center dialog code from Backland +* Sep 07, 2006 NSISdl crash fix /Backland idea/ +* Sep 08, 2006 POST as dll entry point. +* Sep 21, 2006 parent dlg progr.bar style and font, +* nocancel via ws_sysmenu +* Sep 22, 2006 current lang IDCANCEL text, /canceltext +* and /useragent options +* Sep 24, 2006 .onInit improvements and defaults +* Nov 11, 2006 FTP path creation, root|current dir mgmt +* Jan 01, 2007 Global char[] cleanup, GetLastError() to +* status string on ERR_DIALOG, few MSVCRT replaces +* Jan 13, 2007 /HEADER option added +* Jan 28, 2007 _open -> CreateFile and related +* Feb 18, 2007 Speed calculating improved (pauses), +* /popup text parameter to hide URL +* Jun 07, 2007 Local file truncation added for download +* (CREATE_ALWAYS) +* Jun 11, 2007 FTP download permitted even if server rejects +* SIZE request (ProFTPD). +* Aug 11, 2007 Backland' fix for progress bar redraw/style +* issue in NSISdl display mode. +* Jan 09, 2008 {_trueparuex^}' fix - InternetSetFilePointer() +* returns -1 on error. +* /question option added for cancel question. +* Feb 15, 2008 PUT content-length file size fix +* Feb 17, 2008 char -> TCHAR replace for UNICODE option +* Feb 19, 2008 janekschwarz fix for HTTP PUT with auth +* CreateFile INVALID_HANDLE_VALUE on error fix +* Feb 20, 2008 base64 encoder update for unicode +* Feb 27, 2008 Unicode configurations added to VS 6 dsp +* Mar 20, 2008 HTTP PUT with proxy auth finally fixed +* FTP errors handling improved. +* HEAD bug fixed +* Mar 27, 2008 Details window hide/show in NSISdl mode +* Apr 10, 2008 Auth test method changed to HEAD for +* old proxy's +* Apr 30, 2008 InternetErrorDlg() ERROR_SUCESS on cancel +* click patched +* 3xx errors added to status list. +* May 20, 2008 InternetReadFile on cable disconnect patched +* May 20, 2008 Reply status "0" patch (name resolution?) +* Jul 15, 2008 HTTP 304 parsing. Incorrect size reported fix. +* Aug 21, 2009 Escape sequence convertion removed (caused +* error in signature with %2b requests) +* Marqueue progess bar style for unknown file size. +* Feb 04, 2010 Unicode POST patch - body converted to multibyte +* Jul 11, 2010 /FILE POST option added +* Nov 04, 2010 Disabled cookies and cache for cleanliness +* Feb 14, 2011 Fixed reget bug introduced in previous commit +* Feb 18, 2011 /NOCOOKIES option added +* Mar 02, 2011 User-agent buffer increased. Small memory leak fix +* Mar 23, 2011 Use caption on embedded progressbar - zenpoy +* Apr 05, 2011 reget fix - INTERNET_FLAG_RELOAD for first connect only +* Apr 27, 2011 /receivetimeout option added for big files and antivirus +* Jun 15, 2011 Stack clean up fix on cancel - zenpoy +* Oct 19, 2011 FTP PUT error parsing fix - tperquin +* Aug 19, 2013 Fix focus stealing when in silent - negativesir, JohnTHaller +* Jul 20, 2014 - 1.0.4.4 - Stuart 'Afrow UK' Welch +* /tostack & /tostackconv added +* Version information resource added +* Updated to NSIS 3.0 plugin API +* Upgraded to Visual Studio 2012 +* 64-bit build added +* MSVCRT dependency removed +* Sep 04, 2015 - 1.0.5.0 - anders_k +* HTTPS connections are more secure by default +* Added /weaksecurity switch, reverts to old cert. security checks +* Sep 06, 2015 - 1.0.5.1 - anders_k +* Don't allow infinite FtpCreateDirectory tries +* Use memset intrinsic when possible to avoid VC code generation bug +* Oct 17, 2015 - 1.0.5.2 - anders_k +* Tries to set FTP mode to binary before querying the size. +* Calls FtpGetFileSize if it exists. +*******************************************************/ + + +#define _WIN32_WINNT 0x0500 + +#include +//#include +#include +#include +#include "pluginapi.h" +#include "resource.h" + +#include // strstr etc + +#ifndef PBM_SETMARQUEE +#define PBM_SETMARQUEE (WM_USER + 10) +#define PBS_MARQUEE 0x08 +#endif +#ifndef HTTP_QUERY_PROXY_AUTHORIZATION +#define HTTP_QUERY_PROXY_AUTHORIZATION 61 +#endif +#ifndef SECURITY_FLAG_IGNORE_REVOCATION +#define SECURITY_FLAG_IGNORE_REVOCATION 0x00000080 +#endif +#ifndef SECURITY_FLAG_IGNORE_UNKNOWN_CA +#define SECURITY_FLAG_IGNORE_UNKNOWN_CA 0x00000100 +#endif + +// IE 4 safety and VS 6 compatibility +typedef BOOL (__stdcall *FTP_CMD)(HINTERNET,BOOL,DWORD,LPCTSTR,DWORD,HINTERNET *); +FTP_CMD myFtpCommand; + +#define PLUGIN_NAME TEXT("Inetc plug-in") +#define INETC_USERAGENT TEXT("NSIS_Inetc (Mozilla)") +#define PB_RANGE 400 // progress bar values range +#define PAUSE1_SEC 2 // transfer error indication time, for reget only +#define PAUSE2_SEC 3 // paused state time, increase this if need (60?) +#define PAUSE3_SEC 1 // pause after resume button pressed +#define NOT_AVAILABLE 0xffffffff +#define POST_HEADER TEXT("Content-Type: application/x-www-form-urlencoded") +#define PUT_HEADER TEXT("Content-Type: octet-stream\nContent-Length: %d") +#define INTERNAL_OK 0xFFEE +#define PROGRESS_MS 1000 // screen values update interval +#define DEF_QUESTION TEXT("Are you sure that you want to stop download?") +#define HOST_AUTH_HDR TEXT("Authorization: basic %s") +#define PROXY_AUTH_HDR TEXT("Proxy-authorization: basic %s") + +//#define MY_WEAKSECURITY_CERT_FLAGS SECURITY_FLAG_IGNORE_UNKNOWN_CA | SECURITY_FLAG_IGNORE_REVOCATION | SECURITY_FLAG_IGNORE_CERT_DATE_INVALID | SECURITY_FLAG_IGNORE_CERT_CN_INVALID +#define MY_WEAKSECURITY_CERT_FLAGS SECURITY_FLAG_IGNORE_UNKNOWN_CA | SECURITY_FLAG_IGNORE_REVOCATION +#define MY_REDIR_FLAGS INTERNET_FLAG_IGNORE_REDIRECT_TO_HTTP | INTERNET_FLAG_IGNORE_REDIRECT_TO_HTTPS +#define MY_HTTPS_FLAGS (MY_REDIR_FLAGS | INTERNET_FLAG_SECURE) + +enum STATUS_CODES { + ST_OK = 0, + ST_CONNECTING, + ST_DOWNLOAD, + ST_CANCELLED, + ST_URLOPEN, + // ST_OPENING, + ST_PAUSE, + ERR_TERMINATED, + ERR_DIALOG, + ERR_INETOPEN, + ERR_URLOPEN, + ERR_TRANSFER, + ERR_FILEOPEN, + ERR_FILEWRITE, + ERR_FILEREAD, + ERR_REGET, + ERR_CONNECT, + ERR_OPENREQUEST, + ERR_SENDREQUEST, + ERR_CRACKURL, + ERR_NOTFOUND, + ERR_THREAD, + ERR_PROXY, + ERR_FORBIDDEN, + ERR_NOTALLOWED, + ERR_REQUEST, + ERR_SERVER, + ERR_AUTH, + ERR_CREATEDIR, + ERR_PATH, + ERR_NOTMODIFIED, + ERR_REDIRECTION +}; + + +static TCHAR szStatus[][32] = { + TEXT("OK"),TEXT("Connecting"),TEXT("Downloading"),TEXT("Cancelled"),TEXT("Connecting"), //TEXT("Opening URL")), + TEXT("Reconnect Pause"),TEXT("Terminated"),TEXT("Dialog Error"),TEXT("Open Internet Error"), + TEXT("Open URL Error"),TEXT("Transfer Error"),TEXT("File Open Error"),TEXT("File Write Error"),TEXT("File Read Error"), + TEXT("Reget Error"),TEXT("Connection Error"),TEXT("OpenRequest Error"),TEXT("SendRequest Error"), + TEXT("URL Parts Error"),TEXT("File Not Found (404)"),TEXT("CreateThread Error"),TEXT("Proxy Error (407)"), + TEXT("Access Forbidden (403)"),TEXT("Not Allowed (405)"),TEXT("Request Error"),TEXT("Server Error"), + TEXT("Unauthorized (401)"),TEXT("FtpCreateDir failed (550)"),TEXT("Error FTP path (550)"),TEXT("Not Modified"), + TEXT("Redirection") +}; + +HINSTANCE g_hInstance; +TCHAR fn[MAX_PATH]=TEXT(""), +*url = NULL, +*szAlias = NULL, +*szProxy = NULL, +*szHeader = NULL, +*szBanner = NULL, +*szQuestion = NULL, +szCancel[64]=TEXT(""), +szCaption[128]=TEXT(""), +szUserAgent[256]=TEXT(""), +szResume[256] = TEXT("Your internet connection seems to be not permitted or dropped out!\nPlease reconnect and click Retry to resume installation."); +CHAR *szPost = NULL, +post_fname[MAX_PATH] = ""; +DWORD fSize = 0; +TCHAR *szToStack = NULL; + +int status; +DWORD cnt = 0, +cntToStack = 0, +fs = 0, +timeout = 0, +receivetimeout = 0; +DWORD startTime, transfStart, openType; +bool silent, popup, resume, nocancel, noproxy, nocookies, convToStack, g_ignorecertissues; + +HWND childwnd; +HWND hDlg; +bool fput = false, fhead = false; + + +#define Option_IgnoreCertIssues() ( g_ignorecertissues ) + +static FARPROC GetWininetProcAddress(LPCSTR Name) +{ + return GetProcAddress(LoadLibraryA("WININET"), Name); +} + +/***************************************************** +* FUNCTION NAME: sf(HWND) +* PURPOSE: +* moves HWND to top and activates it +* SPECIAL CONSIDERATIONS: +* commented because annoying +*****************************************************/ +/* +void sf(HWND hw) +{ +DWORD ctid = GetCurrentThreadId(); +DWORD ftid = GetWindowThreadProcessId(GetForegroundWindow(), NULL); +AttachThreadInput(ftid, ctid, TRUE); +SetForegroundWindow(hw); +AttachThreadInput(ftid, ctid, FALSE); +} +*/ + +static TCHAR szUrl[64] = TEXT(""); +static TCHAR szDownloading[64] = TEXT("Downloading %s"); +static TCHAR szConnecting[64] = TEXT("Connecting ..."); +static TCHAR szSecond[64] = TEXT("second"); +static TCHAR szMinute[32] = TEXT("minute"); +static TCHAR szHour[32] = TEXT("hour"); +static TCHAR szPlural[32] = TEXT("s"); +static TCHAR szProgress[128] = TEXT("%dkB (%d%%) of %dkB @ %d.%01dkB/s"); +static TCHAR szRemaining[64] = TEXT(" (%d %s%s remaining)"); +static TCHAR szBasic[128] = TEXT(""); +static TCHAR szAuth[128] = TEXT(""); + +// is it possible to make it working with unicode strings? + +/* Base64 encode one byte */ +static TCHAR encode(unsigned char u) { + + if(u < 26) return TEXT('A')+u; + if(u < 52) return TEXT('a')+(u-26); + if(u < 62) return TEXT('0')+(u-52); + if(u == 62) return TEXT('+'); + return TEXT('/'); +} + +TCHAR *encode_base64(int size, TCHAR *src, TCHAR *dst) { + + int i; + TCHAR *p; + + if(!src) + return NULL; + + if(!size) + size= lstrlen(src); + + p = dst; + + for(i=0; i>2; + b5= ((b1&0x3)<<4)|(b2>>4); + b6= ((b2&0xf)<<2)|(b3>>6); + b7= b3&0x3f; + + *p++= encode(b4); + *p++= encode(b5); + + if(i+1 0) + { + dw = data_buf; + if(!InternetWriteFile(hFile, dw, bytesDone, &rslt) || rslt == 0) + { + status = ERR_TRANSFER; + break; + } + dw += rslt; + cnt += rslt; + bytesDone -= rslt; + } + } + else + { + if(!InternetReadFile(hFile, data_buf, sizeof(data_buf), &rslt)) + { + status = ERR_TRANSFER; + break; + } + if(rslt == 0) // EOF reached or cable disconnect + { +// on cable disconnect returns TRUE and 0 bytes. is cnt == 0 OK (zero file size)? +// cannot check this if reply is chunked (no content-length, http 1.1) + status = (fs != NOT_AVAILABLE && cnt < fs) ? ERR_TRANSFER : ST_OK; + break; + } + if(szToStack) + { + for (DWORD i = 0; cntToStack < g_stringsize && i < rslt; i++, cntToStack++) + *(szToStack + cntToStack) = data_buf[i]; + } + else if(!WriteFile(localFile, data_buf, rslt, &bytesDone, NULL) || + rslt != bytesDone) + { + status = ERR_FILEWRITE; + break; + } + cnt += rslt; + } + } +} + +/***************************************************** +* FUNCTION NAME: mySendRequest() +* PURPOSE: +* HttpSendRequestEx() sends headers only - for PUT +* We also can use InetWriteFile for POST body I guess +* SPECIAL CONSIDERATIONS: +* +*****************************************************/ +int mySendRequest(HINTERNET hFile) +{ + INTERNET_BUFFERS BufferIn = {0}; + if(fput) + { + BufferIn.dwStructSize = sizeof( INTERNET_BUFFERS ); + BufferIn.dwBufferTotal = fs; + return HttpSendRequestEx( hFile, &BufferIn, NULL, HSR_INITIATE, 0); + } + return HttpSendRequest(hFile, NULL, 0, szPost, fSize); +} + +/***************************************************** +* FUNCTION NAME: queryStatus() +* PURPOSE: +* http status code comes before download (get) and +* after upload (put), so this is called from 2 places +* SPECIAL CONSIDERATIONS: +* +*****************************************************/ +bool queryStatus(HINTERNET hFile) +{ + TCHAR buf[256] = TEXT(""); + DWORD rslt; + if(HttpQueryInfo(hFile, HTTP_QUERY_STATUS_CODE, + buf, &(rslt = sizeof(buf)), NULL)) + { + buf[3] = 0; + if(lstrcmp(buf, TEXT("0")) == 0 || *buf == 0) + status = ERR_SENDREQUEST; + else if(lstrcmp(buf, TEXT("401")) == 0) + status = ERR_AUTH; + else if(lstrcmp(buf, TEXT("403")) == 0) + status = ERR_FORBIDDEN; + else if(lstrcmp(buf, TEXT("404")) == 0) + status = ERR_NOTFOUND; + else if(lstrcmp(buf, TEXT("407")) == 0) + status = ERR_PROXY; + else if(lstrcmp(buf, TEXT("405")) == 0) + status = ERR_NOTALLOWED; + else if(lstrcmp(buf, TEXT("304")) == 0) + status = ERR_NOTMODIFIED; + else if(*buf == TEXT('3')) + { + status = ERR_REDIRECTION; + wsprintf(szStatus[status] + lstrlen(szStatus[status]), TEXT(" (%s)"), buf); + } + else if(*buf == TEXT('4')) + { + status = ERR_REQUEST; + wsprintf(szStatus[status] + lstrlen(szStatus[status]), TEXT(" (%s)"), buf); + } + else if(*buf == TEXT('5')) + { + status = ERR_SERVER; + wsprintf(szStatus[status] + lstrlen(szStatus[status]), TEXT(" (%s)"), buf); + } + return true; + } + return false; +} + +/***************************************************** +* FUNCTION NAME: openFtpFile() +* PURPOSE: +* control connection, size request, re-get lseek +* SPECIAL CONSIDERATIONS: +* +*****************************************************/ +HINTERNET openFtpFile(HINTERNET hConn, + TCHAR *path) +{ + TCHAR buf[256] = TEXT(""), *movp; + HINTERNET hFile; + DWORD rslt, err, gle; + bool https_req_ok = false; + + /* reads connection / auth responce info and cleares 'control' buffer this way */ + InternetGetLastResponseInfo(&err, buf, &(rslt = sizeof(buf))); + if(cnt == 0) + { + if(!fput) // we know local file size already + { + if (myFtpCommand) + { + /* Try to set the REPRESENTATION TYPE to I[mage] (Binary) because some servers + don't accept the SIZE command in ASCII mode */ + myFtpCommand(hConn, false, FTP_TRANSFER_TYPE_ASCII, TEXT("TYPE I"), 0, &hFile); + } + /* too clever myFtpCommand returnes false on the valid TEXT("550 Not found/Not permitted" server answer, + to read answer I had to ignory returned false (!= 999999) :-( + GetLastError also possible, but MSDN description of codes is very limited */ + wsprintf(buf, TEXT("SIZE %s"), path + 1); + if(myFtpCommand != NULL && + myFtpCommand(hConn, false, FTP_TRANSFER_TYPE_ASCII, buf, 0, &hFile) != 9999 && + memset(buf, 0, sizeof(buf)) != NULL && + InternetGetLastResponseInfo(&err, buf, &(rslt = sizeof(buf)))) + { + if(_tcsstr(buf, TEXT("213 "))) + { + fs = myatou(_tcschr(buf, TEXT(' ')) + 1); + } + /* stupid ProFTPD returns error on SIZE request. let's continue without size. + But IE knows some trick to get size from ProFTPD...... + else if(mystrstr(buf, TEXT("550 TEXT(")) + { + status = ERR_SIZE_NOT_PERMITTED; + return NULL; + } + */ + } + if(fs == 0) + { + fs = NOT_AVAILABLE; + } + } + } + else + { + wsprintf(buf, TEXT("REST %d"), cnt); + if(myFtpCommand == NULL || + !myFtpCommand(hConn, false, FTP_TRANSFER_TYPE_BINARY, buf, 0, &hFile) || + memset(buf, 0, sizeof(buf)) == NULL || + !InternetGetLastResponseInfo(&err, buf, &(rslt = sizeof(buf))) || + (_tcsstr(buf, TEXT("350")) == NULL && _tcsstr(buf, TEXT("110")) == NULL)) + { + status = ERR_REGET; + return NULL; + } + } + if((hFile = FtpOpenFile(hConn, path + 1, fput ? GENERIC_WRITE : GENERIC_READ, + FTP_TRANSFER_TYPE_BINARY|INTERNET_FLAG_RELOAD,0)) == NULL) + { + gle = GetLastError(); + *buf = 0; + InternetGetLastResponseInfo(&err, buf, &(rslt = sizeof(buf))); + // wrong path - dir may not exist or upload may be not allowed + // we use ftp://host//path (double /) to define path from FS root + if(fput && (_tcsstr(buf, TEXT("550")) != NULL || _tcsstr(buf, TEXT("553")) != NULL)) + { + movp = path + 1; + if(*movp == TEXT('/')) movp++; // don't need to create root + for (UINT8 escapehatch = 0; ++escapehatch;) // Weak workaround for http://forums.winamp.com/showpost.php?p=3031692&postcount=513 bug + { + TCHAR *pbs = _tcschr(movp, TEXT('/')); + if (!pbs) break; + *pbs = TEXT('\0'); + FtpCreateDirectory(hConn, path + 1); + InternetGetLastResponseInfo(&err, buf, &(rslt = sizeof(buf))); + *(movp + lstrlen(movp)) = TEXT('/'); + movp = _tcschr(movp, TEXT('/')) + 1; + } + if(status != ERR_CREATEDIR && + (hFile = FtpOpenFile(hConn, path + 1, GENERIC_WRITE, + FTP_TRANSFER_TYPE_BINARY|INTERNET_FLAG_RELOAD,0)) == NULL) + { + status = ERR_PATH; + if(InternetGetLastResponseInfo(&err, buf, &(rslt = sizeof(buf)))) + lstrcpyn(szStatus[status], _tcsstr(buf, TEXT("550")), sizeof(szStatus[0]) / sizeof(TCHAR)); + } + } + // may be firewall related error, let's give user time to disable it + else if(gle == 12003) // ERROR_INTERNET_EXTENDED_ERROR + { + if(_tcsstr(buf, TEXT("550"))) + { + status = ERR_NOTFOUND; + lstrcpyn(szStatus[status], _tcsstr(buf, TEXT("550")), sizeof(szStatus[0]) / sizeof(TCHAR)); + } + else + { + lstrcpyn(szStatus[status], buf, sizeof(szStatus[0]) / sizeof(TCHAR)); + } + } + // timeout (firewall or dropped connection problem) + else if(gle == 12002) // ERROR_INTERNET_TIMEOUT + { + if(!silent) + resume = true; + status = ERR_URLOPEN; + } + } + else + InternetGetLastResponseInfo(&err, buf, &(rslt = sizeof(buf))); + if (hFile && NOT_AVAILABLE == fs) + { + FARPROC ftpgfs = GetWininetProcAddress("FtpGetFileSize"); // IE5+ + if (ftpgfs) + { + DWORD shi, slo = ((DWORD(WINAPI*)(HINTERNET,DWORD*))ftpgfs)(hFile, &shi); + if (slo != -1 && !shi) fs = slo; + } + } + return hFile; +} + + +/***************************************************** +* FUNCTION NAME: openHttpFile() +* PURPOSE: +* file open, size request, re-get lseek +* SPECIAL CONSIDERATIONS: +* +*****************************************************/ +HINTERNET openHttpFile(HINTERNET hConn, INTERNET_SCHEME nScheme, TCHAR *path) +{ + TCHAR buf[256] = TEXT(""); + HINTERNET hFile; + DWORD rslt, err; + bool first_attempt = true;; + +// test connection for PUT, the only way to do this before sending data +// OPTIONS fails on HttpOpenRequest step for HTTPS +// but works for HEAD I guess + if(fput)// && nScheme != INTERNET_SCHEME_HTTPS) + { +// old proxy's may not support OPTIONS request, so changed to HEAD.... + if((hFile = HttpOpenRequest(hConn, TEXT("HEAD"), path, NULL, NULL, NULL, +// if((hFile = HttpOpenRequest(hConn, TEXT("OPTIONS"), path, NULL, NULL, NULL, + INTERNET_FLAG_RELOAD | INTERNET_FLAG_KEEP_CONNECTION | + (nocookies ? (INTERNET_FLAG_NO_CACHE_WRITE | INTERNET_FLAG_NO_COOKIES) : 0), 0)) != NULL) + { + if(*szAuth) + { + wsprintf(buf, PROXY_AUTH_HDR, szAuth); + HttpAddRequestHeaders(hFile, buf, -1, + HTTP_ADDREQ_FLAG_ADD | HTTP_ADDREQ_FLAG_REPLACE); + } +resend_proxy1: + if(*szBasic) + { + wsprintf(buf, HOST_AUTH_HDR, szBasic); + HttpAddRequestHeaders(hFile, buf, -1, + HTTP_ADDREQ_FLAG_ADD | HTTP_ADDREQ_FLAG_REPLACE); + } +resend_auth1: + if(HttpSendRequest(hFile, NULL, 0, NULL, 0)) + { + queryStatus(hFile); +// may be don't need to read all from socket, but this looks safer + while(InternetReadFile(hFile, buf, sizeof(buf), &rslt) && rslt > 0) {} + if(!silent && (status == ERR_PROXY || status == ERR_AUTH))// || status == ERR_FORBIDDEN)) + { + rslt = InternetErrorDlg(hDlg, hFile, + ERROR_INTERNET_INCORRECT_PASSWORD, + FLAGS_ERROR_UI_FILTER_FOR_ERRORS | + FLAGS_ERROR_UI_FLAGS_GENERATE_DATA | + FLAGS_ERROR_UI_FLAGS_CHANGE_OPTIONS, + NULL); + if (rslt == ERROR_INTERNET_FORCE_RETRY) + { + status = ST_URLOPEN; + if(status == ERR_PROXY) goto resend_proxy1; + else goto resend_auth1; + } + else + { + status = ST_CANCELLED; + } + + } + // no such file is OK for PUT. server first checks authentication + if(status == ERR_NOTFOUND || status == ERR_FORBIDDEN || status == ERR_NOTALLOWED) + { +// MessageBox(childwnd, TEXT("NOT_FOUND"), "", 0); + status = ST_URLOPEN; + } + // parameters might be updated during dialog popup + if(status == ST_URLOPEN) + { + *buf = 0; + if(HttpQueryInfo(hFile, HTTP_QUERY_AUTHORIZATION, buf, &(rslt = sizeof(buf)), NULL) && *buf) + lstrcpyn(szBasic, buf, rslt); + *buf = 0; + if(HttpQueryInfo(hFile, HTTP_QUERY_PROXY_AUTHORIZATION, buf, &(rslt = sizeof(buf)), NULL) && *buf) + lstrcpyn(szAuth, buf, rslt); + } + } + else status = ERR_SENDREQUEST; + InternetCloseHandle(hFile); + } + else status = ERR_OPENREQUEST; + } +// request itself + if(status == ST_URLOPEN) + { + DWORD secflags = nScheme == INTERNET_SCHEME_HTTPS ? MY_HTTPS_FLAGS : 0; + if (Option_IgnoreCertIssues()) secflags |= MY_WEAKSECURITY_CERT_FLAGS; + DWORD cokflags = nocookies ? (INTERNET_FLAG_NO_CACHE_WRITE | INTERNET_FLAG_NO_COOKIES) : 0; + if((hFile = HttpOpenRequest(hConn, fput ? TEXT("PUT") : (fhead ? TEXT("HEAD") : (szPost ? TEXT("POST") : NULL)), + path, NULL, NULL, NULL, + // INTERNET_FLAG_RELOAD conflicts with reget - hidden re-read from beginning has place + // INTERNET_FLAG_RESYNCHRONIZE // note - sync may not work with some http servers + // reload on first connect (and any req. except GET), just continue on resume. + // HTTP Proxy still is a problem for reget + (cnt ? 0 : INTERNET_FLAG_RELOAD) | INTERNET_FLAG_KEEP_CONNECTION | cokflags | secflags, 0)) != NULL) + { + if(*szAuth) + { + wsprintf(buf, PROXY_AUTH_HDR, szAuth); + HttpAddRequestHeaders(hFile, buf, -1, + HTTP_ADDREQ_FLAG_ADD | HTTP_ADDREQ_FLAG_REPLACE); + } +resend_proxy2: + if(szPost != NULL) + HttpAddRequestHeaders(hFile, POST_HEADER, + -1, HTTP_ADDREQ_FLAG_ADD | HTTP_ADDREQ_FLAG_REPLACE); + if(*post_fname) + HttpAddRequestHeadersA(hFile, post_fname, + -1, HTTP_ADDREQ_FLAG_ADD | HTTP_ADDREQ_FLAG_REPLACE); + if(szHeader != NULL) + HttpAddRequestHeaders(hFile, szHeader, -1, + HTTP_ADDREQ_FLAG_ADD | HTTP_ADDREQ_FLAG_REPLACE); + if(*szBasic) + { + wsprintf(buf, HOST_AUTH_HDR, szBasic); + HttpAddRequestHeaders(hFile, buf, -1, + HTTP_ADDREQ_FLAG_ADD | HTTP_ADDREQ_FLAG_REPLACE); + } + if(fput) + { + wsprintf(buf, PUT_HEADER, fs); + HttpAddRequestHeaders(hFile, buf, -1, + HTTP_ADDREQ_FLAG_ADD | HTTP_ADDREQ_FLAG_REPLACE); + } +resend_auth2: + first_attempt = true; + if(nScheme == INTERNET_SCHEME_HTTPS) + { + if(!mySendRequest(hFile)) + { + InternetQueryOption (hFile, INTERNET_OPTION_SECURITY_FLAGS, + (LPVOID)&rslt, &(err = sizeof(rslt))); + rslt |= Option_IgnoreCertIssues() ? MY_WEAKSECURITY_CERT_FLAGS : 0; + InternetSetOption (hFile, INTERNET_OPTION_SECURITY_FLAGS, + &rslt, sizeof(rslt) ); + } + else first_attempt = false; + } +// https Request answer may be after optional second Send only on Win98 + if(!first_attempt || mySendRequest(hFile)) + { +// no status for PUT - headers were sent only. And not need to get size / set position + if(!fput) + { + queryStatus(hFile); + if(!silent && (status == ERR_PROXY || status == ERR_AUTH)) + { + rslt = InternetErrorDlg(hDlg, hFile, + ERROR_INTERNET_INCORRECT_PASSWORD, + FLAGS_ERROR_UI_FILTER_FOR_ERRORS | + FLAGS_ERROR_UI_FLAGS_GENERATE_DATA | + FLAGS_ERROR_UI_FLAGS_CHANGE_OPTIONS, + NULL); + if (rslt == ERROR_INTERNET_FORCE_RETRY) + { + status = ST_URLOPEN; + if(status == ERR_PROXY) goto resend_proxy2; + else goto resend_auth2; + } + else + status = ST_CANCELLED; + + } +// get size / set position + if(status == ST_URLOPEN) + { + if(cnt == 0) + { + if(HttpQueryInfo(hFile, HTTP_QUERY_CONTENT_LENGTH, buf, + &(rslt = sizeof(buf)), NULL)) + fs = myatou(buf); + else + fs = NOT_AVAILABLE; + } + else + { + if((int)InternetSetFilePointer(hFile, cnt, NULL, FILE_BEGIN, 0) == -1) + status = ERR_REGET; + } + } + } + } + else + { + if(!queryStatus(hFile)) + status = ERR_SENDREQUEST; + } + } + else status = ERR_OPENREQUEST; + } + return hFile; +} + +/***************************************************** +* FUNCTION NAME: inetTransfer() +* PURPOSE: +* http/ftp file transfer +* SPECIAL CONSIDERATIONS: +* +*****************************************************/ +DWORD __stdcall inetTransfer(void *hw) +{ + HINTERNET hSes, hConn, hFile; + HANDLE localFile = NULL; + HWND hDlg = (HWND)hw; + DWORD lastCnt, rslt, err; + static TCHAR hdr[2048]; + TCHAR *host = (TCHAR*)LocalAlloc(LPTR, g_stringsize * sizeof(TCHAR)), + *path = (TCHAR*)LocalAlloc(LPTR, g_stringsize * sizeof(TCHAR)), + *params = (TCHAR*)LocalAlloc(LPTR, g_stringsize * sizeof(TCHAR)), + *user = (TCHAR*)LocalAlloc(LPTR, g_stringsize * sizeof(TCHAR)), + *passwd = (TCHAR*)LocalAlloc(LPTR, g_stringsize * sizeof(TCHAR)); + + URL_COMPONENTS uc = {sizeof(URL_COMPONENTS), NULL, 0, + (INTERNET_SCHEME)0, host, g_stringsize, 0 , user, g_stringsize, + passwd, g_stringsize, path, g_stringsize, params, g_stringsize}; + + if((hSes = InternetOpen(szUserAgent, openType, szProxy, NULL, 0)) != NULL) + { + if(InternetQueryOption(hSes, INTERNET_OPTION_CONNECTED_STATE, &(rslt=0), + &(lastCnt=sizeof(DWORD))) && + (rslt & INTERNET_STATE_DISCONNECTED_BY_USER)) + { + INTERNET_CONNECTED_INFO ci = {INTERNET_STATE_CONNECTED, 0}; + InternetSetOption(hSes, + INTERNET_OPTION_CONNECTED_STATE, &ci, sizeof(ci)); + } + if(timeout > 0) + lastCnt = InternetSetOption(hSes, INTERNET_OPTION_CONNECT_TIMEOUT, &timeout, sizeof(timeout)); + if(receivetimeout > 0) + InternetSetOption(hSes, INTERNET_OPTION_RECEIVE_TIMEOUT, &receivetimeout, sizeof(receivetimeout)); + // 60 sec WinInet.dll detach delay on socket time_wait fix + myFtpCommand = (FTP_CMD) GetWininetProcAddress( +#ifdef UNICODE + "FtpCommandW" +#else + "FtpCommandA" +#endif + ); + while(!popstring(url) && lstrcmpi(url, TEXT("/end")) != 0) + { + // too many customers requested not to do this + // sf(hDlg); + if(popstring(fn) != 0 || lstrcmpi(url, TEXT("/end")) == 0) break; + status = ST_CONNECTING; + cnt = fs = *host = *user = *passwd = *path = *params = 0; + PostMessage(hDlg, WM_TIMER, 1, 0); // show url & fn, do it sync + if(szToStack || (localFile = CreateFile(fn, fput ? GENERIC_READ : GENERIC_WRITE, FILE_SHARE_READ, + NULL, fput ? OPEN_EXISTING : CREATE_ALWAYS, 0, NULL)) != INVALID_HANDLE_VALUE) + { + uc.dwHostNameLength = uc.dwUserNameLength = uc.dwPasswordLength = + uc.dwUrlPathLength = uc.dwExtraInfoLength = g_stringsize; + if(fput) + { + fs = GetFileSize(localFile, NULL); + } + if(InternetCrackUrl(url, 0, 0/*ICU_ESCAPE*/ , &uc)) + { + // auth headers for HTTP PUT seems to be lost, preparing encoded login:password + if(*user && *passwd) + { + wsprintf(hdr, TEXT("%s:%s"), user, passwd); + // does unicode version of encoding works correct? + // are user and passwd ascii only? + encode_base64(lstrlen(hdr), hdr, szBasic); + *hdr = 0; + } + lstrcat(path, params); // BUGBUG: Could overflow path? + transfStart = GetTickCount(); + do + { + // re-PUT to already deleted tmp file on http server is not possible. + // the same with POST - must re-send data to server. for 'resume' loop + if((fput && uc.nScheme != INTERNET_SCHEME_FTP) || szPost) + { + cnt = 0; + SetFilePointer(localFile, 0, NULL, FILE_BEGIN); + } + status = ST_CONNECTING; + lastCnt = cnt; + if((hConn = InternetConnect(hSes, host, uc.nPort, + lstrlen(user) > 0 ? user : NULL, + lstrlen(passwd) > 0 ? passwd : NULL, + uc.nScheme == INTERNET_SCHEME_FTP ? INTERNET_SERVICE_FTP : INTERNET_SERVICE_HTTP, + uc.nScheme == INTERNET_SCHEME_FTP ? INTERNET_FLAG_PASSIVE : 0, 0)) != NULL) + { + status = ST_URLOPEN; + hFile = uc.nScheme == INTERNET_SCHEME_FTP ? + openFtpFile(hConn, path) : openHttpFile(hConn, uc.nScheme, path); + if(status != ST_URLOPEN && hFile != NULL) + { + InternetCloseHandle(hFile); + hFile = NULL; + } + if(hFile != NULL) + { + if(fhead) + {// repeating calls clear headers.. + if(HttpQueryInfo(hFile, HTTP_QUERY_RAW_HEADERS_CRLF, hdr, &(rslt=2048), NULL)) + { + if(szToStack) + { + for (DWORD i = 0; cntToStack < g_stringsize && i < rslt; i++, cntToStack++) + *(szToStack + cntToStack) = hdr[i]; + } + else + { + WriteFile(localFile, hdr, rslt, &lastCnt, NULL); + } + } + status = ST_OK; + } + else + { + HWND hBar = GetDlgItem(hDlg, IDC_PROGRESS1); + SendDlgItemMessage(hDlg, IDC_PROGRESS1, PBM_SETPOS, 0, 0); + SetWindowText(GetDlgItem(hDlg, IDC_STATIC5), fs == NOT_AVAILABLE ? TEXT("Not Available") : TEXT("")); + SetWindowText(GetDlgItem(hDlg, IDC_STATIC4), fs == NOT_AVAILABLE ? TEXT("Unknown") : TEXT("")); + SetWindowLong(hBar, GWL_STYLE, fs == NOT_AVAILABLE ? + (GetWindowLong(hBar, GWL_STYLE) | PBS_MARQUEE) : (GetWindowLong(hBar, GWL_STYLE) & ~PBS_MARQUEE)); + SendDlgItemMessage(hDlg, IDC_PROGRESS1, PBM_SETMARQUEE, (WPARAM)(fs == NOT_AVAILABLE ? 1 : 0), (LPARAM)50 ); + fileTransfer(localFile, hFile); + if(fput && uc.nScheme != INTERNET_SCHEME_FTP) + { + rslt = HttpEndRequest(hFile, NULL, 0, 0); + queryStatus(hFile); + } + } + InternetCloseHandle(hFile); + } + InternetCloseHandle(hConn); + } + else + { + status = ERR_CONNECT; + if(uc.nScheme == INTERNET_SCHEME_FTP && + InternetGetLastResponseInfo(&err, hdr, &(rslt = sizeof(hdr))) && + _tcsstr(hdr, TEXT("530"))) + { + lstrcpyn(szStatus[status], _tcsstr(hdr, TEXT("530")), sizeof(szStatus[0]) / sizeof(TCHAR)); + } + else + { + rslt = GetLastError(); + if((rslt == 12003 || rslt == 12002) && !silent) + resume = true; + } + } + } while(((!fput || uc.nScheme == INTERNET_SCHEME_FTP) && + cnt > lastCnt && + status == ERR_TRANSFER && + SleepEx(PAUSE1_SEC * 1000, false) == 0 && + (status = ST_PAUSE) != ST_OK && + SleepEx(PAUSE2_SEC * 1000, false) == 0) + || (resume && + status != ST_OK && + status != ST_CANCELLED && + status != ERR_NOTFOUND && + ShowWindow(hDlg, SW_HIDE) != -1 && + MessageBox(GetParent(hDlg), szResume, *szCaption ? szCaption : PLUGIN_NAME, MB_RETRYCANCEL|MB_ICONWARNING) == IDRETRY && + (status = ST_PAUSE) != ST_OK && + ShowWindow(hDlg, silent ? SW_HIDE : SW_SHOW) == false && + SleepEx(PAUSE3_SEC * 1000, false) == 0)); + } + else status = ERR_CRACKURL; + CloseHandle(localFile); + if(!fput && status != ST_OK && !szToStack) + { + rslt = DeleteFile(fn); + break; + } + } + else status = ERR_FILEOPEN; + } + InternetCloseHandle(hSes); + if (lstrcmpi(url, TEXT("/end"))==0) + pushstring(url); + } + else status = ERR_INETOPEN; + LocalFree(host); + LocalFree(path); + LocalFree(user); + LocalFree(passwd); + LocalFree(params); + if(IsWindow(hDlg)) + PostMessage(hDlg, WM_COMMAND, MAKELONG(IDOK, INTERNAL_OK), 0); + return status; +} + +/***************************************************** +* FUNCTION NAME: fsFormat() +* PURPOSE: +* formats DWORD (max 4 GB) file size for dialog, big MB +* SPECIAL CONSIDERATIONS: +* +*****************************************************/ +void fsFormat(DWORD bfs, TCHAR *b) +{ + if(bfs == NOT_AVAILABLE) + lstrcpy(b, TEXT("???")); + else if(bfs == 0) + lstrcpy(b, TEXT("0")); + else if(bfs < 10 * 1024) + wsprintf(b, TEXT("%u bytes"), bfs); + else if(bfs < 10 * 1024 * 1024) + wsprintf(b, TEXT("%u kB"), bfs / 1024); + else wsprintf(b, TEXT("%u MB"), (bfs / 1024 / 1024)); +} + + +/***************************************************** +* FUNCTION NAME: progress_callback +* PURPOSE: +* old-style progress bar text updates +* SPECIAL CONSIDERATIONS: +* +*****************************************************/ + +void progress_callback(void) +{ + static TCHAR buf[1024] = TEXT(""), b[1024] = TEXT(""); + int time_sofar = max(1, (GetTickCount() - transfStart) / 1000); + int bps = cnt / time_sofar; + int remain = (cnt > 0 && fs != NOT_AVAILABLE) ? (MulDiv(time_sofar, fs, cnt) - time_sofar) : 0; + TCHAR *rtext=szSecond; + if(remain < 0) remain = 0; + if (remain >= 60) + { + remain/=60; + rtext=szMinute; + if (remain >= 60) + { + remain/=60; + rtext=szHour; + } + } + wsprintf(buf, + szProgress, + cnt/1024, + fs > 0 && fs != NOT_AVAILABLE ? MulDiv(100, cnt, fs) : 0, + fs != NOT_AVAILABLE ? fs/1024 : 0, + bps/1024,((bps*10)/1024)%10 + ); + if (remain) wsprintf(buf + lstrlen(buf), + szRemaining, + remain, + rtext, + remain==1?TEXT(""):szPlural + ); + SetDlgItemText(hDlg, IDC_STATIC1, (cnt == 0 || status == ST_CONNECTING) ? szConnecting : buf); + if(fs > 0 && fs != NOT_AVAILABLE) + SendMessage(GetDlgItem(hDlg, IDC_PROGRESS1), PBM_SETPOS, MulDiv(cnt, PB_RANGE, fs), 0); + if (*szCaption == 0) + wsprintf(buf, szDownloading, _tcsrchr(fn, TEXT('\\')) ? _tcsrchr(fn, TEXT('\\')) + 1 : fn); + else + wsprintf(buf, TEXT("%s"),szCaption); + HWND hwndS = GetDlgItem(childwnd, 1006); + if(!silent && hwndS != NULL && IsWindow(hwndS)) + { + GetWindowText(hwndS, b, sizeof(b)); + if(lstrcmp(b, buf) != 0) + SetWindowText(hwndS, buf); + } +} + +/***************************************************** +* FUNCTION NAME: onTimer() +* PURPOSE: +* updates text fields every second +* SPECIAL CONSIDERATIONS: +* +*****************************************************/ +void onTimer(HWND hDlg) +{ + TCHAR b[128]; + DWORD ct = (GetTickCount() - transfStart) / 1000, + tt = (GetTickCount() - startTime) / 1000; + // dialog window caption + wsprintf(b, TEXT("%s - %s"), *szCaption ? szCaption : PLUGIN_NAME, szStatus[status]); + if(fs > 0 && fs != NOT_AVAILABLE && status == ST_DOWNLOAD) + { + wsprintf(b + lstrlen(b), TEXT(" %d%%"), MulDiv(100, cnt, fs)); + } + if(szBanner == NULL) SetWindowText(hDlg, b); + // current file and url + SetDlgItemText(hDlg, IDC_STATIC1, (szAlias && *szAlias) ? szAlias : url); + SetDlgItemText(hDlg, IDC_STATIC2, /*_tcsrchr(fn, '\\') ? _tcsrchr(fn, '\\') + 1 : */fn); + // bytes done and rate + if(cnt > 0) + { + fsFormat(cnt, b); + if(ct > 1 && status == ST_DOWNLOAD) + { + lstrcat(b, TEXT(" ( ")); + fsFormat(cnt / ct, b + lstrlen(b)); + lstrcat(b, TEXT("/sec )")); + } + } + else *b = 0; + SetDlgItemText(hDlg, IDC_STATIC3, b); + // total download time + wsprintf(b, TEXT("%d:%02d:%02d"), tt / 3600, (tt / 60) % 60, tt % 60); + SetDlgItemText(hDlg, IDC_STATIC6, b); + // file size, time remaining, progress bar + if(fs > 0 && fs != NOT_AVAILABLE) + { + fsFormat(fs, b); + SetDlgItemText(hDlg, IDC_STATIC5, b); + SendDlgItemMessage(hDlg, IDC_PROGRESS1, PBM_SETPOS, MulDiv(cnt, PB_RANGE, fs), 0); + if(cnt > 5000) + { + ct = MulDiv(fs - cnt, ct, cnt); + wsprintf(b, TEXT("%d:%02d:%02d"), ct / 3600, (ct / 60) % 60, ct % 60); + } + else *b = 0; + SetWindowText(GetDlgItem(hDlg, IDC_STATIC4), b); + } +} + +/***************************************************** +* FUNCTION NAME: centerDlg() +* PURPOSE: +* centers dlg on NSIS parent +* SPECIAL CONSIDERATIONS: +* +*****************************************************/ +void centerDlg(HWND hDlg) +{ + HWND hwndParent = GetParent(hDlg); + RECT nsisRect, dlgRect, waRect; + int dlgX, dlgY, dlgWidth, dlgHeight; + + if(hwndParent == NULL || silent) + return; + if(popup) + GetWindowRect(hwndParent, &nsisRect); + else GetClientRect(hwndParent, &nsisRect); + GetWindowRect(hDlg, &dlgRect); + + dlgWidth = dlgRect.right - dlgRect.left; + dlgHeight = dlgRect.bottom - dlgRect.top; + dlgX = (nsisRect.left + nsisRect.right - dlgWidth) / 2; + dlgY = (nsisRect.top + nsisRect.bottom - dlgHeight) / 2; + + if(popup) + { + SystemParametersInfo(SPI_GETWORKAREA, 0, &waRect, 0); + if(dlgX > waRect.right - dlgWidth) + dlgX = waRect.right - dlgWidth; + if(dlgX < waRect.left) dlgX = waRect.left; + if(dlgY > waRect.bottom - dlgHeight) + dlgY = waRect.bottom - dlgHeight; + if(dlgY < waRect.top) dlgY = waRect.top; + } + else dlgY += 20; + + SetWindowPos(hDlg, HWND_TOP, dlgX, dlgY, 0, 0, SWP_NOSIZE); +} + +/***************************************************** +* FUNCTION NAME: onInitDlg() +* PURPOSE: +* dlg init +* SPECIAL CONSIDERATIONS: +* +*****************************************************/ +void onInitDlg(HWND hDlg) +{ + HFONT hFont; + HWND hPrbNew; + HWND hPrbOld; + HWND hCan = GetDlgItem(hDlg, IDCANCEL); + + if(childwnd) + { + hPrbNew = GetDlgItem(hDlg, IDC_PROGRESS1); + hPrbOld = GetDlgItem(childwnd, 0x3ec); + + // Backland' fix for progress bar redraw/style issue. + // Original bar may be hidden because of interfernce with other plug-ins. + LONG prbStyle = WS_VISIBLE | WS_CHILD | WS_CLIPSIBLINGS | WS_CLIPCHILDREN; + if(hPrbOld != NULL) + { + prbStyle |= GetWindowLong(hPrbOld, GWL_STYLE); + } + SetWindowLong(hPrbNew, GWL_STYLE, prbStyle); + + if(!popup) + { + if((hFont = (HFONT)SendMessage(childwnd, WM_GETFONT, 0, 0)) != NULL) + { + SendDlgItemMessage(hDlg, IDC_STATIC1, WM_SETFONT, (WPARAM)hFont, 0); + SendDlgItemMessage(hDlg, IDCANCEL, WM_SETFONT, (WPARAM)hFont, 0); + } + if(*szCancel == 0) + GetWindowText(GetDlgItem(GetParent(childwnd), IDCANCEL), szCancel, sizeof(szCancel)); + SetWindowText(hCan, szCancel); + SetWindowPos(hPrbNew, HWND_TOP, 0, 0, 0, 0, SWP_NOSIZE | SWP_NOMOVE); + } + } + + if(nocancel) + { + if(hCan != NULL) + ShowWindow(hCan, SW_HIDE); + if(popup) + SetWindowLong(hDlg, GWL_STYLE, GetWindowLong(hDlg, GWL_STYLE) ^ WS_SYSMENU); + } + SendDlgItemMessage(hDlg, IDC_PROGRESS1, PBM_SETRANGE, + 0, MAKELPARAM(0, PB_RANGE)); + if(szBanner != NULL) + { + SendDlgItemMessage(hDlg, IDC_STATIC13, STM_SETICON, + (WPARAM)LoadIcon(GetModuleHandle(NULL), MAKEINTRESOURCE(103)), 0); + SetDlgItemText(hDlg, IDC_STATIC12, szBanner); + SetWindowText(hDlg, *szCaption ? szCaption : PLUGIN_NAME); + } + SetTimer(hDlg, 1, 1000, NULL); + if(*szUrl != 0) + { + SetDlgItemText(hDlg, IDC_STATIC20, szUrl); + SetDlgItemText(hDlg, IDC_STATIC21, szDownloading); + SetDlgItemText(hDlg, IDC_STATIC22, szConnecting); + SetDlgItemText(hDlg, IDC_STATIC23, szProgress); + SetDlgItemText(hDlg, IDC_STATIC24, szSecond); + SetDlgItemText(hDlg, IDC_STATIC25, szRemaining); + } +} + +/***************************************************** +* FUNCTION NAME: dlgProc() +* PURPOSE: +* dlg message handling procedure +* SPECIAL CONSIDERATIONS: +* todo: better dialog design +*****************************************************/ +INT_PTR CALLBACK dlgProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam ) +{ + switch(message) + { + case WM_INITDIALOG: + onInitDlg(hDlg); + centerDlg(hDlg); + return false; + case WM_PAINT: + // child dialog redraw problem. return false is important + RedrawWindow(GetDlgItem(hDlg, IDC_STATIC1), NULL, NULL, RDW_INVALIDATE); + RedrawWindow(GetDlgItem(hDlg, IDCANCEL), NULL, NULL, RDW_INVALIDATE); + RedrawWindow(GetDlgItem(hDlg, IDC_PROGRESS1), NULL, NULL, RDW_INVALIDATE); + UpdateWindow(GetDlgItem(hDlg, IDC_STATIC1)); + UpdateWindow(GetDlgItem(hDlg, IDCANCEL)); + UpdateWindow(GetDlgItem(hDlg, IDC_PROGRESS1)); + return false; + case WM_TIMER: + if(!silent && IsWindow(hDlg)) + { + // long connection period and paused state updates + if(status != ST_DOWNLOAD && GetTickCount() - transfStart > PROGRESS_MS) + transfStart += PROGRESS_MS; + if(popup) onTimer(hDlg); else progress_callback(); + RedrawWindow(GetDlgItem(hDlg, IDC_STATIC1), NULL, NULL, RDW_INVALIDATE); + RedrawWindow(GetDlgItem(hDlg, IDCANCEL), NULL, NULL, RDW_INVALIDATE); + RedrawWindow(GetDlgItem(hDlg, IDC_PROGRESS1), NULL, NULL, RDW_INVALIDATE); + } + break; + case WM_COMMAND: + switch(LOWORD(wParam)) + { + case IDCANCEL: + if(nocancel) break; + if(szQuestion && + MessageBox(hDlg, szQuestion, *szCaption ? szCaption : PLUGIN_NAME, MB_ICONWARNING|MB_YESNO) == IDNO) + break; + status = ST_CANCELLED; + // FallThrough + case IDOK: + if(status != ST_CANCELLED && HIWORD(wParam) != INTERNAL_OK) break; + // otherwise in the silent mode next banner windows may go to background + // if(silent) sf(hDlg); + KillTimer(hDlg, 1); + DestroyWindow(hDlg); + break; + } + return false; + default: + return false; + } + return true; +} + +/***************************************************** +* FUNCTION NAME: get() +* PURPOSE: +* http/https/ftp file download entry point +* SPECIAL CONSIDERATIONS: +* +*****************************************************/ +extern "C" +void __declspec(dllexport) __cdecl get(HWND hwndParent, + int string_size, + TCHAR *variables, + stack_t **stacktop, + extra_parameters *extra + ) +{ + HANDLE hThread; + DWORD dwThreadId; + MSG msg; + TCHAR szUsername[64]=TEXT(""), // proxy params + szPassword[64]=TEXT(""); + + + EXDLL_INIT(); + +// for repeating /nounload plug-un calls - global vars clean up + silent = popup = resume = nocancel = noproxy = nocookies = false; + g_ignorecertissues = false; + myFtpCommand = NULL; + openType = INTERNET_OPEN_TYPE_PRECONFIG; + status = ST_CONNECTING; + *szCaption = *szCancel = *szUserAgent = *szBasic = *szAuth = 0; + + url = (TCHAR*)LocalAlloc(LPTR, string_size * sizeof(TCHAR)); + if(szPost) + { + popstring(url); +#ifdef UNICODE + WideCharToMultiByte(CP_ACP, 0, url, -1, szPost, string_size, NULL, NULL); +#else + lstrcpy(szPost, url); +#endif + fSize = (DWORD)lstrlenA(szPost); + } + // global silent option + if(extra->exec_flags->silent != 0) + silent = true; + // we must take this from stack, or push url back + while(!popstring(url) && *url == TEXT('/')) + { + if(lstrcmpi(url, TEXT("/silent")) == 0) + silent = true; + else if(lstrcmpi(url, TEXT("/weaksecurity")) == 0) + g_ignorecertissues = true; + else if(lstrcmpi(url, TEXT("/caption")) == 0) + popstring(szCaption); + else if(lstrcmpi(url, TEXT("/username")) == 0) + popstring(szUsername); + else if(lstrcmpi(url, TEXT("/password")) == 0) + popstring(szPassword); + else if(lstrcmpi(url, TEXT("/nocancel")) == 0) + nocancel = true; + else if(lstrcmpi(url, TEXT("/nocookies")) == 0) + nocookies = true; + else if(lstrcmpi(url, TEXT("/noproxy")) == 0) + openType = INTERNET_OPEN_TYPE_DIRECT; + else if(lstrcmpi(url, TEXT("/popup")) == 0) + { + popup = true; + szAlias = (TCHAR*)LocalAlloc(LPTR, string_size * sizeof(TCHAR)); + popstring(szAlias); + } + else if(lstrcmpi(url, TEXT("/resume")) == 0) + { + popstring(url); + if(url[0]) lstrcpy(szResume, url); + resume = true; + } + else if(lstrcmpi(url, TEXT("/translate")) == 0) + { + if(popup) + { + popstring(szUrl); + popstring(szStatus[ST_DOWNLOAD]); // Downloading + popstring(szStatus[ST_CONNECTING]); // Connecting + lstrcpy(szStatus[ST_URLOPEN], szStatus[ST_CONNECTING]); + popstring(szDownloading);// file name + popstring(szConnecting);// received + popstring(szProgress);// file size + popstring(szSecond);// remaining time + popstring(szRemaining);// total time + } + else + { + popstring(szDownloading); + popstring(szConnecting); + popstring(szSecond); + popstring(szMinute); + popstring(szHour); + popstring(szPlural); + popstring(szProgress); + popstring(szRemaining); + } + } + else if(lstrcmpi(url, TEXT("/banner")) == 0) + { + popup = true; + szBanner = (TCHAR*)LocalAlloc(LPTR, string_size * sizeof(TCHAR)); + popstring(szBanner); + } + else if(lstrcmpi(url, TEXT("/canceltext")) == 0) + { + popstring(szCancel); + } + else if(lstrcmpi(url, TEXT("/question")) == 0) + { + szQuestion = (TCHAR*)LocalAlloc(LPTR, string_size * sizeof(TCHAR)); + popstring(szQuestion); + if(*szQuestion == 0) lstrcpy(szQuestion, DEF_QUESTION); + } + else if(lstrcmpi(url, TEXT("/useragent")) == 0) + { + popstring(szUserAgent); + } + else if(lstrcmpi(url, TEXT("/proxy")) == 0) + { + szProxy = (TCHAR*)LocalAlloc(LPTR, string_size * sizeof(TCHAR)); + popstring(szProxy); + openType = INTERNET_OPEN_TYPE_PROXY; + } + else if(lstrcmpi(url, TEXT("/connecttimeout")) == 0) + { + popstring(url); + timeout = myatou(url) * 1000; + } + else if(lstrcmpi(url, TEXT("/receivetimeout")) == 0) + { + popstring(url); + receivetimeout = myatou(url) * 1000; + } + else if(lstrcmpi(url, TEXT("/header")) == 0) + { + szHeader = (TCHAR*)LocalAlloc(LPTR, string_size * sizeof(TCHAR)); + popstring(szHeader); + } + else if(!fput && ((convToStack = lstrcmpi(url, TEXT("/tostackconv")) == 0) || lstrcmpi(url, TEXT("/tostack")) == 0)) + { + szToStack = (TCHAR*)LocalAlloc(LPTR, string_size * sizeof(TCHAR)); + cntToStack = 0; + lstrcpy(fn, TEXT("file")); + } + else if(lstrcmpi(url, TEXT("/file")) == 0) + { + HANDLE hFile = CreateFileA(szPost, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, 0, NULL); + DWORD rslt; + if(hFile == INVALID_HANDLE_VALUE) + { + status = ERR_FILEOPEN; + goto cleanup; + } + if((fSize = GetFileSize(hFile, NULL)) == 0) + { + CloseHandle(hFile); + status = ERR_FILEREAD; + goto cleanup; + } + wsprintfA(post_fname, "Filename: %s", + strchr(szPost, '\\') ? strrchr(szPost, '\\') + 1 : szPost); + LocalFree(szPost); + szPost = (char*)LocalAlloc(LPTR, fSize); + if(ReadFile(hFile, szPost, fSize, &rslt, NULL) == 0 || rslt != fSize) + { + CloseHandle(hFile); + status = ERR_FILEREAD; + goto cleanup; + } + CloseHandle(hFile); + } + } + pushstring(url); +// if(*szCaption == 0) lstrcpy(szCaption, PLUGIN_NAME); + if(*szUserAgent == 0) lstrcpy(szUserAgent, INETC_USERAGENT); + if(*szPassword && *szUsername) + { + wsprintf(url, TEXT("%s:%s"), szUsername, szPassword); + encode_base64(lstrlen(url), url, szAuth); + } + // may be silent for plug-in, but not so for installer itself - let's try to define 'progress text' + if(hwndParent != NULL && + (childwnd = FindWindowEx(hwndParent, NULL, TEXT("#32770"), NULL)) != NULL && + !silent) + SetDlgItemText(childwnd, 1006, *szCaption ? szCaption : PLUGIN_NAME); + else InitCommonControls(); // or NSIS do this before .onInit? + // cannot embed child dialog to non-existing parent. Using 'silent' to hide it + if(childwnd == NULL && !popup) silent = true; + // let's use hidden popup dlg in the silent mode - works both on .onInit and Page + if(silent) { resume = false; popup = true; } + // google says WS_CLIPSIBLINGS helps to redraw... not in my tests... + if(!popup) + { + unsigned int wstyle = GetWindowLong(childwnd, GWL_STYLE); + wstyle |= WS_CLIPSIBLINGS; + SetWindowLong(childwnd, GWL_STYLE, wstyle); + } + startTime = GetTickCount(); + if((hDlg = CreateDialog(g_hInstance, + MAKEINTRESOURCE(szBanner ? IDD_DIALOG2 : (popup ? IDD_DIALOG1 : IDD_DIALOG3)), + (popup ? hwndParent : childwnd), dlgProc)) != NULL) + { + + if((hThread = CreateThread(NULL, 0, inetTransfer, (LPVOID)hDlg, 0, + &dwThreadId)) != NULL) + { + HWND hButton = GetDlgItem(childwnd, 0x403); + HWND hList = GetDlgItem(childwnd, 0x3f8); + DWORD dwStyleButton = 0; + BOOL fVisibleList = false; + if(!silent) + { + ShowWindow(hDlg, SW_NORMAL); + if(childwnd && !popup) + { + if(hButton) + { + dwStyleButton = GetWindowLong(hButton, GWL_STYLE); + EnableWindow(hButton, false); + } + if(hList) + { + fVisibleList = IsWindowVisible(hList); + ShowWindow(hList, SW_HIDE); + } + } + } + + while(IsWindow(hDlg) && + GetMessage(&msg, NULL, 0, 0) > 0) + { + if(!IsDialogMessage(hDlg, &msg) && + !IsDialogMessage(hwndParent, &msg) && + !TranslateMessage(&msg)) + DispatchMessage(&msg); + } + + if(WaitForSingleObject(hThread, 3000) == WAIT_TIMEOUT) + { + TerminateThread(hThread, 1); + status = ERR_TERMINATED; + } + CloseHandle(hThread); + if(!silent && childwnd) + { + SetDlgItemText(childwnd, 1006, TEXT("")); + if(!popup) + { + if(hButton) + SetWindowLong(hButton, GWL_STYLE, dwStyleButton); + if(hList && fVisibleList) + ShowWindow(hList, SW_SHOW); + } + // RedrawWindow(childwnd, NULL, NULL, RDW_INVALIDATE|RDW_ERASE); + } + } + else + { + status = ERR_THREAD; + DestroyWindow(hDlg); + } + } + else { + status = ERR_DIALOG; + wsprintf(szStatus[status] + lstrlen(szStatus[status]), TEXT(" (Err=%d)"), GetLastError()); + } +cleanup: + // we need to clean up stack from remaining url/file pairs. + // this multiple files download head pain and may be not safe + while(!popstring(url) && lstrcmpi(url, TEXT("/end")) != 0) + { + /* nothing MessageBox(NULL, url, TEXT(""), 0);*/ + } + LocalFree(url); + if(szAlias) LocalFree(szAlias); + if(szBanner) LocalFree(szAlias); + if(szQuestion) LocalFree(szQuestion); + if(szProxy) LocalFree(szProxy); + if(szPost) LocalFree(szPost); + if(szHeader) LocalFree(szHeader); + + url = szProxy = szHeader = szAlias = szQuestion = NULL; + szPost = NULL; + fput = fhead = false; + + if(szToStack && status == ST_OK) + { + if(cntToStack > 0 && convToStack) + { +#ifdef UNICODE + int required = MultiByteToWideChar(CP_ACP, 0, (CHAR*)szToStack, string_size * sizeof(TCHAR), NULL, 0); + if(required > 0) + { + WCHAR* pszToStackNew = (WCHAR*)LocalAlloc(LPTR, sizeof(WCHAR) * (required + 1)); + if(pszToStackNew) + { + if(MultiByteToWideChar(CP_ACP, 0, (CHAR*)szToStack, string_size * sizeof(TCHAR), pszToStackNew, required) > 0) + pushstring(pszToStackNew); + LocalFree(pszToStackNew); + } + } +#else + int required = WideCharToMultiByte(CP_ACP, 0, (WCHAR*)szToStack, -1, NULL, 0, NULL, NULL); + if(required > 0) + { + CHAR* pszToStackNew = (CHAR*)LocalAlloc(LPTR, required + 1); + if(pszToStackNew) + { + if(WideCharToMultiByte(CP_ACP, 0, (WCHAR*)szToStack, -1, pszToStackNew, required, NULL, NULL) > 0) + pushstring(pszToStackNew); + LocalFree(pszToStackNew); + } + } +#endif + } + else + { + pushstring(szToStack); + } + LocalFree(szToStack); + szToStack = NULL; + } + + pushstring(szStatus[status]); +} + +/***************************************************** +* FUNCTION NAME: put() +* PURPOSE: +* http/ftp file upload entry point +* SPECIAL CONSIDERATIONS: +* re-put not works with http, but ftp REST - may be. +*****************************************************/ +extern "C" +void __declspec(dllexport) __cdecl put(HWND hwndParent, + int string_size, + TCHAR *variables, + stack_t **stacktop, + extra_parameters *extra + ) +{ + fput = true; + lstrcpy(szDownloading, TEXT("Uploading %s")); + lstrcpy(szStatus[2], TEXT("Uploading")); + get(hwndParent, string_size, variables, stacktop, extra); +} + +/***************************************************** +* FUNCTION NAME: post() +* PURPOSE: +* http post entry point +* SPECIAL CONSIDERATIONS: +* +*****************************************************/ +extern "C" +void __declspec(dllexport) __cdecl post(HWND hwndParent, + int string_size, + TCHAR *variables, + stack_t **stacktop, + extra_parameters *extra + ) +{ + szPost = (CHAR*)LocalAlloc(LPTR, string_size); + get(hwndParent, string_size, variables, stacktop, extra); +} + +/***************************************************** +* FUNCTION NAME: head() +* PURPOSE: +* http/ftp file upload entry point +* SPECIAL CONSIDERATIONS: +* re-put not works with http, but ftp REST - may be. +*****************************************************/ +extern "C" +void __declspec(dllexport) __cdecl head(HWND hwndParent, + int string_size, + TCHAR *variables, + stack_t **stacktop, + extra_parameters *extra + ) +{ + fhead = true; + get(hwndParent, string_size, variables, stacktop, extra); +} + +/***************************************************** +* FUNCTION NAME: DllMain() +* PURPOSE: +* Dll main (initialization) entry point +* SPECIAL CONSIDERATIONS: +* +*****************************************************/ +#ifdef _VC_NODEFAULTLIB +#define DllMain _DllMainCRTStartup +#endif +EXTERN_C BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved) +{ + g_hInstance = hinstDLL; + return TRUE; +} diff --git a/data/nsis/Contrib/Inetc/inetc.rc b/data/nsis/Contrib/Inetc/inetc.rc new file mode 100644 index 000000000..0384750c8 --- /dev/null +++ b/data/nsis/Contrib/Inetc/inetc.rc @@ -0,0 +1,199 @@ +// Microsoft Visual C++ generated resource script. +// +#include "resource.h" + +#define APSTUDIO_READONLY_SYMBOLS +///////////////////////////////////////////////////////////////////////////// +// +// Generated from the TEXTINCLUDE 2 resource. +// +#include "afxres.h" + +///////////////////////////////////////////////////////////////////////////// +#undef APSTUDIO_READONLY_SYMBOLS + +///////////////////////////////////////////////////////////////////////////// +// Russian (Russia) resources + +#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_RUS) +LANGUAGE LANG_RUSSIAN, SUBLANG_DEFAULT +#pragma code_page(1251) + +#ifdef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// TEXTINCLUDE +// + +1 TEXTINCLUDE +BEGIN + "resource.h\0" +END + +2 TEXTINCLUDE +BEGIN + "#include ""afxres.h""\r\n" + "\0" +END + +3 TEXTINCLUDE +BEGIN + "\r\n" + "\0" +END + +#endif // APSTUDIO_INVOKED + +#endif // Russian (Russia) resources +///////////////////////////////////////////////////////////////////////////// + + +///////////////////////////////////////////////////////////////////////////// +// English (United States) resources + +#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU) +LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US +#pragma code_page(1252) + +///////////////////////////////////////////////////////////////////////////// +// +// Dialog +// + +IDD_DIALOG1 DIALOGEX 0, 0, 286, 71 +STYLE DS_SETFONT | DS_MODALFRAME | DS_CENTER | WS_POPUP | WS_CAPTION | WS_SYSMENU +CAPTION "Inetc plug-in" +FONT 8, "MS Sans Serif", 0, 0, 0x1 +BEGIN + LTEXT "",IDC_STATIC1,50,4,230,12,SS_CENTERIMAGE,WS_EX_STATICEDGE + LTEXT "",IDC_STATIC2,50,18,230,12,SS_CENTERIMAGE,WS_EX_STATICEDGE + CTEXT "",IDC_STATIC3,50,32,102,12,SS_CENTERIMAGE,WS_EX_STATICEDGE + CTEXT "",IDC_STATIC4,220,32,60,12,SS_CENTERIMAGE,WS_EX_STATICEDGE + CONTROL "Progress1",IDC_PROGRESS1,"msctls_progress32",NOT WS_VISIBLE,5,62,275,7 + CTEXT "",IDC_STATIC5,50,46,102,12,SS_CENTERIMAGE,WS_EX_STATICEDGE + CTEXT "",IDC_STATIC6,220,46,60,12,SS_CENTERIMAGE,WS_EX_STATICEDGE + CONTROL "URL",IDC_STATIC20,"Static",SS_LEFTNOWORDWRAP | WS_GROUP,5,6,44,10 + CONTROL "File name",IDC_STATIC21,"Static",SS_LEFTNOWORDWRAP | WS_GROUP,5,20,44,10 + CONTROL "Transfered",IDC_STATIC22,"Static",SS_LEFTNOWORDWRAP | WS_GROUP,5,34,44,10 + CONTROL "File size",IDC_STATIC23,"Static",SS_LEFTNOWORDWRAP | WS_GROUP,5,48,44,10 + CONTROL "Remaining time",IDC_STATIC24,"Static",SS_LEFTNOWORDWRAP | WS_GROUP,164,34,55,10 + CONTROL "Total time",IDC_STATIC25,"Static",SS_LEFTNOWORDWRAP | WS_GROUP,164,48,55,10 +END + +IDD_DIALOG2 DIALOG 0, 0, 226, 62 +STYLE DS_SETFONT | DS_MODALFRAME | DS_CENTER | WS_POPUP | WS_CAPTION | WS_SYSMENU +CAPTION "Inetc plug-in" +FONT 8, "MS Sans Serif" +BEGIN + ICON 103,IDC_STATIC13,4,4,20,20 + LTEXT "Please wait",IDC_STATIC12,35,6,184,28 + CONTROL "Progress1",IDC_PROGRESS1,"msctls_progress32",NOT WS_VISIBLE,12,40,201,11 +END + +IDD_DIALOG3 DIALOG 0, 0, 266, 62 +STYLE DS_SETFONT | DS_CONTROL | WS_CHILD | WS_VISIBLE +FONT 8, "MS Sans Serif" +BEGIN + CONTROL "Progress1",IDC_PROGRESS1,"msctls_progress32",0x0,0,23,266,11 + CTEXT "",IDC_STATIC1,0,8,266,11 + PUSHBUTTON "Cancel",IDCANCEL,166,41,80,16 +END + + +///////////////////////////////////////////////////////////////////////////// +// +// DESIGNINFO +// + +#ifdef APSTUDIO_INVOKED +GUIDELINES DESIGNINFO +BEGIN + IDD_DIALOG1, DIALOG + BEGIN + LEFTMARGIN, 7 + RIGHTMARGIN, 279 + TOPMARGIN, 7 + BOTTOMMARGIN, 64 + END + + IDD_DIALOG2, DIALOG + BEGIN + LEFTMARGIN, 7 + RIGHTMARGIN, 219 + TOPMARGIN, 7 + BOTTOMMARGIN, 55 + END + + IDD_DIALOG3, DIALOG + BEGIN + LEFTMARGIN, 7 + RIGHTMARGIN, 259 + TOPMARGIN, 7 + BOTTOMMARGIN, 55 + END +END +#endif // APSTUDIO_INVOKED + +#endif // English (United States) resources +///////////////////////////////////////////////////////////////////////////// + + +///////////////////////////////////////////////////////////////////////////// +// English (United Kingdom) resources + +#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENG) +LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_UK +#pragma code_page(1252) + +///////////////////////////////////////////////////////////////////////////// +// +// Version +// + +VS_VERSION_INFO VERSIONINFO + FILEVERSION 1,0,5,2 + PRODUCTVERSION 1,0,5,2 + FILEFLAGSMASK 0x3fL +#ifdef _DEBUG + FILEFLAGS 0x1L +#else + FILEFLAGS 0x0L +#endif + FILEOS 0x40004L + FILETYPE 0x2L + FILESUBTYPE 0x0L +BEGIN + BLOCK "StringFileInfo" + BEGIN + BLOCK "040904b0" + BEGIN + VALUE "FileDescription", "inetc NSIS plug-in" + VALUE "FileVersion", "1.0.5.2" + VALUE "InternalName", "inetc.dll" + VALUE "LegalCopyright", "Copyright © Takhir Bedertdinov" + VALUE "OriginalFilename", "inetc.dll" + VALUE "ProductName", "inetc NSIS plug-in" + VALUE "ProductVersion", "1.0.5.2" + END + END + BLOCK "VarFileInfo" + BEGIN + VALUE "Translation", 0x409, 1200 + END +END + +#endif // English (United Kingdom) resources +///////////////////////////////////////////////////////////////////////////// + + + +#ifndef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// Generated from the TEXTINCLUDE 3 resource. +// + + +///////////////////////////////////////////////////////////////////////////// +#endif // not APSTUDIO_INVOKED + diff --git a/data/nsis/Contrib/Inetc/inetc.sln b/data/nsis/Contrib/Inetc/inetc.sln new file mode 100644 index 000000000..04b4db351 --- /dev/null +++ b/data/nsis/Contrib/Inetc/inetc.sln @@ -0,0 +1,42 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio 2012 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "inetc", "inetc.vcxproj", "{6B2D8C40-38A9-457A-9FA6-BED0108CAC37}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug Unicode|Win32 = Debug Unicode|Win32 + Debug Unicode|x64 = Debug Unicode|x64 + Debug|Win32 = Debug|Win32 + Debug|x64 = Debug|x64 + Release Unicode|Win32 = Release Unicode|Win32 + Release Unicode|x64 = Release Unicode|x64 + Release|Win32 = Release|Win32 + Release|x64 = Release|x64 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {6B2D8C40-38A9-457A-9FA6-BED0108CAC37}.Debug Unicode|Win32.ActiveCfg = Debug Unicode|Win32 + {6B2D8C40-38A9-457A-9FA6-BED0108CAC37}.Debug Unicode|Win32.Build.0 = Debug Unicode|Win32 + {6B2D8C40-38A9-457A-9FA6-BED0108CAC37}.Debug Unicode|Win32.Deploy.0 = Debug Unicode|Win32 + {6B2D8C40-38A9-457A-9FA6-BED0108CAC37}.Debug Unicode|x64.ActiveCfg = Debug Unicode|x64 + {6B2D8C40-38A9-457A-9FA6-BED0108CAC37}.Debug Unicode|x64.Build.0 = Debug Unicode|x64 + {6B2D8C40-38A9-457A-9FA6-BED0108CAC37}.Debug|Win32.ActiveCfg = Debug|Win32 + {6B2D8C40-38A9-457A-9FA6-BED0108CAC37}.Debug|Win32.Build.0 = Debug|Win32 + {6B2D8C40-38A9-457A-9FA6-BED0108CAC37}.Debug|Win32.Deploy.0 = Debug|Win32 + {6B2D8C40-38A9-457A-9FA6-BED0108CAC37}.Debug|x64.ActiveCfg = Debug|x64 + {6B2D8C40-38A9-457A-9FA6-BED0108CAC37}.Debug|x64.Build.0 = Debug|x64 + {6B2D8C40-38A9-457A-9FA6-BED0108CAC37}.Release Unicode|Win32.ActiveCfg = Release Unicode|Win32 + {6B2D8C40-38A9-457A-9FA6-BED0108CAC37}.Release Unicode|Win32.Build.0 = Release Unicode|Win32 + {6B2D8C40-38A9-457A-9FA6-BED0108CAC37}.Release Unicode|Win32.Deploy.0 = Release Unicode|Win32 + {6B2D8C40-38A9-457A-9FA6-BED0108CAC37}.Release Unicode|x64.ActiveCfg = Release Unicode|x64 + {6B2D8C40-38A9-457A-9FA6-BED0108CAC37}.Release Unicode|x64.Build.0 = Release Unicode|x64 + {6B2D8C40-38A9-457A-9FA6-BED0108CAC37}.Release|Win32.ActiveCfg = Release|Win32 + {6B2D8C40-38A9-457A-9FA6-BED0108CAC37}.Release|Win32.Build.0 = Release|Win32 + {6B2D8C40-38A9-457A-9FA6-BED0108CAC37}.Release|Win32.Deploy.0 = Release|Win32 + {6B2D8C40-38A9-457A-9FA6-BED0108CAC37}.Release|x64.ActiveCfg = Release|x64 + {6B2D8C40-38A9-457A-9FA6-BED0108CAC37}.Release|x64.Build.0 = Release|x64 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/data/nsis/Contrib/Inetc/inetc.vcxproj b/data/nsis/Contrib/Inetc/inetc.vcxproj new file mode 100644 index 000000000..9829ec0b4 --- /dev/null +++ b/data/nsis/Contrib/Inetc/inetc.vcxproj @@ -0,0 +1,441 @@ + + + + + Debug Unicode + Win32 + + + Debug Unicode + x64 + + + Debug + Win32 + + + Debug + x64 + + + Release Unicode + Win32 + + + Release Unicode + x64 + + + Release + Win32 + + + Release + x64 + + + + + + {6B2D8C40-38A9-457A-9FA6-BED0108CAC37} + + + + DynamicLibrary + v110 + Unicode + + + DynamicLibrary + v110 + Unicode + + + DynamicLibrary + v110 + MultiByte + + + DynamicLibrary + v110 + MultiByte + + + DynamicLibrary + v110 + Unicode + + + DynamicLibrary + v110 + Unicode + + + DynamicLibrary + v110 + MultiByte + + + DynamicLibrary + v110 + MultiByte + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + false + $(SolutionDir)..\..\Plugins\ + + + false + $(ProjectName)64 + $(SolutionDir)..\..\Plugins\ + + + $(SolutionDir)..\..\Unicode\Plugins\ + true + false + + + true + false + $(ProjectName)64 + + + $(SolutionDir)..\..\Plugins\ + false + + + false + $(ProjectName)64 + + + false + $(SolutionDir)..\..\Unicode\Plugins\ + + + false + $(ProjectName)64 + $(SolutionDir)..\..\Unicode\Plugins\ + + + + MultiThreaded + MinSpace + true + Level3 + WIN32;NDEBUG;_WINDOWS;_USRDLL;inetc_EXPORTS;_VC80_UPGRADE=0x0600;%(PreprocessorDefinitions) + false + + + true + NDEBUG;%(PreprocessorDefinitions) + .\debug\inetc.tlb + true + Win32 + + + 0x0409 + NDEBUG;%(PreprocessorDefinitions) + + + true + .\debug\inetc.bsc + + + true + true + wininet.lib;comctl32.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) + false + DllMain + libc.lib + true + + + + + MultiThreaded + MinSpace + true + Level3 + WIN32;NDEBUG;_WINDOWS;_USRDLL;inetc_EXPORTS;_VC80_UPGRADE=0x0600;%(PreprocessorDefinitions) + false + + + true + NDEBUG;%(PreprocessorDefinitions) + .\debug\inetc.tlb + true + + + 0x0409 + NDEBUG;%(PreprocessorDefinitions) + + + true + .\debug\inetc.bsc + + + true + true + true + wininet.lib;comctl32.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) + false + libc.lib + DllMain + + + + + MultiThreadedDebug + Disabled + true + Level3 + EditAndContinue + EnableFastChecks + WIN32;_DEBUG;_WINDOWS;_USRDLL;inetc_EXPORTS;_VC80_UPGRADE=0x0600;%(PreprocessorDefinitions) + false + + + true + _DEBUG;%(PreprocessorDefinitions) + .\Debug_Unicode\inetc.tlb + true + Win32 + + + 0x0409 + _DEBUG;%(PreprocessorDefinitions) + + + true + .\Debug_Unicode\inetc.bsc + + + true + true + .\Debug_Unicode\inetc.lib + wininet.lib;comctl32.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) + false + + + + + MultiThreadedDebug + Disabled + true + Level3 + ProgramDatabase + EnableFastChecks + WIN32;_DEBUG;_WINDOWS;_USRDLL;inetc_EXPORTS;_VC80_UPGRADE=0x0600;%(PreprocessorDefinitions) + false + + + true + _DEBUG;%(PreprocessorDefinitions) + .\Debug_Unicode\inetc.tlb + true + + + 0x0409 + _DEBUG;%(PreprocessorDefinitions) + + + true + .\Debug_Unicode\inetc.bsc + + + true + true + .\Debug_Unicode\inetc.lib + wininet.lib;comctl32.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) + false + + + + + MultiThreadedDebug + Disabled + true + Level3 + EditAndContinue + WIN32;_DEBUG;_WINDOWS;_USRDLL;inetc_EXPORTS;_VC80_UPGRADE=0x0600;%(PreprocessorDefinitions) + EnableFastChecks + + + true + _DEBUG;%(PreprocessorDefinitions) + .\Debug\inetc.tlb + true + Win32 + + + 0x0409 + _DEBUG;%(PreprocessorDefinitions) + + + true + .\Debug\inetc.bsc + + + true + true + true + wininet.lib;comctl32.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) + false + + + + + MultiThreadedDebug + Disabled + true + Level3 + ProgramDatabase + WIN32;_DEBUG;_WINDOWS;_USRDLL;inetc_EXPORTS;_VC80_UPGRADE=0x0600;%(PreprocessorDefinitions) + EnableFastChecks + + + true + _DEBUG;%(PreprocessorDefinitions) + .\Debug\inetc.tlb + true + + + 0x0409 + _DEBUG;%(PreprocessorDefinitions) + + + true + .\Debug\inetc.bsc + + + true + true + true + wininet.lib;comctl32.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) + false + + + + + MultiThreaded + MinSpace + true + Level3 + WIN32;NDEBUG;_WINDOWS;UNICODE;_USRDLL;inetc_EXPORTS;_VC80_UPGRADE=0x0600;%(PreprocessorDefinitions) + false + + + true + NDEBUG;%(PreprocessorDefinitions) + .\Debug_Unicode\inetc.tlb + true + Win32 + + + 0x0409 + NDEBUG;%(PreprocessorDefinitions) + + + true + .\Debug_Unicode\inetc.bsc + + + true + true + wininet.lib;comctl32.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) + true + false + DllMain + libc.lib + + + + + MultiThreaded + MinSpace + true + Level3 + WIN32;NDEBUG;_WINDOWS;UNICODE;_USRDLL;inetc_EXPORTS;_VC80_UPGRADE=0x0600;%(PreprocessorDefinitions) + false + + + true + NDEBUG;%(PreprocessorDefinitions) + .\Debug_Unicode\inetc.tlb + true + + + 0x0409 + NDEBUG;%(PreprocessorDefinitions) + + + true + .\Debug_Unicode\inetc.bsc + + + true + true + wininet.lib;comctl32.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) + true + false + libc.lib + DllMain + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/data/nsis/Contrib/Inetc/inetc.vcxproj.filters b/data/nsis/Contrib/Inetc/inetc.vcxproj.filters new file mode 100644 index 000000000..2020d8947 --- /dev/null +++ b/data/nsis/Contrib/Inetc/inetc.vcxproj.filters @@ -0,0 +1,52 @@ + + + + + {7803dcf0-655c-4f71-89dd-7fd695066a28} + cpp;c;cxx;rc;def;r;odl;idl;hpj;bat + + + {8edac42d-b9b9-469f-9864-3dbc65bf4365} + ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe + + + {67a938b1-f16b-478b-81df-d0fd26de6d8a} + h;hpp;hxx;hm;inl + + + + + Source Files + + + Source Files + + + Source Files + + + + + Resource Files + + + + + Resource Files + + + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + \ No newline at end of file diff --git a/data/nsis/Contrib/Inetc/nsis_tchar.h b/data/nsis/Contrib/Inetc/nsis_tchar.h new file mode 100644 index 000000000..210bab16d --- /dev/null +++ b/data/nsis/Contrib/Inetc/nsis_tchar.h @@ -0,0 +1,229 @@ +/* + * nsis_tchar.h + * + * This file is a part of NSIS. + * + * Copyright (C) 1999-2013 Nullsoft and Contributors + * + * This software is provided 'as-is', without any express or implied + * warranty. + * + * For Unicode support by Jim Park -- 08/30/2007 + */ + +// Jim Park: Only those we use are listed here. + +#pragma once + +#ifdef _UNICODE + +#ifndef _T +#define __T(x) L ## x +#define _T(x) __T(x) +#define _TEXT(x) __T(x) +#endif + +#ifndef _TCHAR_DEFINED +#define _TCHAR_DEFINED +#if !defined(_NATIVE_WCHAR_T_DEFINED) && !defined(_WCHAR_T_DEFINED) +typedef unsigned short TCHAR; +#else +typedef wchar_t TCHAR; +#endif +#endif + + +// program +#define _tenviron _wenviron +#define __targv __wargv + +// printfs +#define _ftprintf fwprintf +#define _sntprintf _snwprintf +#if (defined(_MSC_VER) && (_MSC_VER<=1310)) || defined(__MINGW32__) +# define _stprintf swprintf +#else +# define _stprintf _swprintf +#endif +#define _tprintf wprintf +#define _vftprintf vfwprintf +#define _vsntprintf _vsnwprintf +#if defined(_MSC_VER) && (_MSC_VER<=1310) +# define _vstprintf vswprintf +#else +# define _vstprintf _vswprintf +#endif + +// scanfs +#define _tscanf wscanf +#define _stscanf swscanf + +// string manipulations +#define _tcscat wcscat +#define _tcschr wcschr +#define _tcsclen wcslen +#define _tcscpy wcscpy +#define _tcsdup _wcsdup +#define _tcslen wcslen +#define _tcsnccpy wcsncpy +#define _tcsncpy wcsncpy +#define _tcsrchr wcsrchr +#define _tcsstr wcsstr +#define _tcstok wcstok + +// string comparisons +#define _tcscmp wcscmp +#define _tcsicmp _wcsicmp +#define _tcsncicmp _wcsnicmp +#define _tcsncmp wcsncmp +#define _tcsnicmp _wcsnicmp + +// upper / lower +#define _tcslwr _wcslwr +#define _tcsupr _wcsupr +#define _totlower towlower +#define _totupper towupper + +// conversions to numbers +#define _tcstoi64 _wcstoi64 +#define _tcstol wcstol +#define _tcstoul wcstoul +#define _tstof _wtof +#define _tstoi _wtoi +#define _tstoi64 _wtoi64 +#define _ttoi _wtoi +#define _ttoi64 _wtoi64 +#define _ttol _wtol + +// conversion from numbers to strings +#define _itot _itow +#define _ltot _ltow +#define _i64tot _i64tow +#define _ui64tot _ui64tow + +// file manipulations +#define _tfopen _wfopen +#define _topen _wopen +#define _tremove _wremove +#define _tunlink _wunlink + +// reading and writing to i/o +#define _fgettc fgetwc +#define _fgetts fgetws +#define _fputts fputws +#define _gettchar getwchar + +// directory +#define _tchdir _wchdir + +// environment +#define _tgetenv _wgetenv +#define _tsystem _wsystem + +// time +#define _tcsftime wcsftime + +#else // ANSI + +#ifndef _T +#define _T(x) x +#define _TEXT(x) x +#endif + +#ifndef _TCHAR_DEFINED +#define _TCHAR_DEFINED +typedef char TCHAR; +#endif + +// program +#define _tenviron environ +#define __targv __argv + +// printfs +#define _ftprintf fprintf +#define _sntprintf _snprintf +#define _stprintf sprintf +#define _tprintf printf +#define _vftprintf vfprintf +#define _vsntprintf _vsnprintf +#define _vstprintf vsprintf + +// scanfs +#define _tscanf scanf +#define _stscanf sscanf + +// string manipulations +#define _tcscat strcat +#define _tcschr strchr +#define _tcsclen strlen +#define _tcscnlen strnlen +#define _tcscpy strcpy +#define _tcsdup _strdup +#define _tcslen strlen +#define _tcsnccpy strncpy +#define _tcsrchr strrchr +#define _tcsstr strstr +#define _tcstok strtok + +// string comparisons +#define _tcscmp strcmp +#define _tcsicmp _stricmp +#define _tcsncmp strncmp +#define _tcsncicmp _strnicmp +#define _tcsnicmp _strnicmp + +// upper / lower +#define _tcslwr _strlwr +#define _tcsupr _strupr + +#define _totupper toupper +#define _totlower tolower + +// conversions to numbers +#define _tcstol strtol +#define _tcstoul strtoul +#define _tstof atof +#define _tstoi atoi +#define _tstoi64 _atoi64 +#define _tstoi64 _atoi64 +#define _ttoi atoi +#define _ttoi64 _atoi64 +#define _ttol atol + +// conversion from numbers to strings +#define _i64tot _i64toa +#define _itot _itoa +#define _ltot _ltoa +#define _ui64tot _ui64toa + +// file manipulations +#define _tfopen fopen +#define _topen _open +#define _tremove remove +#define _tunlink _unlink + +// reading and writing to i/o +#define _fgettc fgetc +#define _fgetts fgets +#define _fputts fputs +#define _gettchar getchar + +// directory +#define _tchdir _chdir + +// environment +#define _tgetenv getenv +#define _tsystem system + +// time +#define _tcsftime strftime + +#endif + +// is functions (the same in Unicode / ANSI) +#define _istgraph isgraph +#define _istascii __isascii + +#define __TFILE__ _T(__FILE__) +#define __TDATE__ _T(__DATE__) +#define __TTIME__ _T(__TIME__) diff --git a/data/nsis/Contrib/Inetc/pluginapi.c b/data/nsis/Contrib/Inetc/pluginapi.c new file mode 100644 index 000000000..c507e31a2 --- /dev/null +++ b/data/nsis/Contrib/Inetc/pluginapi.c @@ -0,0 +1,294 @@ +#include + +#include "pluginapi.h" + +#ifdef _countof +#define COUNTOF _countof +#else +#define COUNTOF(a) (sizeof(a)/sizeof(a[0])) +#endif + +unsigned int g_stringsize; +stack_t **g_stacktop; +TCHAR *g_variables; + +// utility functions (not required but often useful) + +int NSISCALL popstring(TCHAR *str) +{ + stack_t *th; + if (!g_stacktop || !*g_stacktop) return 1; + th=(*g_stacktop); + if (str) lstrcpy(str,th->text); + *g_stacktop = th->next; + GlobalFree((HGLOBAL)th); + return 0; +} + +int NSISCALL popstringn(TCHAR *str, int maxlen) +{ + stack_t *th; + if (!g_stacktop || !*g_stacktop) return 1; + th=(*g_stacktop); + if (str) lstrcpyn(str,th->text,maxlen?maxlen:g_stringsize); + *g_stacktop = th->next; + GlobalFree((HGLOBAL)th); + return 0; +} + +void NSISCALL pushstring(const TCHAR *str) +{ + stack_t *th; + if (!g_stacktop) return; + th=(stack_t*)GlobalAlloc(GPTR,(sizeof(stack_t)+(g_stringsize)*sizeof(TCHAR))); + lstrcpyn(th->text,str,g_stringsize); + th->next=*g_stacktop; + *g_stacktop=th; +} + +TCHAR* NSISCALL getuservariable(const int varnum) +{ + if (varnum < 0 || varnum >= __INST_LAST) return NULL; + return g_variables+varnum*g_stringsize; +} + +void NSISCALL setuservariable(const int varnum, const TCHAR *var) +{ + if (var != NULL && varnum >= 0 && varnum < __INST_LAST) + lstrcpy(g_variables + varnum*g_stringsize, var); +} + +#ifdef _UNICODE +int NSISCALL PopStringA(char* ansiStr) +{ + wchar_t* wideStr = (wchar_t*) GlobalAlloc(GPTR, g_stringsize*sizeof(wchar_t)); + int rval = popstring(wideStr); + WideCharToMultiByte(CP_ACP, 0, wideStr, -1, ansiStr, g_stringsize, NULL, NULL); + GlobalFree((HGLOBAL)wideStr); + return rval; +} + +int NSISCALL PopStringNA(char* ansiStr, int maxlen) +{ + int realLen = maxlen ? maxlen : g_stringsize; + wchar_t* wideStr = (wchar_t*) GlobalAlloc(GPTR, realLen*sizeof(wchar_t)); + int rval = popstringn(wideStr, realLen); + WideCharToMultiByte(CP_ACP, 0, wideStr, -1, ansiStr, realLen, NULL, NULL); + GlobalFree((HGLOBAL)wideStr); + return rval; +} + +void NSISCALL PushStringA(const char* ansiStr) +{ + wchar_t* wideStr = (wchar_t*) GlobalAlloc(GPTR, g_stringsize*sizeof(wchar_t)); + MultiByteToWideChar(CP_ACP, 0, ansiStr, -1, wideStr, g_stringsize); + pushstring(wideStr); + GlobalFree((HGLOBAL)wideStr); + return; +} + +void NSISCALL GetUserVariableW(const int varnum, wchar_t* wideStr) +{ + lstrcpyW(wideStr, getuservariable(varnum)); +} + +void NSISCALL GetUserVariableA(const int varnum, char* ansiStr) +{ + wchar_t* wideStr = getuservariable(varnum); + WideCharToMultiByte(CP_ACP, 0, wideStr, -1, ansiStr, g_stringsize, NULL, NULL); +} + +void NSISCALL SetUserVariableA(const int varnum, const char* ansiStr) +{ + if (ansiStr != NULL && varnum >= 0 && varnum < __INST_LAST) + { + wchar_t* wideStr = g_variables + varnum * g_stringsize; + MultiByteToWideChar(CP_ACP, 0, ansiStr, -1, wideStr, g_stringsize); + } +} + +#else +// ANSI defs +int NSISCALL PopStringW(wchar_t* wideStr) +{ + char* ansiStr = (char*) GlobalAlloc(GPTR, g_stringsize); + int rval = popstring(ansiStr); + MultiByteToWideChar(CP_ACP, 0, ansiStr, -1, wideStr, g_stringsize); + GlobalFree((HGLOBAL)ansiStr); + return rval; +} + +int NSISCALL PopStringNW(wchar_t* wideStr, int maxlen) +{ + int realLen = maxlen ? maxlen : g_stringsize; + char* ansiStr = (char*) GlobalAlloc(GPTR, realLen); + int rval = popstringn(ansiStr, realLen); + MultiByteToWideChar(CP_ACP, 0, ansiStr, -1, wideStr, realLen); + GlobalFree((HGLOBAL)ansiStr); + return rval; +} + +void NSISCALL PushStringW(wchar_t* wideStr) +{ + char* ansiStr = (char*) GlobalAlloc(GPTR, g_stringsize); + WideCharToMultiByte(CP_ACP, 0, wideStr, -1, ansiStr, g_stringsize, NULL, NULL); + pushstring(ansiStr); + GlobalFree((HGLOBAL)ansiStr); +} + +void NSISCALL GetUserVariableW(const int varnum, wchar_t* wideStr) +{ + char* ansiStr = getuservariable(varnum); + MultiByteToWideChar(CP_ACP, 0, ansiStr, -1, wideStr, g_stringsize); +} + +void NSISCALL GetUserVariableA(const int varnum, char* ansiStr) +{ + lstrcpyA(ansiStr, getuservariable(varnum)); +} + +void NSISCALL SetUserVariableW(const int varnum, const wchar_t* wideStr) +{ + if (wideStr != NULL && varnum >= 0 && varnum < __INST_LAST) + { + char* ansiStr = g_variables + varnum * g_stringsize; + WideCharToMultiByte(CP_ACP, 0, wideStr, -1, ansiStr, g_stringsize, NULL, NULL); + } +} +#endif + +// playing with integers + +INT_PTR NSISCALL nsishelper_str_to_ptr(const TCHAR *s) +{ + INT_PTR v=0; + if (*s == _T('0') && (s[1] == _T('x') || s[1] == _T('X'))) + { + s++; + for (;;) + { + int c=*(++s); + if (c >= _T('0') && c <= _T('9')) c-=_T('0'); + else if (c >= _T('a') && c <= _T('f')) c-=_T('a')-10; + else if (c >= _T('A') && c <= _T('F')) c-=_T('A')-10; + else break; + v<<=4; + v+=c; + } + } + else if (*s == _T('0') && s[1] <= _T('7') && s[1] >= _T('0')) + { + for (;;) + { + int c=*(++s); + if (c >= _T('0') && c <= _T('7')) c-=_T('0'); + else break; + v<<=3; + v+=c; + } + } + else + { + int sign=0; + if (*s == _T('-')) sign++; else s--; + for (;;) + { + int c=*(++s) - _T('0'); + if (c < 0 || c > 9) break; + v*=10; + v+=c; + } + if (sign) v = -v; + } + + return v; +} + +unsigned int NSISCALL myatou(const TCHAR *s) +{ + unsigned int v=0; + + for (;;) + { + unsigned int c=*s++; + if (c >= _T('0') && c <= _T('9')) c-=_T('0'); + else break; + v*=10; + v+=c; + } + return v; +} + +int NSISCALL myatoi_or(const TCHAR *s) +{ + int v=0; + if (*s == _T('0') && (s[1] == _T('x') || s[1] == _T('X'))) + { + s++; + for (;;) + { + int c=*(++s); + if (c >= _T('0') && c <= _T('9')) c-=_T('0'); + else if (c >= _T('a') && c <= _T('f')) c-=_T('a')-10; + else if (c >= _T('A') && c <= _T('F')) c-=_T('A')-10; + else break; + v<<=4; + v+=c; + } + } + else if (*s == _T('0') && s[1] <= _T('7') && s[1] >= _T('0')) + { + for (;;) + { + int c=*(++s); + if (c >= _T('0') && c <= _T('7')) c-=_T('0'); + else break; + v<<=3; + v+=c; + } + } + else + { + int sign=0; + if (*s == _T('-')) sign++; else s--; + for (;;) + { + int c=*(++s) - _T('0'); + if (c < 0 || c > 9) break; + v*=10; + v+=c; + } + if (sign) v = -v; + } + + // Support for simple ORed expressions + if (*s == _T('|')) + { + v |= myatoi_or(s+1); + } + + return v; +} + +INT_PTR NSISCALL popintptr() +{ + TCHAR buf[128]; + if (popstringn(buf,COUNTOF(buf))) + return 0; + return nsishelper_str_to_ptr(buf); +} + +int NSISCALL popint_or() +{ + TCHAR buf[128]; + if (popstringn(buf,COUNTOF(buf))) + return 0; + return myatoi_or(buf); +} + +void NSISCALL pushintptr(INT_PTR value) +{ + TCHAR buffer[30]; + wsprintf(buffer, sizeof(void*) > 4 ? _T("%Id") : _T("%d"), value); + pushstring(buffer); +} diff --git a/data/nsis/Contrib/Inetc/pluginapi.h b/data/nsis/Contrib/Inetc/pluginapi.h new file mode 100644 index 000000000..ca671a8ed --- /dev/null +++ b/data/nsis/Contrib/Inetc/pluginapi.h @@ -0,0 +1,104 @@ +#ifndef ___NSIS_PLUGIN__H___ +#define ___NSIS_PLUGIN__H___ + +#ifdef __cplusplus +extern "C" { +#endif + +#include "api.h" +#include "nsis_tchar.h" + +#ifndef NSISCALL +# define NSISCALL __stdcall +#endif + +#define EXDLL_INIT() { \ + g_stringsize=string_size; \ + g_stacktop=stacktop; \ + g_variables=variables; } + +typedef struct _stack_t { + struct _stack_t *next; + TCHAR text[1]; // this should be the length of string_size +} stack_t; + +enum +{ +INST_0, // $0 +INST_1, // $1 +INST_2, // $2 +INST_3, // $3 +INST_4, // $4 +INST_5, // $5 +INST_6, // $6 +INST_7, // $7 +INST_8, // $8 +INST_9, // $9 +INST_R0, // $R0 +INST_R1, // $R1 +INST_R2, // $R2 +INST_R3, // $R3 +INST_R4, // $R4 +INST_R5, // $R5 +INST_R6, // $R6 +INST_R7, // $R7 +INST_R8, // $R8 +INST_R9, // $R9 +INST_CMDLINE, // $CMDLINE +INST_INSTDIR, // $INSTDIR +INST_OUTDIR, // $OUTDIR +INST_EXEDIR, // $EXEDIR +INST_LANG, // $LANGUAGE +__INST_LAST +}; + +extern unsigned int g_stringsize; +extern stack_t **g_stacktop; +extern TCHAR *g_variables; + +void NSISCALL pushstring(const TCHAR *str); +void NSISCALL pushintptr(INT_PTR value); +#define pushint(v) pushintptr((INT_PTR)(v)) +int NSISCALL popstring(TCHAR *str); // 0 on success, 1 on empty stack +int NSISCALL popstringn(TCHAR *str, int maxlen); // with length limit, pass 0 for g_stringsize +INT_PTR NSISCALL popintptr(); +#define popint() ( (int) popintptr() ) +int NSISCALL popint_or(); // with support for or'ing (2|4|8) +INT_PTR NSISCALL nsishelper_str_to_ptr(const TCHAR *s); +#define myatoi(s) ( (int) nsishelper_str_to_ptr(s) ) // converts a string to an integer +unsigned int NSISCALL myatou(const TCHAR *s); // converts a string to an unsigned integer, decimal only +int NSISCALL myatoi_or(const TCHAR *s); // with support for or'ing (2|4|8) +TCHAR* NSISCALL getuservariable(const int varnum); +void NSISCALL setuservariable(const int varnum, const TCHAR *var); + +#ifdef _UNICODE +#define PopStringW(x) popstring(x) +#define PushStringW(x) pushstring(x) +#define SetUserVariableW(x,y) setuservariable(x,y) + +int NSISCALL PopStringA(char* ansiStr); +void NSISCALL PushStringA(const char* ansiStr); +void NSISCALL GetUserVariableW(const int varnum, wchar_t* wideStr); +void NSISCALL GetUserVariableA(const int varnum, char* ansiStr); +void NSISCALL SetUserVariableA(const int varnum, const char* ansiStr); + +#else +// ANSI defs + +#define PopStringA(x) popstring(x) +#define PushStringA(x) pushstring(x) +#define SetUserVariableA(x,y) setuservariable(x,y) + +int NSISCALL PopStringW(wchar_t* wideStr); +void NSISCALL PushStringW(wchar_t* wideStr); +void NSISCALL GetUserVariableW(const int varnum, wchar_t* wideStr); +void NSISCALL GetUserVariableA(const int varnum, char* ansiStr); +void NSISCALL SetUserVariableW(const int varnum, const wchar_t* wideStr); + +#endif + +#ifdef __cplusplus +} +#endif + +#endif//!___NSIS_PLUGIN__H___ diff --git a/data/nsis/Contrib/Inetc/resource.h b/data/nsis/Contrib/Inetc/resource.h new file mode 100644 index 000000000..17d43c349 --- /dev/null +++ b/data/nsis/Contrib/Inetc/resource.h @@ -0,0 +1,47 @@ +//{{NO_DEPENDENCIES}} +// Microsoft Developer Studio generated include file. +// Used by inetc.rc +// +#define IDC_SLOGIN 8 +#define IDC_PROGRESS 10 +#define IDC_SUBTEXT 11 +#define IDC_SPWD 11 +#define IDC_ICON1 12 +#define IDD_DIALOG1 101 +#define IDI_ICON1 102 +#define IDI_ICON2 103 +#define IDD_AUTH 104 +#define IDI_ICON3 105 +#define IDI_ICON4 106 +#define IDI_ICON5 107 +#define IDD_DIALOG2 108 +#define IDI_ICON6 109 +#define IDD_DIALOG3 110 +#define IDC_STATIC1 1001 +#define IDC_STATIC2 1002 +#define IDC_STATIC3 1003 +#define IDC_STATIC4 1004 +#define IDC_PROGRESS1 1005 +#define IDC_STATIC5 1006 +#define IDC_STATIC6 1007 +#define IDC_STATIC12 1008 +#define IDC_STATIC13 1009 +#define IDC_STATIC20 1009 +#define IDC_STATIC21 1010 +#define IDC_STATIC22 1011 +#define IDC_STATIC23 1012 +#define IDC_STATIC24 1013 +#define IDC_STATIC25 1014 +#define IDC_ELOGIN 1015 +#define IDC_EPWD 1016 + +// Next default values for new objects +// +#ifdef APSTUDIO_INVOKED +#ifndef APSTUDIO_READONLY_SYMBOLS +#define _APS_NEXT_RESOURCE_VALUE 111 +#define _APS_NEXT_COMMAND_VALUE 40001 +#define _APS_NEXT_CONTROL_VALUE 1018 +#define _APS_NEXT_SYMED_VALUE 101 +#endif +#endif diff --git a/data/nsis/Contrib/md5dll/MD5.cpp b/data/nsis/Contrib/md5dll/MD5.cpp new file mode 100644 index 000000000..588ae6c21 --- /dev/null +++ b/data/nsis/Contrib/md5dll/MD5.cpp @@ -0,0 +1,367 @@ +///////////////////////////////////////////////////////////////////////// +// MD5.cpp +// Implementation file for MD5 class +// +// This C++ Class implementation of the original RSA Data Security, Inc. +// MD5 Message-Digest Algorithm is copyright (c) 2002, Gary McNickle. +// All rights reserved. This software is a derivative of the "RSA Data +// Security, Inc. MD5 Message-Digest Algorithm" +// +// You may use this software free of any charge, but without any +// warranty or implied warranty, provided that you follow the terms +// of the original RSA copyright, listed below. +// +// Original RSA Data Security, Inc. Copyright notice +///////////////////////////////////////////////////////////////////////// +// +// Copyright (C) 1991-2, RSA Data Security, Inc. Created 1991. All +// rights reserved. +// +// License to copy and use this software is granted provided that it +// is identified as the "RSA Data Security, Inc. MD5 Message-Digest +// Algorithm" in all material mentioning or referencing this software +// or this function. +// License is also granted to make and use derivative works provided +// that such works are identified as "derived from the RSA Data +// Security, Inc. MD5 Message-Digest Algorithm" in all material +// mentioning or referencing the derived work. +// RSA Data Security, Inc. makes no representations concerning either +// the merchantability of this software or the suitability of this +// software for any particular purpose. It is provided "as is" +// without express or implied warranty of any kind. +// These notices must be retained in any copies of any part of this +// documentation and/or software. +///////////////////////////////////////////////////////////////////////// + +#if 0 +#include +#include +#include +#include +#else +#define WIN32_LEAN_AND_MEAN +#include +#endif +#include "md5.h" + + +static unsigned char PADDING[64] = +{ + 0x80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 +}; + +#define S11 7 +#define S12 12 +#define S13 17 +#define S14 22 +#define S21 5 +#define S22 9 +#define S23 14 +#define S24 20 +#define S31 4 +#define S32 11 +#define S33 16 +#define S34 23 +#define S41 6 +#define S42 10 +#define S43 15 +#define S44 21 + + +// local version of memcpy +static void *lmemcpy(void *dest, const void *source, uint4 count) +{ + register char *dst=(char *)dest; + register char *src=(char *)source; + while (count--) + { + *dst = *src; + dst++; + src++; + } + return dest; +} + + +// PrintMD5: Converts a completed md5 digest into a char* string. +char* PrintMD5(uchar md5Digest[16]) +{ + char chBuffer[256]; + char chEach[10]; + int nCount; + + register int i; + //memset(chBuffer,0,256); + for (i = 0; i < 64; i++) ((uint4 *)chBuffer)[i] = 0UL; + //memset(chEach, 0, 10); + for (i = 0; i < 10; i++) chEach[i] = 0; + + for (nCount = 0; nCount < 16; nCount++) + { + wsprintf(chEach, "%02x", md5Digest[nCount]); + lstrcat(chBuffer, chEach /*, sizeof(chEach)*/); + } + + char *Tmp = new char[256]; + lstrcpyn(Tmp,chBuffer,256); Tmp[255]='0'; + return Tmp; + //return strdup(chBuffer); +} + +#if defined(ENABLE_GETMD5STRING) || defined (ENABLE_GETMD5RANDOM) +// MD5String: Performs the MD5 algorithm on a char* string, returning +// the results as a char*. +char* MD5String(char* szString) +{ + int nLen = lstrlen(szString); + md5 alg; + + alg.Update((unsigned char*)szString, (unsigned int)nLen); + alg.Finalize(); + + return PrintMD5(alg.Digest()); + +} +#endif + +#if defined(ENABLE_GETMD5FILE) +// MD5File: Performs the MD5 algorithm on a file (binar or text), +// returning the results as a char*. Returns NULL if it fails. +char* MD5File(char* szFilename) +{ + HANDLE file; + md5 alg; + unsigned long nLen; + unsigned char chBuffer[1024]; + +// try + { + //memset(chBuffer, 0, 1024); + for (register int i = 0; i < 256; i++) ((uint4 *)chBuffer)[i] = 0UL; + + if ((file = CreateFile(szFilename, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0)) != INVALID_HANDLE_VALUE ) + { + while ((ReadFile(file, chBuffer, 1024, &nLen, NULL) != FALSE) && nLen) + alg.Update(chBuffer, nLen); + + alg.Finalize(); + + CloseHandle(file); + + return PrintMD5(alg.Digest()); + } + } +// catch(...) + { + + } + + return NULL; // failed +} +#endif + + +// md5::Init +// Initializes a new context. +void md5::Init() +{ + //memset(m_Count, 0, 2 * sizeof(uint4)); + m_Count[0] = m_Count[1] = 0; + + m_State[0] = 0x67452301; + m_State[1] = 0xefcdab89; + m_State[2] = 0x98badcfe; + m_State[3] = 0x10325476; +} + +// md5::Update +// MD5 block update operation. Continues an MD5 message-digest +// operation, processing another message block, and updating the +// context. +void md5::Update(uchar* chInput, uint4 nInputLen) +{ + uint4 i, index, partLen; + + // Compute number of bytes mod 64 + index = (unsigned int)((m_Count[0] >> 3) & 0x3F); + + // Update number of bits + if ((m_Count[0] += (nInputLen << 3)) < (nInputLen << 3)) + m_Count[1]++; + + m_Count[1] += (nInputLen >> 29); + + partLen = 64 - index; + + // Transform as many times as possible. + if (nInputLen >= partLen) + { + lmemcpy( &m_Buffer[index], chInput, partLen ); + Transform(m_Buffer); + + for (i = partLen; i + 63 < nInputLen; i += 64) + Transform(&chInput[i]); + + index = 0; + } + else + i = 0; + + // Buffer remaining input + lmemcpy( &m_Buffer[index], &chInput[i], nInputLen-i ); +} + +// md5::Finalize +// MD5 finalization. Ends an MD5 message-digest operation, writing +// the message digest and zeroizing the context. +void md5::Finalize() +{ + uchar bits[8]; + uint4 index, padLen; + + // Save number of bits + Encode (bits, m_Count, 8); + + // Pad out to 56 mod 64 + index = (unsigned int)((m_Count[0] >> 3) & 0x3f); + padLen = (index < 56) ? (56 - index) : (120 - index); + Update(PADDING, padLen); + + // Append length (before padding) + Update (bits, 8); + + // Store state in digest + Encode (m_Digest, m_State, 16); + + //memset(m_Count, 0, 2 * sizeof(uint4)); + m_Count[0] = m_Count[1] = 0; + //memset(m_State, 0, 4 * sizeof(uint4)); + m_State[0] = m_State[1] = m_State[2] = m_State[3] = 0; + //memset(m_Buffer,0, 64 * sizeof(uchar)); + for (register int i = 0; i < 16; i++) ((uint4 *)m_Buffer)[i] = 0UL; +} + +// md5::Transform +// MD5 basic transformation. Transforms state based on block. +void md5::Transform (uchar* block) +{ + uint4 a = m_State[0], b = m_State[1], c = m_State[2], d = m_State[3], x[16]; + + Decode (x, block, 64); + + // Round 1 + FF (a, b, c, d, x[ 0], S11, 0xd76aa478); + FF (d, a, b, c, x[ 1], S12, 0xe8c7b756); + FF (c, d, a, b, x[ 2], S13, 0x242070db); + FF (b, c, d, a, x[ 3], S14, 0xc1bdceee); + FF (a, b, c, d, x[ 4], S11, 0xf57c0faf); + FF (d, a, b, c, x[ 5], S12, 0x4787c62a); + FF (c, d, a, b, x[ 6], S13, 0xa8304613); + FF (b, c, d, a, x[ 7], S14, 0xfd469501); + FF (a, b, c, d, x[ 8], S11, 0x698098d8); + FF (d, a, b, c, x[ 9], S12, 0x8b44f7af); + FF (c, d, a, b, x[10], S13, 0xffff5bb1); + FF (b, c, d, a, x[11], S14, 0x895cd7be); + FF (a, b, c, d, x[12], S11, 0x6b901122); + FF (d, a, b, c, x[13], S12, 0xfd987193); + FF (c, d, a, b, x[14], S13, 0xa679438e); + FF (b, c, d, a, x[15], S14, 0x49b40821); + + // Round 2 + GG (a, b, c, d, x[ 1], S21, 0xf61e2562); + GG (d, a, b, c, x[ 6], S22, 0xc040b340); + GG (c, d, a, b, x[11], S23, 0x265e5a51); + GG (b, c, d, a, x[ 0], S24, 0xe9b6c7aa); + GG (a, b, c, d, x[ 5], S21, 0xd62f105d); + GG (d, a, b, c, x[10], S22, 0x2441453); + GG (c, d, a, b, x[15], S23, 0xd8a1e681); + GG (b, c, d, a, x[ 4], S24, 0xe7d3fbc8); + GG (a, b, c, d, x[ 9], S21, 0x21e1cde6); + GG (d, a, b, c, x[14], S22, 0xc33707d6); + GG (c, d, a, b, x[ 3], S23, 0xf4d50d87); + GG (b, c, d, a, x[ 8], S24, 0x455a14ed); + GG (a, b, c, d, x[13], S21, 0xa9e3e905); + GG (d, a, b, c, x[ 2], S22, 0xfcefa3f8); + GG (c, d, a, b, x[ 7], S23, 0x676f02d9); + GG (b, c, d, a, x[12], S24, 0x8d2a4c8a); + + // Round 3 + HH (a, b, c, d, x[ 5], S31, 0xfffa3942); + HH (d, a, b, c, x[ 8], S32, 0x8771f681); + HH (c, d, a, b, x[11], S33, 0x6d9d6122); + HH (b, c, d, a, x[14], S34, 0xfde5380c); + HH (a, b, c, d, x[ 1], S31, 0xa4beea44); + HH (d, a, b, c, x[ 4], S32, 0x4bdecfa9); + HH (c, d, a, b, x[ 7], S33, 0xf6bb4b60); + HH (b, c, d, a, x[10], S34, 0xbebfbc70); + HH (a, b, c, d, x[13], S31, 0x289b7ec6); + HH (d, a, b, c, x[ 0], S32, 0xeaa127fa); + HH (c, d, a, b, x[ 3], S33, 0xd4ef3085); + HH (b, c, d, a, x[ 6], S34, 0x4881d05); + HH (a, b, c, d, x[ 9], S31, 0xd9d4d039); + HH (d, a, b, c, x[12], S32, 0xe6db99e5); + HH (c, d, a, b, x[15], S33, 0x1fa27cf8); + HH (b, c, d, a, x[ 2], S34, 0xc4ac5665); + + // Round 4 + II (a, b, c, d, x[ 0], S41, 0xf4292244); + II (d, a, b, c, x[ 7], S42, 0x432aff97); + II (c, d, a, b, x[14], S43, 0xab9423a7); + II (b, c, d, a, x[ 5], S44, 0xfc93a039); + II (a, b, c, d, x[12], S41, 0x655b59c3); + II (d, a, b, c, x[ 3], S42, 0x8f0ccc92); + II (c, d, a, b, x[10], S43, 0xffeff47d); + II (b, c, d, a, x[ 1], S44, 0x85845dd1); + II (a, b, c, d, x[ 8], S41, 0x6fa87e4f); + II (d, a, b, c, x[15], S42, 0xfe2ce6e0); + II (c, d, a, b, x[ 6], S43, 0xa3014314); + II (b, c, d, a, x[13], S44, 0x4e0811a1); + II (a, b, c, d, x[ 4], S41, 0xf7537e82); + II (d, a, b, c, x[11], S42, 0xbd3af235); + II (c, d, a, b, x[ 2], S43, 0x2ad7d2bb); + II (b, c, d, a, x[ 9], S44, 0xeb86d391); + + m_State[0] += a; + m_State[1] += b; + m_State[2] += c; + m_State[3] += d; + + //memset(x, 0, sizeof(x)); + for (register int i = 0; i < (sizeof(x)/sizeof(*x)); i++) x[i] = 0UL; +} + +// md5::Encode +// Encodes input (uint4) into output (uchar). Assumes nLength is +// a multiple of 4. +void md5::Encode(uchar* dest, uint4* src, uint4 nLength) +{ + uint4 i, j; + + //assert(nLength % 4 == 0); + + for (i = 0, j = 0; j < nLength; i++, j += 4) + { + dest[j] = (uchar)(src[i] & 0xff); + dest[j+1] = (uchar)((src[i] >> 8) & 0xff); + dest[j+2] = (uchar)((src[i] >> 16) & 0xff); + dest[j+3] = (uchar)((src[i] >> 24) & 0xff); + } +} + +// md5::Decode +// Decodes input (uchar) into output (uint4). Assumes nLength is +// a multiple of 4. +void md5::Decode(uint4* dest, uchar* src, uint4 nLength) +{ + uint4 i, j; + + //assert(nLength % 4 == 0); + + for (i = 0, j = 0; j < nLength; i++, j += 4) + { + dest[i] = ((uint4)src[j]) | (((uint4)src[j+1])<<8) | + (((uint4)src[j+2])<<16) | (((uint4)src[j+3])<<24); + } +} \ No newline at end of file diff --git a/data/nsis/Contrib/md5dll/MD5.h b/data/nsis/Contrib/md5dll/MD5.h new file mode 100644 index 000000000..592ae048d --- /dev/null +++ b/data/nsis/Contrib/md5dll/MD5.h @@ -0,0 +1,100 @@ +///////////////////////////////////////////////////////////////////////// +// MD5.cpp +// Implementation file for MD5 class +// +// This C++ Class implementation of the original RSA Data Security, Inc. +// MD5 Message-Digest Algorithm is copyright (c) 2002, Gary McNickle. +// All rights reserved. This software is a derivative of the "RSA Data +// Security, Inc. MD5 Message-Digest Algorithm" +// +// You may use this software free of any charge, but without any +// warranty or implied warranty, provided that you follow the terms +// of the original RSA copyright, listed below. +// +// Original RSA Data Security, Inc. Copyright notice +///////////////////////////////////////////////////////////////////////// +// +// Copyright (C) 1991-2, RSA Data Security, Inc. Created 1991. All +// rights reserved. +// +// License to copy and use this software is granted provided that it +// is identified as the "RSA Data Security, Inc. MD5 Message-Digest +// Algorithm" in all material mentioning or referencing this software +// or this function. +// License is also granted to make and use derivative works provided +// that such works are identified as "derived from the RSA Data +// Security, Inc. MD5 Message-Digest Algorithm" in all material +// mentioning or referencing the derived work. +// RSA Data Security, Inc. makes no representations concerning either +// the merchantability of this software or the suitability of this +// software for any particular purpose. It is provided "as is" +// without express or implied warranty of any kind. +// These notices must be retained in any copies of any part of this +// documentation and/or software. +///////////////////////////////////////////////////////////////////////// + +typedef unsigned int uint4; +typedef unsigned short int uint2; +typedef unsigned char uchar; + +char* PrintMD5(uchar md5Digest[16]); +#if defined(ENABLE_GETMD5STRING) || defined (ENABLE_GETMD5RANDOM) +char* MD5String(char* szString); +#endif +#if defined(ENABLE_GETMD5FILE) +char* MD5File(char* szFilename); +#endif + +class md5 +{ +// Methods +public: + md5() { Init(); } + void Init(); + void Update(uchar* chInput, uint4 nInputLen); + void Finalize(); + uchar* Digest() { return m_Digest; } + +private: + + void Transform(uchar* block); + void Encode(uchar* dest, uint4* src, uint4 nLength); + void Decode(uint4* dest, uchar* src, uint4 nLength); + + + inline uint4 rotate_left(uint4 x, uint4 n) + { return ((x << n) | (x >> (32-n))); } + + inline uint4 F(uint4 x, uint4 y, uint4 z) + { return ((x & y) | (~x & z)); } + + inline uint4 G(uint4 x, uint4 y, uint4 z) + { return ((x & z) | (y & ~z)); } + + inline uint4 H(uint4 x, uint4 y, uint4 z) + { return (x ^ y ^ z); } + + inline uint4 I(uint4 x, uint4 y, uint4 z) + { return (y ^ (x | ~z)); } + + inline void FF(uint4& a, uint4 b, uint4 c, uint4 d, uint4 x, uint4 s, uint4 ac) + { a += F(b, c, d) + x + ac; a = rotate_left(a, s); a += b; } + + inline void GG(uint4& a, uint4 b, uint4 c, uint4 d, uint4 x, uint4 s, uint4 ac) + { a += G(b, c, d) + x + ac; a = rotate_left(a, s); a += b; } + + inline void HH(uint4& a, uint4 b, uint4 c, uint4 d, uint4 x, uint4 s, uint4 ac) + { a += H(b, c, d) + x + ac; a = rotate_left(a, s); a += b; } + + inline void II(uint4& a, uint4 b, uint4 c, uint4 d, uint4 x, uint4 s, uint4 ac) + { a += I(b, c, d) + x + ac; a = rotate_left(a, s); a += b; } + +// Data +private: + uint4 m_State[4]; + uint4 m_Count[2]; + uchar m_Buffer[64]; + uchar m_Digest[16]; + uchar m_Finalized; + +}; \ No newline at end of file diff --git a/data/nsis/Contrib/md5dll/MD5Example.nsi b/data/nsis/Contrib/md5dll/MD5Example.nsi new file mode 100644 index 000000000..65d0f1232 --- /dev/null +++ b/data/nsis/Contrib/md5dll/MD5Example.nsi @@ -0,0 +1,55 @@ +/************************************************************** + *** Generates a md5 value from a file, string or random. *** + **************************************************************/ + +Name "MD5dll Example" +OutFile "MD5dllTest.exe" +ShowInstDetails show + +Section + # generate MD5sum of file + StrCpy $0 "${NSISDIR}\NSIS.CHM" + md5dll::GetMD5File "$0" + Pop $1 + + DetailPrint 'md5dll::GetMD5File "$0"' + DetailPrint "MD5: [$1]" + DetailPrint "" + + # generate MD5sum of file using deprecated method + StrCpy $0 "${NSISDIR}\NSIS.CHM" + md5dll::GetFileMD5 "$0" + Pop $1 + + DetailPrint '{deprecated} md5dll::GetFileMD5 "$0"' + DetailPrint "MD5: [$1]" + DetailPrint "" + + + #generate MD5sum of string + StrCpy $0 "MyString" + md5dll::GetMD5String "$0" + Pop $1 + + DetailPrint 'md5dll::GetMD5String "$0"' + DetailPrint "MD5: [$1]" + DetailPrint "" + + #generate MD5sum of string using deprecated method + StrCpy $0 "MyString" + md5dll::GetMD5 "$0" + Pop $1 + + DetailPrint '{deprecated} md5dll::GetMD5 "$0"' + DetailPrint "MD5: [$1]" + DetailPrint "" + + + #generate random MD5sum + md5dll::GetMD5Random + Pop $1 + + DetailPrint "md5dll::GetMD5Random" + DetailPrint "MD5: [$1]" + DetailPrint "" +SectionEnd diff --git a/data/nsis/Contrib/md5dll/api.h b/data/nsis/Contrib/md5dll/api.h new file mode 100644 index 000000000..9d7b20797 --- /dev/null +++ b/data/nsis/Contrib/md5dll/api.h @@ -0,0 +1,83 @@ +/* + * apih + * + * This file is a part of NSIS. + * + * Copyright (C) 1999-2009 Nullsoft and Contributors + * + * Licensed under the zlib/libpng license (the "License"); + * you may not use this file except in compliance with the License. + * + * Licence details can be found in the file COPYING. + * + * This software is provided 'as-is', without any express or implied + * warranty. + */ + +#ifndef _NSIS_EXEHEAD_API_H_ +#define _NSIS_EXEHEAD_API_H_ + +// Starting with NSIS 2.42, you can check the version of the plugin API in exec_flags->plugin_api_version +// The format is 0xXXXXYYYY where X is the major version and Y is the minor version (MAKELONG(y,x)) +// When doing version checks, always remember to use >=, ex: if (pX->exec_flags->plugin_api_version >= NSISPIAPIVER_1_0) {} + +#define NSISPIAPIVER_1_0 0x00010000 +#define NSISPIAPIVER_CURR NSISPIAPIVER_1_0 + +// NSIS Plug-In Callback Messages +enum NSPIM +{ + NSPIM_UNLOAD, // This is the last message a plugin gets, do final cleanup + NSPIM_GUIUNLOAD, // Called after .onGUIEnd +}; + +// Prototype for callbacks registered with extra_parameters->RegisterPluginCallback() +// Return NULL for unknown messages +// Should always be __cdecl for future expansion possibilities +typedef UINT_PTR (*NSISPLUGINCALLBACK)(enum NSPIM); + +// extra_parameters data structures containing other interesting stuff +// but the stack, variables and HWND passed on to plug-ins. +typedef struct +{ + int autoclose; + int all_user_var; + int exec_error; + int abort; + int exec_reboot; // NSIS_SUPPORT_REBOOT + int reboot_called; // NSIS_SUPPORT_REBOOT + int XXX_cur_insttype; // depreacted + int plugin_api_version; // see NSISPIAPIVER_CURR + // used to be XXX_insttype_changed + int silent; // NSIS_CONFIG_SILENT_SUPPORT + int instdir_error; + int rtl; + int errlvl; + int alter_reg_view; + int status_update; +} exec_flags_t; + +#ifndef NSISCALL +# define NSISCALL __stdcall +#endif + +typedef struct { + exec_flags_t *exec_flags; + int (NSISCALL *ExecuteCodeSegment)(int, HWND); + void (NSISCALL *validate_filename)(TCHAR *); + int (NSISCALL *RegisterPluginCallback)(HMODULE, NSISPLUGINCALLBACK); // returns 0 on success, 1 if already registered and < 0 on errors +} extra_parameters; + +// Definitions for page showing plug-ins +// See Ui.c to understand better how they're used + +// sent to the outer window to tell it to go to the next inner window +#define WM_NOTIFY_OUTER_NEXT (WM_USER+0x8) + +// custom pages should send this message to let NSIS know they're ready +#define WM_NOTIFY_CUSTOM_READY (WM_USER+0xd) + +// sent as wParam with WM_NOTIFY_OUTER_NEXT when user cancels - heed its warning +#define NOTIFY_BYE_BYE 'x' + +#endif /* _PLUGIN_H_ */ diff --git a/data/nsis/Contrib/md5dll/build.bat b/data/nsis/Contrib/md5dll/build.bat new file mode 100644 index 000000000..c20bb1f32 --- /dev/null +++ b/data/nsis/Contrib/md5dll/build.bat @@ -0,0 +1,17 @@ +@echo Building MD5dll +@set md5unicode= +@if not "%1"=="/u" goto skipU +@set md5unicode=/DNSIS_UNICODE +@:skipU +@REM compile dll +rc /l 0x409 /d "NDEBUG" %md5unicode% md5dll.rc +cl /O2 /GX- /Gs- /Oi /Os /GF /GB /DENABLE_GETMD5FILE /DENABLE_GETMD5STRING /DENABLE_GETMD5RANDOM %md5unicode% md5dll.def md5dll.res md5dll.cpp MD5.cpp kernel32.lib user32.lib /LD /link -opt:nowin98 -opt:REF,ICF -machine:I386 -nodefaultlib -entry:"_DllMainCRTStartup" +::@REM build optional link lib +::lib /DEF:md5dll.def /machine:I386 +@REM removing unneeded files +del *.obj +del md5dll.res +del md5dll.exp +del md5dll.lib +@set md5unicode= +@PAUSE diff --git a/data/nsis/Contrib/md5dll/md5dll.cpp b/data/nsis/Contrib/md5dll/md5dll.cpp new file mode 100644 index 000000000..4c3876ca6 --- /dev/null +++ b/data/nsis/Contrib/md5dll/md5dll.cpp @@ -0,0 +1,140 @@ +// MD5 plugin. +// Be sure to add the RSA license notice somewhere in your installer. +// +// Matthew "IGx89" Lieder +// Author +// +// KJD +// -modified to reduce size and use exdll.h +// (reduced to about 6KB uncompressed, by removing CRTL dependency) +// +// Davy Durham +// -MD5.cpp fix (correct for loop used to replace memset, exceeded bounds) +// +// Shengalts Aleksander aka Instructor +// -New command: "GetMD5Random" +// -Changed names: "GetFileMD5" -> "GetMD5File", "GetMD5" -> "GetMD5String" +// -Fixed: string lenght error +// +// KJD +// -added dual exports for compatibility with prior versions +// +// KJD +// -updated Exdll.h to pluginapi.h, enable building for NSIS & Unicode NSIS + + +#ifdef NSIS_UNICODE /* MD5.cpp should be compiled in ANSI mode */ +#define UNICODE +#define _UNICODE +#endif + + +#define WIN32_LEAN_AND_MEAN +#include +#include "MD5.h" + +unsigned char staticCnvBuffer[1024*2]; +#ifdef UNICODE +#define wcslen lstrlenW +#define wcscpy lstrcpyW +#define wcsncpy lstrcpynW +#define wcscat lstrcatW +#define wcscmp lstrcmpW +#define wcscmpi lstrcmpiW +char * _T2A(unsigned short *wideStr) +{ + WideCharToMultiByte(CP_ACP, 0, wideStr, -1, (char *)staticCnvBuffer, sizeof(staticCnvBuffer), NULL, NULL); + return (char *)staticCnvBuffer; +} +#define _A2T(x) _A2U(x) +#else +#define strlen lstrlenA +#define strcpy lstrcpyA +#define strncpy lstrcpynA +#define strcat lstrcatA +#define strcmp lstrcmpA +#define strcmpi lstrcmpiA +#define _T2A(x) (x) +#define _A2T(x) (x) +#endif +unsigned short * _A2U(char *ansiStr) +{ + MultiByteToWideChar(CP_ACP, 0, ansiStr, -1, (unsigned short *)staticCnvBuffer, sizeof(staticCnvBuffer)/2); + return (unsigned short *)staticCnvBuffer; +} + +#include "pluginapi.h" + + +void *operator new( unsigned int num_bytes ) +{ + return GlobalAlloc(GPTR,num_bytes); +} +void operator delete( void *p ) { if (p) GlobalFree(p); } + + +/* buffer for retrieving arguments from NSIS's stack into, outside func to avoid calls to __stkchk */ +TCHAR strarg[1024*sizeof(TCHAR)]; + +#ifdef ENABLE_GETMD5FILE +extern "C" void __declspec( dllexport ) GetMD5File(HWND hwndParent, int string_size, + TCHAR *variables, stack_t **stacktop) +{ + EXDLL_INIT(); + + // generate MD5sum of file + { + char *buf=NULL; + + popstring(strarg); + buf = MD5File(_T2A(strarg)); + pushstring(_A2T(buf)); + delete buf; + } +} +#endif // ENABLE_GETMD5FILE + +#ifdef ENABLE_GETMD5STRING +extern "C" void __declspec( dllexport ) GetMD5String(HWND hwndParent, int string_size, + TCHAR *variables, stack_t **stacktop) +{ + EXDLL_INIT(); + + // generate MD5sum of string + { + char *buf=NULL; + + popstring(strarg); + buf = MD5String(_T2A(strarg)); + pushstring(_A2T(buf)); + delete buf; + } +} +#endif // ENABLE_GETMD5STRING + +#ifdef ENABLE_GETMD5RANDOM +extern "C" void __declspec( dllexport ) GetMD5Random(HWND hwndParent, int string_size, + TCHAR *variables, stack_t **stacktop) +{ + EXDLL_INIT(); + + // generate random MD5sum + { + DWORD dwTickCount=0; + char lTickCount[1024]; + char *buf=NULL; + + Sleep(1); + dwTickCount=GetTickCount(); + wsprintfA(lTickCount,"%d",dwTickCount); + buf = MD5String(lTickCount); + pushstring(_A2T(buf)); + delete buf; + } +} +#endif // ENABLE_GETMD5RANDOM + +extern "C" BOOL WINAPI _DllMainCRTStartup(HANDLE hInst, ULONG ul_reason_for_call, LPVOID lpReserved) +{ + return TRUE; +} diff --git a/data/nsis/Contrib/md5dll/md5dll.def b/data/nsis/Contrib/md5dll/md5dll.def new file mode 100644 index 000000000..3eaae15bc --- /dev/null +++ b/data/nsis/Contrib/md5dll/md5dll.def @@ -0,0 +1,10 @@ +LIBRARY MD5DLL +DESCRIPTION "Implements MD5 Sum as NSIS plugin" +EXPORTS +GetMD5File @1 +GetMD5String @2 +GetMD5Random @3 + +;These are for compatibility with older versions of this plugin only {deprecated} +GetFileMD5=GetMD5File @101 PRIVATE +GetMD5=GetMD5String @102 PRIVATE diff --git a/data/nsis/Contrib/md5dll/md5dll.rc b/data/nsis/Contrib/md5dll/md5dll.rc new file mode 100644 index 000000000..a1cb8f72c --- /dev/null +++ b/data/nsis/Contrib/md5dll/md5dll.rc @@ -0,0 +1,100 @@ +#include + +#define APP_ICON 100 + +#ifdef RC_INVOKED + +// Pretty icon displayed by Explorer +// APP_ICON ICON DISCARDABLE "md5dll.ico" + +// Version info viewable by Explorer +#define _VM 0 +#define _VN 5 +#define _VI 0 +#define _VB 0 + +#ifndef mk_str +#define mk_str2(x) # x +#define mk_str(x) mk_str2(x) +#endif + +#define _VS mk_str(_VM) "." mk_str(_VN) "." mk_str(_VI) "-" mk_str(_VB) "\0" + + +// normally found in included by +// FILEFLAGS +#define VS_FF_NORMAL 0x00000000L // ok I made this one up +#ifndef VS_FF_DEBUG +#define VS_FF_DEBUG 0x00000001L +#endif +#ifndef VS_FF_PRERELEASE +#define VS_FF_PRERELEASE 0x00000002L +#endif +// FILEOS +#ifndef VOS_NT +#define VOS_NT 0x00040000L +#endif +#ifndef VOS__WINDOWS32 +#define VOS__WINDOWS32 0x00000004L +#endif +#ifndef VOS_NT_WINDOWS32 +#define VOS_NT_WINDOWS32 0x00040004L +#endif +// FILETYPE +#ifndef VFT_APP +#define VFT_APP 0x00000001L +#endif +#ifndef VFT_DLL +#define VFT_DLL 0x00000002L +#endif + + +VS_VERSION_INFO VERSIONINFO + FILEVERSION _VM,_VN,_VI,_VB + PRODUCTVERSION _VM,_VN,_VI,_VB + FILEFLAGSMASK 0x3fL +#ifdef _DEBUG + FILEFLAGS VS_FF_DEBUG | VS_FF_PRERELEASE // a debug build is never a release +#else + FILEFLAGS VS_FF_NORMAL +#endif + FILEOS VOS_NT_WINDOWS32 + FILETYPE VFT_APP + FILESUBTYPE 0x0L +BEGIN + BLOCK "StringFileInfo" + BEGIN + BLOCK "080904b0" + BEGIN + VALUE "Comments", "NSIS plugin to calculate MD5 sum.\0" + VALUE "CompanyName", "www.fdos.org\0" + VALUE "FileDescription", "MD5 message digest algorithm\0" + VALUE "FileVersion", _VS + VALUE "InternalName", "md5dll\0" +// Only about the 1st 45+ characters are shown in Windows 2000 properties Version dialog + VALUE "LegalCopyright", "derivative of RSA Data Security, Inc. MD5 Message-Digest Algorithm\0" + VALUE "LegalTrademarks", "\0" + VALUE "OriginalFilename", "md5dll.dll\0" + VALUE "PrivateBuild", "\0" + VALUE "ProductName", "md5dll\0" + VALUE "ProductVersion", _VS +#ifdef NSIS_UNICODE + VALUE "SpecialBuild", "UNICODE\0" +#else + VALUE "SpecialBuild", "ANSI\0" +#endif + END + END + BLOCK "VarFileInfo" + BEGIN + VALUE "Translation", 0x809, 1200 + END +END + +#undef _VM +#undef _VN +#undef _VI +#undef _VB +#undef _VS + +#endif diff --git a/data/nsis/Contrib/md5dll/nsis_tchar.h b/data/nsis/Contrib/md5dll/nsis_tchar.h new file mode 100644 index 000000000..92e989e31 --- /dev/null +++ b/data/nsis/Contrib/md5dll/nsis_tchar.h @@ -0,0 +1,215 @@ +/* + * nsis_tchar.h + * + * This file is a part of NSIS. + * + * Copyright (C) 1999-2007 Nullsoft and Contributors + * + * This software is provided 'as-is', without any express or implied + * warranty. + * + * For Unicode support by Jim Park -- 08/30/2007 + */ + +// Jim Park: Only those we use are listed here. + +#pragma once + +#ifdef _UNICODE + +#ifndef _T +#define __T(x) L ## x +#define _T(x) __T(x) +#define _TEXT(x) __T(x) +#endif +typedef wchar_t TCHAR; +typedef wchar_t _TUCHAR; + +// program +#define _tmain wmain +#define _tWinMain wWinMain +#define _tenviron _wenviron +#define __targv __wargv + +// printfs +#define _ftprintf fwprintf +#define _sntprintf _snwprintf +#define _stprintf _swprintf +#define _tprintf wprintf +#define _vftprintf vfwprintf +#define _vsntprintf _vsnwprintf +#define _vstprintf _vswprintf + +// scanfs +#define _tscanf wscanf +#define _stscanf swscanf + +// string manipulations +#define _tcscat wcscat +#define _tcschr wcschr +#define _tcsclen wcslen +#define _tcscpy wcscpy +#define _tcsdup _wcsdup +#define _tcslen wcslen +#define _tcsnccpy wcsncpy +#define _tcsncpy wcsncpy +#define _tcsrchr wcsrchr +#define _tcsstr wcsstr +#define _tcstok wcstok + +// string comparisons +#define _tcscmp wcscmp +#define _tcsicmp _wcsicmp +#define _tcsncicmp _wcsnicmp +#define _tcsncmp wcsncmp +#define _tcsnicmp _wcsnicmp + +// upper / lower +#define _tcslwr _wcslwr +#define _tcsupr _wcsupr +#define _totlower towlower +#define _totupper towupper + +// conversions to numbers +#define _tcstoi64 _wcstoi64 +#define _tcstol wcstol +#define _tcstoul wcstoul +#define _tstof _wtof +#define _tstoi _wtoi +#define _tstoi64 _wtoi64 +#define _ttoi _wtoi +#define _ttoi64 _wtoi64 +#define _ttol _wtol + +// conversion from numbers to strings +#define _itot _itow +#define _ltot _ltow +#define _i64tot _i64tow +#define _ui64tot _ui64tow + +// file manipulations +#define _tfopen _wfopen +#define _topen _wopen +#define _tremove _wremove +#define _tunlink _wunlink + +// reading and writing to i/o +#define _fgettc fgetwc +#define _fgetts fgetws +#define _fputts fputws +#define _gettchar getwchar + +// directory +#define _tchdir _wchdir + +// environment +#define _tgetenv _wgetenv +#define _tsystem _wsystem + +// time +#define _tcsftime wcsftime + +#else // ANSI + +#ifndef _T +#define _T(x) x +#define _TEXT(x) x +#endif +typedef char TCHAR; +typedef unsigned char _TUCHAR; + +// program +#define _tmain main +#define _tWinMain WinMain +#define _tenviron environ +#define __targv __argv + +// printfs +#define _ftprintf fprintf +#define _sntprintf _snprintf +#define _stprintf sprintf +#define _tprintf printf +#define _vftprintf vfprintf +#define _vsntprintf _vsnprintf +#define _vstprintf vsprintf + +// scanfs +#define _tscanf scanf +#define _stscanf sscanf + +// string manipulations +#define _tcscat strcat +#define _tcschr strchr +#define _tcsclen strlen +#define _tcscnlen strnlen +#define _tcscpy strcpy +#define _tcsdup _strdup +#define _tcslen strlen +#define _tcsnccpy strncpy +#define _tcsncpy strncpy +#define _tcsrchr strrchr +#define _tcsstr strstr +#define _tcstok strtok + +// string comparisons +#define _tcscmp strcmp +#define _tcsicmp _stricmp +#define _tcsncmp strncmp +#define _tcsncicmp _strnicmp +#define _tcsnicmp _strnicmp + +// upper / lower +#define _tcslwr _strlwr +#define _tcsupr _strupr + +#define _totupper toupper +#define _totlower tolower + +// conversions to numbers +#define _tcstol strtol +#define _tcstoul strtoul +#define _tstof atof +#define _tstoi atoi +#define _tstoi64 _atoi64 +#define _tstoi64 _atoi64 +#define _ttoi atoi +#define _ttoi64 _atoi64 +#define _ttol atol + +// conversion from numbers to strings +#define _i64tot _i64toa +#define _itot _itoa +#define _ltot _ltoa +#define _ui64tot _ui64toa + +// file manipulations +#define _tfopen fopen +#define _topen _open +#define _tremove remove +#define _tunlink _unlink + +// reading and writing to i/o +#define _fgettc fgetc +#define _fgetts fgets +#define _fputts fputs +#define _gettchar getchar + +// directory +#define _tchdir _chdir + +// environment +#define _tgetenv getenv +#define _tsystem system + +// time +#define _tcsftime strftime + +#endif + +// is functions (the same in Unicode / ANSI) +#define _istgraph isgraph +#define _istascii __isascii + +#define __TFILE__ _T(__FILE__) +#define __TDATE__ _T(__DATE__) +#define __TTIME__ _T(__TIME__) diff --git a/data/nsis/Contrib/md5dll/pluginapi.h b/data/nsis/Contrib/md5dll/pluginapi.h new file mode 100644 index 000000000..86dee2fb3 --- /dev/null +++ b/data/nsis/Contrib/md5dll/pluginapi.h @@ -0,0 +1,103 @@ +// only include this file from one place in your DLL. +// (it is all static, if you use it in two places it will fail) + +#ifndef ___NSIS_PLUGIN__H___ +#define ___NSIS_PLUGIN__H___ + +#ifdef __cplusplus +extern "C" { +#endif + +#include "api.h" +#include "nsis_tchar.h" + +#ifndef NSISCALL +# define NSISCALL __stdcall +#endif + +#define EXDLL_INIT() { \ + g_stringsize=string_size; \ + g_stacktop=stacktop; \ + g_variables=variables; } + +typedef struct _stack_t { + struct _stack_t *next; + TCHAR text[1]; // this should be the length of string_size +} stack_t; + +enum +{ +INST_0, // $0 +INST_1, // $1 +INST_2, // $2 +INST_3, // $3 +INST_4, // $4 +INST_5, // $5 +INST_6, // $6 +INST_7, // $7 +INST_8, // $8 +INST_9, // $9 +INST_R0, // $R0 +INST_R1, // $R1 +INST_R2, // $R2 +INST_R3, // $R3 +INST_R4, // $R4 +INST_R5, // $R5 +INST_R6, // $R6 +INST_R7, // $R7 +INST_R8, // $R8 +INST_R9, // $R9 +INST_CMDLINE, // $CMDLINE +INST_INSTDIR, // $INSTDIR +INST_OUTDIR, // $OUTDIR +INST_EXEDIR, // $EXEDIR +INST_LANG, // $LANGUAGE +__INST_LAST +}; + + +static unsigned int g_stringsize; +static stack_t **g_stacktop; +static TCHAR *g_variables; + + +// utility functions (not required but often useful) +static int NSISCALL popstring(TCHAR *str) +{ + stack_t *th; + if (!g_stacktop || !*g_stacktop) return 1; + th=(*g_stacktop); + _tcscpy(str,th->text); + *g_stacktop = th->next; + GlobalFree((HGLOBAL)th); + return 0; +} + +static void NSISCALL pushstring(const TCHAR *str) +{ + stack_t *th; + if (!g_stacktop) return; + th=(stack_t*)GlobalAlloc(GPTR,sizeof(stack_t)+g_stringsize); + _tcsncpy(th->text,str,g_stringsize); + th->next=*g_stacktop; + *g_stacktop=th; +} + +static TCHAR * NSISCALL getuservariable(const int varnum) +{ + if (varnum < 0 || varnum >= __INST_LAST) return NULL; + return g_variables+varnum*g_stringsize; +} + +static void NSISCALL setuservariable(const int varnum, const TCHAR *var) +{ + if (var != NULL && varnum >= 0 && varnum < __INST_LAST) + _tcscpy(g_variables + varnum*g_stringsize, var); +} + + +#ifdef __cplusplus +} +#endif + +#endif//!___NSIS_PLUGIN__H___ diff --git a/data/nsis/Contrib/nsisunz/AggressiveOptimize.h b/data/nsis/Contrib/nsisunz/AggressiveOptimize.h new file mode 100644 index 000000000..6ab751216 --- /dev/null +++ b/data/nsis/Contrib/nsisunz/AggressiveOptimize.h @@ -0,0 +1,92 @@ + +////////////////////////////// +// Version 1.30 +// Nov 24th, 2000 +// Version 1.20 +// Jun 9th, 2000 +// Version 1.10 +// Jan 23rd, 2000 +// Version 1.00 +// May 20th, 1999 +// Todd C. Wilson, Fresh Ground Software +// (todd@nopcode.com) +// This header file will kick in settings for Visual C++ 5 and 6 that will (usually) +// result in smaller exe's. +// The "trick" is to tell the compiler to not pad out the function calls; this is done +// by not using the /O1 or /O2 option - if you do, you implicitly use /Gy, which pads +// out each and every function call. In one single 500k dll, I managed to cut out 120k +// by this alone! +// The other two "tricks" are telling the Linker to merge all data-type segments together +// in the exe file. The relocation, read-only (constants) data, and code section (.text) +// sections can almost always be merged. Each section merged can save 4k in exe space, +// since each section is padded out to 4k chunks. This is very noticeable with smaller +// exes, since you could have only 700 bytes of data, 300 bytes of code, 94 bytes of +// strings - padded out, this could be 12k of runtime, for 1094 bytes of stuff! For larger +// programs, this is less overall, but can save at least 4k. +// Note that if you're using MFC static or some other 3rd party libs, you may get poor +// results with merging the readonly (.rdata) section - the exe may grow larger. +// To use this feature, define _MERGE_DATA_ in your project or before this header is used. +// With Visual C++ 5, the program uses a file alignment of 512 bytes, which results +// in a small exe. Under VC6, the program instead uses 4k, which is the same as the +// section size. The reason (from what I understand) is that 4k is the chunk size of +// the virtual memory manager, and that WinAlign (an end-user tuning tool for Win98) +// will re-align the programs on this boundary. The problem with this is that all of +// Microsoft's system exes and dlls are *NOT* tuned like this, and using 4k causes serious +// exe bloat. Very noticeable for smaller programs. +// The "trick" for this is to use the undocumented FILEALIGN linker parm to change the +// padding from 4k to 1/2k, which results in a much smaller exe - anywhere from 20%-75% +// depending on the size. Note that this is the same as using /OPT:NOWIN98, which *is* +// a previously documented switch, but was left out of the docs for some reason in VC6 and +// all of the current MSDN's - see KB:Q235956 for more information. +// Microsoft does say that using the 4k alignment will "speed up process loading", +// but I've been unable to notice a difference, even on my P180, with a very large (4meg) exe. +// Please note, however, that this will probably not change the size of the COMPRESSED +// file (either in a .zip file or in an install archive), since this 4k is all zeroes and +// gets compressed away. +// Also, the /ALIGN:4096 switch will "magically" do the same thing, even though this is the +// default setting for this switch. Apparently this sets the same values as the above two +// switches do. We do not use this in this header, since it smacks of a bug and not a feature. +// Thanks to Michael Geary for some additional tips! + +#ifdef NDEBUG +// /Og (global optimizations), /Os (favor small code), /Oy (no frame pointers) +#pragma optimize("gsy",on) + +#pragma comment(linker,"/RELEASE") + +// Note that merging the .rdata section will result in LARGER exe's if you using +// MFC (esp. static link). If this is desirable, define _MERGE_RDATA_ in your project. +#ifdef _MERGE_RDATA_ +#pragma comment(linker,"/merge:.rdata=.data") +#endif // _MERGE_RDATA_ + +#pragma comment(linker,"/merge:.text=.data") +#pragma comment(linker,"/merge:.reloc=.data") + +// Merging sections with different attributes causes a linker warning, so +// turn off the warning. From Michael Geary. Undocumented, as usual! +#pragma comment(linker,"/ignore:4078") + +// With Visual C++ 5, you already get the 512-byte alignment, so you will only need +// it for VC6, and maybe later. +#if _MSC_VER >= 1000 + +// Option #1: use /filealign +// Totally undocumented! And if you set it lower than 512 bytes, the program crashes. +// Either leave at 0x200 or 0x1000 +//#pragma comment(linker,"/FILEALIGN:0x200") + +// Option #2: use /opt:nowin98 +// See KB:Q235956 or the READMEVC.htm in your VC directory for info on this one. +// This is our currently preferred option, since it is fully documented and unlikely +// to break in service packs and updates. +#pragma comment(linker,"/opt:nowin98") + +// Option #3: use /align:4096 +// A side effect of using the default align value is that it turns on the above switch. +// May break in future versions! +//#pragma comment(linker,"/ALIGN:4096") + +#endif // _MSC_VER >= 1000 + +#endif // NDEBUG diff --git a/data/nsis/Contrib/nsisunz/example.nsi b/data/nsis/Contrib/nsisunz/example.nsi new file mode 100644 index 000000000..e07a58343 --- /dev/null +++ b/data/nsis/Contrib/nsisunz/example.nsi @@ -0,0 +1,95 @@ +; Example script for nsisunz +; Written by Saivert +; Homepage: http://members.tripod.com/files_saivert/ +; +; Dependencies: +; - nsisunz.dll Plug-in +; - InstallOptions.dll Plug-in +; - zippage.ini (InstallOptions INI file) + +!addplugindir ".\Release" + +OutFile "nsisunz_test.exe" +Name "NSIS Unzip plug-in test" +Caption "NSIS Unzip plug-in test" +ShowInstDetails show +XPStyle on +CompletedText "Extracted!" +SubCaption 3 " - Extracting files" +SubCaption 4 " - Extracted" + +LoadLanguageFile "${NSISDIR}\Contrib\Language files\english.nlf" + +; Installer pages +Page custom onZipPageShow onZipPageLeave " - Select Zip file" +Page instfiles + +; Localized strings for use with nsisunz +; The '%f' in the string is replaced with the filename on run-time. +; "%c", "%u", "%p" and "%p" is replaced with compressed size, +; uncompressed size, percent complete (with "%") and byte complete +; respectively. +LangString nsisunz_text ${LANG_ENGLISH} "Extract: %f (%c -> %b) [%p]" + +Function .onInit + InitPluginsDir + File "/oname=$PLUGINSDIR\zippage.ini" "zippage.ini" +FunctionEnd + +Function onZipPageShow + ; Turn Text control into a button (HM NIS Edit v2.0b5 does not support "Button" type). + WriteINIStr "$PLUGINSDIR\zippage.ini" "Field 12" "Type" "Button" + WriteINIStr "$PLUGINSDIR\zippage.ini" "Field 12" "Flags" "NOTIFY" + + InstallOptions::dialog "$PLUGINSDIR\zippage.ini" +FunctionEnd + +Function onZipPageLeave +; $R0 = zip filename $R1 = dest. folder + + ReadINIStr $R0 "$PLUGINSDIR\zippage.ini" "Field 4" "State" + ReadINIStr $R1 "$PLUGINSDIR\zippage.ini" "Field 6" "State" + + ; Remove trailing backslash if any + StrCpy $0 $R1 1 -1 + StrCmp "$0" "\" 0 notneeded + StrCpy $R1 $R1 -1 + notneeded: + + IfFileExists $R0 checkdir + MessageBox MB_ICONEXCLAMATION|MB_OK 'The file "$R0" does not exist!' + Abort ;return to page + checkdir: + IfFileExists $R1\*.* unzip + MessageBox MB_ICONEXCLAMATION|MB_YESNO 'The folder "$R1" does not exist!$\r$\nDo you wish to create it?' IDNO skipcreate + CreateDirectory $R1 + Goto unzip + skipcreate: + Abort ;return to page + + unzip: +; Just fall of the end, so the sections can be executed +FunctionEnd + +Section -pre + DetailPrint "ZIP file: $R0" + DetailPrint "Dest. folder: $R1" +SectionEnd + +Section +; Check if the checkbox is checked and if it is, then don't extract paths + ReadINIStr $R2 "$PLUGINSDIR\zippage.ini" "Field 7" "State" + StrCmp $R2 "1" 0 usepaths + nsisunz::UnzipToLog /text "$(nsisunz_text)" /noextractpath $R0 $R1 + Goto check + usepaths: + nsisunz::UnzipToLog /text "$(nsisunz_text)" $R0 $R1 + + check: +; Always check for errors. Everything else than "success" means an error. + Pop $0 + StrCmp $0 "success" ok + Abort "$0" + ok: +SectionEnd + diff --git a/data/nsis/Contrib/nsisunz/example_mui.nsi b/data/nsis/Contrib/nsisunz/example_mui.nsi new file mode 100644 index 000000000..77f528506 --- /dev/null +++ b/data/nsis/Contrib/nsisunz/example_mui.nsi @@ -0,0 +1,101 @@ +; Example script for nsisunz +; Written by Saivert +; Homepage: http://members.tripod.com/files_saivert/ +; +; Dependencies: +; - nsisunz.dll Plug-in +; - InstallOptions.dll Plug-in +; - zippage.ini (InstallOptions INI file) + +!addplugindir ".\Release" + +!include "MUI.nsh" + +OutFile "nsisunz_testmui.exe" +Name "NSIS Unzip plug-in test" +Caption "NSIS Unzip plug-in test" +ShowInstDetails show +CompletedText "Extracted!" + +; Installer pages +Page custom onZipPageShow onZipPageLeave " " +!define MUI_PAGE_HEADER_TEXT "Extracting" +!define MUI_PAGE_HEADER_SUBTEXT "Extracting files" +!define MUI_INSTFILESPAGE_FINISHHEADER_TEXT "Extracted" +!define MUI_INSTFILESPAGE_FINISHHEADER_SUBTEXT "Thes files has been extracted" +!define MUI_INSTFILESPAGE_ABORTHEADER_TEXT "Extraction aborted" +!define MUI_INSTFILESPAGE_ABORTHEADER_SUBTEXT "The extraction process was aborted" +!insertmacro MUI_PAGE_INSTFILES + +!insertmacro MUI_LANGUAGE "English" + +; Localized strings for use with nsisunz +; The '%f' in the string is replaced with the filename on run-time. +; "%c" and "%u" is replaced with compressed size and uncompressed size +; respectively. +LangString nsisunz_text ${LANG_ENGLISH} "Extract: %f (%c -> %u)" + +Function .onInit + InitPluginsDir + !insertmacro MUI_INSTALLOPTIONS_EXTRACT "zippage.ini" +FunctionEnd + +Function onZipPageShow + !insertmacro MUI_HEADER_TEXT "Unzip" "Select ZIP file and destination folder" + + ; Remove icon (so we get away with one INI file for both scripts) + !insertmacro MUI_INSTALLOPTIONS_WRITE "zippage.ini" "Field 1" "Type" "" + !insertmacro MUI_INSTALLOPTIONS_WRITE "zippage.ini" "Field 2" "Left" "0" + + + !insertmacro MUI_INSTALLOPTIONS_DISPLAY "zippage.ini" +FunctionEnd + +Function onZipPageLeave +; $R0 = zip filename $R1 = dest. folder + + !insertmacro MUI_INSTALLOPTIONS_READ $R0 "zippage.ini" "Field 4" "State" + !insertmacro MUI_INSTALLOPTIONS_READ $R1 "zippage.ini" "Field 6" "State" + + ; Remove trailing backslash if any + StrCpy $0 $R1 1 -1 + StrCmp "$0" "\" 0 notneeded + StrCpy $R1 $R1 -1 + notneeded: + + IfFileExists $R0 checkdir + MessageBox MB_ICONEXCLAMATION|MB_OK 'The file "$R0" does not exist!' + Abort ;return to page + checkdir: + IfFileExists $R1\*.* unzip + MessageBox MB_ICONEXCLAMATION|MB_YESNO 'The folder "$R1" does not exist!$\r$\nDo you wish to create it?' IDNO skipcreate + CreateDirectory $R1 + Goto unzip + skipcreate: + Abort ;return to page + + unzip: +; Just fall of the end, so the sections can be executed +FunctionEnd + +Section -pre + DetailPrint "ZIP file: $R0" + DetailPrint "Dest. folder: $R1" +SectionEnd + +Section +; Check if the checkbox is checked and if it is, then don't extract paths + ReadINIStr $R2 "$PLUGINSDIR\zippage.ini" "Field 7" "State" + StrCmp $R2 "1" 0 usepaths + nsisunz::UnzipToLog /text "$(nsisunz_text)" /noextractpath $R0 $R1 + Goto check + usepaths: + nsisunz::UnzipToLog /text "$(nsisunz_text)" $R0 $R1 + + check: +; Always check for errors. Everything else than "success" means an error. + Pop $0 + StrCmp $0 "success" ok + Abort "$0" + ok: +SectionEnd diff --git a/data/nsis/Contrib/nsisunz/exdll.h b/data/nsis/Contrib/nsisunz/exdll.h new file mode 100644 index 000000000..9df76ca60 --- /dev/null +++ b/data/nsis/Contrib/nsisunz/exdll.h @@ -0,0 +1,116 @@ +#ifndef _EXDLL_H_ +#define _EXDLL_H_ + +// only include this file from one place in your DLL. +// (it is all static, if you use it in two places it will fail) + +#define EXDLL_INIT() { \ + g_stringsize=string_size; \ + g_stacktop=stacktop; \ + g_variables=variables; } + +// For page showing plug-ins +#define WM_NOTIFY_OUTER_NEXT (WM_USER+0x8) +#define WM_NOTIFY_CUSTOM_READY (WM_USER+0xd) +#define NOTIFY_BYE_BYE 'x' + +typedef struct _stack_t { + struct _stack_t *next; + char text[1]; // this should be the length of string_size +} stack_t; + + +static unsigned int g_stringsize; +static stack_t **g_stacktop; +static char *g_variables; + +static int __stdcall popstring(char *str); // 0 on success, 1 on empty stack +static void __stdcall pushstring(const char *str); + +enum +{ +INST_0, // $0 +INST_1, // $1 +INST_2, // $2 +INST_3, // $3 +INST_4, // $4 +INST_5, // $5 +INST_6, // $6 +INST_7, // $7 +INST_8, // $8 +INST_9, // $9 +INST_R0, // $R0 +INST_R1, // $R1 +INST_R2, // $R2 +INST_R3, // $R3 +INST_R4, // $R4 +INST_R5, // $R5 +INST_R6, // $R6 +INST_R7, // $R7 +INST_R8, // $R8 +INST_R9, // $R9 +INST_CMDLINE, // $CMDLINE +INST_INSTDIR, // $INSTDIR +INST_OUTDIR, // $OUTDIR +INST_EXEDIR, // $EXEDIR +INST_LANG, // $LANGUAGE +__INST_LAST +}; + +typedef struct { + int autoclose; + int all_user_var; + int exec_error; + int abort; + int exec_reboot; + int reboot_called; + int XXX_cur_insttype; // deprecated + int XXX_insttype_changed; // deprecated + int silent; + int instdir_error; + int rtl; + int errlvl; +} exec_flags; + +typedef struct { + exec_flags *exec_flags; + int (__stdcall *ExecuteCodeSegment)(int, HWND); +} extra_parameters; + +// utility functions (not required but often useful) +static int __stdcall popstring(char *str) +{ + stack_t *th; + if (!g_stacktop || !*g_stacktop) return 1; + th=(*g_stacktop); + lstrcpy(str,th->text); + *g_stacktop = th->next; + GlobalFree((HGLOBAL)th); + return 0; +} + +static void __stdcall pushstring(const char *str) +{ + stack_t *th; + if (!g_stacktop) return; + th=(stack_t*)GlobalAlloc(GPTR,sizeof(stack_t)+g_stringsize); + lstrcpyn(th->text,str,g_stringsize); + th->next=*g_stacktop; + *g_stacktop=th; +} + +static char * __stdcall getuservariable(const int varnum) +{ + if (varnum < 0 || varnum >= __INST_LAST) return NULL; + return g_variables+varnum*g_stringsize; +} + +static void __stdcall setuservariable(const int varnum, const char *var) +{ + if (var != NULL && varnum >= 0 && varnum < __INST_LAST) + lstrcpy(g_variables + varnum*g_stringsize, var); +} + + + +#endif//_EXDLL_H_ \ No newline at end of file diff --git a/data/nsis/Contrib/nsisunz/info.rtf b/data/nsis/Contrib/nsisunz/info.rtf new file mode 100644 index 0000000000000000000000000000000000000000..b3586dc4d4dceda120a8d435b842d7e7419147cd GIT binary patch literal 641 zcmZ9KPjA#P5XCuH>UWqUAdyX$-AjAr&>o6Fi#VW>kQ0xSQ4>3OCJkk^-Swn>`3a?!=w$*mOMNc7=M+_;d*1dg{7-VJ<3}gPa#n5yv3uy`8DSH>) z?df!Vb;S4BQl#uOWq6RFHZqY$_!fsoSx zKkmPP%T32mB*o%-eTDV^%55g6rbuyBnuNf`q#fmp#XmQ4a{tPnq!}w zH^RkkaX*`z0&rByk+gtMmu)f_xGjm=XfEesdQySqi~(e5x|9rL`ESxNrbyA2JKBiN z%r5F;{UTwwe%*PIe1#IQt9Wb7Ung!JzwtnDAf3h)-Y3gRJC=8^+3>$?mf|e+IkTz- zQ$NGOS&G>zxl03$uB993RL7gmW}u;_EQMwslP`>Sv);i^IUm`)B){fwFXqi(BMsp# literal 0 HcmV?d00001 diff --git a/data/nsis/Contrib/nsisunz/miniclib.c b/data/nsis/Contrib/nsisunz/miniclib.c new file mode 100644 index 000000000..25d6c45d6 --- /dev/null +++ b/data/nsis/Contrib/nsisunz/miniclib.c @@ -0,0 +1,366 @@ +/* Public Domain [mini] c runtime library replacements for Win32 + * KJD + */ + +#include "miniclib.h" + +int errno = ESUCCESS; + +FILE *stdin=NULL, *stdout=NULL, *stderr=NULL; + +#define setStdFileHnd(f,h) \ + f = (FILE *)malloc(sizeof(FILE)); \ + if (f != NULL) \ + { \ + f->handle = GetStdHandle(h); \ + f->eof = 0; \ + f->err = 0; \ + } + +/* DLL entry function, needs to be __stdcall, but must be extern "C" for proper decoration (name mangling) */ +/*extern "C"*/ BOOL WINAPI DllMain(HANDLE _hModule, DWORD ul_reason_for_call, LPVOID lpReserved); +/*extern "C"*/ BOOL WINAPI _DllMainCRTStartup(HANDLE _hModule, DWORD ul_reason_for_call, LPVOID lpReserved) +{ + mCRTinit(); + return DllMain(_hModule, ul_reason_for_call, lpReserved); +} + + +/* you must call this before using any other function!!! */ +void mCRTinit(void) +{ + setStdFileHnd(stdin, STD_INPUT_HANDLE); + setStdFileHnd(stdout, STD_OUTPUT_HANDLE); + setStdFileHnd(stderr, STD_ERROR_HANDLE); +} + + +void * malloc(size_t size) +{ + return HeapAlloc(GetProcessHeap(), 0, size); +} + +void * calloc(size_t num, size_t size) +{ + return HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, num*size); +} + +void free(void *ptr) +{ + HeapFree(GetProcessHeap(), 0, ptr); +} + +void * realloc(void *ptr, size_t size) +{ + if (ptr == NULL) return malloc(size); + + if (!size) + { + free(ptr); + return NULL; + } + else + return HeapReAlloc( GetProcessHeap(), 0, ptr, size ); +} + + +char * strdup(const char *str) +{ + char *t = (char *)malloc(lstrlen(str)+1); + if (t != NULL) lstrcpy(t, str); + return t; +} + +char * strrchr(const char *str, int c) +{ + register const char *t = str + strlen(str); /* assumes str is '\0' terminated */ + while (t >= str) + { + if (*t == (char)c) return (char *)t; + t--; + } + + return NULL; +} + +char *strstr(const char *str, const char *substr) +{ + const char *s=substr; + int slen = strlen(substr); + /* set end to last character where substring could start and match */ + const char *end = str + strlen(str) - slen; /* assumes str is '\0' terminated */ + + if (!slen) return (char *)str; /* return str if substr is empty */ + + while (str <= end) + { + if (*str == *s) + { + s++; + if (*s == '\0') return (char *)(str-slen); /* match found */ + } + else + { + s = substr; /* reset where we match within substring to start at beginning */ + } + + str++; /* check next character */ + } + + return NULL; /* no match */ +} + +/* memmove,memcpy,memset,&memcmp from Paul Edwards public domain clib */ +void * memmove(void *s1, const void *s2, size_t n) +{ + char *p = s1; + const char *cs2 = s2; + size_t x; + + if (p <= cs2) + { + for (x=0; x < n; x++) + { + *p = *cs2; + p++; + cs2++; + } + } + else + { + if (n != 0) + { + for (x=n-1; x > 0; x--) + { + *(p+x) = *(cs2+x); + } + } + *(p+x) = *(cs2+x); + } + return (s1); +} + +// MSVC [6&7] Professional+ these are intrinsic +// and this causes a duplicate function error, +// but on Standard they are not intrinsic or if +// forced as functions then these are needed. +#ifdef NO_INTRINSIC_MEMFUNCS +void *memcpy(void *s1, const void *s2, size_t n) +{ + register unsigned int *p = (unsigned int *)s1; + register unsigned int *cs2 = (unsigned int *)s2; + register unsigned int *endi; + + endi = (unsigned int *)((char *)p + (n & ~0x03)); + while (p != endi) + { + *p++ = *cs2++; + } + switch (n & 0x03) + { + case 0: + break; + case 1: + *(char *)p = *(char *)cs2; + break; + case 2: + *(char *)p = *(char *)cs2; + p = (unsigned int *)((char *)p + 1); + cs2 = (unsigned int *)((char *)cs2 + 1); + *(char *)p = *(char *)cs2; + break; + case 3: + *(char *)p = *(char *)cs2; + p = (unsigned int *)((char *)p + 1); + cs2 = (unsigned int *)((char *)cs2 + 1); + *(char *)p = *(char *)cs2; + p = (unsigned int *)((char *)p + 1); + cs2 = (unsigned int *)((char *)cs2 + 1); + *(char *)p = *(char *)cs2; + break; + } + return (s1); +} + +void *memset(void *s, int c, size_t n) +{ + size_t x = 0; + + for (x = 0; x < n; x++) + { + *((char *)s + x) = (unsigned char)c; + } + return (s); +} + +int memcmp(const void *s1, const void *s2, size_t n) +{ + const unsigned char *p1; + const unsigned char *p2; + size_t x = 0; + + p1 = (const unsigned char *)s1; + p2 = (const unsigned char *)s2; + while (x < n) + { + if (p1[x] < p2[x]) return (-1); + else if (p1[x] > p2[x]) return (1); + x++; + } + return (0); +} +#endif + + +/* fopen, only r[b],w[b],r[b]+,w[b]+ supported, that is a (append is not) */ +FILE * fopen(const char *filename, const char *mode) +{ + DWORD dwAccess, dwCreate; + FILE *f; + + if (strrchr(mode, 'r') != NULL) + { + dwAccess = GENERIC_READ; + dwCreate = OPEN_EXISTING; + if (strrchr(mode, '+') != NULL) + dwAccess |= GENERIC_WRITE; + } + else if (strrchr(mode, 'w') != NULL) + { + dwAccess = GENERIC_WRITE; + dwCreate = CREATE_ALWAYS; + if (strrchr(mode, '+') != NULL) + dwAccess |= GENERIC_READ; + } + else /* unknown mode */ + { + errno = EINVAL; + return NULL; + } + + f = (FILE *)malloc(sizeof(FILE)); + if (f == NULL) + { + errno = ENOMEM; + return NULL; + } + + /* initialize all values here */ + f->eof = 0; + f->err = 0; + + f->handle = CreateFile(filename,dwAccess,FILE_SHARE_READ,NULL,dwCreate,FILE_ATTRIBUTE_NORMAL,NULL); + if (f->handle == INVALID_HANDLE_VALUE) + { + switch (GetLastError()) + { + case ERROR_ALREADY_EXISTS : + errno = EEXIST; + break; + default: + errno = EACCES; + break; + } + free(f); + f = NULL; + } + + return f; +} + +size_t fwrite(const void *buffer, long size, long count, FILE *f) +{ + unsigned long bytes_written; + if (!size || !count) return 0; + if (!WriteFile(f->handle,(LPVOID)buffer,size*count,&bytes_written,NULL)) + f->err = 1; + return (size_t)(bytes_written/size); /* returns items written, not bytes written */ +} + +size_t fread(const void *buffer, long size, long count, FILE *f) +{ + unsigned long bytes_read; + if (!size || !count) return 0; + if (!ReadFile(f->handle,(LPVOID)buffer,size*count,&bytes_read,NULL)) + f->err = 1; + else + if (bytes_read == 0) f->eof = 1; + return (size_t)(bytes_read/size); /* returns items read, not bytes read */ +} + +int fclose(FILE *f) +{ + int retvalue = 0; + if (f != NULL) + { + if (f->handle != INVALID_HANDLE_VALUE) + retvalue = !CloseHandle(f->handle); + free(f); + } + return retvalue; +} + +int fprintf(FILE *f, const char *format, ...) +{ + char buf[1024]; + va_list argptr; + va_start(argptr, format); + wvsprintf (buf, format, argptr); + va_end(argptr); + return fwrite(buf,1,strlen(buf)+1,f); +} + +int sprintf(char *buf, const char *format, ...) +{ + int retval; + va_list argptr; + va_start(argptr, format); + retval = wvsprintf (buf, format, argptr); + va_end(argptr); + return retval; +} + +int fputc(int c, FILE *f) +{ + char buffer = (char)c; + if (!fwrite(&buffer, 1, 1, f)) + return -1; + else + return c; +} + + +DWORD map_origin[3] = { FILE_BEGIN, FILE_CURRENT, FILE_END }; + +int fseek(FILE *f, long offset, int origin) +{ + if (SetFilePointer(f->handle, offset, 0, map_origin[origin]) != 0xFFFFFFFF) + return 0; + else + return -1; +} + +long ftell(FILE *f) +{ + return SetFilePointer(f->handle, 0, 0, FILE_CURRENT); +} + +void rewind(FILE *f) +{ + fseek(f, 0L, SEEK_SET); + f->eof = 0; + f->err = 0; +} + +int fflush(FILE *f) +{ + /* nothing really to flush, so do nothing and return ok */ + return 0; +} + +FILE *_fdopen(int handle, const char *mode) +{ + /* TODO */ + return NULL; +} + diff --git a/data/nsis/Contrib/nsisunz/miniclib.h b/data/nsis/Contrib/nsisunz/miniclib.h new file mode 100644 index 000000000..dfc73dadb --- /dev/null +++ b/data/nsis/Contrib/nsisunz/miniclib.h @@ -0,0 +1,110 @@ +/* Public Domain [mini] c runtime library replacements for Win32 */ + +/* include this file before or instead of + as its string functions conflict with string.h + */ + +#ifndef _MINI_CRT_LIB_ +#define _MINI_CRT_LIB_ + +#ifdef __cplusplus +extern "C" { +#endif + +/* you must call this before using any other function!!! */ +void mCRTinit(void); + +typedef unsigned long time_t; +typedef unsigned size_t; + +extern int errno; + +#ifndef NULL +#ifdef __cplusplus +#define NULL 0 +#else +#define NULL ((void *)0) +#endif +#endif + +void * malloc(size_t size); +void * calloc(size_t num, size_t size); +void free(void *ptr); +void * realloc(void *ptr, size_t size); +char * strdup(const char *str); +char * strrchr(const char *str, int c); +char *strstr(const char *str, const char *substr); + +#define strlen lstrlen +#define strcpy lstrcpy +#define strcat lstrcat +#define strcmp lstrcmp + +// MSVC [6&7] Professional+ these are intrinsic +// and this causes a duplicate function error, +// but on Standard they are not intrinsic or if +// forced as functions then these are needed. +#define NO_INTRINSIC_MEMFUNCS 1 +#if defined(_MSC_VER) && defined(NO_INTRINSIC_MEMFUNCS) +/* Ensure these are treated as functions and not inlined as intrinsics, or disable /Oi */ +#pragma warning(disable:4164) // intrinsic function not declared +#pragma function(memcpy, memset, memcmp) +#endif +void * memmove(void *s1, const void *s2, size_t n); +void *memcpy(void *s1, const void *s2, size_t n); +void *memset(void *s, int c, size_t n); +int memcmp(const void *s1, const void *s2, size_t n); + +#define ESUCCESS 0 +#define ENOMEM 12 +#define EACCES 13 +#define EEXIST 17 +#define EINVAL 22 + +#define EOF -1 + +typedef struct FILE +{ + /*HANDLE*/void * handle; + int eof; /* used by feof macro to determine if read ended with error or end of file */ + int err; /* used by ferror macro to indicate error condition encountered */ +} FILE; + +extern FILE *stdin, *stdout, *stderr; + +#define feof(f) f->eof +#define ferror(f) f->err + +/* fopen, only r[b],w[b],r[b]+,w[b]+ supported, that is a (append is not) */ +FILE * fopen(const char *filename, const char *mode); +size_t fwrite(const void *buffer, long size, long count, FILE *f); +size_t fread(const void *buffer, long size, long count, FILE *f); +int fclose(FILE *f); + +int fprintf(FILE *f, const char *format, ...); +int sprintf(char *buf, const char *format, ...); +#define vsprintf wvsprintf +int fputc(int c, FILE *f); + +#define SEEK_SET 0 +#define SEEK_CUR 1 +#define SEEK_END 2 + +int fseek(FILE *f, long offset, int origin); +long ftell(FILE *f); +void rewind(FILE *f); + +/* just stubs */ +int fflush(FILE *f); +FILE *_fdopen(int handle, const char *mode); + +#ifdef __cplusplus +} +#endif + +#define WIN32_LEAN_AND_MEAN +#define _INC_STRING /* don't allow windows.h to include MS clib's string.h */ +#define _INC_MEMORY +#include + +#endif /* _MINI_CRT_LIB_ */ diff --git a/data/nsis/Contrib/nsisunz/nsisunz.cpp b/data/nsis/Contrib/nsisunz/nsisunz.cpp new file mode 100644 index 000000000..e6ce3f422 --- /dev/null +++ b/data/nsis/Contrib/nsisunz/nsisunz.cpp @@ -0,0 +1,567 @@ +/* +UnZip Plug-in for NSIS +Written by Saivert + +Credits: + - Based on code in NSIS Zip2Exe + portions Copyright © 1999-2001 Miguel Garrido (mgarrido01@hotmail.com) + - Uses ZLIB - Copyright © Mark Adler + - ZIP format routines - Copyright (C) 1998 Gilles Vollant + + Even though this project is an NSIS Plug-in, it also + exports a function that can be used by any applications. + The exported function is "appextract" +*/ +//#include "AggressiveOptimize.h" +#include +//#include +#include "miniclib.h" +#include +#include "exdll.h" + +extern "C" { +#include "zlib/unzip.h" +}; + +//Strings used all over the place +char szSuccess[] = {'s','u','c','c','e','s','s',0}; +char szFile[] = {'/','f','i','l','e',0}; +char szNoextractpath[] = {'/','n','o','e','x','t','r','a','c','t','p','a','t','h',0}; +char szDefExtractText[] = {'E','x','t','r','a','c','t',':',' ','%','f',0}; + +char g_extract_text[1024]; + +int g_extracting; +HWND g_hwndParent; +char tempzip_path[1024]; + +void internal_unzip(int); + +CRITICAL_SECTION cs; + +//Log stuff +HWND g_hwndList; +HWND g_hwndStatus; +void LogMessage(HWND, const char *, int = 0); + + +extern "C" BOOL WINAPI DllMain(HANDLE hInst, ULONG ul_reason_for_call, LPVOID lpReserved) +{ + switch (ul_reason_for_call) + { + //case DLL_THREAD_ATTACH: + case DLL_PROCESS_ATTACH: + InitializeCriticalSection(&cs); + break; + //case DLL_THREAD_DETACH: + case DLL_PROCESS_DETACH: + DeleteCriticalSection(&cs); + break; + } + return TRUE; +} + +void doMKDir(char *directory) +{ + char *p, *p2; + char buf[MAX_PATH]; + if (!*directory) return; + lstrcpy(buf,directory); + p=buf; while (*p) p++; + while (p >= buf && *p != '\\') p--; + p2 = buf; + if (p2[1] == ':') p2+=4; + else if (p2[0] == '\\' && p2[1] == '\\') + { + p2+=2; + while (*p2 && *p2 != '\\') p2++; + if (*p2) p2++; + while (*p2 && *p2 != '\\') p2++; + if (*p2) p2++; + } + if (p >= p2) + { + *p=0; + doMKDir(buf); + } + CreateDirectory(directory,NULL); +} + +//Based on inttosizestr from NSIS exehead project. +//Creates a string representing the size of a file, +//choosing the unit that's best suited. +static char * FormatDiskSize(char *str, unsigned long b) +{ + char scale='k'; + char sh=30; + char s=0; + + if (b <= (1024*1024) ) sh=10, scale='k'; + else if (b <= (1024*1024*1024)) sh=20, scale='M'; + else if (GetVersion()&0x80000000) s='+'; //only display '+' on GB shown on Win95 + + if (b >= 1000) //represent everything above 1000 bytes as 0,xx kB + { + wsprintf(str, "%d.%d%d %cB%c", + b>>sh, ((b*10)>>sh)%10, ((b*20)>>sh)%10, scale, s); + if (b < 1024) + wsprintf(str+strlen(str), " (%u byte%c)", b, b == 1?0:'s'); + } + else + wsprintf(str, "%u byte%c", b, b == 1?0:'s'); + + return str; +} + +/* A simple format parser + * Handles %f, %c and %u + * size of out must be twice as large as size of str + */ +static char * parse(const char *str, char *out, int outlen, + char *filename, + unsigned long compressed, + unsigned long uncompressed, + unsigned int nkb) +{ + char s[32]; + const char *p; + UINT i=0; + p=str-1; + memset(out, 0, outlen); + + while (p++ && (*p != 0)) + { + if (*p == '%') + { + switch (*(p+1)) + { + case 'c': + case 'C': + { + FormatDiskSize(s, compressed); + lstrcat(out, s); + i += lstrlen(s); + break; + } + case 'u': + case 'U': + { + FormatDiskSize(s, uncompressed); + lstrcat(out, s); + i += lstrlen(s); + break; + } + case 'f': + case 'F': + { + lstrcat(out, filename); + i += lstrlen(filename); + break; + } + case 'p': + case 'P': + { + unsigned int j; + j = uncompressed; + if (!j) j = 1; + wsprintf(s, "%d%%", nkb*100/j); + lstrcat(out, s); + i += lstrlen(s); + break; + } + case 'b': + case 'B': + { + FormatDiskSize(s, nkb); + lstrcat(out, s); + i += lstrlen(s); + break; + } + default: out[i++] = *p; + } + ++p; + } else { + out[i++] = *p; + } + } + return out; +} + +extern "C" __declspec(dllexport) +void Unzip(HWND hwndParent, int string_size, char *variables, stack_t **stacktop) +{ + EXDLL_INIT(); + g_hwndParent = hwndParent; + internal_unzip(0); +} + +extern "C" __declspec(dllexport) +void UnzipToLog(HWND hwndParent, int string_size, char *variables, stack_t **stacktop) +{ + EXDLL_INIT(); + g_hwndParent = hwndParent; + internal_unzip(1); +} + +extern "C" __declspec(dllexport) +void UnzipToStack(HWND hwndParent, int string_size, char *variables, stack_t **stacktop) +{ + EXDLL_INIT(); + g_hwndParent = hwndParent; + internal_unzip(2); +} + +// This function is to be used by rundll32.exe. Call it like this: +// +// rundll32.exe "c:\a path\nsisunz.dll",extract_RunDLL c:\path\zipfile.zip c:\outdir +// +// or to extract a single file, use this (concatenate the next two lines): +// +// rundll32.exe c:\path\nsisunz.dll,extract_RunDLL +// /file readme.txt "c:\a path\zipfile.zip" c:\outdir +// +// "/noextractpath" is implicitly used if "/file" is used. +// It mimics NSIS itself by setting up a stack and pushing the +// parameters from the function on the stack. I made it like this +// so I could directly reuse the code I already had written without modifications. +extern "C" __declspec(dllexport) +void extract_RunDLL(HINSTANCE hAppInstance, LPVOID unused, char *params) +{ + char res[1024]; + char temp[256]; + char zipfile[MAX_PATH]={0,}; + char destdir[MAX_PATH]={0,}; + char file[MAX_PATH]={0,}; + char *p = params; + char *s; + char q=0; + int next=0; +#define NEXT_FILE 1 +#define NEXT_ZIP 2 +#define NEXT_DEST 3 + + stack_t ownstacktop; + stack_t *pownstacktop = &ownstacktop; + + ownstacktop.next = NULL; + ownstacktop.text[0] = NULL; + + g_stringsize=1024; + g_stacktop=&pownstacktop; + g_variables=NULL; + + //Parse the parameters + //While we do the parsing we use next as a clue to + //what comes next. This way I don't have to write a + //new function. + while (*p) + { + if (*p=='"') q='"', p++; else q=' '; //Do we search for a quote or a space? + s = temp; + while (*p && *p != q) *s++ = *p++; //Copy chars from params to zipfile + *s = 0; //Terminate string + if (next==NEXT_FILE) lstrcpy(file, temp), next=NEXT_ZIP; + else if (next==NEXT_ZIP) lstrcpy(zipfile, temp), next=NEXT_DEST; + else if (next==NEXT_DEST) lstrcpy(destdir, temp), next=0; + else if (!lstrcmpi(temp, szFile)) next=NEXT_FILE; + else lstrcpy(zipfile, temp), next=NEXT_DEST; + + while (*p && *++p == ' '); + } + + pushstring(destdir); + pushstring(zipfile); + + if (file[0]) + { + pushstring(file); + pushstring(szFile); + pushstring(szNoextractpath); + } + + internal_unzip(0); + popstring(res); + if (lstrcmp(res, szSuccess)) + MessageBox(0, res, NULL, MB_ICONERROR); +} + +void internal_unzip(int uselog) +{ + //All char baby (or should I use int for the non-string stuff??) + char first=0; + char filefound=0; + char usefile=0; + char hastext=0; + char noextractpath=0; + char filetoextract[MAX_PATH+1]; + char buf[1024]; + char fn[MAX_PATH+1]; + + popstring(buf); + while (buf[0] == '/') + { + if (!lstrcmpi(buf+1, "text")) popstring(g_extract_text), hastext++; + if (!lstrcmpi(buf+1, "noextractpath")) noextractpath++; + if (!lstrcmpi(buf+1, "file")) + { + char *p; + popstring(filetoextract); + // Ensure filename uses backslashes + p = filetoextract; + while (*p) + { + if (*p == '/') *p='\\'; + p++; + } + usefile++; + } + + //if stack is empty, bail out + if (popstring(buf)) + *buf = 0; + } + //check for first required param + if (*buf) + lstrcpyn(fn, buf, MAX_PATH); + else + { + pushstring("Error reading ZIP filename parameter"); + return; + } + + if (popstring(tempzip_path)) + { + pushstring("Error reading destination directory parameter"); + return; + } + + if (uselog==1) + { + if (!hastext) lstrcpy(g_extract_text, szDefExtractText); + } + + unzFile f; + f = unzOpen(fn); + if (!f || unzGoToFirstFile(f) != UNZ_OK) + { + if (f) unzClose(f); + pushstring("Error opening ZIP file"); + return; + } + + int nf=0, nb=0; + unz_file_info fileinfo; + g_extracting=1; + do { + char filename[MAX_PATH]; + unzGetCurrentFileInfo(f,&fileinfo,filename,sizeof(filename),NULL,0,NULL,0); + + if (filename[0] && + filename[strlen(filename)-1] != '\\' && + filename[strlen(filename)-1] != '/') + { + char *pfn=filename; + //ensure path uses backslashes + while (*pfn) + { + if (*pfn == '/') *pfn='\\'; + pfn++; + } + + if (usefile) + { + if (lstrcmpi(filename, filetoextract) != 0) continue; + else filefound++; + } + + pfn=filename; + if (pfn[1] == ':' && pfn[2] == '\\') pfn+=3; + while (*pfn == '\\') pfn++; + + if (noextractpath) + { + char buf[MAX_PATH]; + lstrcpy(buf,filename); + char *p=buf+strlen(buf); + while (p > buf && *p != '\\' && *p != '/') p = CharPrev(buf, p); + if (p > buf) p++; + lstrcpy(filename, p); + } + + char out_filename[1024]; + lstrcpy(out_filename,tempzip_path); + lstrcat(out_filename,"\\"); + lstrcat(out_filename,pfn); + if (strstr(pfn,"\\")) + { + char buf[1024]; + lstrcpy(buf,out_filename); + char *p=buf+strlen(buf); + while (p > buf && *p != '\\') p--; + *p=0; + if (buf[0]) doMKDir(buf); + } + + if (unzOpenCurrentFile(f) == UNZ_OK) + { + FILE *fp; + int l; + fp = fopen(out_filename,"wb"); + if (fp) + { + if (uselog==1) { + char logtmp[256]; + parse(g_extract_text, logtmp, sizeof(logtmp), + pfn, fileinfo.compressed_size, fileinfo.uncompressed_size, 0); + LogMessage(g_hwndParent, logtmp); + } else if (uselog == 2) { + if (!first) + { + pushstring(""); //push list terminator (empty string) + first++; + } + pushstring(pfn); + } + nb=0; + do + { + char buf[1024]; + l=unzReadCurrentFile(f,buf,sizeof(buf)); + if (l > 0) + { + if (fwrite(buf,1,l,fp) != (unsigned int)l) + { + unzClose(f); + fclose(fp); + pushstring("Error writing output file(s)"); + g_extracting=0; + return; + } + + if (!g_extracting) + { + unzClose(f); + fclose(fp); + g_extracting=0; + pushstring("aborted"); + return; + } + } + + if (uselog==1 && (nb % 1024)) + { + char logtmp[256]; + parse(g_extract_text, logtmp, sizeof(logtmp), + pfn, fileinfo.compressed_size, + fileinfo.uncompressed_size, nb); + LogMessage(g_hwndParent, logtmp, 1); + } + nb += l; + } while (l > 0); + + fclose(fp); + } + else + { + unzClose(f); + pushstring("Error opening output file(s)"); + g_extracting=0; + return; + } + nf++; + + int quit=0; + if (g_hwndParent) + { + MSG msg; + while (PeekMessage(&msg,NULL,0,0,PM_REMOVE)) + { + if (msg.message == WM_DESTROY && msg.hwnd == g_hwndParent) + { + quit++; + break; + } + TranslateMessage(&msg); + DispatchMessage(&msg); + } + } + unzCloseCurrentFile(f); + if (quit) break; + } + else + { + unzClose(f); + pushstring("Error extracting from ZIP file"); + g_extracting=0; + return; + } + } + } while (unzGoToNextFile(f) == UNZ_OK); + + g_extracting=0; + if (usefile && !filefound) { + pushstring("File not found in archive"); + } else { + pushstring(szSuccess); + } + unzClose(f); + return; +} + +// Tim Kosse's LogMessage +void LogMessage(HWND hwndParent, const char *pStr, int changelast) { + static HWND hwndList=0; + static HWND hwndStatus=0; + LVITEM item={0}; + int nItemCount; + if (!hwndParent) return; + + EnterCriticalSection(&cs); + + //Get ListView control on instfiles page (the log) + if (!hwndList) hwndList = FindWindowEx( + FindWindowEx(hwndParent, NULL, "#32770", NULL), + NULL, "SysListView32", NULL); + + //Get status "STATIC" control above progressbar + if (!hwndStatus) hwndStatus = GetDlgItem( + FindWindowEx(hwndParent, NULL, "#32770", NULL), + 1006); + + if (!hwndList || !hwndStatus) return; + + SendMessage(hwndStatus, WM_SETTEXT, 0, (LPARAM)pStr);//added by Saivert + nItemCount=SendMessage(hwndList, LVM_GETITEMCOUNT, 0, 0); + + item.mask=LVIF_TEXT; + item.pszText=(char *)pStr; + item.cchTextMax=0; + item.iItem=changelast?nItemCount-1:nItemCount; + + if (changelast) { + ListView_SetItem(hwndList, &item); + } else { + ListView_InsertItem(hwndList, &item); + } + ListView_EnsureVisible(hwndList, item.iItem, 0); + + LeaveCriticalSection(&cs); +} + +// EXPERIMENTAL THREAD BASED EXTRACTION +/* +extern "C" __declspec(dllexport) +UnzipToLogUsingThread(HWND hwndParent, int string_size, char *variables, stack_t **stacktop) +{ + MSG msg; + DWORD dwTID; + + CreateThread(NULL, 0, UnzipThread, (LPVOID)1, 0, &dwTID); +} + +DWORD WINAPI UnzipThread(LPVOID p) +{ + int uselog = 1; + return 0; +} +*/ \ No newline at end of file diff --git a/data/nsis/Contrib/nsisunz/nsisunz.dsp b/data/nsis/Contrib/nsisunz/nsisunz.dsp new file mode 100644 index 000000000..ec6c87c32 --- /dev/null +++ b/data/nsis/Contrib/nsisunz/nsisunz.dsp @@ -0,0 +1,170 @@ +# Microsoft Developer Studio Project File - Name="nsisunz" - Package Owner=<4> +# Microsoft Developer Studio Generated Build File, Format Version 6.00 +# ** DO NOT EDIT ** + +# TARGTYPE "Win32 (x86) Dynamic-Link Library" 0x0102 + +CFG=nsisunz - Win32 Debug +!MESSAGE This is not a valid makefile. To build this project using NMAKE, +!MESSAGE use the Export Makefile command and run +!MESSAGE +!MESSAGE NMAKE /f "nsisunz.mak". +!MESSAGE +!MESSAGE You can specify a configuration when running NMAKE +!MESSAGE by defining the macro CFG on the command line. For example: +!MESSAGE +!MESSAGE NMAKE /f "nsisunz.mak" CFG="nsisunz - Win32 Debug" +!MESSAGE +!MESSAGE Possible choices for configuration are: +!MESSAGE +!MESSAGE "nsisunz - Win32 Release" (based on "Win32 (x86) Dynamic-Link Library") +!MESSAGE "nsisunz - Win32 Debug" (based on "Win32 (x86) Dynamic-Link Library") +!MESSAGE + +# Begin Project +# PROP AllowPerConfigDependencies 0 +# PROP Scc_ProjName "" +# PROP Scc_LocalPath "" +CPP=cl.exe +MTL=midl.exe +RSC=rc.exe + +!IF "$(CFG)" == "nsisunz - Win32 Release" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 0 +# PROP BASE Output_Dir "Release" +# PROP BASE Intermediate_Dir "Release" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 0 +# PROP Output_Dir "Release" +# PROP Intermediate_Dir "Release" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /MT /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "UNZIP_EXPORTS" /YX /FD /c +# ADD CPP /nologo /MT /W3 /O1 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "UNZIP_EXPORTS" /YX /Gs32000 /FD /c +# ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /win32 +# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /win32 +# ADD BASE RSC /l 0x414 /d "NDEBUG" +# ADD RSC /l 0x414 /d "NDEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /machine:I386 +# ADD LINK32 kernel32.lib user32.lib /nologo /dll /machine:I386 /nodefaultlib /out:"..\..\plugins\nsisunz.dll" + +!ELSEIF "$(CFG)" == "nsisunz - Win32 Debug" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 1 +# PROP BASE Output_Dir "Debug" +# PROP BASE Intermediate_Dir "Debug" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 1 +# PROP Output_Dir "Debug" +# PROP Intermediate_Dir "Debug" +# PROP Target_Dir "" +# ADD BASE CPP /nologo /MTd /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "UNZIP_EXPORTS" /YX /FD /GZ /c +# ADD CPP /nologo /MTd /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "UNZIP_EXPORTS" /FR /YX /FD /GZ /c +# ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /win32 +# ADD MTL /nologo /D "_DEBUG" /mktyplib203 /win32 +# ADD BASE RSC /l 0x414 /d "_DEBUG" +# ADD RSC /l 0x414 /d "_DEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /debug /machine:I386 /pdbtype:sept +# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /debug /machine:I386 /pdbtype:sept + +!ENDIF + +# Begin Target + +# Name "nsisunz - Win32 Release" +# Name "nsisunz - Win32 Debug" +# Begin Group "Source Files" + +# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat" +# Begin Source File + +SOURCE=.\zlib\ADLER32.C +# End Source File +# Begin Source File + +SOURCE=.\zlib\CRC32.C +# End Source File +# Begin Source File + +SOURCE=.\zlib\INFFAST.C +# End Source File +# Begin Source File + +SOURCE=.\zlib\INFLATE.C +# End Source File +# Begin Source File + +SOURCE=.\zlib\INFTREES.C +# End Source File +# Begin Source File + +SOURCE=.\miniclib.c +# End Source File +# Begin Source File + +SOURCE=.\nsisunz.cpp +# End Source File +# Begin Source File + +SOURCE=.\zlib\Unzip.c +# End Source File +# Begin Source File + +SOURCE=.\zlib\Zutil.c +# End Source File +# End Group +# Begin Group "Header Files" + +# PROP Default_Filter "h;hpp;hxx;hm;inl" +# Begin Source File + +SOURCE=.\zlib\INFFAST.H +# End Source File +# Begin Source File + +SOURCE=.\zlib\INFFIXED.H +# End Source File +# Begin Source File + +SOURCE=.\zlib\INFTREES.H +# End Source File +# Begin Source File + +SOURCE=.\miniclib.h +# End Source File +# Begin Source File + +SOURCE=.\zlib\UNZIP.H +# End Source File +# Begin Source File + +SOURCE=.\zlib\ZCONF.H +# End Source File +# Begin Source File + +SOURCE=.\zlib\ZLIB.H +# End Source File +# Begin Source File + +SOURCE=.\zlib\ZUTIL.H +# End Source File +# End Group +# Begin Group "Resource Files" + +# PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe" +# End Group +# End Target +# End Project diff --git a/data/nsis/Contrib/nsisunz/nsisunz.dsw b/data/nsis/Contrib/nsisunz/nsisunz.dsw new file mode 100644 index 000000000..3193dba40 --- /dev/null +++ b/data/nsis/Contrib/nsisunz/nsisunz.dsw @@ -0,0 +1,29 @@ +Microsoft Developer Studio Workspace File, Format Version 6.00 +# WARNING: DO NOT EDIT OR DELETE THIS WORKSPACE FILE! + +############################################################################### + +Project: "nsisunz"=.\nsisunz.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ +}}} + +############################################################################### + +Global: + +Package=<5> +{{{ +}}} + +Package=<3> +{{{ +}}} + +############################################################################### + diff --git a/data/nsis/Contrib/nsisunz/nsisunz.ncb b/data/nsis/Contrib/nsisunz/nsisunz.ncb new file mode 100644 index 0000000000000000000000000000000000000000..d6fa4e8d7fad7b81027bb1d7ac6eedefbde30a83 GIT binary patch literal 82944 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 + +
+

Build Log

+

+--------------------Configuration: nsisunz - Win32 Release-------------------- +

+

Command Lines

+Creating temporary file "C:\TEMP\RSP11E.tmp" with contents +[ +/nologo /MT /W3 /O1 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "UNZIP_EXPORTS" /Fp"Release/nsisunz.pch" /YX /Fo"Release/" /Fd"Release/" /Gs32000 /FD /c +"C:\tmp\NSIS2\Contrib\nsisunz\zlib\ADLER32.C" +"C:\tmp\NSIS2\Contrib\nsisunz\zlib\CRC32.C" +"C:\tmp\NSIS2\Contrib\nsisunz\zlib\INFFAST.C" +"C:\tmp\NSIS2\Contrib\nsisunz\zlib\INFLATE.C" +"C:\tmp\NSIS2\Contrib\nsisunz\zlib\INFTREES.C" +"C:\tmp\NSIS2\Contrib\nsisunz\nsisunz.cpp" +"C:\tmp\NSIS2\Contrib\nsisunz\zlib\Unzip.c" +"C:\tmp\NSIS2\Contrib\nsisunz\zlib\Zutil.c" +"C:\tmp\NSIS2\Contrib\nsisunz\miniclib.c" +] +Creating command line "cl.exe @C:\TEMP\RSP11E.tmp" +Creating temporary file "C:\TEMP\RSP11F.tmp" with contents +[ +kernel32.lib user32.lib /nologo /dll /incremental:no /pdb:"Release/nsisunz.pdb" /machine:I386 /nodefaultlib /out:"..\..\plugins\nsisunz.dll" /implib:"Release/nsisunz.lib" +.\Release\ADLER32.OBJ +.\Release\CRC32.OBJ +.\Release\INFFAST.OBJ +.\Release\INFLATE.OBJ +.\Release\INFTREES.OBJ +.\Release\nsisunz.obj +.\Release\Unzip.obj +.\Release\Zutil.obj +.\Release\miniclib.obj +] +Creating command line "link.exe @C:\TEMP\RSP11F.tmp" +

Output Window

+Compiling... +ADLER32.C +CRC32.C +INFFAST.C +INFLATE.C +INFTREES.C +nsisunz.cpp +Unzip.c +Zutil.c +miniclib.c +Linking... + Creating library Release/nsisunz.lib and object Release/nsisunz.exp + + + +

Results

+nsisunz.dll - 0 error(s), 0 warning(s) +
+ + diff --git a/data/nsis/Contrib/nsisunz/nsisunz.sln b/data/nsis/Contrib/nsisunz/nsisunz.sln new file mode 100644 index 000000000..b0acb0268 --- /dev/null +++ b/data/nsis/Contrib/nsisunz/nsisunz.sln @@ -0,0 +1,21 @@ +Microsoft Visual Studio Solution File, Format Version 8.00 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "nsisunz", "nsisunz.vcproj", "{8534CD66-1841-45FC-9201-FA3515F5967B}" + ProjectSection(ProjectDependencies) = postProject + EndProjectSection +EndProject +Global + GlobalSection(SolutionConfiguration) = preSolution + Debug = Debug + Release = Release + EndGlobalSection + GlobalSection(ProjectConfiguration) = postSolution + {8534CD66-1841-45FC-9201-FA3515F5967B}.Debug.ActiveCfg = Debug|Win32 + {8534CD66-1841-45FC-9201-FA3515F5967B}.Debug.Build.0 = Debug|Win32 + {8534CD66-1841-45FC-9201-FA3515F5967B}.Release.ActiveCfg = Release|Win32 + {8534CD66-1841-45FC-9201-FA3515F5967B}.Release.Build.0 = Release|Win32 + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + EndGlobalSection + GlobalSection(ExtensibilityAddIns) = postSolution + EndGlobalSection +EndGlobal diff --git a/data/nsis/Contrib/nsisunz/nsisunz.vcproj b/data/nsis/Contrib/nsisunz/nsisunz.vcproj new file mode 100644 index 000000000..f75562a73 --- /dev/null +++ b/data/nsis/Contrib/nsisunz/nsisunz.vcproj @@ -0,0 +1,396 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/data/nsis/Contrib/nsisunz/nsisunz_readme.html b/data/nsis/Contrib/nsisunz/nsisunz_readme.html new file mode 100644 index 000000000..87017bbb0 --- /dev/null +++ b/data/nsis/Contrib/nsisunz/nsisunz_readme.html @@ -0,0 +1,361 @@ + + + +nsisunz + + + + +
+ + + + +
+

nsisunz

+
+

Introduction

+

nsisunz is a NSIS plugin which allows you to extract files from ZIP +archives.

+

nsisunz is great when you use another NSIS plug-in named +NSISdl to download a ZIP file from the internet. +Download a small installer which lets the user choose the components he/she +want to install and the installer downloads it (QuickTime Setup does +this).

+

Note: +nsisunz does not support password protected ZIP archives +(encrypted).
+To extract only a specific file from the archive use the +"/file" option. +

+

How to use

+

Setting it up

+

To see a great example of how to use the plug-in, +check out the included example script.

+

You use the Unzip, UnzipToLog or the +UnzipToStack function to extract files +from a ZIP archive.

+

In my opinion the best way to describe things is by showing an example, +so here is one:

+
+InitPluginsDir
+; Call plug-in. Push filename to ZIP first, and the dest. folder last.
+nsisunz::UnzipToLog "$PLUGINSDIR\myzipfile.zip" "$INSTDIR"
+
+; Always check result on stack
+Pop $0
+StrCmp $0 "success" ok
+  DetailPrint "$0" ;print error message to log
+ok:
+
+; You can also use the "Unzip" function if you don't want to use the log.
+; It is a lot quicker, and is preferred for large ZIP archives.
+nsisunz::Unzip "$PLUGINSDIR\myzipfile.zip" "$INSTDIR"
+
+

The UnzipToStack function

+

The UnzipToStack function can be used instead of the UnzipToLog function +if you want the extraction to be a lot faster when extracting from very large ZIP archives and still +want to see the files extracted. This is how you use it: +

+
+nsisunz::UnzipToStack "$PLUGINSDIR\myzipfile.zip" "$INSTDIR"
+Pop $0
+StrCmp $0 "success" ok
+  DetailPrint "$0" ;print error message to log
+  Goto skiplist
+ok:
+
+; Print out list of files extracted to log
+next:
+  Pop $0
+  DetailPrint $0
+StrCmp $0 "" 0 next ; pop strings until a blank one arrives
+
+skiplist:
+
+

Extracting specific files

+

+To extract only a specific file use the "/file" option like this: +

+
+nsisunz::UnzipToLog /file "AnyPathInsideZIP/AFile.txt" "myzip.zip" "c:\myfiles"
+
+

+The path is relative to the root of the ZIP archive so you don't have to +prepend a slash ("/"). Furthermore the foldernames are extracted with the file so +the example above creates a file named "c:\myfiles\AnyPathInsideZIP\AFile.txt". +To avoid this use "/noextractpath" like this: +

+
+nsisunz::UnzipToLog /noextractpath /file \
+  "AnyPathInsideZIP/AFile.txt" "myzip.zip" "c:\myfiles"
+
+

Using nsisunz with NSISdl

+

To use NSISdl with nsisunz to download and extract a ZIP archive, +do something like this:

+
+InitPluginsDir
+NSISdl::download http://www.domain.com/file "$PLUGINSDIR\localfile.zip"
+Pop $R0 ;Get the return value
+StrCmp $R0 "success" +3
+  MessageBox MB_OK "Download failed: $R0"
+  Quit
+
+nsisunz::UnzipToLog "$PLUGINSDIR\localfile.zip" "$INSTDIR"
+Pop $R0
+StrCmp $R0 "success" +2
+  DetailPrint "$R0" ;print error message to log
+
+
+

Options

+

These are the optional parameters you can specify when calling nsisunz.

+ + + + + + + + + + + + + +
/noextractpathThis option makes the plug-in extract all files to + the destination directory without regard to paths stored in ZIP file. + Is often used in conjunction with "/file" to extract a single file + from anywhere in an archive to a destination directory.
/fileExtract a specific file. Filename must be specified + as next parameter and must match a file in the ZIP including any + subdirectories. If the file couldn't be found in the ZIP file, + nsisunz pushes the string "File not found in ZIP file" on the + stack.
/textSets the format of the text used in the log to the + next param. "%f" is replaced with the filename, "%c" is + replaced with the compressed size and "%u" is replaced with the + uncompressed size. +
+

Return value

+

After you have called the DLL, nsisunz adds either "success" or a specific error message +on the stack. This is the possible error messages:

+
    +
  • Error opening ZIP file
  • +
  • Error opening output file(s)
  • +
  • Error writing output file(s)
  • +
  • Error extracting from ZIP file
  • +
  • File not found in ZIP file
  • +
+

Usually, you don't need to check this value, but you still have to remove it from the stack +(have a look at the example above).

+

Reserve files

+

If you are using BZIP2 (solid) compression, it's important that files which are being extracted +in init- or page functions function are located before other files in the data block, because this +will make your installer faster.

+

If there are File commands in your sections or functions above the init- or page functions, add +ReserveFile commands above your sections and functions:

+
+ReserveFile "myzipfile.zip"
+ReserveFile "${NSISDIR}\Plugins\nsisunz.dll"
+
+

Localization

+

Use the "/text" parameter to localize the text used by nsisunz +for the log output. +

+
+; Localized strings for use with nsisunz
+; The "%f" in the string is replaced with the filename on run-time.
+; "%c" and "%u" is replaced with compressed size and
+; uncompressed size respectively. See example script.
+
+LoadLanguageFile "${NSISDIR}\Contrib\Language files\english.nlf"
+LoadLanguageFile "${NSISDIR}\Contrib\Language files\norwegian.nlf"
+
+LangString nsisunz_text ${LANG_ENGLISH} "Extract: %f"
+LangString nsisunz_text ${LANG_NORWEGIAN} "Pakk ut: %f"
+
+Function .onInit
+  nsisunz:: /text "" "$(nsisunz_text)"
+FunctionEnd
+
+

Notes

+

+The plug-in is compressed with UPX to make it smaller.
+If you make changes to the source, re-compile and use UPX you may get this +message:
+upx: nsisunz.dll: CantPackException: file is possibly packed/protected +(try --force)
+I used the "--force" parameter as proposed, +and without problems UPX reduced the size of nsisunz.dll from ~71 kb +to 31,5 kb
+The reason for why you get this message is that the source #include's +"AggressiveOptimize.h" which makes the linker merge the code sections of the +final executable. This makes UPX think it's already packed (which it kinda is). +But by using the "--force" parameter, UPX may shrink it a lot +more.
+I hope people appreciate my struggles to keep the size of the plug-in small. +If someone have any suggestions for making it even smaller I would like if +someone sendt me an e-mail. +

+

Contact

+

nsisunz is written by Saivert.
+Homepage: +http://saivert.inthegray.com/
+E-mail: saivert@gmail.com + +

+

Version history

+
    +
  • DLL version 1.0 (12/4/2004) +
      +
    • First public release!
    • +
    +
  • +
+

Credits

+

+Based on code in NSIS Zip2Exe
+portions Copyright © 1999-2001 Miguel Garrido (mgarrido01@hotmail.com)
+Uses ZLIB - Copyright © Mark Adler
+ZIP format routines - Copyright © 1998 Gilles Vollant
+Thanks to Tim Kosse for the LogMessage function, even though I +could figure this out myself.
+And thanks to Joost Verburg for the readme HTML page design.

+

License

+
+This software is provided 'as-is', without any express or implied
+warranty. In no event will the authors be held liable for any damages
+arising from the use of this software.
+
+Permission is granted to anyone to use this software for any purpose,
+including commercial applications, and to alter it and redistribute
+it freely, subject to the following restrictions:
+
+1. The origin of this software must not be misrepresented;
+   you must not claim that you wrote the original software.
+   If you use this software in a product, an acknowledgment in the
+   product documentation would be appreciated but is not required.
+2. Altered versions must be plainly marked as such,
+   and must not be misrepresented as being the original software.
+3. This notice may not be removed or altered from any distribution.
+
+
+
+ + diff --git a/data/nsis/Contrib/nsisunz/nsisunz_setup.nsi b/data/nsis/Contrib/nsisunz/nsisunz_setup.nsi new file mode 100644 index 000000000..50a87719b --- /dev/null +++ b/data/nsis/Contrib/nsisunz/nsisunz_setup.nsi @@ -0,0 +1,148 @@ +; Generated by makesimplensi @ 12.04.2004 02:35:59 +; from directory "C:\nsis\Contrib\nsisunz" +; Fine-tuned by Saivert + +!include "infopage.nsh" +!include "addremoveprograms.nsh" + +SetCompressor lzma +OutFile "nsisunz_setup.exe" +Name "nsisunz" +ChangeUI IDD_INST ${NSISDIR}\contrib\uis\classic_buttonstoright.exe +Icon "${NSISDIR}\Contrib\Graphics\Icons\box-install.ico" +UninstallIcon "${NSISDIR}\Contrib\Graphics\Icons\box-uninstall.ico" +XPStyle on + +InstallDir "$PROGRAMFILES\nsis" +InstallDirRegKey HKEY_LOCAL_MACHINE \ + "Software\Microsoft\Windows\Currentversion\Uninstall\nsis" "UninstallString" + +!insertmacro PAGE_INFO "Please read this..." "info.rtf" +Page components +Page directory +Page instfiles + +UninstPage uninstConfirm +UninstPage instfiles + + +Section "nsisunz NSIS Plug-in" + SectionIn RO + + SetOutPath $INSTDIR\plugins + ; plug-in + File ${NSISDIR}\plugins\nsisunz.dll + + SetOutPath $INSTDIR\3rdparty\nsisunz + ; Readme & examples (4 Files) + File "example.nsi" + File "example_mui.nsi" + File "nsisunz_readme.html" + File "zippage.ini" +SectionEnd + +Section "Source (MS Visual C++ 6.0 project)" + SetOutPath "$INSTDIR\3rdparty\nsisunz\source" + ; Source (3 files + ZLIB) + File "nsisunz.cpp" + File "nsisunz.dsp" + File "nsisunz.dsw" + SetOutPath "$INSTDIR\3rdparty\nsisunz\source\zlib" + ; ZLIB (20 Files) + File "zlib\ADLER32.C" + File "zlib\CRC32.C" + File "zlib\INFBLOCK.C" + File "zlib\INFBLOCK.H" + File "zlib\INFCODES.C" + File "zlib\INFCODES.H" + File "zlib\INFFAST.C" + File "zlib\INFFAST.H" + File "zlib\INFFIXED.H" + File "zlib\INFLATE.C" + File "zlib\INFTREES.C" + File "zlib\INFTREES.H" + File "zlib\INFUTIL.C" + File "zlib\INFUTIL.H" + File "zlib\Unzip.c" + File "zlib\UNZIP.H" + File "zlib\ZCONF.H" + File "zlib\ZLIB.H" + File "zlib\Zutil.c" + File "zlib\ZUTIL.H" + +SectionEnd + +Section -post + !insertmacro ADDTOADDREMOVELIST nsisunz $(^Name) "$INSTDIR\3rdparty\nsisunz\nsisunz_uninstall.exe" 1 1 + + DetailPrint "Note: Shortcuts are located in Contrib submenu of NSIS start-menu branch!" + CreateDirectory "$SMPROGRAMS\NSIS\3rdparty\nsisunz" + CreateShortcut "$SMPROGRAMS\NSIS\3rdparty\nsisunz\examples and source.lnk" "$INSTDIR\3rdparty\nsisunz\" + CreateShortcut "$SMPROGRAMS\NSIS\3rdparty\nsisunz\readme.lnk" "$INSTDIR\3rdparty\nsisunz\nsisunz_readme.html" + CreateShortcut "$SMPROGRAMS\NSIS\3rdparty\nsisunz\Uninstall nsisunz.lnk" "$INSTDIR\3rdparty\nsisunz\nsisunz_uninstall.exe" + + WriteUninstaller "$INSTDIR\3rdparty\nsisunz\nsisunz_uninstall.exe" + SetAutoClose true +SectionEnd + +Function .onInstSuccess + MessageBox MB_YESNO "Installation done!$\r$\nDo you wish to open the nsisunz examples folder?" IDYES +1 IDNO skiprunapp + ExecShell open "$INSTDIR\3rdparty\nsisunz\" + skiprunapp: +FunctionEnd + +Section "Uninstall" + ; Remove plug-in + Delete "$INSTDIR\plugins\nsisunz.dll" + + ; Remove readme & examples + Delete "$INSTDIR\example.nsi" + Delete "$INSTDIR\example_mui.nsi" + Delete "$INSTDIR\zippage.ini" + Delete "$INSTDIR\nsisunz_readme.html" + + + ; Remove source + Delete "$INSTDIR\source\nsisunz.cpp" + Delete "$INSTDIR\source\nsisunz.dsp" + Delete "$INSTDIR\source\nsisunz.dsw" + + ; Remove included ZLIB + Delete "$INSTDIR\source\zlib\ADLER32.C" + Delete "$INSTDIR\source\zlib\CRC32.C" + Delete "$INSTDIR\source\zlib\INFBLOCK.C" + Delete "$INSTDIR\source\zlib\INFBLOCK.H" + Delete "$INSTDIR\source\zlib\INFCODES.C" + Delete "$INSTDIR\source\zlib\INFCODES.H" + Delete "$INSTDIR\source\zlib\INFFAST.C" + Delete "$INSTDIR\source\zlib\INFFAST.H" + Delete "$INSTDIR\source\zlib\INFFIXED.H" + Delete "$INSTDIR\source\zlib\INFLATE.C" + Delete "$INSTDIR\source\zlib\INFTREES.C" + Delete "$INSTDIR\source\zlib\INFTREES.H" + Delete "$INSTDIR\source\zlib\INFUTIL.C" + Delete "$INSTDIR\source\zlib\INFUTIL.H" + Delete "$INSTDIR\source\zlib\Unzip.c" + Delete "$INSTDIR\source\zlib\UNZIP.H" + Delete "$INSTDIR\source\zlib\ZCONF.H" + Delete "$INSTDIR\source\zlib\ZLIB.H" + Delete "$INSTDIR\source\zlib\Zutil.c" + Delete "$INSTDIR\source\zlib\ZUTIL.H" + + Delete "$INSTDIR\nsisunz_uninstall.exe" + RMDir "$INSTDIR\source\zlib\" + RMDir "$INSTDIR\source\" + RMDir "$INSTDIR\" + + ; Remove shortcuts + Delete "$SMPROGRAMS\NSIS\3rdparty\nsisunz\examples and source.lnk" + Delete "$SMPROGRAMS\NSIS\3rdparty\nsisunz\readme.lnk" + Delete "$SMPROGRAMS\NSIS\3rdparty\nsisunz\Uninstall nsisunz.lnk" + RMDir "$SMPROGRAMS\NSIS\3rdparty\nsisunz" + + !insertmacro REMOVEFROMADDREMOVELIST nsisunz + +SectionEnd +; Number of File lines: 28 +; Number of SetOutPath lines: 1 +; Total size of all files: 298 kB (304897 bytes) diff --git a/data/nsis/Contrib/nsisunz/readme.kjd b/data/nsis/Contrib/nsisunz/readme.kjd new file mode 100644 index 000000000..462fb73a4 --- /dev/null +++ b/data/nsis/Contrib/nsisunz/readme.kjd @@ -0,0 +1,12 @@ +This is a further reduced build by removing CRT dependency with Win32 calls. +It is barely tested, so use with caution; ie I may have introduced bugs. +The uncompressed plugin is now 40KB instead of 80KB; compresses via UPX down to 22KB. + +Changes from original realeas: +Added miniclib (from untgz plugin but with strstr() added) & adjusted files to use it. +Updated zlib from 1.1.3 to 1.2.2; except unzip.c/.h +Note: zlib is adjusted to use miniclib (ie direct Win32 calls) and not standard release. +Updated MSVC6 project files to reflect above changes (VC7 ones out of date!). + +KJD +050713 diff --git a/data/nsis/Contrib/nsisunz/zippage.ini b/data/nsis/Contrib/nsisunz/zippage.ini new file mode 100644 index 000000000..db5b91d95 --- /dev/null +++ b/data/nsis/Contrib/nsisunz/zippage.ini @@ -0,0 +1,65 @@ +; Ini file generated by the HM NIS Edit IO designer. +[Settings] +NumFields=7 +CancelButtonText=Close +NextButtonText=Extract + +[Field 1] +Type=Icon +Left=0 +Right=21 +Top=0 +Bottom=19 + +[Field 2] +Type=Label +Text=To unzip, select a ZIP file using the edit box below (use [...] button to browse) and choose a destination folder for the extracted files. Then click the "Extract" button. +Left=26 +Right=-1 +Top=0 +Bottom=25 + +[Field 3] +Type=Groupbox +Text=Select ZIP file +Left=0 +Right=-1 +Top=33 +Bottom=68 + +[Field 4] +Type=FileRequest +MinLen=1 +ValidateText=Please specify a ZIP file! +Filter=ZIP archives (*.zip)|*.zip|Winamp SkinZip (*.wsz)|*.wsz|Winamp Abstraction Layer (*.wal)|*.wal|All files|*.* +Left=5 +Right=-6 +Top=49 +Bottom=62 + +[Field 5] +Type=Groupbox +Text=Select destination folder +Left=0 +Right=-1 +Top=73 +Bottom=108 + +[Field 6] +Type=DirRequest +MinLen=1 +Text=Select destination folder +ValidateText=Please specify a destination folder! +Left=5 +Right=-6 +Top=88 +Bottom=100 + +[Field 7] +Type=Checkbox +Text=Do not extract paths +Left=0 +Right=102 +Top=113 +Bottom=123 + diff --git a/data/nsis/Contrib/nsisunz/zlib/ADLER32.C b/data/nsis/Contrib/nsisunz/zlib/ADLER32.C new file mode 100644 index 000000000..624a1696e --- /dev/null +++ b/data/nsis/Contrib/nsisunz/zlib/ADLER32.C @@ -0,0 +1,74 @@ +/* adler32.c -- compute the Adler-32 checksum of a data stream + * Copyright (C) 1995-2003 Mark Adler + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +/* @(#) $Id$ */ + +#define ZLIB_INTERNAL +#include "zlib.h" + +#define BASE 65521UL /* largest prime smaller than 65536 */ +#define NMAX 5552 +/* NMAX is the largest n such that 255n(n+1)/2 + (n+1)(BASE-1) <= 2^32-1 */ + +#define DO1(buf,i) {s1 += buf[i]; s2 += s1;} +#define DO2(buf,i) DO1(buf,i); DO1(buf,i+1); +#define DO4(buf,i) DO2(buf,i); DO2(buf,i+2); +#define DO8(buf,i) DO4(buf,i); DO4(buf,i+4); +#define DO16(buf) DO8(buf,0); DO8(buf,8); + +#ifdef NO_DIVIDE +# define MOD(a) \ + do { \ + if (a >= (BASE << 16)) a -= (BASE << 16); \ + if (a >= (BASE << 15)) a -= (BASE << 15); \ + if (a >= (BASE << 14)) a -= (BASE << 14); \ + if (a >= (BASE << 13)) a -= (BASE << 13); \ + if (a >= (BASE << 12)) a -= (BASE << 12); \ + if (a >= (BASE << 11)) a -= (BASE << 11); \ + if (a >= (BASE << 10)) a -= (BASE << 10); \ + if (a >= (BASE << 9)) a -= (BASE << 9); \ + if (a >= (BASE << 8)) a -= (BASE << 8); \ + if (a >= (BASE << 7)) a -= (BASE << 7); \ + if (a >= (BASE << 6)) a -= (BASE << 6); \ + if (a >= (BASE << 5)) a -= (BASE << 5); \ + if (a >= (BASE << 4)) a -= (BASE << 4); \ + if (a >= (BASE << 3)) a -= (BASE << 3); \ + if (a >= (BASE << 2)) a -= (BASE << 2); \ + if (a >= (BASE << 1)) a -= (BASE << 1); \ + if (a >= BASE) a -= BASE; \ + } while (0) +#else +# define MOD(a) a %= BASE +#endif + +/* ========================================================================= */ +uLong ZEXPORT adler32(adler, buf, len) + uLong adler; + const Bytef *buf; + uInt len; +{ + unsigned long s1 = adler & 0xffff; + unsigned long s2 = (adler >> 16) & 0xffff; + int k; + + if (buf == Z_NULL) return 1L; + + while (len > 0) { + k = len < NMAX ? (int)len : NMAX; + len -= k; + while (k >= 16) { + DO16(buf); + buf += 16; + k -= 16; + } + if (k != 0) do { + s1 += *buf++; + s2 += s1; + } while (--k); + MOD(s1); + MOD(s2); + } + return (s2 << 16) | s1; +} diff --git a/data/nsis/Contrib/nsisunz/zlib/CRC32.C b/data/nsis/Contrib/nsisunz/zlib/CRC32.C new file mode 100644 index 000000000..b39c7e125 --- /dev/null +++ b/data/nsis/Contrib/nsisunz/zlib/CRC32.C @@ -0,0 +1,333 @@ +/* crc32.c -- compute the CRC-32 of a data stream + * Copyright (C) 1995-2003 Mark Adler + * For conditions of distribution and use, see copyright notice in zlib.h + * + * Thanks to Rodney Brown for his contribution of faster + * CRC methods: exclusive-oring 32 bits of data at a time, and pre-computing + * tables for updating the shift register in one step with three exclusive-ors + * instead of four steps with four exclusive-ors. This results about a factor + * of two increase in speed on a Power PC G4 (PPC7455) using gcc -O3. + */ + +/* @(#) $Id$ */ + +/* + Note on the use of DYNAMIC_CRC_TABLE: there is no mutex or semaphore + protection on the static variables used to control the first-use generation + of the crc tables. Therefore, if you #define DYNAMIC_CRC_TABLE, you should + first call get_crc_table() to initialize the tables before allowing more than + one thread to use crc32(). + */ + +#ifdef MAKECRCH +# include +# ifndef DYNAMIC_CRC_TABLE +# define DYNAMIC_CRC_TABLE +# endif /* !DYNAMIC_CRC_TABLE */ +#endif /* MAKECRCH */ + +#include "zutil.h" /* for STDC and FAR definitions */ + +#define local static + +/* Find a four-byte integer type for crc32_little() and crc32_big(). */ +#ifndef NOBYFOUR +# ifdef STDC /* need ANSI C limits.h to determine sizes */ +# include +# define BYFOUR +# if (UINT_MAX == 0xffffffffUL) + typedef unsigned int u4; +# else +# if (ULONG_MAX == 0xffffffffUL) + typedef unsigned long u4; +# else +# if (USHRT_MAX == 0xffffffffUL) + typedef unsigned short u4; +# else +# undef BYFOUR /* can't find a four-byte integer type! */ +# endif +# endif +# endif +# endif /* STDC */ +#endif /* !NOBYFOUR */ + +/* Definitions for doing the crc four data bytes at a time. */ +#ifdef BYFOUR +# define REV(w) (((w)>>24)+(((w)>>8)&0xff00)+ \ + (((w)&0xff00)<<8)+(((w)&0xff)<<24)) + local unsigned long crc32_little OF((unsigned long, + const unsigned char FAR *, unsigned)); + local unsigned long crc32_big OF((unsigned long, + const unsigned char FAR *, unsigned)); +# define TBLS 8 +#else +# define TBLS 1 +#endif /* BYFOUR */ + +#ifdef DYNAMIC_CRC_TABLE + +local volatile int crc_table_empty = 1; +local unsigned long FAR crc_table[TBLS][256]; +local void make_crc_table OF((void)); +#ifdef MAKECRCH + local void write_table OF((FILE *, const unsigned long FAR *)); +#endif /* MAKECRCH */ + +/* + Generate tables for a byte-wise 32-bit CRC calculation on the polynomial: + x^32+x^26+x^23+x^22+x^16+x^12+x^11+x^10+x^8+x^7+x^5+x^4+x^2+x+1. + + Polynomials over GF(2) are represented in binary, one bit per coefficient, + with the lowest powers in the most significant bit. Then adding polynomials + is just exclusive-or, and multiplying a polynomial by x is a right shift by + one. If we call the above polynomial p, and represent a byte as the + polynomial q, also with the lowest power in the most significant bit (so the + byte 0xb1 is the polynomial x^7+x^3+x+1), then the CRC is (q*x^32) mod p, + where a mod b means the remainder after dividing a by b. + + This calculation is done using the shift-register method of multiplying and + taking the remainder. The register is initialized to zero, and for each + incoming bit, x^32 is added mod p to the register if the bit is a one (where + x^32 mod p is p+x^32 = x^26+...+1), and the register is multiplied mod p by + x (which is shifting right by one and adding x^32 mod p if the bit shifted + out is a one). We start with the highest power (least significant bit) of + q and repeat for all eight bits of q. + + The first table is simply the CRC of all possible eight bit values. This is + all the information needed to generate CRCs on data a byte at a time for all + combinations of CRC register values and incoming bytes. The remaining tables + allow for word-at-a-time CRC calculation for both big-endian and little- + endian machines, where a word is four bytes. +*/ +local void make_crc_table() +{ + unsigned long c; + int n, k; + unsigned long poly; /* polynomial exclusive-or pattern */ + /* terms of polynomial defining this crc (except x^32): */ + static volatile int first = 1; /* flag to limit concurrent making */ + static const unsigned char p[] = {0,1,2,4,5,7,8,10,11,12,16,22,23,26}; + + /* See if another task is already doing this (not thread-safe, but better + than nothing -- significantly reduces duration of vulnerability in + case the advice about DYNAMIC_CRC_TABLE is ignored) */ + if (first) { + first = 0; + + /* make exclusive-or pattern from polynomial (0xedb88320UL) */ + poly = 0UL; + for (n = 0; n < sizeof(p)/sizeof(unsigned char); n++) + poly |= 1UL << (31 - p[n]); + + /* generate a crc for every 8-bit value */ + for (n = 0; n < 256; n++) { + c = (unsigned long)n; + for (k = 0; k < 8; k++) + c = c & 1 ? poly ^ (c >> 1) : c >> 1; + crc_table[0][n] = c; + } + +#ifdef BYFOUR + /* generate crc for each value followed by one, two, and three zeros, + and then the byte reversal of those as well as the first table */ + for (n = 0; n < 256; n++) { + c = crc_table[0][n]; + crc_table[4][n] = REV(c); + for (k = 1; k < 4; k++) { + c = crc_table[0][c & 0xff] ^ (c >> 8); + crc_table[k][n] = c; + crc_table[k + 4][n] = REV(c); + } + } +#endif /* BYFOUR */ + + crc_table_empty = 0; + } + else { /* not first */ + /* wait for the other guy to finish (not efficient, but rare) */ + while (crc_table_empty) + ; + } + +#ifdef MAKECRCH + /* write out CRC tables to crc32.h */ + { + FILE *out; + + out = fopen("crc32.h", "w"); + if (out == NULL) return; + fprintf(out, "/* crc32.h -- tables for rapid CRC calculation\n"); + fprintf(out, " * Generated automatically by crc32.c\n */\n\n"); + fprintf(out, "local const unsigned long FAR "); + fprintf(out, "crc_table[TBLS][256] =\n{\n {\n"); + write_table(out, crc_table[0]); +# ifdef BYFOUR + fprintf(out, "#ifdef BYFOUR\n"); + for (k = 1; k < 8; k++) { + fprintf(out, " },\n {\n"); + write_table(out, crc_table[k]); + } + fprintf(out, "#endif\n"); +# endif /* BYFOUR */ + fprintf(out, " }\n};\n"); + fclose(out); + } +#endif /* MAKECRCH */ +} + +#ifdef MAKECRCH +local void write_table(out, table) + FILE *out; + const unsigned long FAR *table; +{ + int n; + + for (n = 0; n < 256; n++) + fprintf(out, "%s0x%08lxUL%s", n % 5 ? "" : " ", table[n], + n == 255 ? "\n" : (n % 5 == 4 ? ",\n" : ", ")); +} +#endif /* MAKECRCH */ + +#else /* !DYNAMIC_CRC_TABLE */ +/* ======================================================================== + * Tables of CRC-32s of all single-byte values, made by make_crc_table(). + */ +#include "crc32.h" +#endif /* DYNAMIC_CRC_TABLE */ + +/* ========================================================================= + * This function can be used by asm versions of crc32() + */ +const unsigned long FAR * ZEXPORT get_crc_table() +{ +#ifdef DYNAMIC_CRC_TABLE + if (crc_table_empty) + make_crc_table(); +#endif /* DYNAMIC_CRC_TABLE */ + return (const unsigned long FAR *)crc_table; +} + +/* ========================================================================= */ +#define DO1 crc = crc_table[0][((int)crc ^ (*buf++)) & 0xff] ^ (crc >> 8) +#define DO8 DO1; DO1; DO1; DO1; DO1; DO1; DO1; DO1 + +/* ========================================================================= */ +unsigned long ZEXPORT crc32(crc, buf, len) + unsigned long crc; + const unsigned char FAR *buf; + unsigned len; +{ + if (buf == Z_NULL) return 0UL; + +#ifdef DYNAMIC_CRC_TABLE + if (crc_table_empty) + make_crc_table(); +#endif /* DYNAMIC_CRC_TABLE */ + +#ifdef BYFOUR + if (sizeof(void *) == sizeof(ptrdiff_t)) { + u4 endian; + + endian = 1; + if (*((unsigned char *)(&endian))) + return crc32_little(crc, buf, len); + else + return crc32_big(crc, buf, len); + } +#endif /* BYFOUR */ + crc = crc ^ 0xffffffffUL; + while (len >= 8) { + DO8; + len -= 8; + } + if (len) do { + DO1; + } while (--len); + return crc ^ 0xffffffffUL; +} + +#ifdef BYFOUR + +/* ========================================================================= */ +#define DOLIT4 c ^= *buf4++; \ + c = crc_table[3][c & 0xff] ^ crc_table[2][(c >> 8) & 0xff] ^ \ + crc_table[1][(c >> 16) & 0xff] ^ crc_table[0][c >> 24] +#define DOLIT32 DOLIT4; DOLIT4; DOLIT4; DOLIT4; DOLIT4; DOLIT4; DOLIT4; DOLIT4 + +/* ========================================================================= */ +local unsigned long crc32_little(crc, buf, len) + unsigned long crc; + const unsigned char FAR *buf; + unsigned len; +{ + register u4 c; + register const u4 FAR *buf4; + + c = (u4)crc; + c = ~c; + while (len && ((ptrdiff_t)buf & 3)) { + c = crc_table[0][(c ^ *buf++) & 0xff] ^ (c >> 8); + len--; + } + + buf4 = (const u4 FAR *)buf; + while (len >= 32) { + DOLIT32; + len -= 32; + } + while (len >= 4) { + DOLIT4; + len -= 4; + } + buf = (const unsigned char FAR *)buf4; + + if (len) do { + c = crc_table[0][(c ^ *buf++) & 0xff] ^ (c >> 8); + } while (--len); + c = ~c; + return (unsigned long)c; +} + +/* ========================================================================= */ +#define DOBIG4 c ^= *++buf4; \ + c = crc_table[4][c & 0xff] ^ crc_table[5][(c >> 8) & 0xff] ^ \ + crc_table[6][(c >> 16) & 0xff] ^ crc_table[7][c >> 24] +#define DOBIG32 DOBIG4; DOBIG4; DOBIG4; DOBIG4; DOBIG4; DOBIG4; DOBIG4; DOBIG4 + +/* ========================================================================= */ +local unsigned long crc32_big(crc, buf, len) + unsigned long crc; + const unsigned char FAR *buf; + unsigned len; +{ + register u4 c; + register const u4 FAR *buf4; + + c = REV((u4)crc); + c = ~c; + while (len && ((ptrdiff_t)buf & 3)) { + c = crc_table[4][(c >> 24) ^ *buf++] ^ (c << 8); + len--; + } + + buf4 = (const u4 FAR *)buf; + buf4--; + while (len >= 32) { + DOBIG32; + len -= 32; + } + while (len >= 4) { + DOBIG4; + len -= 4; + } + buf4++; + buf = (const unsigned char FAR *)buf4; + + if (len) do { + c = crc_table[4][(c >> 24) ^ *buf++] ^ (c << 8); + } while (--len); + c = ~c; + return (unsigned long)(REV(c)); +} + +#endif /* BYFOUR */ diff --git a/data/nsis/Contrib/nsisunz/zlib/INFFAST.C b/data/nsis/Contrib/nsisunz/zlib/INFFAST.C new file mode 100644 index 000000000..8c02a178d --- /dev/null +++ b/data/nsis/Contrib/nsisunz/zlib/INFFAST.C @@ -0,0 +1,305 @@ +/* inffast.c -- fast decoding + * Copyright (C) 1995-2004 Mark Adler + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +#include "zutil.h" +#include "inftrees.h" +#include "inflate.h" +#include "inffast.h" + +#ifndef ASMINF + +/* Allow machine dependent optimization for post-increment or pre-increment. + Based on testing to date, + Pre-increment preferred for: + - PowerPC G3 (Adler) + - MIPS R5000 (Randers-Pehrson) + Post-increment preferred for: + - none + No measurable difference: + - Pentium III (Anderson) + - M68060 (Nikl) + */ +#ifdef POSTINC +# define OFF 0 +# define PUP(a) *(a)++ +#else +# define OFF 1 +# define PUP(a) *++(a) +#endif + +/* + Decode literal, length, and distance codes and write out the resulting + literal and match bytes until either not enough input or output is + available, an end-of-block is encountered, or a data error is encountered. + When large enough input and output buffers are supplied to inflate(), for + example, a 16K input buffer and a 64K output buffer, more than 95% of the + inflate execution time is spent in this routine. + + Entry assumptions: + + state->mode == LEN + strm->avail_in >= 6 + strm->avail_out >= 258 + start >= strm->avail_out + state->bits < 8 + + On return, state->mode is one of: + + LEN -- ran out of enough output space or enough available input + TYPE -- reached end of block code, inflate() to interpret next block + BAD -- error in block data + + Notes: + + - The maximum input bits used by a length/distance pair is 15 bits for the + length code, 5 bits for the length extra, 15 bits for the distance code, + and 13 bits for the distance extra. This totals 48 bits, or six bytes. + Therefore if strm->avail_in >= 6, then there is enough input to avoid + checking for available input while decoding. + + - The maximum bytes that a single length/distance pair can output is 258 + bytes, which is the maximum length that can be coded. inflate_fast() + requires strm->avail_out >= 258 for each loop to avoid checking for + output space. + */ +void inflate_fast(strm, start) +z_streamp strm; +unsigned start; /* inflate()'s starting value for strm->avail_out */ +{ + struct inflate_state FAR *state; + unsigned char FAR *in; /* local strm->next_in */ + unsigned char FAR *last; /* while in < last, enough input available */ + unsigned char FAR *out; /* local strm->next_out */ + unsigned char FAR *beg; /* inflate()'s initial strm->next_out */ + unsigned char FAR *end; /* while out < end, enough space available */ + unsigned wsize; /* window size or zero if not using window */ + unsigned whave; /* valid bytes in the window */ + unsigned write; /* window write index */ + unsigned char FAR *window; /* allocated sliding window, if wsize != 0 */ + unsigned long hold; /* local strm->hold */ + unsigned bits; /* local strm->bits */ + code const FAR *lcode; /* local strm->lencode */ + code const FAR *dcode; /* local strm->distcode */ + unsigned lmask; /* mask for first level of length codes */ + unsigned dmask; /* mask for first level of distance codes */ + code this; /* retrieved table entry */ + unsigned op; /* code bits, operation, extra bits, or */ + /* window position, window bytes to copy */ + unsigned len; /* match length, unused bytes */ + unsigned dist; /* match distance */ + unsigned char FAR *from; /* where to copy match from */ + + /* copy state to local variables */ + state = (struct inflate_state FAR *)strm->state; + in = strm->next_in - OFF; + last = in + (strm->avail_in - 5); + out = strm->next_out - OFF; + beg = out - (start - strm->avail_out); + end = out + (strm->avail_out - 257); + wsize = state->wsize; + whave = state->whave; + write = state->write; + window = state->window; + hold = state->hold; + bits = state->bits; + lcode = state->lencode; + dcode = state->distcode; + lmask = (1U << state->lenbits) - 1; + dmask = (1U << state->distbits) - 1; + + /* decode literals and length/distances until end-of-block or not enough + input data or output space */ + do { + if (bits < 15) { + hold += (unsigned long)(PUP(in)) << bits; + bits += 8; + hold += (unsigned long)(PUP(in)) << bits; + bits += 8; + } + this = lcode[hold & lmask]; + dolen: + op = (unsigned)(this.bits); + hold >>= op; + bits -= op; + op = (unsigned)(this.op); + if (op == 0) { /* literal */ + Tracevv((stderr, this.val >= 0x20 && this.val < 0x7f ? + "inflate: literal '%c'\n" : + "inflate: literal 0x%02x\n", this.val)); + PUP(out) = (unsigned char)(this.val); + } + else if (op & 16) { /* length base */ + len = (unsigned)(this.val); + op &= 15; /* number of extra bits */ + if (op) { + if (bits < op) { + hold += (unsigned long)(PUP(in)) << bits; + bits += 8; + } + len += (unsigned)hold & ((1U << op) - 1); + hold >>= op; + bits -= op; + } + Tracevv((stderr, "inflate: length %u\n", len)); + if (bits < 15) { + hold += (unsigned long)(PUP(in)) << bits; + bits += 8; + hold += (unsigned long)(PUP(in)) << bits; + bits += 8; + } + this = dcode[hold & dmask]; + dodist: + op = (unsigned)(this.bits); + hold >>= op; + bits -= op; + op = (unsigned)(this.op); + if (op & 16) { /* distance base */ + dist = (unsigned)(this.val); + op &= 15; /* number of extra bits */ + if (bits < op) { + hold += (unsigned long)(PUP(in)) << bits; + bits += 8; + if (bits < op) { + hold += (unsigned long)(PUP(in)) << bits; + bits += 8; + } + } + dist += (unsigned)hold & ((1U << op) - 1); + hold >>= op; + bits -= op; + Tracevv((stderr, "inflate: distance %u\n", dist)); + op = (unsigned)(out - beg); /* max distance in output */ + if (dist > op) { /* see if copy from window */ + op = dist - op; /* distance back in window */ + if (op > whave) { + strm->msg = (char *)"invalid distance too far back"; + state->mode = BAD; + break; + } + from = window - OFF; + if (write == 0) { /* very common case */ + from += wsize - op; + if (op < len) { /* some from window */ + len -= op; + do { + PUP(out) = PUP(from); + } while (--op); + from = out - dist; /* rest from output */ + } + } + else if (write < op) { /* wrap around window */ + from += wsize + write - op; + op -= write; + if (op < len) { /* some from end of window */ + len -= op; + do { + PUP(out) = PUP(from); + } while (--op); + from = window - OFF; + if (write < len) { /* some from start of window */ + op = write; + len -= op; + do { + PUP(out) = PUP(from); + } while (--op); + from = out - dist; /* rest from output */ + } + } + } + else { /* contiguous in window */ + from += write - op; + if (op < len) { /* some from window */ + len -= op; + do { + PUP(out) = PUP(from); + } while (--op); + from = out - dist; /* rest from output */ + } + } + while (len > 2) { + PUP(out) = PUP(from); + PUP(out) = PUP(from); + PUP(out) = PUP(from); + len -= 3; + } + if (len) { + PUP(out) = PUP(from); + if (len > 1) + PUP(out) = PUP(from); + } + } + else { + from = out - dist; /* copy direct from output */ + do { /* minimum length is three */ + PUP(out) = PUP(from); + PUP(out) = PUP(from); + PUP(out) = PUP(from); + len -= 3; + } while (len > 2); + if (len) { + PUP(out) = PUP(from); + if (len > 1) + PUP(out) = PUP(from); + } + } + } + else if ((op & 64) == 0) { /* 2nd level distance code */ + this = dcode[this.val + (hold & ((1U << op) - 1))]; + goto dodist; + } + else { + strm->msg = (char *)"invalid distance code"; + state->mode = BAD; + break; + } + } + else if ((op & 64) == 0) { /* 2nd level length code */ + this = lcode[this.val + (hold & ((1U << op) - 1))]; + goto dolen; + } + else if (op & 32) { /* end-of-block */ + Tracevv((stderr, "inflate: end of block\n")); + state->mode = TYPE; + break; + } + else { + strm->msg = (char *)"invalid literal/length code"; + state->mode = BAD; + break; + } + } while (in < last && out < end); + + /* return unused bytes (on entry, bits < 8, so in won't go too far back) */ + len = bits >> 3; + in -= len; + bits -= len << 3; + hold &= (1U << bits) - 1; + + /* update state and return */ + strm->next_in = in + OFF; + strm->next_out = out + OFF; + strm->avail_in = (unsigned)(in < last ? 5 + (last - in) : 5 - (in - last)); + strm->avail_out = (unsigned)(out < end ? + 257 + (end - out) : 257 - (out - end)); + state->hold = hold; + state->bits = bits; + return; +} + +/* + inflate_fast() speedups that turned out slower (on a PowerPC G3 750CXe): + - Using bit fields for code structure + - Different op definition to avoid & for extra bits (do & for table bits) + - Three separate decoding do-loops for direct, window, and write == 0 + - Special case for distance > 1 copies to do overlapped load and store copy + - Explicit branch predictions (based on measured branch probabilities) + - Deferring match copy and interspersed it with decoding subsequent codes + - Swapping literal/length else + - Swapping window/direct else + - Larger unrolled copy loops (three is about right) + - Moving len -= 3 statement into middle of loop + */ + +#endif /* !ASMINF */ diff --git a/data/nsis/Contrib/nsisunz/zlib/INFFAST.H b/data/nsis/Contrib/nsisunz/zlib/INFFAST.H new file mode 100644 index 000000000..1e88d2d97 --- /dev/null +++ b/data/nsis/Contrib/nsisunz/zlib/INFFAST.H @@ -0,0 +1,11 @@ +/* inffast.h -- header to use inffast.c + * Copyright (C) 1995-2003 Mark Adler + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +/* WARNING: this file should *not* be used by applications. It is + part of the implementation of the compression library and is + subject to change. Applications should only use zlib.h. + */ + +void inflate_fast OF((z_streamp strm, unsigned start)); diff --git a/data/nsis/Contrib/nsisunz/zlib/INFFIXED.H b/data/nsis/Contrib/nsisunz/zlib/INFFIXED.H new file mode 100644 index 000000000..75ed4b597 --- /dev/null +++ b/data/nsis/Contrib/nsisunz/zlib/INFFIXED.H @@ -0,0 +1,94 @@ + /* inffixed.h -- table for decoding fixed codes + * Generated automatically by makefixed(). + */ + + /* WARNING: this file should *not* be used by applications. It + is part of the implementation of the compression library and + is subject to change. Applications should only use zlib.h. + */ + + static const code lenfix[512] = { + {96,7,0},{0,8,80},{0,8,16},{20,8,115},{18,7,31},{0,8,112},{0,8,48}, + {0,9,192},{16,7,10},{0,8,96},{0,8,32},{0,9,160},{0,8,0},{0,8,128}, + {0,8,64},{0,9,224},{16,7,6},{0,8,88},{0,8,24},{0,9,144},{19,7,59}, + {0,8,120},{0,8,56},{0,9,208},{17,7,17},{0,8,104},{0,8,40},{0,9,176}, + {0,8,8},{0,8,136},{0,8,72},{0,9,240},{16,7,4},{0,8,84},{0,8,20}, + {21,8,227},{19,7,43},{0,8,116},{0,8,52},{0,9,200},{17,7,13},{0,8,100}, + {0,8,36},{0,9,168},{0,8,4},{0,8,132},{0,8,68},{0,9,232},{16,7,8}, + {0,8,92},{0,8,28},{0,9,152},{20,7,83},{0,8,124},{0,8,60},{0,9,216}, + {18,7,23},{0,8,108},{0,8,44},{0,9,184},{0,8,12},{0,8,140},{0,8,76}, + {0,9,248},{16,7,3},{0,8,82},{0,8,18},{21,8,163},{19,7,35},{0,8,114}, + {0,8,50},{0,9,196},{17,7,11},{0,8,98},{0,8,34},{0,9,164},{0,8,2}, + {0,8,130},{0,8,66},{0,9,228},{16,7,7},{0,8,90},{0,8,26},{0,9,148}, + {20,7,67},{0,8,122},{0,8,58},{0,9,212},{18,7,19},{0,8,106},{0,8,42}, + {0,9,180},{0,8,10},{0,8,138},{0,8,74},{0,9,244},{16,7,5},{0,8,86}, + {0,8,22},{64,8,0},{19,7,51},{0,8,118},{0,8,54},{0,9,204},{17,7,15}, + {0,8,102},{0,8,38},{0,9,172},{0,8,6},{0,8,134},{0,8,70},{0,9,236}, + {16,7,9},{0,8,94},{0,8,30},{0,9,156},{20,7,99},{0,8,126},{0,8,62}, + {0,9,220},{18,7,27},{0,8,110},{0,8,46},{0,9,188},{0,8,14},{0,8,142}, + {0,8,78},{0,9,252},{96,7,0},{0,8,81},{0,8,17},{21,8,131},{18,7,31}, + {0,8,113},{0,8,49},{0,9,194},{16,7,10},{0,8,97},{0,8,33},{0,9,162}, + {0,8,1},{0,8,129},{0,8,65},{0,9,226},{16,7,6},{0,8,89},{0,8,25}, + {0,9,146},{19,7,59},{0,8,121},{0,8,57},{0,9,210},{17,7,17},{0,8,105}, + {0,8,41},{0,9,178},{0,8,9},{0,8,137},{0,8,73},{0,9,242},{16,7,4}, + {0,8,85},{0,8,21},{16,8,258},{19,7,43},{0,8,117},{0,8,53},{0,9,202}, + {17,7,13},{0,8,101},{0,8,37},{0,9,170},{0,8,5},{0,8,133},{0,8,69}, + {0,9,234},{16,7,8},{0,8,93},{0,8,29},{0,9,154},{20,7,83},{0,8,125}, + {0,8,61},{0,9,218},{18,7,23},{0,8,109},{0,8,45},{0,9,186},{0,8,13}, + {0,8,141},{0,8,77},{0,9,250},{16,7,3},{0,8,83},{0,8,19},{21,8,195}, + {19,7,35},{0,8,115},{0,8,51},{0,9,198},{17,7,11},{0,8,99},{0,8,35}, + {0,9,166},{0,8,3},{0,8,131},{0,8,67},{0,9,230},{16,7,7},{0,8,91}, + {0,8,27},{0,9,150},{20,7,67},{0,8,123},{0,8,59},{0,9,214},{18,7,19}, + {0,8,107},{0,8,43},{0,9,182},{0,8,11},{0,8,139},{0,8,75},{0,9,246}, + {16,7,5},{0,8,87},{0,8,23},{64,8,0},{19,7,51},{0,8,119},{0,8,55}, + {0,9,206},{17,7,15},{0,8,103},{0,8,39},{0,9,174},{0,8,7},{0,8,135}, + {0,8,71},{0,9,238},{16,7,9},{0,8,95},{0,8,31},{0,9,158},{20,7,99}, + {0,8,127},{0,8,63},{0,9,222},{18,7,27},{0,8,111},{0,8,47},{0,9,190}, + {0,8,15},{0,8,143},{0,8,79},{0,9,254},{96,7,0},{0,8,80},{0,8,16}, + {20,8,115},{18,7,31},{0,8,112},{0,8,48},{0,9,193},{16,7,10},{0,8,96}, + {0,8,32},{0,9,161},{0,8,0},{0,8,128},{0,8,64},{0,9,225},{16,7,6}, + {0,8,88},{0,8,24},{0,9,145},{19,7,59},{0,8,120},{0,8,56},{0,9,209}, + {17,7,17},{0,8,104},{0,8,40},{0,9,177},{0,8,8},{0,8,136},{0,8,72}, + {0,9,241},{16,7,4},{0,8,84},{0,8,20},{21,8,227},{19,7,43},{0,8,116}, + {0,8,52},{0,9,201},{17,7,13},{0,8,100},{0,8,36},{0,9,169},{0,8,4}, + {0,8,132},{0,8,68},{0,9,233},{16,7,8},{0,8,92},{0,8,28},{0,9,153}, + {20,7,83},{0,8,124},{0,8,60},{0,9,217},{18,7,23},{0,8,108},{0,8,44}, + {0,9,185},{0,8,12},{0,8,140},{0,8,76},{0,9,249},{16,7,3},{0,8,82}, + {0,8,18},{21,8,163},{19,7,35},{0,8,114},{0,8,50},{0,9,197},{17,7,11}, + {0,8,98},{0,8,34},{0,9,165},{0,8,2},{0,8,130},{0,8,66},{0,9,229}, + {16,7,7},{0,8,90},{0,8,26},{0,9,149},{20,7,67},{0,8,122},{0,8,58}, + {0,9,213},{18,7,19},{0,8,106},{0,8,42},{0,9,181},{0,8,10},{0,8,138}, + {0,8,74},{0,9,245},{16,7,5},{0,8,86},{0,8,22},{64,8,0},{19,7,51}, + {0,8,118},{0,8,54},{0,9,205},{17,7,15},{0,8,102},{0,8,38},{0,9,173}, + {0,8,6},{0,8,134},{0,8,70},{0,9,237},{16,7,9},{0,8,94},{0,8,30}, + {0,9,157},{20,7,99},{0,8,126},{0,8,62},{0,9,221},{18,7,27},{0,8,110}, + {0,8,46},{0,9,189},{0,8,14},{0,8,142},{0,8,78},{0,9,253},{96,7,0}, + {0,8,81},{0,8,17},{21,8,131},{18,7,31},{0,8,113},{0,8,49},{0,9,195}, + {16,7,10},{0,8,97},{0,8,33},{0,9,163},{0,8,1},{0,8,129},{0,8,65}, + {0,9,227},{16,7,6},{0,8,89},{0,8,25},{0,9,147},{19,7,59},{0,8,121}, + {0,8,57},{0,9,211},{17,7,17},{0,8,105},{0,8,41},{0,9,179},{0,8,9}, + {0,8,137},{0,8,73},{0,9,243},{16,7,4},{0,8,85},{0,8,21},{16,8,258}, + {19,7,43},{0,8,117},{0,8,53},{0,9,203},{17,7,13},{0,8,101},{0,8,37}, + {0,9,171},{0,8,5},{0,8,133},{0,8,69},{0,9,235},{16,7,8},{0,8,93}, + {0,8,29},{0,9,155},{20,7,83},{0,8,125},{0,8,61},{0,9,219},{18,7,23}, + {0,8,109},{0,8,45},{0,9,187},{0,8,13},{0,8,141},{0,8,77},{0,9,251}, + {16,7,3},{0,8,83},{0,8,19},{21,8,195},{19,7,35},{0,8,115},{0,8,51}, + {0,9,199},{17,7,11},{0,8,99},{0,8,35},{0,9,167},{0,8,3},{0,8,131}, + {0,8,67},{0,9,231},{16,7,7},{0,8,91},{0,8,27},{0,9,151},{20,7,67}, + {0,8,123},{0,8,59},{0,9,215},{18,7,19},{0,8,107},{0,8,43},{0,9,183}, + {0,8,11},{0,8,139},{0,8,75},{0,9,247},{16,7,5},{0,8,87},{0,8,23}, + {64,8,0},{19,7,51},{0,8,119},{0,8,55},{0,9,207},{17,7,15},{0,8,103}, + {0,8,39},{0,9,175},{0,8,7},{0,8,135},{0,8,71},{0,9,239},{16,7,9}, + {0,8,95},{0,8,31},{0,9,159},{20,7,99},{0,8,127},{0,8,63},{0,9,223}, + {18,7,27},{0,8,111},{0,8,47},{0,9,191},{0,8,15},{0,8,143},{0,8,79}, + {0,9,255} + }; + + static const code distfix[32] = { + {16,5,1},{23,5,257},{19,5,17},{27,5,4097},{17,5,5},{25,5,1025}, + {21,5,65},{29,5,16385},{16,5,3},{24,5,513},{20,5,33},{28,5,8193}, + {18,5,9},{26,5,2049},{22,5,129},{64,5,0},{16,5,2},{23,5,385}, + {19,5,25},{27,5,6145},{17,5,7},{25,5,1537},{21,5,97},{29,5,24577}, + {16,5,4},{24,5,769},{20,5,49},{28,5,12289},{18,5,13},{26,5,3073}, + {22,5,193},{64,5,0} + }; diff --git a/data/nsis/Contrib/nsisunz/zlib/INFLATE.C b/data/nsis/Contrib/nsisunz/zlib/INFLATE.C new file mode 100644 index 000000000..c6d38266d --- /dev/null +++ b/data/nsis/Contrib/nsisunz/zlib/INFLATE.C @@ -0,0 +1,1274 @@ +/* inflate.c -- zlib decompression + * Copyright (C) 1995-2003 Mark Adler + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +/* + * Change history: + * + * 1.2.beta0 24 Nov 2002 + * - First version -- complete rewrite of inflate to simplify code, avoid + * creation of window when not needed, minimize use of window when it is + * needed, make inffast.c even faster, implement gzip decoding, and to + * improve code readability and style over the previous zlib inflate code + * + * 1.2.beta1 25 Nov 2002 + * - Use pointers for available input and output checking in inffast.c + * - Remove input and output counters in inffast.c + * - Change inffast.c entry and loop from avail_in >= 7 to >= 6 + * - Remove unnecessary second byte pull from length extra in inffast.c + * - Unroll direct copy to three copies per loop in inffast.c + * + * 1.2.beta2 4 Dec 2002 + * - Change external routine names to reduce potential conflicts + * - Correct filename to inffixed.h for fixed tables in inflate.c + * - Make hbuf[] unsigned char to match parameter type in inflate.c + * - Change strm->next_out[-state->offset] to *(strm->next_out - state->offset) + * to avoid negation problem on Alphas (64 bit) in inflate.c + * + * 1.2.beta3 22 Dec 2002 + * - Add comments on state->bits assertion in inffast.c + * - Add comments on op field in inftrees.h + * - Fix bug in reuse of allocated window after inflateReset() + * - Remove bit fields--back to byte structure for speed + * - Remove distance extra == 0 check in inflate_fast()--only helps for lengths + * - Change post-increments to pre-increments in inflate_fast(), PPC biased? + * - Add compile time option, POSTINC, to use post-increments instead (Intel?) + * - Make MATCH copy in inflate() much faster for when inflate_fast() not used + * - Use local copies of stream next and avail values, as well as local bit + * buffer and bit count in inflate()--for speed when inflate_fast() not used + * + * 1.2.beta4 1 Jan 2003 + * - Split ptr - 257 statements in inflate_table() to avoid compiler warnings + * - Move a comment on output buffer sizes from inffast.c to inflate.c + * - Add comments in inffast.c to introduce the inflate_fast() routine + * - Rearrange window copies in inflate_fast() for speed and simplification + * - Unroll last copy for window match in inflate_fast() + * - Use local copies of window variables in inflate_fast() for speed + * - Pull out common write == 0 case for speed in inflate_fast() + * - Make op and len in inflate_fast() unsigned for consistency + * - Add FAR to lcode and dcode declarations in inflate_fast() + * - Simplified bad distance check in inflate_fast() + * - Added inflateBackInit(), inflateBack(), and inflateBackEnd() in new + * source file infback.c to provide a call-back interface to inflate for + * programs like gzip and unzip -- uses window as output buffer to avoid + * window copying + * + * 1.2.beta5 1 Jan 2003 + * - Improved inflateBack() interface to allow the caller to provide initial + * input in strm. + * - Fixed stored blocks bug in inflateBack() + * + * 1.2.beta6 4 Jan 2003 + * - Added comments in inffast.c on effectiveness of POSTINC + * - Typecasting all around to reduce compiler warnings + * - Changed loops from while (1) or do {} while (1) to for (;;), again to + * make compilers happy + * - Changed type of window in inflateBackInit() to unsigned char * + * + * 1.2.beta7 27 Jan 2003 + * - Changed many types to unsigned or unsigned short to avoid warnings + * - Added inflateCopy() function + * + * 1.2.0 9 Mar 2003 + * - Changed inflateBack() interface to provide separate opaque descriptors + * for the in() and out() functions + * - Changed inflateBack() argument and in_func typedef to swap the length + * and buffer address return values for the input function + * - Check next_in and next_out for Z_NULL on entry to inflate() + * + * The history for versions after 1.2.0 are in ChangeLog in zlib distribution. + */ + +#include "zutil.h" +#include "inftrees.h" +#include "inflate.h" +#include "inffast.h" + +#ifdef MAKEFIXED +# ifndef BUILDFIXED +# define BUILDFIXED +# endif +#endif + +/* function prototypes */ +local void fixedtables OF((struct inflate_state FAR *state)); +local int updatewindow OF((z_streamp strm, unsigned out)); +#ifdef BUILDFIXED + void makefixed OF((void)); +#endif +local unsigned syncsearch OF((unsigned FAR *have, unsigned char FAR *buf, + unsigned len)); + +int ZEXPORT inflateReset(strm) +z_streamp strm; +{ + struct inflate_state FAR *state; + + if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR; + state = (struct inflate_state FAR *)strm->state; + strm->total_in = strm->total_out = state->total = 0; + strm->msg = Z_NULL; + strm->adler = 1; /* to support ill-conceived Java test suite */ + state->mode = HEAD; + state->last = 0; + state->havedict = 0; + state->wsize = 0; + state->whave = 0; + state->hold = 0; + state->bits = 0; + state->lencode = state->distcode = state->next = state->codes; + Tracev((stderr, "inflate: reset\n")); + return Z_OK; +} + +int ZEXPORT inflateInit2_(strm, windowBits, version, stream_size) +z_streamp strm; +int windowBits; +const char *version; +int stream_size; +{ + struct inflate_state FAR *state; + + if (version == Z_NULL || version[0] != ZLIB_VERSION[0] || + stream_size != (int)(sizeof(z_stream))) + return Z_VERSION_ERROR; + if (strm == Z_NULL) return Z_STREAM_ERROR; + strm->msg = Z_NULL; /* in case we return an error */ + if (strm->zalloc == (alloc_func)0) { + strm->zalloc = zcalloc; + strm->opaque = (voidpf)0; + } + if (strm->zfree == (free_func)0) strm->zfree = zcfree; + state = (struct inflate_state FAR *) + ZALLOC(strm, 1, sizeof(struct inflate_state)); + if (state == Z_NULL) return Z_MEM_ERROR; + Tracev((stderr, "inflate: allocated\n")); + strm->state = (voidpf)state; + if (windowBits < 0) { + state->wrap = 0; + windowBits = -windowBits; + } + else { + state->wrap = (windowBits >> 4) + 1; +#ifdef GUNZIP + if (windowBits < 48) windowBits &= 15; +#endif + } + if (windowBits < 8 || windowBits > 15) { + ZFREE(strm, state); + strm->state = Z_NULL; + return Z_STREAM_ERROR; + } + state->wbits = (unsigned)windowBits; + state->window = Z_NULL; + return inflateReset(strm); +} + +int ZEXPORT inflateInit_(strm, version, stream_size) +z_streamp strm; +const char *version; +int stream_size; +{ + return inflateInit2_(strm, DEF_WBITS, version, stream_size); +} + +/* + Return state with length and distance decoding tables and index sizes set to + fixed code decoding. Normally this returns fixed tables from inffixed.h. + If BUILDFIXED is defined, then instead this routine builds the tables the + first time it's called, and returns those tables the first time and + thereafter. This reduces the size of the code by about 2K bytes, in + exchange for a little execution time. However, BUILDFIXED should not be + used for threaded applications, since the rewriting of the tables and virgin + may not be thread-safe. + */ +local void fixedtables(state) +struct inflate_state FAR *state; +{ +#ifdef BUILDFIXED + static int virgin = 1; + static code *lenfix, *distfix; + static code fixed[544]; + + /* build fixed huffman tables if first call (may not be thread safe) */ + if (virgin) { + unsigned sym, bits; + static code *next; + + /* literal/length table */ + sym = 0; + while (sym < 144) state->lens[sym++] = 8; + while (sym < 256) state->lens[sym++] = 9; + while (sym < 280) state->lens[sym++] = 7; + while (sym < 288) state->lens[sym++] = 8; + next = fixed; + lenfix = next; + bits = 9; + inflate_table(LENS, state->lens, 288, &(next), &(bits), state->work); + + /* distance table */ + sym = 0; + while (sym < 32) state->lens[sym++] = 5; + distfix = next; + bits = 5; + inflate_table(DISTS, state->lens, 32, &(next), &(bits), state->work); + + /* do this just once */ + virgin = 0; + } +#else /* !BUILDFIXED */ +# include "inffixed.h" +#endif /* BUILDFIXED */ + state->lencode = lenfix; + state->lenbits = 9; + state->distcode = distfix; + state->distbits = 5; +} + +#ifdef MAKEFIXED +#include + +/* + Write out the inffixed.h that is #include'd above. Defining MAKEFIXED also + defines BUILDFIXED, so the tables are built on the fly. makefixed() writes + those tables to stdout, which would be piped to inffixed.h. A small program + can simply call makefixed to do this: + + void makefixed(void); + + int main(void) + { + makefixed(); + return 0; + } + + Then that can be linked with zlib built with MAKEFIXED defined and run: + + a.out > inffixed.h + */ +void makefixed() +{ + unsigned low, size; + struct inflate_state state; + + fixedtables(&state); + puts(" /* inffixed.h -- table for decoding fixed codes"); + puts(" * Generated automatically by makefixed()."); + puts(" */"); + puts(""); + puts(" /* WARNING: this file should *not* be used by applications."); + puts(" It is part of the implementation of this library and is"); + puts(" subject to change. Applications should only use zlib.h."); + puts(" */"); + puts(""); + size = 1U << 9; + printf(" static const code lenfix[%u] = {", size); + low = 0; + for (;;) { + if ((low % 7) == 0) printf("\n "); + printf("{%u,%u,%d}", state.lencode[low].op, state.lencode[low].bits, + state.lencode[low].val); + if (++low == size) break; + putchar(','); + } + puts("\n };"); + size = 1U << 5; + printf("\n static const code distfix[%u] = {", size); + low = 0; + for (;;) { + if ((low % 6) == 0) printf("\n "); + printf("{%u,%u,%d}", state.distcode[low].op, state.distcode[low].bits, + state.distcode[low].val); + if (++low == size) break; + putchar(','); + } + puts("\n };"); +} +#endif /* MAKEFIXED */ + +/* + Update the window with the last wsize (normally 32K) bytes written before + returning. If window does not exist yet, create it. This is only called + when a window is already in use, or when output has been written during this + inflate call, but the end of the deflate stream has not been reached yet. + It is also called to create a window for dictionary data when a dictionary + is loaded. + + Providing output buffers larger than 32K to inflate() should provide a speed + advantage, since only the last 32K of output is copied to the sliding window + upon return from inflate(), and since all distances after the first 32K of + output will fall in the output data, making match copies simpler and faster. + The advantage may be dependent on the size of the processor's data caches. + */ +local int updatewindow(strm, out) +z_streamp strm; +unsigned out; +{ + struct inflate_state FAR *state; + unsigned copy, dist; + + state = (struct inflate_state FAR *)strm->state; + + /* if it hasn't been done already, allocate space for the window */ + if (state->window == Z_NULL) { + state->window = (unsigned char FAR *) + ZALLOC(strm, 1U << state->wbits, + sizeof(unsigned char)); + if (state->window == Z_NULL) return 1; + } + + /* if window not in use yet, initialize */ + if (state->wsize == 0) { + state->wsize = 1U << state->wbits; + state->write = 0; + state->whave = 0; + } + + /* copy state->wsize or less output bytes into the circular window */ + copy = out - strm->avail_out; + if (copy >= state->wsize) { + zmemcpy(state->window, strm->next_out - state->wsize, state->wsize); + state->write = 0; + state->whave = state->wsize; + } + else { + dist = state->wsize - state->write; + if (dist > copy) dist = copy; + zmemcpy(state->window + state->write, strm->next_out - copy, dist); + copy -= dist; + if (copy) { + zmemcpy(state->window, strm->next_out - copy, copy); + state->write = copy; + state->whave = state->wsize; + } + else { + state->write += dist; + if (state->write == state->wsize) state->write = 0; + if (state->whave < state->wsize) state->whave += dist; + } + } + return 0; +} + +/* Macros for inflate(): */ + +/* check function to use adler32() for zlib or crc32() for gzip */ +#ifdef GUNZIP +# define UPDATE(check, buf, len) \ + (state->flags ? crc32(check, buf, len) : adler32(check, buf, len)) +#else +# define UPDATE(check, buf, len) adler32(check, buf, len) +#endif + +/* check macros for header crc */ +#ifdef GUNZIP +# define CRC2(check, word) \ + do { \ + hbuf[0] = (unsigned char)(word); \ + hbuf[1] = (unsigned char)((word) >> 8); \ + check = crc32(check, hbuf, 2); \ + } while (0) + +# define CRC4(check, word) \ + do { \ + hbuf[0] = (unsigned char)(word); \ + hbuf[1] = (unsigned char)((word) >> 8); \ + hbuf[2] = (unsigned char)((word) >> 16); \ + hbuf[3] = (unsigned char)((word) >> 24); \ + check = crc32(check, hbuf, 4); \ + } while (0) +#endif + +/* Load registers with state in inflate() for speed */ +#define LOAD() \ + do { \ + put = strm->next_out; \ + left = strm->avail_out; \ + next = strm->next_in; \ + have = strm->avail_in; \ + hold = state->hold; \ + bits = state->bits; \ + } while (0) + +/* Restore state from registers in inflate() */ +#define RESTORE() \ + do { \ + strm->next_out = put; \ + strm->avail_out = left; \ + strm->next_in = next; \ + strm->avail_in = have; \ + state->hold = hold; \ + state->bits = bits; \ + } while (0) + +/* Clear the input bit accumulator */ +#define INITBITS() \ + do { \ + hold = 0; \ + bits = 0; \ + } while (0) + +/* Get a byte of input into the bit accumulator, or return from inflate() + if there is no input available. */ +#define PULLBYTE() \ + do { \ + if (have == 0) goto inf_leave; \ + have--; \ + hold += (unsigned long)(*next++) << bits; \ + bits += 8; \ + } while (0) + +/* Assure that there are at least n bits in the bit accumulator. If there is + not enough available input to do that, then return from inflate(). */ +#define NEEDBITS(n) \ + do { \ + while (bits < (unsigned)(n)) \ + PULLBYTE(); \ + } while (0) + +/* Return the low n bits of the bit accumulator (n < 16) */ +#define BITS(n) \ + ((unsigned)hold & ((1U << (n)) - 1)) + +/* Remove n bits from the bit accumulator */ +#define DROPBITS(n) \ + do { \ + hold >>= (n); \ + bits -= (unsigned)(n); \ + } while (0) + +/* Remove zero to seven bits as needed to go to a byte boundary */ +#define BYTEBITS() \ + do { \ + hold >>= bits & 7; \ + bits -= bits & 7; \ + } while (0) + +/* Reverse the bytes in a 32-bit value */ +#define REVERSE(q) \ + ((((q) >> 24) & 0xff) + (((q) >> 8) & 0xff00) + \ + (((q) & 0xff00) << 8) + (((q) & 0xff) << 24)) + +/* + inflate() uses a state machine to process as much input data and generate as + much output data as possible before returning. The state machine is + structured roughly as follows: + + for (;;) switch (state) { + ... + case STATEn: + if (not enough input data or output space to make progress) + return; + ... make progress ... + state = STATEm; + break; + ... + } + + so when inflate() is called again, the same case is attempted again, and + if the appropriate resources are provided, the machine proceeds to the + next state. The NEEDBITS() macro is usually the way the state evaluates + whether it can proceed or should return. NEEDBITS() does the return if + the requested bits are not available. The typical use of the BITS macros + is: + + NEEDBITS(n); + ... do something with BITS(n) ... + DROPBITS(n); + + where NEEDBITS(n) either returns from inflate() if there isn't enough + input left to load n bits into the accumulator, or it continues. BITS(n) + gives the low n bits in the accumulator. When done, DROPBITS(n) drops + the low n bits off the accumulator. INITBITS() clears the accumulator + and sets the number of available bits to zero. BYTEBITS() discards just + enough bits to put the accumulator on a byte boundary. After BYTEBITS() + and a NEEDBITS(8), then BITS(8) would return the next byte in the stream. + + NEEDBITS(n) uses PULLBYTE() to get an available byte of input, or to return + if there is no input available. The decoding of variable length codes uses + PULLBYTE() directly in order to pull just enough bytes to decode the next + code, and no more. + + Some states loop until they get enough input, making sure that enough + state information is maintained to continue the loop where it left off + if NEEDBITS() returns in the loop. For example, want, need, and keep + would all have to actually be part of the saved state in case NEEDBITS() + returns: + + case STATEw: + while (want < need) { + NEEDBITS(n); + keep[want++] = BITS(n); + DROPBITS(n); + } + state = STATEx; + case STATEx: + + As shown above, if the next state is also the next case, then the break + is omitted. + + A state may also return if there is not enough output space available to + complete that state. Those states are copying stored data, writing a + literal byte, and copying a matching string. + + When returning, a "goto inf_leave" is used to update the total counters, + update the check value, and determine whether any progress has been made + during that inflate() call in order to return the proper return code. + Progress is defined as a change in either strm->avail_in or strm->avail_out. + When there is a window, goto inf_leave will update the window with the last + output written. If a goto inf_leave occurs in the middle of decompression + and there is no window currently, goto inf_leave will create one and copy + output to the window for the next call of inflate(). + + In this implementation, the flush parameter of inflate() only affects the + return code (per zlib.h). inflate() always writes as much as possible to + strm->next_out, given the space available and the provided input--the effect + documented in zlib.h of Z_SYNC_FLUSH. Furthermore, inflate() always defers + the allocation of and copying into a sliding window until necessary, which + provides the effect documented in zlib.h for Z_FINISH when the entire input + stream available. So the only thing the flush parameter actually does is: + when flush is set to Z_FINISH, inflate() cannot return Z_OK. Instead it + will return Z_BUF_ERROR if it has not reached the end of the stream. + */ + +int ZEXPORT inflate(strm, flush) +z_streamp strm; +int flush; +{ + struct inflate_state FAR *state; + unsigned char FAR *next; /* next input */ + unsigned char FAR *put; /* next output */ + unsigned have, left; /* available input and output */ + unsigned long hold; /* bit buffer */ + unsigned bits; /* bits in bit buffer */ + unsigned in, out; /* save starting available input and output */ + unsigned copy; /* number of stored or match bytes to copy */ + unsigned char FAR *from; /* where to copy match bytes from */ + code this; /* current decoding table entry */ + code last; /* parent table entry */ + unsigned len; /* length to copy for repeats, bits to drop */ + int ret; /* return code */ +#ifdef GUNZIP + unsigned char hbuf[4]; /* buffer for gzip header crc calculation */ +#endif + static const unsigned short order[19] = /* permutation of code lengths */ + {16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15}; + + if (strm == Z_NULL || strm->state == Z_NULL || strm->next_out == Z_NULL || + (strm->next_in == Z_NULL && strm->avail_in != 0)) + return Z_STREAM_ERROR; + + state = (struct inflate_state FAR *)strm->state; + if (state->mode == TYPE) state->mode = TYPEDO; /* skip check */ + LOAD(); + in = have; + out = left; + ret = Z_OK; + for (;;) + switch (state->mode) { + case HEAD: + if (state->wrap == 0) { + state->mode = TYPEDO; + break; + } + NEEDBITS(16); +#ifdef GUNZIP + if ((state->wrap & 2) && hold == 0x8b1f) { /* gzip header */ + state->check = crc32(0L, Z_NULL, 0); + CRC2(state->check, hold); + INITBITS(); + state->mode = FLAGS; + break; + } + state->flags = 0; /* expect zlib header */ + if (!(state->wrap & 1) || /* check if zlib header allowed */ +#else + if ( +#endif + ((BITS(8) << 8) + (hold >> 8)) % 31) { + strm->msg = (char *)"incorrect header check"; + state->mode = BAD; + break; + } + if (BITS(4) != Z_DEFLATED) { + strm->msg = (char *)"unknown compression method"; + state->mode = BAD; + break; + } + DROPBITS(4); + if (BITS(4) + 8 > state->wbits) { + strm->msg = (char *)"invalid window size"; + state->mode = BAD; + break; + } + Tracev((stderr, "inflate: zlib header ok\n")); + strm->adler = state->check = adler32(0L, Z_NULL, 0); + state->mode = hold & 0x200 ? DICTID : TYPE; + INITBITS(); + break; +#ifdef GUNZIP + case FLAGS: + NEEDBITS(16); + state->flags = (int)(hold); + if ((state->flags & 0xff) != Z_DEFLATED) { + strm->msg = (char *)"unknown compression method"; + state->mode = BAD; + break; + } + if (state->flags & 0xe000) { + strm->msg = (char *)"unknown header flags set"; + state->mode = BAD; + break; + } + if (state->flags & 0x0200) CRC2(state->check, hold); + INITBITS(); + state->mode = TIME; + case TIME: + NEEDBITS(32); + if (state->flags & 0x0200) CRC4(state->check, hold); + INITBITS(); + state->mode = OS; + case OS: + NEEDBITS(16); + if (state->flags & 0x0200) CRC2(state->check, hold); + INITBITS(); + state->mode = EXLEN; + case EXLEN: + if (state->flags & 0x0400) { + NEEDBITS(16); + state->length = (unsigned)(hold); + if (state->flags & 0x0200) CRC2(state->check, hold); + INITBITS(); + } + state->mode = EXTRA; + case EXTRA: + if (state->flags & 0x0400) { + copy = state->length; + if (copy > have) copy = have; + if (copy) { + if (state->flags & 0x0200) + state->check = crc32(state->check, next, copy); + have -= copy; + next += copy; + state->length -= copy; + } + if (state->length) goto inf_leave; + } + state->mode = NAME; + case NAME: + if (state->flags & 0x0800) { + if (have == 0) goto inf_leave; + copy = 0; + do { + len = (unsigned)(next[copy++]); + } while (len && copy < have); + if (state->flags & 0x02000) + state->check = crc32(state->check, next, copy); + have -= copy; + next += copy; + if (len) goto inf_leave; + } + state->mode = COMMENT; + case COMMENT: + if (state->flags & 0x1000) { + if (have == 0) goto inf_leave; + copy = 0; + do { + len = (unsigned)(next[copy++]); + } while (len && copy < have); + if (state->flags & 0x02000) + state->check = crc32(state->check, next, copy); + have -= copy; + next += copy; + if (len) goto inf_leave; + } + state->mode = HCRC; + case HCRC: + if (state->flags & 0x0200) { + NEEDBITS(16); + if (hold != (state->check & 0xffff)) { + strm->msg = (char *)"header crc mismatch"; + state->mode = BAD; + break; + } + INITBITS(); + } + strm->adler = state->check = crc32(0L, Z_NULL, 0); + state->mode = TYPE; + break; +#endif + case DICTID: + NEEDBITS(32); + strm->adler = state->check = REVERSE(hold); + INITBITS(); + state->mode = DICT; + case DICT: + if (state->havedict == 0) { + RESTORE(); + return Z_NEED_DICT; + } + strm->adler = state->check = adler32(0L, Z_NULL, 0); + state->mode = TYPE; + case TYPE: + if (flush == Z_BLOCK) goto inf_leave; + case TYPEDO: + if (state->last) { + BYTEBITS(); + state->mode = CHECK; + break; + } + NEEDBITS(3); + state->last = BITS(1); + DROPBITS(1); + switch (BITS(2)) { + case 0: /* stored block */ + Tracev((stderr, "inflate: stored block%s\n", + state->last ? " (last)" : "")); + state->mode = STORED; + break; + case 1: /* fixed block */ + fixedtables(state); + Tracev((stderr, "inflate: fixed codes block%s\n", + state->last ? " (last)" : "")); + state->mode = LEN; /* decode codes */ + break; + case 2: /* dynamic block */ + Tracev((stderr, "inflate: dynamic codes block%s\n", + state->last ? " (last)" : "")); + state->mode = TABLE; + break; + case 3: + strm->msg = (char *)"invalid block type"; + state->mode = BAD; + } + DROPBITS(2); + break; + case STORED: + BYTEBITS(); /* go to byte boundary */ + NEEDBITS(32); + if ((hold & 0xffff) != ((hold >> 16) ^ 0xffff)) { + strm->msg = (char *)"invalid stored block lengths"; + state->mode = BAD; + break; + } + state->length = (unsigned)hold & 0xffff; + Tracev((stderr, "inflate: stored length %u\n", + state->length)); + INITBITS(); + state->mode = COPY; + case COPY: + copy = state->length; + if (copy) { + if (copy > have) copy = have; + if (copy > left) copy = left; + if (copy == 0) goto inf_leave; + zmemcpy(put, next, copy); + have -= copy; + next += copy; + left -= copy; + put += copy; + state->length -= copy; + break; + } + Tracev((stderr, "inflate: stored end\n")); + state->mode = TYPE; + break; + case TABLE: + NEEDBITS(14); + state->nlen = BITS(5) + 257; + DROPBITS(5); + state->ndist = BITS(5) + 1; + DROPBITS(5); + state->ncode = BITS(4) + 4; + DROPBITS(4); +#ifndef PKZIP_BUG_WORKAROUND + if (state->nlen > 286 || state->ndist > 30) { + strm->msg = (char *)"too many length or distance symbols"; + state->mode = BAD; + break; + } +#endif + Tracev((stderr, "inflate: table sizes ok\n")); + state->have = 0; + state->mode = LENLENS; + case LENLENS: + while (state->have < state->ncode) { + NEEDBITS(3); + state->lens[order[state->have++]] = (unsigned short)BITS(3); + DROPBITS(3); + } + while (state->have < 19) + state->lens[order[state->have++]] = 0; + state->next = state->codes; + state->lencode = (code const FAR *)(state->next); + state->lenbits = 7; + ret = inflate_table(CODES, state->lens, 19, &(state->next), + &(state->lenbits), state->work); + if (ret) { + strm->msg = (char *)"invalid code lengths set"; + state->mode = BAD; + break; + } + Tracev((stderr, "inflate: code lengths ok\n")); + state->have = 0; + state->mode = CODELENS; + case CODELENS: + while (state->have < state->nlen + state->ndist) { + for (;;) { + this = state->lencode[BITS(state->lenbits)]; + if ((unsigned)(this.bits) <= bits) break; + PULLBYTE(); + } + if (this.val < 16) { + NEEDBITS(this.bits); + DROPBITS(this.bits); + state->lens[state->have++] = this.val; + } + else { + if (this.val == 16) { + NEEDBITS(this.bits + 2); + DROPBITS(this.bits); + if (state->have == 0) { + strm->msg = (char *)"invalid bit length repeat"; + state->mode = BAD; + break; + } + len = state->lens[state->have - 1]; + copy = 3 + BITS(2); + DROPBITS(2); + } + else if (this.val == 17) { + NEEDBITS(this.bits + 3); + DROPBITS(this.bits); + len = 0; + copy = 3 + BITS(3); + DROPBITS(3); + } + else { + NEEDBITS(this.bits + 7); + DROPBITS(this.bits); + len = 0; + copy = 11 + BITS(7); + DROPBITS(7); + } + if (state->have + copy > state->nlen + state->ndist) { + strm->msg = (char *)"invalid bit length repeat"; + state->mode = BAD; + break; + } + while (copy--) + state->lens[state->have++] = (unsigned short)len; + } + } + + /* handle error breaks in while */ + if (state->mode == BAD) break; + + /* build code tables */ + state->next = state->codes; + state->lencode = (code const FAR *)(state->next); + state->lenbits = 9; + ret = inflate_table(LENS, state->lens, state->nlen, &(state->next), + &(state->lenbits), state->work); + if (ret) { + strm->msg = (char *)"invalid literal/lengths set"; + state->mode = BAD; + break; + } + state->distcode = (code const FAR *)(state->next); + state->distbits = 6; + ret = inflate_table(DISTS, state->lens + state->nlen, state->ndist, + &(state->next), &(state->distbits), state->work); + if (ret) { + strm->msg = (char *)"invalid distances set"; + state->mode = BAD; + break; + } + Tracev((stderr, "inflate: codes ok\n")); + state->mode = LEN; + case LEN: + if (have >= 6 && left >= 258) { + RESTORE(); + inflate_fast(strm, out); + LOAD(); + break; + } + for (;;) { + this = state->lencode[BITS(state->lenbits)]; + if ((unsigned)(this.bits) <= bits) break; + PULLBYTE(); + } + if (this.op && (this.op & 0xf0) == 0) { + last = this; + for (;;) { + this = state->lencode[last.val + + (BITS(last.bits + last.op) >> last.bits)]; + if ((unsigned)(last.bits + this.bits) <= bits) break; + PULLBYTE(); + } + DROPBITS(last.bits); + } + DROPBITS(this.bits); + state->length = (unsigned)this.val; + if ((int)(this.op) == 0) { + Tracevv((stderr, this.val >= 0x20 && this.val < 0x7f ? + "inflate: literal '%c'\n" : + "inflate: literal 0x%02x\n", this.val)); + state->mode = LIT; + break; + } + if (this.op & 32) { + Tracevv((stderr, "inflate: end of block\n")); + state->mode = TYPE; + break; + } + if (this.op & 64) { + strm->msg = (char *)"invalid literal/length code"; + state->mode = BAD; + break; + } + state->extra = (unsigned)(this.op) & 15; + state->mode = LENEXT; + case LENEXT: + if (state->extra) { + NEEDBITS(state->extra); + state->length += BITS(state->extra); + DROPBITS(state->extra); + } + Tracevv((stderr, "inflate: length %u\n", state->length)); + state->mode = DIST; + case DIST: + for (;;) { + this = state->distcode[BITS(state->distbits)]; + if ((unsigned)(this.bits) <= bits) break; + PULLBYTE(); + } + if ((this.op & 0xf0) == 0) { + last = this; + for (;;) { + this = state->distcode[last.val + + (BITS(last.bits + last.op) >> last.bits)]; + if ((unsigned)(last.bits + this.bits) <= bits) break; + PULLBYTE(); + } + DROPBITS(last.bits); + } + DROPBITS(this.bits); + if (this.op & 64) { + strm->msg = (char *)"invalid distance code"; + state->mode = BAD; + break; + } + state->offset = (unsigned)this.val; + state->extra = (unsigned)(this.op) & 15; + state->mode = DISTEXT; + case DISTEXT: + if (state->extra) { + NEEDBITS(state->extra); + state->offset += BITS(state->extra); + DROPBITS(state->extra); + } + if (state->offset > state->whave + out - left) { + strm->msg = (char *)"invalid distance too far back"; + state->mode = BAD; + break; + } + Tracevv((stderr, "inflate: distance %u\n", state->offset)); + state->mode = MATCH; + case MATCH: + if (left == 0) goto inf_leave; + copy = out - left; + if (state->offset > copy) { /* copy from window */ + copy = state->offset - copy; + if (copy > state->write) { + copy -= state->write; + from = state->window + (state->wsize - copy); + } + else + from = state->window + (state->write - copy); + if (copy > state->length) copy = state->length; + } + else { /* copy from output */ + from = put - state->offset; + copy = state->length; + } + if (copy > left) copy = left; + left -= copy; + state->length -= copy; + do { + *put++ = *from++; + } while (--copy); + if (state->length == 0) state->mode = LEN; + break; + case LIT: + if (left == 0) goto inf_leave; + *put++ = (unsigned char)(state->length); + left--; + state->mode = LEN; + break; + case CHECK: + if (state->wrap) { + NEEDBITS(32); + out -= left; + strm->total_out += out; + state->total += out; + if (out) + strm->adler = state->check = + UPDATE(state->check, put - out, out); + out = left; + if (( +#ifdef GUNZIP + state->flags ? hold : +#endif + REVERSE(hold)) != state->check) { + strm->msg = (char *)"incorrect data check"; + state->mode = BAD; + break; + } + INITBITS(); + Tracev((stderr, "inflate: check matches trailer\n")); + } +#ifdef GUNZIP + state->mode = LENGTH; + case LENGTH: + if (state->wrap && state->flags) { + NEEDBITS(32); + if (hold != (state->total & 0xffffffffUL)) { + strm->msg = (char *)"incorrect length check"; + state->mode = BAD; + break; + } + INITBITS(); + Tracev((stderr, "inflate: length matches trailer\n")); + } +#endif + state->mode = DONE; + case DONE: + ret = Z_STREAM_END; + goto inf_leave; + case BAD: + ret = Z_DATA_ERROR; + goto inf_leave; + case MEM: + return Z_MEM_ERROR; + case SYNC: + default: + return Z_STREAM_ERROR; + } + + /* + Return from inflate(), updating the total counts and the check value. + If there was no progress during the inflate() call, return a buffer + error. Call updatewindow() to create and/or update the window state. + Note: a memory error from inflate() is non-recoverable. + */ + inf_leave: + RESTORE(); + if (state->wsize || (state->mode < CHECK && out != strm->avail_out)) + if (updatewindow(strm, out)) { + state->mode = MEM; + return Z_MEM_ERROR; + } + in -= strm->avail_in; + out -= strm->avail_out; + strm->total_in += in; + strm->total_out += out; + state->total += out; + if (state->wrap && out) + strm->adler = state->check = + UPDATE(state->check, strm->next_out - out, out); + strm->data_type = state->bits + (state->last ? 64 : 0) + + (state->mode == TYPE ? 128 : 0); + if (((in == 0 && out == 0) || flush == Z_FINISH) && ret == Z_OK) + ret = Z_BUF_ERROR; + return ret; +} + +int ZEXPORT inflateEnd(strm) +z_streamp strm; +{ + struct inflate_state FAR *state; + if (strm == Z_NULL || strm->state == Z_NULL || strm->zfree == (free_func)0) + return Z_STREAM_ERROR; + state = (struct inflate_state FAR *)strm->state; + if (state->window != Z_NULL) ZFREE(strm, state->window); + ZFREE(strm, strm->state); + strm->state = Z_NULL; + Tracev((stderr, "inflate: end\n")); + return Z_OK; +} + +int ZEXPORT inflateSetDictionary(strm, dictionary, dictLength) +z_streamp strm; +const Bytef *dictionary; +uInt dictLength; +{ + struct inflate_state FAR *state; + unsigned long id; + + /* check state */ + if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR; + state = (struct inflate_state FAR *)strm->state; + if (state->mode != DICT) return Z_STREAM_ERROR; + + /* check for correct dictionary id */ + id = adler32(0L, Z_NULL, 0); + id = adler32(id, dictionary, dictLength); + if (id != state->check) return Z_DATA_ERROR; + + /* copy dictionary to window */ + if (updatewindow(strm, strm->avail_out)) { + state->mode = MEM; + return Z_MEM_ERROR; + } + if (dictLength > state->wsize) { + zmemcpy(state->window, dictionary + dictLength - state->wsize, + state->wsize); + state->whave = state->wsize; + } + else { + zmemcpy(state->window + state->wsize - dictLength, dictionary, + dictLength); + state->whave = dictLength; + } + state->havedict = 1; + Tracev((stderr, "inflate: dictionary set\n")); + return Z_OK; +} + +/* + Search buf[0..len-1] for the pattern: 0, 0, 0xff, 0xff. Return when found + or when out of input. When called, *have is the number of pattern bytes + found in order so far, in 0..3. On return *have is updated to the new + state. If on return *have equals four, then the pattern was found and the + return value is how many bytes were read including the last byte of the + pattern. If *have is less than four, then the pattern has not been found + yet and the return value is len. In the latter case, syncsearch() can be + called again with more data and the *have state. *have is initialized to + zero for the first call. + */ +local unsigned syncsearch(have, buf, len) +unsigned FAR *have; +unsigned char FAR *buf; +unsigned len; +{ + unsigned got; + unsigned next; + + got = *have; + next = 0; + while (next < len && got < 4) { + if ((int)(buf[next]) == (got < 2 ? 0 : 0xff)) + got++; + else if (buf[next]) + got = 0; + else + got = 4 - got; + next++; + } + *have = got; + return next; +} + +int ZEXPORT inflateSync(strm) +z_streamp strm; +{ + unsigned len; /* number of bytes to look at or looked at */ + unsigned long in, out; /* temporary to save total_in and total_out */ + unsigned char buf[4]; /* to restore bit buffer to byte string */ + struct inflate_state FAR *state; + + /* check parameters */ + if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR; + state = (struct inflate_state FAR *)strm->state; + if (strm->avail_in == 0 && state->bits < 8) return Z_BUF_ERROR; + + /* if first time, start search in bit buffer */ + if (state->mode != SYNC) { + state->mode = SYNC; + state->hold <<= state->bits & 7; + state->bits -= state->bits & 7; + len = 0; + while (state->bits >= 8) { + buf[len++] = (unsigned char)(state->hold); + state->hold >>= 8; + state->bits -= 8; + } + state->have = 0; + syncsearch(&(state->have), buf, len); + } + + /* search available input */ + len = syncsearch(&(state->have), strm->next_in, strm->avail_in); + strm->avail_in -= len; + strm->next_in += len; + strm->total_in += len; + + /* return no joy or set up to restart inflate() on a new block */ + if (state->have != 4) return Z_DATA_ERROR; + in = strm->total_in; out = strm->total_out; + inflateReset(strm); + strm->total_in = in; strm->total_out = out; + state->mode = TYPE; + return Z_OK; +} + +/* + Returns true if inflate is currently at the end of a block generated by + Z_SYNC_FLUSH or Z_FULL_FLUSH. This function is used by one PPP + implementation to provide an additional safety check. PPP uses + Z_SYNC_FLUSH but removes the length bytes of the resulting empty stored + block. When decompressing, PPP checks that at the end of input packet, + inflate is waiting for these length bytes. + */ +int ZEXPORT inflateSyncPoint(strm) +z_streamp strm; +{ + struct inflate_state FAR *state; + + if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR; + state = (struct inflate_state FAR *)strm->state; + return state->mode == STORED && state->bits == 0; +} + +int ZEXPORT inflateCopy(dest, source) +z_streamp dest; +z_streamp source; +{ + struct inflate_state FAR *state; + struct inflate_state FAR *copy; + unsigned char FAR *window; + + /* check input */ + if (dest == Z_NULL || source == Z_NULL || source->state == Z_NULL || + source->zalloc == (alloc_func)0 || source->zfree == (free_func)0) + return Z_STREAM_ERROR; + state = (struct inflate_state FAR *)source->state; + + /* allocate space */ + copy = (struct inflate_state FAR *) + ZALLOC(source, 1, sizeof(struct inflate_state)); + if (copy == Z_NULL) return Z_MEM_ERROR; + window = Z_NULL; + if (state->window != Z_NULL) { + window = (unsigned char FAR *) + ZALLOC(source, 1U << state->wbits, sizeof(unsigned char)); + if (window == Z_NULL) { + ZFREE(source, copy); + return Z_MEM_ERROR; + } + } + + /* copy state */ + *dest = *source; + *copy = *state; + copy->lencode = copy->codes + (state->lencode - state->codes); + copy->distcode = copy->codes + (state->distcode - state->codes); + copy->next = copy->codes + (state->next - state->codes); + if (window != Z_NULL) + zmemcpy(window, state->window, 1U << state->wbits); + copy->window = window; + dest->state = (voidpf)copy; + return Z_OK; +} diff --git a/data/nsis/Contrib/nsisunz/zlib/INFTREES.C b/data/nsis/Contrib/nsisunz/zlib/INFTREES.C new file mode 100644 index 000000000..8a896b287 --- /dev/null +++ b/data/nsis/Contrib/nsisunz/zlib/INFTREES.C @@ -0,0 +1,328 @@ +/* inftrees.c -- generate Huffman trees for efficient decoding + * Copyright (C) 1995-2004 Mark Adler + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +#include "zutil.h" +#include "inftrees.h" + +#define MAXBITS 15 + +const char inflate_copyright[] = + " inflate 1.2.2 Copyright 1995-2004 Mark Adler "; +/* + If you use the zlib library in a product, an acknowledgment is welcome + in the documentation of your product. If for some reason you cannot + include such an acknowledgment, I would appreciate that you keep this + copyright string in the executable of your product. + */ + +/* + Build a set of tables to decode the provided canonical Huffman code. + The code lengths are lens[0..codes-1]. The result starts at *table, + whose indices are 0..2^bits-1. work is a writable array of at least + lens shorts, which is used as a work area. type is the type of code + to be generated, CODES, LENS, or DISTS. On return, zero is success, + -1 is an invalid code, and +1 means that ENOUGH isn't enough. table + on return points to the next available entry's address. bits is the + requested root table index bits, and on return it is the actual root + table index bits. It will differ if the request is greater than the + longest code or if it is less than the shortest code. + */ +int inflate_table(type, lens, codes, table, bits, work) +codetype type; +unsigned short FAR *lens; +unsigned codes; +code FAR * FAR *table; +unsigned FAR *bits; +unsigned short FAR *work; +{ + unsigned len; /* a code's length in bits */ + unsigned sym; /* index of code symbols */ + unsigned min, max; /* minimum and maximum code lengths */ + unsigned root; /* number of index bits for root table */ + unsigned curr; /* number of index bits for current table */ + unsigned drop; /* code bits to drop for sub-table */ + int left; /* number of prefix codes available */ + unsigned used; /* code entries in table used */ + unsigned huff; /* Huffman code */ + unsigned incr; /* for incrementing code, index */ + unsigned fill; /* index for replicating entries */ + unsigned low; /* low bits for current root entry */ + unsigned mask; /* mask for low root bits */ + code this; /* table entry for duplication */ + code FAR *next; /* next available space in table */ + const unsigned short FAR *base; /* base value table to use */ + const unsigned short FAR *extra; /* extra bits table to use */ + int end; /* use base and extra for symbol > end */ + unsigned short count[MAXBITS+1]; /* number of codes of each length */ + unsigned short offs[MAXBITS+1]; /* offsets in table for each length */ + static const unsigned short lbase[31] = { /* Length codes 257..285 base */ + 3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 15, 17, 19, 23, 27, 31, + 35, 43, 51, 59, 67, 83, 99, 115, 131, 163, 195, 227, 258, 0, 0}; + static const unsigned short lext[31] = { /* Length codes 257..285 extra */ + 16, 16, 16, 16, 16, 16, 16, 16, 17, 17, 17, 17, 18, 18, 18, 18, + 19, 19, 19, 19, 20, 20, 20, 20, 21, 21, 21, 21, 16, 199, 198}; + static const unsigned short dbase[32] = { /* Distance codes 0..29 base */ + 1, 2, 3, 4, 5, 7, 9, 13, 17, 25, 33, 49, 65, 97, 129, 193, + 257, 385, 513, 769, 1025, 1537, 2049, 3073, 4097, 6145, + 8193, 12289, 16385, 24577, 0, 0}; + static const unsigned short dext[32] = { /* Distance codes 0..29 extra */ + 16, 16, 16, 16, 17, 17, 18, 18, 19, 19, 20, 20, 21, 21, 22, 22, + 23, 23, 24, 24, 25, 25, 26, 26, 27, 27, + 28, 28, 29, 29, 64, 64}; + + /* + Process a set of code lengths to create a canonical Huffman code. The + code lengths are lens[0..codes-1]. Each length corresponds to the + symbols 0..codes-1. The Huffman code is generated by first sorting the + symbols by length from short to long, and retaining the symbol order + for codes with equal lengths. Then the code starts with all zero bits + for the first code of the shortest length, and the codes are integer + increments for the same length, and zeros are appended as the length + increases. For the deflate format, these bits are stored backwards + from their more natural integer increment ordering, and so when the + decoding tables are built in the large loop below, the integer codes + are incremented backwards. + + This routine assumes, but does not check, that all of the entries in + lens[] are in the range 0..MAXBITS. The caller must assure this. + 1..MAXBITS is interpreted as that code length. zero means that that + symbol does not occur in this code. + + The codes are sorted by computing a count of codes for each length, + creating from that a table of starting indices for each length in the + sorted table, and then entering the symbols in order in the sorted + table. The sorted table is work[], with that space being provided by + the caller. + + The length counts are used for other purposes as well, i.e. finding + the minimum and maximum length codes, determining if there are any + codes at all, checking for a valid set of lengths, and looking ahead + at length counts to determine sub-table sizes when building the + decoding tables. + */ + + /* accumulate lengths for codes (assumes lens[] all in 0..MAXBITS) */ + for (len = 0; len <= MAXBITS; len++) + count[len] = 0; + for (sym = 0; sym < codes; sym++) + count[lens[sym]]++; + + /* bound code lengths, force root to be within code lengths */ + root = *bits; + for (max = MAXBITS; max >= 1; max--) + if (count[max] != 0) break; + if (root > max) root = max; + if (max == 0) { /* no symbols to code at all */ + this.op = (unsigned char)64; /* invalid code marker */ + this.bits = (unsigned char)1; + this.val = (unsigned short)0; + *(*table)++ = this; /* make a table to force an error */ + *(*table)++ = this; + *bits = 1; + return 0; /* no symbols, but wait for decoding to report error */ + } + for (min = 1; min <= MAXBITS; min++) + if (count[min] != 0) break; + if (root < min) root = min; + + /* check for an over-subscribed or incomplete set of lengths */ + left = 1; + for (len = 1; len <= MAXBITS; len++) { + left <<= 1; + left -= count[len]; + if (left < 0) return -1; /* over-subscribed */ + } + if (left > 0 && (type == CODES || (codes - count[0] != 1))) + return -1; /* incomplete set */ + + /* generate offsets into symbol table for each length for sorting */ + offs[1] = 0; + for (len = 1; len < MAXBITS; len++) + offs[len + 1] = offs[len] + count[len]; + + /* sort symbols by length, by symbol order within each length */ + for (sym = 0; sym < codes; sym++) + if (lens[sym] != 0) work[offs[lens[sym]]++] = (unsigned short)sym; + + /* + Create and fill in decoding tables. In this loop, the table being + filled is at next and has curr index bits. The code being used is huff + with length len. That code is converted to an index by dropping drop + bits off of the bottom. For codes where len is less than drop + curr, + those top drop + curr - len bits are incremented through all values to + fill the table with replicated entries. + + root is the number of index bits for the root table. When len exceeds + root, sub-tables are created pointed to by the root entry with an index + of the low root bits of huff. This is saved in low to check for when a + new sub-table should be started. drop is zero when the root table is + being filled, and drop is root when sub-tables are being filled. + + When a new sub-table is needed, it is necessary to look ahead in the + code lengths to determine what size sub-table is needed. The length + counts are used for this, and so count[] is decremented as codes are + entered in the tables. + + used keeps track of how many table entries have been allocated from the + provided *table space. It is checked when a LENS table is being made + against the space in *table, ENOUGH, minus the maximum space needed by + the worst case distance code, MAXD. This should never happen, but the + sufficiency of ENOUGH has not been proven exhaustively, hence the check. + This assumes that when type == LENS, bits == 9. + + sym increments through all symbols, and the loop terminates when + all codes of length max, i.e. all codes, have been processed. This + routine permits incomplete codes, so another loop after this one fills + in the rest of the decoding tables with invalid code markers. + */ + + /* set up for code type */ + switch (type) { + case CODES: + base = extra = work; /* dummy value--not used */ + end = 19; + break; + case LENS: + base = lbase; + base -= 257; + extra = lext; + extra -= 257; + end = 256; + break; + default: /* DISTS */ + base = dbase; + extra = dext; + end = -1; + } + + /* initialize state for loop */ + huff = 0; /* starting code */ + sym = 0; /* starting code symbol */ + len = min; /* starting code length */ + next = *table; /* current table to fill in */ + curr = root; /* current table index bits */ + drop = 0; /* current bits to drop from code for index */ + low = (unsigned)(-1); /* trigger new sub-table when len > root */ + used = 1U << root; /* use root table entries */ + mask = used - 1; /* mask for comparing low */ + + /* check available table space */ + if (type == LENS && used >= ENOUGH - MAXD) + return 1; + + /* process all codes and make table entries */ + for (;;) { + /* create table entry */ + this.bits = (unsigned char)(len - drop); + if ((int)(work[sym]) < end) { + this.op = (unsigned char)0; + this.val = work[sym]; + } + else if ((int)(work[sym]) > end) { + this.op = (unsigned char)(extra[work[sym]]); + this.val = base[work[sym]]; + } + else { + this.op = (unsigned char)(32 + 64); /* end of block */ + this.val = 0; + } + + /* replicate for those indices with low len bits equal to huff */ + incr = 1U << (len - drop); + fill = 1U << curr; + do { + fill -= incr; + next[(huff >> drop) + fill] = this; + } while (fill != 0); + + /* backwards increment the len-bit code huff */ + incr = 1U << (len - 1); + while (huff & incr) + incr >>= 1; + if (incr != 0) { + huff &= incr - 1; + huff += incr; + } + else + huff = 0; + + /* go to next symbol, update count, len */ + sym++; + if (--(count[len]) == 0) { + if (len == max) break; + len = lens[work[sym]]; + } + + /* create new sub-table if needed */ + if (len > root && (huff & mask) != low) { + /* if first time, transition to sub-tables */ + if (drop == 0) + drop = root; + + /* increment past last table */ + next += 1U << curr; + + /* determine length of next table */ + curr = len - drop; + left = (int)(1 << curr); + while (curr + drop < max) { + left -= count[curr + drop]; + if (left <= 0) break; + curr++; + left <<= 1; + } + + /* check for enough space */ + used += 1U << curr; + if (type == LENS && used >= ENOUGH - MAXD) + return 1; + + /* point entry in root table to sub-table */ + low = huff & mask; + (*table)[low].op = (unsigned char)curr; + (*table)[low].bits = (unsigned char)root; + (*table)[low].val = (unsigned short)(next - *table); + } + } + + /* + Fill in rest of table for incomplete codes. This loop is similar to the + loop above in incrementing huff for table indices. It is assumed that + len is equal to curr + drop, so there is no loop needed to increment + through high index bits. When the current sub-table is filled, the loop + drops back to the root table to fill in any remaining entries there. + */ + this.op = (unsigned char)64; /* invalid code marker */ + this.bits = (unsigned char)(len - drop); + this.val = (unsigned short)0; + while (huff != 0) { + /* when done with sub-table, drop back to root table */ + if (drop != 0 && (huff & mask) != low) { + drop = 0; + len = root; + next = *table; + this.bits = (unsigned char)len; + } + + /* put invalid code marker in table */ + next[huff >> drop] = this; + + /* backwards increment the len-bit code huff */ + incr = 1U << (len - 1); + while (huff & incr) + incr >>= 1; + if (incr != 0) { + huff &= incr - 1; + huff += incr; + } + else + huff = 0; + } + + /* set return parameters */ + *table += used; + *bits = root; + return 0; +} diff --git a/data/nsis/Contrib/nsisunz/zlib/INFTREES.H b/data/nsis/Contrib/nsisunz/zlib/INFTREES.H new file mode 100644 index 000000000..82d365a7e --- /dev/null +++ b/data/nsis/Contrib/nsisunz/zlib/INFTREES.H @@ -0,0 +1,55 @@ +/* inftrees.h -- header to use inftrees.c + * Copyright (C) 1995-2003 Mark Adler + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +/* WARNING: this file should *not* be used by applications. It is + part of the implementation of the compression library and is + subject to change. Applications should only use zlib.h. + */ + +/* Structure for decoding tables. Each entry provides either the + information needed to do the operation requested by the code that + indexed that table entry, or it provides a pointer to another + table that indexes more bits of the code. op indicates whether + the entry is a pointer to another table, a literal, a length or + distance, an end-of-block, or an invalid code. For a table + pointer, the low four bits of op is the number of index bits of + that table. For a length or distance, the low four bits of op + is the number of extra bits to get after the code. bits is + the number of bits in this code or part of the code to drop off + of the bit buffer. val is the actual byte to output in the case + of a literal, the base length or distance, or the offset from + the current table to the next table. Each entry is four bytes. */ +typedef struct { + unsigned char op; /* operation, extra bits, table bits */ + unsigned char bits; /* bits in this part of the code */ + unsigned short val; /* offset in table or code value */ +} code; + +/* op values as set by inflate_table(): + 00000000 - literal + 0000tttt - table link, tttt != 0 is the number of table index bits + 0001eeee - length or distance, eeee is the number of extra bits + 01100000 - end of block + 01000000 - invalid code + */ + +/* Maximum size of dynamic tree. The maximum found in a long but non- + exhaustive search was 1004 code structures (850 for length/literals + and 154 for distances, the latter actually the result of an + exhaustive search). The true maximum is not known, but the value + below is more than safe. */ +#define ENOUGH 1440 +#define MAXD 154 + +/* Type of code to build for inftable() */ +typedef enum { + CODES, + LENS, + DISTS +} codetype; + +extern int inflate_table OF((codetype type, unsigned short FAR *lens, + unsigned codes, code FAR * FAR *table, + unsigned FAR *bits, unsigned short FAR *work)); diff --git a/data/nsis/Contrib/nsisunz/zlib/README b/data/nsis/Contrib/nsisunz/zlib/README new file mode 100644 index 000000000..df95ae13f --- /dev/null +++ b/data/nsis/Contrib/nsisunz/zlib/README @@ -0,0 +1,126 @@ +ZLIB DATA COMPRESSION LIBRARY + +zlib 1.2.2 is a general purpose data compression library. All the code is +thread safe. The data format used by the zlib library is described by RFCs +(Request for Comments) 1950 to 1952 in the files +http://www.ietf.org/rfc/rfc1950.txt (zlib format), rfc1951.txt (deflate format) +and rfc1952.txt (gzip format). These documents are also available in other +formats from ftp://ftp.uu.net/graphics/png/documents/zlib/zdoc-index.html + +All functions of the compression library are documented in the file zlib.h +(volunteer to write man pages welcome, contact zlib@gzip.org). A usage example +of the library is given in the file example.c which also tests that the library +is working correctly. Another example is given in the file minigzip.c. The +compression library itself is composed of all source files except example.c and +minigzip.c. + +To compile all files and run the test program, follow the instructions given at +the top of Makefile. In short "make test; make install" should work for most +machines. For Unix: "./configure; make test; make install" For MSDOS, use one +of the special makefiles such as Makefile.msc. For VMS, use Make_vms.com or +descrip.mms. + +Questions about zlib should be sent to , or to Gilles Vollant + for the Windows DLL version. The zlib home page is +http://www.zlib.org or http://www.gzip.org/zlib/ Before reporting a problem, +please check this site to verify that you have the latest version of zlib; +otherwise get the latest version and check whether the problem still exists or +not. + +PLEASE read the zlib FAQ http://www.gzip.org/zlib/zlib_faq.html before asking +for help. + +Mark Nelson wrote an article about zlib for the Jan. 1997 +issue of Dr. Dobb's Journal; a copy of the article is available in +http://dogma.net/markn/articles/zlibtool/zlibtool.htm + +The changes made in version 1.2.2 are documented in the file ChangeLog. + +Unsupported third party contributions are provided in directory "contrib". + +A Java implementation of zlib is available in the Java Development Kit +http://java.sun.com/j2se/1.4.2/docs/api/java/util/zip/package-summary.html +See the zlib home page http://www.zlib.org for details. + +A Perl interface to zlib written by Paul Marquess is in the +CPAN (Comprehensive Perl Archive Network) sites +http://www.cpan.org/modules/by-module/Compress/ + +A Python interface to zlib written by A.M. Kuchling is +available in Python 1.5 and later versions, see +http://www.python.org/doc/lib/module-zlib.html + +A zlib binding for TCL written by Andreas Kupries is +availlable at http://www.oche.de/~akupries/soft/trf/trf_zip.html + +An experimental package to read and write files in .zip format, written on top +of zlib by Gilles Vollant , is available in the +contrib/minizip directory of zlib. + + +Notes for some targets: + +- For Windows DLL versions, please see win32/DLL_FAQ.txt + +- For 64-bit Irix, deflate.c must be compiled without any optimization. With + -O, one libpng test fails. The test works in 32 bit mode (with the -n32 + compiler flag). The compiler bug has been reported to SGI. + +- zlib doesn't work with gcc 2.6.3 on a DEC 3000/300LX under OSF/1 2.1 it works + when compiled with cc. + +- On Digital Unix 4.0D (formely OSF/1) on AlphaServer, the cc option -std1 is + necessary to get gzprintf working correctly. This is done by configure. + +- zlib doesn't work on HP-UX 9.05 with some versions of /bin/cc. It works with + other compilers. Use "make test" to check your compiler. + +- gzdopen is not supported on RISCOS, BEOS and by some Mac compilers. + +- For PalmOs, see http://palmzlib.sourceforge.net/ + +- When building a shared, i.e. dynamic library on Mac OS X, the library must be + installed before testing (do "make install" before "make test"), since the + library location is specified in the library. + + +Acknowledgments: + + The deflate format used by zlib was defined by Phil Katz. The deflate + and zlib specifications were written by L. Peter Deutsch. Thanks to all the + people who reported problems and suggested various improvements in zlib; + they are too numerous to cite here. + +Copyright notice: + + (C) 1995-2004 Jean-loup Gailly and Mark Adler + + This software is provided 'as-is', without any express or implied + warranty. In no event will the authors be held liable for any damages + arising from the use of this software. + + Permission is granted to anyone to use this software for any purpose, + including commercial applications, and to alter it and redistribute it + freely, subject to the following restrictions: + + 1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. + 2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. + 3. This notice may not be removed or altered from any source distribution. + + Jean-loup Gailly Mark Adler + jloup@gzip.org madler@alumni.caltech.edu + +If you use the zlib library in a product, we would appreciate *not* +receiving lengthy legal documents to sign. The sources are provided +for free but without warranty of any kind. The library has been +entirely written by Jean-loup Gailly and Mark Adler; it does not +include third-party code. + +If you redistribute modified sources, we would appreciate that you include +in the file ChangeLog history information documenting your changes. Please +read the FAQ for more information on the distribution of modified source +versions. diff --git a/data/nsis/Contrib/nsisunz/zlib/UNZIP.H b/data/nsis/Contrib/nsisunz/zlib/UNZIP.H new file mode 100644 index 000000000..76692cb70 --- /dev/null +++ b/data/nsis/Contrib/nsisunz/zlib/UNZIP.H @@ -0,0 +1,275 @@ +/* unzip.h -- IO for uncompress .zip files using zlib + Version 0.15 beta, Mar 19th, 1998, + + Copyright (C) 1998 Gilles Vollant + + This unzip package allow extract file from .ZIP file, compatible with PKZip 2.04g + WinZip, InfoZip tools and compatible. + Encryption and multi volume ZipFile (span) are not supported. + Old compressions used by old PKZip 1.x are not supported + + THIS IS AN ALPHA VERSION. AT THIS STAGE OF DEVELOPPEMENT, SOMES API OR STRUCTURE + CAN CHANGE IN FUTURE VERSION !! + I WAIT FEEDBACK at mail info@winimage.com + Visit also http://www.winimage.com/zLibDll/unzip.htm for evolution + + Condition of use and distribution are the same than zlib : + + This software is provided 'as-is', without any express or implied + warranty. In no event will the authors be held liable for any damages + arising from the use of this software. + + Permission is granted to anyone to use this software for any purpose, + including commercial applications, and to alter it and redistribute it + freely, subject to the following restrictions: + + 1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. + 2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. + 3. This notice may not be removed or altered from any source distribution. + + +*/ +/* for more info about .ZIP format, see + ftp://ftp.cdrom.com/pub/infozip/doc/appnote-970311-iz.zip + PkWare has also a specification at : + ftp://ftp.pkware.com/probdesc.zip */ + +#ifndef _unz_H +#define _unz_H + +#ifdef __cplusplus +extern "C" { +#endif + +#ifndef _ZLIB_H +#include "zlib.h" +#endif + +#if defined(STRICTUNZIP) || defined(STRICTZIPUNZIP) +/* like the STRICT of WIN32, we define a pointer that cannot be converted + from (void*) without cast */ +typedef struct TagunzFile__ { int unused; } unzFile__; +typedef unzFile__ *unzFile; +#else +typedef voidp unzFile; +#endif + + +#define UNZ_OK (0) +#define UNZ_END_OF_LIST_OF_FILE (-100) +#define UNZ_ERRNO (Z_ERRNO) +#define UNZ_EOF (0) +#define UNZ_PARAMERROR (-102) +#define UNZ_BADZIPFILE (-103) +#define UNZ_INTERNALERROR (-104) +#define UNZ_CRCERROR (-105) + +/* tm_unz contain date/time info */ +typedef struct tm_unz_s +{ + uInt tm_sec; /* seconds after the minute - [0,59] */ + uInt tm_min; /* minutes after the hour - [0,59] */ + uInt tm_hour; /* hours since midnight - [0,23] */ + uInt tm_mday; /* day of the month - [1,31] */ + uInt tm_mon; /* months since January - [0,11] */ + uInt tm_year; /* years - [1980..2044] */ +} tm_unz; + +/* unz_global_info structure contain global data about the ZIPfile + These data comes from the end of central dir */ +typedef struct unz_global_info_s +{ + uLong number_entry; /* total number of entries in + the central dir on this disk */ + uLong size_comment; /* size of the global comment of the zipfile */ +} unz_global_info; + + +/* unz_file_info contain information about a file in the zipfile */ +typedef struct unz_file_info_s +{ + uLong version; /* version made by 2 bytes */ + uLong version_needed; /* version needed to extract 2 bytes */ + uLong flag; /* general purpose bit flag 2 bytes */ + uLong compression_method; /* compression method 2 bytes */ + uLong dosDate; /* last mod file date in Dos fmt 4 bytes */ + uLong crc; /* crc-32 4 bytes */ + uLong compressed_size; /* compressed size 4 bytes */ + uLong uncompressed_size; /* uncompressed size 4 bytes */ + uLong size_filename; /* filename length 2 bytes */ + uLong size_file_extra; /* extra field length 2 bytes */ + uLong size_file_comment; /* file comment length 2 bytes */ + + uLong disk_num_start; /* disk number start 2 bytes */ + uLong internal_fa; /* internal file attributes 2 bytes */ + uLong external_fa; /* external file attributes 4 bytes */ + + tm_unz tmu_date; +} unz_file_info; + +extern int ZEXPORT unzStringFileNameCompare OF ((const char* fileName1, + const char* fileName2, + int iCaseSensitivity)); +/* + Compare two filename (fileName1,fileName2). + If iCaseSenisivity = 1, comparision is case sensitivity (like strcmp) + If iCaseSenisivity = 2, comparision is not case sensitivity (like strcmpi + or strcasecmp) + If iCaseSenisivity = 0, case sensitivity is defaut of your operating system + (like 1 on Unix, 2 on Windows) +*/ + + +extern unzFile ZEXPORT unzOpen OF((const char *path)); +/* + Open a Zip file. path contain the full pathname (by example, + on a Windows NT computer "c:\\zlib\\zlib111.zip" or on an Unix computer + "zlib/zlib111.zip". + If the zipfile cannot be opened (file don't exist or in not valid), the + return value is NULL. + Else, the return value is a unzFile Handle, usable with other function + of this unzip package. +*/ + +extern int ZEXPORT unzClose OF((unzFile file)); +/* + Close a ZipFile opened with unzipOpen. + If there is files inside the .Zip opened with unzOpenCurrentFile (see later), + these files MUST be closed with unzipCloseCurrentFile before call unzipClose. + return UNZ_OK if there is no problem. */ + +extern int ZEXPORT unzGetGlobalInfo OF((unzFile file, + unz_global_info *pglobal_info)); +/* + Write info about the ZipFile in the *pglobal_info structure. + No preparation of the structure is needed + return UNZ_OK if there is no problem. */ + + +extern int ZEXPORT unzGetGlobalComment OF((unzFile file, + char *szComment, + uLong uSizeBuf)); +/* + Get the global comment string of the ZipFile, in the szComment buffer. + uSizeBuf is the size of the szComment buffer. + return the number of byte copied or an error code <0 +*/ + + +/***************************************************************************/ +/* Unzip package allow you browse the directory of the zipfile */ + +extern int ZEXPORT unzGoToFirstFile OF((unzFile file)); +/* + Set the current file of the zipfile to the first file. + return UNZ_OK if there is no problem +*/ + +extern int ZEXPORT unzGoToNextFile OF((unzFile file)); +/* + Set the current file of the zipfile to the next file. + return UNZ_OK if there is no problem + return UNZ_END_OF_LIST_OF_FILE if the actual file was the latest. +*/ + +extern int ZEXPORT unzLocateFile OF((unzFile file, + const char *szFileName, + int iCaseSensitivity)); +/* + Try locate the file szFileName in the zipfile. + For the iCaseSensitivity signification, see unzStringFileNameCompare + + return value : + UNZ_OK if the file is found. It becomes the current file. + UNZ_END_OF_LIST_OF_FILE if the file is not found +*/ + + +extern int ZEXPORT unzGetCurrentFileInfo OF((unzFile file, + unz_file_info *pfile_info, + char *szFileName, + uLong fileNameBufferSize, + void *extraField, + uLong extraFieldBufferSize, + char *szComment, + uLong commentBufferSize)); +/* + Get Info about the current file + if pfile_info!=NULL, the *pfile_info structure will contain somes info about + the current file + if szFileName!=NULL, the filemane string will be copied in szFileName + (fileNameBufferSize is the size of the buffer) + if extraField!=NULL, the extra field information will be copied in extraField + (extraFieldBufferSize is the size of the buffer). + This is the Central-header version of the extra field + if szComment!=NULL, the comment string of the file will be copied in szComment + (commentBufferSize is the size of the buffer) +*/ + +/***************************************************************************/ +/* for reading the content of the current zipfile, you can open it, read data + from it, and close it (you can close it before reading all the file) + */ + +extern int ZEXPORT unzOpenCurrentFile OF((unzFile file)); +/* + Open for reading data the current file in the zipfile. + If there is no error, the return value is UNZ_OK. +*/ + +extern int ZEXPORT unzCloseCurrentFile OF((unzFile file)); +/* + Close the file in zip opened with unzOpenCurrentFile + Return UNZ_CRCERROR if all the file was read but the CRC is not good +*/ + + +extern int ZEXPORT unzReadCurrentFile OF((unzFile file, + voidp buf, + unsigned len)); +/* + Read bytes from the current file (opened by unzOpenCurrentFile) + buf contain buffer where data must be copied + len the size of buf. + + return the number of byte copied if somes bytes are copied + return 0 if the end of file was reached + return <0 with error code if there is an error + (UNZ_ERRNO for IO error, or zLib error for uncompress error) +*/ + +extern z_off_t ZEXPORT unztell OF((unzFile file)); +/* + Give the current position in uncompressed data +*/ + +extern int ZEXPORT unzeof OF((unzFile file)); +/* + return 1 if the end of file was reached, 0 elsewhere +*/ + +extern int ZEXPORT unzGetLocalExtrafield OF((unzFile file, + voidp buf, + unsigned len)); +/* + Read extra field from the current file (opened by unzOpenCurrentFile) + This is the local-header version of the extra field (sometimes, there is + more info in the local-header version than in the central-header) + + if buf==NULL, it return the size of the local extra field + + if buf!=NULL, len is the size of the buffer, the extra header is copied in + buf. + the return value is the number of bytes copied in buf, or (if <0) + the error code +*/ + +#ifdef __cplusplus +} +#endif + +#endif /* _unz_H */ diff --git a/data/nsis/Contrib/nsisunz/zlib/Unzip.c b/data/nsis/Contrib/nsisunz/zlib/Unzip.c new file mode 100644 index 000000000..20e41c230 --- /dev/null +++ b/data/nsis/Contrib/nsisunz/zlib/Unzip.c @@ -0,0 +1,1297 @@ +/* unzip.c -- IO on .zip files using zlib + Version 0.15 beta, Mar 19th, 1998, + + Read unzip.h for more info +*/ +#include + + +//#include +//#include +//#include +#include "../miniclib.h" + +#include "zlib.h" +#include "unzip.h" + +//#ifdef STDC +//# include +//# include +//# include +//#endif +//#ifdef NO_ERRNO_H +// extern int errno; +//#else +//# include +//#endif + + +#ifndef local +# define local static +#endif +/* compile with -Dlocal if your debugger can't find static symbols */ + + + +#if !defined(unix) && !defined(CASESENSITIVITYDEFAULT_YES) && \ + !defined(CASESENSITIVITYDEFAULT_NO) +#define CASESENSITIVITYDEFAULT_NO +#endif + + +#ifndef UNZ_BUFSIZE +#define UNZ_BUFSIZE (16384) +#endif + +#ifndef UNZ_MAXFILENAMEINZIP +#define UNZ_MAXFILENAMEINZIP (256) +#endif + +#ifndef ALLOC +# define ALLOC(size) (GlobalAlloc(GMEM_FIXED,size)) +#endif +#ifndef TRYFREE +# define TRYFREE(p) {if (p) GlobalFree(p);} +#endif + +#define SIZECENTRALDIRITEM (0x2e) +#define SIZEZIPLOCALHEADER (0x1e) + + +/* I've found an old Unix (a SunOS 4.1.3_U1) without all SEEK_* defined.... */ + +#ifndef SEEK_CUR +#define SEEK_CUR 1 +#endif + +#ifndef SEEK_END +#define SEEK_END 2 +#endif + +#ifndef SEEK_SET +#define SEEK_SET 0 +#endif + +const char unz_copyright[] = + " unzip 0.15 Copyright 1998 Gilles Vollant "; + +/* unz_file_info_interntal contain internal info about a file in zipfile*/ +typedef struct unz_file_info_internal_s +{ + uLong offset_curfile;/* relative offset of local header 4 bytes */ +} unz_file_info_internal; + + +/* file_in_zip_read_info_s contain internal information about a file in zipfile, + when reading and decompress it */ +typedef struct +{ + char *read_buffer; /* internal buffer for compressed data */ + z_stream stream; /* zLib stream structure for inflate */ + + uLong pos_in_zipfile; /* position in byte on the zipfile, for fseek*/ + uLong stream_initialised; /* flag set if stream structure is initialised*/ + + uLong offset_local_extrafield;/* offset of the local extra field */ + uInt size_local_extrafield;/* size of the local extra field */ + uLong pos_local_extrafield; /* position in the local extra field in read*/ + + uLong crc32; /* crc32 of all data uncompressed */ + uLong crc32_wait; /* crc32 we must obtain after decompress all */ + uLong rest_read_compressed; /* number of byte to be decompressed */ + uLong rest_read_uncompressed;/*number of byte to be obtained after decomp*/ + FILE* file; /* io structore of the zipfile */ + uLong compression_method; /* compression method (0==store) */ + uLong byte_before_the_zipfile;/* byte before the zipfile, (>0 for sfx)*/ +} file_in_zip_read_info_s; + + +/* unz_s contain internal information about the zipfile +*/ +typedef struct +{ + FILE* file; /* io structore of the zipfile */ + unz_global_info gi; /* public global information */ + uLong byte_before_the_zipfile;/* byte before the zipfile, (>0 for sfx)*/ + uLong num_file; /* number of the current file in the zipfile*/ + uLong pos_in_central_dir; /* pos of the current file in the central dir*/ + uLong current_file_ok; /* flag about the usability of the current file*/ + uLong central_pos; /* position of the beginning of the central dir*/ + + uLong size_central_dir; /* size of the central directory */ + uLong offset_central_dir; /* offset of start of central directory with + respect to the starting disk number */ + + unz_file_info cur_file_info; /* public info about the current file in zip*/ + unz_file_info_internal cur_file_info_internal; /* private info about it*/ + file_in_zip_read_info_s* pfile_in_zip_read; /* structure about the current + file if we are decompressing it */ +} unz_s; + + +/* =========================================================================== + Read a byte from a gz_stream; update next_in and avail_in. Return EOF + for end of file. + IN assertion: the stream s has been sucessfully opened for reading. +*/ + + +local int unzlocal_getByte(fin,pi) + FILE *fin; + int *pi; +{ + unsigned char c; + int err = fread(&c, 1, 1, fin); + if (err==1) + { + *pi = (int)c; + return UNZ_OK; + } + else + { + if (ferror(fin)) + return UNZ_ERRNO; + else + return UNZ_EOF; + } +} + + +/* =========================================================================== + Reads a long in LSB order from the given gz_stream. Sets +*/ +local int unzlocal_getShort (fin,pX) + FILE* fin; + uLong *pX; +{ + uLong x ; + int i; + int err; + + err = unzlocal_getByte(fin,&i); + x = (uLong)i; + + if (err==UNZ_OK) + err = unzlocal_getByte(fin,&i); + x += ((uLong)i)<<8; + + if (err==UNZ_OK) + *pX = x; + else + *pX = 0; + return err; +} + +local int unzlocal_getLong (fin,pX) + FILE* fin; + uLong *pX; +{ + uLong x ; + int i; + int err; + + err = unzlocal_getByte(fin,&i); + x = (uLong)i; + + if (err==UNZ_OK) + err = unzlocal_getByte(fin,&i); + x += ((uLong)i)<<8; + + if (err==UNZ_OK) + err = unzlocal_getByte(fin,&i); + x += ((uLong)i)<<16; + + if (err==UNZ_OK) + err = unzlocal_getByte(fin,&i); + x += ((uLong)i)<<24; + + if (err==UNZ_OK) + *pX = x; + else + *pX = 0; + return err; +} + + +/* My own strcmpi / strcasecmp */ +local int strcmpcasenosensitive_internal (fileName1,fileName2) + const char* fileName1; + const char* fileName2; +{ + for (;;) + { + char c1=*(fileName1++); + char c2=*(fileName2++); + if ((c1>='a') && (c1<='z')) + c1 -= 0x20; + if ((c2>='a') && (c2<='z')) + c2 -= 0x20; + if (c1=='\0') + return ((c2=='\0') ? 0 : -1); + if (c2=='\0') + return 1; + if (c1c2) + return 1; + } +} + + +#ifdef CASESENSITIVITYDEFAULT_NO +#define CASESENSITIVITYDEFAULTVALUE 2 +#else +#define CASESENSITIVITYDEFAULTVALUE 1 +#endif + +#ifndef STRCMPCASENOSENTIVEFUNCTION +#define STRCMPCASENOSENTIVEFUNCTION strcmpcasenosensitive_internal +#endif + +/* + Compare two filename (fileName1,fileName2). + If iCaseSenisivity = 1, comparision is case sensitivity (like strcmp) + If iCaseSenisivity = 2, comparision is not case sensitivity (like strcmpi + or strcasecmp) + If iCaseSenisivity = 0, case sensitivity is defaut of your operating system + (like 1 on Unix, 2 on Windows) + +*/ +extern int ZEXPORT unzStringFileNameCompare (fileName1,fileName2,iCaseSensitivity) + const char* fileName1; + const char* fileName2; + int iCaseSensitivity; +{ + if (iCaseSensitivity==0) + iCaseSensitivity=CASESENSITIVITYDEFAULTVALUE; + + if (iCaseSensitivity==1) + return strcmp(fileName1,fileName2); + + return STRCMPCASENOSENTIVEFUNCTION(fileName1,fileName2); +} + +#define BUFREADCOMMENT (0x400) + +/* + Locate the Central directory of a zipfile (at the end, just before + the global comment) +*/ +local uLong unzlocal_SearchCentralDir(fin) + FILE *fin; +{ + unsigned char* buf; + uLong uSizeFile; + uLong uBackRead; + uLong uMaxBack=0xffff; /* maximum size of global comment */ + uLong uPosFound=0; + + if (fseek(fin,0,SEEK_END) != 0) + return 0; + + + uSizeFile = ftell( fin ); + + if (uMaxBack>uSizeFile) + uMaxBack = uSizeFile; + + buf = (unsigned char*)ALLOC(BUFREADCOMMENT+4); + if (buf==NULL) + return 0; + + uBackRead = 4; + while (uBackReaduMaxBack) + uBackRead = uMaxBack; + else + uBackRead+=BUFREADCOMMENT; + uReadPos = uSizeFile-uBackRead ; + + uReadSize = ((BUFREADCOMMENT+4) < (uSizeFile-uReadPos)) ? + (BUFREADCOMMENT+4) : (uSizeFile-uReadPos); + if (fseek(fin,uReadPos,SEEK_SET)!=0) + break; + + if (fread(buf,(uInt)uReadSize,1,fin)!=1) + break; + + for (i=(int)uReadSize-3; (i--)>0;) + if (((*(buf+i))==0x50) && ((*(buf+i+1))==0x4b) && + ((*(buf+i+2))==0x05) && ((*(buf+i+3))==0x06)) + { + uPosFound = uReadPos+i; + break; + } + + if (uPosFound!=0) + break; + } + TRYFREE(buf); + return uPosFound; +} + +/* + Open a Zip file. path contain the full pathname (by example, + on a Windows NT computer "c:\\test\\zlib109.zip" or on an Unix computer + "zlib/zlib109.zip". + If the zipfile cannot be opened (file don't exist or in not valid), the + return value is NULL. + Else, the return value is a unzFile Handle, usable with other function + of this unzip package. +*/ +extern unzFile ZEXPORT unzOpen (path) + const char *path; +{ + unz_s us; + unz_s *s; + uLong central_pos,uL; + FILE * fin ; + + uLong number_disk; /* number of the current dist, used for + spaning ZIP, unsupported, always 0*/ + uLong number_disk_with_CD; /* number the the disk with central dir, used + for spaning ZIP, unsupported, always 0*/ + uLong number_entry_CD; /* total number of entries in + the central dir + (same than number_entry on nospan) */ + + int err=UNZ_OK; + + if (unz_copyright[0]!=' ') + return NULL; + + fin=fopen(path,"rb"); + if (fin==NULL) + return NULL; + + central_pos = unzlocal_SearchCentralDir(fin); + if (central_pos==0) + err=UNZ_ERRNO; + + if (fseek(fin,central_pos,SEEK_SET)!=0) + err=UNZ_ERRNO; + + /* the signature, already checked */ + if (unzlocal_getLong(fin,&uL)!=UNZ_OK) + err=UNZ_ERRNO; + + /* number of this disk */ + if (unzlocal_getShort(fin,&number_disk)!=UNZ_OK) + err=UNZ_ERRNO; + + /* number of the disk with the start of the central directory */ + if (unzlocal_getShort(fin,&number_disk_with_CD)!=UNZ_OK) + err=UNZ_ERRNO; + + /* total number of entries in the central dir on this disk */ + if (unzlocal_getShort(fin,&us.gi.number_entry)!=UNZ_OK) + err=UNZ_ERRNO; + + /* total number of entries in the central dir */ + if (unzlocal_getShort(fin,&number_entry_CD)!=UNZ_OK) + err=UNZ_ERRNO; + + if ((number_entry_CD!=us.gi.number_entry) || + (number_disk_with_CD!=0) || + (number_disk!=0)) + err=UNZ_BADZIPFILE; + + /* size of the central directory */ + if (unzlocal_getLong(fin,&us.size_central_dir)!=UNZ_OK) + err=UNZ_ERRNO; + + /* offset of start of central directory with respect to the + starting disk number */ + if (unzlocal_getLong(fin,&us.offset_central_dir)!=UNZ_OK) + err=UNZ_ERRNO; + + /* zipfile comment length */ + if (unzlocal_getShort(fin,&us.gi.size_comment)!=UNZ_OK) + err=UNZ_ERRNO; + + if ((central_pospfile_in_zip_read!=NULL) + unzCloseCurrentFile(file); + + fclose(s->file); + TRYFREE(s); + return UNZ_OK; +} + + +/* + Write info about the ZipFile in the *pglobal_info structure. + No preparation of the structure is needed + return UNZ_OK if there is no problem. */ +extern int ZEXPORT unzGetGlobalInfo (file,pglobal_info) + unzFile file; + unz_global_info *pglobal_info; +{ + unz_s* s; + if (file==NULL) + return UNZ_PARAMERROR; + s=(unz_s*)file; + *pglobal_info=s->gi; + return UNZ_OK; +} + + +/* + Translate date/time from Dos format to tm_unz (readable more easilty) +*/ +local void unzlocal_DosDateToTmuDate (ulDosDate, ptm) + uLong ulDosDate; + tm_unz* ptm; +{ + uLong uDate; + uDate = (uLong)(ulDosDate>>16); + ptm->tm_mday = (uInt)(uDate&0x1f) ; + ptm->tm_mon = (uInt)((((uDate)&0x1E0)/0x20)-1) ; + ptm->tm_year = (uInt)(((uDate&0x0FE00)/0x0200)+1980) ; + + ptm->tm_hour = (uInt) ((ulDosDate &0xF800)/0x800); + ptm->tm_min = (uInt) ((ulDosDate&0x7E0)/0x20) ; + ptm->tm_sec = (uInt) (2*(ulDosDate&0x1f)) ; +} + +/* + Get Info about the current file in the zipfile, with internal only info +*/ +local int unzlocal_GetCurrentFileInfoInternal OF((unzFile file, + unz_file_info *pfile_info, + unz_file_info_internal + *pfile_info_internal, + char *szFileName, + uLong fileNameBufferSize, + void *extraField, + uLong extraFieldBufferSize, + char *szComment, + uLong commentBufferSize)); + +local int unzlocal_GetCurrentFileInfoInternal (file, + pfile_info, + pfile_info_internal, + szFileName, fileNameBufferSize, + extraField, extraFieldBufferSize, + szComment, commentBufferSize) + unzFile file; + unz_file_info *pfile_info; + unz_file_info_internal *pfile_info_internal; + char *szFileName; + uLong fileNameBufferSize; + void *extraField; + uLong extraFieldBufferSize; + char *szComment; + uLong commentBufferSize; +{ + unz_s* s; + unz_file_info file_info; + unz_file_info_internal file_info_internal; + int err=UNZ_OK; + uLong uMagic; + long lSeek=0; + + if (file==NULL) + return UNZ_PARAMERROR; + s=(unz_s*)file; + if (fseek(s->file,s->pos_in_central_dir+s->byte_before_the_zipfile,SEEK_SET)!=0) + err=UNZ_ERRNO; + + + /* we check the magic */ + if (err==UNZ_OK) + if (unzlocal_getLong(s->file,&uMagic) != UNZ_OK) + err=UNZ_ERRNO; + else if (uMagic!=0x02014b50) + err=UNZ_BADZIPFILE; + + if (unzlocal_getShort(s->file,&file_info.version) != UNZ_OK) + err=UNZ_ERRNO; + + if (unzlocal_getShort(s->file,&file_info.version_needed) != UNZ_OK) + err=UNZ_ERRNO; + + if (unzlocal_getShort(s->file,&file_info.flag) != UNZ_OK) + err=UNZ_ERRNO; + + if (unzlocal_getShort(s->file,&file_info.compression_method) != UNZ_OK) + err=UNZ_ERRNO; + + if (unzlocal_getLong(s->file,&file_info.dosDate) != UNZ_OK) + err=UNZ_ERRNO; + + unzlocal_DosDateToTmuDate(file_info.dosDate,&file_info.tmu_date); + + if (unzlocal_getLong(s->file,&file_info.crc) != UNZ_OK) + err=UNZ_ERRNO; + + if (unzlocal_getLong(s->file,&file_info.compressed_size) != UNZ_OK) + err=UNZ_ERRNO; + + if (unzlocal_getLong(s->file,&file_info.uncompressed_size) != UNZ_OK) + err=UNZ_ERRNO; + + if (unzlocal_getShort(s->file,&file_info.size_filename) != UNZ_OK) + err=UNZ_ERRNO; + + if (unzlocal_getShort(s->file,&file_info.size_file_extra) != UNZ_OK) + err=UNZ_ERRNO; + + if (unzlocal_getShort(s->file,&file_info.size_file_comment) != UNZ_OK) + err=UNZ_ERRNO; + + if (unzlocal_getShort(s->file,&file_info.disk_num_start) != UNZ_OK) + err=UNZ_ERRNO; + + if (unzlocal_getShort(s->file,&file_info.internal_fa) != UNZ_OK) + err=UNZ_ERRNO; + + if (unzlocal_getLong(s->file,&file_info.external_fa) != UNZ_OK) + err=UNZ_ERRNO; + + if (unzlocal_getLong(s->file,&file_info_internal.offset_curfile) != UNZ_OK) + err=UNZ_ERRNO; + + lSeek+=file_info.size_filename; + if ((err==UNZ_OK) && (szFileName!=NULL)) + { + uLong uSizeRead ; + if (file_info.size_filename0) && (fileNameBufferSize>0)) + if (fread(szFileName,(uInt)uSizeRead,1,s->file)!=1) + err=UNZ_ERRNO; + lSeek -= uSizeRead; + } + + + if ((err==UNZ_OK) && (extraField!=NULL)) + { + uLong uSizeRead ; + if (file_info.size_file_extrafile,lSeek,SEEK_CUR)==0) + lSeek=0; + else + err=UNZ_ERRNO; + if ((file_info.size_file_extra>0) && (extraFieldBufferSize>0)) + if (fread(extraField,(uInt)uSizeRead,1,s->file)!=1) + err=UNZ_ERRNO; + lSeek += file_info.size_file_extra - uSizeRead; + } + else + lSeek+=file_info.size_file_extra; + + + if ((err==UNZ_OK) && (szComment!=NULL)) + { + uLong uSizeRead ; + if (file_info.size_file_commentfile,lSeek,SEEK_CUR)==0) + lSeek=0; + else + err=UNZ_ERRNO; + if ((file_info.size_file_comment>0) && (commentBufferSize>0)) + if (fread(szComment,(uInt)uSizeRead,1,s->file)!=1) + err=UNZ_ERRNO; + lSeek+=file_info.size_file_comment - uSizeRead; + } + else + lSeek+=file_info.size_file_comment; + + if ((err==UNZ_OK) && (pfile_info!=NULL)) + *pfile_info=file_info; + + if ((err==UNZ_OK) && (pfile_info_internal!=NULL)) + *pfile_info_internal=file_info_internal; + + return err; +} + + + +/* + Write info about the ZipFile in the *pglobal_info structure. + No preparation of the structure is needed + return UNZ_OK if there is no problem. +*/ +extern int ZEXPORT unzGetCurrentFileInfo (file, + pfile_info, + szFileName, fileNameBufferSize, + extraField, extraFieldBufferSize, + szComment, commentBufferSize) + unzFile file; + unz_file_info *pfile_info; + char *szFileName; + uLong fileNameBufferSize; + void *extraField; + uLong extraFieldBufferSize; + char *szComment; + uLong commentBufferSize; +{ + return unzlocal_GetCurrentFileInfoInternal(file,pfile_info,NULL, + szFileName,fileNameBufferSize, + extraField,extraFieldBufferSize, + szComment,commentBufferSize); +} + +/* + Set the current file of the zipfile to the first file. + return UNZ_OK if there is no problem +*/ +extern int ZEXPORT unzGoToFirstFile (file) + unzFile file; +{ + int err=UNZ_OK; + unz_s* s; + if (file==NULL) + return UNZ_PARAMERROR; + s=(unz_s*)file; + s->pos_in_central_dir=s->offset_central_dir; + s->num_file=0; + err=unzlocal_GetCurrentFileInfoInternal(file,&s->cur_file_info, + &s->cur_file_info_internal, + NULL,0,NULL,0,NULL,0); + s->current_file_ok = (err == UNZ_OK); + return err; +} + + +/* + Set the current file of the zipfile to the next file. + return UNZ_OK if there is no problem + return UNZ_END_OF_LIST_OF_FILE if the actual file was the latest. +*/ +extern int ZEXPORT unzGoToNextFile (file) + unzFile file; +{ + unz_s* s; + int err; + + if (file==NULL) + return UNZ_PARAMERROR; + s=(unz_s*)file; + if (!s->current_file_ok) + return UNZ_END_OF_LIST_OF_FILE; + if (s->num_file+1==s->gi.number_entry) + return UNZ_END_OF_LIST_OF_FILE; + + s->pos_in_central_dir += SIZECENTRALDIRITEM + s->cur_file_info.size_filename + + s->cur_file_info.size_file_extra + s->cur_file_info.size_file_comment ; + s->num_file++; + err = unzlocal_GetCurrentFileInfoInternal(file,&s->cur_file_info, + &s->cur_file_info_internal, + NULL,0,NULL,0,NULL,0); + s->current_file_ok = (err == UNZ_OK); + return err; +} + + +/* + Try locate the file szFileName in the zipfile. + For the iCaseSensitivity signification, see unzipStringFileNameCompare + + return value : + UNZ_OK if the file is found. It becomes the current file. + UNZ_END_OF_LIST_OF_FILE if the file is not found +*/ +extern int ZEXPORT unzLocateFile (file, szFileName, iCaseSensitivity) + unzFile file; + const char *szFileName; + int iCaseSensitivity; +{ + unz_s* s; + int err; + + + uLong num_fileSaved; + uLong pos_in_central_dirSaved; + + + if (file==NULL) + return UNZ_PARAMERROR; + + if (strlen(szFileName)>=UNZ_MAXFILENAMEINZIP) + return UNZ_PARAMERROR; + + s=(unz_s*)file; + if (!s->current_file_ok) + return UNZ_END_OF_LIST_OF_FILE; + + num_fileSaved = s->num_file; + pos_in_central_dirSaved = s->pos_in_central_dir; + + err = unzGoToFirstFile(file); + + while (err == UNZ_OK) + { + char szCurrentFileName[UNZ_MAXFILENAMEINZIP+1]; + unzGetCurrentFileInfo(file,NULL, + szCurrentFileName,sizeof(szCurrentFileName)-1, + NULL,0,NULL,0); + if (unzStringFileNameCompare(szCurrentFileName, + szFileName,iCaseSensitivity)==0) + return UNZ_OK; + err = unzGoToNextFile(file); + } + + s->num_file = num_fileSaved ; + s->pos_in_central_dir = pos_in_central_dirSaved ; + return err; +} + + +/* + Read the local header of the current zipfile + Check the coherency of the local header and info in the end of central + directory about this file + store in *piSizeVar the size of extra info in local header + (filename and size of extra field data) +*/ +local int unzlocal_CheckCurrentFileCoherencyHeader (s,piSizeVar, + poffset_local_extrafield, + psize_local_extrafield) + unz_s* s; + uInt* piSizeVar; + uLong *poffset_local_extrafield; + uInt *psize_local_extrafield; +{ + uLong uMagic,uData,uFlags; + uLong size_filename; + uLong size_extra_field; + int err=UNZ_OK; + + *piSizeVar = 0; + *poffset_local_extrafield = 0; + *psize_local_extrafield = 0; + + if (fseek(s->file,s->cur_file_info_internal.offset_curfile + + s->byte_before_the_zipfile,SEEK_SET)!=0) + return UNZ_ERRNO; + + + if (err==UNZ_OK) + if (unzlocal_getLong(s->file,&uMagic) != UNZ_OK) + err=UNZ_ERRNO; + else if (uMagic!=0x04034b50) + err=UNZ_BADZIPFILE; + + if (unzlocal_getShort(s->file,&uData) != UNZ_OK) + err=UNZ_ERRNO; +/* + else if ((err==UNZ_OK) && (uData!=s->cur_file_info.wVersion)) + err=UNZ_BADZIPFILE; +*/ + if (unzlocal_getShort(s->file,&uFlags) != UNZ_OK) + err=UNZ_ERRNO; + + if (unzlocal_getShort(s->file,&uData) != UNZ_OK) + err=UNZ_ERRNO; + else if ((err==UNZ_OK) && (uData!=s->cur_file_info.compression_method)) + err=UNZ_BADZIPFILE; + + if ((err==UNZ_OK) && (s->cur_file_info.compression_method!=0) && + (s->cur_file_info.compression_method!=Z_DEFLATED)) + err=UNZ_BADZIPFILE; + + if (unzlocal_getLong(s->file,&uData) != UNZ_OK) /* date/time */ + err=UNZ_ERRNO; + + if (unzlocal_getLong(s->file,&uData) != UNZ_OK) /* crc */ + err=UNZ_ERRNO; + else if ((err==UNZ_OK) && (uData!=s->cur_file_info.crc) && + ((uFlags & 8)==0)) + err=UNZ_BADZIPFILE; + + if (unzlocal_getLong(s->file,&uData) != UNZ_OK) /* size compr */ + err=UNZ_ERRNO; + else if ((err==UNZ_OK) && (uData!=s->cur_file_info.compressed_size) && + ((uFlags & 8)==0)) + err=UNZ_BADZIPFILE; + + if (unzlocal_getLong(s->file,&uData) != UNZ_OK) /* size uncompr */ + err=UNZ_ERRNO; + else if ((err==UNZ_OK) && (uData!=s->cur_file_info.uncompressed_size) && + ((uFlags & 8)==0)) + err=UNZ_BADZIPFILE; + + + if (unzlocal_getShort(s->file,&size_filename) != UNZ_OK) + err=UNZ_ERRNO; + else if ((err==UNZ_OK) && (size_filename!=s->cur_file_info.size_filename)) + err=UNZ_BADZIPFILE; + + *piSizeVar += (uInt)size_filename; + + if (unzlocal_getShort(s->file,&size_extra_field) != UNZ_OK) + err=UNZ_ERRNO; + *poffset_local_extrafield= s->cur_file_info_internal.offset_curfile + + SIZEZIPLOCALHEADER + size_filename; + *psize_local_extrafield = (uInt)size_extra_field; + + *piSizeVar += (uInt)size_extra_field; + + return err; +} + +/* + Open for reading data the current file in the zipfile. + If there is no error and the file is opened, the return value is UNZ_OK. +*/ +extern int ZEXPORT unzOpenCurrentFile (file) + unzFile file; +{ + int err=UNZ_OK; + int Store; + uInt iSizeVar; + unz_s* s; + file_in_zip_read_info_s* pfile_in_zip_read_info; + uLong offset_local_extrafield; /* offset of the local extra field */ + uInt size_local_extrafield; /* size of the local extra field */ + + if (file==NULL) + return UNZ_PARAMERROR; + s=(unz_s*)file; + if (!s->current_file_ok) + return UNZ_PARAMERROR; + + if (s->pfile_in_zip_read != NULL) + unzCloseCurrentFile(file); + + if (unzlocal_CheckCurrentFileCoherencyHeader(s,&iSizeVar, + &offset_local_extrafield,&size_local_extrafield)!=UNZ_OK) + return UNZ_BADZIPFILE; + + pfile_in_zip_read_info = (file_in_zip_read_info_s*) + ALLOC(sizeof(file_in_zip_read_info_s)); + if (pfile_in_zip_read_info==NULL) + return UNZ_INTERNALERROR; + + pfile_in_zip_read_info->read_buffer=(char*)ALLOC(UNZ_BUFSIZE); + pfile_in_zip_read_info->offset_local_extrafield = offset_local_extrafield; + pfile_in_zip_read_info->size_local_extrafield = size_local_extrafield; + pfile_in_zip_read_info->pos_local_extrafield=0; + + if (pfile_in_zip_read_info->read_buffer==NULL) + { + TRYFREE(pfile_in_zip_read_info); + return UNZ_INTERNALERROR; + } + + pfile_in_zip_read_info->stream_initialised=0; + + if ((s->cur_file_info.compression_method!=0) && + (s->cur_file_info.compression_method!=Z_DEFLATED)) + err=UNZ_BADZIPFILE; + Store = s->cur_file_info.compression_method==0; + + pfile_in_zip_read_info->crc32_wait=s->cur_file_info.crc; + pfile_in_zip_read_info->crc32=0; + pfile_in_zip_read_info->compression_method = + s->cur_file_info.compression_method; + pfile_in_zip_read_info->file=s->file; + pfile_in_zip_read_info->byte_before_the_zipfile=s->byte_before_the_zipfile; + + pfile_in_zip_read_info->stream.total_out = 0; + + if (!Store) + { + pfile_in_zip_read_info->stream.zalloc = (alloc_func)0; + pfile_in_zip_read_info->stream.zfree = (free_func)0; + pfile_in_zip_read_info->stream.opaque = (voidpf)0; + + err=inflateInit2(&pfile_in_zip_read_info->stream, -MAX_WBITS); + if (err == Z_OK) + pfile_in_zip_read_info->stream_initialised=1; + /* windowBits is passed < 0 to tell that there is no zlib header. + * Note that in this case inflate *requires* an extra "dummy" byte + * after the compressed stream in order to complete decompression and + * return Z_STREAM_END. + * In unzip, i don't wait absolutely Z_STREAM_END because I known the + * size of both compressed and uncompressed data + */ + } + pfile_in_zip_read_info->rest_read_compressed = + s->cur_file_info.compressed_size ; + pfile_in_zip_read_info->rest_read_uncompressed = + s->cur_file_info.uncompressed_size ; + + + pfile_in_zip_read_info->pos_in_zipfile = + s->cur_file_info_internal.offset_curfile + SIZEZIPLOCALHEADER + + iSizeVar; + + pfile_in_zip_read_info->stream.avail_in = (uInt)0; + + + s->pfile_in_zip_read = pfile_in_zip_read_info; + return UNZ_OK; +} + + +/* + Read bytes from the current file. + buf contain buffer where data must be copied + len the size of buf. + + return the number of byte copied if somes bytes are copied + return 0 if the end of file was reached + return <0 with error code if there is an error + (UNZ_ERRNO for IO error, or zLib error for uncompress error) +*/ +extern int ZEXPORT unzReadCurrentFile (file, buf, len) + unzFile file; + voidp buf; + unsigned len; +{ + int err=UNZ_OK; + uInt iRead = 0; + unz_s* s; + file_in_zip_read_info_s* pfile_in_zip_read_info; + if (file==NULL) + return UNZ_PARAMERROR; + s=(unz_s*)file; + pfile_in_zip_read_info=s->pfile_in_zip_read; + + if (pfile_in_zip_read_info==NULL) + return UNZ_PARAMERROR; + + + if ((pfile_in_zip_read_info->read_buffer == NULL)) + return UNZ_END_OF_LIST_OF_FILE; + if (len==0) + return 0; + + pfile_in_zip_read_info->stream.next_out = (Bytef*)buf; + + pfile_in_zip_read_info->stream.avail_out = (uInt)len; + + if (len>pfile_in_zip_read_info->rest_read_uncompressed) + pfile_in_zip_read_info->stream.avail_out = + (uInt)pfile_in_zip_read_info->rest_read_uncompressed; + + while (pfile_in_zip_read_info->stream.avail_out>0) + { + if ((pfile_in_zip_read_info->stream.avail_in==0) && + (pfile_in_zip_read_info->rest_read_compressed>0)) + { + uInt uReadThis = UNZ_BUFSIZE; + if (pfile_in_zip_read_info->rest_read_compressedrest_read_compressed; + if (uReadThis == 0) + return UNZ_EOF; + if (fseek(pfile_in_zip_read_info->file, + pfile_in_zip_read_info->pos_in_zipfile + + pfile_in_zip_read_info->byte_before_the_zipfile,SEEK_SET)!=0) + return UNZ_ERRNO; + if (fread(pfile_in_zip_read_info->read_buffer,uReadThis,1, + pfile_in_zip_read_info->file)!=1) + return UNZ_ERRNO; + pfile_in_zip_read_info->pos_in_zipfile += uReadThis; + + pfile_in_zip_read_info->rest_read_compressed-=uReadThis; + + pfile_in_zip_read_info->stream.next_in = + (Bytef*)pfile_in_zip_read_info->read_buffer; + pfile_in_zip_read_info->stream.avail_in = (uInt)uReadThis; + } + + if (pfile_in_zip_read_info->compression_method==0) + { + uInt uDoCopy,i ; + if (pfile_in_zip_read_info->stream.avail_out < + pfile_in_zip_read_info->stream.avail_in) + uDoCopy = pfile_in_zip_read_info->stream.avail_out ; + else + uDoCopy = pfile_in_zip_read_info->stream.avail_in ; + + for (i=0;istream.next_out+i) = + *(pfile_in_zip_read_info->stream.next_in+i); + + pfile_in_zip_read_info->crc32 = crc32(pfile_in_zip_read_info->crc32, + pfile_in_zip_read_info->stream.next_out, + uDoCopy); + pfile_in_zip_read_info->rest_read_uncompressed-=uDoCopy; + pfile_in_zip_read_info->stream.avail_in -= uDoCopy; + pfile_in_zip_read_info->stream.avail_out -= uDoCopy; + pfile_in_zip_read_info->stream.next_out += uDoCopy; + pfile_in_zip_read_info->stream.next_in += uDoCopy; + pfile_in_zip_read_info->stream.total_out += uDoCopy; + iRead += uDoCopy; + } + else + { + uLong uTotalOutBefore,uTotalOutAfter; + const Bytef *bufBefore; + uLong uOutThis; + int flush=Z_SYNC_FLUSH; + + uTotalOutBefore = pfile_in_zip_read_info->stream.total_out; + bufBefore = pfile_in_zip_read_info->stream.next_out; + + /* + if ((pfile_in_zip_read_info->rest_read_uncompressed == + pfile_in_zip_read_info->stream.avail_out) && + (pfile_in_zip_read_info->rest_read_compressed == 0)) + flush = Z_FINISH; + */ + err=inflate(&pfile_in_zip_read_info->stream,flush); + + uTotalOutAfter = pfile_in_zip_read_info->stream.total_out; + uOutThis = uTotalOutAfter-uTotalOutBefore; + + pfile_in_zip_read_info->crc32 = + crc32(pfile_in_zip_read_info->crc32,bufBefore, + (uInt)(uOutThis)); + + pfile_in_zip_read_info->rest_read_uncompressed -= + uOutThis; + + iRead += (uInt)(uTotalOutAfter - uTotalOutBefore); + + if (err==Z_STREAM_END) + return (iRead==0) ? UNZ_EOF : iRead; + if (err!=Z_OK) + break; + } + } + + if (err==Z_OK) + return iRead; + return err; +} + + +/* + Give the current position in uncompressed data +*/ +extern z_off_t ZEXPORT unztell (file) + unzFile file; +{ + unz_s* s; + file_in_zip_read_info_s* pfile_in_zip_read_info; + if (file==NULL) + return UNZ_PARAMERROR; + s=(unz_s*)file; + pfile_in_zip_read_info=s->pfile_in_zip_read; + + if (pfile_in_zip_read_info==NULL) + return UNZ_PARAMERROR; + + return (z_off_t)pfile_in_zip_read_info->stream.total_out; +} + + +/* + return 1 if the end of file was reached, 0 elsewhere +*/ +extern int ZEXPORT unzeof (file) + unzFile file; +{ + unz_s* s; + file_in_zip_read_info_s* pfile_in_zip_read_info; + if (file==NULL) + return UNZ_PARAMERROR; + s=(unz_s*)file; + pfile_in_zip_read_info=s->pfile_in_zip_read; + + if (pfile_in_zip_read_info==NULL) + return UNZ_PARAMERROR; + + if (pfile_in_zip_read_info->rest_read_uncompressed == 0) + return 1; + else + return 0; +} + + + +/* + Read extra field from the current file (opened by unzOpenCurrentFile) + This is the local-header version of the extra field (sometimes, there is + more info in the local-header version than in the central-header) + + if buf==NULL, it return the size of the local extra field that can be read + + if buf!=NULL, len is the size of the buffer, the extra header is copied in + buf. + the return value is the number of bytes copied in buf, or (if <0) + the error code +*/ +extern int ZEXPORT unzGetLocalExtrafield (file,buf,len) + unzFile file; + voidp buf; + unsigned len; +{ + unz_s* s; + file_in_zip_read_info_s* pfile_in_zip_read_info; + uInt read_now; + uLong size_to_read; + + if (file==NULL) + return UNZ_PARAMERROR; + s=(unz_s*)file; + pfile_in_zip_read_info=s->pfile_in_zip_read; + + if (pfile_in_zip_read_info==NULL) + return UNZ_PARAMERROR; + + size_to_read = (pfile_in_zip_read_info->size_local_extrafield - + pfile_in_zip_read_info->pos_local_extrafield); + + if (buf==NULL) + return (int)size_to_read; + + if (len>size_to_read) + read_now = (uInt)size_to_read; + else + read_now = (uInt)len ; + + if (read_now==0) + return 0; + + if (fseek(pfile_in_zip_read_info->file, + pfile_in_zip_read_info->offset_local_extrafield + + pfile_in_zip_read_info->pos_local_extrafield,SEEK_SET)!=0) + return UNZ_ERRNO; + + if (fread(buf,(uInt)size_to_read,1,pfile_in_zip_read_info->file)!=1) + return UNZ_ERRNO; + + return (int)read_now; +} + +/* + Close the file in zip opened with unzipOpenCurrentFile + Return UNZ_CRCERROR if all the file was read but the CRC is not good +*/ +extern int ZEXPORT unzCloseCurrentFile (file) + unzFile file; +{ + int err=UNZ_OK; + + unz_s* s; + file_in_zip_read_info_s* pfile_in_zip_read_info; + if (file==NULL) + return UNZ_PARAMERROR; + s=(unz_s*)file; + pfile_in_zip_read_info=s->pfile_in_zip_read; + + if (pfile_in_zip_read_info==NULL) + return UNZ_PARAMERROR; + + + if (pfile_in_zip_read_info->rest_read_uncompressed == 0) + { + if (pfile_in_zip_read_info->crc32 != pfile_in_zip_read_info->crc32_wait) + err=UNZ_CRCERROR; + } + + + TRYFREE(pfile_in_zip_read_info->read_buffer); + pfile_in_zip_read_info->read_buffer = NULL; + if (pfile_in_zip_read_info->stream_initialised) + inflateEnd(&pfile_in_zip_read_info->stream); + + pfile_in_zip_read_info->stream_initialised = 0; + TRYFREE(pfile_in_zip_read_info); + + s->pfile_in_zip_read=NULL; + + return err; +} + + +/* + Get the global comment string of the ZipFile, in the szComment buffer. + uSizeBuf is the size of the szComment buffer. + return the number of byte copied or an error code <0 +*/ +extern int ZEXPORT unzGetGlobalComment (file, szComment, uSizeBuf) + unzFile file; + char *szComment; + uLong uSizeBuf; +{ + int err=UNZ_OK; + unz_s* s; + uLong uReadThis ; + if (file==NULL) + return UNZ_PARAMERROR; + s=(unz_s*)file; + + uReadThis = uSizeBuf; + if (uReadThis>s->gi.size_comment) + uReadThis = s->gi.size_comment; + + if (fseek(s->file,s->central_pos+22,SEEK_SET)!=0) + return UNZ_ERRNO; + + if (uReadThis>0) + { + *szComment='\0'; + if (fread(szComment,(uInt)uReadThis,1,s->file)!=1) + return UNZ_ERRNO; + } + + if ((szComment != NULL) && (uSizeBuf > s->gi.size_comment)) + *(szComment+s->gi.size_comment)='\0'; + return (int)uReadThis; +} diff --git a/data/nsis/Contrib/nsisunz/zlib/ZCONF.H b/data/nsis/Contrib/nsisunz/zlib/ZCONF.H new file mode 100644 index 000000000..0776aadd5 --- /dev/null +++ b/data/nsis/Contrib/nsisunz/zlib/ZCONF.H @@ -0,0 +1,330 @@ +/* zconf.h -- configuration of the zlib compression library + * Copyright (C) 1995-2004 Jean-loup Gailly. + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +/* @(#) $Id$ */ + +#ifndef ZCONF_H +#define ZCONF_H + +/* + * If you *really* need a unique prefix for all types and library functions, + * compile with -DZ_PREFIX. The "standard" zlib should be compiled without it. + */ +#ifdef Z_PREFIX +# define deflateInit_ z_deflateInit_ +# define deflate z_deflate +# define deflateEnd z_deflateEnd +# define inflateInit_ z_inflateInit_ +# define inflate z_inflate +# define inflateEnd z_inflateEnd +# define deflateInit2_ z_deflateInit2_ +# define deflateSetDictionary z_deflateSetDictionary +# define deflateCopy z_deflateCopy +# define deflateReset z_deflateReset +# define deflateParams z_deflateParams +# define deflateBound z_deflateBound +# define deflatePrime z_deflatePrime +# define inflateInit2_ z_inflateInit2_ +# define inflateSetDictionary z_inflateSetDictionary +# define inflateSync z_inflateSync +# define inflateSyncPoint z_inflateSyncPoint +# define inflateCopy z_inflateCopy +# define inflateReset z_inflateReset +# define inflateBack z_inflateBack +# define inflateBackEnd z_inflateBackEnd +# define compress z_compress +# define compress2 z_compress2 +# define compressBound z_compressBound +# define uncompress z_uncompress +# define adler32 z_adler32 +# define crc32 z_crc32 +# define get_crc_table z_get_crc_table +# define zError z_zError + +# define Byte z_Byte +# define uInt z_uInt +# define uLong z_uLong +# define Bytef z_Bytef +# define charf z_charf +# define intf z_intf +# define uIntf z_uIntf +# define uLongf z_uLongf +# define voidpf z_voidpf +# define voidp z_voidp +#endif + +#if defined(__MSDOS__) && !defined(MSDOS) +# define MSDOS +#endif +#if (defined(OS_2) || defined(__OS2__)) && !defined(OS2) +# define OS2 +#endif +#if defined(_WINDOWS) && !defined(WINDOWS) +# define WINDOWS +#endif +#if (defined(_WIN32) || defined(__WIN32__)) && !defined(WIN32) +# define WIN32 +#endif +#if (defined(MSDOS) || defined(OS2) || defined(WINDOWS)) && !defined(WIN32) +# if !defined(__GNUC__) && !defined(__FLAT__) && !defined(__386__) +# ifndef SYS16BIT +# define SYS16BIT +# endif +# endif +#endif + +/* + * Compile with -DMAXSEG_64K if the alloc function cannot allocate more + * than 64k bytes at a time (needed on systems with 16-bit int). + */ +#ifdef SYS16BIT +# define MAXSEG_64K +#endif +#ifdef MSDOS +# define UNALIGNED_OK +#endif + +#ifdef __STDC_VERSION__ +# ifndef STDC +# define STDC +# endif +# if __STDC_VERSION__ >= 199901L +# ifndef STDC99 +# define STDC99 +# endif +# endif +#endif +#if !defined(STDC) && (defined(__STDC__) || defined(__cplusplus)) +# define STDC +#endif +#if !defined(STDC) && (defined(__GNUC__) || defined(__BORLANDC__)) +# define STDC +#endif +#if !defined(STDC) && (defined(MSDOS) || defined(WINDOWS) || defined(WIN32)) +# define STDC +#endif +#if !defined(STDC) && (defined(OS2) || defined(__HOS_AIX__)) +# define STDC +#endif + +#if defined(__OS400__) && !defined(STDC) /* iSeries (formerly AS/400). */ +# define STDC +#endif + +#ifndef STDC +# ifndef const /* cannot use !defined(STDC) && !defined(const) on Mac */ +# define const /* note: need a more gentle solution here */ +# endif +#endif + +/* Some Mac compilers merge all .h files incorrectly: */ +#if defined(__MWERKS__)||defined(applec)||defined(THINK_C)||defined(__SC__) +# define NO_DUMMY_DECL +#endif + +/* Maximum value for memLevel in deflateInit2 */ +#ifndef MAX_MEM_LEVEL +# ifdef MAXSEG_64K +# define MAX_MEM_LEVEL 8 +# else +# define MAX_MEM_LEVEL 9 +# endif +#endif + +/* Maximum value for windowBits in deflateInit2 and inflateInit2. + * WARNING: reducing MAX_WBITS makes minigzip unable to extract .gz files + * created by gzip. (Files created by minigzip can still be extracted by + * gzip.) + */ +#ifndef MAX_WBITS +# define MAX_WBITS 15 /* 32K LZ77 window */ +#endif + +/* The memory requirements for deflate are (in bytes): + (1 << (windowBits+2)) + (1 << (memLevel+9)) + that is: 128K for windowBits=15 + 128K for memLevel = 8 (default values) + plus a few kilobytes for small objects. For example, if you want to reduce + the default memory requirements from 256K to 128K, compile with + make CFLAGS="-O -DMAX_WBITS=14 -DMAX_MEM_LEVEL=7" + Of course this will generally degrade compression (there's no free lunch). + + The memory requirements for inflate are (in bytes) 1 << windowBits + that is, 32K for windowBits=15 (default value) plus a few kilobytes + for small objects. +*/ + + /* Type declarations */ + +#ifndef OF /* function prototypes */ +# ifdef STDC +# define OF(args) args +# else +# define OF(args) () +# endif +#endif + +/* The following definitions for FAR are needed only for MSDOS mixed + * model programming (small or medium model with some far allocations). + * This was tested only with MSC; for other MSDOS compilers you may have + * to define NO_MEMCPY in zutil.h. If you don't need the mixed model, + * just define FAR to be empty. + */ +#ifdef SYS16BIT +# if defined(M_I86SM) || defined(M_I86MM) + /* MSC small or medium model */ +# define SMALL_MEDIUM +# ifdef _MSC_VER +# define FAR _far +# else +# define FAR far +# endif +# endif +# if (defined(__SMALL__) || defined(__MEDIUM__)) + /* Turbo C small or medium model */ +# define SMALL_MEDIUM +# ifdef __BORLANDC__ +# define FAR _far +# else +# define FAR far +# endif +# endif +#endif + +#if defined(WINDOWS) || defined(WIN32) + /* If building or using zlib as a DLL, define ZLIB_DLL. + * This is not mandatory, but it offers a little performance increase. + */ +# ifdef ZLIB_DLL +# if defined(WIN32) && (!defined(__BORLANDC__) || (__BORLANDC__ >= 0x500)) +# ifdef ZLIB_INTERNAL +# define ZEXTERN extern __declspec(dllexport) +# else +# define ZEXTERN extern __declspec(dllimport) +# endif +# endif +# endif /* ZLIB_DLL */ + /* If building or using zlib with the WINAPI/WINAPIV calling convention, + * define ZLIB_WINAPI. + * Caution: the standard ZLIB1.DLL is NOT compiled using ZLIB_WINAPI. + */ +# ifdef ZLIB_WINAPI +# ifdef FAR +# undef FAR +# endif +# include + /* No need for _export, use ZLIB.DEF instead. */ + /* For complete Windows compatibility, use WINAPI, not __stdcall. */ +# define ZEXPORT WINAPI +# ifdef WIN32 +# define ZEXPORTVA WINAPIV +# else +# define ZEXPORTVA FAR CDECL +# endif +# endif +#endif + +#if defined (__BEOS__) +# ifdef ZLIB_DLL +# ifdef ZLIB_INTERNAL +# define ZEXPORT __declspec(dllexport) +# define ZEXPORTVA __declspec(dllexport) +# else +# define ZEXPORT __declspec(dllimport) +# define ZEXPORTVA __declspec(dllimport) +# endif +# endif +#endif + +#ifndef ZEXTERN +# define ZEXTERN extern +#endif +#ifndef ZEXPORT +# define ZEXPORT +#endif +#ifndef ZEXPORTVA +# define ZEXPORTVA +#endif + +#ifndef FAR +# define FAR +#endif + +#if !defined(__MACTYPES__) +typedef unsigned char Byte; /* 8 bits */ +#endif +typedef unsigned int uInt; /* 16 bits or more */ +typedef unsigned long uLong; /* 32 bits or more */ + +#ifdef SMALL_MEDIUM + /* Borland C/C++ and some old MSC versions ignore FAR inside typedef */ +# define Bytef Byte FAR +#else + typedef Byte FAR Bytef; +#endif +typedef char FAR charf; +typedef int FAR intf; +typedef uInt FAR uIntf; +typedef uLong FAR uLongf; + +#ifdef STDC + typedef void const *voidpc; + typedef void FAR *voidpf; + typedef void *voidp; +#else + typedef Byte const *voidpc; + typedef Byte FAR *voidpf; + typedef Byte *voidp; +#endif + +#if 0 /* HAVE_UNISTD_H -- this line is updated by ./configure */ +# include /* for off_t */ +# include /* for SEEK_* and off_t */ +# ifdef VMS +# include /* for off_t */ +# endif +# define z_off_t off_t +#endif +#ifndef SEEK_SET +# define SEEK_SET 0 /* Seek from beginning of file. */ +# define SEEK_CUR 1 /* Seek from current position. */ +# define SEEK_END 2 /* Set file pointer to EOF plus "offset" */ +#endif +#ifndef z_off_t +# define z_off_t long +#endif + +#if 1 /* MINICLIB */ +# define NO_vsnprintf +#endif + +#if defined(__OS400__) +# define NO_vsnprintf +#endif + +#if defined(__MVS__) +# define NO_vsnprintf +# ifdef FAR +# undef FAR +# endif +#endif + +/* MVS linker does not support external names larger than 8 bytes */ +#if defined(__MVS__) +# pragma map(deflateInit_,"DEIN") +# pragma map(deflateInit2_,"DEIN2") +# pragma map(deflateEnd,"DEEND") +# pragma map(deflateBound,"DEBND") +# pragma map(inflateInit_,"ININ") +# pragma map(inflateInit2_,"ININ2") +# pragma map(inflateEnd,"INEND") +# pragma map(inflateSync,"INSY") +# pragma map(inflateSetDictionary,"INSEDI") +# pragma map(compressBound,"CMBND") +# pragma map(inflate_table,"INTABL") +# pragma map(inflate_fast,"INFA") +# pragma map(inflate_copyright,"INCOPY") +#endif + +#endif /* ZCONF_H */ diff --git a/data/nsis/Contrib/nsisunz/zlib/ZLIB.H b/data/nsis/Contrib/nsisunz/zlib/ZLIB.H new file mode 100644 index 000000000..b4ddd3439 --- /dev/null +++ b/data/nsis/Contrib/nsisunz/zlib/ZLIB.H @@ -0,0 +1,1200 @@ +/* zlib.h -- interface of the 'zlib' general purpose compression library + version 1.2.2, October 3rd, 2004 + + Copyright (C) 1995-2004 Jean-loup Gailly and Mark Adler + + This software is provided 'as-is', without any express or implied + warranty. In no event will the authors be held liable for any damages + arising from the use of this software. + + Permission is granted to anyone to use this software for any purpose, + including commercial applications, and to alter it and redistribute it + freely, subject to the following restrictions: + + 1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. + 2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. + 3. This notice may not be removed or altered from any source distribution. + + Jean-loup Gailly Mark Adler + jloup@gzip.org madler@alumni.caltech.edu + + + The data format used by the zlib library is described by RFCs (Request for + Comments) 1950 to 1952 in the files http://www.ietf.org/rfc/rfc1950.txt + (zlib format), rfc1951.txt (deflate format) and rfc1952.txt (gzip format). +*/ + +#ifndef ZLIB_H +#define ZLIB_H + +#include "zconf.h" + +#ifdef __cplusplus +extern "C" { +#endif + +#define ZLIB_VERSION "1.2.2" +#define ZLIB_VERNUM 0x1220 + +/* + The 'zlib' compression library provides in-memory compression and + decompression functions, including integrity checks of the uncompressed + data. This version of the library supports only one compression method + (deflation) but other algorithms will be added later and will have the same + stream interface. + + Compression can be done in a single step if the buffers are large + enough (for example if an input file is mmap'ed), or can be done by + repeated calls of the compression function. In the latter case, the + application must provide more input and/or consume the output + (providing more output space) before each call. + + The compressed data format used by default by the in-memory functions is + the zlib format, which is a zlib wrapper documented in RFC 1950, wrapped + around a deflate stream, which is itself documented in RFC 1951. + + The library also supports reading and writing files in gzip (.gz) format + with an interface similar to that of stdio using the functions that start + with "gz". The gzip format is different from the zlib format. gzip is a + gzip wrapper, documented in RFC 1952, wrapped around a deflate stream. + + This library can optionally read and write gzip streams in memory as well. + + The zlib format was designed to be compact and fast for use in memory + and on communications channels. The gzip format was designed for single- + file compression on file systems, has a larger header than zlib to maintain + directory information, and uses a different, slower check method than zlib. + + The library does not install any signal handler. The decoder checks + the consistency of the compressed data, so the library should never + crash even in case of corrupted input. +*/ + +typedef voidpf (*alloc_func) OF((voidpf opaque, uInt items, uInt size)); +typedef void (*free_func) OF((voidpf opaque, voidpf address)); + +struct internal_state; + +typedef struct z_stream_s { + Bytef *next_in; /* next input byte */ + uInt avail_in; /* number of bytes available at next_in */ + uLong total_in; /* total nb of input bytes read so far */ + + Bytef *next_out; /* next output byte should be put there */ + uInt avail_out; /* remaining free space at next_out */ + uLong total_out; /* total nb of bytes output so far */ + + char *msg; /* last error message, NULL if no error */ + struct internal_state FAR *state; /* not visible by applications */ + + alloc_func zalloc; /* used to allocate the internal state */ + free_func zfree; /* used to free the internal state */ + voidpf opaque; /* private data object passed to zalloc and zfree */ + + int data_type; /* best guess about the data type: ascii or binary */ + uLong adler; /* adler32 value of the uncompressed data */ + uLong reserved; /* reserved for future use */ +} z_stream; + +typedef z_stream FAR *z_streamp; + +/* + The application must update next_in and avail_in when avail_in has + dropped to zero. It must update next_out and avail_out when avail_out + has dropped to zero. The application must initialize zalloc, zfree and + opaque before calling the init function. All other fields are set by the + compression library and must not be updated by the application. + + The opaque value provided by the application will be passed as the first + parameter for calls of zalloc and zfree. This can be useful for custom + memory management. The compression library attaches no meaning to the + opaque value. + + zalloc must return Z_NULL if there is not enough memory for the object. + If zlib is used in a multi-threaded application, zalloc and zfree must be + thread safe. + + On 16-bit systems, the functions zalloc and zfree must be able to allocate + exactly 65536 bytes, but will not be required to allocate more than this + if the symbol MAXSEG_64K is defined (see zconf.h). WARNING: On MSDOS, + pointers returned by zalloc for objects of exactly 65536 bytes *must* + have their offset normalized to zero. The default allocation function + provided by this library ensures this (see zutil.c). To reduce memory + requirements and avoid any allocation of 64K objects, at the expense of + compression ratio, compile the library with -DMAX_WBITS=14 (see zconf.h). + + The fields total_in and total_out can be used for statistics or + progress reports. After compression, total_in holds the total size of + the uncompressed data and may be saved for use in the decompressor + (particularly if the decompressor wants to decompress everything in + a single step). +*/ + + /* constants */ + +#define Z_NO_FLUSH 0 +#define Z_PARTIAL_FLUSH 1 /* will be removed, use Z_SYNC_FLUSH instead */ +#define Z_SYNC_FLUSH 2 +#define Z_FULL_FLUSH 3 +#define Z_FINISH 4 +#define Z_BLOCK 5 +/* Allowed flush values; see deflate() and inflate() below for details */ + +#define Z_OK 0 +#define Z_STREAM_END 1 +#define Z_NEED_DICT 2 +#define Z_ERRNO (-1) +#define Z_STREAM_ERROR (-2) +#define Z_DATA_ERROR (-3) +#define Z_MEM_ERROR (-4) +#define Z_BUF_ERROR (-5) +#define Z_VERSION_ERROR (-6) +/* Return codes for the compression/decompression functions. Negative + * values are errors, positive values are used for special but normal events. + */ + +#define Z_NO_COMPRESSION 0 +#define Z_BEST_SPEED 1 +#define Z_BEST_COMPRESSION 9 +#define Z_DEFAULT_COMPRESSION (-1) +/* compression levels */ + +#define Z_FILTERED 1 +#define Z_HUFFMAN_ONLY 2 +#define Z_RLE 3 +#define Z_DEFAULT_STRATEGY 0 +/* compression strategy; see deflateInit2() below for details */ + +#define Z_BINARY 0 +#define Z_ASCII 1 +#define Z_UNKNOWN 2 +/* Possible values of the data_type field (though see inflate()) */ + +#define Z_DEFLATED 8 +/* The deflate compression method (the only one supported in this version) */ + +#define Z_NULL 0 /* for initializing zalloc, zfree, opaque */ + +#define zlib_version zlibVersion() +/* for compatibility with versions < 1.0.2 */ + + /* basic functions */ + +ZEXTERN const char * ZEXPORT zlibVersion OF((void)); +/* The application can compare zlibVersion and ZLIB_VERSION for consistency. + If the first character differs, the library code actually used is + not compatible with the zlib.h header file used by the application. + This check is automatically made by deflateInit and inflateInit. + */ + +/* +ZEXTERN int ZEXPORT deflateInit OF((z_streamp strm, int level)); + + Initializes the internal stream state for compression. The fields + zalloc, zfree and opaque must be initialized before by the caller. + If zalloc and zfree are set to Z_NULL, deflateInit updates them to + use default allocation functions. + + The compression level must be Z_DEFAULT_COMPRESSION, or between 0 and 9: + 1 gives best speed, 9 gives best compression, 0 gives no compression at + all (the input data is simply copied a block at a time). + Z_DEFAULT_COMPRESSION requests a default compromise between speed and + compression (currently equivalent to level 6). + + deflateInit returns Z_OK if success, Z_MEM_ERROR if there was not + enough memory, Z_STREAM_ERROR if level is not a valid compression level, + Z_VERSION_ERROR if the zlib library version (zlib_version) is incompatible + with the version assumed by the caller (ZLIB_VERSION). + msg is set to null if there is no error message. deflateInit does not + perform any compression: this will be done by deflate(). +*/ + + +ZEXTERN int ZEXPORT deflate OF((z_streamp strm, int flush)); +/* + deflate compresses as much data as possible, and stops when the input + buffer becomes empty or the output buffer becomes full. It may introduce some + output latency (reading input without producing any output) except when + forced to flush. + + The detailed semantics are as follows. deflate performs one or both of the + following actions: + + - Compress more input starting at next_in and update next_in and avail_in + accordingly. If not all input can be processed (because there is not + enough room in the output buffer), next_in and avail_in are updated and + processing will resume at this point for the next call of deflate(). + + - Provide more output starting at next_out and update next_out and avail_out + accordingly. This action is forced if the parameter flush is non zero. + Forcing flush frequently degrades the compression ratio, so this parameter + should be set only when necessary (in interactive applications). + Some output may be provided even if flush is not set. + + Before the call of deflate(), the application should ensure that at least + one of the actions is possible, by providing more input and/or consuming + more output, and updating avail_in or avail_out accordingly; avail_out + should never be zero before the call. The application can consume the + compressed output when it wants, for example when the output buffer is full + (avail_out == 0), or after each call of deflate(). If deflate returns Z_OK + and with zero avail_out, it must be called again after making room in the + output buffer because there might be more output pending. + + If the parameter flush is set to Z_SYNC_FLUSH, all pending output is + flushed to the output buffer and the output is aligned on a byte boundary, so + that the decompressor can get all input data available so far. (In particular + avail_in is zero after the call if enough output space has been provided + before the call.) Flushing may degrade compression for some compression + algorithms and so it should be used only when necessary. + + If flush is set to Z_FULL_FLUSH, all output is flushed as with + Z_SYNC_FLUSH, and the compression state is reset so that decompression can + restart from this point if previous compressed data has been damaged or if + random access is desired. Using Z_FULL_FLUSH too often can seriously degrade + the compression. + + If deflate returns with avail_out == 0, this function must be called again + with the same value of the flush parameter and more output space (updated + avail_out), until the flush is complete (deflate returns with non-zero + avail_out). In the case of a Z_FULL_FLUSH or Z_SYNC_FLUSH, make sure that + avail_out is greater than six to avoid repeated flush markers due to + avail_out == 0 on return. + + If the parameter flush is set to Z_FINISH, pending input is processed, + pending output is flushed and deflate returns with Z_STREAM_END if there + was enough output space; if deflate returns with Z_OK, this function must be + called again with Z_FINISH and more output space (updated avail_out) but no + more input data, until it returns with Z_STREAM_END or an error. After + deflate has returned Z_STREAM_END, the only possible operations on the + stream are deflateReset or deflateEnd. + + Z_FINISH can be used immediately after deflateInit if all the compression + is to be done in a single step. In this case, avail_out must be at least + the value returned by deflateBound (see below). If deflate does not return + Z_STREAM_END, then it must be called again as described above. + + deflate() sets strm->adler to the adler32 checksum of all input read + so far (that is, total_in bytes). + + deflate() may update data_type if it can make a good guess about + the input data type (Z_ASCII or Z_BINARY). In doubt, the data is considered + binary. This field is only for information purposes and does not affect + the compression algorithm in any manner. + + deflate() returns Z_OK if some progress has been made (more input + processed or more output produced), Z_STREAM_END if all input has been + consumed and all output has been produced (only when flush is set to + Z_FINISH), Z_STREAM_ERROR if the stream state was inconsistent (for example + if next_in or next_out was NULL), Z_BUF_ERROR if no progress is possible + (for example avail_in or avail_out was zero). Note that Z_BUF_ERROR is not + fatal, and deflate() can be called again with more input and more output + space to continue compressing. +*/ + + +ZEXTERN int ZEXPORT deflateEnd OF((z_streamp strm)); +/* + All dynamically allocated data structures for this stream are freed. + This function discards any unprocessed input and does not flush any + pending output. + + deflateEnd returns Z_OK if success, Z_STREAM_ERROR if the + stream state was inconsistent, Z_DATA_ERROR if the stream was freed + prematurely (some input or output was discarded). In the error case, + msg may be set but then points to a static string (which must not be + deallocated). +*/ + + +/* +ZEXTERN int ZEXPORT inflateInit OF((z_streamp strm)); + + Initializes the internal stream state for decompression. The fields + next_in, avail_in, zalloc, zfree and opaque must be initialized before by + the caller. If next_in is not Z_NULL and avail_in is large enough (the exact + value depends on the compression method), inflateInit determines the + compression method from the zlib header and allocates all data structures + accordingly; otherwise the allocation will be deferred to the first call of + inflate. If zalloc and zfree are set to Z_NULL, inflateInit updates them to + use default allocation functions. + + inflateInit returns Z_OK if success, Z_MEM_ERROR if there was not enough + memory, Z_VERSION_ERROR if the zlib library version is incompatible with the + version assumed by the caller. msg is set to null if there is no error + message. inflateInit does not perform any decompression apart from reading + the zlib header if present: this will be done by inflate(). (So next_in and + avail_in may be modified, but next_out and avail_out are unchanged.) +*/ + + +ZEXTERN int ZEXPORT inflate OF((z_streamp strm, int flush)); +/* + inflate decompresses as much data as possible, and stops when the input + buffer becomes empty or the output buffer becomes full. It may introduce + some output latency (reading input without producing any output) except when + forced to flush. + + The detailed semantics are as follows. inflate performs one or both of the + following actions: + + - Decompress more input starting at next_in and update next_in and avail_in + accordingly. If not all input can be processed (because there is not + enough room in the output buffer), next_in is updated and processing + will resume at this point for the next call of inflate(). + + - Provide more output starting at next_out and update next_out and avail_out + accordingly. inflate() provides as much output as possible, until there + is no more input data or no more space in the output buffer (see below + about the flush parameter). + + Before the call of inflate(), the application should ensure that at least + one of the actions is possible, by providing more input and/or consuming + more output, and updating the next_* and avail_* values accordingly. + The application can consume the uncompressed output when it wants, for + example when the output buffer is full (avail_out == 0), or after each + call of inflate(). If inflate returns Z_OK and with zero avail_out, it + must be called again after making room in the output buffer because there + might be more output pending. + + The flush parameter of inflate() can be Z_NO_FLUSH, Z_SYNC_FLUSH, + Z_FINISH, or Z_BLOCK. Z_SYNC_FLUSH requests that inflate() flush as much + output as possible to the output buffer. Z_BLOCK requests that inflate() stop + if and when it get to the next deflate block boundary. When decoding the zlib + or gzip format, this will cause inflate() to return immediately after the + header and before the first block. When doing a raw inflate, inflate() will + go ahead and process the first block, and will return when it gets to the end + of that block, or when it runs out of data. + + The Z_BLOCK option assists in appending to or combining deflate streams. + Also to assist in this, on return inflate() will set strm->data_type to the + number of unused bits in the last byte taken from strm->next_in, plus 64 + if inflate() is currently decoding the last block in the deflate stream, + plus 128 if inflate() returned immediately after decoding an end-of-block + code or decoding the complete header up to just before the first byte of the + deflate stream. The end-of-block will not be indicated until all of the + uncompressed data from that block has been written to strm->next_out. The + number of unused bits may in general be greater than seven, except when + bit 7 of data_type is set, in which case the number of unused bits will be + less than eight. + + inflate() should normally be called until it returns Z_STREAM_END or an + error. However if all decompression is to be performed in a single step + (a single call of inflate), the parameter flush should be set to + Z_FINISH. In this case all pending input is processed and all pending + output is flushed; avail_out must be large enough to hold all the + uncompressed data. (The size of the uncompressed data may have been saved + by the compressor for this purpose.) The next operation on this stream must + be inflateEnd to deallocate the decompression state. The use of Z_FINISH + is never required, but can be used to inform inflate that a faster approach + may be used for the single inflate() call. + + In this implementation, inflate() always flushes as much output as + possible to the output buffer, and always uses the faster approach on the + first call. So the only effect of the flush parameter in this implementation + is on the return value of inflate(), as noted below, or when it returns early + because Z_BLOCK is used. + + If a preset dictionary is needed after this call (see inflateSetDictionary + below), inflate sets strm->adler to the adler32 checksum of the dictionary + chosen by the compressor and returns Z_NEED_DICT; otherwise it sets + strm->adler to the adler32 checksum of all output produced so far (that is, + total_out bytes) and returns Z_OK, Z_STREAM_END or an error code as described + below. At the end of the stream, inflate() checks that its computed adler32 + checksum is equal to that saved by the compressor and returns Z_STREAM_END + only if the checksum is correct. + + inflate() will decompress and check either zlib-wrapped or gzip-wrapped + deflate data. The header type is detected automatically. Any information + contained in the gzip header is not retained, so applications that need that + information should instead use raw inflate, see inflateInit2() below, or + inflateBack() and perform their own processing of the gzip header and + trailer. + + inflate() returns Z_OK if some progress has been made (more input processed + or more output produced), Z_STREAM_END if the end of the compressed data has + been reached and all uncompressed output has been produced, Z_NEED_DICT if a + preset dictionary is needed at this point, Z_DATA_ERROR if the input data was + corrupted (input stream not conforming to the zlib format or incorrect check + value), Z_STREAM_ERROR if the stream structure was inconsistent (for example + if next_in or next_out was NULL), Z_MEM_ERROR if there was not enough memory, + Z_BUF_ERROR if no progress is possible or if there was not enough room in the + output buffer when Z_FINISH is used. Note that Z_BUF_ERROR is not fatal, and + inflate() can be called again with more input and more output space to + continue decompressing. If Z_DATA_ERROR is returned, the application may then + call inflateSync() to look for a good compression block if a partial recovery + of the data is desired. +*/ + + +ZEXTERN int ZEXPORT inflateEnd OF((z_streamp strm)); +/* + All dynamically allocated data structures for this stream are freed. + This function discards any unprocessed input and does not flush any + pending output. + + inflateEnd returns Z_OK if success, Z_STREAM_ERROR if the stream state + was inconsistent. In the error case, msg may be set but then points to a + static string (which must not be deallocated). +*/ + + /* Advanced functions */ + +/* + The following functions are needed only in some special applications. +*/ + +/* +ZEXTERN int ZEXPORT deflateInit2 OF((z_streamp strm, + int level, + int method, + int windowBits, + int memLevel, + int strategy)); + + This is another version of deflateInit with more compression options. The + fields next_in, zalloc, zfree and opaque must be initialized before by + the caller. + + The method parameter is the compression method. It must be Z_DEFLATED in + this version of the library. + + The windowBits parameter is the base two logarithm of the window size + (the size of the history buffer). It should be in the range 8..15 for this + version of the library. Larger values of this parameter result in better + compression at the expense of memory usage. The default value is 15 if + deflateInit is used instead. + + windowBits can also be -8..-15 for raw deflate. In this case, -windowBits + determines the window size. deflate() will then generate raw deflate data + with no zlib header or trailer, and will not compute an adler32 check value. + + windowBits can also be greater than 15 for optional gzip encoding. Add + 16 to windowBits to write a simple gzip header and trailer around the + compressed data instead of a zlib wrapper. The gzip header will have no + file name, no extra data, no comment, no modification time (set to zero), + no header crc, and the operating system will be set to 255 (unknown). If a + gzip stream is being written, strm->adler is a crc32 instead of an adler32. + + The memLevel parameter specifies how much memory should be allocated + for the internal compression state. memLevel=1 uses minimum memory but + is slow and reduces compression ratio; memLevel=9 uses maximum memory + for optimal speed. The default value is 8. See zconf.h for total memory + usage as a function of windowBits and memLevel. + + The strategy parameter is used to tune the compression algorithm. Use the + value Z_DEFAULT_STRATEGY for normal data, Z_FILTERED for data produced by a + filter (or predictor), Z_HUFFMAN_ONLY to force Huffman encoding only (no + string match), or Z_RLE to limit match distances to one (run-length + encoding). Filtered data consists mostly of small values with a somewhat + random distribution. In this case, the compression algorithm is tuned to + compress them better. The effect of Z_FILTERED is to force more Huffman + coding and less string matching; it is somewhat intermediate between + Z_DEFAULT and Z_HUFFMAN_ONLY. Z_RLE is designed to be almost as fast as + Z_HUFFMAN_ONLY, but give better compression for PNG image data. The strategy + parameter only affects the compression ratio but not the correctness of the + compressed output even if it is not set appropriately. + + deflateInit2 returns Z_OK if success, Z_MEM_ERROR if there was not enough + memory, Z_STREAM_ERROR if a parameter is invalid (such as an invalid + method). msg is set to null if there is no error message. deflateInit2 does + not perform any compression: this will be done by deflate(). +*/ + +ZEXTERN int ZEXPORT deflateSetDictionary OF((z_streamp strm, + const Bytef *dictionary, + uInt dictLength)); +/* + Initializes the compression dictionary from the given byte sequence + without producing any compressed output. This function must be called + immediately after deflateInit, deflateInit2 or deflateReset, before any + call of deflate. The compressor and decompressor must use exactly the same + dictionary (see inflateSetDictionary). + + The dictionary should consist of strings (byte sequences) that are likely + to be encountered later in the data to be compressed, with the most commonly + used strings preferably put towards the end of the dictionary. Using a + dictionary is most useful when the data to be compressed is short and can be + predicted with good accuracy; the data can then be compressed better than + with the default empty dictionary. + + Depending on the size of the compression data structures selected by + deflateInit or deflateInit2, a part of the dictionary may in effect be + discarded, for example if the dictionary is larger than the window size in + deflate or deflate2. Thus the strings most likely to be useful should be + put at the end of the dictionary, not at the front. + + Upon return of this function, strm->adler is set to the adler32 value + of the dictionary; the decompressor may later use this value to determine + which dictionary has been used by the compressor. (The adler32 value + applies to the whole dictionary even if only a subset of the dictionary is + actually used by the compressor.) If a raw deflate was requested, then the + adler32 value is not computed and strm->adler is not set. + + deflateSetDictionary returns Z_OK if success, or Z_STREAM_ERROR if a + parameter is invalid (such as NULL dictionary) or the stream state is + inconsistent (for example if deflate has already been called for this stream + or if the compression method is bsort). deflateSetDictionary does not + perform any compression: this will be done by deflate(). +*/ + +ZEXTERN int ZEXPORT deflateCopy OF((z_streamp dest, + z_streamp source)); +/* + Sets the destination stream as a complete copy of the source stream. + + This function can be useful when several compression strategies will be + tried, for example when there are several ways of pre-processing the input + data with a filter. The streams that will be discarded should then be freed + by calling deflateEnd. Note that deflateCopy duplicates the internal + compression state which can be quite large, so this strategy is slow and + can consume lots of memory. + + deflateCopy returns Z_OK if success, Z_MEM_ERROR if there was not + enough memory, Z_STREAM_ERROR if the source stream state was inconsistent + (such as zalloc being NULL). msg is left unchanged in both source and + destination. +*/ + +ZEXTERN int ZEXPORT deflateReset OF((z_streamp strm)); +/* + This function is equivalent to deflateEnd followed by deflateInit, + but does not free and reallocate all the internal compression state. + The stream will keep the same compression level and any other attributes + that may have been set by deflateInit2. + + deflateReset returns Z_OK if success, or Z_STREAM_ERROR if the source + stream state was inconsistent (such as zalloc or state being NULL). +*/ + +ZEXTERN int ZEXPORT deflateParams OF((z_streamp strm, + int level, + int strategy)); +/* + Dynamically update the compression level and compression strategy. The + interpretation of level and strategy is as in deflateInit2. This can be + used to switch between compression and straight copy of the input data, or + to switch to a different kind of input data requiring a different + strategy. If the compression level is changed, the input available so far + is compressed with the old level (and may be flushed); the new level will + take effect only at the next call of deflate(). + + Before the call of deflateParams, the stream state must be set as for + a call of deflate(), since the currently available input may have to + be compressed and flushed. In particular, strm->avail_out must be non-zero. + + deflateParams returns Z_OK if success, Z_STREAM_ERROR if the source + stream state was inconsistent or if a parameter was invalid, Z_BUF_ERROR + if strm->avail_out was zero. +*/ + +ZEXTERN uLong ZEXPORT deflateBound OF((z_streamp strm, + uLong sourceLen)); +/* + deflateBound() returns an upper bound on the compressed size after + deflation of sourceLen bytes. It must be called after deflateInit() + or deflateInit2(). This would be used to allocate an output buffer + for deflation in a single pass, and so would be called before deflate(). +*/ + +ZEXTERN int ZEXPORT deflatePrime OF((z_streamp strm, + int bits, + int value)); +/* + deflatePrime() inserts bits in the deflate output stream. The intent + is that this function is used to start off the deflate output with the + bits leftover from a previous deflate stream when appending to it. As such, + this function can only be used for raw deflate, and must be used before the + first deflate() call after a deflateInit2() or deflateReset(). bits must be + less than or equal to 16, and that many of the least significant bits of + value will be inserted in the output. + + deflatePrime returns Z_OK if success, or Z_STREAM_ERROR if the source + stream state was inconsistent. +*/ + +/* +ZEXTERN int ZEXPORT inflateInit2 OF((z_streamp strm, + int windowBits)); + + This is another version of inflateInit with an extra parameter. The + fields next_in, avail_in, zalloc, zfree and opaque must be initialized + before by the caller. + + The windowBits parameter is the base two logarithm of the maximum window + size (the size of the history buffer). It should be in the range 8..15 for + this version of the library. The default value is 15 if inflateInit is used + instead. windowBits must be greater than or equal to the windowBits value + provided to deflateInit2() while compressing, or it must be equal to 15 if + deflateInit2() was not used. If a compressed stream with a larger window + size is given as input, inflate() will return with the error code + Z_DATA_ERROR instead of trying to allocate a larger window. + + windowBits can also be -8..-15 for raw inflate. In this case, -windowBits + determines the window size. inflate() will then process raw deflate data, + not looking for a zlib or gzip header, not generating a check value, and not + looking for any check values for comparison at the end of the stream. This + is for use with other formats that use the deflate compressed data format + such as zip. Those formats provide their own check values. If a custom + format is developed using the raw deflate format for compressed data, it is + recommended that a check value such as an adler32 or a crc32 be applied to + the uncompressed data as is done in the zlib, gzip, and zip formats. For + most applications, the zlib format should be used as is. Note that comments + above on the use in deflateInit2() applies to the magnitude of windowBits. + + windowBits can also be greater than 15 for optional gzip decoding. Add + 32 to windowBits to enable zlib and gzip decoding with automatic header + detection, or add 16 to decode only the gzip format (the zlib format will + return a Z_DATA_ERROR. If a gzip stream is being decoded, strm->adler is + a crc32 instead of an adler32. + + inflateInit2 returns Z_OK if success, Z_MEM_ERROR if there was not enough + memory, Z_STREAM_ERROR if a parameter is invalid (such as a negative + memLevel). msg is set to null if there is no error message. inflateInit2 + does not perform any decompression apart from reading the zlib header if + present: this will be done by inflate(). (So next_in and avail_in may be + modified, but next_out and avail_out are unchanged.) +*/ + +ZEXTERN int ZEXPORT inflateSetDictionary OF((z_streamp strm, + const Bytef *dictionary, + uInt dictLength)); +/* + Initializes the decompression dictionary from the given uncompressed byte + sequence. This function must be called immediately after a call of inflate + if this call returned Z_NEED_DICT. The dictionary chosen by the compressor + can be determined from the adler32 value returned by this call of + inflate. The compressor and decompressor must use exactly the same + dictionary (see deflateSetDictionary). + + inflateSetDictionary returns Z_OK if success, Z_STREAM_ERROR if a + parameter is invalid (such as NULL dictionary) or the stream state is + inconsistent, Z_DATA_ERROR if the given dictionary doesn't match the + expected one (incorrect adler32 value). inflateSetDictionary does not + perform any decompression: this will be done by subsequent calls of + inflate(). +*/ + +ZEXTERN int ZEXPORT inflateSync OF((z_streamp strm)); +/* + Skips invalid compressed data until a full flush point (see above the + description of deflate with Z_FULL_FLUSH) can be found, or until all + available input is skipped. No output is provided. + + inflateSync returns Z_OK if a full flush point has been found, Z_BUF_ERROR + if no more input was provided, Z_DATA_ERROR if no flush point has been found, + or Z_STREAM_ERROR if the stream structure was inconsistent. In the success + case, the application may save the current current value of total_in which + indicates where valid compressed data was found. In the error case, the + application may repeatedly call inflateSync, providing more input each time, + until success or end of the input data. +*/ + +ZEXTERN int ZEXPORT inflateCopy OF((z_streamp dest, + z_streamp source)); +/* + Sets the destination stream as a complete copy of the source stream. + + This function can be useful when randomly accessing a large stream. The + first pass through the stream can periodically record the inflate state, + allowing restarting inflate at those points when randomly accessing the + stream. + + inflateCopy returns Z_OK if success, Z_MEM_ERROR if there was not + enough memory, Z_STREAM_ERROR if the source stream state was inconsistent + (such as zalloc being NULL). msg is left unchanged in both source and + destination. +*/ + +ZEXTERN int ZEXPORT inflateReset OF((z_streamp strm)); +/* + This function is equivalent to inflateEnd followed by inflateInit, + but does not free and reallocate all the internal decompression state. + The stream will keep attributes that may have been set by inflateInit2. + + inflateReset returns Z_OK if success, or Z_STREAM_ERROR if the source + stream state was inconsistent (such as zalloc or state being NULL). +*/ + +/* +ZEXTERN int ZEXPORT inflateBackInit OF((z_stream FAR *strm, int windowBits, + unsigned char FAR *window)); + + Initialize the internal stream state for decompression using inflateBack() + calls. The fields zalloc, zfree and opaque in strm must be initialized + before the call. If zalloc and zfree are Z_NULL, then the default library- + derived memory allocation routines are used. windowBits is the base two + logarithm of the window size, in the range 8..15. window is a caller + supplied buffer of that size. Except for special applications where it is + assured that deflate was used with small window sizes, windowBits must be 15 + and a 32K byte window must be supplied to be able to decompress general + deflate streams. + + See inflateBack() for the usage of these routines. + + inflateBackInit will return Z_OK on success, Z_STREAM_ERROR if any of + the paramaters are invalid, Z_MEM_ERROR if the internal state could not + be allocated, or Z_VERSION_ERROR if the version of the library does not + match the version of the header file. +*/ + +typedef unsigned (*in_func) OF((void FAR *, unsigned char FAR * FAR *)); +typedef int (*out_func) OF((void FAR *, unsigned char FAR *, unsigned)); + +ZEXTERN int ZEXPORT inflateBack OF((z_stream FAR *strm, + in_func in, void FAR *in_desc, + out_func out, void FAR *out_desc)); +/* + inflateBack() does a raw inflate with a single call using a call-back + interface for input and output. This is more efficient than inflate() for + file i/o applications in that it avoids copying between the output and the + sliding window by simply making the window itself the output buffer. This + function trusts the application to not change the output buffer passed by + the output function, at least until inflateBack() returns. + + inflateBackInit() must be called first to allocate the internal state + and to initialize the state with the user-provided window buffer. + inflateBack() may then be used multiple times to inflate a complete, raw + deflate stream with each call. inflateBackEnd() is then called to free + the allocated state. + + A raw deflate stream is one with no zlib or gzip header or trailer. + This routine would normally be used in a utility that reads zip or gzip + files and writes out uncompressed files. The utility would decode the + header and process the trailer on its own, hence this routine expects + only the raw deflate stream to decompress. This is different from the + normal behavior of inflate(), which expects either a zlib or gzip header and + trailer around the deflate stream. + + inflateBack() uses two subroutines supplied by the caller that are then + called by inflateBack() for input and output. inflateBack() calls those + routines until it reads a complete deflate stream and writes out all of the + uncompressed data, or until it encounters an error. The function's + parameters and return types are defined above in the in_func and out_func + typedefs. inflateBack() will call in(in_desc, &buf) which should return the + number of bytes of provided input, and a pointer to that input in buf. If + there is no input available, in() must return zero--buf is ignored in that + case--and inflateBack() will return a buffer error. inflateBack() will call + out(out_desc, buf, len) to write the uncompressed data buf[0..len-1]. out() + should return zero on success, or non-zero on failure. If out() returns + non-zero, inflateBack() will return with an error. Neither in() nor out() + are permitted to change the contents of the window provided to + inflateBackInit(), which is also the buffer that out() uses to write from. + The length written by out() will be at most the window size. Any non-zero + amount of input may be provided by in(). + + For convenience, inflateBack() can be provided input on the first call by + setting strm->next_in and strm->avail_in. If that input is exhausted, then + in() will be called. Therefore strm->next_in must be initialized before + calling inflateBack(). If strm->next_in is Z_NULL, then in() will be called + immediately for input. If strm->next_in is not Z_NULL, then strm->avail_in + must also be initialized, and then if strm->avail_in is not zero, input will + initially be taken from strm->next_in[0 .. strm->avail_in - 1]. + + The in_desc and out_desc parameters of inflateBack() is passed as the + first parameter of in() and out() respectively when they are called. These + descriptors can be optionally used to pass any information that the caller- + supplied in() and out() functions need to do their job. + + On return, inflateBack() will set strm->next_in and strm->avail_in to + pass back any unused input that was provided by the last in() call. The + return values of inflateBack() can be Z_STREAM_END on success, Z_BUF_ERROR + if in() or out() returned an error, Z_DATA_ERROR if there was a format + error in the deflate stream (in which case strm->msg is set to indicate the + nature of the error), or Z_STREAM_ERROR if the stream was not properly + initialized. In the case of Z_BUF_ERROR, an input or output error can be + distinguished using strm->next_in which will be Z_NULL only if in() returned + an error. If strm->next is not Z_NULL, then the Z_BUF_ERROR was due to + out() returning non-zero. (in() will always be called before out(), so + strm->next_in is assured to be defined if out() returns non-zero.) Note + that inflateBack() cannot return Z_OK. +*/ + +ZEXTERN int ZEXPORT inflateBackEnd OF((z_stream FAR *strm)); +/* + All memory allocated by inflateBackInit() is freed. + + inflateBackEnd() returns Z_OK on success, or Z_STREAM_ERROR if the stream + state was inconsistent. +*/ + +ZEXTERN uLong ZEXPORT zlibCompileFlags OF((void)); +/* Return flags indicating compile-time options. + + Type sizes, two bits each, 00 = 16 bits, 01 = 32, 10 = 64, 11 = other: + 1.0: size of uInt + 3.2: size of uLong + 5.4: size of voidpf (pointer) + 7.6: size of z_off_t + + Compiler, assembler, and debug options: + 8: DEBUG + 9: ASMV or ASMINF -- use ASM code + 10: ZLIB_WINAPI -- exported functions use the WINAPI calling convention + 11: 0 (reserved) + + One-time table building (smaller code, but not thread-safe if true): + 12: BUILDFIXED -- build static block decoding tables when needed + 13: DYNAMIC_CRC_TABLE -- build CRC calculation tables when needed + 14,15: 0 (reserved) + + Library content (indicates missing functionality): + 16: NO_GZCOMPRESS -- gz* functions cannot compress (to avoid linking + deflate code when not needed) + 17: NO_GZIP -- deflate can't write gzip streams, and inflate can't detect + and decode gzip streams (to avoid linking crc code) + 18-19: 0 (reserved) + + Operation variations (changes in library functionality): + 20: PKZIP_BUG_WORKAROUND -- slightly more permissive inflate + 21: FASTEST -- deflate algorithm with only one, lowest compression level + 22,23: 0 (reserved) + + The sprintf variant used by gzprintf (zero is best): + 24: 0 = vs*, 1 = s* -- 1 means limited to 20 arguments after the format + 25: 0 = *nprintf, 1 = *printf -- 1 means gzprintf() not secure! + 26: 0 = returns value, 1 = void -- 1 means inferred string length returned + + Remainder: + 27-31: 0 (reserved) + */ + + + /* utility functions */ + +/* + The following utility functions are implemented on top of the + basic stream-oriented functions. To simplify the interface, some + default options are assumed (compression level and memory usage, + standard memory allocation functions). The source code of these + utility functions can easily be modified if you need special options. +*/ + +ZEXTERN int ZEXPORT compress OF((Bytef *dest, uLongf *destLen, + const Bytef *source, uLong sourceLen)); +/* + Compresses the source buffer into the destination buffer. sourceLen is + the byte length of the source buffer. Upon entry, destLen is the total + size of the destination buffer, which must be at least the value returned + by compressBound(sourceLen). Upon exit, destLen is the actual size of the + compressed buffer. + This function can be used to compress a whole file at once if the + input file is mmap'ed. + compress returns Z_OK if success, Z_MEM_ERROR if there was not + enough memory, Z_BUF_ERROR if there was not enough room in the output + buffer. +*/ + +ZEXTERN int ZEXPORT compress2 OF((Bytef *dest, uLongf *destLen, + const Bytef *source, uLong sourceLen, + int level)); +/* + Compresses the source buffer into the destination buffer. The level + parameter has the same meaning as in deflateInit. sourceLen is the byte + length of the source buffer. Upon entry, destLen is the total size of the + destination buffer, which must be at least the value returned by + compressBound(sourceLen). Upon exit, destLen is the actual size of the + compressed buffer. + + compress2 returns Z_OK if success, Z_MEM_ERROR if there was not enough + memory, Z_BUF_ERROR if there was not enough room in the output buffer, + Z_STREAM_ERROR if the level parameter is invalid. +*/ + +ZEXTERN uLong ZEXPORT compressBound OF((uLong sourceLen)); +/* + compressBound() returns an upper bound on the compressed size after + compress() or compress2() on sourceLen bytes. It would be used before + a compress() or compress2() call to allocate the destination buffer. +*/ + +ZEXTERN int ZEXPORT uncompress OF((Bytef *dest, uLongf *destLen, + const Bytef *source, uLong sourceLen)); +/* + Decompresses the source buffer into the destination buffer. sourceLen is + the byte length of the source buffer. Upon entry, destLen is the total + size of the destination buffer, which must be large enough to hold the + entire uncompressed data. (The size of the uncompressed data must have + been saved previously by the compressor and transmitted to the decompressor + by some mechanism outside the scope of this compression library.) + Upon exit, destLen is the actual size of the compressed buffer. + This function can be used to decompress a whole file at once if the + input file is mmap'ed. + + uncompress returns Z_OK if success, Z_MEM_ERROR if there was not + enough memory, Z_BUF_ERROR if there was not enough room in the output + buffer, or Z_DATA_ERROR if the input data was corrupted or incomplete. +*/ + + +typedef voidp gzFile; + +ZEXTERN gzFile ZEXPORT gzopen OF((const char *path, const char *mode)); +/* + Opens a gzip (.gz) file for reading or writing. The mode parameter + is as in fopen ("rb" or "wb") but can also include a compression level + ("wb9") or a strategy: 'f' for filtered data as in "wb6f", 'h' for + Huffman only compression as in "wb1h", or 'R' for run-length encoding + as in "wb1R". (See the description of deflateInit2 for more information + about the strategy parameter.) + + gzopen can be used to read a file which is not in gzip format; in this + case gzread will directly read from the file without decompression. + + gzopen returns NULL if the file could not be opened or if there was + insufficient memory to allocate the (de)compression state; errno + can be checked to distinguish the two cases (if errno is zero, the + zlib error is Z_MEM_ERROR). */ + +ZEXTERN gzFile ZEXPORT gzdopen OF((int fd, const char *mode)); +/* + gzdopen() associates a gzFile with the file descriptor fd. File + descriptors are obtained from calls like open, dup, creat, pipe or + fileno (in the file has been previously opened with fopen). + The mode parameter is as in gzopen. + The next call of gzclose on the returned gzFile will also close the + file descriptor fd, just like fclose(fdopen(fd), mode) closes the file + descriptor fd. If you want to keep fd open, use gzdopen(dup(fd), mode). + gzdopen returns NULL if there was insufficient memory to allocate + the (de)compression state. +*/ + +ZEXTERN int ZEXPORT gzsetparams OF((gzFile file, int level, int strategy)); +/* + Dynamically update the compression level or strategy. See the description + of deflateInit2 for the meaning of these parameters. + gzsetparams returns Z_OK if success, or Z_STREAM_ERROR if the file was not + opened for writing. +*/ + +ZEXTERN int ZEXPORT gzread OF((gzFile file, voidp buf, unsigned len)); +/* + Reads the given number of uncompressed bytes from the compressed file. + If the input file was not in gzip format, gzread copies the given number + of bytes into the buffer. + gzread returns the number of uncompressed bytes actually read (0 for + end of file, -1 for error). */ + +ZEXTERN int ZEXPORT gzwrite OF((gzFile file, + voidpc buf, unsigned len)); +/* + Writes the given number of uncompressed bytes into the compressed file. + gzwrite returns the number of uncompressed bytes actually written + (0 in case of error). +*/ + +ZEXTERN int ZEXPORTVA gzprintf OF((gzFile file, const char *format, ...)); +/* + Converts, formats, and writes the args to the compressed file under + control of the format string, as in fprintf. gzprintf returns the number of + uncompressed bytes actually written (0 in case of error). The number of + uncompressed bytes written is limited to 4095. The caller should assure that + this limit is not exceeded. If it is exceeded, then gzprintf() will return + return an error (0) with nothing written. In this case, there may also be a + buffer overflow with unpredictable consequences, which is possible only if + zlib was compiled with the insecure functions sprintf() or vsprintf() + because the secure snprintf() or vsnprintf() functions were not available. +*/ + +ZEXTERN int ZEXPORT gzputs OF((gzFile file, const char *s)); +/* + Writes the given null-terminated string to the compressed file, excluding + the terminating null character. + gzputs returns the number of characters written, or -1 in case of error. +*/ + +ZEXTERN char * ZEXPORT gzgets OF((gzFile file, char *buf, int len)); +/* + Reads bytes from the compressed file until len-1 characters are read, or + a newline character is read and transferred to buf, or an end-of-file + condition is encountered. The string is then terminated with a null + character. + gzgets returns buf, or Z_NULL in case of error. +*/ + +ZEXTERN int ZEXPORT gzputc OF((gzFile file, int c)); +/* + Writes c, converted to an unsigned char, into the compressed file. + gzputc returns the value that was written, or -1 in case of error. +*/ + +ZEXTERN int ZEXPORT gzgetc OF((gzFile file)); +/* + Reads one byte from the compressed file. gzgetc returns this byte + or -1 in case of end of file or error. +*/ + +ZEXTERN int ZEXPORT gzungetc OF((int c, gzFile file)); +/* + Push one character back onto the stream to be read again later. + Only one character of push-back is allowed. gzungetc() returns the + character pushed, or -1 on failure. gzungetc() will fail if a + character has been pushed but not read yet, or if c is -1. The pushed + character will be discarded if the stream is repositioned with gzseek() + or gzrewind(). +*/ + +ZEXTERN int ZEXPORT gzflush OF((gzFile file, int flush)); +/* + Flushes all pending output into the compressed file. The parameter + flush is as in the deflate() function. The return value is the zlib + error number (see function gzerror below). gzflush returns Z_OK if + the flush parameter is Z_FINISH and all output could be flushed. + gzflush should be called only when strictly necessary because it can + degrade compression. +*/ + +ZEXTERN z_off_t ZEXPORT gzseek OF((gzFile file, + z_off_t offset, int whence)); +/* + Sets the starting position for the next gzread or gzwrite on the + given compressed file. The offset represents a number of bytes in the + uncompressed data stream. The whence parameter is defined as in lseek(2); + the value SEEK_END is not supported. + If the file is opened for reading, this function is emulated but can be + extremely slow. If the file is opened for writing, only forward seeks are + supported; gzseek then compresses a sequence of zeroes up to the new + starting position. + + gzseek returns the resulting offset location as measured in bytes from + the beginning of the uncompressed stream, or -1 in case of error, in + particular if the file is opened for writing and the new starting position + would be before the current position. +*/ + +ZEXTERN int ZEXPORT gzrewind OF((gzFile file)); +/* + Rewinds the given file. This function is supported only for reading. + + gzrewind(file) is equivalent to (int)gzseek(file, 0L, SEEK_SET) +*/ + +ZEXTERN z_off_t ZEXPORT gztell OF((gzFile file)); +/* + Returns the starting position for the next gzread or gzwrite on the + given compressed file. This position represents a number of bytes in the + uncompressed data stream. + + gztell(file) is equivalent to gzseek(file, 0L, SEEK_CUR) +*/ + +ZEXTERN int ZEXPORT gzeof OF((gzFile file)); +/* + Returns 1 when EOF has previously been detected reading the given + input stream, otherwise zero. +*/ + +ZEXTERN int ZEXPORT gzclose OF((gzFile file)); +/* + Flushes all pending output if necessary, closes the compressed file + and deallocates all the (de)compression state. The return value is the zlib + error number (see function gzerror below). +*/ + +ZEXTERN const char * ZEXPORT gzerror OF((gzFile file, int *errnum)); +/* + Returns the error message for the last error which occurred on the + given compressed file. errnum is set to zlib error number. If an + error occurred in the file system and not in the compression library, + errnum is set to Z_ERRNO and the application may consult errno + to get the exact error code. +*/ + +ZEXTERN void ZEXPORT gzclearerr OF((gzFile file)); +/* + Clears the error and end-of-file flags for file. This is analogous to the + clearerr() function in stdio. This is useful for continuing to read a gzip + file that is being written concurrently. +*/ + + /* checksum functions */ + +/* + These functions are not related to compression but are exported + anyway because they might be useful in applications using the + compression library. +*/ + +ZEXTERN uLong ZEXPORT adler32 OF((uLong adler, const Bytef *buf, uInt len)); + +/* + Update a running Adler-32 checksum with the bytes buf[0..len-1] and + return the updated checksum. If buf is NULL, this function returns + the required initial value for the checksum. + An Adler-32 checksum is almost as reliable as a CRC32 but can be computed + much faster. Usage example: + + uLong adler = adler32(0L, Z_NULL, 0); + + while (read_buffer(buffer, length) != EOF) { + adler = adler32(adler, buffer, length); + } + if (adler != original_adler) error(); +*/ + +ZEXTERN uLong ZEXPORT crc32 OF((uLong crc, const Bytef *buf, uInt len)); +/* + Update a running crc with the bytes buf[0..len-1] and return the updated + crc. If buf is NULL, this function returns the required initial value + for the crc. Pre- and post-conditioning (one's complement) is performed + within this function so it shouldn't be done by the application. + Usage example: + + uLong crc = crc32(0L, Z_NULL, 0); + + while (read_buffer(buffer, length) != EOF) { + crc = crc32(crc, buffer, length); + } + if (crc != original_crc) error(); +*/ + + + /* various hacks, don't look :) */ + +/* deflateInit and inflateInit are macros to allow checking the zlib version + * and the compiler's view of z_stream: + */ +ZEXTERN int ZEXPORT deflateInit_ OF((z_streamp strm, int level, + const char *version, int stream_size)); +ZEXTERN int ZEXPORT inflateInit_ OF((z_streamp strm, + const char *version, int stream_size)); +ZEXTERN int ZEXPORT deflateInit2_ OF((z_streamp strm, int level, int method, + int windowBits, int memLevel, + int strategy, const char *version, + int stream_size)); +ZEXTERN int ZEXPORT inflateInit2_ OF((z_streamp strm, int windowBits, + const char *version, int stream_size)); +ZEXTERN int ZEXPORT inflateBackInit_ OF((z_stream FAR *strm, int windowBits, + unsigned char FAR *window, + const char *version, + int stream_size)); +#define deflateInit(strm, level) \ + deflateInit_((strm), (level), ZLIB_VERSION, sizeof(z_stream)) +#define inflateInit(strm) \ + inflateInit_((strm), ZLIB_VERSION, sizeof(z_stream)) +#define deflateInit2(strm, level, method, windowBits, memLevel, strategy) \ + deflateInit2_((strm),(level),(method),(windowBits),(memLevel),\ + (strategy), ZLIB_VERSION, sizeof(z_stream)) +#define inflateInit2(strm, windowBits) \ + inflateInit2_((strm), (windowBits), ZLIB_VERSION, sizeof(z_stream)) +#define inflateBackInit(strm, windowBits, window) \ + inflateBackInit_((strm), (windowBits), (window), \ + ZLIB_VERSION, sizeof(z_stream)) + + +#if !defined(ZUTIL_H) && !defined(NO_DUMMY_DECL) + struct internal_state {int dummy;}; /* hack for buggy compilers */ +#endif + +ZEXTERN const char * ZEXPORT zError OF((int)); +ZEXTERN int ZEXPORT inflateSyncPoint OF((z_streamp z)); +ZEXTERN const uLongf * ZEXPORT get_crc_table OF((void)); + +#ifdef __cplusplus +} +#endif + +#endif /* ZLIB_H */ diff --git a/data/nsis/Contrib/nsisunz/zlib/ZUTIL.H b/data/nsis/Contrib/nsisunz/zlib/ZUTIL.H new file mode 100644 index 000000000..63608b1b0 --- /dev/null +++ b/data/nsis/Contrib/nsisunz/zlib/ZUTIL.H @@ -0,0 +1,254 @@ +/* zutil.h -- internal interface and configuration of the compression library + * Copyright (C) 1995-2003 Jean-loup Gailly. + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +/* WARNING: this file should *not* be used by applications. It is + part of the implementation of the compression library and is + subject to change. Applications should only use zlib.h. + */ + +/* @(#) $Id$ */ + +#ifndef ZUTIL_H +#define ZUTIL_H + +#define ZLIB_INTERNAL +#include "zlib.h" + +#include "../miniclib.h" + +#ifndef local +# define local static +#endif +/* compile with -Dlocal if your debugger can't find static symbols */ + +typedef unsigned char uch; +typedef uch FAR uchf; +typedef unsigned short ush; +typedef ush FAR ushf; +typedef unsigned long ulg; + +extern const char * const z_errmsg[10]; /* indexed by 2-zlib_error */ +/* (size given to avoid silly warnings with Visual C++) */ + +#define ERR_MSG(err) z_errmsg[Z_NEED_DICT-(err)] + +#define ERR_RETURN(strm,err) \ + return (strm->msg = (char*)ERR_MSG(err), (err)) +/* To be used only when the state is known to be valid */ + + /* common constants */ + +#ifndef DEF_WBITS +# define DEF_WBITS MAX_WBITS +#endif +/* default windowBits for decompression. MAX_WBITS is for compression only */ + +#if MAX_MEM_LEVEL >= 8 +# define DEF_MEM_LEVEL 8 +#else +# define DEF_MEM_LEVEL MAX_MEM_LEVEL +#endif +/* default memLevel */ + +#define STORED_BLOCK 0 +#define STATIC_TREES 1 +#define DYN_TREES 2 +/* The three kinds of block type */ + +#define MIN_MATCH 3 +#define MAX_MATCH 258 +/* The minimum and maximum match lengths */ + +#define PRESET_DICT 0x20 /* preset dictionary flag in zlib header */ + + /* target dependencies */ + +#if defined(MSDOS) || (defined(WINDOWS) && !defined(WIN32)) +# define OS_CODE 0x00 +# if defined(__TURBOC__) || defined(__BORLANDC__) +# if(__STDC__ == 1) && (defined(__LARGE__) || defined(__COMPACT__)) + /* Allow compilation with ANSI keywords only enabled */ + void _Cdecl farfree( void *block ); + void *_Cdecl farmalloc( unsigned long nbytes ); +# else +# include +# endif +# else /* MSC or DJGPP */ +# include +# endif +#endif + +#ifdef AMIGA +# define OS_CODE 0x01 +#endif + +#if defined(VAXC) || defined(VMS) +# define OS_CODE 0x02 +# define F_OPEN(name, mode) \ + fopen((name), (mode), "mbc=60", "ctx=stm", "rfm=fix", "mrs=512") +#endif + +#if defined(ATARI) || defined(atarist) +# define OS_CODE 0x05 +#endif + +#ifdef OS2 +# define OS_CODE 0x06 +#endif + +#if defined(MACOS) || defined(TARGET_OS_MAC) +# define OS_CODE 0x07 +# if defined(__MWERKS__) && __dest_os != __be_os && __dest_os != __win32_os +# include /* for fdopen */ +# else +# ifndef fdopen +# define fdopen(fd,mode) NULL /* No fdopen() */ +# endif +# endif +#endif + +#ifdef TOPS20 +# define OS_CODE 0x0a +#endif + +#ifdef WIN32 +# ifndef __CYGWIN__ /* Cygwin is Unix, not Win32 */ +# define OS_CODE 0x0b +# endif +#endif + +#ifdef __50SERIES /* Prime/PRIMOS */ +# define OS_CODE 0x0f +#endif + +#if defined(_BEOS_) || defined(RISCOS) +# define fdopen(fd,mode) NULL /* No fdopen() */ +#endif + +#if (defined(_MSC_VER) && (_MSC_VER > 600)) +# ifndef _PTRDIFF_T_DEFINED + typedef int ptrdiff_t; +# define _PTRDIFF_T_DEFINED +# endif +# if defined(_WIN32_WCE) +# define fdopen(fd,mode) NULL /* No fdopen() */ +# else +# define fdopen(fd,type) _fdopen(fd,type) +# endif +#endif + + /* common defaults */ + +#ifndef OS_CODE +# define OS_CODE 0x03 /* assume Unix */ +#endif + +#ifndef F_OPEN +# define F_OPEN(name, mode) fopen((name), (mode)) +#endif + + /* functions */ + +#if defined(STDC99) || (defined(__TURBOC__) && __TURBOC__ >= 0x550) +# ifndef HAVE_VSNPRINTF +# define HAVE_VSNPRINTF +# endif +#endif +#if defined(__CYGWIN__) +# ifndef HAVE_VSNPRINTF +# define HAVE_VSNPRINTF +# endif +#endif +#ifndef HAVE_VSNPRINTF +# ifdef MSDOS + /* vsnprintf may exist on some MS-DOS compilers (DJGPP?), + but for now we just assume it doesn't. */ +# define NO_vsnprintf +# endif +# ifdef __TURBOC__ +# define NO_vsnprintf +# endif +# ifdef WIN32 + /* In Win32, vsnprintf is available as the "non-ANSI" _vsnprintf. */ +# if !defined(vsnprintf) && !defined(NO_vsnprintf) +# define vsnprintf _vsnprintf +# endif +# endif +# ifdef __SASC +# define NO_vsnprintf +# endif +#endif +#ifdef VMS +# define NO_vsnprintf +#endif + +#ifdef HAVE_STRERROR +# ifndef VMS + extern char *strerror OF((int)); +# endif +# define zstrerror(errnum) strerror(errnum) +#else +# define zstrerror(errnum) "" +#endif + +#if defined(pyr) +# define NO_MEMCPY +#endif +#if defined(SMALL_MEDIUM) && !defined(_MSC_VER) && !defined(__SC__) + /* Use our own functions for small and medium model with MSC <= 5.0. + * You may have to use the same strategy for Borland C (untested). + * The __SC__ check is for Symantec. + */ +# define NO_MEMCPY +#endif +#if defined(STDC) && !defined(HAVE_MEMCPY) && !defined(NO_MEMCPY) +# define HAVE_MEMCPY +#endif +#ifdef HAVE_MEMCPY +# ifdef SMALL_MEDIUM /* MSDOS small or medium model */ +# define zmemcpy _fmemcpy +# define zmemcmp _fmemcmp +# define zmemzero(dest, len) _fmemset(dest, 0, len) +# else +# define zmemcpy memcpy +# define zmemcmp memcmp +# define zmemzero(dest, len) memset(dest, 0, len) +# endif +#else + extern void zmemcpy OF((Bytef* dest, const Bytef* source, uInt len)); + extern int zmemcmp OF((const Bytef* s1, const Bytef* s2, uInt len)); + extern void zmemzero OF((Bytef* dest, uInt len)); +#endif + +/* Diagnostic functions */ +#ifdef DEBUG +# include + extern int z_verbose; + extern void z_error OF((char *m)); +# define Assert(cond,msg) {if(!(cond)) z_error(msg);} +# define Trace(x) {if (z_verbose>=0) fprintf x ;} +# define Tracev(x) {if (z_verbose>0) fprintf x ;} +# define Tracevv(x) {if (z_verbose>1) fprintf x ;} +# define Tracec(c,x) {if (z_verbose>0 && (c)) fprintf x ;} +# define Tracecv(c,x) {if (z_verbose>1 && (c)) fprintf x ;} +#else +# define Assert(cond,msg) +# define Trace(x) +# define Tracev(x) +# define Tracevv(x) +# define Tracec(c,x) +# define Tracecv(c,x) +#endif + + +voidpf zcalloc OF((voidpf opaque, unsigned items, unsigned size)); +void zcfree OF((voidpf opaque, voidpf ptr)); + +#define ZALLOC(strm, items, size) \ + (*((strm)->zalloc))((strm)->opaque, (items), (size)) +#define ZFREE(strm, addr) (*((strm)->zfree))((strm)->opaque, (voidpf)(addr)) +#define TRY_FREE(s, p) {if (p) ZFREE(s, p);} + +#endif /* ZUTIL_H */ diff --git a/data/nsis/Contrib/nsisunz/zlib/Zutil.c b/data/nsis/Contrib/nsisunz/zlib/Zutil.c new file mode 100644 index 000000000..1ce26127f --- /dev/null +++ b/data/nsis/Contrib/nsisunz/zlib/Zutil.c @@ -0,0 +1,44 @@ +/* zutil.c -- target dependent utility functions for the compression library + * Copyright (C) 1995-2003 Jean-loup Gailly. + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +/* @(#) $Id$ */ + +#include "zutil.h" + + +const char * const z_errmsg[10] = { +"need dictionary", /* Z_NEED_DICT 2 */ +"stream end", /* Z_STREAM_END 1 */ +"", /* Z_OK 0 */ +"file error", /* Z_ERRNO (-1) */ +"stream error", /* Z_STREAM_ERROR (-2) */ +"data error", /* Z_DATA_ERROR (-3) */ +"insufficient memory", /* Z_MEM_ERROR (-4) */ +"buffer error", /* Z_BUF_ERROR (-5) */ +"incompatible version",/* Z_VERSION_ERROR (-6) */ +""}; + + +#ifndef MY_ZCALLOC /* Any system without a special alloc function */ + +voidpf zcalloc (opaque, items, size) + voidpf opaque; + unsigned items; + unsigned size; +{ + if (opaque) items += size - size; /* make compiler happy */ + return sizeof(uInt) > 2 ? (voidpf)malloc(items * size) : + (voidpf)calloc(items, size); +} + +void zcfree (opaque, ptr) + voidpf opaque; + voidpf ptr; +{ + free(ptr); + if (opaque) return; /* make compiler happy */ +} + +#endif /* MY_ZCALLOC */ diff --git a/data/nsis/Contrib/nsisunz/zlib/crc32.h b/data/nsis/Contrib/nsisunz/zlib/crc32.h new file mode 100644 index 000000000..8053b6117 --- /dev/null +++ b/data/nsis/Contrib/nsisunz/zlib/crc32.h @@ -0,0 +1,441 @@ +/* crc32.h -- tables for rapid CRC calculation + * Generated automatically by crc32.c + */ + +local const unsigned long FAR crc_table[TBLS][256] = +{ + { + 0x00000000UL, 0x77073096UL, 0xee0e612cUL, 0x990951baUL, 0x076dc419UL, + 0x706af48fUL, 0xe963a535UL, 0x9e6495a3UL, 0x0edb8832UL, 0x79dcb8a4UL, + 0xe0d5e91eUL, 0x97d2d988UL, 0x09b64c2bUL, 0x7eb17cbdUL, 0xe7b82d07UL, + 0x90bf1d91UL, 0x1db71064UL, 0x6ab020f2UL, 0xf3b97148UL, 0x84be41deUL, + 0x1adad47dUL, 0x6ddde4ebUL, 0xf4d4b551UL, 0x83d385c7UL, 0x136c9856UL, + 0x646ba8c0UL, 0xfd62f97aUL, 0x8a65c9ecUL, 0x14015c4fUL, 0x63066cd9UL, + 0xfa0f3d63UL, 0x8d080df5UL, 0x3b6e20c8UL, 0x4c69105eUL, 0xd56041e4UL, + 0xa2677172UL, 0x3c03e4d1UL, 0x4b04d447UL, 0xd20d85fdUL, 0xa50ab56bUL, + 0x35b5a8faUL, 0x42b2986cUL, 0xdbbbc9d6UL, 0xacbcf940UL, 0x32d86ce3UL, + 0x45df5c75UL, 0xdcd60dcfUL, 0xabd13d59UL, 0x26d930acUL, 0x51de003aUL, + 0xc8d75180UL, 0xbfd06116UL, 0x21b4f4b5UL, 0x56b3c423UL, 0xcfba9599UL, + 0xb8bda50fUL, 0x2802b89eUL, 0x5f058808UL, 0xc60cd9b2UL, 0xb10be924UL, + 0x2f6f7c87UL, 0x58684c11UL, 0xc1611dabUL, 0xb6662d3dUL, 0x76dc4190UL, + 0x01db7106UL, 0x98d220bcUL, 0xefd5102aUL, 0x71b18589UL, 0x06b6b51fUL, + 0x9fbfe4a5UL, 0xe8b8d433UL, 0x7807c9a2UL, 0x0f00f934UL, 0x9609a88eUL, + 0xe10e9818UL, 0x7f6a0dbbUL, 0x086d3d2dUL, 0x91646c97UL, 0xe6635c01UL, + 0x6b6b51f4UL, 0x1c6c6162UL, 0x856530d8UL, 0xf262004eUL, 0x6c0695edUL, + 0x1b01a57bUL, 0x8208f4c1UL, 0xf50fc457UL, 0x65b0d9c6UL, 0x12b7e950UL, + 0x8bbeb8eaUL, 0xfcb9887cUL, 0x62dd1ddfUL, 0x15da2d49UL, 0x8cd37cf3UL, + 0xfbd44c65UL, 0x4db26158UL, 0x3ab551ceUL, 0xa3bc0074UL, 0xd4bb30e2UL, + 0x4adfa541UL, 0x3dd895d7UL, 0xa4d1c46dUL, 0xd3d6f4fbUL, 0x4369e96aUL, + 0x346ed9fcUL, 0xad678846UL, 0xda60b8d0UL, 0x44042d73UL, 0x33031de5UL, + 0xaa0a4c5fUL, 0xdd0d7cc9UL, 0x5005713cUL, 0x270241aaUL, 0xbe0b1010UL, + 0xc90c2086UL, 0x5768b525UL, 0x206f85b3UL, 0xb966d409UL, 0xce61e49fUL, + 0x5edef90eUL, 0x29d9c998UL, 0xb0d09822UL, 0xc7d7a8b4UL, 0x59b33d17UL, + 0x2eb40d81UL, 0xb7bd5c3bUL, 0xc0ba6cadUL, 0xedb88320UL, 0x9abfb3b6UL, + 0x03b6e20cUL, 0x74b1d29aUL, 0xead54739UL, 0x9dd277afUL, 0x04db2615UL, + 0x73dc1683UL, 0xe3630b12UL, 0x94643b84UL, 0x0d6d6a3eUL, 0x7a6a5aa8UL, + 0xe40ecf0bUL, 0x9309ff9dUL, 0x0a00ae27UL, 0x7d079eb1UL, 0xf00f9344UL, + 0x8708a3d2UL, 0x1e01f268UL, 0x6906c2feUL, 0xf762575dUL, 0x806567cbUL, + 0x196c3671UL, 0x6e6b06e7UL, 0xfed41b76UL, 0x89d32be0UL, 0x10da7a5aUL, + 0x67dd4accUL, 0xf9b9df6fUL, 0x8ebeeff9UL, 0x17b7be43UL, 0x60b08ed5UL, + 0xd6d6a3e8UL, 0xa1d1937eUL, 0x38d8c2c4UL, 0x4fdff252UL, 0xd1bb67f1UL, + 0xa6bc5767UL, 0x3fb506ddUL, 0x48b2364bUL, 0xd80d2bdaUL, 0xaf0a1b4cUL, + 0x36034af6UL, 0x41047a60UL, 0xdf60efc3UL, 0xa867df55UL, 0x316e8eefUL, + 0x4669be79UL, 0xcb61b38cUL, 0xbc66831aUL, 0x256fd2a0UL, 0x5268e236UL, + 0xcc0c7795UL, 0xbb0b4703UL, 0x220216b9UL, 0x5505262fUL, 0xc5ba3bbeUL, + 0xb2bd0b28UL, 0x2bb45a92UL, 0x5cb36a04UL, 0xc2d7ffa7UL, 0xb5d0cf31UL, + 0x2cd99e8bUL, 0x5bdeae1dUL, 0x9b64c2b0UL, 0xec63f226UL, 0x756aa39cUL, + 0x026d930aUL, 0x9c0906a9UL, 0xeb0e363fUL, 0x72076785UL, 0x05005713UL, + 0x95bf4a82UL, 0xe2b87a14UL, 0x7bb12baeUL, 0x0cb61b38UL, 0x92d28e9bUL, + 0xe5d5be0dUL, 0x7cdcefb7UL, 0x0bdbdf21UL, 0x86d3d2d4UL, 0xf1d4e242UL, + 0x68ddb3f8UL, 0x1fda836eUL, 0x81be16cdUL, 0xf6b9265bUL, 0x6fb077e1UL, + 0x18b74777UL, 0x88085ae6UL, 0xff0f6a70UL, 0x66063bcaUL, 0x11010b5cUL, + 0x8f659effUL, 0xf862ae69UL, 0x616bffd3UL, 0x166ccf45UL, 0xa00ae278UL, + 0xd70dd2eeUL, 0x4e048354UL, 0x3903b3c2UL, 0xa7672661UL, 0xd06016f7UL, + 0x4969474dUL, 0x3e6e77dbUL, 0xaed16a4aUL, 0xd9d65adcUL, 0x40df0b66UL, + 0x37d83bf0UL, 0xa9bcae53UL, 0xdebb9ec5UL, 0x47b2cf7fUL, 0x30b5ffe9UL, + 0xbdbdf21cUL, 0xcabac28aUL, 0x53b39330UL, 0x24b4a3a6UL, 0xbad03605UL, + 0xcdd70693UL, 0x54de5729UL, 0x23d967bfUL, 0xb3667a2eUL, 0xc4614ab8UL, + 0x5d681b02UL, 0x2a6f2b94UL, 0xb40bbe37UL, 0xc30c8ea1UL, 0x5a05df1bUL, + 0x2d02ef8dUL +#ifdef BYFOUR + }, + { + 0x00000000UL, 0x191b3141UL, 0x32366282UL, 0x2b2d53c3UL, 0x646cc504UL, + 0x7d77f445UL, 0x565aa786UL, 0x4f4196c7UL, 0xc8d98a08UL, 0xd1c2bb49UL, + 0xfaefe88aUL, 0xe3f4d9cbUL, 0xacb54f0cUL, 0xb5ae7e4dUL, 0x9e832d8eUL, + 0x87981ccfUL, 0x4ac21251UL, 0x53d92310UL, 0x78f470d3UL, 0x61ef4192UL, + 0x2eaed755UL, 0x37b5e614UL, 0x1c98b5d7UL, 0x05838496UL, 0x821b9859UL, + 0x9b00a918UL, 0xb02dfadbUL, 0xa936cb9aUL, 0xe6775d5dUL, 0xff6c6c1cUL, + 0xd4413fdfUL, 0xcd5a0e9eUL, 0x958424a2UL, 0x8c9f15e3UL, 0xa7b24620UL, + 0xbea97761UL, 0xf1e8e1a6UL, 0xe8f3d0e7UL, 0xc3de8324UL, 0xdac5b265UL, + 0x5d5daeaaUL, 0x44469febUL, 0x6f6bcc28UL, 0x7670fd69UL, 0x39316baeUL, + 0x202a5aefUL, 0x0b07092cUL, 0x121c386dUL, 0xdf4636f3UL, 0xc65d07b2UL, + 0xed705471UL, 0xf46b6530UL, 0xbb2af3f7UL, 0xa231c2b6UL, 0x891c9175UL, + 0x9007a034UL, 0x179fbcfbUL, 0x0e848dbaUL, 0x25a9de79UL, 0x3cb2ef38UL, + 0x73f379ffUL, 0x6ae848beUL, 0x41c51b7dUL, 0x58de2a3cUL, 0xf0794f05UL, + 0xe9627e44UL, 0xc24f2d87UL, 0xdb541cc6UL, 0x94158a01UL, 0x8d0ebb40UL, + 0xa623e883UL, 0xbf38d9c2UL, 0x38a0c50dUL, 0x21bbf44cUL, 0x0a96a78fUL, + 0x138d96ceUL, 0x5ccc0009UL, 0x45d73148UL, 0x6efa628bUL, 0x77e153caUL, + 0xbabb5d54UL, 0xa3a06c15UL, 0x888d3fd6UL, 0x91960e97UL, 0xded79850UL, + 0xc7cca911UL, 0xece1fad2UL, 0xf5facb93UL, 0x7262d75cUL, 0x6b79e61dUL, + 0x4054b5deUL, 0x594f849fUL, 0x160e1258UL, 0x0f152319UL, 0x243870daUL, + 0x3d23419bUL, 0x65fd6ba7UL, 0x7ce65ae6UL, 0x57cb0925UL, 0x4ed03864UL, + 0x0191aea3UL, 0x188a9fe2UL, 0x33a7cc21UL, 0x2abcfd60UL, 0xad24e1afUL, + 0xb43fd0eeUL, 0x9f12832dUL, 0x8609b26cUL, 0xc94824abUL, 0xd05315eaUL, + 0xfb7e4629UL, 0xe2657768UL, 0x2f3f79f6UL, 0x362448b7UL, 0x1d091b74UL, + 0x04122a35UL, 0x4b53bcf2UL, 0x52488db3UL, 0x7965de70UL, 0x607eef31UL, + 0xe7e6f3feUL, 0xfefdc2bfUL, 0xd5d0917cUL, 0xcccba03dUL, 0x838a36faUL, + 0x9a9107bbUL, 0xb1bc5478UL, 0xa8a76539UL, 0x3b83984bUL, 0x2298a90aUL, + 0x09b5fac9UL, 0x10aecb88UL, 0x5fef5d4fUL, 0x46f46c0eUL, 0x6dd93fcdUL, + 0x74c20e8cUL, 0xf35a1243UL, 0xea412302UL, 0xc16c70c1UL, 0xd8774180UL, + 0x9736d747UL, 0x8e2de606UL, 0xa500b5c5UL, 0xbc1b8484UL, 0x71418a1aUL, + 0x685abb5bUL, 0x4377e898UL, 0x5a6cd9d9UL, 0x152d4f1eUL, 0x0c367e5fUL, + 0x271b2d9cUL, 0x3e001cddUL, 0xb9980012UL, 0xa0833153UL, 0x8bae6290UL, + 0x92b553d1UL, 0xddf4c516UL, 0xc4eff457UL, 0xefc2a794UL, 0xf6d996d5UL, + 0xae07bce9UL, 0xb71c8da8UL, 0x9c31de6bUL, 0x852aef2aUL, 0xca6b79edUL, + 0xd37048acUL, 0xf85d1b6fUL, 0xe1462a2eUL, 0x66de36e1UL, 0x7fc507a0UL, + 0x54e85463UL, 0x4df36522UL, 0x02b2f3e5UL, 0x1ba9c2a4UL, 0x30849167UL, + 0x299fa026UL, 0xe4c5aeb8UL, 0xfdde9ff9UL, 0xd6f3cc3aUL, 0xcfe8fd7bUL, + 0x80a96bbcUL, 0x99b25afdUL, 0xb29f093eUL, 0xab84387fUL, 0x2c1c24b0UL, + 0x350715f1UL, 0x1e2a4632UL, 0x07317773UL, 0x4870e1b4UL, 0x516bd0f5UL, + 0x7a468336UL, 0x635db277UL, 0xcbfad74eUL, 0xd2e1e60fUL, 0xf9ccb5ccUL, + 0xe0d7848dUL, 0xaf96124aUL, 0xb68d230bUL, 0x9da070c8UL, 0x84bb4189UL, + 0x03235d46UL, 0x1a386c07UL, 0x31153fc4UL, 0x280e0e85UL, 0x674f9842UL, + 0x7e54a903UL, 0x5579fac0UL, 0x4c62cb81UL, 0x8138c51fUL, 0x9823f45eUL, + 0xb30ea79dUL, 0xaa1596dcUL, 0xe554001bUL, 0xfc4f315aUL, 0xd7626299UL, + 0xce7953d8UL, 0x49e14f17UL, 0x50fa7e56UL, 0x7bd72d95UL, 0x62cc1cd4UL, + 0x2d8d8a13UL, 0x3496bb52UL, 0x1fbbe891UL, 0x06a0d9d0UL, 0x5e7ef3ecUL, + 0x4765c2adUL, 0x6c48916eUL, 0x7553a02fUL, 0x3a1236e8UL, 0x230907a9UL, + 0x0824546aUL, 0x113f652bUL, 0x96a779e4UL, 0x8fbc48a5UL, 0xa4911b66UL, + 0xbd8a2a27UL, 0xf2cbbce0UL, 0xebd08da1UL, 0xc0fdde62UL, 0xd9e6ef23UL, + 0x14bce1bdUL, 0x0da7d0fcUL, 0x268a833fUL, 0x3f91b27eUL, 0x70d024b9UL, + 0x69cb15f8UL, 0x42e6463bUL, 0x5bfd777aUL, 0xdc656bb5UL, 0xc57e5af4UL, + 0xee530937UL, 0xf7483876UL, 0xb809aeb1UL, 0xa1129ff0UL, 0x8a3fcc33UL, + 0x9324fd72UL + }, + { + 0x00000000UL, 0x01c26a37UL, 0x0384d46eUL, 0x0246be59UL, 0x0709a8dcUL, + 0x06cbc2ebUL, 0x048d7cb2UL, 0x054f1685UL, 0x0e1351b8UL, 0x0fd13b8fUL, + 0x0d9785d6UL, 0x0c55efe1UL, 0x091af964UL, 0x08d89353UL, 0x0a9e2d0aUL, + 0x0b5c473dUL, 0x1c26a370UL, 0x1de4c947UL, 0x1fa2771eUL, 0x1e601d29UL, + 0x1b2f0bacUL, 0x1aed619bUL, 0x18abdfc2UL, 0x1969b5f5UL, 0x1235f2c8UL, + 0x13f798ffUL, 0x11b126a6UL, 0x10734c91UL, 0x153c5a14UL, 0x14fe3023UL, + 0x16b88e7aUL, 0x177ae44dUL, 0x384d46e0UL, 0x398f2cd7UL, 0x3bc9928eUL, + 0x3a0bf8b9UL, 0x3f44ee3cUL, 0x3e86840bUL, 0x3cc03a52UL, 0x3d025065UL, + 0x365e1758UL, 0x379c7d6fUL, 0x35dac336UL, 0x3418a901UL, 0x3157bf84UL, + 0x3095d5b3UL, 0x32d36beaUL, 0x331101ddUL, 0x246be590UL, 0x25a98fa7UL, + 0x27ef31feUL, 0x262d5bc9UL, 0x23624d4cUL, 0x22a0277bUL, 0x20e69922UL, + 0x2124f315UL, 0x2a78b428UL, 0x2bbade1fUL, 0x29fc6046UL, 0x283e0a71UL, + 0x2d711cf4UL, 0x2cb376c3UL, 0x2ef5c89aUL, 0x2f37a2adUL, 0x709a8dc0UL, + 0x7158e7f7UL, 0x731e59aeUL, 0x72dc3399UL, 0x7793251cUL, 0x76514f2bUL, + 0x7417f172UL, 0x75d59b45UL, 0x7e89dc78UL, 0x7f4bb64fUL, 0x7d0d0816UL, + 0x7ccf6221UL, 0x798074a4UL, 0x78421e93UL, 0x7a04a0caUL, 0x7bc6cafdUL, + 0x6cbc2eb0UL, 0x6d7e4487UL, 0x6f38fadeUL, 0x6efa90e9UL, 0x6bb5866cUL, + 0x6a77ec5bUL, 0x68315202UL, 0x69f33835UL, 0x62af7f08UL, 0x636d153fUL, + 0x612bab66UL, 0x60e9c151UL, 0x65a6d7d4UL, 0x6464bde3UL, 0x662203baUL, + 0x67e0698dUL, 0x48d7cb20UL, 0x4915a117UL, 0x4b531f4eUL, 0x4a917579UL, + 0x4fde63fcUL, 0x4e1c09cbUL, 0x4c5ab792UL, 0x4d98dda5UL, 0x46c49a98UL, + 0x4706f0afUL, 0x45404ef6UL, 0x448224c1UL, 0x41cd3244UL, 0x400f5873UL, + 0x4249e62aUL, 0x438b8c1dUL, 0x54f16850UL, 0x55330267UL, 0x5775bc3eUL, + 0x56b7d609UL, 0x53f8c08cUL, 0x523aaabbUL, 0x507c14e2UL, 0x51be7ed5UL, + 0x5ae239e8UL, 0x5b2053dfUL, 0x5966ed86UL, 0x58a487b1UL, 0x5deb9134UL, + 0x5c29fb03UL, 0x5e6f455aUL, 0x5fad2f6dUL, 0xe1351b80UL, 0xe0f771b7UL, + 0xe2b1cfeeUL, 0xe373a5d9UL, 0xe63cb35cUL, 0xe7fed96bUL, 0xe5b86732UL, + 0xe47a0d05UL, 0xef264a38UL, 0xeee4200fUL, 0xeca29e56UL, 0xed60f461UL, + 0xe82fe2e4UL, 0xe9ed88d3UL, 0xebab368aUL, 0xea695cbdUL, 0xfd13b8f0UL, + 0xfcd1d2c7UL, 0xfe976c9eUL, 0xff5506a9UL, 0xfa1a102cUL, 0xfbd87a1bUL, + 0xf99ec442UL, 0xf85cae75UL, 0xf300e948UL, 0xf2c2837fUL, 0xf0843d26UL, + 0xf1465711UL, 0xf4094194UL, 0xf5cb2ba3UL, 0xf78d95faUL, 0xf64fffcdUL, + 0xd9785d60UL, 0xd8ba3757UL, 0xdafc890eUL, 0xdb3ee339UL, 0xde71f5bcUL, + 0xdfb39f8bUL, 0xddf521d2UL, 0xdc374be5UL, 0xd76b0cd8UL, 0xd6a966efUL, + 0xd4efd8b6UL, 0xd52db281UL, 0xd062a404UL, 0xd1a0ce33UL, 0xd3e6706aUL, + 0xd2241a5dUL, 0xc55efe10UL, 0xc49c9427UL, 0xc6da2a7eUL, 0xc7184049UL, + 0xc25756ccUL, 0xc3953cfbUL, 0xc1d382a2UL, 0xc011e895UL, 0xcb4dafa8UL, + 0xca8fc59fUL, 0xc8c97bc6UL, 0xc90b11f1UL, 0xcc440774UL, 0xcd866d43UL, + 0xcfc0d31aUL, 0xce02b92dUL, 0x91af9640UL, 0x906dfc77UL, 0x922b422eUL, + 0x93e92819UL, 0x96a63e9cUL, 0x976454abUL, 0x9522eaf2UL, 0x94e080c5UL, + 0x9fbcc7f8UL, 0x9e7eadcfUL, 0x9c381396UL, 0x9dfa79a1UL, 0x98b56f24UL, + 0x99770513UL, 0x9b31bb4aUL, 0x9af3d17dUL, 0x8d893530UL, 0x8c4b5f07UL, + 0x8e0de15eUL, 0x8fcf8b69UL, 0x8a809decUL, 0x8b42f7dbUL, 0x89044982UL, + 0x88c623b5UL, 0x839a6488UL, 0x82580ebfUL, 0x801eb0e6UL, 0x81dcdad1UL, + 0x8493cc54UL, 0x8551a663UL, 0x8717183aUL, 0x86d5720dUL, 0xa9e2d0a0UL, + 0xa820ba97UL, 0xaa6604ceUL, 0xaba46ef9UL, 0xaeeb787cUL, 0xaf29124bUL, + 0xad6fac12UL, 0xacadc625UL, 0xa7f18118UL, 0xa633eb2fUL, 0xa4755576UL, + 0xa5b73f41UL, 0xa0f829c4UL, 0xa13a43f3UL, 0xa37cfdaaUL, 0xa2be979dUL, + 0xb5c473d0UL, 0xb40619e7UL, 0xb640a7beUL, 0xb782cd89UL, 0xb2cddb0cUL, + 0xb30fb13bUL, 0xb1490f62UL, 0xb08b6555UL, 0xbbd72268UL, 0xba15485fUL, + 0xb853f606UL, 0xb9919c31UL, 0xbcde8ab4UL, 0xbd1ce083UL, 0xbf5a5edaUL, + 0xbe9834edUL + }, + { + 0x00000000UL, 0xb8bc6765UL, 0xaa09c88bUL, 0x12b5afeeUL, 0x8f629757UL, + 0x37def032UL, 0x256b5fdcUL, 0x9dd738b9UL, 0xc5b428efUL, 0x7d084f8aUL, + 0x6fbde064UL, 0xd7018701UL, 0x4ad6bfb8UL, 0xf26ad8ddUL, 0xe0df7733UL, + 0x58631056UL, 0x5019579fUL, 0xe8a530faUL, 0xfa109f14UL, 0x42acf871UL, + 0xdf7bc0c8UL, 0x67c7a7adUL, 0x75720843UL, 0xcdce6f26UL, 0x95ad7f70UL, + 0x2d111815UL, 0x3fa4b7fbUL, 0x8718d09eUL, 0x1acfe827UL, 0xa2738f42UL, + 0xb0c620acUL, 0x087a47c9UL, 0xa032af3eUL, 0x188ec85bUL, 0x0a3b67b5UL, + 0xb28700d0UL, 0x2f503869UL, 0x97ec5f0cUL, 0x8559f0e2UL, 0x3de59787UL, + 0x658687d1UL, 0xdd3ae0b4UL, 0xcf8f4f5aUL, 0x7733283fUL, 0xeae41086UL, + 0x525877e3UL, 0x40edd80dUL, 0xf851bf68UL, 0xf02bf8a1UL, 0x48979fc4UL, + 0x5a22302aUL, 0xe29e574fUL, 0x7f496ff6UL, 0xc7f50893UL, 0xd540a77dUL, + 0x6dfcc018UL, 0x359fd04eUL, 0x8d23b72bUL, 0x9f9618c5UL, 0x272a7fa0UL, + 0xbafd4719UL, 0x0241207cUL, 0x10f48f92UL, 0xa848e8f7UL, 0x9b14583dUL, + 0x23a83f58UL, 0x311d90b6UL, 0x89a1f7d3UL, 0x1476cf6aUL, 0xaccaa80fUL, + 0xbe7f07e1UL, 0x06c36084UL, 0x5ea070d2UL, 0xe61c17b7UL, 0xf4a9b859UL, + 0x4c15df3cUL, 0xd1c2e785UL, 0x697e80e0UL, 0x7bcb2f0eUL, 0xc377486bUL, + 0xcb0d0fa2UL, 0x73b168c7UL, 0x6104c729UL, 0xd9b8a04cUL, 0x446f98f5UL, + 0xfcd3ff90UL, 0xee66507eUL, 0x56da371bUL, 0x0eb9274dUL, 0xb6054028UL, + 0xa4b0efc6UL, 0x1c0c88a3UL, 0x81dbb01aUL, 0x3967d77fUL, 0x2bd27891UL, + 0x936e1ff4UL, 0x3b26f703UL, 0x839a9066UL, 0x912f3f88UL, 0x299358edUL, + 0xb4446054UL, 0x0cf80731UL, 0x1e4da8dfUL, 0xa6f1cfbaUL, 0xfe92dfecUL, + 0x462eb889UL, 0x549b1767UL, 0xec277002UL, 0x71f048bbUL, 0xc94c2fdeUL, + 0xdbf98030UL, 0x6345e755UL, 0x6b3fa09cUL, 0xd383c7f9UL, 0xc1366817UL, + 0x798a0f72UL, 0xe45d37cbUL, 0x5ce150aeUL, 0x4e54ff40UL, 0xf6e89825UL, + 0xae8b8873UL, 0x1637ef16UL, 0x048240f8UL, 0xbc3e279dUL, 0x21e91f24UL, + 0x99557841UL, 0x8be0d7afUL, 0x335cb0caUL, 0xed59b63bUL, 0x55e5d15eUL, + 0x47507eb0UL, 0xffec19d5UL, 0x623b216cUL, 0xda874609UL, 0xc832e9e7UL, + 0x708e8e82UL, 0x28ed9ed4UL, 0x9051f9b1UL, 0x82e4565fUL, 0x3a58313aUL, + 0xa78f0983UL, 0x1f336ee6UL, 0x0d86c108UL, 0xb53aa66dUL, 0xbd40e1a4UL, + 0x05fc86c1UL, 0x1749292fUL, 0xaff54e4aUL, 0x322276f3UL, 0x8a9e1196UL, + 0x982bbe78UL, 0x2097d91dUL, 0x78f4c94bUL, 0xc048ae2eUL, 0xd2fd01c0UL, + 0x6a4166a5UL, 0xf7965e1cUL, 0x4f2a3979UL, 0x5d9f9697UL, 0xe523f1f2UL, + 0x4d6b1905UL, 0xf5d77e60UL, 0xe762d18eUL, 0x5fdeb6ebUL, 0xc2098e52UL, + 0x7ab5e937UL, 0x680046d9UL, 0xd0bc21bcUL, 0x88df31eaUL, 0x3063568fUL, + 0x22d6f961UL, 0x9a6a9e04UL, 0x07bda6bdUL, 0xbf01c1d8UL, 0xadb46e36UL, + 0x15080953UL, 0x1d724e9aUL, 0xa5ce29ffUL, 0xb77b8611UL, 0x0fc7e174UL, + 0x9210d9cdUL, 0x2aacbea8UL, 0x38191146UL, 0x80a57623UL, 0xd8c66675UL, + 0x607a0110UL, 0x72cfaefeUL, 0xca73c99bUL, 0x57a4f122UL, 0xef189647UL, + 0xfdad39a9UL, 0x45115eccUL, 0x764dee06UL, 0xcef18963UL, 0xdc44268dUL, + 0x64f841e8UL, 0xf92f7951UL, 0x41931e34UL, 0x5326b1daUL, 0xeb9ad6bfUL, + 0xb3f9c6e9UL, 0x0b45a18cUL, 0x19f00e62UL, 0xa14c6907UL, 0x3c9b51beUL, + 0x842736dbUL, 0x96929935UL, 0x2e2efe50UL, 0x2654b999UL, 0x9ee8defcUL, + 0x8c5d7112UL, 0x34e11677UL, 0xa9362eceUL, 0x118a49abUL, 0x033fe645UL, + 0xbb838120UL, 0xe3e09176UL, 0x5b5cf613UL, 0x49e959fdUL, 0xf1553e98UL, + 0x6c820621UL, 0xd43e6144UL, 0xc68bceaaUL, 0x7e37a9cfUL, 0xd67f4138UL, + 0x6ec3265dUL, 0x7c7689b3UL, 0xc4caeed6UL, 0x591dd66fUL, 0xe1a1b10aUL, + 0xf3141ee4UL, 0x4ba87981UL, 0x13cb69d7UL, 0xab770eb2UL, 0xb9c2a15cUL, + 0x017ec639UL, 0x9ca9fe80UL, 0x241599e5UL, 0x36a0360bUL, 0x8e1c516eUL, + 0x866616a7UL, 0x3eda71c2UL, 0x2c6fde2cUL, 0x94d3b949UL, 0x090481f0UL, + 0xb1b8e695UL, 0xa30d497bUL, 0x1bb12e1eUL, 0x43d23e48UL, 0xfb6e592dUL, + 0xe9dbf6c3UL, 0x516791a6UL, 0xccb0a91fUL, 0x740cce7aUL, 0x66b96194UL, + 0xde0506f1UL + }, + { + 0x00000000UL, 0x96300777UL, 0x2c610eeeUL, 0xba510999UL, 0x19c46d07UL, + 0x8ff46a70UL, 0x35a563e9UL, 0xa395649eUL, 0x3288db0eUL, 0xa4b8dc79UL, + 0x1ee9d5e0UL, 0x88d9d297UL, 0x2b4cb609UL, 0xbd7cb17eUL, 0x072db8e7UL, + 0x911dbf90UL, 0x6410b71dUL, 0xf220b06aUL, 0x4871b9f3UL, 0xde41be84UL, + 0x7dd4da1aUL, 0xebe4dd6dUL, 0x51b5d4f4UL, 0xc785d383UL, 0x56986c13UL, + 0xc0a86b64UL, 0x7af962fdUL, 0xecc9658aUL, 0x4f5c0114UL, 0xd96c0663UL, + 0x633d0ffaUL, 0xf50d088dUL, 0xc8206e3bUL, 0x5e10694cUL, 0xe44160d5UL, + 0x727167a2UL, 0xd1e4033cUL, 0x47d4044bUL, 0xfd850dd2UL, 0x6bb50aa5UL, + 0xfaa8b535UL, 0x6c98b242UL, 0xd6c9bbdbUL, 0x40f9bcacUL, 0xe36cd832UL, + 0x755cdf45UL, 0xcf0dd6dcUL, 0x593dd1abUL, 0xac30d926UL, 0x3a00de51UL, + 0x8051d7c8UL, 0x1661d0bfUL, 0xb5f4b421UL, 0x23c4b356UL, 0x9995bacfUL, + 0x0fa5bdb8UL, 0x9eb80228UL, 0x0888055fUL, 0xb2d90cc6UL, 0x24e90bb1UL, + 0x877c6f2fUL, 0x114c6858UL, 0xab1d61c1UL, 0x3d2d66b6UL, 0x9041dc76UL, + 0x0671db01UL, 0xbc20d298UL, 0x2a10d5efUL, 0x8985b171UL, 0x1fb5b606UL, + 0xa5e4bf9fUL, 0x33d4b8e8UL, 0xa2c90778UL, 0x34f9000fUL, 0x8ea80996UL, + 0x18980ee1UL, 0xbb0d6a7fUL, 0x2d3d6d08UL, 0x976c6491UL, 0x015c63e6UL, + 0xf4516b6bUL, 0x62616c1cUL, 0xd8306585UL, 0x4e0062f2UL, 0xed95066cUL, + 0x7ba5011bUL, 0xc1f40882UL, 0x57c40ff5UL, 0xc6d9b065UL, 0x50e9b712UL, + 0xeab8be8bUL, 0x7c88b9fcUL, 0xdf1ddd62UL, 0x492dda15UL, 0xf37cd38cUL, + 0x654cd4fbUL, 0x5861b24dUL, 0xce51b53aUL, 0x7400bca3UL, 0xe230bbd4UL, + 0x41a5df4aUL, 0xd795d83dUL, 0x6dc4d1a4UL, 0xfbf4d6d3UL, 0x6ae96943UL, + 0xfcd96e34UL, 0x468867adUL, 0xd0b860daUL, 0x732d0444UL, 0xe51d0333UL, + 0x5f4c0aaaUL, 0xc97c0dddUL, 0x3c710550UL, 0xaa410227UL, 0x10100bbeUL, + 0x86200cc9UL, 0x25b56857UL, 0xb3856f20UL, 0x09d466b9UL, 0x9fe461ceUL, + 0x0ef9de5eUL, 0x98c9d929UL, 0x2298d0b0UL, 0xb4a8d7c7UL, 0x173db359UL, + 0x810db42eUL, 0x3b5cbdb7UL, 0xad6cbac0UL, 0x2083b8edUL, 0xb6b3bf9aUL, + 0x0ce2b603UL, 0x9ad2b174UL, 0x3947d5eaUL, 0xaf77d29dUL, 0x1526db04UL, + 0x8316dc73UL, 0x120b63e3UL, 0x843b6494UL, 0x3e6a6d0dUL, 0xa85a6a7aUL, + 0x0bcf0ee4UL, 0x9dff0993UL, 0x27ae000aUL, 0xb19e077dUL, 0x44930ff0UL, + 0xd2a30887UL, 0x68f2011eUL, 0xfec20669UL, 0x5d5762f7UL, 0xcb676580UL, + 0x71366c19UL, 0xe7066b6eUL, 0x761bd4feUL, 0xe02bd389UL, 0x5a7ada10UL, + 0xcc4add67UL, 0x6fdfb9f9UL, 0xf9efbe8eUL, 0x43beb717UL, 0xd58eb060UL, + 0xe8a3d6d6UL, 0x7e93d1a1UL, 0xc4c2d838UL, 0x52f2df4fUL, 0xf167bbd1UL, + 0x6757bca6UL, 0xdd06b53fUL, 0x4b36b248UL, 0xda2b0dd8UL, 0x4c1b0aafUL, + 0xf64a0336UL, 0x607a0441UL, 0xc3ef60dfUL, 0x55df67a8UL, 0xef8e6e31UL, + 0x79be6946UL, 0x8cb361cbUL, 0x1a8366bcUL, 0xa0d26f25UL, 0x36e26852UL, + 0x95770cccUL, 0x03470bbbUL, 0xb9160222UL, 0x2f260555UL, 0xbe3bbac5UL, + 0x280bbdb2UL, 0x925ab42bUL, 0x046ab35cUL, 0xa7ffd7c2UL, 0x31cfd0b5UL, + 0x8b9ed92cUL, 0x1daede5bUL, 0xb0c2649bUL, 0x26f263ecUL, 0x9ca36a75UL, + 0x0a936d02UL, 0xa906099cUL, 0x3f360eebUL, 0x85670772UL, 0x13570005UL, + 0x824abf95UL, 0x147ab8e2UL, 0xae2bb17bUL, 0x381bb60cUL, 0x9b8ed292UL, + 0x0dbed5e5UL, 0xb7efdc7cUL, 0x21dfdb0bUL, 0xd4d2d386UL, 0x42e2d4f1UL, + 0xf8b3dd68UL, 0x6e83da1fUL, 0xcd16be81UL, 0x5b26b9f6UL, 0xe177b06fUL, + 0x7747b718UL, 0xe65a0888UL, 0x706a0fffUL, 0xca3b0666UL, 0x5c0b0111UL, + 0xff9e658fUL, 0x69ae62f8UL, 0xd3ff6b61UL, 0x45cf6c16UL, 0x78e20aa0UL, + 0xeed20dd7UL, 0x5483044eUL, 0xc2b30339UL, 0x612667a7UL, 0xf71660d0UL, + 0x4d476949UL, 0xdb776e3eUL, 0x4a6ad1aeUL, 0xdc5ad6d9UL, 0x660bdf40UL, + 0xf03bd837UL, 0x53aebca9UL, 0xc59ebbdeUL, 0x7fcfb247UL, 0xe9ffb530UL, + 0x1cf2bdbdUL, 0x8ac2bacaUL, 0x3093b353UL, 0xa6a3b424UL, 0x0536d0baUL, + 0x9306d7cdUL, 0x2957de54UL, 0xbf67d923UL, 0x2e7a66b3UL, 0xb84a61c4UL, + 0x021b685dUL, 0x942b6f2aUL, 0x37be0bb4UL, 0xa18e0cc3UL, 0x1bdf055aUL, + 0x8def022dUL + }, + { + 0x00000000UL, 0x41311b19UL, 0x82623632UL, 0xc3532d2bUL, 0x04c56c64UL, + 0x45f4777dUL, 0x86a75a56UL, 0xc796414fUL, 0x088ad9c8UL, 0x49bbc2d1UL, + 0x8ae8effaUL, 0xcbd9f4e3UL, 0x0c4fb5acUL, 0x4d7eaeb5UL, 0x8e2d839eUL, + 0xcf1c9887UL, 0x5112c24aUL, 0x1023d953UL, 0xd370f478UL, 0x9241ef61UL, + 0x55d7ae2eUL, 0x14e6b537UL, 0xd7b5981cUL, 0x96848305UL, 0x59981b82UL, + 0x18a9009bUL, 0xdbfa2db0UL, 0x9acb36a9UL, 0x5d5d77e6UL, 0x1c6c6cffUL, + 0xdf3f41d4UL, 0x9e0e5acdUL, 0xa2248495UL, 0xe3159f8cUL, 0x2046b2a7UL, + 0x6177a9beUL, 0xa6e1e8f1UL, 0xe7d0f3e8UL, 0x2483dec3UL, 0x65b2c5daUL, + 0xaaae5d5dUL, 0xeb9f4644UL, 0x28cc6b6fUL, 0x69fd7076UL, 0xae6b3139UL, + 0xef5a2a20UL, 0x2c09070bUL, 0x6d381c12UL, 0xf33646dfUL, 0xb2075dc6UL, + 0x715470edUL, 0x30656bf4UL, 0xf7f32abbUL, 0xb6c231a2UL, 0x75911c89UL, + 0x34a00790UL, 0xfbbc9f17UL, 0xba8d840eUL, 0x79dea925UL, 0x38efb23cUL, + 0xff79f373UL, 0xbe48e86aUL, 0x7d1bc541UL, 0x3c2ade58UL, 0x054f79f0UL, + 0x447e62e9UL, 0x872d4fc2UL, 0xc61c54dbUL, 0x018a1594UL, 0x40bb0e8dUL, + 0x83e823a6UL, 0xc2d938bfUL, 0x0dc5a038UL, 0x4cf4bb21UL, 0x8fa7960aUL, + 0xce968d13UL, 0x0900cc5cUL, 0x4831d745UL, 0x8b62fa6eUL, 0xca53e177UL, + 0x545dbbbaUL, 0x156ca0a3UL, 0xd63f8d88UL, 0x970e9691UL, 0x5098d7deUL, + 0x11a9ccc7UL, 0xd2fae1ecUL, 0x93cbfaf5UL, 0x5cd76272UL, 0x1de6796bUL, + 0xdeb55440UL, 0x9f844f59UL, 0x58120e16UL, 0x1923150fUL, 0xda703824UL, + 0x9b41233dUL, 0xa76bfd65UL, 0xe65ae67cUL, 0x2509cb57UL, 0x6438d04eUL, + 0xa3ae9101UL, 0xe29f8a18UL, 0x21cca733UL, 0x60fdbc2aUL, 0xafe124adUL, + 0xeed03fb4UL, 0x2d83129fUL, 0x6cb20986UL, 0xab2448c9UL, 0xea1553d0UL, + 0x29467efbUL, 0x687765e2UL, 0xf6793f2fUL, 0xb7482436UL, 0x741b091dUL, + 0x352a1204UL, 0xf2bc534bUL, 0xb38d4852UL, 0x70de6579UL, 0x31ef7e60UL, + 0xfef3e6e7UL, 0xbfc2fdfeUL, 0x7c91d0d5UL, 0x3da0cbccUL, 0xfa368a83UL, + 0xbb07919aUL, 0x7854bcb1UL, 0x3965a7a8UL, 0x4b98833bUL, 0x0aa99822UL, + 0xc9fab509UL, 0x88cbae10UL, 0x4f5def5fUL, 0x0e6cf446UL, 0xcd3fd96dUL, + 0x8c0ec274UL, 0x43125af3UL, 0x022341eaUL, 0xc1706cc1UL, 0x804177d8UL, + 0x47d73697UL, 0x06e62d8eUL, 0xc5b500a5UL, 0x84841bbcUL, 0x1a8a4171UL, + 0x5bbb5a68UL, 0x98e87743UL, 0xd9d96c5aUL, 0x1e4f2d15UL, 0x5f7e360cUL, + 0x9c2d1b27UL, 0xdd1c003eUL, 0x120098b9UL, 0x533183a0UL, 0x9062ae8bUL, + 0xd153b592UL, 0x16c5f4ddUL, 0x57f4efc4UL, 0x94a7c2efUL, 0xd596d9f6UL, + 0xe9bc07aeUL, 0xa88d1cb7UL, 0x6bde319cUL, 0x2aef2a85UL, 0xed796bcaUL, + 0xac4870d3UL, 0x6f1b5df8UL, 0x2e2a46e1UL, 0xe136de66UL, 0xa007c57fUL, + 0x6354e854UL, 0x2265f34dUL, 0xe5f3b202UL, 0xa4c2a91bUL, 0x67918430UL, + 0x26a09f29UL, 0xb8aec5e4UL, 0xf99fdefdUL, 0x3accf3d6UL, 0x7bfde8cfUL, + 0xbc6ba980UL, 0xfd5ab299UL, 0x3e099fb2UL, 0x7f3884abUL, 0xb0241c2cUL, + 0xf1150735UL, 0x32462a1eUL, 0x73773107UL, 0xb4e17048UL, 0xf5d06b51UL, + 0x3683467aUL, 0x77b25d63UL, 0x4ed7facbUL, 0x0fe6e1d2UL, 0xccb5ccf9UL, + 0x8d84d7e0UL, 0x4a1296afUL, 0x0b238db6UL, 0xc870a09dUL, 0x8941bb84UL, + 0x465d2303UL, 0x076c381aUL, 0xc43f1531UL, 0x850e0e28UL, 0x42984f67UL, + 0x03a9547eUL, 0xc0fa7955UL, 0x81cb624cUL, 0x1fc53881UL, 0x5ef42398UL, + 0x9da70eb3UL, 0xdc9615aaUL, 0x1b0054e5UL, 0x5a314ffcUL, 0x996262d7UL, + 0xd85379ceUL, 0x174fe149UL, 0x567efa50UL, 0x952dd77bUL, 0xd41ccc62UL, + 0x138a8d2dUL, 0x52bb9634UL, 0x91e8bb1fUL, 0xd0d9a006UL, 0xecf37e5eUL, + 0xadc26547UL, 0x6e91486cUL, 0x2fa05375UL, 0xe836123aUL, 0xa9070923UL, + 0x6a542408UL, 0x2b653f11UL, 0xe479a796UL, 0xa548bc8fUL, 0x661b91a4UL, + 0x272a8abdUL, 0xe0bccbf2UL, 0xa18dd0ebUL, 0x62defdc0UL, 0x23efe6d9UL, + 0xbde1bc14UL, 0xfcd0a70dUL, 0x3f838a26UL, 0x7eb2913fUL, 0xb924d070UL, + 0xf815cb69UL, 0x3b46e642UL, 0x7a77fd5bUL, 0xb56b65dcUL, 0xf45a7ec5UL, + 0x370953eeUL, 0x763848f7UL, 0xb1ae09b8UL, 0xf09f12a1UL, 0x33cc3f8aUL, + 0x72fd2493UL + }, + { + 0x00000000UL, 0x376ac201UL, 0x6ed48403UL, 0x59be4602UL, 0xdca80907UL, + 0xebc2cb06UL, 0xb27c8d04UL, 0x85164f05UL, 0xb851130eUL, 0x8f3bd10fUL, + 0xd685970dUL, 0xe1ef550cUL, 0x64f91a09UL, 0x5393d808UL, 0x0a2d9e0aUL, + 0x3d475c0bUL, 0x70a3261cUL, 0x47c9e41dUL, 0x1e77a21fUL, 0x291d601eUL, + 0xac0b2f1bUL, 0x9b61ed1aUL, 0xc2dfab18UL, 0xf5b56919UL, 0xc8f23512UL, + 0xff98f713UL, 0xa626b111UL, 0x914c7310UL, 0x145a3c15UL, 0x2330fe14UL, + 0x7a8eb816UL, 0x4de47a17UL, 0xe0464d38UL, 0xd72c8f39UL, 0x8e92c93bUL, + 0xb9f80b3aUL, 0x3cee443fUL, 0x0b84863eUL, 0x523ac03cUL, 0x6550023dUL, + 0x58175e36UL, 0x6f7d9c37UL, 0x36c3da35UL, 0x01a91834UL, 0x84bf5731UL, + 0xb3d59530UL, 0xea6bd332UL, 0xdd011133UL, 0x90e56b24UL, 0xa78fa925UL, + 0xfe31ef27UL, 0xc95b2d26UL, 0x4c4d6223UL, 0x7b27a022UL, 0x2299e620UL, + 0x15f32421UL, 0x28b4782aUL, 0x1fdeba2bUL, 0x4660fc29UL, 0x710a3e28UL, + 0xf41c712dUL, 0xc376b32cUL, 0x9ac8f52eUL, 0xada2372fUL, 0xc08d9a70UL, + 0xf7e75871UL, 0xae591e73UL, 0x9933dc72UL, 0x1c259377UL, 0x2b4f5176UL, + 0x72f11774UL, 0x459bd575UL, 0x78dc897eUL, 0x4fb64b7fUL, 0x16080d7dUL, + 0x2162cf7cUL, 0xa4748079UL, 0x931e4278UL, 0xcaa0047aUL, 0xfdcac67bUL, + 0xb02ebc6cUL, 0x87447e6dUL, 0xdefa386fUL, 0xe990fa6eUL, 0x6c86b56bUL, + 0x5bec776aUL, 0x02523168UL, 0x3538f369UL, 0x087faf62UL, 0x3f156d63UL, + 0x66ab2b61UL, 0x51c1e960UL, 0xd4d7a665UL, 0xe3bd6464UL, 0xba032266UL, + 0x8d69e067UL, 0x20cbd748UL, 0x17a11549UL, 0x4e1f534bUL, 0x7975914aUL, + 0xfc63de4fUL, 0xcb091c4eUL, 0x92b75a4cUL, 0xa5dd984dUL, 0x989ac446UL, + 0xaff00647UL, 0xf64e4045UL, 0xc1248244UL, 0x4432cd41UL, 0x73580f40UL, + 0x2ae64942UL, 0x1d8c8b43UL, 0x5068f154UL, 0x67023355UL, 0x3ebc7557UL, + 0x09d6b756UL, 0x8cc0f853UL, 0xbbaa3a52UL, 0xe2147c50UL, 0xd57ebe51UL, + 0xe839e25aUL, 0xdf53205bUL, 0x86ed6659UL, 0xb187a458UL, 0x3491eb5dUL, + 0x03fb295cUL, 0x5a456f5eUL, 0x6d2fad5fUL, 0x801b35e1UL, 0xb771f7e0UL, + 0xeecfb1e2UL, 0xd9a573e3UL, 0x5cb33ce6UL, 0x6bd9fee7UL, 0x3267b8e5UL, + 0x050d7ae4UL, 0x384a26efUL, 0x0f20e4eeUL, 0x569ea2ecUL, 0x61f460edUL, + 0xe4e22fe8UL, 0xd388ede9UL, 0x8a36abebUL, 0xbd5c69eaUL, 0xf0b813fdUL, + 0xc7d2d1fcUL, 0x9e6c97feUL, 0xa90655ffUL, 0x2c101afaUL, 0x1b7ad8fbUL, + 0x42c49ef9UL, 0x75ae5cf8UL, 0x48e900f3UL, 0x7f83c2f2UL, 0x263d84f0UL, + 0x115746f1UL, 0x944109f4UL, 0xa32bcbf5UL, 0xfa958df7UL, 0xcdff4ff6UL, + 0x605d78d9UL, 0x5737bad8UL, 0x0e89fcdaUL, 0x39e33edbUL, 0xbcf571deUL, + 0x8b9fb3dfUL, 0xd221f5ddUL, 0xe54b37dcUL, 0xd80c6bd7UL, 0xef66a9d6UL, + 0xb6d8efd4UL, 0x81b22dd5UL, 0x04a462d0UL, 0x33cea0d1UL, 0x6a70e6d3UL, + 0x5d1a24d2UL, 0x10fe5ec5UL, 0x27949cc4UL, 0x7e2adac6UL, 0x494018c7UL, + 0xcc5657c2UL, 0xfb3c95c3UL, 0xa282d3c1UL, 0x95e811c0UL, 0xa8af4dcbUL, + 0x9fc58fcaUL, 0xc67bc9c8UL, 0xf1110bc9UL, 0x740744ccUL, 0x436d86cdUL, + 0x1ad3c0cfUL, 0x2db902ceUL, 0x4096af91UL, 0x77fc6d90UL, 0x2e422b92UL, + 0x1928e993UL, 0x9c3ea696UL, 0xab546497UL, 0xf2ea2295UL, 0xc580e094UL, + 0xf8c7bc9fUL, 0xcfad7e9eUL, 0x9613389cUL, 0xa179fa9dUL, 0x246fb598UL, + 0x13057799UL, 0x4abb319bUL, 0x7dd1f39aUL, 0x3035898dUL, 0x075f4b8cUL, + 0x5ee10d8eUL, 0x698bcf8fUL, 0xec9d808aUL, 0xdbf7428bUL, 0x82490489UL, + 0xb523c688UL, 0x88649a83UL, 0xbf0e5882UL, 0xe6b01e80UL, 0xd1dadc81UL, + 0x54cc9384UL, 0x63a65185UL, 0x3a181787UL, 0x0d72d586UL, 0xa0d0e2a9UL, + 0x97ba20a8UL, 0xce0466aaUL, 0xf96ea4abUL, 0x7c78ebaeUL, 0x4b1229afUL, + 0x12ac6fadUL, 0x25c6adacUL, 0x1881f1a7UL, 0x2feb33a6UL, 0x765575a4UL, + 0x413fb7a5UL, 0xc429f8a0UL, 0xf3433aa1UL, 0xaafd7ca3UL, 0x9d97bea2UL, + 0xd073c4b5UL, 0xe71906b4UL, 0xbea740b6UL, 0x89cd82b7UL, 0x0cdbcdb2UL, + 0x3bb10fb3UL, 0x620f49b1UL, 0x55658bb0UL, 0x6822d7bbUL, 0x5f4815baUL, + 0x06f653b8UL, 0x319c91b9UL, 0xb48adebcUL, 0x83e01cbdUL, 0xda5e5abfUL, + 0xed3498beUL + }, + { + 0x00000000UL, 0x6567bcb8UL, 0x8bc809aaUL, 0xeeafb512UL, 0x5797628fUL, + 0x32f0de37UL, 0xdc5f6b25UL, 0xb938d79dUL, 0xef28b4c5UL, 0x8a4f087dUL, + 0x64e0bd6fUL, 0x018701d7UL, 0xb8bfd64aUL, 0xddd86af2UL, 0x3377dfe0UL, + 0x56106358UL, 0x9f571950UL, 0xfa30a5e8UL, 0x149f10faUL, 0x71f8ac42UL, + 0xc8c07bdfUL, 0xada7c767UL, 0x43087275UL, 0x266fcecdUL, 0x707fad95UL, + 0x1518112dUL, 0xfbb7a43fUL, 0x9ed01887UL, 0x27e8cf1aUL, 0x428f73a2UL, + 0xac20c6b0UL, 0xc9477a08UL, 0x3eaf32a0UL, 0x5bc88e18UL, 0xb5673b0aUL, + 0xd00087b2UL, 0x6938502fUL, 0x0c5fec97UL, 0xe2f05985UL, 0x8797e53dUL, + 0xd1878665UL, 0xb4e03addUL, 0x5a4f8fcfUL, 0x3f283377UL, 0x8610e4eaUL, + 0xe3775852UL, 0x0dd8ed40UL, 0x68bf51f8UL, 0xa1f82bf0UL, 0xc49f9748UL, + 0x2a30225aUL, 0x4f579ee2UL, 0xf66f497fUL, 0x9308f5c7UL, 0x7da740d5UL, + 0x18c0fc6dUL, 0x4ed09f35UL, 0x2bb7238dUL, 0xc518969fUL, 0xa07f2a27UL, + 0x1947fdbaUL, 0x7c204102UL, 0x928ff410UL, 0xf7e848a8UL, 0x3d58149bUL, + 0x583fa823UL, 0xb6901d31UL, 0xd3f7a189UL, 0x6acf7614UL, 0x0fa8caacUL, + 0xe1077fbeUL, 0x8460c306UL, 0xd270a05eUL, 0xb7171ce6UL, 0x59b8a9f4UL, + 0x3cdf154cUL, 0x85e7c2d1UL, 0xe0807e69UL, 0x0e2fcb7bUL, 0x6b4877c3UL, + 0xa20f0dcbUL, 0xc768b173UL, 0x29c70461UL, 0x4ca0b8d9UL, 0xf5986f44UL, + 0x90ffd3fcUL, 0x7e5066eeUL, 0x1b37da56UL, 0x4d27b90eUL, 0x284005b6UL, + 0xc6efb0a4UL, 0xa3880c1cUL, 0x1ab0db81UL, 0x7fd76739UL, 0x9178d22bUL, + 0xf41f6e93UL, 0x03f7263bUL, 0x66909a83UL, 0x883f2f91UL, 0xed589329UL, + 0x546044b4UL, 0x3107f80cUL, 0xdfa84d1eUL, 0xbacff1a6UL, 0xecdf92feUL, + 0x89b82e46UL, 0x67179b54UL, 0x027027ecUL, 0xbb48f071UL, 0xde2f4cc9UL, + 0x3080f9dbUL, 0x55e74563UL, 0x9ca03f6bUL, 0xf9c783d3UL, 0x176836c1UL, + 0x720f8a79UL, 0xcb375de4UL, 0xae50e15cUL, 0x40ff544eUL, 0x2598e8f6UL, + 0x73888baeUL, 0x16ef3716UL, 0xf8408204UL, 0x9d273ebcUL, 0x241fe921UL, + 0x41785599UL, 0xafd7e08bUL, 0xcab05c33UL, 0x3bb659edUL, 0x5ed1e555UL, + 0xb07e5047UL, 0xd519ecffUL, 0x6c213b62UL, 0x094687daUL, 0xe7e932c8UL, + 0x828e8e70UL, 0xd49eed28UL, 0xb1f95190UL, 0x5f56e482UL, 0x3a31583aUL, + 0x83098fa7UL, 0xe66e331fUL, 0x08c1860dUL, 0x6da63ab5UL, 0xa4e140bdUL, + 0xc186fc05UL, 0x2f294917UL, 0x4a4ef5afUL, 0xf3762232UL, 0x96119e8aUL, + 0x78be2b98UL, 0x1dd99720UL, 0x4bc9f478UL, 0x2eae48c0UL, 0xc001fdd2UL, + 0xa566416aUL, 0x1c5e96f7UL, 0x79392a4fUL, 0x97969f5dUL, 0xf2f123e5UL, + 0x05196b4dUL, 0x607ed7f5UL, 0x8ed162e7UL, 0xebb6de5fUL, 0x528e09c2UL, + 0x37e9b57aUL, 0xd9460068UL, 0xbc21bcd0UL, 0xea31df88UL, 0x8f566330UL, + 0x61f9d622UL, 0x049e6a9aUL, 0xbda6bd07UL, 0xd8c101bfUL, 0x366eb4adUL, + 0x53090815UL, 0x9a4e721dUL, 0xff29cea5UL, 0x11867bb7UL, 0x74e1c70fUL, + 0xcdd91092UL, 0xa8beac2aUL, 0x46111938UL, 0x2376a580UL, 0x7566c6d8UL, + 0x10017a60UL, 0xfeaecf72UL, 0x9bc973caUL, 0x22f1a457UL, 0x479618efUL, + 0xa939adfdUL, 0xcc5e1145UL, 0x06ee4d76UL, 0x6389f1ceUL, 0x8d2644dcUL, + 0xe841f864UL, 0x51792ff9UL, 0x341e9341UL, 0xdab12653UL, 0xbfd69aebUL, + 0xe9c6f9b3UL, 0x8ca1450bUL, 0x620ef019UL, 0x07694ca1UL, 0xbe519b3cUL, + 0xdb362784UL, 0x35999296UL, 0x50fe2e2eUL, 0x99b95426UL, 0xfcdee89eUL, + 0x12715d8cUL, 0x7716e134UL, 0xce2e36a9UL, 0xab498a11UL, 0x45e63f03UL, + 0x208183bbUL, 0x7691e0e3UL, 0x13f65c5bUL, 0xfd59e949UL, 0x983e55f1UL, + 0x2106826cUL, 0x44613ed4UL, 0xaace8bc6UL, 0xcfa9377eUL, 0x38417fd6UL, + 0x5d26c36eUL, 0xb389767cUL, 0xd6eecac4UL, 0x6fd61d59UL, 0x0ab1a1e1UL, + 0xe41e14f3UL, 0x8179a84bUL, 0xd769cb13UL, 0xb20e77abUL, 0x5ca1c2b9UL, + 0x39c67e01UL, 0x80fea99cUL, 0xe5991524UL, 0x0b36a036UL, 0x6e511c8eUL, + 0xa7166686UL, 0xc271da3eUL, 0x2cde6f2cUL, 0x49b9d394UL, 0xf0810409UL, + 0x95e6b8b1UL, 0x7b490da3UL, 0x1e2eb11bUL, 0x483ed243UL, 0x2d596efbUL, + 0xc3f6dbe9UL, 0xa6916751UL, 0x1fa9b0ccUL, 0x7ace0c74UL, 0x9461b966UL, + 0xf10605deUL +#endif + } +}; diff --git a/data/nsis/Contrib/nsisunz/zlib/inflate.h b/data/nsis/Contrib/nsisunz/zlib/inflate.h new file mode 100644 index 000000000..9a12c8fd2 --- /dev/null +++ b/data/nsis/Contrib/nsisunz/zlib/inflate.h @@ -0,0 +1,117 @@ +/* inflate.h -- internal inflate state definition + * Copyright (C) 1995-2003 Mark Adler + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +/* WARNING: this file should *not* be used by applications. It is + part of the implementation of the compression library and is + subject to change. Applications should only use zlib.h. + */ + +/* define NO_GZIP when compiling if you want to disable gzip header and + trailer decoding by inflate(). NO_GZIP would be used to avoid linking in + the crc code when it is not needed. For shared libraries, gzip decoding + should be left enabled. */ +#ifndef NO_GZIP +# define GUNZIP +#endif + +/* Possible inflate modes between inflate() calls */ +typedef enum { + HEAD, /* i: waiting for magic header */ +#ifdef GUNZIP + FLAGS, /* i: waiting for method and flags (gzip) */ + TIME, /* i: waiting for modification time (gzip) */ + OS, /* i: waiting for extra flags and operating system (gzip) */ + EXLEN, /* i: waiting for extra length (gzip) */ + EXTRA, /* i: waiting for extra bytes (gzip) */ + NAME, /* i: waiting for end of file name (gzip) */ + COMMENT, /* i: waiting for end of comment (gzip) */ + HCRC, /* i: waiting for header crc (gzip) */ +#endif + DICTID, /* i: waiting for dictionary check value */ + DICT, /* waiting for inflateSetDictionary() call */ + TYPE, /* i: waiting for type bits, including last-flag bit */ + TYPEDO, /* i: same, but skip check to exit inflate on new block */ + STORED, /* i: waiting for stored size (length and complement) */ + COPY, /* i/o: waiting for input or output to copy stored block */ + TABLE, /* i: waiting for dynamic block table lengths */ + LENLENS, /* i: waiting for code length code lengths */ + CODELENS, /* i: waiting for length/lit and distance code lengths */ + LEN, /* i: waiting for length/lit code */ + LENEXT, /* i: waiting for length extra bits */ + DIST, /* i: waiting for distance code */ + DISTEXT, /* i: waiting for distance extra bits */ + MATCH, /* o: waiting for output space to copy string */ + LIT, /* o: waiting for output space to write literal */ + CHECK, /* i: waiting for 32-bit check value */ +#ifdef GUNZIP + LENGTH, /* i: waiting for 32-bit length (gzip) */ +#endif + DONE, /* finished check, done -- remain here until reset */ + BAD, /* got a data error -- remain here until reset */ + MEM, /* got an inflate() memory error -- remain here until reset */ + SYNC /* looking for synchronization bytes to restart inflate() */ +} inflate_mode; + +/* + State transitions between above modes - + + (most modes can go to the BAD or MEM mode -- not shown for clarity) + + Process header: + HEAD -> (gzip) or (zlib) + (gzip) -> FLAGS -> TIME -> OS -> EXLEN -> EXTRA -> NAME + NAME -> COMMENT -> HCRC -> TYPE + (zlib) -> DICTID or TYPE + DICTID -> DICT -> TYPE + Read deflate blocks: + TYPE -> STORED or TABLE or LEN or CHECK + STORED -> COPY -> TYPE + TABLE -> LENLENS -> CODELENS -> LEN + Read deflate codes: + LEN -> LENEXT or LIT or TYPE + LENEXT -> DIST -> DISTEXT -> MATCH -> LEN + LIT -> LEN + Process trailer: + CHECK -> LENGTH -> DONE + */ + +/* state maintained between inflate() calls. Approximately 7K bytes. */ +struct inflate_state { + inflate_mode mode; /* current inflate mode */ + int last; /* true if processing last block */ + int wrap; /* bit 0 true for zlib, bit 1 true for gzip */ + int havedict; /* true if dictionary provided */ + int flags; /* gzip header method and flags (0 if zlib) */ + unsigned long check; /* protected copy of check value */ + unsigned long total; /* protected copy of output count */ + /* sliding window */ + unsigned wbits; /* log base 2 of requested window size */ + unsigned wsize; /* window size or zero if not using window */ + unsigned whave; /* valid bytes in the window */ + unsigned write; /* window write index */ + unsigned char FAR *window; /* allocated sliding window, if needed */ + /* bit accumulator */ + unsigned long hold; /* input bit accumulator */ + unsigned bits; /* number of bits in "in" */ + /* for string and stored block copying */ + unsigned length; /* literal or length of data to copy */ + unsigned offset; /* distance back to copy string from */ + /* for table and code decoding */ + unsigned extra; /* extra bits needed */ + /* fixed and dynamic code tables */ + code const FAR *lencode; /* starting table for length/literal codes */ + code const FAR *distcode; /* starting table for distance codes */ + unsigned lenbits; /* index bits for lencode */ + unsigned distbits; /* index bits for distcode */ + /* dynamic table building */ + unsigned ncode; /* number of code length code lengths */ + unsigned nlen; /* number of length code lengths */ + unsigned ndist; /* number of distance code lengths */ + unsigned have; /* number of code lengths in lens[] */ + code FAR *next; /* next available space in codes[] */ + unsigned short lens[320]; /* temporary storage for code lengths */ + unsigned short work[288]; /* work area for code table building */ + code codes[ENOUGH]; /* space for code tables */ +}; diff --git a/data/nsis/Docs/Inetc/Readme.htm b/data/nsis/Docs/Inetc/Readme.htm new file mode 100644 index 000000000..0913e7425 --- /dev/null +++ b/data/nsis/Docs/Inetc/Readme.htm @@ -0,0 +1,153 @@ +
+

Contents

+
    +
  • 1 Links +
  • 2 Description +
  • 3 Commands +
      +
    • 3.1 get +
    • 3.2 post +
    • 3.3 head +
    • 3.4 put +
    +
  • 4 Examples +
  • 5 Credits +
+
+ +

Links

+Download: http://nsis.sourceforge.net/Inetc_plug-in + +

Description

+Internet client plug-in for files download and upload. Based on the InetLoad plug-in. +Network implementation uses MS WinInet API, supports http/https and ftp protocols. +Plugin has better proxy support compare to NSISdl plug-in. Command line may include +few URL/File pairs to be transfered. If server or proxy login/password are not setten in the script, +displays IE-style authentication dialog (except silent mode). Plug-in supports 3 +"transfer in progress" display modes: +
    +
  • old NSISdl style - additional embedded progress bar and text on the INSTFILES page; +
  • POPUP dialog mode with detailed info; +
  • BANNER mode with simple popup window. +
+Plug-in recognizes Installer's Silent mode and this case hides any output (this feature +requires NSIS 2.03 or later). Program implements simple re-get functionality - host +reconnect and download from current position after short pause. While program depends on IE settings, +it changes current IE mode to online. NSISdl code fragment was used for progress bar displaying +in the "old style" mode. For ftp use "host/path" for file location relative to user's home dir and +"host//path" for absolute path. + +

Commands

+ +Plug-in DLL functions (entry points): get, post, head, put + +

get

+ +inetc::get [/PROXY IP:PORT] [/USERNAME PROXY_LOGIN /PASSWORD PROXY_PASSWD] [/NOCOOKIES] + [/NOPROXY] [/NOCANCEL] [/CONNECTTIMEOUT TO_SEC] [/RECEIVETIMEOUT TO_SEC] [/SILENT] [/WEAKSECURITY] + [/CAPTION TEXT] [/NOCOOKIES] [/RESUME RETRY_QUESTION] [/POPUP HOST_ALIAS | /BANNER TEXT] + [/CANCELTEXT CANCEL_TEXT] [/QUESTION CANCEL_QUESTION] [/USERAGENT USER_AGENT_TEXT] + [/HEADER HEADER_TEXT] [/TRANSLATE LANG_PARAMS] [/TOSTACK | /TOSTACKCONV] + URL1 local_file1 [URL2 local_file2 [...]] [/END] +

This call returns "OK" string if successful, error description string if failed (see included InetLoad.cpp file for a full set of status strings). Usage and result processing samples are included to the package. +

/PROXY - +Overwrites current proxy settings, not required in most cases. IE settings will be used by default. +

/USERNAME - +Proxy username (http only). +

/PASSWORD - +Proxy password (http only). For server (http/ftp) authentication it is possible to use URL encoded name and password, for example http://username:password@nsis.sourceforge.net. +

/NOPROXY - +Disables proxy settings for this connection (if any) +

/NOCANCEL - +Prevents download from being interrupted by user (locks Esc, Alt-F4, Cancel handling, removes sysmenu) +

/CONNECTTIMEOUT - +Sets INTERNET_OPTION_CONNECT_TIMEOUT, seconds, default - IE current parameter value. +

/RECEIVETIMEOUT - +Sets INTERNET_OPTION_RECEIVE_TIMEOUT, seconds, default - IE current parameter value. +

/SILENT - +Key hides plug-in' output (both popup dialog and embedded progress bar). Not required if 'SilentInstall silent' mode was defined in script (NSIS 2.03 or later). +

/WEAKSECURITY - +Ignore unknown and revoked certificates +

/RESUME - +On the permanent connection/transfer error instead of exit first displays message box with "resume download" question. Useful for dial-up connections and big files - allows user to restore connection and resume download. Default is "Your internet connection seems to have dropped out!\nPlease reconnect and click Retry to resume downloading...". +

/CAPTION - +Defines caption text for /BANNER mode, caption prefix (left of '-') for /POPUP mode and caption for RESUME MessageBox. Default is "InetLoad plug-in" if not set or "". 127 chars maximum. +

/POPUP - +This mode displays detailed download dialog instead of embedded progress bar. Also useful in .onInit function (i.e. not in Section). If HOST_ALIAS is not "", text will replace URL in the dialog - this allows to hide real URL (including password). +

/BANNER - +Displays simple popup dialog (MSI Banner mode) and sets dialog TEXT (up to 3 lines using $\n). +

/CANCELTEXT - +Text for the Cancel button in the NSISdl mode. Default is NSIS dialog Cancel button text (current lang). +

/QUESTION - +Text for the optional MessageBox if user tries to cancel download. If /QUESTION "" was used default +"Are you sure that you want to stop download?" will be substituted. +

/USERAGENT - +UserAgent http request header value. Default is "NSIS_Inetc (Mozilla)". 256 chars maximum. +

/HEADER - +Adds or replaces http request header. Common HEADER_TEXT format is "header: value". +

/NOCOOKIES - +Removes cookies from http request +

/TOSTACK - +Outputs the post/get/head response to the NSIS stack rather than to the file (specify an empty string for local_file1, local_file2 etc.) +

/TOSTACKCONV - +Outputs the post/get/head response to the NSIS stack while converting character encodings:
+ASCII -> Unicode for the Unicode plug-in build
+Unicode -> ASCII for the ASCII plug-in build +

/END - +Allows to limit plug-in stack reading (optional, required if you stores other vars in the stack). +

/TRANSLATE - +Allows translating plug-in text in the POPUP or NSISdl modes. 8 parameters both cases.
+ +NSISdl mode parameters:
+ /TRANSLATE downloading connecting second minute hour plural progress remaining
+With default values:
+ "Downloading %s" "Connecting ..." second minute hour s "%dkB (%d%%) of %dkB @ %d.%01dkB/s" "(%d %s%s remaining)"
+ +POPUP mode parameters:
+ /TRANSLATE url downloading connecting file_name received file_size remaining_time total_time
+With default values:
+ URL Downloading Connecting "File Name" Received "File Size" "Remaining Time" "Total Time"
+ +

post

+ +inetc::post TEXT2POST [/FILE] [/PROXY IP:PORT] [/NOPROXY] [/NOCANCEL] + [/USERNAME PROXY_LOGIN /PASSWORD PROXY_PASSWD] [/TIMEOUT INT_MS] [/SILENT] [/WEAKSECURITY] + [/CAPTION TEXT] [/POPUP | /BANNER TEXT] [/CANCELTEXT CANCEL_TEXT] + [/USERAGENT USER_AGENT_TEXT] [/TRANSLATE LANG_PARAMS] [/TOSTACK | /TOSTACKCONV] + URL1 local_file1 [URL2 local_file2 [...]] [/END] +

Sets POST http mode and defines text string to be used in the POST (http only). Disables auto re-get. No char replaces used (%20 and others). +If /FILE presents in command line, TEXT2POST is filename to be sent in POST request. Also 'Filename:' header will be added to HTTP headers. + +

head

+ +The same as get, but requests http headers only. Writes raw headers to file. + +

put

+ +inetc::put [/PROXY IP:PORT] [/USERNAME PROXY_LOGIN /PASSWORD PROXY_PASSWD] [/NOPROXY] + [/NOCANCEL] [/TIMEOUT INT_MS] [/SILENT] [/WEAKSECURITY] [/CAPTION TEXT] [/POPUP | /BANNER TEXT] + [/CANCELTEXT CANCEL_TEXT] [/USERAGENT USER_AGENT_TEXT] + [/TRANSLATE LANG_PARAMS] URL1 local_file1 [URL2 local_file2 [...]] [/END] +

Return value and parameters (if applicable) are the same as for previous entry point. + +

Examples

+
  inetc::put "http://dl.zvuki.ru/6306/mp3/12.mp3" "$EXEDIR\12.mp3" \
+     "ftp://dl.zvuki.ru/6306/mp3/11.mp3" "$EXEDIR\11.mp3"
+  Pop $0
+  inetc::put /BANNER "Cameron Diaz upload in progress..." \
+    "http://www.dreamgirlswallpaper.co.uk/fiveyearsonline/wallpaper/Cameron_Diaz/camerond09big.JPG" \
+    "$EXEDIR\cd.jpg"
+  Pop $0
+  StrCmp $0 "OK" dlok
+  MessageBox MB_OK|MB_ICONEXCLAMATION "http upload Error, click OK to abort installation" /SD IDOK
+  Abort
+dlok:
+  ...
+ +

Credits

+

Many thanks to Backland who offered a simple way to fix NSISdl mode crashes, added 'center parent' function, offers few nice design ideas and spent a lot of time testing the plug-in.

+
+

v1.0.4.4 by Stuart 'Afrow UK' Welch

+

v1.0.5.0..v1.0.5.2 by anders_k

+
+

See Contrib\inetc\inetc.cpp for changes.

diff --git a/data/nsis/Docs/Inetc/wiki.txt b/data/nsis/Docs/Inetc/wiki.txt new file mode 100644 index 000000000..384bdd37c --- /dev/null +++ b/data/nsis/Docs/Inetc/wiki.txt @@ -0,0 +1,161 @@ +{{PageAuthor|Takhir}} + +== Links == + +Download:
+Inetc.zip
+ +[http://forums.winamp.com/showthread.php?threadid=198596 Forum thread] + +== Description == + +Internet client plug-in for files download and upload. Based on the InetLoad plug-in. Network implementation uses MS WinInet API, supports http/https and ftp protocols. Plugin has better proxy support compared to NSISdl plug-in. Command line may include few URL/File pairs to be transfered. If server or proxy login/password are not set in the script, it displays IE-style authentication dialog (except silent mode). Plug-in supports 3 "transfer in progress" display modes: + +# old NSISdl style - additional embedded progress bar and text on the INSTFILES page; +# POPUP dialog mode with detailed info; +# BANNER mode with simple popup window. + +Plug-in recognizes Installer's Silent mode and this case hides any output (this feature requires NSIS 2.03 or later). Program implements simple re-get functionality - host reconnect and download from current position after short pause. While program depends on IE settings, it changes current IE mode to online. NSISdl code fragment was used for progress bar displaying in the "old style" mode. +For ftp use "host/path" for file location relative to user's home dir and +"host//path" for absolute path. + +== Commands == + +Plug-in DLL functions (entry points): get, post, head, put + +=== get === + +inetc::get [/PROXY IP:PORT] [/USERNAME PROXY_LOGIN /PASSWORD PROXY_PASSWD] + [/NOPROXY] [/NOCANCEL] [/CONNECTTIMEOUT TO_SEC] [/RECEIVETIMEOUT TO_SEC] [/SILENT] [/WEAKSECURITY] + [/CAPTION TEXT] [/NOCOOKIES] [/RESUME RETRY_QUESTION] [/POPUP HOST_ALIAS | /BANNER TEXT] + [/CANCELTEXT CANCEL_TEXT] [/QUESTION CANCEL_QUESTION] [/USERAGENT USER_AGENT_TEXT] + [/HEADER HEADER_TEXT] [/TRANSLATE LANG_PARAMS] [/TOSTACK | /TOSTACKCONV] + URL1 local_file1 [URL2 local_file2 [...]] [/END] +This call returns "OK" string if successful, error description string if failed (see included InetLoad.cpp file for a full set of status strings). Usage and result processing samples are included to the package. + +; /PROXY +: Overwrites current proxy settings, not required in most cases. IE settings will be used by default. + +; /USERNAME +: Proxy username (http only). + +; /PASSWORD +: Proxy password (http only). For server (http/ftp) authentication it is possible to use URL encoded name and password, for example http://username:password@nsis.sourceforge.net. + +; /NOPROXY +: Disables proxy settings for this connection (if any) + +; /NOCANCEL +: Prevents download from being interrupted by user (locks Esc, Alt-F4, Cancel handling) + +; /CONNECTTIMEOUT - +:Sets INTERNET_OPTION_CONNECT_TIMEOUT, seconds, default - IE current parameter value. + +; /RECEIVETIMEOUT - +:Sets INTERNET_OPTION_RECEIVE_TIMEOUT, seconds, default - IE current parameter value. + +; /SILENT +: Key hides plug-in' output (both popup dialog and embedded progress bar). Not required if 'SilentInstall silent' mode was defined in script (NSIS 2.03 or later). + +; /WEAKSECURITY +: Ignore unknown and revoked certificates + +; /RESUME +: On the permanent connection/transfer error instead of exit first displays message box with "resume download" question. Useful for dial-up connections and big files - allows user to restore connection and resume download. Default is "Your internet connection seems to have dropped out!\nPlease reconnect and click Retry to resume downloading...". + +; /CAPTION +: Defines caption text for /BANNER mode, caption prefix (left of '-') for /POPUP mode and caption for RESUME MessageBox. Default is "InetLoad plug-in" if not set or "". + +; /POPUP +: This mode displays detailed download dialog instead of embedded progress bar. Also useful in .onInit function (i.e. not in Section). If HOST_ALIAS is not "", text will replace URL in the dialog - this allows to hide real URL (including password). + +; /BANNER +: Displays simple popup dialog (MSI Banner mode) and sets dialog TEXT (up to 3 lines using $\n). + +; /CANCELTEXT +: Text for the Cancel button in the NSISdl mode. Default is NSIS dialog Cancel button text (current lang). + +; /QUESTION +: Text for the optional MessageBox if user tries to cancel download. If /QUESTION "" was used default "Are you sure that you want to stop download?" will be substituted. + +; /USERAGENT +: UserAgent http request header value. Default is "NSIS_Inetc (Mozilla)". + +; /HEADER +: Adds or replaces http request header. Common HEADER_TEXT format is "header: value". + +; /NOCOOKIES +: Removes cookies from http request + +; /TOSTACK +: Outputs the post/get/head response to the NSIS stack rather than to the file (specify an empty string for local_file1, local_file2 etc.) + +; /TOSTACKCONV +: Outputs the post/get/head response to the NSIS stack while converting character encodings: +: ASCII -> Unicode for the Unicode plug-in build +: Unicode -> ASCII for the ASCII plug-in build + +; /END +: Allows to limit plug-in stack reading (optional, required if you stores other vars in the stack). + +; /TRANSLATE +: Allows translating plug-in text in the POPUP or "old style" (NSISdl) modes (see Readme for parameters). In the BANNER mode text is also customizable. + +=== post === + +inetc::post TEXT2POST [/PROXY IP:PORT] [/USERNAME PROXY_LOGIN /PASSWORD PROXY_PASSWD] + [/NOPROXY] [/NOCANCEL] [/CONNECTTIMEOUT TO_SEC] [/RECEIVETIMEOUT TO_SEC] [/SILENT] [/WEAKSECURITY] + [/FILE] [/CAPTION TEXT] [/NOCOOKIES] [/POPUP HOST_ALIAS | /BANNER TEXT] + [/CANCELTEXT CANCEL_TEXT] [/USERAGENT USER_AGENT_TEXT] [/TRANSLATE LANG_PARAMS] + [/TOSTACK | /TOSTACKCONV] + URL1 local_file1 [URL2 local_file2 [...]] [/END] +Sets POST http mode and defines text string or file name to be used in the POST (http only). Disables auto re-get. No char replaces used (%20 and others). /FILE option allows to send TEXT2POST file content to server, additional 'Filename:' header added to request this case. + +=== head === + +The same as get, but requests http headers only. Writes raw headers to file. + +=== put === + +inetc::put [/PROXY IP:PORT] [/USERNAME PROXY_LOGIN /PASSWORD PROXY_PASSWD] [/NOPROXY] + [/NOCANCEL] [/CONNECTTIMEOUT TO_SEC] [/RECEIVETIMEOUT TO_SEC] [/SILENT] [/WEAKSECURITY] [/CAPTION TEXT] + [/POPUP HOST_ALIAS | /BANNER TEXT] [/CANCELTEXT CANCEL_TEXT] [/USERAGENT USER_AGENT_TEXT] + [/TRANSLATE LANG_PARAMS] [/NOCOOKIES] + URL1 local_file1 [URL2 local_file2 [...]] [/END] +Return value and parameters (if applicable) are the same as for previous entry point. + +== Examples == + + +inetc::put "http://dl.zvuki.ru/6306/mp3/12.mp3" "$EXEDIR\12.mp3" \ + "ftp://dl.zvuki.ru/6306/mp3/11.mp3" "$EXEDIR\11.mp3" +Pop $0 + + + +inetc::put /BANNER "Cameron Diaz upload in progress..." \ +"http://www.dreamgirlswallpaper.co.uk/fiveyearsonline/wallpaper/Cameron_Diaz/camerond09big.JPG" \ +"$EXEDIR\cd.jpg" + Pop $0 + StrCmp $0 "OK" dlok + MessageBox MB_OK|MB_ICONEXCLAMATION "http upload Error, click OK to abort installation" /SD IDOK + Abort +dlok: + ... + + + +; Following attribute also can restore installer Window +; BGGradient 000000 000080 FFFFFF + +== Credits == + +

Many thanks to Backland who offered a simple way to fix NSISdl mode crashes, added 'center parent' function, offers few nice design ideas and spent a lot of time testing the plug-in.

+
+

v1.0.4.4 by Stuart 'Afrow UK' Welch

+

v1.0.5.0..v1.0.5.2 by anders_k

+
+

See Contrib\inetc\inetc.cpp for changes.

+ + +[[Category:Plugins]] diff --git a/data/nsis/Docs/md5dll/readme.txt b/data/nsis/Docs/md5dll/readme.txt new file mode 100644 index 000000000..a8d3572c7 --- /dev/null +++ b/data/nsis/Docs/md5dll/readme.txt @@ -0,0 +1,68 @@ +Calculates the md5sum of a file or string. +Has been tested to work with NSIS 2.0+ + + +Derived from the RSA Data Security, Inc. MD5 Message-Digest Algorithm + +[Md5Dll] +Matthew "IGx89" Lieder + -Original plugin Author + +Sunjammer (12th May 2002) + -Original usage notes and example script + +[Md5Dll.0.1] +KJD (2004) + -Modified to reduce size and use exdll.h + (reduced to about 6KB uncompressed, by removing CRTL dependency) + +[Md5dll.0.2] +Davy Durham (2004) + -MD5.cpp fix (correct for loop used to replace memset, exceeded bounds) + +[Md5dll.0.3] +Shengalts Aleksander aka Instructor (2005) + -New command: "GetMD5Random" + -Changed names: "GetFileMD5" -> "GetMD5File", "GetMD5" -> "GetMD5String" + -Fixed: string length error + +[Md5dll.0.4] +KJD (2005) + -Added dual name to exports for backwards compatibility + + +-------------------------------- + +Usage: + +Push $1 ;string +CallInstDll "md5dll" GetMD5String +Pop $1 ;md5 of string + +-or- + +Push $1 ;filename +CallInstDll "md5dll" GetMD5File +Pop $1 ;md5 of file + +-------------------------------- + +Example usage in recent NSIS versions + +OutFile "md5test.exe" +Section "" + #generate MD5sum of a string + md5dll::GetMD5String "md5me" + Pop $0 + DetailPrint "md5: [$0]" + + # generate MD5sum of a file + md5dll::GetMD5File "${NSISDIR}\makensis.exe" + Pop $0 + DetailPrint "md5: [$0]" + + #generate random MD5sum + md5dll::GetMD5Random + Pop $0 + DetailPrint "md5: [$0]" +SectionEnd diff --git a/data/nsis/Docs/nsisunz/nsisunz_readme.html b/data/nsis/Docs/nsisunz/nsisunz_readme.html new file mode 100644 index 000000000..87017bbb0 --- /dev/null +++ b/data/nsis/Docs/nsisunz/nsisunz_readme.html @@ -0,0 +1,361 @@ + + + +nsisunz + + + + +
+ + + + +
+

nsisunz

+
+

Introduction

+

nsisunz is a NSIS plugin which allows you to extract files from ZIP +archives.

+

nsisunz is great when you use another NSIS plug-in named +NSISdl to download a ZIP file from the internet. +Download a small installer which lets the user choose the components he/she +want to install and the installer downloads it (QuickTime Setup does +this).

+

Note: +nsisunz does not support password protected ZIP archives +(encrypted).
+To extract only a specific file from the archive use the +"/file" option. +

+

How to use

+

Setting it up

+

To see a great example of how to use the plug-in, +check out the included example script.

+

You use the Unzip, UnzipToLog or the +UnzipToStack function to extract files +from a ZIP archive.

+

In my opinion the best way to describe things is by showing an example, +so here is one:

+
+InitPluginsDir
+; Call plug-in. Push filename to ZIP first, and the dest. folder last.
+nsisunz::UnzipToLog "$PLUGINSDIR\myzipfile.zip" "$INSTDIR"
+
+; Always check result on stack
+Pop $0
+StrCmp $0 "success" ok
+  DetailPrint "$0" ;print error message to log
+ok:
+
+; You can also use the "Unzip" function if you don't want to use the log.
+; It is a lot quicker, and is preferred for large ZIP archives.
+nsisunz::Unzip "$PLUGINSDIR\myzipfile.zip" "$INSTDIR"
+
+

The UnzipToStack function

+

The UnzipToStack function can be used instead of the UnzipToLog function +if you want the extraction to be a lot faster when extracting from very large ZIP archives and still +want to see the files extracted. This is how you use it: +

+
+nsisunz::UnzipToStack "$PLUGINSDIR\myzipfile.zip" "$INSTDIR"
+Pop $0
+StrCmp $0 "success" ok
+  DetailPrint "$0" ;print error message to log
+  Goto skiplist
+ok:
+
+; Print out list of files extracted to log
+next:
+  Pop $0
+  DetailPrint $0
+StrCmp $0 "" 0 next ; pop strings until a blank one arrives
+
+skiplist:
+
+

Extracting specific files

+

+To extract only a specific file use the "/file" option like this: +

+
+nsisunz::UnzipToLog /file "AnyPathInsideZIP/AFile.txt" "myzip.zip" "c:\myfiles"
+
+

+The path is relative to the root of the ZIP archive so you don't have to +prepend a slash ("/"). Furthermore the foldernames are extracted with the file so +the example above creates a file named "c:\myfiles\AnyPathInsideZIP\AFile.txt". +To avoid this use "/noextractpath" like this: +

+
+nsisunz::UnzipToLog /noextractpath /file \
+  "AnyPathInsideZIP/AFile.txt" "myzip.zip" "c:\myfiles"
+
+

Using nsisunz with NSISdl

+

To use NSISdl with nsisunz to download and extract a ZIP archive, +do something like this:

+
+InitPluginsDir
+NSISdl::download http://www.domain.com/file "$PLUGINSDIR\localfile.zip"
+Pop $R0 ;Get the return value
+StrCmp $R0 "success" +3
+  MessageBox MB_OK "Download failed: $R0"
+  Quit
+
+nsisunz::UnzipToLog "$PLUGINSDIR\localfile.zip" "$INSTDIR"
+Pop $R0
+StrCmp $R0 "success" +2
+  DetailPrint "$R0" ;print error message to log
+
+
+

Options

+

These are the optional parameters you can specify when calling nsisunz.

+ + + + + + + + + + + + + +
/noextractpathThis option makes the plug-in extract all files to + the destination directory without regard to paths stored in ZIP file. + Is often used in conjunction with "/file" to extract a single file + from anywhere in an archive to a destination directory.
/fileExtract a specific file. Filename must be specified + as next parameter and must match a file in the ZIP including any + subdirectories. If the file couldn't be found in the ZIP file, + nsisunz pushes the string "File not found in ZIP file" on the + stack.
/textSets the format of the text used in the log to the + next param. "%f" is replaced with the filename, "%c" is + replaced with the compressed size and "%u" is replaced with the + uncompressed size. +
+

Return value

+

After you have called the DLL, nsisunz adds either "success" or a specific error message +on the stack. This is the possible error messages:

+
    +
  • Error opening ZIP file
  • +
  • Error opening output file(s)
  • +
  • Error writing output file(s)
  • +
  • Error extracting from ZIP file
  • +
  • File not found in ZIP file
  • +
+

Usually, you don't need to check this value, but you still have to remove it from the stack +(have a look at the example above).

+

Reserve files

+

If you are using BZIP2 (solid) compression, it's important that files which are being extracted +in init- or page functions function are located before other files in the data block, because this +will make your installer faster.

+

If there are File commands in your sections or functions above the init- or page functions, add +ReserveFile commands above your sections and functions:

+
+ReserveFile "myzipfile.zip"
+ReserveFile "${NSISDIR}\Plugins\nsisunz.dll"
+
+

Localization

+

Use the "/text" parameter to localize the text used by nsisunz +for the log output. +

+
+; Localized strings for use with nsisunz
+; The "%f" in the string is replaced with the filename on run-time.
+; "%c" and "%u" is replaced with compressed size and
+; uncompressed size respectively. See example script.
+
+LoadLanguageFile "${NSISDIR}\Contrib\Language files\english.nlf"
+LoadLanguageFile "${NSISDIR}\Contrib\Language files\norwegian.nlf"
+
+LangString nsisunz_text ${LANG_ENGLISH} "Extract: %f"
+LangString nsisunz_text ${LANG_NORWEGIAN} "Pakk ut: %f"
+
+Function .onInit
+  nsisunz:: /text "" "$(nsisunz_text)"
+FunctionEnd
+
+

Notes

+

+The plug-in is compressed with UPX to make it smaller.
+If you make changes to the source, re-compile and use UPX you may get this +message:
+upx: nsisunz.dll: CantPackException: file is possibly packed/protected +(try --force)
+I used the "--force" parameter as proposed, +and without problems UPX reduced the size of nsisunz.dll from ~71 kb +to 31,5 kb
+The reason for why you get this message is that the source #include's +"AggressiveOptimize.h" which makes the linker merge the code sections of the +final executable. This makes UPX think it's already packed (which it kinda is). +But by using the "--force" parameter, UPX may shrink it a lot +more.
+I hope people appreciate my struggles to keep the size of the plug-in small. +If someone have any suggestions for making it even smaller I would like if +someone sendt me an e-mail. +

+

Contact

+

nsisunz is written by Saivert.
+Homepage: +http://saivert.inthegray.com/
+E-mail: saivert@gmail.com + +

+

Version history

+
    +
  • DLL version 1.0 (12/4/2004) +
      +
    • First public release!
    • +
    +
  • +
+

Credits

+

+Based on code in NSIS Zip2Exe
+portions Copyright © 1999-2001 Miguel Garrido (mgarrido01@hotmail.com)
+Uses ZLIB - Copyright © Mark Adler
+ZIP format routines - Copyright © 1998 Gilles Vollant
+Thanks to Tim Kosse for the LogMessage function, even though I +could figure this out myself.
+And thanks to Joost Verburg for the readme HTML page design.

+

License

+
+This software is provided 'as-is', without any express or implied
+warranty. In no event will the authors be held liable for any damages
+arising from the use of this software.
+
+Permission is granted to anyone to use this software for any purpose,
+including commercial applications, and to alter it and redistribute
+it freely, subject to the following restrictions:
+
+1. The origin of this software must not be misrepresented;
+   you must not claim that you wrote the original software.
+   If you use this software in a product, an acknowledgment in the
+   product documentation would be appreciated but is not required.
+2. Altered versions must be plainly marked as such,
+   and must not be misrepresented as being the original software.
+3. This notice may not be removed or altered from any distribution.
+
+
+
+ + diff --git a/data/nsis/Examples/Inetc/Example.nsi b/data/nsis/Examples/Inetc/Example.nsi new file mode 100644 index 000000000..4f63c175d --- /dev/null +++ b/data/nsis/Examples/Inetc/Example.nsi @@ -0,0 +1,54 @@ + +;-------------------------------- +; General Attributes + +Name "Inetc plug-in Test" +OutFile "inetc.exe" +;SilentInstall silent +RequestExecutionLevel user + + +;-------------------------------- +;Interface Settings + + !include "MUI2.nsh" + !define MUI_ICON "${NSISDIR}\Contrib\Graphics\Icons\modern-install-colorful.ico" + !insertmacro MUI_PAGE_WELCOME + !insertmacro MUI_PAGE_INSTFILES + !insertmacro MUI_LANGUAGE "English" + +;SetFont 14 + +;-------------------------------- +;Installer Sections + +Section "Dummy Section" SecDummy + + SetDetailsView hide + +; two files download, popup mode + inetc::get /caption "2003-2004 reports" /popup "" "http://ineum.narod.ru/spr_2003.htm" "$EXEDIR\spr3.htm" "http://ineum.narod.ru/spr_2004.htm" "$EXEDIR\spr4.htm" /end + Pop $0 # return value = exit code, "OK" means OK + +; single file, NSISdl-style embedded progress bar with specific cancel button text + inetc::get /caption "2005 report" /canceltext "interrupt!" "http://ineum.narod.ru/spr_2005.htm" "$EXEDIR\spr5.htm" /end + Pop $1 # return value = exit code, "OK" means OK + +; banner with 2 text lines and disabled Cancel button + inetc::get /caption "2006 report" /banner "Banner mode with /nocancel option setten$\nSecond Line" /nocancel "http://ineum.narod.ru/spr_2006.htm" "$EXEDIR\spr6.htm" /end + Pop $2 # return value = exit code, "OK" means OK + + MessageBox MB_OK "Download Status: $0, $1, $2" +SectionEnd + + +;-------------------------------- +;Installer Functions + +Function .onInit + +; plug-in auto-recognizes 'no parent dlg' in onInit and works accordingly +; inetc::head /RESUME "Network error. Retry?" "http://ineum.narod.ru/spr_2003.htm" "$EXEDIR\spr3.txt" +; Pop $4 + +FunctionEnd \ No newline at end of file diff --git a/data/nsis/Examples/Inetc/auth_dlg.nsi b/data/nsis/Examples/Inetc/auth_dlg.nsi new file mode 100644 index 000000000..6fc8ee17d --- /dev/null +++ b/data/nsis/Examples/Inetc/auth_dlg.nsi @@ -0,0 +1,32 @@ + +;-------------------------------- +; General Attributes + +Name "Inetc http auth Test" +OutFile "auth_dlg.exe" +RequestExecutionLevel user + + +;-------------------------------- +;Interface Settings + + !include "MUI2.nsh" + !define MUI_ICON "${NSISDIR}\Contrib\Graphics\Icons\modern-install-colorful.ico" + !insertmacro MUI_PAGE_INSTFILES + !insertmacro MUI_LANGUAGE "English" + + +;-------------------------------- +;Installer Sections + +Section "Dummy Section" SecDummy + +; Displays IE auth dialog. +; Both server and proxy auth. +; Please test this with your own link. + + inetc::get "http://www.cnt.ru/personal" "$EXEDIR\auth.html" + Pop $0 # return value = exit code, "OK" if OK + MessageBox MB_OK "Download Status: $0" + +SectionEnd diff --git a/data/nsis/Examples/Inetc/ftp_auth.nsi b/data/nsis/Examples/Inetc/ftp_auth.nsi new file mode 100644 index 000000000..83c1d967b --- /dev/null +++ b/data/nsis/Examples/Inetc/ftp_auth.nsi @@ -0,0 +1,32 @@ + +;-------------------------------- +; General Attributes + +Name "Inetc ftp authentication Test" +OutFile "ftp_auth.exe" +RequestExecutionLevel user + + +;-------------------------------- +;Interface Settings + + !include "MUI2.nsh" + !define MUI_ICON "${NSISDIR}\Contrib\Graphics\Icons\modern-install-colorful.ico" + !insertmacro MUI_PAGE_INSTFILES + !insertmacro MUI_LANGUAGE "English" + + +;-------------------------------- +;Installer Sections + +Section "Dummy Section" SecDummy + +; use your own URL and login@pwd. Password hidden from user with /popup "ALIAS" + + inetc::get /caption "service pack download" /popup "ftp://localhost/" "ftp://login:pwd@localhost/W2Ksp3.exe" "$EXEDIR\sp3.exe" +; inetc::put /caption "service pack upload" /popup "" "ftp://login:pwd@localhost/W2Ksp3.bu.exe" "$EXEDIR\sp3.exe" + Pop $0 # return value = exit code, "OK" if OK + MessageBox MB_OK "Download Status: $0" + +SectionEnd + diff --git a/data/nsis/Examples/Inetc/head.nsi b/data/nsis/Examples/Inetc/head.nsi new file mode 100644 index 000000000..fef90ec5e --- /dev/null +++ b/data/nsis/Examples/Inetc/head.nsi @@ -0,0 +1,30 @@ + +;-------------------------------- +; General Attributes + +Name "Inetc Head Test" +OutFile "head.exe" +RequestExecutionLevel user + + +;-------------------------------- +;Interface Settings + + !include "MUI2.nsh" + !insertmacro MUI_PAGE_INSTFILES + !insertmacro MUI_LANGUAGE "English" + + +;-------------------------------- +;Installer Sections + +Section "Dummy Section" SecDummy + + DetailPrint "New version check out (internet connection)" + inetc::head /silent "http://ineum.narod.ru/spr_2006.htm" "$EXEDIR\head.txt" + Pop $0 # return value = exit code, "OK" if OK + MessageBox MB_OK "Download Status: $0" + +SectionEnd + + diff --git a/data/nsis/Examples/Inetc/headers.nsi b/data/nsis/Examples/Inetc/headers.nsi new file mode 100644 index 000000000..b4a2b4841 --- /dev/null +++ b/data/nsis/Examples/Inetc/headers.nsi @@ -0,0 +1,32 @@ + +;-------------------------------- +; General Attributes + +Name "Headers Test" +OutFile "headers.exe" +RequestExecutionLevel user + + +;-------------------------------- +;Interface Settings + + !include "MUI2.nsh" + !insertmacro MUI_PAGE_INSTFILES + !insertmacro MUI_LANGUAGE "English" + + + +;-------------------------------- +;Installer Sections + +Section "Dummy Section" SecDummy + +; additional headers. Sample php returns raw headers + inetc::get /useragent "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1)" /header "SOAPAction: urn:anonOutInOpe" "http://localhost/headers.php" "$EXEDIR\headers.html" + Pop $0 + + MessageBox MB_OK "Download Status: $0" + +SectionEnd + + diff --git a/data/nsis/Examples/Inetc/headers.php b/data/nsis/Examples/Inetc/headers.php new file mode 100644 index 000000000..3e395321b --- /dev/null +++ b/data/nsis/Examples/Inetc/headers.php @@ -0,0 +1,7 @@ + $value) { + echo "$header: $value
\n"; +} +?> \ No newline at end of file diff --git a/data/nsis/Examples/Inetc/https.nsi b/data/nsis/Examples/Inetc/https.nsi new file mode 100644 index 000000000..9bc9975db --- /dev/null +++ b/data/nsis/Examples/Inetc/https.nsi @@ -0,0 +1,27 @@ + +;-------------------------------- +; General Attributes + +Name "Inetc https Test" +OutFile "https.exe" +RequestExecutionLevel user + + +;-------------------------------- +;Interface Settings + + !include "MUI2.nsh" + !insertmacro MUI_PAGE_INSTFILES + !insertmacro MUI_LANGUAGE "English" + + +;-------------------------------- +;Installer Sections + +Section "Dummy Section" SecDummy + + inetc::get /POPUP "" /CAPTION "bending_property_demo.zip" "https://secure.codeproject.com/cs/miscctrl/bending_property/bending_property_src.zip" "$EXEDIR\bending_property_src.zip" + Pop $0 # return value = exit code, "OK" if OK + MessageBox MB_OK "Download Status: $0" + +SectionEnd diff --git a/data/nsis/Examples/Inetc/inetc_local.nsi b/data/nsis/Examples/Inetc/inetc_local.nsi new file mode 100644 index 000000000..53160aa70 --- /dev/null +++ b/data/nsis/Examples/Inetc/inetc_local.nsi @@ -0,0 +1,81 @@ + +;-------------------------------- +; General Attributes + +Name "Inetc Local Test" +OutFile "inetc_local.exe" +RequestExecutionLevel user + + +;-------------------------------- +;Interface Settings + + !include "MUI2.nsh" + !define MUI_ICON "${NSISDIR}\Contrib\Graphics\Icons\modern-install-colorful.ico" + !insertmacro MUI_PAGE_INSTFILES + !insertmacro MUI_LANGUAGE "English" + + +;-------------------------------- +;Installer Sections + +Section "Dummy Section" SecDummy + + +; PUT test + +; FTP requires anonymous access in sample below. +; HTTP sample put.php included to package. Stores test.jpg as m2.bmp +; check server files present after upload + + inetc::put "http://localhost/put.php" "$EXEDIR\test.jpg" + Pop $0 + + inetc::put "ftp://localhost/test.jpg" "$EXEDIR\test.jpg" +; not anonymous format +; inetc::put "ftp://login:password@localhost/test.jpg" "$EXEDIR\test.jpg" + Pop $1 + + DetailPrint "PUT: HTTP $0, FTP $1 (verify server files)" + + +; POST test + +; HTTP sample post.php and post_form.htm (to compare results) included + + inetc::post "login=ami&passwd=333" "http://localhost/post.php?lg=iam&pw=44" "$EXEDIR\post_reply.htm" + Pop $2 + + DetailPrint "POST: $2 (post_reply.htm)" + + +; HEAD test + +; uses uploaded earlier test.jpg + + inetc::head /silent "http://localhost/m2.bmp" "$EXEDIR\head.txt" + Pop $3 + + DetailPrint "HEAD: $3 (head.txt)" + + +; GET test + +; 2 files download in nsisdl mode + inetc::get "http://localhost/m2.bmp" "$EXEDIR\get1.jpg" "http://localhost/m2.bmp" "$EXEDIR\get2.jpg" + Pop $4 + + inetc::get /popup "Localhost:GET with Popup" "http://localhost/m2.bmp" "$EXEDIR\get3.jpg" + Pop $5 + + inetc::get /banner "Local Test GET with Banner" "http://localhost/m2.bmp" "$EXEDIR\get4.jpg" + Pop $6 + + inetc::get /silent "ftp://localhost/test.jpg" "$EXEDIR\get5.jpg" + Pop $7 + + DetailPrint "GET: NSISDL $4, POPUP $5, BANNER $6, FTP $7 (get1-5.jpg)" + + SetDetailsView show + +SectionEnd diff --git a/data/nsis/Examples/Inetc/post.nsi b/data/nsis/Examples/Inetc/post.nsi new file mode 100644 index 000000000..3c64117f8 --- /dev/null +++ b/data/nsis/Examples/Inetc/post.nsi @@ -0,0 +1,31 @@ + +;-------------------------------- +; General Attributes + +Name "Inetc Post Test" +OutFile "post.exe" +RequestExecutionLevel user + + +;-------------------------------- +;Interface Settings + + !include "MUI2.nsh" + !insertmacro MUI_PAGE_INSTFILES + !insertmacro MUI_LANGUAGE "English" + + +;-------------------------------- +;Installer Sections + +Section "Dummy Section" SecDummy + +; this is my LAN sample, use your own URL for tests. Sample post.php included + + inetc::post "login=ami&passwd=333" "http://localhost/post.php?lg=iam&pw=44" "$EXEDIR\post_reply.htm" + Pop $0 # return value = exit code, "OK" if OK + MessageBox MB_OK "Download Status: $0" + +SectionEnd + + diff --git a/data/nsis/Examples/Inetc/post.php b/data/nsis/Examples/Inetc/post.php new file mode 100644 index 000000000..d2a40bcb8 --- /dev/null +++ b/data/nsis/Examples/Inetc/post.php @@ -0,0 +1,13 @@ + + + + +"; +echo "post.passwd=".$_POST['passwd']."
"; +echo "get.lg=".$_GET['lg']."
"; +echo "get.pw=".$_GET['pw']."
"; +?> + + + diff --git a/data/nsis/Examples/Inetc/post_file.nsi b/data/nsis/Examples/Inetc/post_file.nsi new file mode 100644 index 000000000..c93f2961a --- /dev/null +++ b/data/nsis/Examples/Inetc/post_file.nsi @@ -0,0 +1,31 @@ + +;-------------------------------- +; General Attributes + +Name "Inetc Post Test" +OutFile "post_file.exe" +RequestExecutionLevel user + + +;-------------------------------- +;Interface Settings + + !include "MUI2.nsh" + !insertmacro MUI_PAGE_INSTFILES + !insertmacro MUI_LANGUAGE "English" + + +;-------------------------------- +;Installer Sections + +Section "Dummy Section" SecDummy + +; this is my LAN sample, use your own URL for tests. Sample post.php included + + inetc::post "$EXEDIR\inetc.cpp" /file "http://localhost/post_file.php" "$EXEDIR\post_file.htm" + Pop $0 # return value = exit code, "OK" if OK + MessageBox MB_OK "Download Status: $0" + +SectionEnd + + diff --git a/data/nsis/Examples/Inetc/post_file.php b/data/nsis/Examples/Inetc/post_file.php new file mode 100644 index 000000000..1d7b38735 --- /dev/null +++ b/data/nsis/Examples/Inetc/post_file.php @@ -0,0 +1,10 @@ + $value) { + echo "$header: $value
\n"; +} +echo "new
"; +foreach ($_FILES as $key => $value) echo $key . "<>" . $value . "
\n"; +echo file_get_contents('php://input'); +?> \ No newline at end of file diff --git a/data/nsis/Examples/Inetc/post_form.html b/data/nsis/Examples/Inetc/post_form.html new file mode 100644 index 000000000..0bde9208d --- /dev/null +++ b/data/nsis/Examples/Inetc/post_form.html @@ -0,0 +1,18 @@ + + +Registration form for post.php test + + +This form sends POST request to server. It was interesting to compare server echo
+reply (by included post.php) for this form and InetLoad plug-in - in my
+tests server did not see any difference between them :)
+
+ +
+
+ + +
+ + + diff --git a/data/nsis/Examples/Inetc/put.nsi b/data/nsis/Examples/Inetc/put.nsi new file mode 100644 index 000000000..ce74a0403 --- /dev/null +++ b/data/nsis/Examples/Inetc/put.nsi @@ -0,0 +1,31 @@ + +;-------------------------------- +; General Attributes + +Name "Inetc Test" +OutFile "put.exe" +RequestExecutionLevel user + + +;-------------------------------- +;Interface Settings + + !include "MUI2.nsh" + !define MUI_ICON "${NSISDIR}\Contrib\Graphics\Icons\modern-install-colorful.ico" + !insertmacro MUI_PAGE_INSTFILES + !insertmacro MUI_LANGUAGE "English" + + +;-------------------------------- +;Installer Sections + +Section "Dummy Section" SecDummy + +; this is my LAN sample, use your own URL for tests. Login/pwd hidden from user. Sample put.php (for http request) included + + inetc::put "http://localhost/put.php" "$EXEDIR\test.jpg" +; inetc::put /POPUP "ftp://localhost/" /CAPTION "my local ftp upload" "ftp://localhost/test.jpg" "$EXEDIR\test.jpg" + Pop $0 + MessageBox MB_OK "Upload Status: $0" + +SectionEnd diff --git a/data/nsis/Examples/Inetc/put.php b/data/nsis/Examples/Inetc/put.php new file mode 100644 index 000000000..dc71943be --- /dev/null +++ b/data/nsis/Examples/Inetc/put.php @@ -0,0 +1,19 @@ + diff --git a/data/nsis/Examples/Inetc/recursive.nsi b/data/nsis/Examples/Inetc/recursive.nsi new file mode 100644 index 000000000..a21aa12aa --- /dev/null +++ b/data/nsis/Examples/Inetc/recursive.nsi @@ -0,0 +1,65 @@ +Name "Inetc Recursive Dir Upload Test" +OutFile "recursive.exe" +RequestExecutionLevel user + +!include "MUI2.nsh" +!insertmacro MUI_PAGE_INSTFILES +!insertmacro MUI_LANGUAGE "English" +!include "FileFunc.nsh" +!insertmacro GetFileAttributes + +var url +var path + +Function dirul + + Push $0 ; search handle + Push $1 ; file name + Push $2 ; attributes + + FindFirst $0 $1 "$path\*" +loop: + StrCmp $1 "" done + ${GetFileAttributes} "$path\$1" DIRECTORY $2 + IntCmp $2 1 isdir +retry: + Inetc::put $url/$1 "$path\$1" /end + Pop $2 + DetailPrint "$2 $path\$1" + StrCmp $2 "OK" cont + MessageBox MB_YESNO "$path\$1 file upload failed. Retry?" IDYES retry + Abort "terminated by user" + Goto cont +isdir: + StrCmp $1 . cont + StrCmp $1 .. cont + Push $path + Push $url + StrCpy $path "$path\$1" + StrCpy $url "$url/$1" + Call dirul + Pop $url + Pop $path +cont: + FindNext $0 $1 + Goto loop +done: + FindClose $0 + + Pop $2 + Pop $1 + Pop $0 + +FunctionEnd + + +Section "Dummy Section" SecDummy + + SetDetailsView hide + StrCpy $path "$EXEDIR" +; put is dir in the user's ftp home, use //put for root-relative path + StrCpy $url ftp://takhir:pwd@localhost/put + Call dirul + SetDetailsView show + +SectionEnd diff --git a/data/nsis/Examples/Inetc/redirect.nsi b/data/nsis/Examples/Inetc/redirect.nsi new file mode 100644 index 000000000..3761692ca --- /dev/null +++ b/data/nsis/Examples/Inetc/redirect.nsi @@ -0,0 +1,31 @@ + +;-------------------------------- +; General Attributes + +Name "Redirect Test" +OutFile "redirect.exe" +RequestExecutionLevel user + + +;-------------------------------- +;Interface Settings + + !include "MUI2.nsh" + !insertmacro MUI_PAGE_INSTFILES + !insertmacro MUI_LANGUAGE "English" + + +;-------------------------------- +;Installer Sections + +Section "Dummy Section" SecDummy + + SetDetailsView hide + + inetc::get "http://localhost/redirect.php" "$EXEDIR\redirect.htm" /end + Pop $1 + + MessageBox MB_OK "Download Status: $1" + +SectionEnd + diff --git a/data/nsis/Examples/Inetc/redirect.php b/data/nsis/Examples/Inetc/redirect.php new file mode 100644 index 000000000..900833fe1 --- /dev/null +++ b/data/nsis/Examples/Inetc/redirect.php @@ -0,0 +1,6 @@ + diff --git a/data/nsis/Examples/Inetc/timeout.nsi b/data/nsis/Examples/Inetc/timeout.nsi new file mode 100644 index 000000000..a8a306963 --- /dev/null +++ b/data/nsis/Examples/Inetc/timeout.nsi @@ -0,0 +1,32 @@ + +;-------------------------------- +; General Attributes + +Name "Timeout Test" +OutFile "to.exe" +RequestExecutionLevel user + + +;-------------------------------- +;Interface Settings + + !include "MUI2.nsh" + !insertmacro MUI_PAGE_INSTFILES + !insertmacro MUI_LANGUAGE "English" + + + +;-------------------------------- +;Installer Sections + +Section "Dummy Section" SecDummy + +; additional headers. Sample php returns raw headers + inetc::get /receivetimeout 12 "http://localhost/to.php" "$EXEDIR\to.html" + Pop $0 + + MessageBox MB_OK "Download Status: $0" + +SectionEnd + + diff --git a/data/nsis/Examples/Inetc/tostack.nsi b/data/nsis/Examples/Inetc/tostack.nsi new file mode 100644 index 000000000..cfd729b7b --- /dev/null +++ b/data/nsis/Examples/Inetc/tostack.nsi @@ -0,0 +1,32 @@ + +;-------------------------------- +; General Attributes + +Name "Inetc To Stack Test" +OutFile "ToStack.exe" +RequestExecutionLevel user + + +;-------------------------------- +;Interface Settings + + !include "MUI2.nsh" + !define MUI_ICON "${NSISDIR}\Contrib\Graphics\Icons\modern-install-colorful.ico" + !insertmacro MUI_PAGE_INSTFILES + !insertmacro MUI_LANGUAGE "English" + + +;-------------------------------- +;Installer Sections + +Section "Dummy Section" SecDummy + + inetc::get /TOSTACK "http://www.google.com" "" /END + Pop $0 # return value = exit code, "OK" if OK + MessageBox MB_OK "Download Status: $0" + Pop $0 # return text + StrLen $1 $0 + MessageBox MB_OK "Download Length: $1" + MessageBox MB_OK "$0" + +SectionEnd diff --git a/data/nsis/Examples/Inetc/translate.nsi b/data/nsis/Examples/Inetc/translate.nsi new file mode 100644 index 000000000..079cfea08 --- /dev/null +++ b/data/nsis/Examples/Inetc/translate.nsi @@ -0,0 +1,33 @@ + +;-------------------------------- +; General Attributes + +Name "Inetc Translate Test" +OutFile "Translate.exe" +RequestExecutionLevel user + + +;-------------------------------- +;Interface Settings + + !include "MUI2.nsh" + !define MUI_ICON "${NSISDIR}\Contrib\Graphics\Icons\modern-install-colorful.ico" + !insertmacro MUI_PAGE_WELCOME + !insertmacro MUI_PAGE_INSTFILES + !insertmacro MUI_PAGE_FINISH + !insertmacro MUI_LANGUAGE "Russian" + + +;-------------------------------- +;Installer Sections + +Section "Dummy Section" SecDummy + +; This is russian variant. See Readme.txt for a list of parameters. +; Use LangStrings as TRANSLATE parameters for multilang options + + inetc::load /POPUP "" /CAPTION "Ôàéë ãàëåðåè" /TRANSLATE "URL" "Çàãðóçêà" "Ïîïûòêà ñîåäèíåíèÿ" "Èìÿ ôàéëà" Ïîëó÷åíî "Ðàçìåð" "Îñòàëîñü" "Ïðîøëî" "http://ineum.narod.ru/g06s.htm" "$EXEDIR\g06s.htm" + Pop $0 # return value = exit code, "OK" if OK + MessageBox MB_OK "Download Status: $0" + +SectionEnd diff --git a/data/nsis/Include/NsisMultiUser.nsh b/data/nsis/Include/NsisMultiUser.nsh new file mode 100755 index 000000000..dbea75972 --- /dev/null +++ b/data/nsis/Include/NsisMultiUser.nsh @@ -0,0 +1,513 @@ +/* +SimpleMultiUser.nsh - Installer/Uninstaller that allows installations "per-user" (no admin required) or "per-machine" (asks elevation *only when necessary*) +By Ricardo Drizin (contact at http://drizin.com.br) + +This plugin is based on [MultiUser.nsh (by Joost Verburg)](http://nsis.sourceforge.net/Docs/MultiUser/Readme.html) but with some new features and some simplifications: +- Installer allows installations "per-user" (no admin required) or "per-machine" (as original) +- If running user IS part of Administrators group, he is not forced to elevate (only if necessary - for per-machine install) +- If running user is NOT part of Administrators group, he is still able to elevate and install per-machine (I expect that power-users will have administrator password, but will not be part of the administrators group) +- UAC Elevation happens only when necessary (when per-machine is selected), not in the start of the installer +- Uninstaller block is mandatory (why shouldn't it be?) +- If there are both per-user and per-machine installations, user can choose which one to remove during uninstall +- Correctly creates and removes shortcuts and registry (per-user and per-machine are totally independent) +- Fills uninstall information in registry like Icon and Estimated Size. +- If running as non-elevated user, the "per-machine" install can be allowed (automatically invoking UAC elevation) or can be disabled (suggesting to run again as elevated user) +- If elevation is invoked for per-machine install, the calling process automatically hides itself, and the elevated inner process automatically skips the choice screen (cause in this case we know that per-machine installation was chosen) +- If uninstalling from the "add/remove programs", automatically detects if user is trying to remove per-machine or per-user install + +*/ + +!verbose push +!verbose 3 + +;Standard NSIS header files +!include MUI2.nsh +!include nsDialogs.nsh +!include LogicLib.nsh +!include WinVer.nsh +!include FileFunc.nsh +!include UAC.nsh + +;Variables +Var MultiUser.Privileges ; Current user level: "Admin", "Power" (up to Windows XP), or else regular user. +Var MultiUser.InstallMode ; Current Install Mode ("AllUsers" or "CurrentUser") +Var IsAdmin ; 0 (false) or 1 (true) +Var HasPerUserInstallation ; 0 (false) or 1 (true) +Var HasPerMachineInstallation ; 0 (false) or 1 (true) +Var PerUserInstallationFolder +Var PerMachineInstallationFolder +Var HasTwoAvailableOptions ; 0 (false) or 1 (true) +Var RadioButtonLabel1 +;Var RadioButtonLabel2 +;Var RadioButtonLabel3 + +!ifdef MULTIUSER_INSTALLMODE_INSTALL_REGISTRY_KEY & MULTIUSER_INSTALLMODE_UNINSTALL_REGISTRY_KEY & MULTIUSER_INSTALLMODE_INSTDIR_REGISTRY_VALUENAME & MULTIUSER_INSTALLMODE_INSTDIR & UNINSTALL_FILENAME & VERSION & PROGEXE & PRODUCT_NAME & COMPANY_NAME +!else + !error "Should define all variables: MULTIUSER_INSTALLMODE_INSTALL_REGISTRY_KEY & MULTIUSER_INSTALLMODE_UNINSTALL_REGISTRY_KEY & MULTIUSER_INSTALLMODE_INSTDIR_REGISTRY_VALUENAME & MULTIUSER_INSTALLMODE_INSTDIR & UNINSTALL_FILENAME & VERSION & PROGEXE & PRODUCT_NAME & COMPANY_NAME" +!endif + +!define MULTIUSER_INSTALLMODE_INSTALL_REGISTRY_KEY2 "Software\${MULTIUSER_INSTALLMODE_INSTALL_REGISTRY_KEY}" +!define MULTIUSER_INSTALLMODE_UNINSTALL_REGISTRY_KEY2 "Software\Microsoft\Windows\CurrentVersion\Uninstall\${MULTIUSER_INSTALLMODE_UNINSTALL_REGISTRY_KEY}" + +!ifndef MULTIUSER_INSTALLMODE_DISPLAYNAME + !define MULTIUSER_INSTALLMODE_DISPLAYNAME "${PRODUCT_NAME} ${VERSION}" +!endif + + +RequestExecutionLevel user ; will ask elevation only if necessary + +; Sets install mode to "per-machine" (all users). +!macro MULTIUSER_INSTALLMODE_ALLUSERS UNINSTALLER_PREFIX UNINSTALLER_FUNCPREFIX + ;Install mode initialization - per-machine + StrCpy $MultiUser.InstallMode AllUsers + + SetShellVarContext all + + !if "${UNINSTALLER_PREFIX}" != UN + ;Set default installation location for installer + StrCpy $INSTDIR "$PROGRAMFILES\${MULTIUSER_INSTALLMODE_INSTDIR}" + !endif + + ; Checks registry for previous installation path (both for upgrading, reinstall, or uninstall) + ReadRegStr $PerMachineInstallationFolder HKLM "${MULTIUSER_INSTALLMODE_INSTALL_REGISTRY_KEY2}" "${MULTIUSER_INSTALLMODE_INSTDIR_REGISTRY_VALUENAME}" + ${if} $PerMachineInstallationFolder != "" + StrCpy $INSTDIR $PerMachineInstallationFolder + ${endif} + + !ifdef MULTIUSER_INSTALLMODE_${UNINSTALLER_PREFIX}FUNCTION + Call "${MULTIUSER_INSTALLMODE_${UNINSTALLER_PREFIX}FUNCTION}" + !endif +!macroend + +; Sets install mode to "per-user". +!macro MULTIUSER_INSTALLMODE_CURRENTUSER UNINSTALLER_PREFIX UNINSTALLER_FUNCPREFIX + StrCpy $MultiUser.InstallMode CurrentUser + + SetShellVarContext current + + !if "${UNINSTALLER_PREFIX}" != UN + ;Set default installation location for installer + ${if} ${AtLeastWin2000} + StrCpy $INSTDIR "$LOCALAPPDATA\${MULTIUSER_INSTALLMODE_INSTDIR}" + ${else} + StrCpy $INSTDIR "$PROGRAMFILES\${MULTIUSER_INSTALLMODE_INSTDIR}" + ${endif} + !endif + + ; Checks registry for previous installation path (both for upgrading, reinstall, or uninstall) + ReadRegStr $PerUserInstallationFolder HKCU "${MULTIUSER_INSTALLMODE_INSTALL_REGISTRY_KEY2}" "${MULTIUSER_INSTALLMODE_INSTDIR_REGISTRY_VALUENAME}" + ${if} $PerUserInstallationFolder != "" + StrCpy $INSTDIR $PerUserInstallationFolder + ${endif} + + !ifdef MULTIUSER_INSTALLMODE_${UNINSTALLER_PREFIX}FUNCTION + Call "${MULTIUSER_INSTALLMODE_${UNINSTALLER_PREFIX}FUNCTION}" + !endif +!macroend + +Function MultiUser.InstallMode.AllUsers + !insertmacro MULTIUSER_INSTALLMODE_ALLUSERS "" "" +FunctionEnd + +Function MultiUser.InstallMode.CurrentUser + !insertmacro MULTIUSER_INSTALLMODE_CURRENTUSER "" "" +FunctionEnd + +Function un.MultiUser.InstallMode.AllUsers + !insertmacro MULTIUSER_INSTALLMODE_ALLUSERS UN un. +FunctionEnd + +Function un.MultiUser.InstallMode.CurrentUser + !insertmacro MULTIUSER_INSTALLMODE_CURRENTUSER UN un. +FunctionEnd + +/****** Installer/uninstaller initialization ******/ + +!macro MULTIUSER_INIT_QUIT UNINSTALLER_FUNCPREFIX + !ifdef MULTIUSER_INIT_${UNINSTALLER_FUNCPREFIX}FUNCTIONQUIT + Call "${MULTIUSER_INIT_${UNINSTALLER_FUNCPREFIX}FUCTIONQUIT}" + !else + Quit + !endif +!macroend + +!macro MULTIUSER_INIT_TEXTS + !ifndef MULTIUSER_INIT_TEXT_ADMINREQUIRED + !define MULTIUSER_INIT_TEXT_ADMINREQUIRED "$(^Caption) requires administrator privileges." + !endif + + !ifndef MULTIUSER_INIT_TEXT_POWERREQUIRED + !define MULTIUSER_INIT_TEXT_POWERREQUIRED "$(^Caption) requires at least Power User privileges." + !endif + + !ifndef MULTIUSER_INIT_TEXT_ALLUSERSNOTPOSSIBLE + !define MULTIUSER_INIT_TEXT_ALLUSERSNOTPOSSIBLE "Your user account does not have sufficient privileges to install $(^Name) for all users of this computer." + !endif +!macroend + +!macro MULTIUSER_INIT_CHECKS UNINSTALLER_PREFIX UNINSTALLER_FUNCPREFIX + + ;Installer initialization - check privileges and set default install mode + !insertmacro MULTIUSER_INIT_TEXTS + + UserInfo::GetAccountType + Pop $MultiUser.Privileges + ${if} $MultiUser.Privileges == "Admin" + ${orif} $MultiUser.Privileges == "Power" + StrCpy $IsAdmin 1 + ${else} + StrCpy $IsAdmin 0 + ${endif} + + ; Checks registry for previous installation path (both for upgrading, reinstall, or uninstall) + StrCpy $HasPerMachineInstallation 0 + StrCpy $HasPerUserInstallation 0 + ;Set installation mode to setting from a previous installation + ReadRegStr $PerMachineInstallationFolder HKLM "${MULTIUSER_INSTALLMODE_INSTALL_REGISTRY_KEY2}" "${MULTIUSER_INSTALLMODE_INSTDIR_REGISTRY_VALUENAME}" + ${if} $PerMachineInstallationFolder != "" + StrCpy $HasPerMachineInstallation 1 + ${endif} + ReadRegStr $PerUserInstallationFolder HKCU "${MULTIUSER_INSTALLMODE_INSTALL_REGISTRY_KEY2}" "${MULTIUSER_INSTALLMODE_INSTDIR_REGISTRY_VALUENAME}" + ${if} $PerUserInstallationFolder != "" + StrCpy $HasPerUserInstallation 1 + ${endif} + + ${if} $HasPerUserInstallation == "1" ; if there is only one installation... set it as default... + ${andif} $HasPerMachineInstallation == "0" + Call ${UNINSTALLER_FUNCPREFIX}MultiUser.InstallMode.CurrentUser + ${elseif} $HasPerUserInstallation == "0" ; if there is only one installation... set it as default... + ${andif} $HasPerMachineInstallation == "1" + Call ${UNINSTALLER_FUNCPREFIX}MultiUser.InstallMode.AllUsers + ${else} ; if there is no installation, or there is both per-user and per-machine... + ${if} ${IsNT} + ${if} $IsAdmin == "1" ;If running as admin, default to per-machine installation if possible (unless default is forced by MULTIUSER_INSTALLMODE_DEFAULT_CURRENTUSER) + !if MULTIUSER_INSTALLMODE_DEFAULT_CURRENTUSER + Call ${UNINSTALLER_FUNCPREFIX}MultiUser.InstallMode.CurrentUser + !else + Call ${UNINSTALLER_FUNCPREFIX}MultiUser.InstallMode.AllUsers + !endif + ${else} ;If not running as admin, default to per-user installation (unless default is forced by MULTIUSER_INSTALLMODE_DEFAULT_ALLUSERS and elevation is allowed MULTIUSER_INSTALLMODE_ALLOW_ELEVATION) + !ifdef MULTIUSER_INSTALLMODE_DEFAULT_ALLUSERS & MULTIUSER_INSTALLMODE_ALLOW_ELEVATION + Call ${UNINSTALLER_FUNCPREFIX}MultiUser.InstallMode.AllUsers + !else + Call ${UNINSTALLER_FUNCPREFIX}MultiUser.InstallMode.CurrentUser + !endif + ${endif} + ${else} ; Not running Windows NT, (so it's Windows XP at best), so per-user installation not supported + Call ${UNINSTALLER_FUNCPREFIX}MultiUser.InstallMode.AllUsers + ${endif} + ${endif} + +!macroend + +!macro MULTIUSER_INIT + !verbose push + !verbose 3 + + ; se for inner (sub processo) e ainda assim não for admin... algo errado + ${If} ${UAC_IsInnerInstance} + ${AndIfNot} ${UAC_IsAdmin} + ;MessageBox MB_OK "This account doesn't have admin rights" + SetErrorLevel 0x666666 ;special return value for outer instance so it knows we did not have admin rights + Quit + ${EndIf} + + !insertmacro MULTIUSER_INIT_CHECKS "" "" + !verbose pop +!macroend + +!macro MULTIUSER_UNINIT + !verbose push + !verbose 3 + !insertmacro MULTIUSER_INIT_CHECKS Un un. + !verbose pop +!macroend + +/****** Modern UI 2 page ******/ +!macro MULTIUSER_INSTALLMODEPAGE_INTERFACE + Var MultiUser.InstallModePage + Var MultiUser.InstallModePage.Text + Var MultiUser.InstallModePage.AllUsers + Var MultiUser.InstallModePage.CurrentUser + Var MultiUser.InstallModePage.ReturnValue +!macroend + +!macro MULTIUSER_PAGEDECLARATION_INSTALLMODE + !insertmacro MUI_SET MULTIUSER_${MUI_PAGE_UNINSTALLER_PREFIX}INSTALLMODEPAGE "" + !insertmacro MULTIUSER_INSTALLMODEPAGE_INTERFACE + !insertmacro MULTIUSER_FUNCTION_INSTALLMODEPAGE MultiUser.InstallModePre_${MUI_UNIQUEID} MultiUser.InstallModeLeave_${MUI_UNIQUEID} "" "" + !insertmacro MULTIUSER_FUNCTION_INSTALLMODEPAGE MultiUser.InstallModePre_${MUI_UNIQUEID} MultiUser.InstallModeLeave_${MUI_UNIQUEID} UN un. + + PageEx custom + PageCallbacks MultiUser.InstallModePre_${MUI_UNIQUEID} MultiUser.InstallModeLeave_${MUI_UNIQUEID} + Caption " " + PageExEnd + + UninstPage custom un.MultiUser.InstallModePre_${MUI_UNIQUEID} un.MultiUser.InstallModeLeave_${MUI_UNIQUEID} +!macroend + +!macro MULTIUSER_PAGE_INSTALLMODE + ;Modern UI page for install mode + !verbose push + !verbose 3 + !insertmacro MUI_PAGE_INIT + !insertmacro MULTIUSER_PAGEDECLARATION_INSTALLMODE + !verbose pop +!macroend + +!macro MULTIUSER_FUNCTION_INSTALLMODEPAGE PRE LEAVE UNINSTALLER_PREFIX UNINSTALLER_FUNCPREFIX + Function "${UNINSTALLER_FUNCPREFIX}${PRE}" + + ${If} ${UAC_IsInnerInstance} + ${AndIf} ${UAC_IsAdmin} + ;MessageBox MB_OK + Call ${UNINSTALLER_FUNCPREFIX}MultiUser.InstallMode.AllUsers ; Inner Process (and Admin) - skip selection, inner process is always used for elevation (machine-wide) + Abort ; // next page + ${EndIf} + + ; If uninstalling, will check if there is both a per-user and per-machine installation. If there is only one, will skip the form. + ; If uninstallation was invoked from the "add/remove programs" Windows will automatically requests elevation (depending if uninstall keys are in HKLM or HKCU) + ; so (for uninstallation) just checking UAC_IsAdmin would probably be enought to determine if it's a per-user or per-machine. However, user can run the uninstall.exe from the folder itself, do I'd rather check. + !if "${UNINSTALLER_PREFIX}" == UN + ${if} $HasPerUserInstallation == "1" ; if there is only one installation... skip form.. only one uninstall available + ${andif} $HasPerMachineInstallation == "0" + Call ${UNINSTALLER_FUNCPREFIX}MultiUser.InstallMode.CurrentUser ; Uninstaller has only HasPerUserInstallation + Abort ; // next page + ${elseif} $HasPerUserInstallation == "0" ; if there is only one installation... skip form.. only one uninstall available + ${andif} $HasPerMachineInstallation == "1" + Call ${UNINSTALLER_FUNCPREFIX}MultiUser.InstallMode.AllUsers ; Uninstaller has only HasPerMachineInstallation + Abort ; // next page + ${endif} + !endif + + ${GetParameters} $R0 + ${GetOptions} $R0 "/allusers" $R1 + IfErrors notallusers + ${if} $IsAdmin == "0" + ShowWindow $HWNDPARENT ${SW_HIDE} ; HideWindow would work? + !insertmacro UAC_RunElevated + Quit ;we are the outer process, the inner process has done its work (ExitCode is $2), we are done + ${endif} + Call ${UNINSTALLER_FUNCPREFIX}MultiUser.InstallMode.AllUsers ; Uninstaller has only HasPerMachineInstallation + Abort ; // next page + notallusers: + ${GetOptions} $R0 "/currentuser" $R1 + IfErrors notcurrentuser + Call ${UNINSTALLER_FUNCPREFIX}MultiUser.InstallMode.CurrentUser ; Uninstaller has only HasPerUserInstallation + Abort ; // next page + notcurrentuser: + + + !insertmacro MUI_PAGE_FUNCTION_CUSTOM PRE + ;!insertmacro MUI_HEADER_TEXT_PAGE $(MULTIUSER_TEXT_INSTALLMODE_TITLE) $(MULTIUSER_TEXT_INSTALLMODE_SUBTITLE) ; "Choose Users" and "Choose for which users you want to install $(^NameDA)." + + !if "${UNINSTALLER_PREFIX}" != UN + !insertmacro MUI_HEADER_TEXT "Choose Installation Options" "Who should this application be installed for?" + !else + !insertmacro MUI_HEADER_TEXT "Choose Uninstallation Options" "Which installation should be removed?" + !endif + + nsDialogs::Create 1018 + Pop $MultiUser.InstallModePage + + ; default was MULTIUSER_TEXT_INSTALLMODE_TITLE "Choose Users" + !if "${UNINSTALLER_PREFIX}" != UN + ${NSD_CreateLabel} 0u 0u 300u 20u "Please select whether you wish to make this software available to all users or just yourself" + StrCpy $8 "Anyone who uses this computer (&all users)" ; this was MULTIUSER_INNERTEXT_INSTALLMODE_ALLUSERS "Install for anyone using this computer" + StrCpy $9 "Only for &me" ; this was MULTIUSER_INNERTEXT_INSTALLMODE_CURRENTUSER "Install just for me" + !else + ${NSD_CreateLabel} 0u 0u 300u 20u "This software is installed both per-machine (all users) and per-user. $\r$\nWhich installation you wish to remove?" + StrCpy $8 "Anyone who uses this computer (&all users)" ; this was MULTIUSER_INNERTEXT_INSTALLMODE_ALLUSERS "Install for anyone using this computer" + StrCpy $9 "Only for &me" ; this was MULTIUSER_INNERTEXT_INSTALLMODE_CURRENTUSER "Install just for me" + !endif + Pop $MultiUser.InstallModePage.Text + + ; criando os radios (disabled se não for admin/power) e pegando os hwnds (handles) + ${NSD_CreateRadioButton} 10u 30u 280u 20u "$8" + Pop $MultiUser.InstallModePage.AllUsers + ${if} $IsAdmin == "0" + !ifdef MULTIUSER_INSTALLMODE_ALLOW_ELEVATION ; if elevation is allowed.. "(will prompt for admin credentials)" (will appear at bottom when option is chosen) + StrCpy $HasTwoAvailableOptions 1 + !else + SendMessage $MultiUser.InstallModePage.AllUsers ${WM_SETTEXT} 0 "STR:$8 (must run as admin)" ; since radio button is disabled, we add that comment to the disabled control itself + EnableWindow $MultiUser.InstallModePage.AllUsers 0 # start out disabled + StrCpy $HasTwoAvailableOptions 0 + !endif + ${else} + StrCpy $HasTwoAvailableOptions 1 + ${endif} + + ;${NSD_CreateRadioButton} 20u 70u 280u 10u "$9" + System::Call "advapi32::GetUserName(t.r0,*i${NSIS_MAX_STRLEN})i" + ${NSD_CreateRadioButton} 10u 50u 280u 20u "$9 ($0)" + Pop $MultiUser.InstallModePage.CurrentUser + + + nsDialogs::SetUserData $MultiUser.InstallModePage.AllUsers 1 ; Install for All Users (1, pra exibir o icone SHIELD de elevation) + nsDialogs::SetUserData $MultiUser.InstallModePage.CurrentUser 0 ; Install for Single User (0 pra não exibir) + + ${if} $HasTwoAvailableOptions == "1" ; if there are 2 available options, bind to radiobutton change + ${NSD_OnClick} $MultiUser.InstallModePage.CurrentUser ${UNINSTALLER_FUNCPREFIX}InstModeChange + ${NSD_OnClick} $MultiUser.InstallModePage.AllUsers ${UNINSTALLER_FUNCPREFIX}InstModeChange + ${endif} + + ${NSD_CreateLabel} 0u 110u 280u 50u "" + Pop $RadioButtonLabel1 + ;${NSD_CreateLabel} 0u 120u 280u 20u "" + ;Pop $RadioButtonLabel2 + ;${NSD_CreateLabel} 0u 130u 280u 20u "" + ;Pop $RadioButtonLabel3 + + + + ${if} $MultiUser.InstallMode == "AllUsers" ; setting defaults + SendMessage $MultiUser.InstallModePage.AllUsers ${BM_SETCHECK} ${BST_CHECKED} 0 ; set as default + SendMessage $MultiUser.InstallModePage.AllUsers ${BM_CLICK} 0 0 ; trigger click event + ${else} + SendMessage $MultiUser.InstallModePage.CurrentUser ${BM_SETCHECK} ${BST_CHECKED} 0 ; set as default + SendMessage $MultiUser.InstallModePage.CurrentUser ${BM_CLICK} 0 0 ; trigger click event + ${endif} + + !insertmacro MUI_PAGE_FUNCTION_CUSTOM SHOW + nsDialogs::Show + + FunctionEnd + + Function "${UNINSTALLER_FUNCPREFIX}${LEAVE}" + SendMessage $MultiUser.InstallModePage.AllUsers ${BM_GETCHECK} 0 0 $MultiUser.InstallModePage.ReturnValue + + ${if} $MultiUser.InstallModePage.ReturnValue = ${BST_CHECKED} + ${if} $IsAdmin == "0" + !ifdef MULTIUSER_INSTALLMODE_ALLOW_ELEVATION ; if it's not Power or Admin, but elevation is allowed, then elevate... + ;MessageBox MB_OK "Will elevate and quit" + ShowWindow $HWNDPARENT ${SW_HIDE} ; HideWindow would work? + !insertmacro UAC_RunElevated + ;MessageBox MB_OK "[$0]/[$1]/[$2]/[$3]" + + ;http://www.videolan.org/developers/vlc/extras/package/win32/NSIS/UAC/Readme.html + ;http://nsis.sourceforge.net/UAC_plug-in + ${Switch} $0 + ${Case} 0 + ${If} $1 = 1 + Quit ;we are the outer process, the inner process has done its work (ExitCode is $2), we are done + ${EndIf} + ${If} $1 = 3 ;RunAs completed successfully, but with a non-admin user + ${OrIf} $2 = 0x666666 ;our special return, the new process was not admin after all + MessageBox mb_IconStop|mb_TopMost|mb_SetForeground "You need to login with an account that is a member of the admin group to continue..." + ${EndIf} + ${Break} + ${Case} 1223 ;user aborted + ;MessageBox mb_IconStop|mb_TopMost|mb_SetForeground "This option requires admin privileges, aborting!" + ;Quit ; instead of quit just abort going to the next page, and stay in the radiobuttons + ${Break} + ${Case} 1062 + MessageBox mb_IconStop|mb_TopMost|mb_SetForeground "Logon service not running, aborting!" ; "Unable to elevate, Secondary Logon service not running!" + ;Quit ; instead of quit just abort going to the next page, and stay in the radiobuttons + ${Break} + ${Default} + MessageBox mb_IconStop|mb_TopMost|mb_SetForeground "Unable to elevate, error $0" + ;Quit ; instead of quit just abort going to the next page, and stay in the radiobuttons + ${Break} + ${EndSwitch} + + ShowWindow $HWNDPARENT ${SW_SHOW} + BringToFront + Abort ; Stay on page - http://nsis.sourceforge.net/Abort + !else + ;se não é Power ou Admin, e não é permitida elevation, então nem deveria ter chegado aqui... o radiobutton deveria estar disabled + !endif + ${else} + Call ${UNINSTALLER_FUNCPREFIX}MultiUser.InstallMode.AllUsers ; if it's Power or Admin, just go on with installation... + ${endif} + ${else} + Call ${UNINSTALLER_FUNCPREFIX}MultiUser.InstallMode.CurrentUser + ${endif} + + !insertmacro MUI_PAGE_FUNCTION_CUSTOM LEAVE + FunctionEnd + + Function "${UNINSTALLER_FUNCPREFIX}InstModeChange" + pop $1 + nsDialogs::GetUserData $1 + pop $1 + GetDlgItem $0 $hwndParent 1 ; get item 1 (next button) at parent window, store in $0 - (0 is back, 1 is next .. what about CANCEL? http://nsis.sourceforge.net/Buttons_Header ) + + StrCpy $7 "" + ${if} "$1" == "0" ; current user + ${if} $HasPerUserInstallation == "1" + !if "${UNINSTALLER_PREFIX}" != UN + StrCpy $7 "There is already a per-user installation. ($PerUserInstallationFolder)$\r$\nWill reinstall/upgrade." + !else + StrCpy $7 "There is a per-user installation. ($PerUserInstallationFolder)$\r$\nWill uninstall." + !endif + ${else} + StrCpy $7 "Fresh install for current user only" + ${endif} + SendMessage $0 ${BCM_SETSHIELD} 0 0 ; hide SHIELD + ${else} ; all users + ${if} $HasPerMachineInstallation == "1" + !if "${UNINSTALLER_PREFIX}" != UN + StrCpy $7 "There is already a per-machine installation. ($PerMachineInstallationFolder)$\r$\nWill reinstall/upgrade." + !else + StrCpy $7 "There is a per-machine installation. ($PerMachineInstallationFolder)$\r$\nWill uninstall." + !endif + ${else} + StrCpy $7 "Fresh install for all users" + ${endif} + ${if} $IsAdmin == "0" + StrCpy $7 "$7 (will prompt for admin credentials)" + SendMessage $0 ${BCM_SETSHIELD} 0 1 ; display SHIELD + ${else} + SendMessage $0 ${BCM_SETSHIELD} 0 0 ; hide SHIELD + ${endif} + ${endif} + SendMessage $RadioButtonLabel1 ${WM_SETTEXT} 0 "STR:$7" + ;SendMessage $RadioButtonLabel2 ${WM_SETTEXT} 0 "STR:$8" + ;SendMessage $RadioButtonLabel3 ${WM_SETTEXT} 0 "STR:$9" + FunctionEnd + +!macroend + +; SHCTX is the hive HKLM if SetShellVarContext all, or HKCU if SetShellVarContext user +!macro MULTIUSER_RegistryAddInstallInfo + !verbose push + !verbose 3 + + ; Write the installation path into the registry + WriteRegStr SHCTX "${MULTIUSER_INSTALLMODE_INSTALL_REGISTRY_KEY2}" "${MULTIUSER_INSTALLMODE_INSTDIR_REGISTRY_VALUENAME}" "$INSTDIR" ; "InstallLocation" + + ; Write the uninstall keys for Windows + ${if} $MultiUser.InstallMode == "AllUsers" ; setting defaults + WriteRegStr SHCTX "${MULTIUSER_INSTALLMODE_UNINSTALL_REGISTRY_KEY2}" "DisplayName" "${MULTIUSER_INSTALLMODE_DISPLAYNAME}" + WriteRegStr SHCTX "${MULTIUSER_INSTALLMODE_UNINSTALL_REGISTRY_KEY2}" "${MULTIUSER_INSTALLMODE_DEFAULT_REGISTRY_VALUENAME}" '"$INSTDIR\${UNINSTALL_FILENAME}" /allusers' ; "UninstallString" + ${else} + WriteRegStr SHCTX "${MULTIUSER_INSTALLMODE_UNINSTALL_REGISTRY_KEY2}" "DisplayName" "${MULTIUSER_INSTALLMODE_DISPLAYNAME} (only current user)" ; "add/remove programs" will show if installation is per-user + WriteRegStr SHCTX "${MULTIUSER_INSTALLMODE_UNINSTALL_REGISTRY_KEY2}" "${MULTIUSER_INSTALLMODE_DEFAULT_REGISTRY_VALUENAME}" '"$INSTDIR\${UNINSTALL_FILENAME}" /currentuser' ; "UninstallString" + ${endif} + + WriteRegStr SHCTX "${MULTIUSER_INSTALLMODE_UNINSTALL_REGISTRY_KEY2}" "DisplayVersion" "${VERSION}" + WriteRegStr SHCTX "${MULTIUSER_INSTALLMODE_UNINSTALL_REGISTRY_KEY2}" "DisplayIcon" "$INSTDIR\${PROGEXE},0" + WriteRegStr SHCTX "${MULTIUSER_INSTALLMODE_UNINSTALL_REGISTRY_KEY2}" "Publisher" "${COMPANY_NAME}" + WriteRegDWORD SHCTX "${MULTIUSER_INSTALLMODE_UNINSTALL_REGISTRY_KEY2}" "NoModify" 1 + WriteRegDWORD SHCTX "${MULTIUSER_INSTALLMODE_UNINSTALL_REGISTRY_KEY2}" "NoRepair" 1 + ${GetSize} "$INSTDIR" "/S=0K" $0 $1 $2 ; get folder size, convert to KB + IntFmt $0 "0x%08X" $0 + WriteRegDWORD SHCTX "${MULTIUSER_INSTALLMODE_UNINSTALL_REGISTRY_KEY2}" "EstimatedSize" "$0" + + !verbose pop +!macroend + +!macro MULTIUSER_RegistryRemoveInstallInfo + !verbose push + !verbose 3 + + ; Remove registry keys + DeleteRegKey SHCTX "${MULTIUSER_INSTALLMODE_UNINSTALL_REGISTRY_KEY2}" + DeleteRegKey SHCTX "${MULTIUSER_INSTALLMODE_INSTALL_REGISTRY_KEY2}" + + !verbose pop +!macroend + + + +!verbose pop diff --git a/data/nsis/Include/UAC.nsh b/data/nsis/Include/UAC.nsh new file mode 100755 index 000000000..08979aba9 --- /dev/null +++ b/data/nsis/Include/UAC.nsh @@ -0,0 +1,299 @@ +/*** UAC Plug-in *** + +Interactive User (MediumIL) Admin user (HighIL) +***[Setup.exe]************* ***[Setup.exe]************** +* * * * +* +++[.OnInit]+++++++++++ * * +++[.OnInit]++++++++++++ * +* + UAC_RunElevated >---+-+----> * + + * +* + NSIS.Quit + * * + + * +* +++++++++++++++++++++++ * * ++++++++++++++++++++++++ * +* * * * +* * * * +* +++[Section]+++++++++++ * * +++[Section]++++++++++++ * +* + + * /--+-+- +** +** Get integrity level of current process +** +**/ +!macro UAC_GetIntegrityLevel outvar +UAC::_ 6 +!if "${outvar}" != "s" + Pop ${outvar} +!endif +!macroend + + + +/* UAC_IsAdmin +** +** Is the current process running with administrator privileges? Result in $0 +** +** ${If} ${UAC_IsAdmin} ... +** +**/ +!macro UAC_IsAdmin +UAC::_ 2 +!macroend +!define UAC_IsAdmin `"" UAC_IsAdmin ""` +!macro _UAC_IsAdmin _a _b _t _f +!insertmacro _UAC_MakeLL_Cmp _!= 0 2s +!macroend + + + +/* UAC_IsInnerInstance +** +** Does the current process have a NSIS/UAC parent process that is part of the elevation operation? +** +** ${If} ${UAC_IsInnerInstance} ... +** +**/ +!macro UAC_IsInnerInstance +UAC::_ 3 +!macroend +!define UAC_IsInnerInstance `"" UAC_IsInnerInstance ""` +!macro _UAC_IsInnerInstance _a _b _t _f +!insertmacro _UAC_MakeLL_Cmp _!= 0 3s +!macroend + + + +/* UAC_PageElevation_OnInit, UAC_PageElevation_OnGuiInit, +** +** Helper macros for elevation on a custom elevation page, see the DualMode example for more information. +** +**/ +!macro UAC_Notify_OnGuiInit +UAC::_ 4 +!macroend +!macro UAC_PageElevation_OnGuiInit +!insertmacro UAC_Notify_OnGuiInit +!macroend +!macro UAC_PageElevation_OnInit +UAC::_ 5 +${IfThen} ${Errors} ${|} Quit ${|} +!macroend + + + +/* UAC_AsUser_Call +** +** Calls a function or label in the user process instance. +** All the UAC_AsUser_* macros use this helper macro. +** +**/ +!define UAC_SYNCREGISTERS 0x1 +;define UAC_SYNCSTACK 0x2 +!define UAC_SYNCOUTDIR 0x4 +!define UAC_SYNCINSTDIR 0x8 +;define UAC_CLEARERRFLAG 0x10 +!macro UAC_AsUser_Call type name flags +push $0 +Get${type}Address $0 ${name} +!verbose push +!verbose ${UAC_VERBOSE} +!insertmacro _UAC_ParseDefineFlagsToInt _UAC_AsUser_Call__flags ${flags} +!verbose pop +StrCpy $0 "1$0:${_UAC_AsUser_Call__flags}" +!undef _UAC_AsUser_Call__flags +Exch $0 +UAC::_ +!macroend + + + +/* +** UAC_AsUser_GetSection +*/ +!macro UAC_AsUser_GetSection secprop secidx outvar +!insertmacro _UAC_AsUser_GenOp ${outvar} SectionGet${secprop} ${secidx} "" +!macroend + + + +/* +** UAC_AsUser_GetGlobalVar +** UAC_AsUser_GetGlobal +*/ +!macro UAC_AsUser_GetGlobalVar var +!insertmacro _UAC_AsUser_GenOp ${var} StrCpy "" ${var} +!macroend +!macro UAC_AsUser_GetGlobal outvar srcvar +!insertmacro _UAC_AsUser_GenOp ${outvar} StrCpy "" ${srcvar} +!macroend + + + +/* +** UAC_AsUser_ExecShell +** +** Call ExecShell in the user process instance. +** +*/ +!macro UAC_AsUser_ExecShell verb command params workdir show +!insertmacro _UAC_IncL +goto _UAC_L_E_${__UAC_L} +_UAC_L_F_${__UAC_L}: +ExecShell "${verb}" "${command}" '${params}' ${show} +return +_UAC_L_E_${__UAC_L}: +!if "${workdir}" != "" + push $outdir + SetOutPath "${workdir}" +!endif +!insertmacro UAC_AsUser_Call Label _UAC_L_F_${__UAC_L} ${UAC_SYNCREGISTERS}|${UAC_SYNCOUTDIR}|${UAC_SYNCINSTDIR} #|${UAC_CLEARERRFLAG} +!if "${workdir}" != "" + pop $outdir + SetOutPath $outdir +!endif +!macroend + + + +!macro _UAC_MakeLL_Cmp cmpop cmp pluginparams +!insertmacro _LOGICLIB_TEMP +UAC::_ ${pluginparams} +pop $_LOGICLIB_TEMP +!insertmacro ${cmpop} $_LOGICLIB_TEMP ${cmp} `${_t}` `${_f}` +!macroend +!macro _UAC_definemath def val1 op val2 +!define /math _UAC_definemath "${val1}" ${op} ${val2} +!ifdef ${def} + !undef ${def} +!endif +!define ${def} "${_UAC_definemath}" +!undef _UAC_definemath +!macroend +!macro _UAC_ParseDefineFlags_orin parse outflags +!searchparse /noerrors ${${parse}} "" _UAC_ParseDefineFlags_orin_f1 "|" _UAC_ParseDefineFlags_orin_f2 +!define _UAC_ParseDefineFlags_orin_this ${_UAC_ParseDefineFlags_orin_f1} +!undef ${parse} +!define ${parse} ${_UAC_ParseDefineFlags_orin_f2} +!define _UAC_ParseDefineFlags_orin_saveout ${${outflags}} +!undef ${outflags} +!define /math ${outflags} "${_UAC_ParseDefineFlags_orin_saveout}" | "${_UAC_ParseDefineFlags_orin_this}" +!undef _UAC_ParseDefineFlags_orin_saveout +!undef _UAC_ParseDefineFlags_orin_this +!ifdef _UAC_ParseDefineFlags_orin_f1 + !undef _UAC_ParseDefineFlags_orin_f1 +!endif +!ifdef _UAC_ParseDefineFlags_orin_f2 + !undef _UAC_ParseDefineFlags_orin_f2 +!endif +!macroend +!macro _UAC_ParseDefineFlags_Begin _outdef _in +!define _UAC_PDF${_outdef}_parse "${_in}" +!define _UAC_PDF${_outdef}_flags "" +!define _UAC_PDF${_outdef}_r 0 +!insertmacro _UAC_ParseDefineFlags_orin _UAC_PDF${_outdef}_parse _UAC_PDF${_outdef}_flags ;0x1 +!insertmacro _UAC_ParseDefineFlags_orin _UAC_PDF${_outdef}_parse _UAC_PDF${_outdef}_flags ;0x2 +!insertmacro _UAC_ParseDefineFlags_orin _UAC_PDF${_outdef}_parse _UAC_PDF${_outdef}_flags ;0x4 +!insertmacro _UAC_ParseDefineFlags_orin _UAC_PDF${_outdef}_parse _UAC_PDF${_outdef}_flags ;0x8 +!insertmacro _UAC_ParseDefineFlags_orin _UAC_PDF${_outdef}_parse _UAC_PDF${_outdef}_flags ;0x10 +!macroend +!macro _UAC_ParseDefineFlags_End _outdef +!define ${_outdef} ${_UAC_PDF${_outdef}_r} +!undef _UAC_PDF${_outdef}_r +!undef _UAC_PDF${_outdef}_flags +!undef _UAC_PDF${_outdef}_parse +!macroend +!macro _UAC_ParseDefineFlags_IncludeFlag _outdef flag +!if ${_UAC_PDF${_outdef}_flags} & ${flag} + !insertmacro _UAC_definemath _UAC_PDF${_outdef}_r ${_UAC_PDF${_outdef}_r} | ${flag} +!endif +!macroend +!macro _UAC_ParseDefineFlagsToInt _outdef _in +!insertmacro _UAC_ParseDefineFlags_Begin _UAC_ParseDefineFlagsToInt_tmp "${_in}" +!define ${_outdef} ${_UAC_PDF_UAC_ParseDefineFlagsToInt_tmp_flags} +!insertmacro _UAC_ParseDefineFlags_End _UAC_ParseDefineFlagsToInt_tmp +!undef _UAC_ParseDefineFlagsToInt_tmp +!macroend +!macro _UAC_IncL +!insertmacro _UAC_definemath __UAC_L "${__UAC_L}" + 1 +!macroend +!macro _UAC_AsUser_GenOp outvar op opparam1 opparam2 +!define _UAC_AUGOGR_ID _UAC_AUGOGR_OP${outvar}${op}${opparam1}${opparam2} +!ifndef ${_UAC_AUGOGR_ID} ;Has this exact action been done before? + !if ${outvar} == $0 + !define ${_UAC_AUGOGR_ID} $1 + !else + !define ${_UAC_AUGOGR_ID} $0 + !endif + !if "${opparam1}" == "" + !define _UAC_AUGOGR_OPP1 ${${_UAC_AUGOGR_ID}} + !define _UAC_AUGOGR_OPP2 ${opparam2} + !else + !define _UAC_AUGOGR_OPP1 ${opparam1} + !define _UAC_AUGOGR_OPP2 ${${_UAC_AUGOGR_ID}} + !endif + goto ${_UAC_AUGOGR_ID}_C + ${_UAC_AUGOGR_ID}_F: + ${op} ${_UAC_AUGOGR_OPP1} ${_UAC_AUGOGR_OPP2} + return + ${_UAC_AUGOGR_ID}_C: + !undef _UAC_AUGOGR_OPP1 + !undef _UAC_AUGOGR_OPP2 +!endif +push ${${_UAC_AUGOGR_ID}} +!insertmacro UAC_AsUser_Call Label ${_UAC_AUGOGR_ID}_F ${UAC_SYNCREGISTERS} +StrCpy ${outvar} ${${_UAC_AUGOGR_ID}} +pop ${${_UAC_AUGOGR_ID}} +!undef _UAC_AUGOGR_ID +!macroend + + + +!verbose pop +!endif /* UAC_HDR__INC */ \ No newline at end of file diff --git a/data/nsis/Plugins/amd64-unicode/INetC.dll b/data/nsis/Plugins/amd64-unicode/INetC.dll new file mode 100644 index 0000000000000000000000000000000000000000..fad7ad42e2daa0d74110a77acfbd5c73768e934f GIT binary patch literal 27136 zcmeHw3w%`7wfCMR2SQ*tARJUMGH4Ji0)YS~43Qi-17~!A0D+*Q5Rwd}gd|PQ@UT8Y zC#fXIX|>n3`e|Ejz16l}Yi)}W&?W>(c!!{Xf;Hfy6GjCeh2Vp8|7-6vnFOg-``z#N zyWg*aGkfo~*IIk6wbx$zaZa|gZn>YuGsY6|wJgT!kkTiM|9<&T8>;&b-PD);sn_0N zbq?R&VL2;`DqLmdrOV6nR=M)?N=ix%*Rn!ad7#8qRN~U+%y+FSEhrr0bS9q1^yL6u2WD8>>Ap)ys>@<>p`GaPgZ4ocVYm8C2)rqK<-;QsWPZr#0OnF6lK44te7G#p}U5am) zPZsdH6#t$5e`taJqOHnklTR-YxtHv8mz}oR=}9|1Z>N3jQ8n03Q|)w`ozAw?MRrcfZ}f zpl0k2yZ%u-ecDd9*y%nyZL`z&?ex5zCM^=2Ty{FfPH(W&96K$r)75rbWv7qY=`(g( zZ>M|gw9QUGwo`VqXs@50USX#r?R0{jYIZu$PM6tfiJkgw`R}vSs68IC>z}gIdOJO2 zrzh?76FcpDi=e#9PAA#vjdr@!PFLIM{dW3GJKbofyX^EWJ3ViwS0awmC)G|xDfYX7 zl_AcSvOEO#B38nd+f`qLyV!76(MjlHBbkSl<6kD=1?*b8=4zJ4#Uzu^9jII;k0(QB+)5lDDdGvTHbRY%KG0tU{ZA_Yz}c!Lbx_ z8Q_x7R(8sFAv_;gC2Vz<`W29dv@V1W#HSp&e0+<5MRFFgRY*%&0C}nx97u(-!5bS`{LIWDDT z$Q2-6gSu$XP3@xBcfhfbTcikBC3X$TPuxhuV(=@3q(ZM{98P)(I~ZK%5^$iNAx!!R z`;fF`6)Kl;SprB!eF-mjwLuI{wkt*N6oFRw&{)V)+D#_ThV#t>P6hNUg(UWJ1MsLl zOCXhyLGUNN${=S~ZArd0Xe$qGQZM9lD;EJv^bXZmfT9?6qG!m5C&QCd;k{jRLMnkz zd|bA#x{xD3cG(CtItuU|ZkK7SxY%fX#i$X#3?=IIS!`M-9+g*KP+kT($?~!BHkHvo z)@>Bg$PK`|MnjWmKTpK?qmj1&kd@rVcS-C*Dj%m` z4xAO7l58nH7h-nhPyJ3dDB^w;^?y7NDv-In$egc|H(&Q*en}(V)Tzj-Pfa~#&twfm1&)Fz}_

S*D?khWBr;t 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 aU_$N^{lp#lvHt0m@GK$x`}6;)1^yc=lV!^Q literal 0 HcmV?d00001 diff --git a/data/nsis/Plugins/x86-ansi/INetC.dll b/data/nsis/Plugins/x86-ansi/INetC.dll new file mode 100644 index 0000000000000000000000000000000000000000..d064bc1ac3474b84ae9c4ef12a043900738d1987 GIT binary patch literal 22016 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ðW2GbL*x>joG;o*WKF1!%BaWXqo^U+v zc;0c`@dsF=vyOAn!^uvyv%q<^^LnSw>2u!bEO)MSu62f;QD>*~Zs&c@JlxLf ndP}|4-dgVt@9o~Zyx;f!5SsinH2HYix%}U{=KZT*LlXGEWT(rI literal 0 HcmV?d00001 diff --git a/data/nsis/Plugins/x86-ansi/UAC.dll b/data/nsis/Plugins/x86-ansi/UAC.dll new file mode 100755 index 0000000000000000000000000000000000000000..57a58c5399a54f964a69cff764f505ef2b7c8c16 GIT binary patch literal 14848 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 literal 0 HcmV?d00001 diff --git a/data/nsis/Plugins/x86-ansi/md5dll.dll b/data/nsis/Plugins/x86-ansi/md5dll.dll new file mode 100644 index 0000000000000000000000000000000000000000..003e16378bbadfda487e4d473280cc9c57cb179c GIT binary patch literal 6656 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 Lzj?v`gX#Yh%gtxD literal 0 HcmV?d00001 diff --git a/data/nsis/Plugins/x86-ansi/nsisunz.dll b/data/nsis/Plugins/x86-ansi/nsisunz.dll new file mode 100644 index 0000000000000000000000000000000000000000..5466f15684f2f8331a262cf3c4a3c302780861c8 GIT binary patch literal 40960 zcmeFadpy+J_c%Ob27_USC`D3KN=hlwbfL^p8Ak3xQZ5aZn4vmI4Q0HWN>_Ed=$=!l zluMD^B2jJ?B2m(46h*m&`K>*pb2^vL=llEq@jTD#dA*L;+3$T@d+oK?UVH7e*WS}% zdK|zJa5x+hf>?~hWkHPoEF|Cm{;7m&l?nG$aCa1*Ow7XDKAGqgxFJk8By@8?=-Q3C z>(*}Cw3(yp>!%ya-K4u=ldhG$qwdDd>-}abD=X@cpk8)zico&YCi{=DJX;^~es5N1 z%Rubdv@Kgs5^v3>K-~ArR+3+}VO=0<^H&O4bR5nWPsGWLd%pBXT{BK)q7q(CIw+R3 zRFMHO6@oNRm82n$_<;U?#JFV0AUODwk$fQ|$^VF@*_%-~93Sd)w&QRMC2;@Ya{$PY zBKi*i|Dl+L!|nYKRj7C-$8ReK;sfUJLG)RS#1Q@X)5YO@W`?d`%UO%Vna_k$z=<;+ zi6Q#&X92BeO2KeeWGIb+fN-Mtr#}lEE^lV2U-0I2I9vf5(*Xzw4#hwHS>SL>f6D%w z{Fej&a^PPM{L6uVIq)wB{^h{G9Qc<5|8n484*bi3{|`9ejCEj4vWqJgMZ$V_wjmcl zekV1qluI(nvuN)Iig-~}9A)<#NIBlSsR1WPXKEM$bEZynrt$`;l)cBG1}n%H60y48 zhWxigLJcKjETNl{;f^N^OJbRkm@pC(M`GELSZ*YiABjmLvBF5KI1($3#N?4!c_daD zi76;14D<4-Hk7ysu~-~e%~7Ic;0axpgy9w3ui2krbXc)THP+qx4J*OEm{j+6qv2r# zls&otzZxsaZ>B00ukrRO#Y zl$taU2KaPxLSq6`1vPborsPux+;CK^E?=anSB!E9UxNub?tmvG@=Peugh@_#l|Wa) zh;fo8L}`bF?TKW01i7Sz4@-th`&}-COBZ2*Sqe zumE{;goUYz*$^=n728T)iG^s}3v9=J=QE#Sj}4h*LIs~$B-pz^3}o_|m6)9_pV^4n z>GPR+n4JNiDa7n%@R@a(oiU#|h}q2rp~38|_{>(!&c>vg&uqr*Y?s!&!R%No_|D}f z)sTk7BTxvueoEN*Wjs2WM9CNh5KJ=Od2pE|4GC0^G0QRMRz1K=P7vvR%cpV|eap9? z#PPrpB*8?XrlFFs2Y#H3eff8a~ED_A!mwL*c~(_%vn@#_X~L;pt0IjUU7PDhi@K z4qI;cn80jAkjy?qrVyaRya7^7@4}qBtd}RK0pu5q`2#nqUkvpypuZr~k@m;zLm*mz z>kJX!0rZIo&<=C%;SI=y+p-CQr9&pw?!BL((8AK1x3PziplTUE#`?$C2D*O_(k;>j z1dsm-f)~{z6F(-R6=EDm4IrX=@MwJDatX`v*6|dY*R!zsw5UqTF4mA(ESgbbp*c4O zM-`2Sgf>d3f6Le9kV@o~fJY)_CGc4of%kp6bGAj)$*6hs3!>sUas2H8hcQNKO=6bI#EyQf~ zi6+&w#~cgHQkz!5G3T>1`3~xQ2NK^wv&7OEn&1TS2C~qS%4ZSzEHa;^%V+8HS;liKDh>kiggy5uvJ+2(^f`JQ9te9X5?{xpp?wrk1QSrQR5J#(jaL4_j3)m zp=}v7_*T*^DOiti&5;zyaCGCnguor>5f~Kj)sA>mi70a>0U;9hn21Z{fI6ILf^;TW z|Jb=?8gxS&zcEy0IL25Z;05a`9@t%&FQmrPKS+AfWD}tm5$c8g_g>J=)sJ32fCT-0 zh$E9N?d6|nSN|(kn1&KLbo~Q_5jieD&}082dcL>WKXNDS>tDDd=>fEXvvK_*#%B@kB%-Ed@~yU=z3)aCrtgVI0tz>BH_^!p^}<)!GU zKhSUe-=M$NBjLhd1|UU0OM)H*9Z@gCu@Oy@(mw{u|30OETEgm+(UFB#ClOQ@5>&n- z47$NY3}7aCEEY>R2lXsjH%LG&jitLn`v;f-X*V~a#eeQb7c>Q0*f{7Xzl92Gx-?;X%5XYHg!x?YG zQM2LBf+f8W7$e>NM7kw%po(!KO&6guVy`pFy+lq8m4Fh4g$f!;#vVGiZ)YH7QZYi# zk7W>x3jd~6rE3{l0k6ui!rm&$tmL;-Y59_g(MA)~g)|v3%M8s7FbniE4rD(r4`h-O z>k88W;%^SifB*#;z2irc7u5v}Rf3L3mIJp{7-xW>e_9Ci4m`aTmP7j}Sh`Z4)kA;( zfm9U<&pK6j%@btNj-D@)O_!v z{ywnasEBV4z~DaEpxY_Xp|or7|J*g2E<2wDKrc_pBr~boaMXMe!Jlts7bs@<#6F`PoHMe2~EWD@BJ%AdEM5r_jAUbN4s&^CeHdckgqO~J4d92KJ7054$Ju40wo z&^mPxFap`5SZthdJrW(HoHY@r8#yXi0c=2xh+uDklnz7{nzX0DDB(l^2mhL8feoA} z>V7Q5eE|3;R)X;;*-l~NF@}|18Agn!WR%k?VCEvq{drMesA0>YfY0ptfnw#~QS|&k zLF*5F2_rS^uMzoU%rE|YTgC`8+BJYCuGgPYp#lDdn%_|gEM;hYp|vB}V8mWMl-M>H z9VOF>;m@bnNmd9ikATG7zWo5yAaYeH8AW`04|nYka!-OT{Zk(jS~0rBddMS4`e633 zhiXI!p}YhkK}3^I|C;~WSpG+27%pnOgO{h2FOui^)!{r0tKd9ohs1#Jh{mjpput|C z1_l0@bDclmNg^XQ+)pr{7{e2@b0g%NgV4~y5MBmnK#?|xVjh~=ShSiXh5*V+mp*T? z7A1BIRQyNLaVWvTD#MAx-9UO+Y`o9_Ni-Ne^hOCC64T`ZAOzIy6Gt#fWN#IQ=QC^s z3>M2l9PU|yLpu@1a1&S|JTk&&G-H30!M%vmm#|)?3J7>77rJI=REG@Ad8i8*N^o!# zbDJfGcn31NnSFdH8w7Kl#rHPmN6!^jcY$)Hlib~r(Fg{6G@Nl;F&iovjTi~DAi|MG zYBnN@xzN==%XccO`B|&|SNV?3qr~on0bc3iMo}`JflwtpGRY%6hGm02rerwR+vpY6 z2+{eMkPmZ%J^CRRR?=>;3NT7x;~U4+N5x@Z*< zx3R~tK@7l%U|H0N;3L^BP=B#`d^ z@&`8CzhPrm{=kMYZ2qD_{@0xS0QwJz{oiud=KqSbBTPdF%XUNP2yq(O>vju)YbA2v z6NNz|-YxnuT5l;if1Ev_{>NyMvilS77LIK97(?HX-a()@n==-MBSU;H>hK;ch7!5a z&<8K71NK1zLJgi9#zHuI)AGYj4ME1bFoprzE>)(X`WVnV%1(ufKBPakRFA-5V#nYG_V1Y^w^ccNz8nXj1Gt4k(2g{HS|J5bn#LTXE zJXa(&Iwu2ZB26h-!H@>H1cn&`Wp>2lrHi^92NmdqMu|;|4zoBMcC8p|qJ7O~t_xRGlL)bol^UPgZE!{#P3d><0wKr#EAT z-0}ZxzF}qg?V5yq8bh6<0PN-fyG3>*relfRSj2K5oU;uf;)MMmeHWVU|3*5^Ta#l6 z_&fpMh|58a*QZU{ZTnd)h7QEZ}mL`R9- zIOwc|-U!^niO7%uZ-*GXEujACt^d@T7p;qvV&GDFi#4OBf#D0Rq*+oqI>0np9&FzLSkVOl{Tb%fY-mk1TtmfMlkjWQ@!pz<1#sr(%!q5?7+}_9 zN5jIO`2RvE;eW<^$*GxdZ45ZT%0_2;`MWWQY8jJK%!SzdQmdNx#)9B7mrwfMR3RZYTCmGl7)g7st^^(us=Q*cy22s%@7)bkLo zL68AY0=Qm?B^Fi(LSW)7Y|&O&VqtS&E6TB8x5FV92Xe_qkxUw}2yJuk8C*TgP8(J; z8(-7R5=R(_T_rx2LOx@L^akZTG&A?s<*G{I_}&IJ&3tctK0_DtB4e;l*HCG7p*om7 znPvD0_Rbl?-^PR70So;NUCkD`XFf*HF~U`4;?FUDEYnAFftjH}6}xM3=wy}&!|Zyrg%##ON4 z_2Ho)tc&&t9RmizTLmsw^DMqW)$lXz z3x~veByKMQJ=QihFfl|ZId~T}<>>q8YknGmXR^+`0*OnLHsuT00IxrJh zr8RGOQ6xM+N}ccA$afYBR-kJEE_LUC9EfkI^hytDUZyr!<_V9cGu7jnsu;7!AA|V; zuX10MVvHXZ=g)Um6X`{3f`gw>nxL*4?+g}SGmKQ#pU+eiDfsjJ)Nn8-KG-9ZYD1NqZJW`lgDI*RPihN~Gkh~cPW4INp5mzs^^eizBb zEb!zgt&jrJD#N;B?hirr0%-x4B#47|=3>!`nER-eC)ZM1@5wbw5DX)1ap=3CjAIbf z@5zz3NFXgJK|L{5Y0yDPVVZbP;QifI!Jk3xj6k&a3a0 z=y&z=+R_B|yuLI+IM{HTLLWMs3x4JkcPA{X+R3{ z{%6?F<4<+Lmu=B~)&J^mlG1kA2jfo(;VUTv=sb79{f~pFv;)4Nrz8~udQXWg8W(!4 z4mwUiAC!!aKOPOuOo#791&b=)t4}(2*djD%F^ea0Wz!}xL^5f*0znV(T0~ks2Jxe$PGSYP5BPn%M33VJ* zHdR{g$Z`~GtcOC0fp!+jiHl?#G=@D@hFu7e1fhmDluEk7aC|vQf^UqFNW|qZ znEf$+gAj%xh(UA&aU8gyaGlej>ovp@x&fQ8d5FvH@six6Egkk#7NMYCSg)^WBG~Gh9I%DpmG_Vat9F-WeSzJOf&eI~s49ER4 zOou5#)Ubq=01KRwkGY8QIA{jZEJ|z;bS%w)`F|gTRN5dADHaf!U~s*Ilpq!a_U!>e z4}LN!f^sd@Co7~C2I?qBTY!?7sSewNWyz7lexw{CI15R!NfJMZM8&X$z`&Gj1Ok+!1^R;alj|MC?v0aR-x<659+?hs-0cnJY{I zCu!Ff3p5 z@kmH1v15PGNykd=B0R@?`@u?@4^#)k9nC*dy&2j_s{!!{*^8xQ6NYKsl>L6t5PBDy zK%Zc_jzw@FkC9}Ar*KM zt@Kz(p;p!4Hbg}3L-OJt7zuU4)B#up63(>8jeuPp0SiE2(mMA*4gibRA}o8Mx`e3j zgj$E7){@09T7l|9q;+#qofFiJkR~#cYzjh4C_-S%0nA;b=_s^7i9l_HTQ;xs z&!4lD*B8PW&FkYLGZ7vs3>FjdlSS*rTy4>OFzw-~2;LH->zY&t<*o1i%o5NW1F4cd zL1QZr0F;Te#9VctRQv*Bl+gqjxF`c!+}%-9QYT5&;^~7T^uPw*M#K{p#q>cKR@{7G z(;9E+99};F9~{sIg)Bw#P7q`&&b62>4!W%qp%7Epfs!H}RF1QVAl-(eoR}$65o^o< zQsVNq5sT@=hC7FaAgiH4lwA5S%cL42Fgu7Dl-x2fVQYkJ#WlUXkSFBT2v@u*rvBmE05P4#&QYN9|4f)7y=y*vbCade}d5b z0U_lN6(;qMDK32$P7LcBd68U&dY~+MWn$3n zV19CCux>Vvy_T91jq7YraV1@2Kc~p&dmA=z|>voG4snN(NmCAkpDZBoA+0 z(1L(>t*~5C8v&i<%5o9jL$pPaBps8X42mv85!|ORNvOYmWJOBL_y18&m6T7AmPep+ zL^zO1l8~th?-G9}6TPLCs7fjblSuX0+N`|SY2ELSKcJA{Q|ItO>_h24rTW~NQ=OC*(U)7R>>kAK+A`#p9t{$ z^uaYT)@8`;Gc2Z+M95%$Y@7?~$MyGa5wqENS4UwHT$7A&Z=t|?NTh8Ovrv=8)rg7I z#INM4KqMo}m4}ER$B~Q6+tDmiAQU6f@8P2Jx;ed%vI~hVP>YTP;H{9%^oU!HE6Y9s zZZckUB#tBRB2B0ID+toz2PC*3;gER^l`Z;n*-cb7?ayU*P?^S` z%d$|}wm+AF4rjcT`&yCvhk~cfZdXIFwt*$Hq!+;-6 z1KNhv(NJe<$B(}YKjlEo`+O=O=CQO%<@IdHE=wV*MGfbXQ6Xf9lMVlFlW zJ6j1>>K|AIwyHDncItrH?jJBCyU77`qU1J#_8nejo)86?uhHc6ny-oE$h!)WO$651 zAQ*5Y2xyBekSu@1G9vr9$ebPgLos&Ix;X}cI1AXarK*w-y99}EX9fBYt`6*M_};c$ z@`##YC%K8j`Q8?o{X&yG^EGq%c20b67G@8L^%#Y67%q{0;6ehm3*>uia;LG)0-fM8 z3p^I=&v5gu4>t;Y?-{~X&qvlNdTeTeY!J-a0==WLw&KI<1naG6TD?gEE0PYMv5+4T zIpT&yBL~|N?FZn?BJtslkqTP_iq+x6AQKo{(UQ6Y#<$dtka*<%p@$LOH6I=RknWNN zEhQpLR2PBBfsKFl2*fGyKuFbqM32FaYAWRaxlE!3kx%3gOq#UUTzGRc7reY&1zHK{ z%s$f3SRed=CP=VKFkJmnCZRmn6}mZ6uTfqw!`VOo<1`-zh`3x#NQITBZ zFx1Vx)hWBtvkr4_64w(RhR_PbogW}^rImy!Vtusllvp8>A4VYTTnpi<$w!z0ySQZb zDREU$1x279VHR~H<;cdN#32tKCWnt+I4#-@Ucd39N#@?`xwfzYV$mc(4com*9_@QL z+`bVp7it2T1kQO2T1jZ9t2mr04rd89%EjVo(Vo+yNzp0T?WzR7|=lcR{-io!XqFwrjjO%~!>@cC2u zL6KmFt(JPMDK`KCOL!Gn=UxboNRsf5Bq^~i+Uwya7tT9mA%<8x&kR{5@D$zsycrxf zINIANe^?@y7rwy$*tb4@10%m)W z;Z%-bz_fe;iwBM`u8@G=GYk^)C3~P2Rw5doKv|%~RbCcD!*La{5<{3eMQCbG>kEJP z$CU~ZDRFp~4||q6){9m0+6D<-v|^45HkOx9fLNr}Es_zFUOrE*06z$Q6_-8preQWATLk#JVGP1LS31B!;0Zag9I^p-2!t1SI{sP z*pldE&U|w^l{3c$_B|@bRcC=tq1>Ru%)^2+6>G2nH5fXu?T|pJfX1PMTYyW3qlQVI z)HaSH<2VfTdn=BG3*dlrDWCvMKVxx{V1dSPLm@>ZQj%gt4r;he_6D3%l#&@Hn|uS? zMH`ccA#zke3f%w!*45jj^^M^w+=Pr#41PN(`2~k~Zd@}QoY9RNh%HB-DmE5tcmljh zDYT{>$zP7;BS0b>5A4JJs6~g{fB*jFz`q>$mjnND;9m~>KhA;JUvRjS5V9bYL#Tt$ z3ZV7Ika@v%i4<@finL*`vv*M9!U`qOjb8&oc2 zHEz>sf8HElUwzEbHbdclbFRG&uA9U4d`+)Ve$nW@ zsOsu9+!FAmm9s*=#H$}>u3AyyW83{=2M6C z1sq(?`8USd&nz##UQv6bZqde~stezHUevJLH!K^h-!zvIA8@@g%jad75z*@1c!J3q zTgBf>Bb8q*+#<{R%~ED6m8z7xTbEoqIX%$zcHCxNg=hYE&$O<6s?y)&om5&sZBkO@ z%{y0WOU5j^?Y>j_&P9vOh7062 zc)9xamIe65Y%vWU`(7?+Q@GZ%;by}czQ^{L)bbUt0ye+C+uz@ryKh-;=9uUEZu$t% zzjzUSsOoG{L7myEFR$%C2V_?TxaM4XC6~TrrD>YYOGD*4TP?*K-&PPzeYO)V3p;&Y zJHHON(z$Qb>}|Ol7<+H8EgQ%4&q=P{JlXV3;Ho1LMu5%uj^Z&D3!{bHt-LH>1L^+Dy_=kGE*8zU#aZcutwU9)@Xn`fW< zZodlL#Ctj6$>`jjtEb%k))H}ZbA)xKW}62oK7>sXKc>m~dn(~o#i#xDZ%Fm+s}TpS zrB?)x-ugx{`BSxWtrL%ES8$tPzIIB$<=)Xgl}zgm%Nrs#EndN{N^SIbQSYzx+Mm#^uZLPsM*;=|ze z^qz>Q-IqOFN{(9ElM?D5Ezd5fN)UDql-2jVCEKT8V@9W@?=#|^uFy`}~>pPMXy z;Cs%QG4}+qD%+Y;CYyDpEfjC-4$HL>vZJ&fS}vU4>(S4+J`mxG4<+C17KCo7b>t~aZ+JD-|}e{&{5b7J{r6Q7}+={H*RuYamsa>t0L zb|yGYVfR&io6-*&j+N6G(cc3j{N8-qwq#bOjlL;IOJV%H>1xC;IgTrD3v5<}H2H0t z-5KpO+}-y6LBY^)WMbv>MagC51EvYQZ280!Tb*)lnfqP7vNDNBQ%p&kR63BZ5MP!` zwfE{=qY~W1c(SB^<6e~l&N4NRZW%qx5BVX%`7xFeb=I|}$K=|K_B~9;U5t&@${Ckn zxn*^>M_`gLVp)BCu!oMlk;a;6Q}Rh8t*NiHaf{V(Np~G*^O6tvreal&=?6zY?0Mzd z(^+)*azW?wqxIj~bL3O62(&YUnr5Gz-Z?$)<0;8!re&o*Z0$eOG_;_+`^7Iq!it=rl$arpwBw5v z&ZO-yi@kbNUwg)94f%O<7}IsaB4*3qX$i6US{dYE%42MgNb_1}S36KfX=|x2PcQEm z#MU;iP&;}lWDv_xZeoQjIU(j@x;LW)y#-oQ5Jon^kZ z6CRrF^zPA1I(1p)cH>cv-?VT}?>uJP4<7gRt*vw1_H>MW%W{|K0oDJ~}s1m_4DgK3T4#JKFntfuHrJM4RAQ$&Os1soH`Rc?CVTlRnANZ;5K_w#!E^ z+T`r_*GjxFb$Y`6=A5!GX9bla-=?8Fz0S7!`z<-@gO!(+m+%s%M5iS#xvO6p(x*|j zfyQWCx;(Y7va9j_B{Zo;(jK04QwW@-Jp_T#vM*H<;arf(Sg=*v7caZ>N7OH*#CCfbHk z)jbw!=ot^IZ{L?Sn%TO2Of!RNRy$+A`M!gtw7Y#u3l@H|TA~!Yd-19Tc?O z-uG@>Qr&gJj+-=wYEM2CVQB9V9{PC+caJ`3p8Q2k4g7+Kf4?vD|KgC1?H3&Vrt=zst&M&J)WpH;Tpdw&hF5@5Pp}0zW$i$e1`U&f&T$ zyvTIfo7d-<{o8_7Z`31M&!cl4gywHNUOVcp-u=4mAAK=t(ekD(QWe zt#4)tYvMn)CzxIp-S^z^p(|_DP)T*w;OXFF!zpsk;u+L&16tebzAr60-Oo++?6Yad zb?@L6e3`N+woBEO@%gZ&LeF`_vabV21ieqh_TPNGw${7OzgMTiAAD*4c5y?_*DX!h zncJ_cCw_hPZsq*OI&x5Lr+>{Zc*O10jt>GaVjREp?4{^YdMjh zu2&o%zy1X8fr{I%wwpRJRWBQNI+Y)aU3bYLZh_{QJ<6facPCfANjY{;_sUbE|8M=9 zE?kY=DoS0cHtmMmwawQj7hk`ox%2boSt655;m+I(mP;}(7ES9*?q0Uw>~BMn=T9BW zJy#i4l>UCK+@0LZ78(2}yE4fQPts_&D7Sqn%WpaRVK)OO)n>1;(YPn~%`t2C$;7*N z5}I;&&D!^0dV4(hI5!DBi^BN@z?QyiOCRO^^7{Ja zl7MBTQ0|n?PoISBxPC-KQ`P8u=7lAvD>e5_6;_N}xxZ`yZmX2* zK3W7maOgYRXV_JA=9tZN<4GR&uBYF8+q`_oA=1~9sLK}5HS-2H+Et#JXPBucc&K^w zO!AKDQ^#5l-HX(!!en)Ps zPoZ3ONV0e480|LqtdyRGuQhDr-WOCg$3$;XnN{{nkWED4If`;wN#L!pX(hz9w#ixb zUz0Xl9T3+HMzj1sY0ZD>!kl_n#lS)~qqy_th4b-b?Qu67cJ8PRFi+fCZP+tm(;-6d z6q^5m6TJ8(vl2hL9h&CkV|8b?d>{Gs6{gO;iqDriULPFhXU${;jQQ0`CS+M!Bdj0rT&52Yk*E1U1tn#yYNv=BSlO->Si3ya56M|aL2 z-Dk0jcxvk69Q_IH6D_woAHPuxzn#75X+q0z|L9%y&iQ6E%li4)4sq~Any&(5&&&7i za~|#5w=d+`>5m4t`W+6eacSMPV7A)=p2GgiZJSIckn(pcZ@jc1{X&by{rug7va_Zw zAG5;l>y7U4Npp^>o=(`BYnU{?{+RB{(w?m|Q*H9{@I%!X{Vmzr-bZ`4nNPPrcJz$b zm(P0dWXA?EeWGi>?yK^BFUn|IvudA0!Tk30?ez>?V9vyx$`7+&$M1JpXS}xm#U$cs z_KEwK?#tKZ;~$uAx^vx8fuwQ5E_A$j+S7}wyMM{#w3JYu)Kd>$$-Oq6p*q$~FZ^N* z*T1-qir?-toLUk3YiZcyNuMvcS|8QyOfkPcRPL=xm;1yFU&sIaR4~P=QE1t>-eKFU z{<%7bEMMN5;`rdj2~m4-|LwhJ=}NvTU1Q}p*q+UG_;q1}>D1VH#}6K54bPl;{I1iK z!6xBpwJlzIBSyE(eLB-LXUc6eg*+fm;u3)RR zi=X}W6f3SsnICOtx#NY`l)_E7`Qec-K0Pkl{9?Sj;;pkStvc%6JGWg~S-YWZRGLb} zRnM~pcg>5V@iD_GC*K{{&{r}|Hr?c)z3=j9|J?;!UM`-|w0XwzyETWqb`lkiv}N7; zWx4Wsotd|^Y!+89GjiYbz3^K@`=!JHhY2Y+%eOxza}KY)>;G9!wh68O2zle9pH$Y) zIIiGuPkv+3*bsKl{`Pej=bc`E5FSQ{T6fTg5T0#dvY6JC|6vqTI4>Z-uRkB6K=tyT8Eeim1{>&ywj8J za=S>c;@*+tS@$ne3}muSuaS)>6_e}JZYj0v&)OWh$1TuSHGl2+s~P@Ai^3Z%58xZN z$R$G>QS=UKM#n-#AwS}v+PQhTAQXk*Qb zp6|;xw6o`Ksvo=_5YKq&lT~R&Gzv2zjDPo=qV1Yj%8{ik*)0pF%2@uEt3;)il67~x z2BuHe-5huOuKzQIr)yi!csKQ{Osg+Vx>=btsigMG9rxRd#>~8}RjE)q zq#!<}h)bOsC4c%>7v+%E9@6=09sHNT4RQs;y}qtqF@6DMV}nh%YzmTlKm1H9oL^(u zOntfCBjDAF^8UN8H}A{s>>rbvyUge2zUMDqoEM(0IuvbIS5RdC`pc@S?10aga$EzJ zq|3dsNi$tpr)>E0hN70ODPhGoOX7B)*FK$vR{~x;&)&4Jld&OpTiM#%dvpAG<0fye zPF@xG#rK{n^q^N#}KD2JwblP+0(mw&&@8#;AfrwkohU+SA~qU3^$00WVO=wz#AxCJuEmN3mS828$ zpO|`HGvUk|lgs53r{@g$T-R^8ac4>8r!#6iqumN=!KF6(S1TPgK75a6Onc)O5jbnf zwr{5THksoUv^Yey>GM`P=6qRYBe=cIuPMYQx^wpXw(jBKp@Ij`D-$Ej%aRxI5=;k9 zB+6&s%5mCy<+7hSjhD1?Qc{YdLi#`{HMJ~$O{bSVqbFEpWBrmRoC1}--5zSoK3M9> zwEm^HpjZa+)XY+=deCyjf z_0)4(?kiue9GsHCTe2iEEjpx9|L%q|jlQLA4BG0Ui0zGjLFo^pJ$gPlD$MV-F$>R9 zNWFDd?Mzp~l5&$n`a_{;{o@PR^9ixfHpwt@-Q^XoG|H6~h=_v7G+F!6aVn!6vM5!w z{mRGUUXYzTTNK9iuP4=QDdQpy85uO-sr4-+sABgWtuS=&F1@O)Y3{1 z?pvVLcXx@^r-h4m$0{w%Td-=849m~ddyL!slTn-Jy(~1HtC@nI?fM|r_{j6yb83P< zn5g1k=?A?#Fga!a<*A*sho=~=F4gm8+D=NI`ipMc@ktZ)yEUe7y<=c_uW7=xK_7;} zV#O^+TeN#-+zv0C`SsC>S@X|b4>=*o+v4`VH%!MpHMG&>c*LQ}+TjlNhMX~Bl93L>D5I>(TOB$xvm>@3%hStyY%xdpUknc zptyxCUEVf*8Mb%4)8{~zvx!WAD>rAcOXdp&$G*J1s}}s0&5Bfi_lHJhbq!Wkmkb{Z zJ}q{ZOBonPo$XATvdA%EDwJzGd$lbI5P0f zUi_qftCvsRz4@*$2l*-ui{F|zZTXt>`t}*@)z^vDjq_K&s|_O8y-4xzeAZc)@!TkF zXQl52VpZ}}lbW^=cD4REuZP~l)S{Dzrxw4Q9$lhovAn?5rM&RS!tePtyUyjQ3XhaA zZ(Mo2|KXWOrN0!HDye=hx02^P*}ZXDMPALgr!seq5^o%}IIwXr;-KNunTOg9#vZ-2 z_~fzmPFIgi`tap&bIijtIVF9kqpw$-G#hpF)WEj0N$H#Qk4MOk`gL~piWA*cQ3C!v z{b zTw1qhjOK#f&qI|{-c%-E(Y<%CIx@YozVgrO9({EY{rjXtg3OAU$mlu5uR3Y{RjRHRL$=t~ZO`9oyr# zdr#G?14Yi&`RCC$}Qrp#m743K8FW^U50&UZH}EO@|a{i{mp4t`yIjoC~`ZShAK_GOa!<+16@v($~Qn@qthNtZ0{)^R-m&PGx4uS{Pio z*;%Yjjz7P%;pRB=fZ82~)msw}ZJN+So6<|*ojBm1IBQA#v_ozm?^yXbk^AIl>oBjp zzVx}`-tfWK9gLY-e5YT>1awRdk=fE^lU-^%tEr(s#&{k5y>rl#`K0s(mp0zFXt^LexI2H$@@cbfe6?FKXHs}~!fDl`Nrt&wb&u7L-`Z2U zGS4P;X7vz0k8SCHvG=IAw*7STZC+=N9($+v`3o~>tnAm?XrK4KRr}U7WrzwC_O05U z-abDN$EdFa2SEJm*&mG8x$K|xqJQlP_GzL#H~=2t^XsnP*<`9gQg9p}YIow|(`n+& zUv{ffN?JGvsr65$U(3B>Hdd7pb1_`6uGpXJvmH+jtwxIvgIyH}44_!A; zp{shAhciFPJ^jpI*Jw3Gu)fby*gtEVgXJNexsFqAy%e2z@!)oUak~=z?B20mD!ylJ zH^?vi)gd=_s%gW~gU9F1oH@*z;&k`;X<^ggUau``b6ZA7q?pcps+zF;Dq%?*J)5^v z_ib}x_-fB@qn5Y34}ErCoD{rEZsN1WYpsg0r@uwdPpNpZ!_sV1;S{gPaQ^M0$Ddxf zkAJbb$)~%U3%c>XKeBb15)ZXx|&>D+DvhSK?IV;h#Dr1wt@@{7r}f0Vy7W4dlC^ zJv=WaIYCgzX^`GRdqYUW|5=YT7wR8Ddu2$khoBGnD-a|2SO`{-7eaf4&l7?+vj*A?$@<3;8~14-Ym;t01UB|L389JxGIDM4AKj zMbN(zq34nzOTAPxUhLec`rKZE{9L7EL= zI^^NyFA4E80m2H%_dt92i4h6j@sdX4EMO?3{u;!H z-@73&Am0J);fEn4ZwT=7HHDMV|2jxVLs$&?M(AG)(wiX6gnSOfDiHQTu!H;{PCEY% zkXMEA^G4=>3*=`*eF5M{^sa?45%T9ChNqgOoe(S`{|4$2J?;?3LjK^${BMK2IpnKH z=6?g^;rX#b8pMcRK7{3v{{rpNd^$tW_&@Dkdvp}l8UH3QNF>nkeu)fVY7hxKv)S31 z4apMof)XAD0V@xg>`sy~yEE&|gc#IHj8rTl^|XSvsHGMZt5(`7YL9XN#e){>qf*3D z4z((_g_gEb@Y&zpoe8hz^xr;a?)l}L-`wxJkMFyW&2Dm+3VY{qx%jt&N09%r7k?eR z2>cO9=C74N4fr2m&*Hxr7zO@aFaG!gm)_;z2fX;F!6$-03(3aQ8ej(a$FOJdXJcj{ z`oGJIzXOgq2deaY$C*Z9pCPG1xPIUISp>=HKtd|7P$w z_;0=VTi}zxpNC}QX)Q1d{Btk<-Oc|UD4)fDDIh?9BP0PUfGOaIk#d+~1uF9zQV$>OyNm6|18xDX0DlkmEFM<_ zBf#(W;=dd`2L6^8|7*c71Ah{d`SY8=SHM4lJ&S*L^M9`w|3>J18TyYwGJk&qs0BX? zdlvsCz{TMAdGY@`cm?=DFa9QY3HWo6{eU}xnc$!OoB6*B<+Ju`z!>O12+08*KqdIQ z$Y<^O8ZaFE+vm*xH@)~9$RCgVpF*08)haj1L zCr}0c0qj})7Xl-}*L(550lW_Y?izRbR02)`p|PyJ~CTT*bya6XQ)y^wh7gMTP4 zpdQp0XYTjIQ6XqC;rommQ<|#_Vu@5D2~}36-8Pz)pi|fr5 zaE073PT)e^6mIF6_4{@Db+KB8APq$thBO>$1ky;Pi;zYkO+gY`&E-Z$2$hJDvz?^~ zbw((OO&AiFn__tfUSvr!vL9(D_u( zMss1`JFAt_p+qiMr@QlY+hGl)9bCPxEjzDq)JQd^tJ~*xh~_Zsxo&c*W@298WE*a( zu4QsHPGNboZ7ZQW4tq-UKsGnm(h)4TUUS?U+qP_?Qm_BDMoO=wLwO6}JDm|4mN!S& zlG$5~!K#$y=w5X=dq8(t#%#-A%_Ev#GiPQ^eOM|wyiI#q(}4GoQ#di8Y^iKYB!Uo z_3~Jcs#8tVTs=*+k7^Awxd5=*YEb*UxixeAcAYzZyT02T+bV}l>{was$9O*ioCJPX zg2M?X;fxu;01BWx02l>a2KXz2=@<^CX4V1o*c7Gg&nvBZtI5Be>uQM>!uN~YTEe|% zPODj6j~6S!^}pZ&!(4{-B`KsZeQYf?3A4P(Z59$%QYSwzX*jNCCiL7>j3>{g>$z)L zLZfC24Q!kcWw%5~!%SEBRD#K^X{te>^A0d{kAk1 zUA5SH1}ozkcC0gA6Z|5HH94)B?S9iNTj=VJ)1GdyQchRB4%SyaDKubRZ1KxM@m=}3 z47WXl6|EU-4>tUSoe#b1MadGVC558I71{i`?M^+W z$b3U@3ro-+7nY*Y5Dv6L8(DnQ2!YXnzAW?iO`?X@#zu@2J-3@NJqJ&WgrValP+Cu8 zN2l!U@HDWo>stD>KI@0i{5%umz|=8PlScLhgoZNM#rBB2>|O99@Ic^!zypB?0uKZp z2s{vYAn-uof&Xg{6cVwwPUnf=64#5H#K*;5;>+TG@vwM8{7md44U)!7A*n*DlNLz{ z={jk-v{qUt{Xp6(?UwdR??}IwPDvE*7akn04bKQK3^#;3!+Yd64!UE{xu*+^1|* zHYr<_$CRzglgcy7bIK0oMP-k&S9x7|OL<#4s2o<_Q$AFVD#w+NlvB!Q3a9dFzB))9 ztKL+0YuW0ujb$H~Q^f@peJj+80~H@u{I%kfik|Ty@zL?(xEQaB*T?6@m&A9(UyJXH zAB_`!U;72xGC#C9^it^c(BDI!gbKwGVpvqgYH^;pSiDxuh%3aE;+^o&o8lqyxY$eT zlvcqT8>OE}+oU7XxNrq}|8BTnsZv^5T3foRbYE#fWOO7JSrgeA*%vt(;p74G#d5Jc zOKy}`$Q$H`_3CEzS@oFuh1x4t5E~o2s%*>T1?9Jw-i#-51%EcP@$R1B`b1Azwu4+I_vJP>#w@Ic^! RzypB?0uKZp_;2vQKLN}^T;l)$ literal 0 HcmV?d00001 diff --git a/data/nsis/Plugins/x86-unicode/INetC.dll b/data/nsis/Plugins/x86-unicode/INetC.dll new file mode 100644 index 0000000000000000000000000000000000000000..b766595f2e8004898c52cb6fdea257ee186b1b3a GIT binary patch literal 25088 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 literal 0 HcmV?d00001 diff --git a/data/nsis/Plugins/x86-unicode/UAC.dll b/data/nsis/Plugins/x86-unicode/UAC.dll new file mode 100755 index 0000000000000000000000000000000000000000..97e7d15eae6e9a05289291b00c38da23e1128d95 GIT binary patch literal 14848 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 RzypB?0uKZp_;2vQKLN}^T;l)$ literal 0 HcmV?d00001 diff --git a/scripts/build-multiuser.nsi b/scripts/build-multiuser.nsi index 3a74b16dc..0cf5e99e0 100755 --- a/scripts/build-multiuser.nsi +++ b/scripts/build-multiuser.nsi @@ -37,7 +37,7 @@ ; A component has failed to install (e.g. FOP mirror is down) so you rerun for that component only ;--- -; Plugins, required to compile: +; Plugins, required to compile: (included in data\nsis) ; - ; nsExec (included in NSIS v3.0) for executing commands ; WordFunc.nsh (included in NSIS v3.0) for comparing versions @@ -49,6 +49,9 @@ ; Inetc (http://nsis.sourceforge.net/Inetc_plug-in) ; MD5 (http://nsis.sourceforge.net/MD5_plugin) ;--- +!addplugindir /x86-ansi "..\data\nsis\Plugins\x86-ansi\" +!addplugindir /x86-unicode "..\data\nsis\Plugins\x86-unicode\" +!addincludedir "..\data\nsis\Include\" ;------------------------------ ; GENERAL @@ -139,8 +142,8 @@ CRCCheck on ; NsisMultiUser - all settings need to be set before including the NsisMultiUser.nsh header file. ; thanks to Richard Drizin https://github.com/Drizin/NsisMultiUser !include "NsisMultiUser.nsh" -!include "MUI2.nsh" !include "UAC.nsh" +!include "MUI2.nsh" !include "WordFunc.nsh" !include "FileFunc.nsh" From eec8ce5c06cf151a05a77658204b5417ead14a64 Mon Sep 17 00:00:00 2001 From: RoDuth Date: Tue, 17 Oct 2017 20:08:19 +1000 Subject: [PATCH 13/25] setup.py nsis --- setup.py | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/setup.py b/setup.py index a5bedfdbd..a733ad349 100755 --- a/setup.py +++ b/setup.py @@ -196,9 +196,13 @@ def finalize_options(self): pass def run(self): - nsis_compiler = 'makensis' + # if all(parts in (None, "") for parts in (sp, rank, cv)): + envars = ['programw6432', 'programfiles', 'localappdata'] + mns = 'nsis\\makensis' + locs = [os.path.join(os.getenv(var, 'c:\\'), mns) for var in envars] + makensis = [loc for loc in locs if spawn.find_executable(loc)][0] nsis_script = 'scripts\\build-multiuser.nsi' - os.system('%s %s' % (nsis_compiler, nsis_script)) + os.system('%s %s' % (makensis, nsis_script)) else: py2exe_options = {} From 6980d04d091b1c969a24f410ed3922d066cfb010 Mon Sep 17 00:00:00 2001 From: RoDuth Date: Tue, 17 Oct 2017 22:04:40 +1000 Subject: [PATCH 14/25] improving setup.py nsis --- setup.py | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/setup.py b/setup.py index a733ad349..2ebb562f7 100755 --- a/setup.py +++ b/setup.py @@ -199,10 +199,17 @@ def run(self): # if all(parts in (None, "") for parts in (sp, rank, cv)): envars = ['programw6432', 'programfiles', 'localappdata'] mns = 'nsis\\makensis' - locs = [os.path.join(os.getenv(var, 'c:\\'), mns) for var in envars] - makensis = [loc for loc in locs if spawn.find_executable(loc)][0] nsis_script = 'scripts\\build-multiuser.nsi' - os.system('%s %s' % (makensis, nsis_script)) + locs = [os.path.join(os.getenv(ev, 'c:\\'), mns) for ev in envars] + makensis = ([loc for loc in locs if spawn.find_executable(loc)] + + [spawn.find_executable('makensis')])[0] + if not makensis: + msg = ('** Error: Building Ghini.desktop NSIS installer ' + 'requires NSIS to be installed somewhere easy to find') + print msg + sys.exit(1) + print 'using %s to build %s' % (makensis, nsis_script) + os.system('"%s" %s' % (makensis, nsis_script)) else: py2exe_options = {} From d06ca96ac1c855e59ff5190ba65992faad38a3a9 Mon Sep 17 00:00:00 2001 From: RoDuth Date: Wed, 18 Oct 2017 20:50:45 +1000 Subject: [PATCH 15/25] Replacing temp devinstall script with build_nsis --- scripts/build_nsis.bat | 41 ++++++++++++++ scripts/devinstall-wininstaller.bat | 83 ----------------------------- 2 files changed, 41 insertions(+), 83 deletions(-) create mode 100644 scripts/build_nsis.bat delete mode 100644 scripts/devinstall-wininstaller.bat diff --git a/scripts/build_nsis.bat b/scripts/build_nsis.bat new file mode 100644 index 000000000..8648bcf57 --- /dev/null +++ b/scripts/build_nsis.bat @@ -0,0 +1,41 @@ +@echo off + +IF NOT EXIST %HOMEDRIVE%%HOMEPATH%\.virtualenvs\ghi2exe\ ( + ECHO creating an isolated virtual environment to build in + virtualenv --system-site-packages %HOMEDRIVE%%HOMEPATH%\.virtualenvs\ghi2exe +) + +IF "%VIRTUAL_ENV%"=="" ( + ECHO Activating virtual environment to build in. + call %HOMEDRIVE%%HOMEPATH%\.virtualenvs\ghi2exe\Scripts\activate.bat +) else ( + ECHO Currently using virtual environment: "%VIRTUAL_ENV%" + IF NOT "%VIRTUAL_ENV%"=="%HOMEDRIVE%%HOMEPATH%\.virtualenvs\ghi2exe" ( + ECHO deactivating previous virtual environment and activating one to build in + deactivate + call %HOMEDRIVE%%HOMEPATH%\.virtualenvs\ghi2exe\Scripts\activate.bat + ) +) + +ECHO clearing previous checkouts +for /F "delims=" %%i in ( + 'dir /b %VIRTUAL_ENV%\Lib\site-packages\ghini.desktop-*egg' +) do ( + rmdir "%VIRTUAL_ENV%\Lib\site-packages\""%%i" /s/q 2>NUL +) + +ECHO Installing dependancies +pip install py2exe_py2 +pip install lxml +pip install psycopg2 +pip install Pygments + +ECHO building and installing ghini.desktop - without eggs +python setup.py build +python setup.py install --old-and-unmanageable + +ECHO building frozen distribution +python setup.py py2exe + +ECHO building NSIS installer +python setup.py nsis diff --git a/scripts/devinstall-wininstaller.bat b/scripts/devinstall-wininstaller.bat deleted file mode 100644 index 754ce3b9a..000000000 --- a/scripts/devinstall-wininstaller.bat +++ /dev/null @@ -1,83 +0,0 @@ -@echo off -ECHO sanity check - -SET SHOULD_CANCEL=0 - -python -c "1" 2>NUL -IF %ERRORLEVEL% NEQ 0 ( - ECHO Python not properly installed - SET SHOULD_CANCEL=1 - goto SKIP_GTK_TEST -) -python -c "import gtk" 2>NUL -IF %ERRORLEVEL% NEQ 0 ( - ECHO PyGtk not properly installed - SET SHOULD_CANCEL=1 -) -:SKIP_GTK_TEST -git --version 2>NUL >NUL -IF %ERRORLEVEL% NEQ 0 ( - ECHO git not properly installed - SET SHOULD_CANCEL=1 -) - -IF %SHOULD_CANCEL% NEQ 0 exit /b -ECHO sanity check passed - -IF %1.==. GOTO DEFAULTCHOICE -set CHECKOUT=ghini-%1 -GOTO CONTINUE - -:DEFAULTCHOICE -set CHECKOUT=ghini-1.0-wininstaller - -:CONTINUE - -ECHO going to install %CHECKOUT% -cd "%HOMEDRIVE%%HOMEPATH%" - -ECHO installing dependencies -pip install virtualenv 2>NUL -virtualenv --system-site-packages .virtualenvs\ghi2exe - -ECHO clearing previous checkouts -for /F "delims=" %%i in ( - 'dir /b .virtualenvs\ghi2exe\Lib\site-packages\bauble-*egg' -) do ( - rmdir ".virtualenvs\ghi2exe\Lib\site-packages\""%%i" /s/q 2>NUL -) - -ECHO going to checkout %CHECKOUT% -call .virtualenvs\ghi2exe\Scripts\activate.bat -mkdir Local\github\Ghini 2>NUL -cd Local\github\Ghini -git clone https://github.com/RoDuth/ghini.desktop.git -cd ghini.desktop -git checkout %CHECKOUT% -git pull - -ECHO create the program shortcut -pip install pypiwin32 2>NUL -python scripts\mklnk.py - -pip install psycopg2 -pip install lxml -pip install Pygments -pip install py2exe_py2 - -ECHO going to build and install -python setup.py build -python setup.py install -mkdir "%APPDATA%\Ghini" 2>NUL -cd "%HOMEPATH%" - -ECHO create the globalizing script -IF DEFINED PUBLIC (SET AUDESKTOP=%PUBLIC%\Desktop) & (SET AUSTARTMENU=%PROGRAMDATA%\Microsoft\Windows\Start Menu) ELSE (SET AUDESKTOP=%ALLUSERSPROFILE%\Desktop) & (SET AUSTARTMENU=%ALLUSERSPROFILE%\Start Menu) -( -echo @echo off -echo mkdir "%AUSTARTMENU%\Programs\Ghini" -echo copy "%HOMEDRIVE%%HOMEPATH%"\Local\github\Ghini\ghini.desktop\scripts\ghini.lnk "%AUSTARTMENU%\Programs\Ghini" -) > devinstall-finalize.bat - -ECHO please run devinstall-finalize.bat as administrator. -pause From f24c4fbf58bdef5d9f4bbe7b1700063d9c949ff4 Mon Sep 17 00:00:00 2001 From: RoDuth Date: Wed, 18 Oct 2017 21:45:23 +1000 Subject: [PATCH 16/25] Small improvements to build_nsis.bat --- scripts/build_nsis.bat | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/scripts/build_nsis.bat b/scripts/build_nsis.bat index 8648bcf57..70c7b3cf7 100644 --- a/scripts/build_nsis.bat +++ b/scripts/build_nsis.bat @@ -1,7 +1,8 @@ @echo off -IF NOT EXIST %HOMEDRIVE%%HOMEPATH%\.virtualenvs\ghi2exe\ ( +IF NOT EXIST %HOMEDRIVE%%HOMEPATH%\.virtualenvs\ghi2exe\Scripts\activate.bat ( ECHO creating an isolated virtual environment to build in + pip install virtualenv virtualenv --system-site-packages %HOMEDRIVE%%HOMEPATH%\.virtualenvs\ghi2exe ) From d0cf0192347fae4d53acaad23d3b6216b90ae6dc Mon Sep 17 00:00:00 2001 From: RoDuth Date: Fri, 20 Oct 2017 10:18:40 +1000 Subject: [PATCH 17/25] Changing name of nsis build batch file --- scripts/{build_nsis.bat => build_win.bat} | 16 +++++++--------- 1 file changed, 7 insertions(+), 9 deletions(-) rename scripts/{build_nsis.bat => build_win.bat} (78%) diff --git a/scripts/build_nsis.bat b/scripts/build_win.bat similarity index 78% rename from scripts/build_nsis.bat rename to scripts/build_win.bat index 70c7b3cf7..c99bce047 100644 --- a/scripts/build_nsis.bat +++ b/scripts/build_win.bat @@ -18,25 +18,23 @@ IF "%VIRTUAL_ENV%"=="" ( ) ) -ECHO clearing previous checkouts -for /F "delims=" %%i in ( - 'dir /b %VIRTUAL_ENV%\Lib\site-packages\ghini.desktop-*egg' -) do ( - rmdir "%VIRTUAL_ENV%\Lib\site-packages\""%%i" /s/q 2>NUL -) - ECHO Installing dependancies pip install py2exe_py2 pip install lxml pip install psycopg2 pip install Pygments -ECHO building and installing ghini.desktop - without eggs -python setup.py build +ECHO cleaning up +python setup.py clean + +ECHO installing dependencies - without eggs python setup.py install --old-and-unmanageable ECHO building frozen distribution python setup.py py2exe +REM Freeze only? +if "%1"=="/f" GOTO :EOF + ECHO building NSIS installer python setup.py nsis From c2a63539ee27e50f02235edca55650f86ddc4242 Mon Sep 17 00:00:00 2001 From: RoDuth Date: Fri, 20 Oct 2017 10:19:04 +1000 Subject: [PATCH 18/25] build nsis doc --- doc/build_win.rst | 99 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 99 insertions(+) create mode 100644 doc/build_win.rst diff --git a/doc/build_win.rst b/doc/build_win.rst new file mode 100644 index 000000000..5804fbe9d --- /dev/null +++ b/doc/build_win.rst @@ -0,0 +1,99 @@ +Building a Windows installer +----------------------------- + +For building a Windows installer you will need an installation of Windows. The +method described here has been used successfully on Windows 7, 8 and 10. Vista +should also work but has not been tested. + + +.. admonition:: technical note + :class: note + + If you do not have Windows, yet still wish to produce an installer, + a virtual machine will suffice. Virtual machine images are available `here + from Microsoft + `_. + +.. admonition:: already installed? + :class: note + + There are many similarities to the usual installation process here. if you + have already installed ghini.desktop you can skip the first two steps and + proceed to step 3 + +#. Download and install the git, Python and PyGTK external dependencies as + outlined in the installation instructions. You can use the direct links + provided here. (`git `_, `Python `_, `PyGTK `_) but + remember to select to put Python in the PATH and install **all** components + of PyGTK. + +#. Download and install `Microsoft Visual C++ Compiler for Python 2.7 + `_. + +#. Download and install `NSIS v3 `_. + (Unless you only wish to freeze the code - see below) + +#. **Reboot** + +#. Clone ghini.desktop to wherever you want to keep it and checkout the branch + you wish to build. To do this, open a command prompt and type these + commands:: + + cd + git clone https://github.com/Ghini/ghini.desktop.git + cd ghini.desktop + git checkout ghini-1.0 + + .. admonition:: technical note + :class: note + + If working in a Virtual machine this would be a good place to take + a snapshot. You will be able to immediately return to this point in the + process without waiting for the virtual machine to boot. + + .. admonition:: already installed? + :class: note + + If you have already installed ghini.desktop following the installation + procedure you can just use that copy instead. In this situation you would + only need to enter ``cd %HOMEPATH%\Local\github\Ghini\ghini.desktop`` for + this step. + +#. Build the installer: Assuming the command prompt from the last step is + still open (or just open a new one and ``cd ``) + run this command:: + + scripts\build_win.bat + + This should leave a file named ``ghini.desktop--setup.exe`` in the + ``scripts`` folder of ghini.desktop. This is your Windows installer. + + It is also worth noting that the ``dist`` folder will contain a full working + copy of the software in a frozen, self contained state, that can be + transferred however you like and will work in place. (e.g. placed on a USB + flash drive for demonstration purposes or copied manually to ``C:\Program + Files``). If all you want is this frozen copy then you will not need to + install NSIS and can run the above command with the '/f' switch (i.e. + ``scripts\build_win.bat /f``). + +In future if you wish to build further installers just open a command prompt +and enter:: + + cd + git pull + scripts\build_win.bat + +.. admonition:: technical note + :class: note + + If you have been using a virtual machine as descibed here you would just + restore the snapshot and use ``git pull`` followed by + ``scripts\build_win.bat`` + +.. _Direct link to download git: https://github.com/git-for-windows/git/releases/download/v2.13.3.windows.1/Git-2.13.3-32-bit.exe +.. _Direct link to download Python: https://www.python.org/ftp/python/2.7.12/python-2.7.12.msi +.. _Direct link to download lxml: https://pypi.python.org/packages/2.7/l/lxml/lxml-3.6.0.win32-py2.7.exe +.. _Direct link to download PyGTK: http://ftp.gnome.org/pub/GNOME/binaries/win32/pygtk/2.24/pygtk-all-in-one-2.24.2.win32-py2.7.msi +.. _Direct link to download psycopg2: http://www.stickpeople.com/projects/python/win-psycopg/2.6.1/psycopg2-2.6.1.win32-py2.7-pg9.4.4-release.exe + From ac5dbd88ebde85a8dfeec73f32e9fd40494bc4f7 Mon Sep 17 00:00:00 2001 From: RoDuth Date: Fri, 20 Oct 2017 12:06:15 +1000 Subject: [PATCH 19/25] adding details --- doc/build_win.rst | 43 +++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 41 insertions(+), 2 deletions(-) diff --git a/doc/build_win.rst b/doc/build_win.rst index 5804fbe9d..4a1d57422 100644 --- a/doc/build_win.rst +++ b/doc/build_win.rst @@ -1,5 +1,6 @@ +============================ Building a Windows installer ------------------------------ +============================ For building a Windows installer you will need an installation of Windows. The method described here has been used successfully on Windows 7, 8 and 10. Vista @@ -34,7 +35,7 @@ should also work but has not been tested. #. Download and install `NSIS v3 `_. (Unless you only wish to freeze the code - see below) -#. **Reboot** +#. A **reboot** is recommended. #. Clone ghini.desktop to wherever you want to keep it and checkout the branch you wish to build. To do this, open a command prompt and type these @@ -91,6 +92,44 @@ and enter:: restore the snapshot and use ``git pull`` followed by ``scripts\build_win.bat`` + +.. admonition:: about the installer + :class: note + + - The installer is capable of single user or global installs. + + - At this point in time the ghini.desktop installed this way will not check + or or notify you of any updated version. You will need to check + yourself. + + - The installer is capable of downloading extra components: + + - Apache FOP - If you plan on using xslt templates to produce PDFs then + install FOP. There is no uninstaller with this component. FOP + requires the Java Runtime so if you do not currently have it installed + the ghini.desktop installer will let you know and can open the Oracle + web site for you to download and install it from. + + - MS Visual C runtime - You most likely don't need this but if you have + any trouble getting ghini.desktop to run try installing the MS Visual + C runtime (rerun the installer and select this component only). + + - Can be run silently using switches (e.g. for remote deployment) where: + + - ``/S`` for silent; + + - ``/AllUser`` or ``/CurrentUser`` + + - ``/C=[gFC]`` to specify components where: + + g = Deselect the main ghini.desktop component (used for component + only installs) + + F = select Apache FOP + + C = select MS Visual C runtime + + .. _Direct link to download git: https://github.com/git-for-windows/git/releases/download/v2.13.3.windows.1/Git-2.13.3-32-bit.exe .. _Direct link to download Python: https://www.python.org/ftp/python/2.7.12/python-2.7.12.msi .. _Direct link to download lxml: https://pypi.python.org/packages/2.7/l/lxml/lxml-3.6.0.win32-py2.7.exe From 9e49b7083c3f4878c6415015d47ed2dff53038cc Mon Sep 17 00:00:00 2001 From: RoDuth Date: Fri, 20 Oct 2017 12:44:04 +1000 Subject: [PATCH 20/25] More edits --- doc/build_win.rst | 24 +++++++++++++----------- 1 file changed, 13 insertions(+), 11 deletions(-) diff --git a/doc/build_win.rst b/doc/build_win.rst index 4a1d57422..eaa97e143 100644 --- a/doc/build_win.rst +++ b/doc/build_win.rst @@ -3,8 +3,8 @@ Building a Windows installer ============================ For building a Windows installer you will need an installation of Windows. The -method described here has been used successfully on Windows 7, 8 and 10. Vista -should also work but has not been tested. +method described here has been used successfully on Windows 7, 8 and 10. +Windows Vista should also work but has not been tested. .. admonition:: technical note @@ -46,13 +46,6 @@ should also work but has not been tested. cd ghini.desktop git checkout ghini-1.0 - .. admonition:: technical note - :class: note - - If working in a Virtual machine this would be a good place to take - a snapshot. You will be able to immediately return to this point in the - process without waiting for the virtual machine to boot. - .. admonition:: already installed? :class: note @@ -70,13 +63,22 @@ should also work but has not been tested. This should leave a file named ``ghini.desktop--setup.exe`` in the ``scripts`` folder of ghini.desktop. This is your Windows installer. + .. admonition:: technical note + :class: note + + If working in a virtual machine this would be a good place to take + a snapshot. You will be able to immediately return to this point, where + all requirements are installed and a command prompt is open at the + correct place, without waiting for the virtual machine to boot. + It is also worth noting that the ``dist`` folder will contain a full working copy of the software in a frozen, self contained state, that can be - transferred however you like and will work in place. (e.g. placed on a USB + transferred however you like and will work in place. (e.g. placed on a USB flash drive for demonstration purposes or copied manually to ``C:\Program Files``). If all you want is this frozen copy then you will not need to install NSIS and can run the above command with the '/f' switch (i.e. - ``scripts\build_win.bat /f``). + ``scripts\build_win.bat /f``). To start ghini.desktop double click + ``ghini.exe`` in explorer or (create a shortcut to it). In future if you wish to build further installers just open a command prompt and enter:: From 2b3690928fe3c6115d7db2ec149e9e595ad9551e Mon Sep 17 00:00:00 2001 From: RoDuth Date: Fri, 20 Oct 2017 19:56:04 +1000 Subject: [PATCH 21/25] Changing to pip install simplifies things --- doc/build_win.rst | 5 +---- scripts/build_win.bat | 3 +-- setup.cfg | 3 --- 3 files changed, 2 insertions(+), 9 deletions(-) diff --git a/doc/build_win.rst b/doc/build_win.rst index eaa97e143..c575b548e 100644 --- a/doc/build_win.rst +++ b/doc/build_win.rst @@ -20,7 +20,7 @@ Windows Vista should also work but has not been tested. There are many similarities to the usual installation process here. if you have already installed ghini.desktop you can skip the first two steps and - proceed to step 3 + proceed to step 4 #. Download and install the git, Python and PyGTK external dependencies as outlined in the installation instructions. You can use the direct links @@ -29,9 +29,6 @@ Windows Vista should also work but has not been tested. remember to select to put Python in the PATH and install **all** components of PyGTK. -#. Download and install `Microsoft Visual C++ Compiler for Python 2.7 - `_. - #. Download and install `NSIS v3 `_. (Unless you only wish to freeze the code - see below) diff --git a/scripts/build_win.bat b/scripts/build_win.bat index c99bce047..575d4148f 100644 --- a/scripts/build_win.bat +++ b/scripts/build_win.bat @@ -20,7 +20,6 @@ IF "%VIRTUAL_ENV%"=="" ( ECHO Installing dependancies pip install py2exe_py2 -pip install lxml pip install psycopg2 pip install Pygments @@ -28,7 +27,7 @@ ECHO cleaning up python setup.py clean ECHO installing dependencies - without eggs -python setup.py install --old-and-unmanageable +pip install . ECHO building frozen distribution python setup.py py2exe diff --git a/setup.cfg b/setup.cfg index 6cd85b683..5b261574e 100644 --- a/setup.cfg +++ b/setup.cfg @@ -1,9 +1,6 @@ [sdist] formats=bztar,gztar,zip -[easy_install] -zip_ok = False - [nosetests] #match=^test #nocapture=0 From dac0f49b977bae82b3c411ee1add9bc3ff40208a Mon Sep 17 00:00:00 2001 From: RoDuth Date: Sat, 21 Oct 2017 20:12:24 +1000 Subject: [PATCH 22/25] NSIS - Cleaning up and bringing it all together - Cleaning up the NSIS plugins stored in data\nsis to include the full zipped versions used for the build script plus the files used by the script in place. - Tidy up and complete setup.py custom nsis command. --- data/nsis/Contrib/Inetc/afxres.h | 2 - data/nsis/Contrib/Inetc/api.h | 83 - data/nsis/Contrib/Inetc/crt.cpp | 105 - data/nsis/Contrib/Inetc/inetc.cpp | 1731 ----------------- data/nsis/Contrib/Inetc/inetc.rc | 199 -- data/nsis/Contrib/Inetc/inetc.sln | 42 - data/nsis/Contrib/Inetc/inetc.vcxproj | 441 ----- data/nsis/Contrib/Inetc/inetc.vcxproj.filters | 52 - data/nsis/Contrib/Inetc/nsis_tchar.h | 229 --- data/nsis/Contrib/Inetc/pluginapi.c | 294 --- data/nsis/Contrib/Inetc/pluginapi.h | 104 - data/nsis/Contrib/Inetc/resource.h | 47 - data/nsis/Contrib/md5dll/MD5.cpp | 367 ---- data/nsis/Contrib/md5dll/MD5.h | 100 - data/nsis/Contrib/md5dll/MD5Example.nsi | 55 - data/nsis/Contrib/md5dll/api.h | 83 - data/nsis/Contrib/md5dll/build.bat | 17 - data/nsis/Contrib/md5dll/md5dll.cpp | 140 -- data/nsis/Contrib/md5dll/md5dll.def | 10 - data/nsis/Contrib/md5dll/md5dll.rc | 100 - data/nsis/Contrib/md5dll/nsis_tchar.h | 215 -- data/nsis/Contrib/md5dll/pluginapi.h | 103 - .../nsis/Contrib/nsisunz/AggressiveOptimize.h | 92 - data/nsis/Contrib/nsisunz/example.nsi | 95 - data/nsis/Contrib/nsisunz/example_mui.nsi | 101 - data/nsis/Contrib/nsisunz/exdll.h | 116 -- data/nsis/Contrib/nsisunz/info.rtf | Bin 641 -> 0 bytes data/nsis/Contrib/nsisunz/miniclib.c | 366 ---- data/nsis/Contrib/nsisunz/miniclib.h | 110 -- data/nsis/Contrib/nsisunz/nsisunz.cpp | 567 ------ data/nsis/Contrib/nsisunz/nsisunz.dsp | 170 -- data/nsis/Contrib/nsisunz/nsisunz.dsw | 29 - data/nsis/Contrib/nsisunz/nsisunz.ncb | Bin 82944 -> 0 bytes data/nsis/Contrib/nsisunz/nsisunz.plg | 57 - data/nsis/Contrib/nsisunz/nsisunz.sln | 21 - data/nsis/Contrib/nsisunz/nsisunz.vcproj | 396 ---- data/nsis/Contrib/nsisunz/nsisunz_readme.html | 361 ---- data/nsis/Contrib/nsisunz/nsisunz_setup.nsi | 148 -- data/nsis/Contrib/nsisunz/readme.kjd | 12 - data/nsis/Contrib/nsisunz/zippage.ini | 65 - data/nsis/Contrib/nsisunz/zlib/ADLER32.C | 74 - data/nsis/Contrib/nsisunz/zlib/CRC32.C | 333 ---- data/nsis/Contrib/nsisunz/zlib/INFFAST.C | 305 --- data/nsis/Contrib/nsisunz/zlib/INFFAST.H | 11 - data/nsis/Contrib/nsisunz/zlib/INFFIXED.H | 94 - data/nsis/Contrib/nsisunz/zlib/INFLATE.C | 1274 ------------ data/nsis/Contrib/nsisunz/zlib/INFTREES.C | 328 ---- data/nsis/Contrib/nsisunz/zlib/INFTREES.H | 55 - data/nsis/Contrib/nsisunz/zlib/README | 126 -- data/nsis/Contrib/nsisunz/zlib/UNZIP.H | 275 --- data/nsis/Contrib/nsisunz/zlib/Unzip.c | 1297 ------------ data/nsis/Contrib/nsisunz/zlib/ZCONF.H | 330 ---- data/nsis/Contrib/nsisunz/zlib/ZLIB.H | 1200 ------------ data/nsis/Contrib/nsisunz/zlib/ZUTIL.H | 254 --- data/nsis/Contrib/nsisunz/zlib/Zutil.c | 44 - data/nsis/Contrib/nsisunz/zlib/crc32.h | 441 ----- data/nsis/Contrib/nsisunz/zlib/inflate.h | 117 -- data/nsis/Docs/Inetc/Readme.htm | 153 -- data/nsis/Docs/Inetc/wiki.txt | 161 -- data/nsis/Docs/md5dll/readme.txt | 68 - data/nsis/Docs/nsisunz/nsisunz_readme.html | 361 ---- data/nsis/Examples/Inetc/Example.nsi | 54 - data/nsis/Examples/Inetc/auth_dlg.nsi | 32 - data/nsis/Examples/Inetc/ftp_auth.nsi | 32 - data/nsis/Examples/Inetc/head.nsi | 30 - data/nsis/Examples/Inetc/headers.nsi | 32 - data/nsis/Examples/Inetc/headers.php | 7 - data/nsis/Examples/Inetc/https.nsi | 27 - data/nsis/Examples/Inetc/inetc_local.nsi | 81 - data/nsis/Examples/Inetc/post.nsi | 31 - data/nsis/Examples/Inetc/post.php | 13 - data/nsis/Examples/Inetc/post_file.nsi | 31 - data/nsis/Examples/Inetc/post_file.php | 10 - data/nsis/Examples/Inetc/post_form.html | 18 - data/nsis/Examples/Inetc/put.nsi | 31 - data/nsis/Examples/Inetc/put.php | 19 - data/nsis/Examples/Inetc/recursive.nsi | 65 - data/nsis/Examples/Inetc/redirect.nsi | 31 - data/nsis/Examples/Inetc/redirect.php | 6 - data/nsis/Examples/Inetc/timeout.nsi | 32 - data/nsis/Examples/Inetc/tostack.nsi | 32 - data/nsis/Examples/Inetc/translate.nsi | 33 - data/nsis/Inetc.zip | Bin 0 -> 82721 bytes data/nsis/Md5dll.zip | Bin 0 -> 22087 bytes data/nsis/NsisMultiUser.zip | Bin 0 -> 146343 bytes data/nsis/Nsisunz.zip | Bin 0 -> 141287 bytes doc/build_win.rst | 25 +- scripts/build_win.bat | 4 +- setup.py | 63 +- 89 files changed, 52 insertions(+), 15213 deletions(-) delete mode 100644 data/nsis/Contrib/Inetc/afxres.h delete mode 100644 data/nsis/Contrib/Inetc/api.h delete mode 100644 data/nsis/Contrib/Inetc/crt.cpp delete mode 100644 data/nsis/Contrib/Inetc/inetc.cpp delete mode 100644 data/nsis/Contrib/Inetc/inetc.rc delete mode 100644 data/nsis/Contrib/Inetc/inetc.sln delete mode 100644 data/nsis/Contrib/Inetc/inetc.vcxproj delete mode 100644 data/nsis/Contrib/Inetc/inetc.vcxproj.filters delete mode 100644 data/nsis/Contrib/Inetc/nsis_tchar.h delete mode 100644 data/nsis/Contrib/Inetc/pluginapi.c delete mode 100644 data/nsis/Contrib/Inetc/pluginapi.h delete mode 100644 data/nsis/Contrib/Inetc/resource.h delete mode 100644 data/nsis/Contrib/md5dll/MD5.cpp delete mode 100644 data/nsis/Contrib/md5dll/MD5.h delete mode 100644 data/nsis/Contrib/md5dll/MD5Example.nsi delete mode 100644 data/nsis/Contrib/md5dll/api.h delete mode 100644 data/nsis/Contrib/md5dll/build.bat delete mode 100644 data/nsis/Contrib/md5dll/md5dll.cpp delete mode 100644 data/nsis/Contrib/md5dll/md5dll.def delete mode 100644 data/nsis/Contrib/md5dll/md5dll.rc delete mode 100644 data/nsis/Contrib/md5dll/nsis_tchar.h delete mode 100644 data/nsis/Contrib/md5dll/pluginapi.h delete mode 100644 data/nsis/Contrib/nsisunz/AggressiveOptimize.h delete mode 100644 data/nsis/Contrib/nsisunz/example.nsi delete mode 100644 data/nsis/Contrib/nsisunz/example_mui.nsi delete mode 100644 data/nsis/Contrib/nsisunz/exdll.h delete mode 100644 data/nsis/Contrib/nsisunz/info.rtf delete mode 100644 data/nsis/Contrib/nsisunz/miniclib.c delete mode 100644 data/nsis/Contrib/nsisunz/miniclib.h delete mode 100644 data/nsis/Contrib/nsisunz/nsisunz.cpp delete mode 100644 data/nsis/Contrib/nsisunz/nsisunz.dsp delete mode 100644 data/nsis/Contrib/nsisunz/nsisunz.dsw delete mode 100644 data/nsis/Contrib/nsisunz/nsisunz.ncb delete mode 100644 data/nsis/Contrib/nsisunz/nsisunz.plg delete mode 100644 data/nsis/Contrib/nsisunz/nsisunz.sln delete mode 100644 data/nsis/Contrib/nsisunz/nsisunz.vcproj delete mode 100644 data/nsis/Contrib/nsisunz/nsisunz_readme.html delete mode 100644 data/nsis/Contrib/nsisunz/nsisunz_setup.nsi delete mode 100644 data/nsis/Contrib/nsisunz/readme.kjd delete mode 100644 data/nsis/Contrib/nsisunz/zippage.ini delete mode 100644 data/nsis/Contrib/nsisunz/zlib/ADLER32.C delete mode 100644 data/nsis/Contrib/nsisunz/zlib/CRC32.C delete mode 100644 data/nsis/Contrib/nsisunz/zlib/INFFAST.C delete mode 100644 data/nsis/Contrib/nsisunz/zlib/INFFAST.H delete mode 100644 data/nsis/Contrib/nsisunz/zlib/INFFIXED.H delete mode 100644 data/nsis/Contrib/nsisunz/zlib/INFLATE.C delete mode 100644 data/nsis/Contrib/nsisunz/zlib/INFTREES.C delete mode 100644 data/nsis/Contrib/nsisunz/zlib/INFTREES.H delete mode 100644 data/nsis/Contrib/nsisunz/zlib/README delete mode 100644 data/nsis/Contrib/nsisunz/zlib/UNZIP.H delete mode 100644 data/nsis/Contrib/nsisunz/zlib/Unzip.c delete mode 100644 data/nsis/Contrib/nsisunz/zlib/ZCONF.H delete mode 100644 data/nsis/Contrib/nsisunz/zlib/ZLIB.H delete mode 100644 data/nsis/Contrib/nsisunz/zlib/ZUTIL.H delete mode 100644 data/nsis/Contrib/nsisunz/zlib/Zutil.c delete mode 100644 data/nsis/Contrib/nsisunz/zlib/crc32.h delete mode 100644 data/nsis/Contrib/nsisunz/zlib/inflate.h delete mode 100644 data/nsis/Docs/Inetc/Readme.htm delete mode 100644 data/nsis/Docs/Inetc/wiki.txt delete mode 100644 data/nsis/Docs/md5dll/readme.txt delete mode 100644 data/nsis/Docs/nsisunz/nsisunz_readme.html delete mode 100644 data/nsis/Examples/Inetc/Example.nsi delete mode 100644 data/nsis/Examples/Inetc/auth_dlg.nsi delete mode 100644 data/nsis/Examples/Inetc/ftp_auth.nsi delete mode 100644 data/nsis/Examples/Inetc/head.nsi delete mode 100644 data/nsis/Examples/Inetc/headers.nsi delete mode 100644 data/nsis/Examples/Inetc/headers.php delete mode 100644 data/nsis/Examples/Inetc/https.nsi delete mode 100644 data/nsis/Examples/Inetc/inetc_local.nsi delete mode 100644 data/nsis/Examples/Inetc/post.nsi delete mode 100644 data/nsis/Examples/Inetc/post.php delete mode 100644 data/nsis/Examples/Inetc/post_file.nsi delete mode 100644 data/nsis/Examples/Inetc/post_file.php delete mode 100644 data/nsis/Examples/Inetc/post_form.html delete mode 100644 data/nsis/Examples/Inetc/put.nsi delete mode 100644 data/nsis/Examples/Inetc/put.php delete mode 100644 data/nsis/Examples/Inetc/recursive.nsi delete mode 100644 data/nsis/Examples/Inetc/redirect.nsi delete mode 100644 data/nsis/Examples/Inetc/redirect.php delete mode 100644 data/nsis/Examples/Inetc/timeout.nsi delete mode 100644 data/nsis/Examples/Inetc/tostack.nsi delete mode 100644 data/nsis/Examples/Inetc/translate.nsi create mode 100644 data/nsis/Inetc.zip create mode 100644 data/nsis/Md5dll.zip create mode 100755 data/nsis/NsisMultiUser.zip create mode 100644 data/nsis/Nsisunz.zip diff --git a/data/nsis/Contrib/Inetc/afxres.h b/data/nsis/Contrib/Inetc/afxres.h deleted file mode 100644 index 3fbfaa463..000000000 --- a/data/nsis/Contrib/Inetc/afxres.h +++ /dev/null @@ -1,2 +0,0 @@ -#include -#define IDC_STATIC (-1) diff --git a/data/nsis/Contrib/Inetc/api.h b/data/nsis/Contrib/Inetc/api.h deleted file mode 100644 index e871de3d4..000000000 --- a/data/nsis/Contrib/Inetc/api.h +++ /dev/null @@ -1,83 +0,0 @@ -/* - * apih - * - * This file is a part of NSIS. - * - * Copyright (C) 1999-2013 Nullsoft and Contributors - * - * Licensed under the zlib/libpng license (the "License"); - * you may not use this file except in compliance with the License. - * - * Licence details can be found in the file COPYING. - * - * This software is provided 'as-is', without any express or implied - * warranty. - */ - -#ifndef _NSIS_EXEHEAD_API_H_ -#define _NSIS_EXEHEAD_API_H_ - -// Starting with NSIS 2.42, you can check the version of the plugin API in exec_flags->plugin_api_version -// The format is 0xXXXXYYYY where X is the major version and Y is the minor version (MAKELONG(y,x)) -// When doing version checks, always remember to use >=, ex: if (pX->exec_flags->plugin_api_version >= NSISPIAPIVER_1_0) {} - -#define NSISPIAPIVER_1_0 0x00010000 -#define NSISPIAPIVER_CURR NSISPIAPIVER_1_0 - -// NSIS Plug-In Callback Messages -enum NSPIM -{ - NSPIM_UNLOAD, // This is the last message a plugin gets, do final cleanup - NSPIM_GUIUNLOAD, // Called after .onGUIEnd -}; - -// Prototype for callbacks registered with extra_parameters->RegisterPluginCallback() -// Return NULL for unknown messages -// Should always be __cdecl for future expansion possibilities -typedef UINT_PTR (*NSISPLUGINCALLBACK)(enum NSPIM); - -// extra_parameters data structures containing other interesting stuff -// but the stack, variables and HWND passed on to plug-ins. -typedef struct -{ - int autoclose; - int all_user_var; - int exec_error; - int abort; - int exec_reboot; // NSIS_SUPPORT_REBOOT - int reboot_called; // NSIS_SUPPORT_REBOOT - int XXX_cur_insttype; // depreacted - int plugin_api_version; // see NSISPIAPIVER_CURR - // used to be XXX_insttype_changed - int silent; // NSIS_CONFIG_SILENT_SUPPORT - int instdir_error; - int rtl; - int errlvl; - int alter_reg_view; - int status_update; -} exec_flags_t; - -#ifndef NSISCALL -# define NSISCALL __stdcall -#endif - -typedef struct { - exec_flags_t *exec_flags; - int (NSISCALL *ExecuteCodeSegment)(int, HWND); - void (NSISCALL *validate_filename)(LPTSTR); - int (NSISCALL *RegisterPluginCallback)(HMODULE, NSISPLUGINCALLBACK); // returns 0 on success, 1 if already registered and < 0 on errors -} extra_parameters; - -// Definitions for page showing plug-ins -// See Ui.c to understand better how they're used - -// sent to the outer window to tell it to go to the next inner window -#define WM_NOTIFY_OUTER_NEXT (WM_USER+0x8) - -// custom pages should send this message to let NSIS know they're ready -#define WM_NOTIFY_CUSTOM_READY (WM_USER+0xd) - -// sent as wParam with WM_NOTIFY_OUTER_NEXT when user cancels - heed its warning -#define NOTIFY_BYE_BYE 'x' - -#endif /* _PLUGIN_H_ */ diff --git a/data/nsis/Contrib/Inetc/crt.cpp b/data/nsis/Contrib/Inetc/crt.cpp deleted file mode 100644 index 440533de2..000000000 --- a/data/nsis/Contrib/Inetc/crt.cpp +++ /dev/null @@ -1,105 +0,0 @@ -#include - -#if defined(_MSC_VER) && _MSC_VER+0 >= 1400 -#if defined(_MSC_FULL_VER) && _MSC_FULL_VER+0 >= 140050727 -#include -#else -EXTERN_C void __stosb(BYTE*,BYTE,size_t); -#endif -#pragma intrinsic(__stosb) -#define CRTINTRINSIC_memset(p,c,s) __stosb((BYTE*)(p),(BYTE)(c),(s)) -#endif - -extern "C" void* __cdecl memset(void *p, int c, size_t z) -{ -#ifdef CRTINTRINSIC_memset - CRTINTRINSIC_memset(p, c, z); -#else - BYTE *pb = reinterpret_cast(p); - for(size_t i=0; istring_size) -* HTTP POST added -* Jun 06, 2005 IDOK on "Enter" key locked -* POST HTTP header added -* Jun 22, 2005 non-interaptable mode /nocancel -* and direct connect /noproxy -* Jun 29, 2005 post.php written and tested -* Jul 05, 2005 60 sec delay on WinInet detach problem -* solved (not fine, but works including -* installer exit and system reboot) -* Jul 08, 2005 'set foreground' finally removed -* Jul 26, 2005 POPUP translate option -* Aug 23, 2005 https service type in InternetConnect -* and "ignore certificate" flags -* Sep 30, 2005 https with bad certificate from old OS; -* Forbidden handling -* Dec 23, 2005 'put' entry point, new names, 12003 -* ftp error handling (on ftp write permission) -* 405 http error (method not allowed) -* Mar 12, 2006 Internal authorization via InternetErrorDlg() -* and Unauthorized (401) handling. -* Jun 10, 2006 Caption text option for Resume download -* MessageBox -* Jun 24, 2006 HEAD method, silent mode clean up -* Sep 05, 2006 Center dialog code from Backland -* Sep 07, 2006 NSISdl crash fix /Backland idea/ -* Sep 08, 2006 POST as dll entry point. -* Sep 21, 2006 parent dlg progr.bar style and font, -* nocancel via ws_sysmenu -* Sep 22, 2006 current lang IDCANCEL text, /canceltext -* and /useragent options -* Sep 24, 2006 .onInit improvements and defaults -* Nov 11, 2006 FTP path creation, root|current dir mgmt -* Jan 01, 2007 Global char[] cleanup, GetLastError() to -* status string on ERR_DIALOG, few MSVCRT replaces -* Jan 13, 2007 /HEADER option added -* Jan 28, 2007 _open -> CreateFile and related -* Feb 18, 2007 Speed calculating improved (pauses), -* /popup text parameter to hide URL -* Jun 07, 2007 Local file truncation added for download -* (CREATE_ALWAYS) -* Jun 11, 2007 FTP download permitted even if server rejects -* SIZE request (ProFTPD). -* Aug 11, 2007 Backland' fix for progress bar redraw/style -* issue in NSISdl display mode. -* Jan 09, 2008 {_trueparuex^}' fix - InternetSetFilePointer() -* returns -1 on error. -* /question option added for cancel question. -* Feb 15, 2008 PUT content-length file size fix -* Feb 17, 2008 char -> TCHAR replace for UNICODE option -* Feb 19, 2008 janekschwarz fix for HTTP PUT with auth -* CreateFile INVALID_HANDLE_VALUE on error fix -* Feb 20, 2008 base64 encoder update for unicode -* Feb 27, 2008 Unicode configurations added to VS 6 dsp -* Mar 20, 2008 HTTP PUT with proxy auth finally fixed -* FTP errors handling improved. -* HEAD bug fixed -* Mar 27, 2008 Details window hide/show in NSISdl mode -* Apr 10, 2008 Auth test method changed to HEAD for -* old proxy's -* Apr 30, 2008 InternetErrorDlg() ERROR_SUCESS on cancel -* click patched -* 3xx errors added to status list. -* May 20, 2008 InternetReadFile on cable disconnect patched -* May 20, 2008 Reply status "0" patch (name resolution?) -* Jul 15, 2008 HTTP 304 parsing. Incorrect size reported fix. -* Aug 21, 2009 Escape sequence convertion removed (caused -* error in signature with %2b requests) -* Marqueue progess bar style for unknown file size. -* Feb 04, 2010 Unicode POST patch - body converted to multibyte -* Jul 11, 2010 /FILE POST option added -* Nov 04, 2010 Disabled cookies and cache for cleanliness -* Feb 14, 2011 Fixed reget bug introduced in previous commit -* Feb 18, 2011 /NOCOOKIES option added -* Mar 02, 2011 User-agent buffer increased. Small memory leak fix -* Mar 23, 2011 Use caption on embedded progressbar - zenpoy -* Apr 05, 2011 reget fix - INTERNET_FLAG_RELOAD for first connect only -* Apr 27, 2011 /receivetimeout option added for big files and antivirus -* Jun 15, 2011 Stack clean up fix on cancel - zenpoy -* Oct 19, 2011 FTP PUT error parsing fix - tperquin -* Aug 19, 2013 Fix focus stealing when in silent - negativesir, JohnTHaller -* Jul 20, 2014 - 1.0.4.4 - Stuart 'Afrow UK' Welch -* /tostack & /tostackconv added -* Version information resource added -* Updated to NSIS 3.0 plugin API -* Upgraded to Visual Studio 2012 -* 64-bit build added -* MSVCRT dependency removed -* Sep 04, 2015 - 1.0.5.0 - anders_k -* HTTPS connections are more secure by default -* Added /weaksecurity switch, reverts to old cert. security checks -* Sep 06, 2015 - 1.0.5.1 - anders_k -* Don't allow infinite FtpCreateDirectory tries -* Use memset intrinsic when possible to avoid VC code generation bug -* Oct 17, 2015 - 1.0.5.2 - anders_k -* Tries to set FTP mode to binary before querying the size. -* Calls FtpGetFileSize if it exists. -*******************************************************/ - - -#define _WIN32_WINNT 0x0500 - -#include -//#include -#include -#include -#include "pluginapi.h" -#include "resource.h" - -#include // strstr etc - -#ifndef PBM_SETMARQUEE -#define PBM_SETMARQUEE (WM_USER + 10) -#define PBS_MARQUEE 0x08 -#endif -#ifndef HTTP_QUERY_PROXY_AUTHORIZATION -#define HTTP_QUERY_PROXY_AUTHORIZATION 61 -#endif -#ifndef SECURITY_FLAG_IGNORE_REVOCATION -#define SECURITY_FLAG_IGNORE_REVOCATION 0x00000080 -#endif -#ifndef SECURITY_FLAG_IGNORE_UNKNOWN_CA -#define SECURITY_FLAG_IGNORE_UNKNOWN_CA 0x00000100 -#endif - -// IE 4 safety and VS 6 compatibility -typedef BOOL (__stdcall *FTP_CMD)(HINTERNET,BOOL,DWORD,LPCTSTR,DWORD,HINTERNET *); -FTP_CMD myFtpCommand; - -#define PLUGIN_NAME TEXT("Inetc plug-in") -#define INETC_USERAGENT TEXT("NSIS_Inetc (Mozilla)") -#define PB_RANGE 400 // progress bar values range -#define PAUSE1_SEC 2 // transfer error indication time, for reget only -#define PAUSE2_SEC 3 // paused state time, increase this if need (60?) -#define PAUSE3_SEC 1 // pause after resume button pressed -#define NOT_AVAILABLE 0xffffffff -#define POST_HEADER TEXT("Content-Type: application/x-www-form-urlencoded") -#define PUT_HEADER TEXT("Content-Type: octet-stream\nContent-Length: %d") -#define INTERNAL_OK 0xFFEE -#define PROGRESS_MS 1000 // screen values update interval -#define DEF_QUESTION TEXT("Are you sure that you want to stop download?") -#define HOST_AUTH_HDR TEXT("Authorization: basic %s") -#define PROXY_AUTH_HDR TEXT("Proxy-authorization: basic %s") - -//#define MY_WEAKSECURITY_CERT_FLAGS SECURITY_FLAG_IGNORE_UNKNOWN_CA | SECURITY_FLAG_IGNORE_REVOCATION | SECURITY_FLAG_IGNORE_CERT_DATE_INVALID | SECURITY_FLAG_IGNORE_CERT_CN_INVALID -#define MY_WEAKSECURITY_CERT_FLAGS SECURITY_FLAG_IGNORE_UNKNOWN_CA | SECURITY_FLAG_IGNORE_REVOCATION -#define MY_REDIR_FLAGS INTERNET_FLAG_IGNORE_REDIRECT_TO_HTTP | INTERNET_FLAG_IGNORE_REDIRECT_TO_HTTPS -#define MY_HTTPS_FLAGS (MY_REDIR_FLAGS | INTERNET_FLAG_SECURE) - -enum STATUS_CODES { - ST_OK = 0, - ST_CONNECTING, - ST_DOWNLOAD, - ST_CANCELLED, - ST_URLOPEN, - // ST_OPENING, - ST_PAUSE, - ERR_TERMINATED, - ERR_DIALOG, - ERR_INETOPEN, - ERR_URLOPEN, - ERR_TRANSFER, - ERR_FILEOPEN, - ERR_FILEWRITE, - ERR_FILEREAD, - ERR_REGET, - ERR_CONNECT, - ERR_OPENREQUEST, - ERR_SENDREQUEST, - ERR_CRACKURL, - ERR_NOTFOUND, - ERR_THREAD, - ERR_PROXY, - ERR_FORBIDDEN, - ERR_NOTALLOWED, - ERR_REQUEST, - ERR_SERVER, - ERR_AUTH, - ERR_CREATEDIR, - ERR_PATH, - ERR_NOTMODIFIED, - ERR_REDIRECTION -}; - - -static TCHAR szStatus[][32] = { - TEXT("OK"),TEXT("Connecting"),TEXT("Downloading"),TEXT("Cancelled"),TEXT("Connecting"), //TEXT("Opening URL")), - TEXT("Reconnect Pause"),TEXT("Terminated"),TEXT("Dialog Error"),TEXT("Open Internet Error"), - TEXT("Open URL Error"),TEXT("Transfer Error"),TEXT("File Open Error"),TEXT("File Write Error"),TEXT("File Read Error"), - TEXT("Reget Error"),TEXT("Connection Error"),TEXT("OpenRequest Error"),TEXT("SendRequest Error"), - TEXT("URL Parts Error"),TEXT("File Not Found (404)"),TEXT("CreateThread Error"),TEXT("Proxy Error (407)"), - TEXT("Access Forbidden (403)"),TEXT("Not Allowed (405)"),TEXT("Request Error"),TEXT("Server Error"), - TEXT("Unauthorized (401)"),TEXT("FtpCreateDir failed (550)"),TEXT("Error FTP path (550)"),TEXT("Not Modified"), - TEXT("Redirection") -}; - -HINSTANCE g_hInstance; -TCHAR fn[MAX_PATH]=TEXT(""), -*url = NULL, -*szAlias = NULL, -*szProxy = NULL, -*szHeader = NULL, -*szBanner = NULL, -*szQuestion = NULL, -szCancel[64]=TEXT(""), -szCaption[128]=TEXT(""), -szUserAgent[256]=TEXT(""), -szResume[256] = TEXT("Your internet connection seems to be not permitted or dropped out!\nPlease reconnect and click Retry to resume installation."); -CHAR *szPost = NULL, -post_fname[MAX_PATH] = ""; -DWORD fSize = 0; -TCHAR *szToStack = NULL; - -int status; -DWORD cnt = 0, -cntToStack = 0, -fs = 0, -timeout = 0, -receivetimeout = 0; -DWORD startTime, transfStart, openType; -bool silent, popup, resume, nocancel, noproxy, nocookies, convToStack, g_ignorecertissues; - -HWND childwnd; -HWND hDlg; -bool fput = false, fhead = false; - - -#define Option_IgnoreCertIssues() ( g_ignorecertissues ) - -static FARPROC GetWininetProcAddress(LPCSTR Name) -{ - return GetProcAddress(LoadLibraryA("WININET"), Name); -} - -/***************************************************** -* FUNCTION NAME: sf(HWND) -* PURPOSE: -* moves HWND to top and activates it -* SPECIAL CONSIDERATIONS: -* commented because annoying -*****************************************************/ -/* -void sf(HWND hw) -{ -DWORD ctid = GetCurrentThreadId(); -DWORD ftid = GetWindowThreadProcessId(GetForegroundWindow(), NULL); -AttachThreadInput(ftid, ctid, TRUE); -SetForegroundWindow(hw); -AttachThreadInput(ftid, ctid, FALSE); -} -*/ - -static TCHAR szUrl[64] = TEXT(""); -static TCHAR szDownloading[64] = TEXT("Downloading %s"); -static TCHAR szConnecting[64] = TEXT("Connecting ..."); -static TCHAR szSecond[64] = TEXT("second"); -static TCHAR szMinute[32] = TEXT("minute"); -static TCHAR szHour[32] = TEXT("hour"); -static TCHAR szPlural[32] = TEXT("s"); -static TCHAR szProgress[128] = TEXT("%dkB (%d%%) of %dkB @ %d.%01dkB/s"); -static TCHAR szRemaining[64] = TEXT(" (%d %s%s remaining)"); -static TCHAR szBasic[128] = TEXT(""); -static TCHAR szAuth[128] = TEXT(""); - -// is it possible to make it working with unicode strings? - -/* Base64 encode one byte */ -static TCHAR encode(unsigned char u) { - - if(u < 26) return TEXT('A')+u; - if(u < 52) return TEXT('a')+(u-26); - if(u < 62) return TEXT('0')+(u-52); - if(u == 62) return TEXT('+'); - return TEXT('/'); -} - -TCHAR *encode_base64(int size, TCHAR *src, TCHAR *dst) { - - int i; - TCHAR *p; - - if(!src) - return NULL; - - if(!size) - size= lstrlen(src); - - p = dst; - - for(i=0; i>2; - b5= ((b1&0x3)<<4)|(b2>>4); - b6= ((b2&0xf)<<2)|(b3>>6); - b7= b3&0x3f; - - *p++= encode(b4); - *p++= encode(b5); - - if(i+1 0) - { - dw = data_buf; - if(!InternetWriteFile(hFile, dw, bytesDone, &rslt) || rslt == 0) - { - status = ERR_TRANSFER; - break; - } - dw += rslt; - cnt += rslt; - bytesDone -= rslt; - } - } - else - { - if(!InternetReadFile(hFile, data_buf, sizeof(data_buf), &rslt)) - { - status = ERR_TRANSFER; - break; - } - if(rslt == 0) // EOF reached or cable disconnect - { -// on cable disconnect returns TRUE and 0 bytes. is cnt == 0 OK (zero file size)? -// cannot check this if reply is chunked (no content-length, http 1.1) - status = (fs != NOT_AVAILABLE && cnt < fs) ? ERR_TRANSFER : ST_OK; - break; - } - if(szToStack) - { - for (DWORD i = 0; cntToStack < g_stringsize && i < rslt; i++, cntToStack++) - *(szToStack + cntToStack) = data_buf[i]; - } - else if(!WriteFile(localFile, data_buf, rslt, &bytesDone, NULL) || - rslt != bytesDone) - { - status = ERR_FILEWRITE; - break; - } - cnt += rslt; - } - } -} - -/***************************************************** -* FUNCTION NAME: mySendRequest() -* PURPOSE: -* HttpSendRequestEx() sends headers only - for PUT -* We also can use InetWriteFile for POST body I guess -* SPECIAL CONSIDERATIONS: -* -*****************************************************/ -int mySendRequest(HINTERNET hFile) -{ - INTERNET_BUFFERS BufferIn = {0}; - if(fput) - { - BufferIn.dwStructSize = sizeof( INTERNET_BUFFERS ); - BufferIn.dwBufferTotal = fs; - return HttpSendRequestEx( hFile, &BufferIn, NULL, HSR_INITIATE, 0); - } - return HttpSendRequest(hFile, NULL, 0, szPost, fSize); -} - -/***************************************************** -* FUNCTION NAME: queryStatus() -* PURPOSE: -* http status code comes before download (get) and -* after upload (put), so this is called from 2 places -* SPECIAL CONSIDERATIONS: -* -*****************************************************/ -bool queryStatus(HINTERNET hFile) -{ - TCHAR buf[256] = TEXT(""); - DWORD rslt; - if(HttpQueryInfo(hFile, HTTP_QUERY_STATUS_CODE, - buf, &(rslt = sizeof(buf)), NULL)) - { - buf[3] = 0; - if(lstrcmp(buf, TEXT("0")) == 0 || *buf == 0) - status = ERR_SENDREQUEST; - else if(lstrcmp(buf, TEXT("401")) == 0) - status = ERR_AUTH; - else if(lstrcmp(buf, TEXT("403")) == 0) - status = ERR_FORBIDDEN; - else if(lstrcmp(buf, TEXT("404")) == 0) - status = ERR_NOTFOUND; - else if(lstrcmp(buf, TEXT("407")) == 0) - status = ERR_PROXY; - else if(lstrcmp(buf, TEXT("405")) == 0) - status = ERR_NOTALLOWED; - else if(lstrcmp(buf, TEXT("304")) == 0) - status = ERR_NOTMODIFIED; - else if(*buf == TEXT('3')) - { - status = ERR_REDIRECTION; - wsprintf(szStatus[status] + lstrlen(szStatus[status]), TEXT(" (%s)"), buf); - } - else if(*buf == TEXT('4')) - { - status = ERR_REQUEST; - wsprintf(szStatus[status] + lstrlen(szStatus[status]), TEXT(" (%s)"), buf); - } - else if(*buf == TEXT('5')) - { - status = ERR_SERVER; - wsprintf(szStatus[status] + lstrlen(szStatus[status]), TEXT(" (%s)"), buf); - } - return true; - } - return false; -} - -/***************************************************** -* FUNCTION NAME: openFtpFile() -* PURPOSE: -* control connection, size request, re-get lseek -* SPECIAL CONSIDERATIONS: -* -*****************************************************/ -HINTERNET openFtpFile(HINTERNET hConn, - TCHAR *path) -{ - TCHAR buf[256] = TEXT(""), *movp; - HINTERNET hFile; - DWORD rslt, err, gle; - bool https_req_ok = false; - - /* reads connection / auth responce info and cleares 'control' buffer this way */ - InternetGetLastResponseInfo(&err, buf, &(rslt = sizeof(buf))); - if(cnt == 0) - { - if(!fput) // we know local file size already - { - if (myFtpCommand) - { - /* Try to set the REPRESENTATION TYPE to I[mage] (Binary) because some servers - don't accept the SIZE command in ASCII mode */ - myFtpCommand(hConn, false, FTP_TRANSFER_TYPE_ASCII, TEXT("TYPE I"), 0, &hFile); - } - /* too clever myFtpCommand returnes false on the valid TEXT("550 Not found/Not permitted" server answer, - to read answer I had to ignory returned false (!= 999999) :-( - GetLastError also possible, but MSDN description of codes is very limited */ - wsprintf(buf, TEXT("SIZE %s"), path + 1); - if(myFtpCommand != NULL && - myFtpCommand(hConn, false, FTP_TRANSFER_TYPE_ASCII, buf, 0, &hFile) != 9999 && - memset(buf, 0, sizeof(buf)) != NULL && - InternetGetLastResponseInfo(&err, buf, &(rslt = sizeof(buf)))) - { - if(_tcsstr(buf, TEXT("213 "))) - { - fs = myatou(_tcschr(buf, TEXT(' ')) + 1); - } - /* stupid ProFTPD returns error on SIZE request. let's continue without size. - But IE knows some trick to get size from ProFTPD...... - else if(mystrstr(buf, TEXT("550 TEXT(")) - { - status = ERR_SIZE_NOT_PERMITTED; - return NULL; - } - */ - } - if(fs == 0) - { - fs = NOT_AVAILABLE; - } - } - } - else - { - wsprintf(buf, TEXT("REST %d"), cnt); - if(myFtpCommand == NULL || - !myFtpCommand(hConn, false, FTP_TRANSFER_TYPE_BINARY, buf, 0, &hFile) || - memset(buf, 0, sizeof(buf)) == NULL || - !InternetGetLastResponseInfo(&err, buf, &(rslt = sizeof(buf))) || - (_tcsstr(buf, TEXT("350")) == NULL && _tcsstr(buf, TEXT("110")) == NULL)) - { - status = ERR_REGET; - return NULL; - } - } - if((hFile = FtpOpenFile(hConn, path + 1, fput ? GENERIC_WRITE : GENERIC_READ, - FTP_TRANSFER_TYPE_BINARY|INTERNET_FLAG_RELOAD,0)) == NULL) - { - gle = GetLastError(); - *buf = 0; - InternetGetLastResponseInfo(&err, buf, &(rslt = sizeof(buf))); - // wrong path - dir may not exist or upload may be not allowed - // we use ftp://host//path (double /) to define path from FS root - if(fput && (_tcsstr(buf, TEXT("550")) != NULL || _tcsstr(buf, TEXT("553")) != NULL)) - { - movp = path + 1; - if(*movp == TEXT('/')) movp++; // don't need to create root - for (UINT8 escapehatch = 0; ++escapehatch;) // Weak workaround for http://forums.winamp.com/showpost.php?p=3031692&postcount=513 bug - { - TCHAR *pbs = _tcschr(movp, TEXT('/')); - if (!pbs) break; - *pbs = TEXT('\0'); - FtpCreateDirectory(hConn, path + 1); - InternetGetLastResponseInfo(&err, buf, &(rslt = sizeof(buf))); - *(movp + lstrlen(movp)) = TEXT('/'); - movp = _tcschr(movp, TEXT('/')) + 1; - } - if(status != ERR_CREATEDIR && - (hFile = FtpOpenFile(hConn, path + 1, GENERIC_WRITE, - FTP_TRANSFER_TYPE_BINARY|INTERNET_FLAG_RELOAD,0)) == NULL) - { - status = ERR_PATH; - if(InternetGetLastResponseInfo(&err, buf, &(rslt = sizeof(buf)))) - lstrcpyn(szStatus[status], _tcsstr(buf, TEXT("550")), sizeof(szStatus[0]) / sizeof(TCHAR)); - } - } - // may be firewall related error, let's give user time to disable it - else if(gle == 12003) // ERROR_INTERNET_EXTENDED_ERROR - { - if(_tcsstr(buf, TEXT("550"))) - { - status = ERR_NOTFOUND; - lstrcpyn(szStatus[status], _tcsstr(buf, TEXT("550")), sizeof(szStatus[0]) / sizeof(TCHAR)); - } - else - { - lstrcpyn(szStatus[status], buf, sizeof(szStatus[0]) / sizeof(TCHAR)); - } - } - // timeout (firewall or dropped connection problem) - else if(gle == 12002) // ERROR_INTERNET_TIMEOUT - { - if(!silent) - resume = true; - status = ERR_URLOPEN; - } - } - else - InternetGetLastResponseInfo(&err, buf, &(rslt = sizeof(buf))); - if (hFile && NOT_AVAILABLE == fs) - { - FARPROC ftpgfs = GetWininetProcAddress("FtpGetFileSize"); // IE5+ - if (ftpgfs) - { - DWORD shi, slo = ((DWORD(WINAPI*)(HINTERNET,DWORD*))ftpgfs)(hFile, &shi); - if (slo != -1 && !shi) fs = slo; - } - } - return hFile; -} - - -/***************************************************** -* FUNCTION NAME: openHttpFile() -* PURPOSE: -* file open, size request, re-get lseek -* SPECIAL CONSIDERATIONS: -* -*****************************************************/ -HINTERNET openHttpFile(HINTERNET hConn, INTERNET_SCHEME nScheme, TCHAR *path) -{ - TCHAR buf[256] = TEXT(""); - HINTERNET hFile; - DWORD rslt, err; - bool first_attempt = true;; - -// test connection for PUT, the only way to do this before sending data -// OPTIONS fails on HttpOpenRequest step for HTTPS -// but works for HEAD I guess - if(fput)// && nScheme != INTERNET_SCHEME_HTTPS) - { -// old proxy's may not support OPTIONS request, so changed to HEAD.... - if((hFile = HttpOpenRequest(hConn, TEXT("HEAD"), path, NULL, NULL, NULL, -// if((hFile = HttpOpenRequest(hConn, TEXT("OPTIONS"), path, NULL, NULL, NULL, - INTERNET_FLAG_RELOAD | INTERNET_FLAG_KEEP_CONNECTION | - (nocookies ? (INTERNET_FLAG_NO_CACHE_WRITE | INTERNET_FLAG_NO_COOKIES) : 0), 0)) != NULL) - { - if(*szAuth) - { - wsprintf(buf, PROXY_AUTH_HDR, szAuth); - HttpAddRequestHeaders(hFile, buf, -1, - HTTP_ADDREQ_FLAG_ADD | HTTP_ADDREQ_FLAG_REPLACE); - } -resend_proxy1: - if(*szBasic) - { - wsprintf(buf, HOST_AUTH_HDR, szBasic); - HttpAddRequestHeaders(hFile, buf, -1, - HTTP_ADDREQ_FLAG_ADD | HTTP_ADDREQ_FLAG_REPLACE); - } -resend_auth1: - if(HttpSendRequest(hFile, NULL, 0, NULL, 0)) - { - queryStatus(hFile); -// may be don't need to read all from socket, but this looks safer - while(InternetReadFile(hFile, buf, sizeof(buf), &rslt) && rslt > 0) {} - if(!silent && (status == ERR_PROXY || status == ERR_AUTH))// || status == ERR_FORBIDDEN)) - { - rslt = InternetErrorDlg(hDlg, hFile, - ERROR_INTERNET_INCORRECT_PASSWORD, - FLAGS_ERROR_UI_FILTER_FOR_ERRORS | - FLAGS_ERROR_UI_FLAGS_GENERATE_DATA | - FLAGS_ERROR_UI_FLAGS_CHANGE_OPTIONS, - NULL); - if (rslt == ERROR_INTERNET_FORCE_RETRY) - { - status = ST_URLOPEN; - if(status == ERR_PROXY) goto resend_proxy1; - else goto resend_auth1; - } - else - { - status = ST_CANCELLED; - } - - } - // no such file is OK for PUT. server first checks authentication - if(status == ERR_NOTFOUND || status == ERR_FORBIDDEN || status == ERR_NOTALLOWED) - { -// MessageBox(childwnd, TEXT("NOT_FOUND"), "", 0); - status = ST_URLOPEN; - } - // parameters might be updated during dialog popup - if(status == ST_URLOPEN) - { - *buf = 0; - if(HttpQueryInfo(hFile, HTTP_QUERY_AUTHORIZATION, buf, &(rslt = sizeof(buf)), NULL) && *buf) - lstrcpyn(szBasic, buf, rslt); - *buf = 0; - if(HttpQueryInfo(hFile, HTTP_QUERY_PROXY_AUTHORIZATION, buf, &(rslt = sizeof(buf)), NULL) && *buf) - lstrcpyn(szAuth, buf, rslt); - } - } - else status = ERR_SENDREQUEST; - InternetCloseHandle(hFile); - } - else status = ERR_OPENREQUEST; - } -// request itself - if(status == ST_URLOPEN) - { - DWORD secflags = nScheme == INTERNET_SCHEME_HTTPS ? MY_HTTPS_FLAGS : 0; - if (Option_IgnoreCertIssues()) secflags |= MY_WEAKSECURITY_CERT_FLAGS; - DWORD cokflags = nocookies ? (INTERNET_FLAG_NO_CACHE_WRITE | INTERNET_FLAG_NO_COOKIES) : 0; - if((hFile = HttpOpenRequest(hConn, fput ? TEXT("PUT") : (fhead ? TEXT("HEAD") : (szPost ? TEXT("POST") : NULL)), - path, NULL, NULL, NULL, - // INTERNET_FLAG_RELOAD conflicts with reget - hidden re-read from beginning has place - // INTERNET_FLAG_RESYNCHRONIZE // note - sync may not work with some http servers - // reload on first connect (and any req. except GET), just continue on resume. - // HTTP Proxy still is a problem for reget - (cnt ? 0 : INTERNET_FLAG_RELOAD) | INTERNET_FLAG_KEEP_CONNECTION | cokflags | secflags, 0)) != NULL) - { - if(*szAuth) - { - wsprintf(buf, PROXY_AUTH_HDR, szAuth); - HttpAddRequestHeaders(hFile, buf, -1, - HTTP_ADDREQ_FLAG_ADD | HTTP_ADDREQ_FLAG_REPLACE); - } -resend_proxy2: - if(szPost != NULL) - HttpAddRequestHeaders(hFile, POST_HEADER, - -1, HTTP_ADDREQ_FLAG_ADD | HTTP_ADDREQ_FLAG_REPLACE); - if(*post_fname) - HttpAddRequestHeadersA(hFile, post_fname, - -1, HTTP_ADDREQ_FLAG_ADD | HTTP_ADDREQ_FLAG_REPLACE); - if(szHeader != NULL) - HttpAddRequestHeaders(hFile, szHeader, -1, - HTTP_ADDREQ_FLAG_ADD | HTTP_ADDREQ_FLAG_REPLACE); - if(*szBasic) - { - wsprintf(buf, HOST_AUTH_HDR, szBasic); - HttpAddRequestHeaders(hFile, buf, -1, - HTTP_ADDREQ_FLAG_ADD | HTTP_ADDREQ_FLAG_REPLACE); - } - if(fput) - { - wsprintf(buf, PUT_HEADER, fs); - HttpAddRequestHeaders(hFile, buf, -1, - HTTP_ADDREQ_FLAG_ADD | HTTP_ADDREQ_FLAG_REPLACE); - } -resend_auth2: - first_attempt = true; - if(nScheme == INTERNET_SCHEME_HTTPS) - { - if(!mySendRequest(hFile)) - { - InternetQueryOption (hFile, INTERNET_OPTION_SECURITY_FLAGS, - (LPVOID)&rslt, &(err = sizeof(rslt))); - rslt |= Option_IgnoreCertIssues() ? MY_WEAKSECURITY_CERT_FLAGS : 0; - InternetSetOption (hFile, INTERNET_OPTION_SECURITY_FLAGS, - &rslt, sizeof(rslt) ); - } - else first_attempt = false; - } -// https Request answer may be after optional second Send only on Win98 - if(!first_attempt || mySendRequest(hFile)) - { -// no status for PUT - headers were sent only. And not need to get size / set position - if(!fput) - { - queryStatus(hFile); - if(!silent && (status == ERR_PROXY || status == ERR_AUTH)) - { - rslt = InternetErrorDlg(hDlg, hFile, - ERROR_INTERNET_INCORRECT_PASSWORD, - FLAGS_ERROR_UI_FILTER_FOR_ERRORS | - FLAGS_ERROR_UI_FLAGS_GENERATE_DATA | - FLAGS_ERROR_UI_FLAGS_CHANGE_OPTIONS, - NULL); - if (rslt == ERROR_INTERNET_FORCE_RETRY) - { - status = ST_URLOPEN; - if(status == ERR_PROXY) goto resend_proxy2; - else goto resend_auth2; - } - else - status = ST_CANCELLED; - - } -// get size / set position - if(status == ST_URLOPEN) - { - if(cnt == 0) - { - if(HttpQueryInfo(hFile, HTTP_QUERY_CONTENT_LENGTH, buf, - &(rslt = sizeof(buf)), NULL)) - fs = myatou(buf); - else - fs = NOT_AVAILABLE; - } - else - { - if((int)InternetSetFilePointer(hFile, cnt, NULL, FILE_BEGIN, 0) == -1) - status = ERR_REGET; - } - } - } - } - else - { - if(!queryStatus(hFile)) - status = ERR_SENDREQUEST; - } - } - else status = ERR_OPENREQUEST; - } - return hFile; -} - -/***************************************************** -* FUNCTION NAME: inetTransfer() -* PURPOSE: -* http/ftp file transfer -* SPECIAL CONSIDERATIONS: -* -*****************************************************/ -DWORD __stdcall inetTransfer(void *hw) -{ - HINTERNET hSes, hConn, hFile; - HANDLE localFile = NULL; - HWND hDlg = (HWND)hw; - DWORD lastCnt, rslt, err; - static TCHAR hdr[2048]; - TCHAR *host = (TCHAR*)LocalAlloc(LPTR, g_stringsize * sizeof(TCHAR)), - *path = (TCHAR*)LocalAlloc(LPTR, g_stringsize * sizeof(TCHAR)), - *params = (TCHAR*)LocalAlloc(LPTR, g_stringsize * sizeof(TCHAR)), - *user = (TCHAR*)LocalAlloc(LPTR, g_stringsize * sizeof(TCHAR)), - *passwd = (TCHAR*)LocalAlloc(LPTR, g_stringsize * sizeof(TCHAR)); - - URL_COMPONENTS uc = {sizeof(URL_COMPONENTS), NULL, 0, - (INTERNET_SCHEME)0, host, g_stringsize, 0 , user, g_stringsize, - passwd, g_stringsize, path, g_stringsize, params, g_stringsize}; - - if((hSes = InternetOpen(szUserAgent, openType, szProxy, NULL, 0)) != NULL) - { - if(InternetQueryOption(hSes, INTERNET_OPTION_CONNECTED_STATE, &(rslt=0), - &(lastCnt=sizeof(DWORD))) && - (rslt & INTERNET_STATE_DISCONNECTED_BY_USER)) - { - INTERNET_CONNECTED_INFO ci = {INTERNET_STATE_CONNECTED, 0}; - InternetSetOption(hSes, - INTERNET_OPTION_CONNECTED_STATE, &ci, sizeof(ci)); - } - if(timeout > 0) - lastCnt = InternetSetOption(hSes, INTERNET_OPTION_CONNECT_TIMEOUT, &timeout, sizeof(timeout)); - if(receivetimeout > 0) - InternetSetOption(hSes, INTERNET_OPTION_RECEIVE_TIMEOUT, &receivetimeout, sizeof(receivetimeout)); - // 60 sec WinInet.dll detach delay on socket time_wait fix - myFtpCommand = (FTP_CMD) GetWininetProcAddress( -#ifdef UNICODE - "FtpCommandW" -#else - "FtpCommandA" -#endif - ); - while(!popstring(url) && lstrcmpi(url, TEXT("/end")) != 0) - { - // too many customers requested not to do this - // sf(hDlg); - if(popstring(fn) != 0 || lstrcmpi(url, TEXT("/end")) == 0) break; - status = ST_CONNECTING; - cnt = fs = *host = *user = *passwd = *path = *params = 0; - PostMessage(hDlg, WM_TIMER, 1, 0); // show url & fn, do it sync - if(szToStack || (localFile = CreateFile(fn, fput ? GENERIC_READ : GENERIC_WRITE, FILE_SHARE_READ, - NULL, fput ? OPEN_EXISTING : CREATE_ALWAYS, 0, NULL)) != INVALID_HANDLE_VALUE) - { - uc.dwHostNameLength = uc.dwUserNameLength = uc.dwPasswordLength = - uc.dwUrlPathLength = uc.dwExtraInfoLength = g_stringsize; - if(fput) - { - fs = GetFileSize(localFile, NULL); - } - if(InternetCrackUrl(url, 0, 0/*ICU_ESCAPE*/ , &uc)) - { - // auth headers for HTTP PUT seems to be lost, preparing encoded login:password - if(*user && *passwd) - { - wsprintf(hdr, TEXT("%s:%s"), user, passwd); - // does unicode version of encoding works correct? - // are user and passwd ascii only? - encode_base64(lstrlen(hdr), hdr, szBasic); - *hdr = 0; - } - lstrcat(path, params); // BUGBUG: Could overflow path? - transfStart = GetTickCount(); - do - { - // re-PUT to already deleted tmp file on http server is not possible. - // the same with POST - must re-send data to server. for 'resume' loop - if((fput && uc.nScheme != INTERNET_SCHEME_FTP) || szPost) - { - cnt = 0; - SetFilePointer(localFile, 0, NULL, FILE_BEGIN); - } - status = ST_CONNECTING; - lastCnt = cnt; - if((hConn = InternetConnect(hSes, host, uc.nPort, - lstrlen(user) > 0 ? user : NULL, - lstrlen(passwd) > 0 ? passwd : NULL, - uc.nScheme == INTERNET_SCHEME_FTP ? INTERNET_SERVICE_FTP : INTERNET_SERVICE_HTTP, - uc.nScheme == INTERNET_SCHEME_FTP ? INTERNET_FLAG_PASSIVE : 0, 0)) != NULL) - { - status = ST_URLOPEN; - hFile = uc.nScheme == INTERNET_SCHEME_FTP ? - openFtpFile(hConn, path) : openHttpFile(hConn, uc.nScheme, path); - if(status != ST_URLOPEN && hFile != NULL) - { - InternetCloseHandle(hFile); - hFile = NULL; - } - if(hFile != NULL) - { - if(fhead) - {// repeating calls clear headers.. - if(HttpQueryInfo(hFile, HTTP_QUERY_RAW_HEADERS_CRLF, hdr, &(rslt=2048), NULL)) - { - if(szToStack) - { - for (DWORD i = 0; cntToStack < g_stringsize && i < rslt; i++, cntToStack++) - *(szToStack + cntToStack) = hdr[i]; - } - else - { - WriteFile(localFile, hdr, rslt, &lastCnt, NULL); - } - } - status = ST_OK; - } - else - { - HWND hBar = GetDlgItem(hDlg, IDC_PROGRESS1); - SendDlgItemMessage(hDlg, IDC_PROGRESS1, PBM_SETPOS, 0, 0); - SetWindowText(GetDlgItem(hDlg, IDC_STATIC5), fs == NOT_AVAILABLE ? TEXT("Not Available") : TEXT("")); - SetWindowText(GetDlgItem(hDlg, IDC_STATIC4), fs == NOT_AVAILABLE ? TEXT("Unknown") : TEXT("")); - SetWindowLong(hBar, GWL_STYLE, fs == NOT_AVAILABLE ? - (GetWindowLong(hBar, GWL_STYLE) | PBS_MARQUEE) : (GetWindowLong(hBar, GWL_STYLE) & ~PBS_MARQUEE)); - SendDlgItemMessage(hDlg, IDC_PROGRESS1, PBM_SETMARQUEE, (WPARAM)(fs == NOT_AVAILABLE ? 1 : 0), (LPARAM)50 ); - fileTransfer(localFile, hFile); - if(fput && uc.nScheme != INTERNET_SCHEME_FTP) - { - rslt = HttpEndRequest(hFile, NULL, 0, 0); - queryStatus(hFile); - } - } - InternetCloseHandle(hFile); - } - InternetCloseHandle(hConn); - } - else - { - status = ERR_CONNECT; - if(uc.nScheme == INTERNET_SCHEME_FTP && - InternetGetLastResponseInfo(&err, hdr, &(rslt = sizeof(hdr))) && - _tcsstr(hdr, TEXT("530"))) - { - lstrcpyn(szStatus[status], _tcsstr(hdr, TEXT("530")), sizeof(szStatus[0]) / sizeof(TCHAR)); - } - else - { - rslt = GetLastError(); - if((rslt == 12003 || rslt == 12002) && !silent) - resume = true; - } - } - } while(((!fput || uc.nScheme == INTERNET_SCHEME_FTP) && - cnt > lastCnt && - status == ERR_TRANSFER && - SleepEx(PAUSE1_SEC * 1000, false) == 0 && - (status = ST_PAUSE) != ST_OK && - SleepEx(PAUSE2_SEC * 1000, false) == 0) - || (resume && - status != ST_OK && - status != ST_CANCELLED && - status != ERR_NOTFOUND && - ShowWindow(hDlg, SW_HIDE) != -1 && - MessageBox(GetParent(hDlg), szResume, *szCaption ? szCaption : PLUGIN_NAME, MB_RETRYCANCEL|MB_ICONWARNING) == IDRETRY && - (status = ST_PAUSE) != ST_OK && - ShowWindow(hDlg, silent ? SW_HIDE : SW_SHOW) == false && - SleepEx(PAUSE3_SEC * 1000, false) == 0)); - } - else status = ERR_CRACKURL; - CloseHandle(localFile); - if(!fput && status != ST_OK && !szToStack) - { - rslt = DeleteFile(fn); - break; - } - } - else status = ERR_FILEOPEN; - } - InternetCloseHandle(hSes); - if (lstrcmpi(url, TEXT("/end"))==0) - pushstring(url); - } - else status = ERR_INETOPEN; - LocalFree(host); - LocalFree(path); - LocalFree(user); - LocalFree(passwd); - LocalFree(params); - if(IsWindow(hDlg)) - PostMessage(hDlg, WM_COMMAND, MAKELONG(IDOK, INTERNAL_OK), 0); - return status; -} - -/***************************************************** -* FUNCTION NAME: fsFormat() -* PURPOSE: -* formats DWORD (max 4 GB) file size for dialog, big MB -* SPECIAL CONSIDERATIONS: -* -*****************************************************/ -void fsFormat(DWORD bfs, TCHAR *b) -{ - if(bfs == NOT_AVAILABLE) - lstrcpy(b, TEXT("???")); - else if(bfs == 0) - lstrcpy(b, TEXT("0")); - else if(bfs < 10 * 1024) - wsprintf(b, TEXT("%u bytes"), bfs); - else if(bfs < 10 * 1024 * 1024) - wsprintf(b, TEXT("%u kB"), bfs / 1024); - else wsprintf(b, TEXT("%u MB"), (bfs / 1024 / 1024)); -} - - -/***************************************************** -* FUNCTION NAME: progress_callback -* PURPOSE: -* old-style progress bar text updates -* SPECIAL CONSIDERATIONS: -* -*****************************************************/ - -void progress_callback(void) -{ - static TCHAR buf[1024] = TEXT(""), b[1024] = TEXT(""); - int time_sofar = max(1, (GetTickCount() - transfStart) / 1000); - int bps = cnt / time_sofar; - int remain = (cnt > 0 && fs != NOT_AVAILABLE) ? (MulDiv(time_sofar, fs, cnt) - time_sofar) : 0; - TCHAR *rtext=szSecond; - if(remain < 0) remain = 0; - if (remain >= 60) - { - remain/=60; - rtext=szMinute; - if (remain >= 60) - { - remain/=60; - rtext=szHour; - } - } - wsprintf(buf, - szProgress, - cnt/1024, - fs > 0 && fs != NOT_AVAILABLE ? MulDiv(100, cnt, fs) : 0, - fs != NOT_AVAILABLE ? fs/1024 : 0, - bps/1024,((bps*10)/1024)%10 - ); - if (remain) wsprintf(buf + lstrlen(buf), - szRemaining, - remain, - rtext, - remain==1?TEXT(""):szPlural - ); - SetDlgItemText(hDlg, IDC_STATIC1, (cnt == 0 || status == ST_CONNECTING) ? szConnecting : buf); - if(fs > 0 && fs != NOT_AVAILABLE) - SendMessage(GetDlgItem(hDlg, IDC_PROGRESS1), PBM_SETPOS, MulDiv(cnt, PB_RANGE, fs), 0); - if (*szCaption == 0) - wsprintf(buf, szDownloading, _tcsrchr(fn, TEXT('\\')) ? _tcsrchr(fn, TEXT('\\')) + 1 : fn); - else - wsprintf(buf, TEXT("%s"),szCaption); - HWND hwndS = GetDlgItem(childwnd, 1006); - if(!silent && hwndS != NULL && IsWindow(hwndS)) - { - GetWindowText(hwndS, b, sizeof(b)); - if(lstrcmp(b, buf) != 0) - SetWindowText(hwndS, buf); - } -} - -/***************************************************** -* FUNCTION NAME: onTimer() -* PURPOSE: -* updates text fields every second -* SPECIAL CONSIDERATIONS: -* -*****************************************************/ -void onTimer(HWND hDlg) -{ - TCHAR b[128]; - DWORD ct = (GetTickCount() - transfStart) / 1000, - tt = (GetTickCount() - startTime) / 1000; - // dialog window caption - wsprintf(b, TEXT("%s - %s"), *szCaption ? szCaption : PLUGIN_NAME, szStatus[status]); - if(fs > 0 && fs != NOT_AVAILABLE && status == ST_DOWNLOAD) - { - wsprintf(b + lstrlen(b), TEXT(" %d%%"), MulDiv(100, cnt, fs)); - } - if(szBanner == NULL) SetWindowText(hDlg, b); - // current file and url - SetDlgItemText(hDlg, IDC_STATIC1, (szAlias && *szAlias) ? szAlias : url); - SetDlgItemText(hDlg, IDC_STATIC2, /*_tcsrchr(fn, '\\') ? _tcsrchr(fn, '\\') + 1 : */fn); - // bytes done and rate - if(cnt > 0) - { - fsFormat(cnt, b); - if(ct > 1 && status == ST_DOWNLOAD) - { - lstrcat(b, TEXT(" ( ")); - fsFormat(cnt / ct, b + lstrlen(b)); - lstrcat(b, TEXT("/sec )")); - } - } - else *b = 0; - SetDlgItemText(hDlg, IDC_STATIC3, b); - // total download time - wsprintf(b, TEXT("%d:%02d:%02d"), tt / 3600, (tt / 60) % 60, tt % 60); - SetDlgItemText(hDlg, IDC_STATIC6, b); - // file size, time remaining, progress bar - if(fs > 0 && fs != NOT_AVAILABLE) - { - fsFormat(fs, b); - SetDlgItemText(hDlg, IDC_STATIC5, b); - SendDlgItemMessage(hDlg, IDC_PROGRESS1, PBM_SETPOS, MulDiv(cnt, PB_RANGE, fs), 0); - if(cnt > 5000) - { - ct = MulDiv(fs - cnt, ct, cnt); - wsprintf(b, TEXT("%d:%02d:%02d"), ct / 3600, (ct / 60) % 60, ct % 60); - } - else *b = 0; - SetWindowText(GetDlgItem(hDlg, IDC_STATIC4), b); - } -} - -/***************************************************** -* FUNCTION NAME: centerDlg() -* PURPOSE: -* centers dlg on NSIS parent -* SPECIAL CONSIDERATIONS: -* -*****************************************************/ -void centerDlg(HWND hDlg) -{ - HWND hwndParent = GetParent(hDlg); - RECT nsisRect, dlgRect, waRect; - int dlgX, dlgY, dlgWidth, dlgHeight; - - if(hwndParent == NULL || silent) - return; - if(popup) - GetWindowRect(hwndParent, &nsisRect); - else GetClientRect(hwndParent, &nsisRect); - GetWindowRect(hDlg, &dlgRect); - - dlgWidth = dlgRect.right - dlgRect.left; - dlgHeight = dlgRect.bottom - dlgRect.top; - dlgX = (nsisRect.left + nsisRect.right - dlgWidth) / 2; - dlgY = (nsisRect.top + nsisRect.bottom - dlgHeight) / 2; - - if(popup) - { - SystemParametersInfo(SPI_GETWORKAREA, 0, &waRect, 0); - if(dlgX > waRect.right - dlgWidth) - dlgX = waRect.right - dlgWidth; - if(dlgX < waRect.left) dlgX = waRect.left; - if(dlgY > waRect.bottom - dlgHeight) - dlgY = waRect.bottom - dlgHeight; - if(dlgY < waRect.top) dlgY = waRect.top; - } - else dlgY += 20; - - SetWindowPos(hDlg, HWND_TOP, dlgX, dlgY, 0, 0, SWP_NOSIZE); -} - -/***************************************************** -* FUNCTION NAME: onInitDlg() -* PURPOSE: -* dlg init -* SPECIAL CONSIDERATIONS: -* -*****************************************************/ -void onInitDlg(HWND hDlg) -{ - HFONT hFont; - HWND hPrbNew; - HWND hPrbOld; - HWND hCan = GetDlgItem(hDlg, IDCANCEL); - - if(childwnd) - { - hPrbNew = GetDlgItem(hDlg, IDC_PROGRESS1); - hPrbOld = GetDlgItem(childwnd, 0x3ec); - - // Backland' fix for progress bar redraw/style issue. - // Original bar may be hidden because of interfernce with other plug-ins. - LONG prbStyle = WS_VISIBLE | WS_CHILD | WS_CLIPSIBLINGS | WS_CLIPCHILDREN; - if(hPrbOld != NULL) - { - prbStyle |= GetWindowLong(hPrbOld, GWL_STYLE); - } - SetWindowLong(hPrbNew, GWL_STYLE, prbStyle); - - if(!popup) - { - if((hFont = (HFONT)SendMessage(childwnd, WM_GETFONT, 0, 0)) != NULL) - { - SendDlgItemMessage(hDlg, IDC_STATIC1, WM_SETFONT, (WPARAM)hFont, 0); - SendDlgItemMessage(hDlg, IDCANCEL, WM_SETFONT, (WPARAM)hFont, 0); - } - if(*szCancel == 0) - GetWindowText(GetDlgItem(GetParent(childwnd), IDCANCEL), szCancel, sizeof(szCancel)); - SetWindowText(hCan, szCancel); - SetWindowPos(hPrbNew, HWND_TOP, 0, 0, 0, 0, SWP_NOSIZE | SWP_NOMOVE); - } - } - - if(nocancel) - { - if(hCan != NULL) - ShowWindow(hCan, SW_HIDE); - if(popup) - SetWindowLong(hDlg, GWL_STYLE, GetWindowLong(hDlg, GWL_STYLE) ^ WS_SYSMENU); - } - SendDlgItemMessage(hDlg, IDC_PROGRESS1, PBM_SETRANGE, - 0, MAKELPARAM(0, PB_RANGE)); - if(szBanner != NULL) - { - SendDlgItemMessage(hDlg, IDC_STATIC13, STM_SETICON, - (WPARAM)LoadIcon(GetModuleHandle(NULL), MAKEINTRESOURCE(103)), 0); - SetDlgItemText(hDlg, IDC_STATIC12, szBanner); - SetWindowText(hDlg, *szCaption ? szCaption : PLUGIN_NAME); - } - SetTimer(hDlg, 1, 1000, NULL); - if(*szUrl != 0) - { - SetDlgItemText(hDlg, IDC_STATIC20, szUrl); - SetDlgItemText(hDlg, IDC_STATIC21, szDownloading); - SetDlgItemText(hDlg, IDC_STATIC22, szConnecting); - SetDlgItemText(hDlg, IDC_STATIC23, szProgress); - SetDlgItemText(hDlg, IDC_STATIC24, szSecond); - SetDlgItemText(hDlg, IDC_STATIC25, szRemaining); - } -} - -/***************************************************** -* FUNCTION NAME: dlgProc() -* PURPOSE: -* dlg message handling procedure -* SPECIAL CONSIDERATIONS: -* todo: better dialog design -*****************************************************/ -INT_PTR CALLBACK dlgProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam ) -{ - switch(message) - { - case WM_INITDIALOG: - onInitDlg(hDlg); - centerDlg(hDlg); - return false; - case WM_PAINT: - // child dialog redraw problem. return false is important - RedrawWindow(GetDlgItem(hDlg, IDC_STATIC1), NULL, NULL, RDW_INVALIDATE); - RedrawWindow(GetDlgItem(hDlg, IDCANCEL), NULL, NULL, RDW_INVALIDATE); - RedrawWindow(GetDlgItem(hDlg, IDC_PROGRESS1), NULL, NULL, RDW_INVALIDATE); - UpdateWindow(GetDlgItem(hDlg, IDC_STATIC1)); - UpdateWindow(GetDlgItem(hDlg, IDCANCEL)); - UpdateWindow(GetDlgItem(hDlg, IDC_PROGRESS1)); - return false; - case WM_TIMER: - if(!silent && IsWindow(hDlg)) - { - // long connection period and paused state updates - if(status != ST_DOWNLOAD && GetTickCount() - transfStart > PROGRESS_MS) - transfStart += PROGRESS_MS; - if(popup) onTimer(hDlg); else progress_callback(); - RedrawWindow(GetDlgItem(hDlg, IDC_STATIC1), NULL, NULL, RDW_INVALIDATE); - RedrawWindow(GetDlgItem(hDlg, IDCANCEL), NULL, NULL, RDW_INVALIDATE); - RedrawWindow(GetDlgItem(hDlg, IDC_PROGRESS1), NULL, NULL, RDW_INVALIDATE); - } - break; - case WM_COMMAND: - switch(LOWORD(wParam)) - { - case IDCANCEL: - if(nocancel) break; - if(szQuestion && - MessageBox(hDlg, szQuestion, *szCaption ? szCaption : PLUGIN_NAME, MB_ICONWARNING|MB_YESNO) == IDNO) - break; - status = ST_CANCELLED; - // FallThrough - case IDOK: - if(status != ST_CANCELLED && HIWORD(wParam) != INTERNAL_OK) break; - // otherwise in the silent mode next banner windows may go to background - // if(silent) sf(hDlg); - KillTimer(hDlg, 1); - DestroyWindow(hDlg); - break; - } - return false; - default: - return false; - } - return true; -} - -/***************************************************** -* FUNCTION NAME: get() -* PURPOSE: -* http/https/ftp file download entry point -* SPECIAL CONSIDERATIONS: -* -*****************************************************/ -extern "C" -void __declspec(dllexport) __cdecl get(HWND hwndParent, - int string_size, - TCHAR *variables, - stack_t **stacktop, - extra_parameters *extra - ) -{ - HANDLE hThread; - DWORD dwThreadId; - MSG msg; - TCHAR szUsername[64]=TEXT(""), // proxy params - szPassword[64]=TEXT(""); - - - EXDLL_INIT(); - -// for repeating /nounload plug-un calls - global vars clean up - silent = popup = resume = nocancel = noproxy = nocookies = false; - g_ignorecertissues = false; - myFtpCommand = NULL; - openType = INTERNET_OPEN_TYPE_PRECONFIG; - status = ST_CONNECTING; - *szCaption = *szCancel = *szUserAgent = *szBasic = *szAuth = 0; - - url = (TCHAR*)LocalAlloc(LPTR, string_size * sizeof(TCHAR)); - if(szPost) - { - popstring(url); -#ifdef UNICODE - WideCharToMultiByte(CP_ACP, 0, url, -1, szPost, string_size, NULL, NULL); -#else - lstrcpy(szPost, url); -#endif - fSize = (DWORD)lstrlenA(szPost); - } - // global silent option - if(extra->exec_flags->silent != 0) - silent = true; - // we must take this from stack, or push url back - while(!popstring(url) && *url == TEXT('/')) - { - if(lstrcmpi(url, TEXT("/silent")) == 0) - silent = true; - else if(lstrcmpi(url, TEXT("/weaksecurity")) == 0) - g_ignorecertissues = true; - else if(lstrcmpi(url, TEXT("/caption")) == 0) - popstring(szCaption); - else if(lstrcmpi(url, TEXT("/username")) == 0) - popstring(szUsername); - else if(lstrcmpi(url, TEXT("/password")) == 0) - popstring(szPassword); - else if(lstrcmpi(url, TEXT("/nocancel")) == 0) - nocancel = true; - else if(lstrcmpi(url, TEXT("/nocookies")) == 0) - nocookies = true; - else if(lstrcmpi(url, TEXT("/noproxy")) == 0) - openType = INTERNET_OPEN_TYPE_DIRECT; - else if(lstrcmpi(url, TEXT("/popup")) == 0) - { - popup = true; - szAlias = (TCHAR*)LocalAlloc(LPTR, string_size * sizeof(TCHAR)); - popstring(szAlias); - } - else if(lstrcmpi(url, TEXT("/resume")) == 0) - { - popstring(url); - if(url[0]) lstrcpy(szResume, url); - resume = true; - } - else if(lstrcmpi(url, TEXT("/translate")) == 0) - { - if(popup) - { - popstring(szUrl); - popstring(szStatus[ST_DOWNLOAD]); // Downloading - popstring(szStatus[ST_CONNECTING]); // Connecting - lstrcpy(szStatus[ST_URLOPEN], szStatus[ST_CONNECTING]); - popstring(szDownloading);// file name - popstring(szConnecting);// received - popstring(szProgress);// file size - popstring(szSecond);// remaining time - popstring(szRemaining);// total time - } - else - { - popstring(szDownloading); - popstring(szConnecting); - popstring(szSecond); - popstring(szMinute); - popstring(szHour); - popstring(szPlural); - popstring(szProgress); - popstring(szRemaining); - } - } - else if(lstrcmpi(url, TEXT("/banner")) == 0) - { - popup = true; - szBanner = (TCHAR*)LocalAlloc(LPTR, string_size * sizeof(TCHAR)); - popstring(szBanner); - } - else if(lstrcmpi(url, TEXT("/canceltext")) == 0) - { - popstring(szCancel); - } - else if(lstrcmpi(url, TEXT("/question")) == 0) - { - szQuestion = (TCHAR*)LocalAlloc(LPTR, string_size * sizeof(TCHAR)); - popstring(szQuestion); - if(*szQuestion == 0) lstrcpy(szQuestion, DEF_QUESTION); - } - else if(lstrcmpi(url, TEXT("/useragent")) == 0) - { - popstring(szUserAgent); - } - else if(lstrcmpi(url, TEXT("/proxy")) == 0) - { - szProxy = (TCHAR*)LocalAlloc(LPTR, string_size * sizeof(TCHAR)); - popstring(szProxy); - openType = INTERNET_OPEN_TYPE_PROXY; - } - else if(lstrcmpi(url, TEXT("/connecttimeout")) == 0) - { - popstring(url); - timeout = myatou(url) * 1000; - } - else if(lstrcmpi(url, TEXT("/receivetimeout")) == 0) - { - popstring(url); - receivetimeout = myatou(url) * 1000; - } - else if(lstrcmpi(url, TEXT("/header")) == 0) - { - szHeader = (TCHAR*)LocalAlloc(LPTR, string_size * sizeof(TCHAR)); - popstring(szHeader); - } - else if(!fput && ((convToStack = lstrcmpi(url, TEXT("/tostackconv")) == 0) || lstrcmpi(url, TEXT("/tostack")) == 0)) - { - szToStack = (TCHAR*)LocalAlloc(LPTR, string_size * sizeof(TCHAR)); - cntToStack = 0; - lstrcpy(fn, TEXT("file")); - } - else if(lstrcmpi(url, TEXT("/file")) == 0) - { - HANDLE hFile = CreateFileA(szPost, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, 0, NULL); - DWORD rslt; - if(hFile == INVALID_HANDLE_VALUE) - { - status = ERR_FILEOPEN; - goto cleanup; - } - if((fSize = GetFileSize(hFile, NULL)) == 0) - { - CloseHandle(hFile); - status = ERR_FILEREAD; - goto cleanup; - } - wsprintfA(post_fname, "Filename: %s", - strchr(szPost, '\\') ? strrchr(szPost, '\\') + 1 : szPost); - LocalFree(szPost); - szPost = (char*)LocalAlloc(LPTR, fSize); - if(ReadFile(hFile, szPost, fSize, &rslt, NULL) == 0 || rslt != fSize) - { - CloseHandle(hFile); - status = ERR_FILEREAD; - goto cleanup; - } - CloseHandle(hFile); - } - } - pushstring(url); -// if(*szCaption == 0) lstrcpy(szCaption, PLUGIN_NAME); - if(*szUserAgent == 0) lstrcpy(szUserAgent, INETC_USERAGENT); - if(*szPassword && *szUsername) - { - wsprintf(url, TEXT("%s:%s"), szUsername, szPassword); - encode_base64(lstrlen(url), url, szAuth); - } - // may be silent for plug-in, but not so for installer itself - let's try to define 'progress text' - if(hwndParent != NULL && - (childwnd = FindWindowEx(hwndParent, NULL, TEXT("#32770"), NULL)) != NULL && - !silent) - SetDlgItemText(childwnd, 1006, *szCaption ? szCaption : PLUGIN_NAME); - else InitCommonControls(); // or NSIS do this before .onInit? - // cannot embed child dialog to non-existing parent. Using 'silent' to hide it - if(childwnd == NULL && !popup) silent = true; - // let's use hidden popup dlg in the silent mode - works both on .onInit and Page - if(silent) { resume = false; popup = true; } - // google says WS_CLIPSIBLINGS helps to redraw... not in my tests... - if(!popup) - { - unsigned int wstyle = GetWindowLong(childwnd, GWL_STYLE); - wstyle |= WS_CLIPSIBLINGS; - SetWindowLong(childwnd, GWL_STYLE, wstyle); - } - startTime = GetTickCount(); - if((hDlg = CreateDialog(g_hInstance, - MAKEINTRESOURCE(szBanner ? IDD_DIALOG2 : (popup ? IDD_DIALOG1 : IDD_DIALOG3)), - (popup ? hwndParent : childwnd), dlgProc)) != NULL) - { - - if((hThread = CreateThread(NULL, 0, inetTransfer, (LPVOID)hDlg, 0, - &dwThreadId)) != NULL) - { - HWND hButton = GetDlgItem(childwnd, 0x403); - HWND hList = GetDlgItem(childwnd, 0x3f8); - DWORD dwStyleButton = 0; - BOOL fVisibleList = false; - if(!silent) - { - ShowWindow(hDlg, SW_NORMAL); - if(childwnd && !popup) - { - if(hButton) - { - dwStyleButton = GetWindowLong(hButton, GWL_STYLE); - EnableWindow(hButton, false); - } - if(hList) - { - fVisibleList = IsWindowVisible(hList); - ShowWindow(hList, SW_HIDE); - } - } - } - - while(IsWindow(hDlg) && - GetMessage(&msg, NULL, 0, 0) > 0) - { - if(!IsDialogMessage(hDlg, &msg) && - !IsDialogMessage(hwndParent, &msg) && - !TranslateMessage(&msg)) - DispatchMessage(&msg); - } - - if(WaitForSingleObject(hThread, 3000) == WAIT_TIMEOUT) - { - TerminateThread(hThread, 1); - status = ERR_TERMINATED; - } - CloseHandle(hThread); - if(!silent && childwnd) - { - SetDlgItemText(childwnd, 1006, TEXT("")); - if(!popup) - { - if(hButton) - SetWindowLong(hButton, GWL_STYLE, dwStyleButton); - if(hList && fVisibleList) - ShowWindow(hList, SW_SHOW); - } - // RedrawWindow(childwnd, NULL, NULL, RDW_INVALIDATE|RDW_ERASE); - } - } - else - { - status = ERR_THREAD; - DestroyWindow(hDlg); - } - } - else { - status = ERR_DIALOG; - wsprintf(szStatus[status] + lstrlen(szStatus[status]), TEXT(" (Err=%d)"), GetLastError()); - } -cleanup: - // we need to clean up stack from remaining url/file pairs. - // this multiple files download head pain and may be not safe - while(!popstring(url) && lstrcmpi(url, TEXT("/end")) != 0) - { - /* nothing MessageBox(NULL, url, TEXT(""), 0);*/ - } - LocalFree(url); - if(szAlias) LocalFree(szAlias); - if(szBanner) LocalFree(szAlias); - if(szQuestion) LocalFree(szQuestion); - if(szProxy) LocalFree(szProxy); - if(szPost) LocalFree(szPost); - if(szHeader) LocalFree(szHeader); - - url = szProxy = szHeader = szAlias = szQuestion = NULL; - szPost = NULL; - fput = fhead = false; - - if(szToStack && status == ST_OK) - { - if(cntToStack > 0 && convToStack) - { -#ifdef UNICODE - int required = MultiByteToWideChar(CP_ACP, 0, (CHAR*)szToStack, string_size * sizeof(TCHAR), NULL, 0); - if(required > 0) - { - WCHAR* pszToStackNew = (WCHAR*)LocalAlloc(LPTR, sizeof(WCHAR) * (required + 1)); - if(pszToStackNew) - { - if(MultiByteToWideChar(CP_ACP, 0, (CHAR*)szToStack, string_size * sizeof(TCHAR), pszToStackNew, required) > 0) - pushstring(pszToStackNew); - LocalFree(pszToStackNew); - } - } -#else - int required = WideCharToMultiByte(CP_ACP, 0, (WCHAR*)szToStack, -1, NULL, 0, NULL, NULL); - if(required > 0) - { - CHAR* pszToStackNew = (CHAR*)LocalAlloc(LPTR, required + 1); - if(pszToStackNew) - { - if(WideCharToMultiByte(CP_ACP, 0, (WCHAR*)szToStack, -1, pszToStackNew, required, NULL, NULL) > 0) - pushstring(pszToStackNew); - LocalFree(pszToStackNew); - } - } -#endif - } - else - { - pushstring(szToStack); - } - LocalFree(szToStack); - szToStack = NULL; - } - - pushstring(szStatus[status]); -} - -/***************************************************** -* FUNCTION NAME: put() -* PURPOSE: -* http/ftp file upload entry point -* SPECIAL CONSIDERATIONS: -* re-put not works with http, but ftp REST - may be. -*****************************************************/ -extern "C" -void __declspec(dllexport) __cdecl put(HWND hwndParent, - int string_size, - TCHAR *variables, - stack_t **stacktop, - extra_parameters *extra - ) -{ - fput = true; - lstrcpy(szDownloading, TEXT("Uploading %s")); - lstrcpy(szStatus[2], TEXT("Uploading")); - get(hwndParent, string_size, variables, stacktop, extra); -} - -/***************************************************** -* FUNCTION NAME: post() -* PURPOSE: -* http post entry point -* SPECIAL CONSIDERATIONS: -* -*****************************************************/ -extern "C" -void __declspec(dllexport) __cdecl post(HWND hwndParent, - int string_size, - TCHAR *variables, - stack_t **stacktop, - extra_parameters *extra - ) -{ - szPost = (CHAR*)LocalAlloc(LPTR, string_size); - get(hwndParent, string_size, variables, stacktop, extra); -} - -/***************************************************** -* FUNCTION NAME: head() -* PURPOSE: -* http/ftp file upload entry point -* SPECIAL CONSIDERATIONS: -* re-put not works with http, but ftp REST - may be. -*****************************************************/ -extern "C" -void __declspec(dllexport) __cdecl head(HWND hwndParent, - int string_size, - TCHAR *variables, - stack_t **stacktop, - extra_parameters *extra - ) -{ - fhead = true; - get(hwndParent, string_size, variables, stacktop, extra); -} - -/***************************************************** -* FUNCTION NAME: DllMain() -* PURPOSE: -* Dll main (initialization) entry point -* SPECIAL CONSIDERATIONS: -* -*****************************************************/ -#ifdef _VC_NODEFAULTLIB -#define DllMain _DllMainCRTStartup -#endif -EXTERN_C BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved) -{ - g_hInstance = hinstDLL; - return TRUE; -} diff --git a/data/nsis/Contrib/Inetc/inetc.rc b/data/nsis/Contrib/Inetc/inetc.rc deleted file mode 100644 index 0384750c8..000000000 --- a/data/nsis/Contrib/Inetc/inetc.rc +++ /dev/null @@ -1,199 +0,0 @@ -// Microsoft Visual C++ generated resource script. -// -#include "resource.h" - -#define APSTUDIO_READONLY_SYMBOLS -///////////////////////////////////////////////////////////////////////////// -// -// Generated from the TEXTINCLUDE 2 resource. -// -#include "afxres.h" - -///////////////////////////////////////////////////////////////////////////// -#undef APSTUDIO_READONLY_SYMBOLS - -///////////////////////////////////////////////////////////////////////////// -// Russian (Russia) resources - -#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_RUS) -LANGUAGE LANG_RUSSIAN, SUBLANG_DEFAULT -#pragma code_page(1251) - -#ifdef APSTUDIO_INVOKED -///////////////////////////////////////////////////////////////////////////// -// -// TEXTINCLUDE -// - -1 TEXTINCLUDE -BEGIN - "resource.h\0" -END - -2 TEXTINCLUDE -BEGIN - "#include ""afxres.h""\r\n" - "\0" -END - -3 TEXTINCLUDE -BEGIN - "\r\n" - "\0" -END - -#endif // APSTUDIO_INVOKED - -#endif // Russian (Russia) resources -///////////////////////////////////////////////////////////////////////////// - - -///////////////////////////////////////////////////////////////////////////// -// English (United States) resources - -#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU) -LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US -#pragma code_page(1252) - -///////////////////////////////////////////////////////////////////////////// -// -// Dialog -// - -IDD_DIALOG1 DIALOGEX 0, 0, 286, 71 -STYLE DS_SETFONT | DS_MODALFRAME | DS_CENTER | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "Inetc plug-in" -FONT 8, "MS Sans Serif", 0, 0, 0x1 -BEGIN - LTEXT "",IDC_STATIC1,50,4,230,12,SS_CENTERIMAGE,WS_EX_STATICEDGE - LTEXT "",IDC_STATIC2,50,18,230,12,SS_CENTERIMAGE,WS_EX_STATICEDGE - CTEXT "",IDC_STATIC3,50,32,102,12,SS_CENTERIMAGE,WS_EX_STATICEDGE - CTEXT "",IDC_STATIC4,220,32,60,12,SS_CENTERIMAGE,WS_EX_STATICEDGE - CONTROL "Progress1",IDC_PROGRESS1,"msctls_progress32",NOT WS_VISIBLE,5,62,275,7 - CTEXT "",IDC_STATIC5,50,46,102,12,SS_CENTERIMAGE,WS_EX_STATICEDGE - CTEXT "",IDC_STATIC6,220,46,60,12,SS_CENTERIMAGE,WS_EX_STATICEDGE - CONTROL "URL",IDC_STATIC20,"Static",SS_LEFTNOWORDWRAP | WS_GROUP,5,6,44,10 - CONTROL "File name",IDC_STATIC21,"Static",SS_LEFTNOWORDWRAP | WS_GROUP,5,20,44,10 - CONTROL "Transfered",IDC_STATIC22,"Static",SS_LEFTNOWORDWRAP | WS_GROUP,5,34,44,10 - CONTROL "File size",IDC_STATIC23,"Static",SS_LEFTNOWORDWRAP | WS_GROUP,5,48,44,10 - CONTROL "Remaining time",IDC_STATIC24,"Static",SS_LEFTNOWORDWRAP | WS_GROUP,164,34,55,10 - CONTROL "Total time",IDC_STATIC25,"Static",SS_LEFTNOWORDWRAP | WS_GROUP,164,48,55,10 -END - -IDD_DIALOG2 DIALOG 0, 0, 226, 62 -STYLE DS_SETFONT | DS_MODALFRAME | DS_CENTER | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "Inetc plug-in" -FONT 8, "MS Sans Serif" -BEGIN - ICON 103,IDC_STATIC13,4,4,20,20 - LTEXT "Please wait",IDC_STATIC12,35,6,184,28 - CONTROL "Progress1",IDC_PROGRESS1,"msctls_progress32",NOT WS_VISIBLE,12,40,201,11 -END - -IDD_DIALOG3 DIALOG 0, 0, 266, 62 -STYLE DS_SETFONT | DS_CONTROL | WS_CHILD | WS_VISIBLE -FONT 8, "MS Sans Serif" -BEGIN - CONTROL "Progress1",IDC_PROGRESS1,"msctls_progress32",0x0,0,23,266,11 - CTEXT "",IDC_STATIC1,0,8,266,11 - PUSHBUTTON "Cancel",IDCANCEL,166,41,80,16 -END - - -///////////////////////////////////////////////////////////////////////////// -// -// DESIGNINFO -// - -#ifdef APSTUDIO_INVOKED -GUIDELINES DESIGNINFO -BEGIN - IDD_DIALOG1, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 279 - TOPMARGIN, 7 - BOTTOMMARGIN, 64 - END - - IDD_DIALOG2, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 219 - TOPMARGIN, 7 - BOTTOMMARGIN, 55 - END - - IDD_DIALOG3, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 259 - TOPMARGIN, 7 - BOTTOMMARGIN, 55 - END -END -#endif // APSTUDIO_INVOKED - -#endif // English (United States) resources -///////////////////////////////////////////////////////////////////////////// - - -///////////////////////////////////////////////////////////////////////////// -// English (United Kingdom) resources - -#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENG) -LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_UK -#pragma code_page(1252) - -///////////////////////////////////////////////////////////////////////////// -// -// Version -// - -VS_VERSION_INFO VERSIONINFO - FILEVERSION 1,0,5,2 - PRODUCTVERSION 1,0,5,2 - FILEFLAGSMASK 0x3fL -#ifdef _DEBUG - FILEFLAGS 0x1L -#else - FILEFLAGS 0x0L -#endif - FILEOS 0x40004L - FILETYPE 0x2L - FILESUBTYPE 0x0L -BEGIN - BLOCK "StringFileInfo" - BEGIN - BLOCK "040904b0" - BEGIN - VALUE "FileDescription", "inetc NSIS plug-in" - VALUE "FileVersion", "1.0.5.2" - VALUE "InternalName", "inetc.dll" - VALUE "LegalCopyright", "Copyright © Takhir Bedertdinov" - VALUE "OriginalFilename", "inetc.dll" - VALUE "ProductName", "inetc NSIS plug-in" - VALUE "ProductVersion", "1.0.5.2" - END - END - BLOCK "VarFileInfo" - BEGIN - VALUE "Translation", 0x409, 1200 - END -END - -#endif // English (United Kingdom) resources -///////////////////////////////////////////////////////////////////////////// - - - -#ifndef APSTUDIO_INVOKED -///////////////////////////////////////////////////////////////////////////// -// -// Generated from the TEXTINCLUDE 3 resource. -// - - -///////////////////////////////////////////////////////////////////////////// -#endif // not APSTUDIO_INVOKED - diff --git a/data/nsis/Contrib/Inetc/inetc.sln b/data/nsis/Contrib/Inetc/inetc.sln deleted file mode 100644 index 04b4db351..000000000 --- a/data/nsis/Contrib/Inetc/inetc.sln +++ /dev/null @@ -1,42 +0,0 @@ - -Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio 2012 -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "inetc", "inetc.vcxproj", "{6B2D8C40-38A9-457A-9FA6-BED0108CAC37}" -EndProject -Global - GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug Unicode|Win32 = Debug Unicode|Win32 - Debug Unicode|x64 = Debug Unicode|x64 - Debug|Win32 = Debug|Win32 - Debug|x64 = Debug|x64 - Release Unicode|Win32 = Release Unicode|Win32 - Release Unicode|x64 = Release Unicode|x64 - Release|Win32 = Release|Win32 - Release|x64 = Release|x64 - EndGlobalSection - GlobalSection(ProjectConfigurationPlatforms) = postSolution - {6B2D8C40-38A9-457A-9FA6-BED0108CAC37}.Debug Unicode|Win32.ActiveCfg = Debug Unicode|Win32 - {6B2D8C40-38A9-457A-9FA6-BED0108CAC37}.Debug Unicode|Win32.Build.0 = Debug Unicode|Win32 - {6B2D8C40-38A9-457A-9FA6-BED0108CAC37}.Debug Unicode|Win32.Deploy.0 = Debug Unicode|Win32 - {6B2D8C40-38A9-457A-9FA6-BED0108CAC37}.Debug Unicode|x64.ActiveCfg = Debug Unicode|x64 - {6B2D8C40-38A9-457A-9FA6-BED0108CAC37}.Debug Unicode|x64.Build.0 = Debug Unicode|x64 - {6B2D8C40-38A9-457A-9FA6-BED0108CAC37}.Debug|Win32.ActiveCfg = Debug|Win32 - {6B2D8C40-38A9-457A-9FA6-BED0108CAC37}.Debug|Win32.Build.0 = Debug|Win32 - {6B2D8C40-38A9-457A-9FA6-BED0108CAC37}.Debug|Win32.Deploy.0 = Debug|Win32 - {6B2D8C40-38A9-457A-9FA6-BED0108CAC37}.Debug|x64.ActiveCfg = Debug|x64 - {6B2D8C40-38A9-457A-9FA6-BED0108CAC37}.Debug|x64.Build.0 = Debug|x64 - {6B2D8C40-38A9-457A-9FA6-BED0108CAC37}.Release Unicode|Win32.ActiveCfg = Release Unicode|Win32 - {6B2D8C40-38A9-457A-9FA6-BED0108CAC37}.Release Unicode|Win32.Build.0 = Release Unicode|Win32 - {6B2D8C40-38A9-457A-9FA6-BED0108CAC37}.Release Unicode|Win32.Deploy.0 = Release Unicode|Win32 - {6B2D8C40-38A9-457A-9FA6-BED0108CAC37}.Release Unicode|x64.ActiveCfg = Release Unicode|x64 - {6B2D8C40-38A9-457A-9FA6-BED0108CAC37}.Release Unicode|x64.Build.0 = Release Unicode|x64 - {6B2D8C40-38A9-457A-9FA6-BED0108CAC37}.Release|Win32.ActiveCfg = Release|Win32 - {6B2D8C40-38A9-457A-9FA6-BED0108CAC37}.Release|Win32.Build.0 = Release|Win32 - {6B2D8C40-38A9-457A-9FA6-BED0108CAC37}.Release|Win32.Deploy.0 = Release|Win32 - {6B2D8C40-38A9-457A-9FA6-BED0108CAC37}.Release|x64.ActiveCfg = Release|x64 - {6B2D8C40-38A9-457A-9FA6-BED0108CAC37}.Release|x64.Build.0 = Release|x64 - EndGlobalSection - GlobalSection(SolutionProperties) = preSolution - HideSolutionNode = FALSE - EndGlobalSection -EndGlobal diff --git a/data/nsis/Contrib/Inetc/inetc.vcxproj b/data/nsis/Contrib/Inetc/inetc.vcxproj deleted file mode 100644 index 9829ec0b4..000000000 --- a/data/nsis/Contrib/Inetc/inetc.vcxproj +++ /dev/null @@ -1,441 +0,0 @@ - - - - - Debug Unicode - Win32 - - - Debug Unicode - x64 - - - Debug - Win32 - - - Debug - x64 - - - Release Unicode - Win32 - - - Release Unicode - x64 - - - Release - Win32 - - - Release - x64 - - - - - - {6B2D8C40-38A9-457A-9FA6-BED0108CAC37} - - - - DynamicLibrary - v110 - Unicode - - - DynamicLibrary - v110 - Unicode - - - DynamicLibrary - v110 - MultiByte - - - DynamicLibrary - v110 - MultiByte - - - DynamicLibrary - v110 - Unicode - - - DynamicLibrary - v110 - Unicode - - - DynamicLibrary - v110 - MultiByte - - - DynamicLibrary - v110 - MultiByte - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - false - $(SolutionDir)..\..\Plugins\ - - - false - $(ProjectName)64 - $(SolutionDir)..\..\Plugins\ - - - $(SolutionDir)..\..\Unicode\Plugins\ - true - false - - - true - false - $(ProjectName)64 - - - $(SolutionDir)..\..\Plugins\ - false - - - false - $(ProjectName)64 - - - false - $(SolutionDir)..\..\Unicode\Plugins\ - - - false - $(ProjectName)64 - $(SolutionDir)..\..\Unicode\Plugins\ - - - - MultiThreaded - MinSpace - true - Level3 - WIN32;NDEBUG;_WINDOWS;_USRDLL;inetc_EXPORTS;_VC80_UPGRADE=0x0600;%(PreprocessorDefinitions) - false - - - true - NDEBUG;%(PreprocessorDefinitions) - .\debug\inetc.tlb - true - Win32 - - - 0x0409 - NDEBUG;%(PreprocessorDefinitions) - - - true - .\debug\inetc.bsc - - - true - true - wininet.lib;comctl32.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) - false - DllMain - libc.lib - true - - - - - MultiThreaded - MinSpace - true - Level3 - WIN32;NDEBUG;_WINDOWS;_USRDLL;inetc_EXPORTS;_VC80_UPGRADE=0x0600;%(PreprocessorDefinitions) - false - - - true - NDEBUG;%(PreprocessorDefinitions) - .\debug\inetc.tlb - true - - - 0x0409 - NDEBUG;%(PreprocessorDefinitions) - - - true - .\debug\inetc.bsc - - - true - true - true - wininet.lib;comctl32.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) - false - libc.lib - DllMain - - - - - MultiThreadedDebug - Disabled - true - Level3 - EditAndContinue - EnableFastChecks - WIN32;_DEBUG;_WINDOWS;_USRDLL;inetc_EXPORTS;_VC80_UPGRADE=0x0600;%(PreprocessorDefinitions) - false - - - true - _DEBUG;%(PreprocessorDefinitions) - .\Debug_Unicode\inetc.tlb - true - Win32 - - - 0x0409 - _DEBUG;%(PreprocessorDefinitions) - - - true - .\Debug_Unicode\inetc.bsc - - - true - true - .\Debug_Unicode\inetc.lib - wininet.lib;comctl32.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) - false - - - - - MultiThreadedDebug - Disabled - true - Level3 - ProgramDatabase - EnableFastChecks - WIN32;_DEBUG;_WINDOWS;_USRDLL;inetc_EXPORTS;_VC80_UPGRADE=0x0600;%(PreprocessorDefinitions) - false - - - true - _DEBUG;%(PreprocessorDefinitions) - .\Debug_Unicode\inetc.tlb - true - - - 0x0409 - _DEBUG;%(PreprocessorDefinitions) - - - true - .\Debug_Unicode\inetc.bsc - - - true - true - .\Debug_Unicode\inetc.lib - wininet.lib;comctl32.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) - false - - - - - MultiThreadedDebug - Disabled - true - Level3 - EditAndContinue - WIN32;_DEBUG;_WINDOWS;_USRDLL;inetc_EXPORTS;_VC80_UPGRADE=0x0600;%(PreprocessorDefinitions) - EnableFastChecks - - - true - _DEBUG;%(PreprocessorDefinitions) - .\Debug\inetc.tlb - true - Win32 - - - 0x0409 - _DEBUG;%(PreprocessorDefinitions) - - - true - .\Debug\inetc.bsc - - - true - true - true - wininet.lib;comctl32.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) - false - - - - - MultiThreadedDebug - Disabled - true - Level3 - ProgramDatabase - WIN32;_DEBUG;_WINDOWS;_USRDLL;inetc_EXPORTS;_VC80_UPGRADE=0x0600;%(PreprocessorDefinitions) - EnableFastChecks - - - true - _DEBUG;%(PreprocessorDefinitions) - .\Debug\inetc.tlb - true - - - 0x0409 - _DEBUG;%(PreprocessorDefinitions) - - - true - .\Debug\inetc.bsc - - - true - true - true - wininet.lib;comctl32.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) - false - - - - - MultiThreaded - MinSpace - true - Level3 - WIN32;NDEBUG;_WINDOWS;UNICODE;_USRDLL;inetc_EXPORTS;_VC80_UPGRADE=0x0600;%(PreprocessorDefinitions) - false - - - true - NDEBUG;%(PreprocessorDefinitions) - .\Debug_Unicode\inetc.tlb - true - Win32 - - - 0x0409 - NDEBUG;%(PreprocessorDefinitions) - - - true - .\Debug_Unicode\inetc.bsc - - - true - true - wininet.lib;comctl32.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) - true - false - DllMain - libc.lib - - - - - MultiThreaded - MinSpace - true - Level3 - WIN32;NDEBUG;_WINDOWS;UNICODE;_USRDLL;inetc_EXPORTS;_VC80_UPGRADE=0x0600;%(PreprocessorDefinitions) - false - - - true - NDEBUG;%(PreprocessorDefinitions) - .\Debug_Unicode\inetc.tlb - true - - - 0x0409 - NDEBUG;%(PreprocessorDefinitions) - - - true - .\Debug_Unicode\inetc.bsc - - - true - true - wininet.lib;comctl32.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) - true - false - libc.lib - DllMain - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/data/nsis/Contrib/Inetc/inetc.vcxproj.filters b/data/nsis/Contrib/Inetc/inetc.vcxproj.filters deleted file mode 100644 index 2020d8947..000000000 --- a/data/nsis/Contrib/Inetc/inetc.vcxproj.filters +++ /dev/null @@ -1,52 +0,0 @@ - - - - - {7803dcf0-655c-4f71-89dd-7fd695066a28} - cpp;c;cxx;rc;def;r;odl;idl;hpj;bat - - - {8edac42d-b9b9-469f-9864-3dbc65bf4365} - ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe - - - {67a938b1-f16b-478b-81df-d0fd26de6d8a} - h;hpp;hxx;hm;inl - - - - - Source Files - - - Source Files - - - Source Files - - - - - Resource Files - - - - - Resource Files - - - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - \ No newline at end of file diff --git a/data/nsis/Contrib/Inetc/nsis_tchar.h b/data/nsis/Contrib/Inetc/nsis_tchar.h deleted file mode 100644 index 210bab16d..000000000 --- a/data/nsis/Contrib/Inetc/nsis_tchar.h +++ /dev/null @@ -1,229 +0,0 @@ -/* - * nsis_tchar.h - * - * This file is a part of NSIS. - * - * Copyright (C) 1999-2013 Nullsoft and Contributors - * - * This software is provided 'as-is', without any express or implied - * warranty. - * - * For Unicode support by Jim Park -- 08/30/2007 - */ - -// Jim Park: Only those we use are listed here. - -#pragma once - -#ifdef _UNICODE - -#ifndef _T -#define __T(x) L ## x -#define _T(x) __T(x) -#define _TEXT(x) __T(x) -#endif - -#ifndef _TCHAR_DEFINED -#define _TCHAR_DEFINED -#if !defined(_NATIVE_WCHAR_T_DEFINED) && !defined(_WCHAR_T_DEFINED) -typedef unsigned short TCHAR; -#else -typedef wchar_t TCHAR; -#endif -#endif - - -// program -#define _tenviron _wenviron -#define __targv __wargv - -// printfs -#define _ftprintf fwprintf -#define _sntprintf _snwprintf -#if (defined(_MSC_VER) && (_MSC_VER<=1310)) || defined(__MINGW32__) -# define _stprintf swprintf -#else -# define _stprintf _swprintf -#endif -#define _tprintf wprintf -#define _vftprintf vfwprintf -#define _vsntprintf _vsnwprintf -#if defined(_MSC_VER) && (_MSC_VER<=1310) -# define _vstprintf vswprintf -#else -# define _vstprintf _vswprintf -#endif - -// scanfs -#define _tscanf wscanf -#define _stscanf swscanf - -// string manipulations -#define _tcscat wcscat -#define _tcschr wcschr -#define _tcsclen wcslen -#define _tcscpy wcscpy -#define _tcsdup _wcsdup -#define _tcslen wcslen -#define _tcsnccpy wcsncpy -#define _tcsncpy wcsncpy -#define _tcsrchr wcsrchr -#define _tcsstr wcsstr -#define _tcstok wcstok - -// string comparisons -#define _tcscmp wcscmp -#define _tcsicmp _wcsicmp -#define _tcsncicmp _wcsnicmp -#define _tcsncmp wcsncmp -#define _tcsnicmp _wcsnicmp - -// upper / lower -#define _tcslwr _wcslwr -#define _tcsupr _wcsupr -#define _totlower towlower -#define _totupper towupper - -// conversions to numbers -#define _tcstoi64 _wcstoi64 -#define _tcstol wcstol -#define _tcstoul wcstoul -#define _tstof _wtof -#define _tstoi _wtoi -#define _tstoi64 _wtoi64 -#define _ttoi _wtoi -#define _ttoi64 _wtoi64 -#define _ttol _wtol - -// conversion from numbers to strings -#define _itot _itow -#define _ltot _ltow -#define _i64tot _i64tow -#define _ui64tot _ui64tow - -// file manipulations -#define _tfopen _wfopen -#define _topen _wopen -#define _tremove _wremove -#define _tunlink _wunlink - -// reading and writing to i/o -#define _fgettc fgetwc -#define _fgetts fgetws -#define _fputts fputws -#define _gettchar getwchar - -// directory -#define _tchdir _wchdir - -// environment -#define _tgetenv _wgetenv -#define _tsystem _wsystem - -// time -#define _tcsftime wcsftime - -#else // ANSI - -#ifndef _T -#define _T(x) x -#define _TEXT(x) x -#endif - -#ifndef _TCHAR_DEFINED -#define _TCHAR_DEFINED -typedef char TCHAR; -#endif - -// program -#define _tenviron environ -#define __targv __argv - -// printfs -#define _ftprintf fprintf -#define _sntprintf _snprintf -#define _stprintf sprintf -#define _tprintf printf -#define _vftprintf vfprintf -#define _vsntprintf _vsnprintf -#define _vstprintf vsprintf - -// scanfs -#define _tscanf scanf -#define _stscanf sscanf - -// string manipulations -#define _tcscat strcat -#define _tcschr strchr -#define _tcsclen strlen -#define _tcscnlen strnlen -#define _tcscpy strcpy -#define _tcsdup _strdup -#define _tcslen strlen -#define _tcsnccpy strncpy -#define _tcsrchr strrchr -#define _tcsstr strstr -#define _tcstok strtok - -// string comparisons -#define _tcscmp strcmp -#define _tcsicmp _stricmp -#define _tcsncmp strncmp -#define _tcsncicmp _strnicmp -#define _tcsnicmp _strnicmp - -// upper / lower -#define _tcslwr _strlwr -#define _tcsupr _strupr - -#define _totupper toupper -#define _totlower tolower - -// conversions to numbers -#define _tcstol strtol -#define _tcstoul strtoul -#define _tstof atof -#define _tstoi atoi -#define _tstoi64 _atoi64 -#define _tstoi64 _atoi64 -#define _ttoi atoi -#define _ttoi64 _atoi64 -#define _ttol atol - -// conversion from numbers to strings -#define _i64tot _i64toa -#define _itot _itoa -#define _ltot _ltoa -#define _ui64tot _ui64toa - -// file manipulations -#define _tfopen fopen -#define _topen _open -#define _tremove remove -#define _tunlink _unlink - -// reading and writing to i/o -#define _fgettc fgetc -#define _fgetts fgets -#define _fputts fputs -#define _gettchar getchar - -// directory -#define _tchdir _chdir - -// environment -#define _tgetenv getenv -#define _tsystem system - -// time -#define _tcsftime strftime - -#endif - -// is functions (the same in Unicode / ANSI) -#define _istgraph isgraph -#define _istascii __isascii - -#define __TFILE__ _T(__FILE__) -#define __TDATE__ _T(__DATE__) -#define __TTIME__ _T(__TIME__) diff --git a/data/nsis/Contrib/Inetc/pluginapi.c b/data/nsis/Contrib/Inetc/pluginapi.c deleted file mode 100644 index c507e31a2..000000000 --- a/data/nsis/Contrib/Inetc/pluginapi.c +++ /dev/null @@ -1,294 +0,0 @@ -#include - -#include "pluginapi.h" - -#ifdef _countof -#define COUNTOF _countof -#else -#define COUNTOF(a) (sizeof(a)/sizeof(a[0])) -#endif - -unsigned int g_stringsize; -stack_t **g_stacktop; -TCHAR *g_variables; - -// utility functions (not required but often useful) - -int NSISCALL popstring(TCHAR *str) -{ - stack_t *th; - if (!g_stacktop || !*g_stacktop) return 1; - th=(*g_stacktop); - if (str) lstrcpy(str,th->text); - *g_stacktop = th->next; - GlobalFree((HGLOBAL)th); - return 0; -} - -int NSISCALL popstringn(TCHAR *str, int maxlen) -{ - stack_t *th; - if (!g_stacktop || !*g_stacktop) return 1; - th=(*g_stacktop); - if (str) lstrcpyn(str,th->text,maxlen?maxlen:g_stringsize); - *g_stacktop = th->next; - GlobalFree((HGLOBAL)th); - return 0; -} - -void NSISCALL pushstring(const TCHAR *str) -{ - stack_t *th; - if (!g_stacktop) return; - th=(stack_t*)GlobalAlloc(GPTR,(sizeof(stack_t)+(g_stringsize)*sizeof(TCHAR))); - lstrcpyn(th->text,str,g_stringsize); - th->next=*g_stacktop; - *g_stacktop=th; -} - -TCHAR* NSISCALL getuservariable(const int varnum) -{ - if (varnum < 0 || varnum >= __INST_LAST) return NULL; - return g_variables+varnum*g_stringsize; -} - -void NSISCALL setuservariable(const int varnum, const TCHAR *var) -{ - if (var != NULL && varnum >= 0 && varnum < __INST_LAST) - lstrcpy(g_variables + varnum*g_stringsize, var); -} - -#ifdef _UNICODE -int NSISCALL PopStringA(char* ansiStr) -{ - wchar_t* wideStr = (wchar_t*) GlobalAlloc(GPTR, g_stringsize*sizeof(wchar_t)); - int rval = popstring(wideStr); - WideCharToMultiByte(CP_ACP, 0, wideStr, -1, ansiStr, g_stringsize, NULL, NULL); - GlobalFree((HGLOBAL)wideStr); - return rval; -} - -int NSISCALL PopStringNA(char* ansiStr, int maxlen) -{ - int realLen = maxlen ? maxlen : g_stringsize; - wchar_t* wideStr = (wchar_t*) GlobalAlloc(GPTR, realLen*sizeof(wchar_t)); - int rval = popstringn(wideStr, realLen); - WideCharToMultiByte(CP_ACP, 0, wideStr, -1, ansiStr, realLen, NULL, NULL); - GlobalFree((HGLOBAL)wideStr); - return rval; -} - -void NSISCALL PushStringA(const char* ansiStr) -{ - wchar_t* wideStr = (wchar_t*) GlobalAlloc(GPTR, g_stringsize*sizeof(wchar_t)); - MultiByteToWideChar(CP_ACP, 0, ansiStr, -1, wideStr, g_stringsize); - pushstring(wideStr); - GlobalFree((HGLOBAL)wideStr); - return; -} - -void NSISCALL GetUserVariableW(const int varnum, wchar_t* wideStr) -{ - lstrcpyW(wideStr, getuservariable(varnum)); -} - -void NSISCALL GetUserVariableA(const int varnum, char* ansiStr) -{ - wchar_t* wideStr = getuservariable(varnum); - WideCharToMultiByte(CP_ACP, 0, wideStr, -1, ansiStr, g_stringsize, NULL, NULL); -} - -void NSISCALL SetUserVariableA(const int varnum, const char* ansiStr) -{ - if (ansiStr != NULL && varnum >= 0 && varnum < __INST_LAST) - { - wchar_t* wideStr = g_variables + varnum * g_stringsize; - MultiByteToWideChar(CP_ACP, 0, ansiStr, -1, wideStr, g_stringsize); - } -} - -#else -// ANSI defs -int NSISCALL PopStringW(wchar_t* wideStr) -{ - char* ansiStr = (char*) GlobalAlloc(GPTR, g_stringsize); - int rval = popstring(ansiStr); - MultiByteToWideChar(CP_ACP, 0, ansiStr, -1, wideStr, g_stringsize); - GlobalFree((HGLOBAL)ansiStr); - return rval; -} - -int NSISCALL PopStringNW(wchar_t* wideStr, int maxlen) -{ - int realLen = maxlen ? maxlen : g_stringsize; - char* ansiStr = (char*) GlobalAlloc(GPTR, realLen); - int rval = popstringn(ansiStr, realLen); - MultiByteToWideChar(CP_ACP, 0, ansiStr, -1, wideStr, realLen); - GlobalFree((HGLOBAL)ansiStr); - return rval; -} - -void NSISCALL PushStringW(wchar_t* wideStr) -{ - char* ansiStr = (char*) GlobalAlloc(GPTR, g_stringsize); - WideCharToMultiByte(CP_ACP, 0, wideStr, -1, ansiStr, g_stringsize, NULL, NULL); - pushstring(ansiStr); - GlobalFree((HGLOBAL)ansiStr); -} - -void NSISCALL GetUserVariableW(const int varnum, wchar_t* wideStr) -{ - char* ansiStr = getuservariable(varnum); - MultiByteToWideChar(CP_ACP, 0, ansiStr, -1, wideStr, g_stringsize); -} - -void NSISCALL GetUserVariableA(const int varnum, char* ansiStr) -{ - lstrcpyA(ansiStr, getuservariable(varnum)); -} - -void NSISCALL SetUserVariableW(const int varnum, const wchar_t* wideStr) -{ - if (wideStr != NULL && varnum >= 0 && varnum < __INST_LAST) - { - char* ansiStr = g_variables + varnum * g_stringsize; - WideCharToMultiByte(CP_ACP, 0, wideStr, -1, ansiStr, g_stringsize, NULL, NULL); - } -} -#endif - -// playing with integers - -INT_PTR NSISCALL nsishelper_str_to_ptr(const TCHAR *s) -{ - INT_PTR v=0; - if (*s == _T('0') && (s[1] == _T('x') || s[1] == _T('X'))) - { - s++; - for (;;) - { - int c=*(++s); - if (c >= _T('0') && c <= _T('9')) c-=_T('0'); - else if (c >= _T('a') && c <= _T('f')) c-=_T('a')-10; - else if (c >= _T('A') && c <= _T('F')) c-=_T('A')-10; - else break; - v<<=4; - v+=c; - } - } - else if (*s == _T('0') && s[1] <= _T('7') && s[1] >= _T('0')) - { - for (;;) - { - int c=*(++s); - if (c >= _T('0') && c <= _T('7')) c-=_T('0'); - else break; - v<<=3; - v+=c; - } - } - else - { - int sign=0; - if (*s == _T('-')) sign++; else s--; - for (;;) - { - int c=*(++s) - _T('0'); - if (c < 0 || c > 9) break; - v*=10; - v+=c; - } - if (sign) v = -v; - } - - return v; -} - -unsigned int NSISCALL myatou(const TCHAR *s) -{ - unsigned int v=0; - - for (;;) - { - unsigned int c=*s++; - if (c >= _T('0') && c <= _T('9')) c-=_T('0'); - else break; - v*=10; - v+=c; - } - return v; -} - -int NSISCALL myatoi_or(const TCHAR *s) -{ - int v=0; - if (*s == _T('0') && (s[1] == _T('x') || s[1] == _T('X'))) - { - s++; - for (;;) - { - int c=*(++s); - if (c >= _T('0') && c <= _T('9')) c-=_T('0'); - else if (c >= _T('a') && c <= _T('f')) c-=_T('a')-10; - else if (c >= _T('A') && c <= _T('F')) c-=_T('A')-10; - else break; - v<<=4; - v+=c; - } - } - else if (*s == _T('0') && s[1] <= _T('7') && s[1] >= _T('0')) - { - for (;;) - { - int c=*(++s); - if (c >= _T('0') && c <= _T('7')) c-=_T('0'); - else break; - v<<=3; - v+=c; - } - } - else - { - int sign=0; - if (*s == _T('-')) sign++; else s--; - for (;;) - { - int c=*(++s) - _T('0'); - if (c < 0 || c > 9) break; - v*=10; - v+=c; - } - if (sign) v = -v; - } - - // Support for simple ORed expressions - if (*s == _T('|')) - { - v |= myatoi_or(s+1); - } - - return v; -} - -INT_PTR NSISCALL popintptr() -{ - TCHAR buf[128]; - if (popstringn(buf,COUNTOF(buf))) - return 0; - return nsishelper_str_to_ptr(buf); -} - -int NSISCALL popint_or() -{ - TCHAR buf[128]; - if (popstringn(buf,COUNTOF(buf))) - return 0; - return myatoi_or(buf); -} - -void NSISCALL pushintptr(INT_PTR value) -{ - TCHAR buffer[30]; - wsprintf(buffer, sizeof(void*) > 4 ? _T("%Id") : _T("%d"), value); - pushstring(buffer); -} diff --git a/data/nsis/Contrib/Inetc/pluginapi.h b/data/nsis/Contrib/Inetc/pluginapi.h deleted file mode 100644 index ca671a8ed..000000000 --- a/data/nsis/Contrib/Inetc/pluginapi.h +++ /dev/null @@ -1,104 +0,0 @@ -#ifndef ___NSIS_PLUGIN__H___ -#define ___NSIS_PLUGIN__H___ - -#ifdef __cplusplus -extern "C" { -#endif - -#include "api.h" -#include "nsis_tchar.h" - -#ifndef NSISCALL -# define NSISCALL __stdcall -#endif - -#define EXDLL_INIT() { \ - g_stringsize=string_size; \ - g_stacktop=stacktop; \ - g_variables=variables; } - -typedef struct _stack_t { - struct _stack_t *next; - TCHAR text[1]; // this should be the length of string_size -} stack_t; - -enum -{ -INST_0, // $0 -INST_1, // $1 -INST_2, // $2 -INST_3, // $3 -INST_4, // $4 -INST_5, // $5 -INST_6, // $6 -INST_7, // $7 -INST_8, // $8 -INST_9, // $9 -INST_R0, // $R0 -INST_R1, // $R1 -INST_R2, // $R2 -INST_R3, // $R3 -INST_R4, // $R4 -INST_R5, // $R5 -INST_R6, // $R6 -INST_R7, // $R7 -INST_R8, // $R8 -INST_R9, // $R9 -INST_CMDLINE, // $CMDLINE -INST_INSTDIR, // $INSTDIR -INST_OUTDIR, // $OUTDIR -INST_EXEDIR, // $EXEDIR -INST_LANG, // $LANGUAGE -__INST_LAST -}; - -extern unsigned int g_stringsize; -extern stack_t **g_stacktop; -extern TCHAR *g_variables; - -void NSISCALL pushstring(const TCHAR *str); -void NSISCALL pushintptr(INT_PTR value); -#define pushint(v) pushintptr((INT_PTR)(v)) -int NSISCALL popstring(TCHAR *str); // 0 on success, 1 on empty stack -int NSISCALL popstringn(TCHAR *str, int maxlen); // with length limit, pass 0 for g_stringsize -INT_PTR NSISCALL popintptr(); -#define popint() ( (int) popintptr() ) -int NSISCALL popint_or(); // with support for or'ing (2|4|8) -INT_PTR NSISCALL nsishelper_str_to_ptr(const TCHAR *s); -#define myatoi(s) ( (int) nsishelper_str_to_ptr(s) ) // converts a string to an integer -unsigned int NSISCALL myatou(const TCHAR *s); // converts a string to an unsigned integer, decimal only -int NSISCALL myatoi_or(const TCHAR *s); // with support for or'ing (2|4|8) -TCHAR* NSISCALL getuservariable(const int varnum); -void NSISCALL setuservariable(const int varnum, const TCHAR *var); - -#ifdef _UNICODE -#define PopStringW(x) popstring(x) -#define PushStringW(x) pushstring(x) -#define SetUserVariableW(x,y) setuservariable(x,y) - -int NSISCALL PopStringA(char* ansiStr); -void NSISCALL PushStringA(const char* ansiStr); -void NSISCALL GetUserVariableW(const int varnum, wchar_t* wideStr); -void NSISCALL GetUserVariableA(const int varnum, char* ansiStr); -void NSISCALL SetUserVariableA(const int varnum, const char* ansiStr); - -#else -// ANSI defs - -#define PopStringA(x) popstring(x) -#define PushStringA(x) pushstring(x) -#define SetUserVariableA(x,y) setuservariable(x,y) - -int NSISCALL PopStringW(wchar_t* wideStr); -void NSISCALL PushStringW(wchar_t* wideStr); -void NSISCALL GetUserVariableW(const int varnum, wchar_t* wideStr); -void NSISCALL GetUserVariableA(const int varnum, char* ansiStr); -void NSISCALL SetUserVariableW(const int varnum, const wchar_t* wideStr); - -#endif - -#ifdef __cplusplus -} -#endif - -#endif//!___NSIS_PLUGIN__H___ diff --git a/data/nsis/Contrib/Inetc/resource.h b/data/nsis/Contrib/Inetc/resource.h deleted file mode 100644 index 17d43c349..000000000 --- a/data/nsis/Contrib/Inetc/resource.h +++ /dev/null @@ -1,47 +0,0 @@ -//{{NO_DEPENDENCIES}} -// Microsoft Developer Studio generated include file. -// Used by inetc.rc -// -#define IDC_SLOGIN 8 -#define IDC_PROGRESS 10 -#define IDC_SUBTEXT 11 -#define IDC_SPWD 11 -#define IDC_ICON1 12 -#define IDD_DIALOG1 101 -#define IDI_ICON1 102 -#define IDI_ICON2 103 -#define IDD_AUTH 104 -#define IDI_ICON3 105 -#define IDI_ICON4 106 -#define IDI_ICON5 107 -#define IDD_DIALOG2 108 -#define IDI_ICON6 109 -#define IDD_DIALOG3 110 -#define IDC_STATIC1 1001 -#define IDC_STATIC2 1002 -#define IDC_STATIC3 1003 -#define IDC_STATIC4 1004 -#define IDC_PROGRESS1 1005 -#define IDC_STATIC5 1006 -#define IDC_STATIC6 1007 -#define IDC_STATIC12 1008 -#define IDC_STATIC13 1009 -#define IDC_STATIC20 1009 -#define IDC_STATIC21 1010 -#define IDC_STATIC22 1011 -#define IDC_STATIC23 1012 -#define IDC_STATIC24 1013 -#define IDC_STATIC25 1014 -#define IDC_ELOGIN 1015 -#define IDC_EPWD 1016 - -// Next default values for new objects -// -#ifdef APSTUDIO_INVOKED -#ifndef APSTUDIO_READONLY_SYMBOLS -#define _APS_NEXT_RESOURCE_VALUE 111 -#define _APS_NEXT_COMMAND_VALUE 40001 -#define _APS_NEXT_CONTROL_VALUE 1018 -#define _APS_NEXT_SYMED_VALUE 101 -#endif -#endif diff --git a/data/nsis/Contrib/md5dll/MD5.cpp b/data/nsis/Contrib/md5dll/MD5.cpp deleted file mode 100644 index 588ae6c21..000000000 --- a/data/nsis/Contrib/md5dll/MD5.cpp +++ /dev/null @@ -1,367 +0,0 @@ -///////////////////////////////////////////////////////////////////////// -// MD5.cpp -// Implementation file for MD5 class -// -// This C++ Class implementation of the original RSA Data Security, Inc. -// MD5 Message-Digest Algorithm is copyright (c) 2002, Gary McNickle. -// All rights reserved. This software is a derivative of the "RSA Data -// Security, Inc. MD5 Message-Digest Algorithm" -// -// You may use this software free of any charge, but without any -// warranty or implied warranty, provided that you follow the terms -// of the original RSA copyright, listed below. -// -// Original RSA Data Security, Inc. Copyright notice -///////////////////////////////////////////////////////////////////////// -// -// Copyright (C) 1991-2, RSA Data Security, Inc. Created 1991. All -// rights reserved. -// -// License to copy and use this software is granted provided that it -// is identified as the "RSA Data Security, Inc. MD5 Message-Digest -// Algorithm" in all material mentioning or referencing this software -// or this function. -// License is also granted to make and use derivative works provided -// that such works are identified as "derived from the RSA Data -// Security, Inc. MD5 Message-Digest Algorithm" in all material -// mentioning or referencing the derived work. -// RSA Data Security, Inc. makes no representations concerning either -// the merchantability of this software or the suitability of this -// software for any particular purpose. It is provided "as is" -// without express or implied warranty of any kind. -// These notices must be retained in any copies of any part of this -// documentation and/or software. -///////////////////////////////////////////////////////////////////////// - -#if 0 -#include -#include -#include -#include -#else -#define WIN32_LEAN_AND_MEAN -#include -#endif -#include "md5.h" - - -static unsigned char PADDING[64] = -{ - 0x80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 -}; - -#define S11 7 -#define S12 12 -#define S13 17 -#define S14 22 -#define S21 5 -#define S22 9 -#define S23 14 -#define S24 20 -#define S31 4 -#define S32 11 -#define S33 16 -#define S34 23 -#define S41 6 -#define S42 10 -#define S43 15 -#define S44 21 - - -// local version of memcpy -static void *lmemcpy(void *dest, const void *source, uint4 count) -{ - register char *dst=(char *)dest; - register char *src=(char *)source; - while (count--) - { - *dst = *src; - dst++; - src++; - } - return dest; -} - - -// PrintMD5: Converts a completed md5 digest into a char* string. -char* PrintMD5(uchar md5Digest[16]) -{ - char chBuffer[256]; - char chEach[10]; - int nCount; - - register int i; - //memset(chBuffer,0,256); - for (i = 0; i < 64; i++) ((uint4 *)chBuffer)[i] = 0UL; - //memset(chEach, 0, 10); - for (i = 0; i < 10; i++) chEach[i] = 0; - - for (nCount = 0; nCount < 16; nCount++) - { - wsprintf(chEach, "%02x", md5Digest[nCount]); - lstrcat(chBuffer, chEach /*, sizeof(chEach)*/); - } - - char *Tmp = new char[256]; - lstrcpyn(Tmp,chBuffer,256); Tmp[255]='0'; - return Tmp; - //return strdup(chBuffer); -} - -#if defined(ENABLE_GETMD5STRING) || defined (ENABLE_GETMD5RANDOM) -// MD5String: Performs the MD5 algorithm on a char* string, returning -// the results as a char*. -char* MD5String(char* szString) -{ - int nLen = lstrlen(szString); - md5 alg; - - alg.Update((unsigned char*)szString, (unsigned int)nLen); - alg.Finalize(); - - return PrintMD5(alg.Digest()); - -} -#endif - -#if defined(ENABLE_GETMD5FILE) -// MD5File: Performs the MD5 algorithm on a file (binar or text), -// returning the results as a char*. Returns NULL if it fails. -char* MD5File(char* szFilename) -{ - HANDLE file; - md5 alg; - unsigned long nLen; - unsigned char chBuffer[1024]; - -// try - { - //memset(chBuffer, 0, 1024); - for (register int i = 0; i < 256; i++) ((uint4 *)chBuffer)[i] = 0UL; - - if ((file = CreateFile(szFilename, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0)) != INVALID_HANDLE_VALUE ) - { - while ((ReadFile(file, chBuffer, 1024, &nLen, NULL) != FALSE) && nLen) - alg.Update(chBuffer, nLen); - - alg.Finalize(); - - CloseHandle(file); - - return PrintMD5(alg.Digest()); - } - } -// catch(...) - { - - } - - return NULL; // failed -} -#endif - - -// md5::Init -// Initializes a new context. -void md5::Init() -{ - //memset(m_Count, 0, 2 * sizeof(uint4)); - m_Count[0] = m_Count[1] = 0; - - m_State[0] = 0x67452301; - m_State[1] = 0xefcdab89; - m_State[2] = 0x98badcfe; - m_State[3] = 0x10325476; -} - -// md5::Update -// MD5 block update operation. Continues an MD5 message-digest -// operation, processing another message block, and updating the -// context. -void md5::Update(uchar* chInput, uint4 nInputLen) -{ - uint4 i, index, partLen; - - // Compute number of bytes mod 64 - index = (unsigned int)((m_Count[0] >> 3) & 0x3F); - - // Update number of bits - if ((m_Count[0] += (nInputLen << 3)) < (nInputLen << 3)) - m_Count[1]++; - - m_Count[1] += (nInputLen >> 29); - - partLen = 64 - index; - - // Transform as many times as possible. - if (nInputLen >= partLen) - { - lmemcpy( &m_Buffer[index], chInput, partLen ); - Transform(m_Buffer); - - for (i = partLen; i + 63 < nInputLen; i += 64) - Transform(&chInput[i]); - - index = 0; - } - else - i = 0; - - // Buffer remaining input - lmemcpy( &m_Buffer[index], &chInput[i], nInputLen-i ); -} - -// md5::Finalize -// MD5 finalization. Ends an MD5 message-digest operation, writing -// the message digest and zeroizing the context. -void md5::Finalize() -{ - uchar bits[8]; - uint4 index, padLen; - - // Save number of bits - Encode (bits, m_Count, 8); - - // Pad out to 56 mod 64 - index = (unsigned int)((m_Count[0] >> 3) & 0x3f); - padLen = (index < 56) ? (56 - index) : (120 - index); - Update(PADDING, padLen); - - // Append length (before padding) - Update (bits, 8); - - // Store state in digest - Encode (m_Digest, m_State, 16); - - //memset(m_Count, 0, 2 * sizeof(uint4)); - m_Count[0] = m_Count[1] = 0; - //memset(m_State, 0, 4 * sizeof(uint4)); - m_State[0] = m_State[1] = m_State[2] = m_State[3] = 0; - //memset(m_Buffer,0, 64 * sizeof(uchar)); - for (register int i = 0; i < 16; i++) ((uint4 *)m_Buffer)[i] = 0UL; -} - -// md5::Transform -// MD5 basic transformation. Transforms state based on block. -void md5::Transform (uchar* block) -{ - uint4 a = m_State[0], b = m_State[1], c = m_State[2], d = m_State[3], x[16]; - - Decode (x, block, 64); - - // Round 1 - FF (a, b, c, d, x[ 0], S11, 0xd76aa478); - FF (d, a, b, c, x[ 1], S12, 0xe8c7b756); - FF (c, d, a, b, x[ 2], S13, 0x242070db); - FF (b, c, d, a, x[ 3], S14, 0xc1bdceee); - FF (a, b, c, d, x[ 4], S11, 0xf57c0faf); - FF (d, a, b, c, x[ 5], S12, 0x4787c62a); - FF (c, d, a, b, x[ 6], S13, 0xa8304613); - FF (b, c, d, a, x[ 7], S14, 0xfd469501); - FF (a, b, c, d, x[ 8], S11, 0x698098d8); - FF (d, a, b, c, x[ 9], S12, 0x8b44f7af); - FF (c, d, a, b, x[10], S13, 0xffff5bb1); - FF (b, c, d, a, x[11], S14, 0x895cd7be); - FF (a, b, c, d, x[12], S11, 0x6b901122); - FF (d, a, b, c, x[13], S12, 0xfd987193); - FF (c, d, a, b, x[14], S13, 0xa679438e); - FF (b, c, d, a, x[15], S14, 0x49b40821); - - // Round 2 - GG (a, b, c, d, x[ 1], S21, 0xf61e2562); - GG (d, a, b, c, x[ 6], S22, 0xc040b340); - GG (c, d, a, b, x[11], S23, 0x265e5a51); - GG (b, c, d, a, x[ 0], S24, 0xe9b6c7aa); - GG (a, b, c, d, x[ 5], S21, 0xd62f105d); - GG (d, a, b, c, x[10], S22, 0x2441453); - GG (c, d, a, b, x[15], S23, 0xd8a1e681); - GG (b, c, d, a, x[ 4], S24, 0xe7d3fbc8); - GG (a, b, c, d, x[ 9], S21, 0x21e1cde6); - GG (d, a, b, c, x[14], S22, 0xc33707d6); - GG (c, d, a, b, x[ 3], S23, 0xf4d50d87); - GG (b, c, d, a, x[ 8], S24, 0x455a14ed); - GG (a, b, c, d, x[13], S21, 0xa9e3e905); - GG (d, a, b, c, x[ 2], S22, 0xfcefa3f8); - GG (c, d, a, b, x[ 7], S23, 0x676f02d9); - GG (b, c, d, a, x[12], S24, 0x8d2a4c8a); - - // Round 3 - HH (a, b, c, d, x[ 5], S31, 0xfffa3942); - HH (d, a, b, c, x[ 8], S32, 0x8771f681); - HH (c, d, a, b, x[11], S33, 0x6d9d6122); - HH (b, c, d, a, x[14], S34, 0xfde5380c); - HH (a, b, c, d, x[ 1], S31, 0xa4beea44); - HH (d, a, b, c, x[ 4], S32, 0x4bdecfa9); - HH (c, d, a, b, x[ 7], S33, 0xf6bb4b60); - HH (b, c, d, a, x[10], S34, 0xbebfbc70); - HH (a, b, c, d, x[13], S31, 0x289b7ec6); - HH (d, a, b, c, x[ 0], S32, 0xeaa127fa); - HH (c, d, a, b, x[ 3], S33, 0xd4ef3085); - HH (b, c, d, a, x[ 6], S34, 0x4881d05); - HH (a, b, c, d, x[ 9], S31, 0xd9d4d039); - HH (d, a, b, c, x[12], S32, 0xe6db99e5); - HH (c, d, a, b, x[15], S33, 0x1fa27cf8); - HH (b, c, d, a, x[ 2], S34, 0xc4ac5665); - - // Round 4 - II (a, b, c, d, x[ 0], S41, 0xf4292244); - II (d, a, b, c, x[ 7], S42, 0x432aff97); - II (c, d, a, b, x[14], S43, 0xab9423a7); - II (b, c, d, a, x[ 5], S44, 0xfc93a039); - II (a, b, c, d, x[12], S41, 0x655b59c3); - II (d, a, b, c, x[ 3], S42, 0x8f0ccc92); - II (c, d, a, b, x[10], S43, 0xffeff47d); - II (b, c, d, a, x[ 1], S44, 0x85845dd1); - II (a, b, c, d, x[ 8], S41, 0x6fa87e4f); - II (d, a, b, c, x[15], S42, 0xfe2ce6e0); - II (c, d, a, b, x[ 6], S43, 0xa3014314); - II (b, c, d, a, x[13], S44, 0x4e0811a1); - II (a, b, c, d, x[ 4], S41, 0xf7537e82); - II (d, a, b, c, x[11], S42, 0xbd3af235); - II (c, d, a, b, x[ 2], S43, 0x2ad7d2bb); - II (b, c, d, a, x[ 9], S44, 0xeb86d391); - - m_State[0] += a; - m_State[1] += b; - m_State[2] += c; - m_State[3] += d; - - //memset(x, 0, sizeof(x)); - for (register int i = 0; i < (sizeof(x)/sizeof(*x)); i++) x[i] = 0UL; -} - -// md5::Encode -// Encodes input (uint4) into output (uchar). Assumes nLength is -// a multiple of 4. -void md5::Encode(uchar* dest, uint4* src, uint4 nLength) -{ - uint4 i, j; - - //assert(nLength % 4 == 0); - - for (i = 0, j = 0; j < nLength; i++, j += 4) - { - dest[j] = (uchar)(src[i] & 0xff); - dest[j+1] = (uchar)((src[i] >> 8) & 0xff); - dest[j+2] = (uchar)((src[i] >> 16) & 0xff); - dest[j+3] = (uchar)((src[i] >> 24) & 0xff); - } -} - -// md5::Decode -// Decodes input (uchar) into output (uint4). Assumes nLength is -// a multiple of 4. -void md5::Decode(uint4* dest, uchar* src, uint4 nLength) -{ - uint4 i, j; - - //assert(nLength % 4 == 0); - - for (i = 0, j = 0; j < nLength; i++, j += 4) - { - dest[i] = ((uint4)src[j]) | (((uint4)src[j+1])<<8) | - (((uint4)src[j+2])<<16) | (((uint4)src[j+3])<<24); - } -} \ No newline at end of file diff --git a/data/nsis/Contrib/md5dll/MD5.h b/data/nsis/Contrib/md5dll/MD5.h deleted file mode 100644 index 592ae048d..000000000 --- a/data/nsis/Contrib/md5dll/MD5.h +++ /dev/null @@ -1,100 +0,0 @@ -///////////////////////////////////////////////////////////////////////// -// MD5.cpp -// Implementation file for MD5 class -// -// This C++ Class implementation of the original RSA Data Security, Inc. -// MD5 Message-Digest Algorithm is copyright (c) 2002, Gary McNickle. -// All rights reserved. This software is a derivative of the "RSA Data -// Security, Inc. MD5 Message-Digest Algorithm" -// -// You may use this software free of any charge, but without any -// warranty or implied warranty, provided that you follow the terms -// of the original RSA copyright, listed below. -// -// Original RSA Data Security, Inc. Copyright notice -///////////////////////////////////////////////////////////////////////// -// -// Copyright (C) 1991-2, RSA Data Security, Inc. Created 1991. All -// rights reserved. -// -// License to copy and use this software is granted provided that it -// is identified as the "RSA Data Security, Inc. MD5 Message-Digest -// Algorithm" in all material mentioning or referencing this software -// or this function. -// License is also granted to make and use derivative works provided -// that such works are identified as "derived from the RSA Data -// Security, Inc. MD5 Message-Digest Algorithm" in all material -// mentioning or referencing the derived work. -// RSA Data Security, Inc. makes no representations concerning either -// the merchantability of this software or the suitability of this -// software for any particular purpose. It is provided "as is" -// without express or implied warranty of any kind. -// These notices must be retained in any copies of any part of this -// documentation and/or software. -///////////////////////////////////////////////////////////////////////// - -typedef unsigned int uint4; -typedef unsigned short int uint2; -typedef unsigned char uchar; - -char* PrintMD5(uchar md5Digest[16]); -#if defined(ENABLE_GETMD5STRING) || defined (ENABLE_GETMD5RANDOM) -char* MD5String(char* szString); -#endif -#if defined(ENABLE_GETMD5FILE) -char* MD5File(char* szFilename); -#endif - -class md5 -{ -// Methods -public: - md5() { Init(); } - void Init(); - void Update(uchar* chInput, uint4 nInputLen); - void Finalize(); - uchar* Digest() { return m_Digest; } - -private: - - void Transform(uchar* block); - void Encode(uchar* dest, uint4* src, uint4 nLength); - void Decode(uint4* dest, uchar* src, uint4 nLength); - - - inline uint4 rotate_left(uint4 x, uint4 n) - { return ((x << n) | (x >> (32-n))); } - - inline uint4 F(uint4 x, uint4 y, uint4 z) - { return ((x & y) | (~x & z)); } - - inline uint4 G(uint4 x, uint4 y, uint4 z) - { return ((x & z) | (y & ~z)); } - - inline uint4 H(uint4 x, uint4 y, uint4 z) - { return (x ^ y ^ z); } - - inline uint4 I(uint4 x, uint4 y, uint4 z) - { return (y ^ (x | ~z)); } - - inline void FF(uint4& a, uint4 b, uint4 c, uint4 d, uint4 x, uint4 s, uint4 ac) - { a += F(b, c, d) + x + ac; a = rotate_left(a, s); a += b; } - - inline void GG(uint4& a, uint4 b, uint4 c, uint4 d, uint4 x, uint4 s, uint4 ac) - { a += G(b, c, d) + x + ac; a = rotate_left(a, s); a += b; } - - inline void HH(uint4& a, uint4 b, uint4 c, uint4 d, uint4 x, uint4 s, uint4 ac) - { a += H(b, c, d) + x + ac; a = rotate_left(a, s); a += b; } - - inline void II(uint4& a, uint4 b, uint4 c, uint4 d, uint4 x, uint4 s, uint4 ac) - { a += I(b, c, d) + x + ac; a = rotate_left(a, s); a += b; } - -// Data -private: - uint4 m_State[4]; - uint4 m_Count[2]; - uchar m_Buffer[64]; - uchar m_Digest[16]; - uchar m_Finalized; - -}; \ No newline at end of file diff --git a/data/nsis/Contrib/md5dll/MD5Example.nsi b/data/nsis/Contrib/md5dll/MD5Example.nsi deleted file mode 100644 index 65d0f1232..000000000 --- a/data/nsis/Contrib/md5dll/MD5Example.nsi +++ /dev/null @@ -1,55 +0,0 @@ -/************************************************************** - *** Generates a md5 value from a file, string or random. *** - **************************************************************/ - -Name "MD5dll Example" -OutFile "MD5dllTest.exe" -ShowInstDetails show - -Section - # generate MD5sum of file - StrCpy $0 "${NSISDIR}\NSIS.CHM" - md5dll::GetMD5File "$0" - Pop $1 - - DetailPrint 'md5dll::GetMD5File "$0"' - DetailPrint "MD5: [$1]" - DetailPrint "" - - # generate MD5sum of file using deprecated method - StrCpy $0 "${NSISDIR}\NSIS.CHM" - md5dll::GetFileMD5 "$0" - Pop $1 - - DetailPrint '{deprecated} md5dll::GetFileMD5 "$0"' - DetailPrint "MD5: [$1]" - DetailPrint "" - - - #generate MD5sum of string - StrCpy $0 "MyString" - md5dll::GetMD5String "$0" - Pop $1 - - DetailPrint 'md5dll::GetMD5String "$0"' - DetailPrint "MD5: [$1]" - DetailPrint "" - - #generate MD5sum of string using deprecated method - StrCpy $0 "MyString" - md5dll::GetMD5 "$0" - Pop $1 - - DetailPrint '{deprecated} md5dll::GetMD5 "$0"' - DetailPrint "MD5: [$1]" - DetailPrint "" - - - #generate random MD5sum - md5dll::GetMD5Random - Pop $1 - - DetailPrint "md5dll::GetMD5Random" - DetailPrint "MD5: [$1]" - DetailPrint "" -SectionEnd diff --git a/data/nsis/Contrib/md5dll/api.h b/data/nsis/Contrib/md5dll/api.h deleted file mode 100644 index 9d7b20797..000000000 --- a/data/nsis/Contrib/md5dll/api.h +++ /dev/null @@ -1,83 +0,0 @@ -/* - * apih - * - * This file is a part of NSIS. - * - * Copyright (C) 1999-2009 Nullsoft and Contributors - * - * Licensed under the zlib/libpng license (the "License"); - * you may not use this file except in compliance with the License. - * - * Licence details can be found in the file COPYING. - * - * This software is provided 'as-is', without any express or implied - * warranty. - */ - -#ifndef _NSIS_EXEHEAD_API_H_ -#define _NSIS_EXEHEAD_API_H_ - -// Starting with NSIS 2.42, you can check the version of the plugin API in exec_flags->plugin_api_version -// The format is 0xXXXXYYYY where X is the major version and Y is the minor version (MAKELONG(y,x)) -// When doing version checks, always remember to use >=, ex: if (pX->exec_flags->plugin_api_version >= NSISPIAPIVER_1_0) {} - -#define NSISPIAPIVER_1_0 0x00010000 -#define NSISPIAPIVER_CURR NSISPIAPIVER_1_0 - -// NSIS Plug-In Callback Messages -enum NSPIM -{ - NSPIM_UNLOAD, // This is the last message a plugin gets, do final cleanup - NSPIM_GUIUNLOAD, // Called after .onGUIEnd -}; - -// Prototype for callbacks registered with extra_parameters->RegisterPluginCallback() -// Return NULL for unknown messages -// Should always be __cdecl for future expansion possibilities -typedef UINT_PTR (*NSISPLUGINCALLBACK)(enum NSPIM); - -// extra_parameters data structures containing other interesting stuff -// but the stack, variables and HWND passed on to plug-ins. -typedef struct -{ - int autoclose; - int all_user_var; - int exec_error; - int abort; - int exec_reboot; // NSIS_SUPPORT_REBOOT - int reboot_called; // NSIS_SUPPORT_REBOOT - int XXX_cur_insttype; // depreacted - int plugin_api_version; // see NSISPIAPIVER_CURR - // used to be XXX_insttype_changed - int silent; // NSIS_CONFIG_SILENT_SUPPORT - int instdir_error; - int rtl; - int errlvl; - int alter_reg_view; - int status_update; -} exec_flags_t; - -#ifndef NSISCALL -# define NSISCALL __stdcall -#endif - -typedef struct { - exec_flags_t *exec_flags; - int (NSISCALL *ExecuteCodeSegment)(int, HWND); - void (NSISCALL *validate_filename)(TCHAR *); - int (NSISCALL *RegisterPluginCallback)(HMODULE, NSISPLUGINCALLBACK); // returns 0 on success, 1 if already registered and < 0 on errors -} extra_parameters; - -// Definitions for page showing plug-ins -// See Ui.c to understand better how they're used - -// sent to the outer window to tell it to go to the next inner window -#define WM_NOTIFY_OUTER_NEXT (WM_USER+0x8) - -// custom pages should send this message to let NSIS know they're ready -#define WM_NOTIFY_CUSTOM_READY (WM_USER+0xd) - -// sent as wParam with WM_NOTIFY_OUTER_NEXT when user cancels - heed its warning -#define NOTIFY_BYE_BYE 'x' - -#endif /* _PLUGIN_H_ */ diff --git a/data/nsis/Contrib/md5dll/build.bat b/data/nsis/Contrib/md5dll/build.bat deleted file mode 100644 index c20bb1f32..000000000 --- a/data/nsis/Contrib/md5dll/build.bat +++ /dev/null @@ -1,17 +0,0 @@ -@echo Building MD5dll -@set md5unicode= -@if not "%1"=="/u" goto skipU -@set md5unicode=/DNSIS_UNICODE -@:skipU -@REM compile dll -rc /l 0x409 /d "NDEBUG" %md5unicode% md5dll.rc -cl /O2 /GX- /Gs- /Oi /Os /GF /GB /DENABLE_GETMD5FILE /DENABLE_GETMD5STRING /DENABLE_GETMD5RANDOM %md5unicode% md5dll.def md5dll.res md5dll.cpp MD5.cpp kernel32.lib user32.lib /LD /link -opt:nowin98 -opt:REF,ICF -machine:I386 -nodefaultlib -entry:"_DllMainCRTStartup" -::@REM build optional link lib -::lib /DEF:md5dll.def /machine:I386 -@REM removing unneeded files -del *.obj -del md5dll.res -del md5dll.exp -del md5dll.lib -@set md5unicode= -@PAUSE diff --git a/data/nsis/Contrib/md5dll/md5dll.cpp b/data/nsis/Contrib/md5dll/md5dll.cpp deleted file mode 100644 index 4c3876ca6..000000000 --- a/data/nsis/Contrib/md5dll/md5dll.cpp +++ /dev/null @@ -1,140 +0,0 @@ -// MD5 plugin. -// Be sure to add the RSA license notice somewhere in your installer. -// -// Matthew "IGx89" Lieder -// Author -// -// KJD -// -modified to reduce size and use exdll.h -// (reduced to about 6KB uncompressed, by removing CRTL dependency) -// -// Davy Durham -// -MD5.cpp fix (correct for loop used to replace memset, exceeded bounds) -// -// Shengalts Aleksander aka Instructor -// -New command: "GetMD5Random" -// -Changed names: "GetFileMD5" -> "GetMD5File", "GetMD5" -> "GetMD5String" -// -Fixed: string lenght error -// -// KJD -// -added dual exports for compatibility with prior versions -// -// KJD -// -updated Exdll.h to pluginapi.h, enable building for NSIS & Unicode NSIS - - -#ifdef NSIS_UNICODE /* MD5.cpp should be compiled in ANSI mode */ -#define UNICODE -#define _UNICODE -#endif - - -#define WIN32_LEAN_AND_MEAN -#include -#include "MD5.h" - -unsigned char staticCnvBuffer[1024*2]; -#ifdef UNICODE -#define wcslen lstrlenW -#define wcscpy lstrcpyW -#define wcsncpy lstrcpynW -#define wcscat lstrcatW -#define wcscmp lstrcmpW -#define wcscmpi lstrcmpiW -char * _T2A(unsigned short *wideStr) -{ - WideCharToMultiByte(CP_ACP, 0, wideStr, -1, (char *)staticCnvBuffer, sizeof(staticCnvBuffer), NULL, NULL); - return (char *)staticCnvBuffer; -} -#define _A2T(x) _A2U(x) -#else -#define strlen lstrlenA -#define strcpy lstrcpyA -#define strncpy lstrcpynA -#define strcat lstrcatA -#define strcmp lstrcmpA -#define strcmpi lstrcmpiA -#define _T2A(x) (x) -#define _A2T(x) (x) -#endif -unsigned short * _A2U(char *ansiStr) -{ - MultiByteToWideChar(CP_ACP, 0, ansiStr, -1, (unsigned short *)staticCnvBuffer, sizeof(staticCnvBuffer)/2); - return (unsigned short *)staticCnvBuffer; -} - -#include "pluginapi.h" - - -void *operator new( unsigned int num_bytes ) -{ - return GlobalAlloc(GPTR,num_bytes); -} -void operator delete( void *p ) { if (p) GlobalFree(p); } - - -/* buffer for retrieving arguments from NSIS's stack into, outside func to avoid calls to __stkchk */ -TCHAR strarg[1024*sizeof(TCHAR)]; - -#ifdef ENABLE_GETMD5FILE -extern "C" void __declspec( dllexport ) GetMD5File(HWND hwndParent, int string_size, - TCHAR *variables, stack_t **stacktop) -{ - EXDLL_INIT(); - - // generate MD5sum of file - { - char *buf=NULL; - - popstring(strarg); - buf = MD5File(_T2A(strarg)); - pushstring(_A2T(buf)); - delete buf; - } -} -#endif // ENABLE_GETMD5FILE - -#ifdef ENABLE_GETMD5STRING -extern "C" void __declspec( dllexport ) GetMD5String(HWND hwndParent, int string_size, - TCHAR *variables, stack_t **stacktop) -{ - EXDLL_INIT(); - - // generate MD5sum of string - { - char *buf=NULL; - - popstring(strarg); - buf = MD5String(_T2A(strarg)); - pushstring(_A2T(buf)); - delete buf; - } -} -#endif // ENABLE_GETMD5STRING - -#ifdef ENABLE_GETMD5RANDOM -extern "C" void __declspec( dllexport ) GetMD5Random(HWND hwndParent, int string_size, - TCHAR *variables, stack_t **stacktop) -{ - EXDLL_INIT(); - - // generate random MD5sum - { - DWORD dwTickCount=0; - char lTickCount[1024]; - char *buf=NULL; - - Sleep(1); - dwTickCount=GetTickCount(); - wsprintfA(lTickCount,"%d",dwTickCount); - buf = MD5String(lTickCount); - pushstring(_A2T(buf)); - delete buf; - } -} -#endif // ENABLE_GETMD5RANDOM - -extern "C" BOOL WINAPI _DllMainCRTStartup(HANDLE hInst, ULONG ul_reason_for_call, LPVOID lpReserved) -{ - return TRUE; -} diff --git a/data/nsis/Contrib/md5dll/md5dll.def b/data/nsis/Contrib/md5dll/md5dll.def deleted file mode 100644 index 3eaae15bc..000000000 --- a/data/nsis/Contrib/md5dll/md5dll.def +++ /dev/null @@ -1,10 +0,0 @@ -LIBRARY MD5DLL -DESCRIPTION "Implements MD5 Sum as NSIS plugin" -EXPORTS -GetMD5File @1 -GetMD5String @2 -GetMD5Random @3 - -;These are for compatibility with older versions of this plugin only {deprecated} -GetFileMD5=GetMD5File @101 PRIVATE -GetMD5=GetMD5String @102 PRIVATE diff --git a/data/nsis/Contrib/md5dll/md5dll.rc b/data/nsis/Contrib/md5dll/md5dll.rc deleted file mode 100644 index a1cb8f72c..000000000 --- a/data/nsis/Contrib/md5dll/md5dll.rc +++ /dev/null @@ -1,100 +0,0 @@ -#include - -#define APP_ICON 100 - -#ifdef RC_INVOKED - -// Pretty icon displayed by Explorer -// APP_ICON ICON DISCARDABLE "md5dll.ico" - -// Version info viewable by Explorer -#define _VM 0 -#define _VN 5 -#define _VI 0 -#define _VB 0 - -#ifndef mk_str -#define mk_str2(x) # x -#define mk_str(x) mk_str2(x) -#endif - -#define _VS mk_str(_VM) "." mk_str(_VN) "." mk_str(_VI) "-" mk_str(_VB) "\0" - - -// normally found in included by -// FILEFLAGS -#define VS_FF_NORMAL 0x00000000L // ok I made this one up -#ifndef VS_FF_DEBUG -#define VS_FF_DEBUG 0x00000001L -#endif -#ifndef VS_FF_PRERELEASE -#define VS_FF_PRERELEASE 0x00000002L -#endif -// FILEOS -#ifndef VOS_NT -#define VOS_NT 0x00040000L -#endif -#ifndef VOS__WINDOWS32 -#define VOS__WINDOWS32 0x00000004L -#endif -#ifndef VOS_NT_WINDOWS32 -#define VOS_NT_WINDOWS32 0x00040004L -#endif -// FILETYPE -#ifndef VFT_APP -#define VFT_APP 0x00000001L -#endif -#ifndef VFT_DLL -#define VFT_DLL 0x00000002L -#endif - - -VS_VERSION_INFO VERSIONINFO - FILEVERSION _VM,_VN,_VI,_VB - PRODUCTVERSION _VM,_VN,_VI,_VB - FILEFLAGSMASK 0x3fL -#ifdef _DEBUG - FILEFLAGS VS_FF_DEBUG | VS_FF_PRERELEASE // a debug build is never a release -#else - FILEFLAGS VS_FF_NORMAL -#endif - FILEOS VOS_NT_WINDOWS32 - FILETYPE VFT_APP - FILESUBTYPE 0x0L -BEGIN - BLOCK "StringFileInfo" - BEGIN - BLOCK "080904b0" - BEGIN - VALUE "Comments", "NSIS plugin to calculate MD5 sum.\0" - VALUE "CompanyName", "www.fdos.org\0" - VALUE "FileDescription", "MD5 message digest algorithm\0" - VALUE "FileVersion", _VS - VALUE "InternalName", "md5dll\0" -// Only about the 1st 45+ characters are shown in Windows 2000 properties Version dialog - VALUE "LegalCopyright", "derivative of RSA Data Security, Inc. MD5 Message-Digest Algorithm\0" - VALUE "LegalTrademarks", "\0" - VALUE "OriginalFilename", "md5dll.dll\0" - VALUE "PrivateBuild", "\0" - VALUE "ProductName", "md5dll\0" - VALUE "ProductVersion", _VS -#ifdef NSIS_UNICODE - VALUE "SpecialBuild", "UNICODE\0" -#else - VALUE "SpecialBuild", "ANSI\0" -#endif - END - END - BLOCK "VarFileInfo" - BEGIN - VALUE "Translation", 0x809, 1200 - END -END - -#undef _VM -#undef _VN -#undef _VI -#undef _VB -#undef _VS - -#endif diff --git a/data/nsis/Contrib/md5dll/nsis_tchar.h b/data/nsis/Contrib/md5dll/nsis_tchar.h deleted file mode 100644 index 92e989e31..000000000 --- a/data/nsis/Contrib/md5dll/nsis_tchar.h +++ /dev/null @@ -1,215 +0,0 @@ -/* - * nsis_tchar.h - * - * This file is a part of NSIS. - * - * Copyright (C) 1999-2007 Nullsoft and Contributors - * - * This software is provided 'as-is', without any express or implied - * warranty. - * - * For Unicode support by Jim Park -- 08/30/2007 - */ - -// Jim Park: Only those we use are listed here. - -#pragma once - -#ifdef _UNICODE - -#ifndef _T -#define __T(x) L ## x -#define _T(x) __T(x) -#define _TEXT(x) __T(x) -#endif -typedef wchar_t TCHAR; -typedef wchar_t _TUCHAR; - -// program -#define _tmain wmain -#define _tWinMain wWinMain -#define _tenviron _wenviron -#define __targv __wargv - -// printfs -#define _ftprintf fwprintf -#define _sntprintf _snwprintf -#define _stprintf _swprintf -#define _tprintf wprintf -#define _vftprintf vfwprintf -#define _vsntprintf _vsnwprintf -#define _vstprintf _vswprintf - -// scanfs -#define _tscanf wscanf -#define _stscanf swscanf - -// string manipulations -#define _tcscat wcscat -#define _tcschr wcschr -#define _tcsclen wcslen -#define _tcscpy wcscpy -#define _tcsdup _wcsdup -#define _tcslen wcslen -#define _tcsnccpy wcsncpy -#define _tcsncpy wcsncpy -#define _tcsrchr wcsrchr -#define _tcsstr wcsstr -#define _tcstok wcstok - -// string comparisons -#define _tcscmp wcscmp -#define _tcsicmp _wcsicmp -#define _tcsncicmp _wcsnicmp -#define _tcsncmp wcsncmp -#define _tcsnicmp _wcsnicmp - -// upper / lower -#define _tcslwr _wcslwr -#define _tcsupr _wcsupr -#define _totlower towlower -#define _totupper towupper - -// conversions to numbers -#define _tcstoi64 _wcstoi64 -#define _tcstol wcstol -#define _tcstoul wcstoul -#define _tstof _wtof -#define _tstoi _wtoi -#define _tstoi64 _wtoi64 -#define _ttoi _wtoi -#define _ttoi64 _wtoi64 -#define _ttol _wtol - -// conversion from numbers to strings -#define _itot _itow -#define _ltot _ltow -#define _i64tot _i64tow -#define _ui64tot _ui64tow - -// file manipulations -#define _tfopen _wfopen -#define _topen _wopen -#define _tremove _wremove -#define _tunlink _wunlink - -// reading and writing to i/o -#define _fgettc fgetwc -#define _fgetts fgetws -#define _fputts fputws -#define _gettchar getwchar - -// directory -#define _tchdir _wchdir - -// environment -#define _tgetenv _wgetenv -#define _tsystem _wsystem - -// time -#define _tcsftime wcsftime - -#else // ANSI - -#ifndef _T -#define _T(x) x -#define _TEXT(x) x -#endif -typedef char TCHAR; -typedef unsigned char _TUCHAR; - -// program -#define _tmain main -#define _tWinMain WinMain -#define _tenviron environ -#define __targv __argv - -// printfs -#define _ftprintf fprintf -#define _sntprintf _snprintf -#define _stprintf sprintf -#define _tprintf printf -#define _vftprintf vfprintf -#define _vsntprintf _vsnprintf -#define _vstprintf vsprintf - -// scanfs -#define _tscanf scanf -#define _stscanf sscanf - -// string manipulations -#define _tcscat strcat -#define _tcschr strchr -#define _tcsclen strlen -#define _tcscnlen strnlen -#define _tcscpy strcpy -#define _tcsdup _strdup -#define _tcslen strlen -#define _tcsnccpy strncpy -#define _tcsncpy strncpy -#define _tcsrchr strrchr -#define _tcsstr strstr -#define _tcstok strtok - -// string comparisons -#define _tcscmp strcmp -#define _tcsicmp _stricmp -#define _tcsncmp strncmp -#define _tcsncicmp _strnicmp -#define _tcsnicmp _strnicmp - -// upper / lower -#define _tcslwr _strlwr -#define _tcsupr _strupr - -#define _totupper toupper -#define _totlower tolower - -// conversions to numbers -#define _tcstol strtol -#define _tcstoul strtoul -#define _tstof atof -#define _tstoi atoi -#define _tstoi64 _atoi64 -#define _tstoi64 _atoi64 -#define _ttoi atoi -#define _ttoi64 _atoi64 -#define _ttol atol - -// conversion from numbers to strings -#define _i64tot _i64toa -#define _itot _itoa -#define _ltot _ltoa -#define _ui64tot _ui64toa - -// file manipulations -#define _tfopen fopen -#define _topen _open -#define _tremove remove -#define _tunlink _unlink - -// reading and writing to i/o -#define _fgettc fgetc -#define _fgetts fgets -#define _fputts fputs -#define _gettchar getchar - -// directory -#define _tchdir _chdir - -// environment -#define _tgetenv getenv -#define _tsystem system - -// time -#define _tcsftime strftime - -#endif - -// is functions (the same in Unicode / ANSI) -#define _istgraph isgraph -#define _istascii __isascii - -#define __TFILE__ _T(__FILE__) -#define __TDATE__ _T(__DATE__) -#define __TTIME__ _T(__TIME__) diff --git a/data/nsis/Contrib/md5dll/pluginapi.h b/data/nsis/Contrib/md5dll/pluginapi.h deleted file mode 100644 index 86dee2fb3..000000000 --- a/data/nsis/Contrib/md5dll/pluginapi.h +++ /dev/null @@ -1,103 +0,0 @@ -// only include this file from one place in your DLL. -// (it is all static, if you use it in two places it will fail) - -#ifndef ___NSIS_PLUGIN__H___ -#define ___NSIS_PLUGIN__H___ - -#ifdef __cplusplus -extern "C" { -#endif - -#include "api.h" -#include "nsis_tchar.h" - -#ifndef NSISCALL -# define NSISCALL __stdcall -#endif - -#define EXDLL_INIT() { \ - g_stringsize=string_size; \ - g_stacktop=stacktop; \ - g_variables=variables; } - -typedef struct _stack_t { - struct _stack_t *next; - TCHAR text[1]; // this should be the length of string_size -} stack_t; - -enum -{ -INST_0, // $0 -INST_1, // $1 -INST_2, // $2 -INST_3, // $3 -INST_4, // $4 -INST_5, // $5 -INST_6, // $6 -INST_7, // $7 -INST_8, // $8 -INST_9, // $9 -INST_R0, // $R0 -INST_R1, // $R1 -INST_R2, // $R2 -INST_R3, // $R3 -INST_R4, // $R4 -INST_R5, // $R5 -INST_R6, // $R6 -INST_R7, // $R7 -INST_R8, // $R8 -INST_R9, // $R9 -INST_CMDLINE, // $CMDLINE -INST_INSTDIR, // $INSTDIR -INST_OUTDIR, // $OUTDIR -INST_EXEDIR, // $EXEDIR -INST_LANG, // $LANGUAGE -__INST_LAST -}; - - -static unsigned int g_stringsize; -static stack_t **g_stacktop; -static TCHAR *g_variables; - - -// utility functions (not required but often useful) -static int NSISCALL popstring(TCHAR *str) -{ - stack_t *th; - if (!g_stacktop || !*g_stacktop) return 1; - th=(*g_stacktop); - _tcscpy(str,th->text); - *g_stacktop = th->next; - GlobalFree((HGLOBAL)th); - return 0; -} - -static void NSISCALL pushstring(const TCHAR *str) -{ - stack_t *th; - if (!g_stacktop) return; - th=(stack_t*)GlobalAlloc(GPTR,sizeof(stack_t)+g_stringsize); - _tcsncpy(th->text,str,g_stringsize); - th->next=*g_stacktop; - *g_stacktop=th; -} - -static TCHAR * NSISCALL getuservariable(const int varnum) -{ - if (varnum < 0 || varnum >= __INST_LAST) return NULL; - return g_variables+varnum*g_stringsize; -} - -static void NSISCALL setuservariable(const int varnum, const TCHAR *var) -{ - if (var != NULL && varnum >= 0 && varnum < __INST_LAST) - _tcscpy(g_variables + varnum*g_stringsize, var); -} - - -#ifdef __cplusplus -} -#endif - -#endif//!___NSIS_PLUGIN__H___ diff --git a/data/nsis/Contrib/nsisunz/AggressiveOptimize.h b/data/nsis/Contrib/nsisunz/AggressiveOptimize.h deleted file mode 100644 index 6ab751216..000000000 --- a/data/nsis/Contrib/nsisunz/AggressiveOptimize.h +++ /dev/null @@ -1,92 +0,0 @@ - -////////////////////////////// -// Version 1.30 -// Nov 24th, 2000 -// Version 1.20 -// Jun 9th, 2000 -// Version 1.10 -// Jan 23rd, 2000 -// Version 1.00 -// May 20th, 1999 -// Todd C. Wilson, Fresh Ground Software -// (todd@nopcode.com) -// This header file will kick in settings for Visual C++ 5 and 6 that will (usually) -// result in smaller exe's. -// The "trick" is to tell the compiler to not pad out the function calls; this is done -// by not using the /O1 or /O2 option - if you do, you implicitly use /Gy, which pads -// out each and every function call. In one single 500k dll, I managed to cut out 120k -// by this alone! -// The other two "tricks" are telling the Linker to merge all data-type segments together -// in the exe file. The relocation, read-only (constants) data, and code section (.text) -// sections can almost always be merged. Each section merged can save 4k in exe space, -// since each section is padded out to 4k chunks. This is very noticeable with smaller -// exes, since you could have only 700 bytes of data, 300 bytes of code, 94 bytes of -// strings - padded out, this could be 12k of runtime, for 1094 bytes of stuff! For larger -// programs, this is less overall, but can save at least 4k. -// Note that if you're using MFC static or some other 3rd party libs, you may get poor -// results with merging the readonly (.rdata) section - the exe may grow larger. -// To use this feature, define _MERGE_DATA_ in your project or before this header is used. -// With Visual C++ 5, the program uses a file alignment of 512 bytes, which results -// in a small exe. Under VC6, the program instead uses 4k, which is the same as the -// section size. The reason (from what I understand) is that 4k is the chunk size of -// the virtual memory manager, and that WinAlign (an end-user tuning tool for Win98) -// will re-align the programs on this boundary. The problem with this is that all of -// Microsoft's system exes and dlls are *NOT* tuned like this, and using 4k causes serious -// exe bloat. Very noticeable for smaller programs. -// The "trick" for this is to use the undocumented FILEALIGN linker parm to change the -// padding from 4k to 1/2k, which results in a much smaller exe - anywhere from 20%-75% -// depending on the size. Note that this is the same as using /OPT:NOWIN98, which *is* -// a previously documented switch, but was left out of the docs for some reason in VC6 and -// all of the current MSDN's - see KB:Q235956 for more information. -// Microsoft does say that using the 4k alignment will "speed up process loading", -// but I've been unable to notice a difference, even on my P180, with a very large (4meg) exe. -// Please note, however, that this will probably not change the size of the COMPRESSED -// file (either in a .zip file or in an install archive), since this 4k is all zeroes and -// gets compressed away. -// Also, the /ALIGN:4096 switch will "magically" do the same thing, even though this is the -// default setting for this switch. Apparently this sets the same values as the above two -// switches do. We do not use this in this header, since it smacks of a bug and not a feature. -// Thanks to Michael Geary for some additional tips! - -#ifdef NDEBUG -// /Og (global optimizations), /Os (favor small code), /Oy (no frame pointers) -#pragma optimize("gsy",on) - -#pragma comment(linker,"/RELEASE") - -// Note that merging the .rdata section will result in LARGER exe's if you using -// MFC (esp. static link). If this is desirable, define _MERGE_RDATA_ in your project. -#ifdef _MERGE_RDATA_ -#pragma comment(linker,"/merge:.rdata=.data") -#endif // _MERGE_RDATA_ - -#pragma comment(linker,"/merge:.text=.data") -#pragma comment(linker,"/merge:.reloc=.data") - -// Merging sections with different attributes causes a linker warning, so -// turn off the warning. From Michael Geary. Undocumented, as usual! -#pragma comment(linker,"/ignore:4078") - -// With Visual C++ 5, you already get the 512-byte alignment, so you will only need -// it for VC6, and maybe later. -#if _MSC_VER >= 1000 - -// Option #1: use /filealign -// Totally undocumented! And if you set it lower than 512 bytes, the program crashes. -// Either leave at 0x200 or 0x1000 -//#pragma comment(linker,"/FILEALIGN:0x200") - -// Option #2: use /opt:nowin98 -// See KB:Q235956 or the READMEVC.htm in your VC directory for info on this one. -// This is our currently preferred option, since it is fully documented and unlikely -// to break in service packs and updates. -#pragma comment(linker,"/opt:nowin98") - -// Option #3: use /align:4096 -// A side effect of using the default align value is that it turns on the above switch. -// May break in future versions! -//#pragma comment(linker,"/ALIGN:4096") - -#endif // _MSC_VER >= 1000 - -#endif // NDEBUG diff --git a/data/nsis/Contrib/nsisunz/example.nsi b/data/nsis/Contrib/nsisunz/example.nsi deleted file mode 100644 index e07a58343..000000000 --- a/data/nsis/Contrib/nsisunz/example.nsi +++ /dev/null @@ -1,95 +0,0 @@ -; Example script for nsisunz -; Written by Saivert -; Homepage: http://members.tripod.com/files_saivert/ -; -; Dependencies: -; - nsisunz.dll Plug-in -; - InstallOptions.dll Plug-in -; - zippage.ini (InstallOptions INI file) - -!addplugindir ".\Release" - -OutFile "nsisunz_test.exe" -Name "NSIS Unzip plug-in test" -Caption "NSIS Unzip plug-in test" -ShowInstDetails show -XPStyle on -CompletedText "Extracted!" -SubCaption 3 " - Extracting files" -SubCaption 4 " - Extracted" - -LoadLanguageFile "${NSISDIR}\Contrib\Language files\english.nlf" - -; Installer pages -Page custom onZipPageShow onZipPageLeave " - Select Zip file" -Page instfiles - -; Localized strings for use with nsisunz -; The '%f' in the string is replaced with the filename on run-time. -; "%c", "%u", "%p" and "%p" is replaced with compressed size, -; uncompressed size, percent complete (with "%") and byte complete -; respectively. -LangString nsisunz_text ${LANG_ENGLISH} "Extract: %f (%c -> %b) [%p]" - -Function .onInit - InitPluginsDir - File "/oname=$PLUGINSDIR\zippage.ini" "zippage.ini" -FunctionEnd - -Function onZipPageShow - ; Turn Text control into a button (HM NIS Edit v2.0b5 does not support "Button" type). - WriteINIStr "$PLUGINSDIR\zippage.ini" "Field 12" "Type" "Button" - WriteINIStr "$PLUGINSDIR\zippage.ini" "Field 12" "Flags" "NOTIFY" - - InstallOptions::dialog "$PLUGINSDIR\zippage.ini" -FunctionEnd - -Function onZipPageLeave -; $R0 = zip filename $R1 = dest. folder - - ReadINIStr $R0 "$PLUGINSDIR\zippage.ini" "Field 4" "State" - ReadINIStr $R1 "$PLUGINSDIR\zippage.ini" "Field 6" "State" - - ; Remove trailing backslash if any - StrCpy $0 $R1 1 -1 - StrCmp "$0" "\" 0 notneeded - StrCpy $R1 $R1 -1 - notneeded: - - IfFileExists $R0 checkdir - MessageBox MB_ICONEXCLAMATION|MB_OK 'The file "$R0" does not exist!' - Abort ;return to page - checkdir: - IfFileExists $R1\*.* unzip - MessageBox MB_ICONEXCLAMATION|MB_YESNO 'The folder "$R1" does not exist!$\r$\nDo you wish to create it?' IDNO skipcreate - CreateDirectory $R1 - Goto unzip - skipcreate: - Abort ;return to page - - unzip: -; Just fall of the end, so the sections can be executed -FunctionEnd - -Section -pre - DetailPrint "ZIP file: $R0" - DetailPrint "Dest. folder: $R1" -SectionEnd - -Section -; Check if the checkbox is checked and if it is, then don't extract paths - ReadINIStr $R2 "$PLUGINSDIR\zippage.ini" "Field 7" "State" - StrCmp $R2 "1" 0 usepaths - nsisunz::UnzipToLog /text "$(nsisunz_text)" /noextractpath $R0 $R1 - Goto check - usepaths: - nsisunz::UnzipToLog /text "$(nsisunz_text)" $R0 $R1 - - check: -; Always check for errors. Everything else than "success" means an error. - Pop $0 - StrCmp $0 "success" ok - Abort "$0" - ok: -SectionEnd - diff --git a/data/nsis/Contrib/nsisunz/example_mui.nsi b/data/nsis/Contrib/nsisunz/example_mui.nsi deleted file mode 100644 index 77f528506..000000000 --- a/data/nsis/Contrib/nsisunz/example_mui.nsi +++ /dev/null @@ -1,101 +0,0 @@ -; Example script for nsisunz -; Written by Saivert -; Homepage: http://members.tripod.com/files_saivert/ -; -; Dependencies: -; - nsisunz.dll Plug-in -; - InstallOptions.dll Plug-in -; - zippage.ini (InstallOptions INI file) - -!addplugindir ".\Release" - -!include "MUI.nsh" - -OutFile "nsisunz_testmui.exe" -Name "NSIS Unzip plug-in test" -Caption "NSIS Unzip plug-in test" -ShowInstDetails show -CompletedText "Extracted!" - -; Installer pages -Page custom onZipPageShow onZipPageLeave " " -!define MUI_PAGE_HEADER_TEXT "Extracting" -!define MUI_PAGE_HEADER_SUBTEXT "Extracting files" -!define MUI_INSTFILESPAGE_FINISHHEADER_TEXT "Extracted" -!define MUI_INSTFILESPAGE_FINISHHEADER_SUBTEXT "Thes files has been extracted" -!define MUI_INSTFILESPAGE_ABORTHEADER_TEXT "Extraction aborted" -!define MUI_INSTFILESPAGE_ABORTHEADER_SUBTEXT "The extraction process was aborted" -!insertmacro MUI_PAGE_INSTFILES - -!insertmacro MUI_LANGUAGE "English" - -; Localized strings for use with nsisunz -; The '%f' in the string is replaced with the filename on run-time. -; "%c" and "%u" is replaced with compressed size and uncompressed size -; respectively. -LangString nsisunz_text ${LANG_ENGLISH} "Extract: %f (%c -> %u)" - -Function .onInit - InitPluginsDir - !insertmacro MUI_INSTALLOPTIONS_EXTRACT "zippage.ini" -FunctionEnd - -Function onZipPageShow - !insertmacro MUI_HEADER_TEXT "Unzip" "Select ZIP file and destination folder" - - ; Remove icon (so we get away with one INI file for both scripts) - !insertmacro MUI_INSTALLOPTIONS_WRITE "zippage.ini" "Field 1" "Type" "" - !insertmacro MUI_INSTALLOPTIONS_WRITE "zippage.ini" "Field 2" "Left" "0" - - - !insertmacro MUI_INSTALLOPTIONS_DISPLAY "zippage.ini" -FunctionEnd - -Function onZipPageLeave -; $R0 = zip filename $R1 = dest. folder - - !insertmacro MUI_INSTALLOPTIONS_READ $R0 "zippage.ini" "Field 4" "State" - !insertmacro MUI_INSTALLOPTIONS_READ $R1 "zippage.ini" "Field 6" "State" - - ; Remove trailing backslash if any - StrCpy $0 $R1 1 -1 - StrCmp "$0" "\" 0 notneeded - StrCpy $R1 $R1 -1 - notneeded: - - IfFileExists $R0 checkdir - MessageBox MB_ICONEXCLAMATION|MB_OK 'The file "$R0" does not exist!' - Abort ;return to page - checkdir: - IfFileExists $R1\*.* unzip - MessageBox MB_ICONEXCLAMATION|MB_YESNO 'The folder "$R1" does not exist!$\r$\nDo you wish to create it?' IDNO skipcreate - CreateDirectory $R1 - Goto unzip - skipcreate: - Abort ;return to page - - unzip: -; Just fall of the end, so the sections can be executed -FunctionEnd - -Section -pre - DetailPrint "ZIP file: $R0" - DetailPrint "Dest. folder: $R1" -SectionEnd - -Section -; Check if the checkbox is checked and if it is, then don't extract paths - ReadINIStr $R2 "$PLUGINSDIR\zippage.ini" "Field 7" "State" - StrCmp $R2 "1" 0 usepaths - nsisunz::UnzipToLog /text "$(nsisunz_text)" /noextractpath $R0 $R1 - Goto check - usepaths: - nsisunz::UnzipToLog /text "$(nsisunz_text)" $R0 $R1 - - check: -; Always check for errors. Everything else than "success" means an error. - Pop $0 - StrCmp $0 "success" ok - Abort "$0" - ok: -SectionEnd diff --git a/data/nsis/Contrib/nsisunz/exdll.h b/data/nsis/Contrib/nsisunz/exdll.h deleted file mode 100644 index 9df76ca60..000000000 --- a/data/nsis/Contrib/nsisunz/exdll.h +++ /dev/null @@ -1,116 +0,0 @@ -#ifndef _EXDLL_H_ -#define _EXDLL_H_ - -// only include this file from one place in your DLL. -// (it is all static, if you use it in two places it will fail) - -#define EXDLL_INIT() { \ - g_stringsize=string_size; \ - g_stacktop=stacktop; \ - g_variables=variables; } - -// For page showing plug-ins -#define WM_NOTIFY_OUTER_NEXT (WM_USER+0x8) -#define WM_NOTIFY_CUSTOM_READY (WM_USER+0xd) -#define NOTIFY_BYE_BYE 'x' - -typedef struct _stack_t { - struct _stack_t *next; - char text[1]; // this should be the length of string_size -} stack_t; - - -static unsigned int g_stringsize; -static stack_t **g_stacktop; -static char *g_variables; - -static int __stdcall popstring(char *str); // 0 on success, 1 on empty stack -static void __stdcall pushstring(const char *str); - -enum -{ -INST_0, // $0 -INST_1, // $1 -INST_2, // $2 -INST_3, // $3 -INST_4, // $4 -INST_5, // $5 -INST_6, // $6 -INST_7, // $7 -INST_8, // $8 -INST_9, // $9 -INST_R0, // $R0 -INST_R1, // $R1 -INST_R2, // $R2 -INST_R3, // $R3 -INST_R4, // $R4 -INST_R5, // $R5 -INST_R6, // $R6 -INST_R7, // $R7 -INST_R8, // $R8 -INST_R9, // $R9 -INST_CMDLINE, // $CMDLINE -INST_INSTDIR, // $INSTDIR -INST_OUTDIR, // $OUTDIR -INST_EXEDIR, // $EXEDIR -INST_LANG, // $LANGUAGE -__INST_LAST -}; - -typedef struct { - int autoclose; - int all_user_var; - int exec_error; - int abort; - int exec_reboot; - int reboot_called; - int XXX_cur_insttype; // deprecated - int XXX_insttype_changed; // deprecated - int silent; - int instdir_error; - int rtl; - int errlvl; -} exec_flags; - -typedef struct { - exec_flags *exec_flags; - int (__stdcall *ExecuteCodeSegment)(int, HWND); -} extra_parameters; - -// utility functions (not required but often useful) -static int __stdcall popstring(char *str) -{ - stack_t *th; - if (!g_stacktop || !*g_stacktop) return 1; - th=(*g_stacktop); - lstrcpy(str,th->text); - *g_stacktop = th->next; - GlobalFree((HGLOBAL)th); - return 0; -} - -static void __stdcall pushstring(const char *str) -{ - stack_t *th; - if (!g_stacktop) return; - th=(stack_t*)GlobalAlloc(GPTR,sizeof(stack_t)+g_stringsize); - lstrcpyn(th->text,str,g_stringsize); - th->next=*g_stacktop; - *g_stacktop=th; -} - -static char * __stdcall getuservariable(const int varnum) -{ - if (varnum < 0 || varnum >= __INST_LAST) return NULL; - return g_variables+varnum*g_stringsize; -} - -static void __stdcall setuservariable(const int varnum, const char *var) -{ - if (var != NULL && varnum >= 0 && varnum < __INST_LAST) - lstrcpy(g_variables + varnum*g_stringsize, var); -} - - - -#endif//_EXDLL_H_ \ No newline at end of file diff --git a/data/nsis/Contrib/nsisunz/info.rtf b/data/nsis/Contrib/nsisunz/info.rtf deleted file mode 100644 index b3586dc4d4dceda120a8d435b842d7e7419147cd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 641 zcmZ9KPjA#P5XCuH>UWqUAdyX$-AjAr&>o6Fi#VW>kQ0xSQ4>3OCJkk^-Swn>`3a?!=w$*mOMNc7=M+_;d*1dg{7-VJ<3}gPa#n5yv3uy`8DSH>) z?df!Vb;S4BQl#uOWq6RFHZqY$_!fsoSx zKkmPP%T32mB*o%-eTDV^%55g6rbuyBnuNf`q#fmp#XmQ4a{tPnq!}w zH^RkkaX*`z0&rByk+gtMmu)f_xGjm=XfEesdQySqi~(e5x|9rL`ESxNrbyA2JKBiN z%r5F;{UTwwe%*PIe1#IQt9Wb7Ung!JzwtnDAf3h)-Y3gRJC=8^+3>$?mf|e+IkTz- zQ$NGOS&G>zxl03$uB993RL7gmW}u;_EQMwslP`>Sv);i^IUm`)B){fwFXqi(BMsp# diff --git a/data/nsis/Contrib/nsisunz/miniclib.c b/data/nsis/Contrib/nsisunz/miniclib.c deleted file mode 100644 index 25d6c45d6..000000000 --- a/data/nsis/Contrib/nsisunz/miniclib.c +++ /dev/null @@ -1,366 +0,0 @@ -/* Public Domain [mini] c runtime library replacements for Win32 - * KJD - */ - -#include "miniclib.h" - -int errno = ESUCCESS; - -FILE *stdin=NULL, *stdout=NULL, *stderr=NULL; - -#define setStdFileHnd(f,h) \ - f = (FILE *)malloc(sizeof(FILE)); \ - if (f != NULL) \ - { \ - f->handle = GetStdHandle(h); \ - f->eof = 0; \ - f->err = 0; \ - } - -/* DLL entry function, needs to be __stdcall, but must be extern "C" for proper decoration (name mangling) */ -/*extern "C"*/ BOOL WINAPI DllMain(HANDLE _hModule, DWORD ul_reason_for_call, LPVOID lpReserved); -/*extern "C"*/ BOOL WINAPI _DllMainCRTStartup(HANDLE _hModule, DWORD ul_reason_for_call, LPVOID lpReserved) -{ - mCRTinit(); - return DllMain(_hModule, ul_reason_for_call, lpReserved); -} - - -/* you must call this before using any other function!!! */ -void mCRTinit(void) -{ - setStdFileHnd(stdin, STD_INPUT_HANDLE); - setStdFileHnd(stdout, STD_OUTPUT_HANDLE); - setStdFileHnd(stderr, STD_ERROR_HANDLE); -} - - -void * malloc(size_t size) -{ - return HeapAlloc(GetProcessHeap(), 0, size); -} - -void * calloc(size_t num, size_t size) -{ - return HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, num*size); -} - -void free(void *ptr) -{ - HeapFree(GetProcessHeap(), 0, ptr); -} - -void * realloc(void *ptr, size_t size) -{ - if (ptr == NULL) return malloc(size); - - if (!size) - { - free(ptr); - return NULL; - } - else - return HeapReAlloc( GetProcessHeap(), 0, ptr, size ); -} - - -char * strdup(const char *str) -{ - char *t = (char *)malloc(lstrlen(str)+1); - if (t != NULL) lstrcpy(t, str); - return t; -} - -char * strrchr(const char *str, int c) -{ - register const char *t = str + strlen(str); /* assumes str is '\0' terminated */ - while (t >= str) - { - if (*t == (char)c) return (char *)t; - t--; - } - - return NULL; -} - -char *strstr(const char *str, const char *substr) -{ - const char *s=substr; - int slen = strlen(substr); - /* set end to last character where substring could start and match */ - const char *end = str + strlen(str) - slen; /* assumes str is '\0' terminated */ - - if (!slen) return (char *)str; /* return str if substr is empty */ - - while (str <= end) - { - if (*str == *s) - { - s++; - if (*s == '\0') return (char *)(str-slen); /* match found */ - } - else - { - s = substr; /* reset where we match within substring to start at beginning */ - } - - str++; /* check next character */ - } - - return NULL; /* no match */ -} - -/* memmove,memcpy,memset,&memcmp from Paul Edwards public domain clib */ -void * memmove(void *s1, const void *s2, size_t n) -{ - char *p = s1; - const char *cs2 = s2; - size_t x; - - if (p <= cs2) - { - for (x=0; x < n; x++) - { - *p = *cs2; - p++; - cs2++; - } - } - else - { - if (n != 0) - { - for (x=n-1; x > 0; x--) - { - *(p+x) = *(cs2+x); - } - } - *(p+x) = *(cs2+x); - } - return (s1); -} - -// MSVC [6&7] Professional+ these are intrinsic -// and this causes a duplicate function error, -// but on Standard they are not intrinsic or if -// forced as functions then these are needed. -#ifdef NO_INTRINSIC_MEMFUNCS -void *memcpy(void *s1, const void *s2, size_t n) -{ - register unsigned int *p = (unsigned int *)s1; - register unsigned int *cs2 = (unsigned int *)s2; - register unsigned int *endi; - - endi = (unsigned int *)((char *)p + (n & ~0x03)); - while (p != endi) - { - *p++ = *cs2++; - } - switch (n & 0x03) - { - case 0: - break; - case 1: - *(char *)p = *(char *)cs2; - break; - case 2: - *(char *)p = *(char *)cs2; - p = (unsigned int *)((char *)p + 1); - cs2 = (unsigned int *)((char *)cs2 + 1); - *(char *)p = *(char *)cs2; - break; - case 3: - *(char *)p = *(char *)cs2; - p = (unsigned int *)((char *)p + 1); - cs2 = (unsigned int *)((char *)cs2 + 1); - *(char *)p = *(char *)cs2; - p = (unsigned int *)((char *)p + 1); - cs2 = (unsigned int *)((char *)cs2 + 1); - *(char *)p = *(char *)cs2; - break; - } - return (s1); -} - -void *memset(void *s, int c, size_t n) -{ - size_t x = 0; - - for (x = 0; x < n; x++) - { - *((char *)s + x) = (unsigned char)c; - } - return (s); -} - -int memcmp(const void *s1, const void *s2, size_t n) -{ - const unsigned char *p1; - const unsigned char *p2; - size_t x = 0; - - p1 = (const unsigned char *)s1; - p2 = (const unsigned char *)s2; - while (x < n) - { - if (p1[x] < p2[x]) return (-1); - else if (p1[x] > p2[x]) return (1); - x++; - } - return (0); -} -#endif - - -/* fopen, only r[b],w[b],r[b]+,w[b]+ supported, that is a (append is not) */ -FILE * fopen(const char *filename, const char *mode) -{ - DWORD dwAccess, dwCreate; - FILE *f; - - if (strrchr(mode, 'r') != NULL) - { - dwAccess = GENERIC_READ; - dwCreate = OPEN_EXISTING; - if (strrchr(mode, '+') != NULL) - dwAccess |= GENERIC_WRITE; - } - else if (strrchr(mode, 'w') != NULL) - { - dwAccess = GENERIC_WRITE; - dwCreate = CREATE_ALWAYS; - if (strrchr(mode, '+') != NULL) - dwAccess |= GENERIC_READ; - } - else /* unknown mode */ - { - errno = EINVAL; - return NULL; - } - - f = (FILE *)malloc(sizeof(FILE)); - if (f == NULL) - { - errno = ENOMEM; - return NULL; - } - - /* initialize all values here */ - f->eof = 0; - f->err = 0; - - f->handle = CreateFile(filename,dwAccess,FILE_SHARE_READ,NULL,dwCreate,FILE_ATTRIBUTE_NORMAL,NULL); - if (f->handle == INVALID_HANDLE_VALUE) - { - switch (GetLastError()) - { - case ERROR_ALREADY_EXISTS : - errno = EEXIST; - break; - default: - errno = EACCES; - break; - } - free(f); - f = NULL; - } - - return f; -} - -size_t fwrite(const void *buffer, long size, long count, FILE *f) -{ - unsigned long bytes_written; - if (!size || !count) return 0; - if (!WriteFile(f->handle,(LPVOID)buffer,size*count,&bytes_written,NULL)) - f->err = 1; - return (size_t)(bytes_written/size); /* returns items written, not bytes written */ -} - -size_t fread(const void *buffer, long size, long count, FILE *f) -{ - unsigned long bytes_read; - if (!size || !count) return 0; - if (!ReadFile(f->handle,(LPVOID)buffer,size*count,&bytes_read,NULL)) - f->err = 1; - else - if (bytes_read == 0) f->eof = 1; - return (size_t)(bytes_read/size); /* returns items read, not bytes read */ -} - -int fclose(FILE *f) -{ - int retvalue = 0; - if (f != NULL) - { - if (f->handle != INVALID_HANDLE_VALUE) - retvalue = !CloseHandle(f->handle); - free(f); - } - return retvalue; -} - -int fprintf(FILE *f, const char *format, ...) -{ - char buf[1024]; - va_list argptr; - va_start(argptr, format); - wvsprintf (buf, format, argptr); - va_end(argptr); - return fwrite(buf,1,strlen(buf)+1,f); -} - -int sprintf(char *buf, const char *format, ...) -{ - int retval; - va_list argptr; - va_start(argptr, format); - retval = wvsprintf (buf, format, argptr); - va_end(argptr); - return retval; -} - -int fputc(int c, FILE *f) -{ - char buffer = (char)c; - if (!fwrite(&buffer, 1, 1, f)) - return -1; - else - return c; -} - - -DWORD map_origin[3] = { FILE_BEGIN, FILE_CURRENT, FILE_END }; - -int fseek(FILE *f, long offset, int origin) -{ - if (SetFilePointer(f->handle, offset, 0, map_origin[origin]) != 0xFFFFFFFF) - return 0; - else - return -1; -} - -long ftell(FILE *f) -{ - return SetFilePointer(f->handle, 0, 0, FILE_CURRENT); -} - -void rewind(FILE *f) -{ - fseek(f, 0L, SEEK_SET); - f->eof = 0; - f->err = 0; -} - -int fflush(FILE *f) -{ - /* nothing really to flush, so do nothing and return ok */ - return 0; -} - -FILE *_fdopen(int handle, const char *mode) -{ - /* TODO */ - return NULL; -} - diff --git a/data/nsis/Contrib/nsisunz/miniclib.h b/data/nsis/Contrib/nsisunz/miniclib.h deleted file mode 100644 index dfc73dadb..000000000 --- a/data/nsis/Contrib/nsisunz/miniclib.h +++ /dev/null @@ -1,110 +0,0 @@ -/* Public Domain [mini] c runtime library replacements for Win32 */ - -/* include this file before or instead of - as its string functions conflict with string.h - */ - -#ifndef _MINI_CRT_LIB_ -#define _MINI_CRT_LIB_ - -#ifdef __cplusplus -extern "C" { -#endif - -/* you must call this before using any other function!!! */ -void mCRTinit(void); - -typedef unsigned long time_t; -typedef unsigned size_t; - -extern int errno; - -#ifndef NULL -#ifdef __cplusplus -#define NULL 0 -#else -#define NULL ((void *)0) -#endif -#endif - -void * malloc(size_t size); -void * calloc(size_t num, size_t size); -void free(void *ptr); -void * realloc(void *ptr, size_t size); -char * strdup(const char *str); -char * strrchr(const char *str, int c); -char *strstr(const char *str, const char *substr); - -#define strlen lstrlen -#define strcpy lstrcpy -#define strcat lstrcat -#define strcmp lstrcmp - -// MSVC [6&7] Professional+ these are intrinsic -// and this causes a duplicate function error, -// but on Standard they are not intrinsic or if -// forced as functions then these are needed. -#define NO_INTRINSIC_MEMFUNCS 1 -#if defined(_MSC_VER) && defined(NO_INTRINSIC_MEMFUNCS) -/* Ensure these are treated as functions and not inlined as intrinsics, or disable /Oi */ -#pragma warning(disable:4164) // intrinsic function not declared -#pragma function(memcpy, memset, memcmp) -#endif -void * memmove(void *s1, const void *s2, size_t n); -void *memcpy(void *s1, const void *s2, size_t n); -void *memset(void *s, int c, size_t n); -int memcmp(const void *s1, const void *s2, size_t n); - -#define ESUCCESS 0 -#define ENOMEM 12 -#define EACCES 13 -#define EEXIST 17 -#define EINVAL 22 - -#define EOF -1 - -typedef struct FILE -{ - /*HANDLE*/void * handle; - int eof; /* used by feof macro to determine if read ended with error or end of file */ - int err; /* used by ferror macro to indicate error condition encountered */ -} FILE; - -extern FILE *stdin, *stdout, *stderr; - -#define feof(f) f->eof -#define ferror(f) f->err - -/* fopen, only r[b],w[b],r[b]+,w[b]+ supported, that is a (append is not) */ -FILE * fopen(const char *filename, const char *mode); -size_t fwrite(const void *buffer, long size, long count, FILE *f); -size_t fread(const void *buffer, long size, long count, FILE *f); -int fclose(FILE *f); - -int fprintf(FILE *f, const char *format, ...); -int sprintf(char *buf, const char *format, ...); -#define vsprintf wvsprintf -int fputc(int c, FILE *f); - -#define SEEK_SET 0 -#define SEEK_CUR 1 -#define SEEK_END 2 - -int fseek(FILE *f, long offset, int origin); -long ftell(FILE *f); -void rewind(FILE *f); - -/* just stubs */ -int fflush(FILE *f); -FILE *_fdopen(int handle, const char *mode); - -#ifdef __cplusplus -} -#endif - -#define WIN32_LEAN_AND_MEAN -#define _INC_STRING /* don't allow windows.h to include MS clib's string.h */ -#define _INC_MEMORY -#include - -#endif /* _MINI_CRT_LIB_ */ diff --git a/data/nsis/Contrib/nsisunz/nsisunz.cpp b/data/nsis/Contrib/nsisunz/nsisunz.cpp deleted file mode 100644 index e6ce3f422..000000000 --- a/data/nsis/Contrib/nsisunz/nsisunz.cpp +++ /dev/null @@ -1,567 +0,0 @@ -/* -UnZip Plug-in for NSIS -Written by Saivert - -Credits: - - Based on code in NSIS Zip2Exe - portions Copyright © 1999-2001 Miguel Garrido (mgarrido01@hotmail.com) - - Uses ZLIB - Copyright © Mark Adler - - ZIP format routines - Copyright (C) 1998 Gilles Vollant - - Even though this project is an NSIS Plug-in, it also - exports a function that can be used by any applications. - The exported function is "appextract" -*/ -//#include "AggressiveOptimize.h" -#include -//#include -#include "miniclib.h" -#include -#include "exdll.h" - -extern "C" { -#include "zlib/unzip.h" -}; - -//Strings used all over the place -char szSuccess[] = {'s','u','c','c','e','s','s',0}; -char szFile[] = {'/','f','i','l','e',0}; -char szNoextractpath[] = {'/','n','o','e','x','t','r','a','c','t','p','a','t','h',0}; -char szDefExtractText[] = {'E','x','t','r','a','c','t',':',' ','%','f',0}; - -char g_extract_text[1024]; - -int g_extracting; -HWND g_hwndParent; -char tempzip_path[1024]; - -void internal_unzip(int); - -CRITICAL_SECTION cs; - -//Log stuff -HWND g_hwndList; -HWND g_hwndStatus; -void LogMessage(HWND, const char *, int = 0); - - -extern "C" BOOL WINAPI DllMain(HANDLE hInst, ULONG ul_reason_for_call, LPVOID lpReserved) -{ - switch (ul_reason_for_call) - { - //case DLL_THREAD_ATTACH: - case DLL_PROCESS_ATTACH: - InitializeCriticalSection(&cs); - break; - //case DLL_THREAD_DETACH: - case DLL_PROCESS_DETACH: - DeleteCriticalSection(&cs); - break; - } - return TRUE; -} - -void doMKDir(char *directory) -{ - char *p, *p2; - char buf[MAX_PATH]; - if (!*directory) return; - lstrcpy(buf,directory); - p=buf; while (*p) p++; - while (p >= buf && *p != '\\') p--; - p2 = buf; - if (p2[1] == ':') p2+=4; - else if (p2[0] == '\\' && p2[1] == '\\') - { - p2+=2; - while (*p2 && *p2 != '\\') p2++; - if (*p2) p2++; - while (*p2 && *p2 != '\\') p2++; - if (*p2) p2++; - } - if (p >= p2) - { - *p=0; - doMKDir(buf); - } - CreateDirectory(directory,NULL); -} - -//Based on inttosizestr from NSIS exehead project. -//Creates a string representing the size of a file, -//choosing the unit that's best suited. -static char * FormatDiskSize(char *str, unsigned long b) -{ - char scale='k'; - char sh=30; - char s=0; - - if (b <= (1024*1024) ) sh=10, scale='k'; - else if (b <= (1024*1024*1024)) sh=20, scale='M'; - else if (GetVersion()&0x80000000) s='+'; //only display '+' on GB shown on Win95 - - if (b >= 1000) //represent everything above 1000 bytes as 0,xx kB - { - wsprintf(str, "%d.%d%d %cB%c", - b>>sh, ((b*10)>>sh)%10, ((b*20)>>sh)%10, scale, s); - if (b < 1024) - wsprintf(str+strlen(str), " (%u byte%c)", b, b == 1?0:'s'); - } - else - wsprintf(str, "%u byte%c", b, b == 1?0:'s'); - - return str; -} - -/* A simple format parser - * Handles %f, %c and %u - * size of out must be twice as large as size of str - */ -static char * parse(const char *str, char *out, int outlen, - char *filename, - unsigned long compressed, - unsigned long uncompressed, - unsigned int nkb) -{ - char s[32]; - const char *p; - UINT i=0; - p=str-1; - memset(out, 0, outlen); - - while (p++ && (*p != 0)) - { - if (*p == '%') - { - switch (*(p+1)) - { - case 'c': - case 'C': - { - FormatDiskSize(s, compressed); - lstrcat(out, s); - i += lstrlen(s); - break; - } - case 'u': - case 'U': - { - FormatDiskSize(s, uncompressed); - lstrcat(out, s); - i += lstrlen(s); - break; - } - case 'f': - case 'F': - { - lstrcat(out, filename); - i += lstrlen(filename); - break; - } - case 'p': - case 'P': - { - unsigned int j; - j = uncompressed; - if (!j) j = 1; - wsprintf(s, "%d%%", nkb*100/j); - lstrcat(out, s); - i += lstrlen(s); - break; - } - case 'b': - case 'B': - { - FormatDiskSize(s, nkb); - lstrcat(out, s); - i += lstrlen(s); - break; - } - default: out[i++] = *p; - } - ++p; - } else { - out[i++] = *p; - } - } - return out; -} - -extern "C" __declspec(dllexport) -void Unzip(HWND hwndParent, int string_size, char *variables, stack_t **stacktop) -{ - EXDLL_INIT(); - g_hwndParent = hwndParent; - internal_unzip(0); -} - -extern "C" __declspec(dllexport) -void UnzipToLog(HWND hwndParent, int string_size, char *variables, stack_t **stacktop) -{ - EXDLL_INIT(); - g_hwndParent = hwndParent; - internal_unzip(1); -} - -extern "C" __declspec(dllexport) -void UnzipToStack(HWND hwndParent, int string_size, char *variables, stack_t **stacktop) -{ - EXDLL_INIT(); - g_hwndParent = hwndParent; - internal_unzip(2); -} - -// This function is to be used by rundll32.exe. Call it like this: -// -// rundll32.exe "c:\a path\nsisunz.dll",extract_RunDLL c:\path\zipfile.zip c:\outdir -// -// or to extract a single file, use this (concatenate the next two lines): -// -// rundll32.exe c:\path\nsisunz.dll,extract_RunDLL -// /file readme.txt "c:\a path\zipfile.zip" c:\outdir -// -// "/noextractpath" is implicitly used if "/file" is used. -// It mimics NSIS itself by setting up a stack and pushing the -// parameters from the function on the stack. I made it like this -// so I could directly reuse the code I already had written without modifications. -extern "C" __declspec(dllexport) -void extract_RunDLL(HINSTANCE hAppInstance, LPVOID unused, char *params) -{ - char res[1024]; - char temp[256]; - char zipfile[MAX_PATH]={0,}; - char destdir[MAX_PATH]={0,}; - char file[MAX_PATH]={0,}; - char *p = params; - char *s; - char q=0; - int next=0; -#define NEXT_FILE 1 -#define NEXT_ZIP 2 -#define NEXT_DEST 3 - - stack_t ownstacktop; - stack_t *pownstacktop = &ownstacktop; - - ownstacktop.next = NULL; - ownstacktop.text[0] = NULL; - - g_stringsize=1024; - g_stacktop=&pownstacktop; - g_variables=NULL; - - //Parse the parameters - //While we do the parsing we use next as a clue to - //what comes next. This way I don't have to write a - //new function. - while (*p) - { - if (*p=='"') q='"', p++; else q=' '; //Do we search for a quote or a space? - s = temp; - while (*p && *p != q) *s++ = *p++; //Copy chars from params to zipfile - *s = 0; //Terminate string - if (next==NEXT_FILE) lstrcpy(file, temp), next=NEXT_ZIP; - else if (next==NEXT_ZIP) lstrcpy(zipfile, temp), next=NEXT_DEST; - else if (next==NEXT_DEST) lstrcpy(destdir, temp), next=0; - else if (!lstrcmpi(temp, szFile)) next=NEXT_FILE; - else lstrcpy(zipfile, temp), next=NEXT_DEST; - - while (*p && *++p == ' '); - } - - pushstring(destdir); - pushstring(zipfile); - - if (file[0]) - { - pushstring(file); - pushstring(szFile); - pushstring(szNoextractpath); - } - - internal_unzip(0); - popstring(res); - if (lstrcmp(res, szSuccess)) - MessageBox(0, res, NULL, MB_ICONERROR); -} - -void internal_unzip(int uselog) -{ - //All char baby (or should I use int for the non-string stuff??) - char first=0; - char filefound=0; - char usefile=0; - char hastext=0; - char noextractpath=0; - char filetoextract[MAX_PATH+1]; - char buf[1024]; - char fn[MAX_PATH+1]; - - popstring(buf); - while (buf[0] == '/') - { - if (!lstrcmpi(buf+1, "text")) popstring(g_extract_text), hastext++; - if (!lstrcmpi(buf+1, "noextractpath")) noextractpath++; - if (!lstrcmpi(buf+1, "file")) - { - char *p; - popstring(filetoextract); - // Ensure filename uses backslashes - p = filetoextract; - while (*p) - { - if (*p == '/') *p='\\'; - p++; - } - usefile++; - } - - //if stack is empty, bail out - if (popstring(buf)) - *buf = 0; - } - //check for first required param - if (*buf) - lstrcpyn(fn, buf, MAX_PATH); - else - { - pushstring("Error reading ZIP filename parameter"); - return; - } - - if (popstring(tempzip_path)) - { - pushstring("Error reading destination directory parameter"); - return; - } - - if (uselog==1) - { - if (!hastext) lstrcpy(g_extract_text, szDefExtractText); - } - - unzFile f; - f = unzOpen(fn); - if (!f || unzGoToFirstFile(f) != UNZ_OK) - { - if (f) unzClose(f); - pushstring("Error opening ZIP file"); - return; - } - - int nf=0, nb=0; - unz_file_info fileinfo; - g_extracting=1; - do { - char filename[MAX_PATH]; - unzGetCurrentFileInfo(f,&fileinfo,filename,sizeof(filename),NULL,0,NULL,0); - - if (filename[0] && - filename[strlen(filename)-1] != '\\' && - filename[strlen(filename)-1] != '/') - { - char *pfn=filename; - //ensure path uses backslashes - while (*pfn) - { - if (*pfn == '/') *pfn='\\'; - pfn++; - } - - if (usefile) - { - if (lstrcmpi(filename, filetoextract) != 0) continue; - else filefound++; - } - - pfn=filename; - if (pfn[1] == ':' && pfn[2] == '\\') pfn+=3; - while (*pfn == '\\') pfn++; - - if (noextractpath) - { - char buf[MAX_PATH]; - lstrcpy(buf,filename); - char *p=buf+strlen(buf); - while (p > buf && *p != '\\' && *p != '/') p = CharPrev(buf, p); - if (p > buf) p++; - lstrcpy(filename, p); - } - - char out_filename[1024]; - lstrcpy(out_filename,tempzip_path); - lstrcat(out_filename,"\\"); - lstrcat(out_filename,pfn); - if (strstr(pfn,"\\")) - { - char buf[1024]; - lstrcpy(buf,out_filename); - char *p=buf+strlen(buf); - while (p > buf && *p != '\\') p--; - *p=0; - if (buf[0]) doMKDir(buf); - } - - if (unzOpenCurrentFile(f) == UNZ_OK) - { - FILE *fp; - int l; - fp = fopen(out_filename,"wb"); - if (fp) - { - if (uselog==1) { - char logtmp[256]; - parse(g_extract_text, logtmp, sizeof(logtmp), - pfn, fileinfo.compressed_size, fileinfo.uncompressed_size, 0); - LogMessage(g_hwndParent, logtmp); - } else if (uselog == 2) { - if (!first) - { - pushstring(""); //push list terminator (empty string) - first++; - } - pushstring(pfn); - } - nb=0; - do - { - char buf[1024]; - l=unzReadCurrentFile(f,buf,sizeof(buf)); - if (l > 0) - { - if (fwrite(buf,1,l,fp) != (unsigned int)l) - { - unzClose(f); - fclose(fp); - pushstring("Error writing output file(s)"); - g_extracting=0; - return; - } - - if (!g_extracting) - { - unzClose(f); - fclose(fp); - g_extracting=0; - pushstring("aborted"); - return; - } - } - - if (uselog==1 && (nb % 1024)) - { - char logtmp[256]; - parse(g_extract_text, logtmp, sizeof(logtmp), - pfn, fileinfo.compressed_size, - fileinfo.uncompressed_size, nb); - LogMessage(g_hwndParent, logtmp, 1); - } - nb += l; - } while (l > 0); - - fclose(fp); - } - else - { - unzClose(f); - pushstring("Error opening output file(s)"); - g_extracting=0; - return; - } - nf++; - - int quit=0; - if (g_hwndParent) - { - MSG msg; - while (PeekMessage(&msg,NULL,0,0,PM_REMOVE)) - { - if (msg.message == WM_DESTROY && msg.hwnd == g_hwndParent) - { - quit++; - break; - } - TranslateMessage(&msg); - DispatchMessage(&msg); - } - } - unzCloseCurrentFile(f); - if (quit) break; - } - else - { - unzClose(f); - pushstring("Error extracting from ZIP file"); - g_extracting=0; - return; - } - } - } while (unzGoToNextFile(f) == UNZ_OK); - - g_extracting=0; - if (usefile && !filefound) { - pushstring("File not found in archive"); - } else { - pushstring(szSuccess); - } - unzClose(f); - return; -} - -// Tim Kosse's LogMessage -void LogMessage(HWND hwndParent, const char *pStr, int changelast) { - static HWND hwndList=0; - static HWND hwndStatus=0; - LVITEM item={0}; - int nItemCount; - if (!hwndParent) return; - - EnterCriticalSection(&cs); - - //Get ListView control on instfiles page (the log) - if (!hwndList) hwndList = FindWindowEx( - FindWindowEx(hwndParent, NULL, "#32770", NULL), - NULL, "SysListView32", NULL); - - //Get status "STATIC" control above progressbar - if (!hwndStatus) hwndStatus = GetDlgItem( - FindWindowEx(hwndParent, NULL, "#32770", NULL), - 1006); - - if (!hwndList || !hwndStatus) return; - - SendMessage(hwndStatus, WM_SETTEXT, 0, (LPARAM)pStr);//added by Saivert - nItemCount=SendMessage(hwndList, LVM_GETITEMCOUNT, 0, 0); - - item.mask=LVIF_TEXT; - item.pszText=(char *)pStr; - item.cchTextMax=0; - item.iItem=changelast?nItemCount-1:nItemCount; - - if (changelast) { - ListView_SetItem(hwndList, &item); - } else { - ListView_InsertItem(hwndList, &item); - } - ListView_EnsureVisible(hwndList, item.iItem, 0); - - LeaveCriticalSection(&cs); -} - -// EXPERIMENTAL THREAD BASED EXTRACTION -/* -extern "C" __declspec(dllexport) -UnzipToLogUsingThread(HWND hwndParent, int string_size, char *variables, stack_t **stacktop) -{ - MSG msg; - DWORD dwTID; - - CreateThread(NULL, 0, UnzipThread, (LPVOID)1, 0, &dwTID); -} - -DWORD WINAPI UnzipThread(LPVOID p) -{ - int uselog = 1; - return 0; -} -*/ \ No newline at end of file diff --git a/data/nsis/Contrib/nsisunz/nsisunz.dsp b/data/nsis/Contrib/nsisunz/nsisunz.dsp deleted file mode 100644 index ec6c87c32..000000000 --- a/data/nsis/Contrib/nsisunz/nsisunz.dsp +++ /dev/null @@ -1,170 +0,0 @@ -# Microsoft Developer Studio Project File - Name="nsisunz" - Package Owner=<4> -# Microsoft Developer Studio Generated Build File, Format Version 6.00 -# ** DO NOT EDIT ** - -# TARGTYPE "Win32 (x86) Dynamic-Link Library" 0x0102 - -CFG=nsisunz - Win32 Debug -!MESSAGE This is not a valid makefile. To build this project using NMAKE, -!MESSAGE use the Export Makefile command and run -!MESSAGE -!MESSAGE NMAKE /f "nsisunz.mak". -!MESSAGE -!MESSAGE You can specify a configuration when running NMAKE -!MESSAGE by defining the macro CFG on the command line. For example: -!MESSAGE -!MESSAGE NMAKE /f "nsisunz.mak" CFG="nsisunz - Win32 Debug" -!MESSAGE -!MESSAGE Possible choices for configuration are: -!MESSAGE -!MESSAGE "nsisunz - Win32 Release" (based on "Win32 (x86) Dynamic-Link Library") -!MESSAGE "nsisunz - Win32 Debug" (based on "Win32 (x86) Dynamic-Link Library") -!MESSAGE - -# Begin Project -# PROP AllowPerConfigDependencies 0 -# PROP Scc_ProjName "" -# PROP Scc_LocalPath "" -CPP=cl.exe -MTL=midl.exe -RSC=rc.exe - -!IF "$(CFG)" == "nsisunz - Win32 Release" - -# PROP BASE Use_MFC 0 -# PROP BASE Use_Debug_Libraries 0 -# PROP BASE Output_Dir "Release" -# PROP BASE Intermediate_Dir "Release" -# PROP BASE Target_Dir "" -# PROP Use_MFC 0 -# PROP Use_Debug_Libraries 0 -# PROP Output_Dir "Release" -# PROP Intermediate_Dir "Release" -# PROP Ignore_Export_Lib 0 -# PROP Target_Dir "" -# ADD BASE CPP /nologo /MT /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "UNZIP_EXPORTS" /YX /FD /c -# ADD CPP /nologo /MT /W3 /O1 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "UNZIP_EXPORTS" /YX /Gs32000 /FD /c -# ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /win32 -# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /win32 -# ADD BASE RSC /l 0x414 /d "NDEBUG" -# ADD RSC /l 0x414 /d "NDEBUG" -BSC32=bscmake.exe -# ADD BASE BSC32 /nologo -# ADD BSC32 /nologo -LINK32=link.exe -# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /machine:I386 -# ADD LINK32 kernel32.lib user32.lib /nologo /dll /machine:I386 /nodefaultlib /out:"..\..\plugins\nsisunz.dll" - -!ELSEIF "$(CFG)" == "nsisunz - Win32 Debug" - -# PROP BASE Use_MFC 0 -# PROP BASE Use_Debug_Libraries 1 -# PROP BASE Output_Dir "Debug" -# PROP BASE Intermediate_Dir "Debug" -# PROP BASE Target_Dir "" -# PROP Use_MFC 0 -# PROP Use_Debug_Libraries 1 -# PROP Output_Dir "Debug" -# PROP Intermediate_Dir "Debug" -# PROP Target_Dir "" -# ADD BASE CPP /nologo /MTd /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "UNZIP_EXPORTS" /YX /FD /GZ /c -# ADD CPP /nologo /MTd /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "UNZIP_EXPORTS" /FR /YX /FD /GZ /c -# ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /win32 -# ADD MTL /nologo /D "_DEBUG" /mktyplib203 /win32 -# ADD BASE RSC /l 0x414 /d "_DEBUG" -# ADD RSC /l 0x414 /d "_DEBUG" -BSC32=bscmake.exe -# ADD BASE BSC32 /nologo -# ADD BSC32 /nologo -LINK32=link.exe -# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /debug /machine:I386 /pdbtype:sept -# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /debug /machine:I386 /pdbtype:sept - -!ENDIF - -# Begin Target - -# Name "nsisunz - Win32 Release" -# Name "nsisunz - Win32 Debug" -# Begin Group "Source Files" - -# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat" -# Begin Source File - -SOURCE=.\zlib\ADLER32.C -# End Source File -# Begin Source File - -SOURCE=.\zlib\CRC32.C -# End Source File -# Begin Source File - -SOURCE=.\zlib\INFFAST.C -# End Source File -# Begin Source File - -SOURCE=.\zlib\INFLATE.C -# End Source File -# Begin Source File - -SOURCE=.\zlib\INFTREES.C -# End Source File -# Begin Source File - -SOURCE=.\miniclib.c -# End Source File -# Begin Source File - -SOURCE=.\nsisunz.cpp -# End Source File -# Begin Source File - -SOURCE=.\zlib\Unzip.c -# End Source File -# Begin Source File - -SOURCE=.\zlib\Zutil.c -# End Source File -# End Group -# Begin Group "Header Files" - -# PROP Default_Filter "h;hpp;hxx;hm;inl" -# Begin Source File - -SOURCE=.\zlib\INFFAST.H -# End Source File -# Begin Source File - -SOURCE=.\zlib\INFFIXED.H -# End Source File -# Begin Source File - -SOURCE=.\zlib\INFTREES.H -# End Source File -# Begin Source File - -SOURCE=.\miniclib.h -# End Source File -# Begin Source File - -SOURCE=.\zlib\UNZIP.H -# End Source File -# Begin Source File - -SOURCE=.\zlib\ZCONF.H -# End Source File -# Begin Source File - -SOURCE=.\zlib\ZLIB.H -# End Source File -# Begin Source File - -SOURCE=.\zlib\ZUTIL.H -# End Source File -# End Group -# Begin Group "Resource Files" - -# PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe" -# End Group -# End Target -# End Project diff --git a/data/nsis/Contrib/nsisunz/nsisunz.dsw b/data/nsis/Contrib/nsisunz/nsisunz.dsw deleted file mode 100644 index 3193dba40..000000000 --- a/data/nsis/Contrib/nsisunz/nsisunz.dsw +++ /dev/null @@ -1,29 +0,0 @@ -Microsoft Developer Studio Workspace File, Format Version 6.00 -# WARNING: DO NOT EDIT OR DELETE THIS WORKSPACE FILE! - -############################################################################### - -Project: "nsisunz"=.\nsisunz.dsp - Package Owner=<4> - -Package=<5> -{{{ -}}} - -Package=<4> -{{{ -}}} - -############################################################################### - -Global: - -Package=<5> -{{{ -}}} - -Package=<3> -{{{ -}}} - -############################################################################### - diff --git a/data/nsis/Contrib/nsisunz/nsisunz.ncb b/data/nsis/Contrib/nsisunz/nsisunz.ncb deleted file mode 100644 index d6fa4e8d7fad7b81027bb1d7ac6eedefbde30a83..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 82944 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 - -

-

Build Log

-

---------------------Configuration: nsisunz - Win32 Release-------------------- -

-

Command Lines

-Creating temporary file "C:\TEMP\RSP11E.tmp" with contents -[ -/nologo /MT /W3 /O1 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "UNZIP_EXPORTS" /Fp"Release/nsisunz.pch" /YX /Fo"Release/" /Fd"Release/" /Gs32000 /FD /c -"C:\tmp\NSIS2\Contrib\nsisunz\zlib\ADLER32.C" -"C:\tmp\NSIS2\Contrib\nsisunz\zlib\CRC32.C" -"C:\tmp\NSIS2\Contrib\nsisunz\zlib\INFFAST.C" -"C:\tmp\NSIS2\Contrib\nsisunz\zlib\INFLATE.C" -"C:\tmp\NSIS2\Contrib\nsisunz\zlib\INFTREES.C" -"C:\tmp\NSIS2\Contrib\nsisunz\nsisunz.cpp" -"C:\tmp\NSIS2\Contrib\nsisunz\zlib\Unzip.c" -"C:\tmp\NSIS2\Contrib\nsisunz\zlib\Zutil.c" -"C:\tmp\NSIS2\Contrib\nsisunz\miniclib.c" -] -Creating command line "cl.exe @C:\TEMP\RSP11E.tmp" -Creating temporary file "C:\TEMP\RSP11F.tmp" with contents -[ -kernel32.lib user32.lib /nologo /dll /incremental:no /pdb:"Release/nsisunz.pdb" /machine:I386 /nodefaultlib /out:"..\..\plugins\nsisunz.dll" /implib:"Release/nsisunz.lib" -.\Release\ADLER32.OBJ -.\Release\CRC32.OBJ -.\Release\INFFAST.OBJ -.\Release\INFLATE.OBJ -.\Release\INFTREES.OBJ -.\Release\nsisunz.obj -.\Release\Unzip.obj -.\Release\Zutil.obj -.\Release\miniclib.obj -] -Creating command line "link.exe @C:\TEMP\RSP11F.tmp" -

Output Window

-Compiling... -ADLER32.C -CRC32.C -INFFAST.C -INFLATE.C -INFTREES.C -nsisunz.cpp -Unzip.c -Zutil.c -miniclib.c -Linking... - Creating library Release/nsisunz.lib and object Release/nsisunz.exp - - - -

Results

-nsisunz.dll - 0 error(s), 0 warning(s) -
- - diff --git a/data/nsis/Contrib/nsisunz/nsisunz.sln b/data/nsis/Contrib/nsisunz/nsisunz.sln deleted file mode 100644 index b0acb0268..000000000 --- a/data/nsis/Contrib/nsisunz/nsisunz.sln +++ /dev/null @@ -1,21 +0,0 @@ -Microsoft Visual Studio Solution File, Format Version 8.00 -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "nsisunz", "nsisunz.vcproj", "{8534CD66-1841-45FC-9201-FA3515F5967B}" - ProjectSection(ProjectDependencies) = postProject - EndProjectSection -EndProject -Global - GlobalSection(SolutionConfiguration) = preSolution - Debug = Debug - Release = Release - EndGlobalSection - GlobalSection(ProjectConfiguration) = postSolution - {8534CD66-1841-45FC-9201-FA3515F5967B}.Debug.ActiveCfg = Debug|Win32 - {8534CD66-1841-45FC-9201-FA3515F5967B}.Debug.Build.0 = Debug|Win32 - {8534CD66-1841-45FC-9201-FA3515F5967B}.Release.ActiveCfg = Release|Win32 - {8534CD66-1841-45FC-9201-FA3515F5967B}.Release.Build.0 = Release|Win32 - EndGlobalSection - GlobalSection(ExtensibilityGlobals) = postSolution - EndGlobalSection - GlobalSection(ExtensibilityAddIns) = postSolution - EndGlobalSection -EndGlobal diff --git a/data/nsis/Contrib/nsisunz/nsisunz.vcproj b/data/nsis/Contrib/nsisunz/nsisunz.vcproj deleted file mode 100644 index f75562a73..000000000 --- a/data/nsis/Contrib/nsisunz/nsisunz.vcproj +++ /dev/null @@ -1,396 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/data/nsis/Contrib/nsisunz/nsisunz_readme.html b/data/nsis/Contrib/nsisunz/nsisunz_readme.html deleted file mode 100644 index 87017bbb0..000000000 --- a/data/nsis/Contrib/nsisunz/nsisunz_readme.html +++ /dev/null @@ -1,361 +0,0 @@ - - - -nsisunz - - - - -
- - - - -
-

nsisunz

-
-

Introduction

-

nsisunz is a NSIS plugin which allows you to extract files from ZIP -archives.

-

nsisunz is great when you use another NSIS plug-in named -NSISdl to download a ZIP file from the internet. -Download a small installer which lets the user choose the components he/she -want to install and the installer downloads it (QuickTime Setup does -this).

-

Note: -nsisunz does not support password protected ZIP archives -(encrypted).
-To extract only a specific file from the archive use the -"/file" option. -

-

How to use

-

Setting it up

-

To see a great example of how to use the plug-in, -check out the included example script.

-

You use the Unzip, UnzipToLog or the -UnzipToStack function to extract files -from a ZIP archive.

-

In my opinion the best way to describe things is by showing an example, -so here is one:

-
-InitPluginsDir
-; Call plug-in. Push filename to ZIP first, and the dest. folder last.
-nsisunz::UnzipToLog "$PLUGINSDIR\myzipfile.zip" "$INSTDIR"
-
-; Always check result on stack
-Pop $0
-StrCmp $0 "success" ok
-  DetailPrint "$0" ;print error message to log
-ok:
-
-; You can also use the "Unzip" function if you don't want to use the log.
-; It is a lot quicker, and is preferred for large ZIP archives.
-nsisunz::Unzip "$PLUGINSDIR\myzipfile.zip" "$INSTDIR"
-
-

The UnzipToStack function

-

The UnzipToStack function can be used instead of the UnzipToLog function -if you want the extraction to be a lot faster when extracting from very large ZIP archives and still -want to see the files extracted. This is how you use it: -

-
-nsisunz::UnzipToStack "$PLUGINSDIR\myzipfile.zip" "$INSTDIR"
-Pop $0
-StrCmp $0 "success" ok
-  DetailPrint "$0" ;print error message to log
-  Goto skiplist
-ok:
-
-; Print out list of files extracted to log
-next:
-  Pop $0
-  DetailPrint $0
-StrCmp $0 "" 0 next ; pop strings until a blank one arrives
-
-skiplist:
-
-

Extracting specific files

-

-To extract only a specific file use the "/file" option like this: -

-
-nsisunz::UnzipToLog /file "AnyPathInsideZIP/AFile.txt" "myzip.zip" "c:\myfiles"
-
-

-The path is relative to the root of the ZIP archive so you don't have to -prepend a slash ("/"). Furthermore the foldernames are extracted with the file so -the example above creates a file named "c:\myfiles\AnyPathInsideZIP\AFile.txt". -To avoid this use "/noextractpath" like this: -

-
-nsisunz::UnzipToLog /noextractpath /file \
-  "AnyPathInsideZIP/AFile.txt" "myzip.zip" "c:\myfiles"
-
-

Using nsisunz with NSISdl

-

To use NSISdl with nsisunz to download and extract a ZIP archive, -do something like this:

-
-InitPluginsDir
-NSISdl::download http://www.domain.com/file "$PLUGINSDIR\localfile.zip"
-Pop $R0 ;Get the return value
-StrCmp $R0 "success" +3
-  MessageBox MB_OK "Download failed: $R0"
-  Quit
-
-nsisunz::UnzipToLog "$PLUGINSDIR\localfile.zip" "$INSTDIR"
-Pop $R0
-StrCmp $R0 "success" +2
-  DetailPrint "$R0" ;print error message to log
-
-
-

Options

-

These are the optional parameters you can specify when calling nsisunz.

- - - - - - - - - - - - - -
/noextractpathThis option makes the plug-in extract all files to - the destination directory without regard to paths stored in ZIP file. - Is often used in conjunction with "/file" to extract a single file - from anywhere in an archive to a destination directory.
/fileExtract a specific file. Filename must be specified - as next parameter and must match a file in the ZIP including any - subdirectories. If the file couldn't be found in the ZIP file, - nsisunz pushes the string "File not found in ZIP file" on the - stack.
/textSets the format of the text used in the log to the - next param. "%f" is replaced with the filename, "%c" is - replaced with the compressed size and "%u" is replaced with the - uncompressed size. -
-

Return value

-

After you have called the DLL, nsisunz adds either "success" or a specific error message -on the stack. This is the possible error messages:

-
    -
  • Error opening ZIP file
  • -
  • Error opening output file(s)
  • -
  • Error writing output file(s)
  • -
  • Error extracting from ZIP file
  • -
  • File not found in ZIP file
  • -
-

Usually, you don't need to check this value, but you still have to remove it from the stack -(have a look at the example above).

-

Reserve files

-

If you are using BZIP2 (solid) compression, it's important that files which are being extracted -in init- or page functions function are located before other files in the data block, because this -will make your installer faster.

-

If there are File commands in your sections or functions above the init- or page functions, add -ReserveFile commands above your sections and functions:

-
-ReserveFile "myzipfile.zip"
-ReserveFile "${NSISDIR}\Plugins\nsisunz.dll"
-
-

Localization

-

Use the "/text" parameter to localize the text used by nsisunz -for the log output. -

-
-; Localized strings for use with nsisunz
-; The "%f" in the string is replaced with the filename on run-time.
-; "%c" and "%u" is replaced with compressed size and
-; uncompressed size respectively. See example script.
-
-LoadLanguageFile "${NSISDIR}\Contrib\Language files\english.nlf"
-LoadLanguageFile "${NSISDIR}\Contrib\Language files\norwegian.nlf"
-
-LangString nsisunz_text ${LANG_ENGLISH} "Extract: %f"
-LangString nsisunz_text ${LANG_NORWEGIAN} "Pakk ut: %f"
-
-Function .onInit
-  nsisunz:: /text "" "$(nsisunz_text)"
-FunctionEnd
-
-

Notes

-

-The plug-in is compressed with UPX to make it smaller.
-If you make changes to the source, re-compile and use UPX you may get this -message:
-upx: nsisunz.dll: CantPackException: file is possibly packed/protected -(try --force)
-I used the "--force" parameter as proposed, -and without problems UPX reduced the size of nsisunz.dll from ~71 kb -to 31,5 kb
-The reason for why you get this message is that the source #include's -"AggressiveOptimize.h" which makes the linker merge the code sections of the -final executable. This makes UPX think it's already packed (which it kinda is). -But by using the "--force" parameter, UPX may shrink it a lot -more.
-I hope people appreciate my struggles to keep the size of the plug-in small. -If someone have any suggestions for making it even smaller I would like if -someone sendt me an e-mail. -

-

Contact

-

nsisunz is written by Saivert.
-Homepage: -http://saivert.inthegray.com/
-E-mail: saivert@gmail.com - -

-

Version history

-
    -
  • DLL version 1.0 (12/4/2004) -
      -
    • First public release!
    • -
    -
  • -
-

Credits

-

-Based on code in NSIS Zip2Exe
-portions Copyright © 1999-2001 Miguel Garrido (mgarrido01@hotmail.com)
-Uses ZLIB - Copyright © Mark Adler
-ZIP format routines - Copyright © 1998 Gilles Vollant
-Thanks to Tim Kosse for the LogMessage function, even though I -could figure this out myself.
-And thanks to Joost Verburg for the readme HTML page design.

-

License

-
-This software is provided 'as-is', without any express or implied
-warranty. In no event will the authors be held liable for any damages
-arising from the use of this software.
-
-Permission is granted to anyone to use this software for any purpose,
-including commercial applications, and to alter it and redistribute
-it freely, subject to the following restrictions:
-
-1. The origin of this software must not be misrepresented;
-   you must not claim that you wrote the original software.
-   If you use this software in a product, an acknowledgment in the
-   product documentation would be appreciated but is not required.
-2. Altered versions must be plainly marked as such,
-   and must not be misrepresented as being the original software.
-3. This notice may not be removed or altered from any distribution.
-
-
-
- - diff --git a/data/nsis/Contrib/nsisunz/nsisunz_setup.nsi b/data/nsis/Contrib/nsisunz/nsisunz_setup.nsi deleted file mode 100644 index 50a87719b..000000000 --- a/data/nsis/Contrib/nsisunz/nsisunz_setup.nsi +++ /dev/null @@ -1,148 +0,0 @@ -; Generated by makesimplensi @ 12.04.2004 02:35:59 -; from directory "C:\nsis\Contrib\nsisunz" -; Fine-tuned by Saivert - -!include "infopage.nsh" -!include "addremoveprograms.nsh" - -SetCompressor lzma -OutFile "nsisunz_setup.exe" -Name "nsisunz" -ChangeUI IDD_INST ${NSISDIR}\contrib\uis\classic_buttonstoright.exe -Icon "${NSISDIR}\Contrib\Graphics\Icons\box-install.ico" -UninstallIcon "${NSISDIR}\Contrib\Graphics\Icons\box-uninstall.ico" -XPStyle on - -InstallDir "$PROGRAMFILES\nsis" -InstallDirRegKey HKEY_LOCAL_MACHINE \ - "Software\Microsoft\Windows\Currentversion\Uninstall\nsis" "UninstallString" - -!insertmacro PAGE_INFO "Please read this..." "info.rtf" -Page components -Page directory -Page instfiles - -UninstPage uninstConfirm -UninstPage instfiles - - -Section "nsisunz NSIS Plug-in" - SectionIn RO - - SetOutPath $INSTDIR\plugins - ; plug-in - File ${NSISDIR}\plugins\nsisunz.dll - - SetOutPath $INSTDIR\3rdparty\nsisunz - ; Readme & examples (4 Files) - File "example.nsi" - File "example_mui.nsi" - File "nsisunz_readme.html" - File "zippage.ini" -SectionEnd - -Section "Source (MS Visual C++ 6.0 project)" - SetOutPath "$INSTDIR\3rdparty\nsisunz\source" - ; Source (3 files + ZLIB) - File "nsisunz.cpp" - File "nsisunz.dsp" - File "nsisunz.dsw" - SetOutPath "$INSTDIR\3rdparty\nsisunz\source\zlib" - ; ZLIB (20 Files) - File "zlib\ADLER32.C" - File "zlib\CRC32.C" - File "zlib\INFBLOCK.C" - File "zlib\INFBLOCK.H" - File "zlib\INFCODES.C" - File "zlib\INFCODES.H" - File "zlib\INFFAST.C" - File "zlib\INFFAST.H" - File "zlib\INFFIXED.H" - File "zlib\INFLATE.C" - File "zlib\INFTREES.C" - File "zlib\INFTREES.H" - File "zlib\INFUTIL.C" - File "zlib\INFUTIL.H" - File "zlib\Unzip.c" - File "zlib\UNZIP.H" - File "zlib\ZCONF.H" - File "zlib\ZLIB.H" - File "zlib\Zutil.c" - File "zlib\ZUTIL.H" - -SectionEnd - -Section -post - !insertmacro ADDTOADDREMOVELIST nsisunz $(^Name) "$INSTDIR\3rdparty\nsisunz\nsisunz_uninstall.exe" 1 1 - - DetailPrint "Note: Shortcuts are located in Contrib submenu of NSIS start-menu branch!" - CreateDirectory "$SMPROGRAMS\NSIS\3rdparty\nsisunz" - CreateShortcut "$SMPROGRAMS\NSIS\3rdparty\nsisunz\examples and source.lnk" "$INSTDIR\3rdparty\nsisunz\" - CreateShortcut "$SMPROGRAMS\NSIS\3rdparty\nsisunz\readme.lnk" "$INSTDIR\3rdparty\nsisunz\nsisunz_readme.html" - CreateShortcut "$SMPROGRAMS\NSIS\3rdparty\nsisunz\Uninstall nsisunz.lnk" "$INSTDIR\3rdparty\nsisunz\nsisunz_uninstall.exe" - - WriteUninstaller "$INSTDIR\3rdparty\nsisunz\nsisunz_uninstall.exe" - SetAutoClose true -SectionEnd - -Function .onInstSuccess - MessageBox MB_YESNO "Installation done!$\r$\nDo you wish to open the nsisunz examples folder?" IDYES +1 IDNO skiprunapp - ExecShell open "$INSTDIR\3rdparty\nsisunz\" - skiprunapp: -FunctionEnd - -Section "Uninstall" - ; Remove plug-in - Delete "$INSTDIR\plugins\nsisunz.dll" - - ; Remove readme & examples - Delete "$INSTDIR\example.nsi" - Delete "$INSTDIR\example_mui.nsi" - Delete "$INSTDIR\zippage.ini" - Delete "$INSTDIR\nsisunz_readme.html" - - - ; Remove source - Delete "$INSTDIR\source\nsisunz.cpp" - Delete "$INSTDIR\source\nsisunz.dsp" - Delete "$INSTDIR\source\nsisunz.dsw" - - ; Remove included ZLIB - Delete "$INSTDIR\source\zlib\ADLER32.C" - Delete "$INSTDIR\source\zlib\CRC32.C" - Delete "$INSTDIR\source\zlib\INFBLOCK.C" - Delete "$INSTDIR\source\zlib\INFBLOCK.H" - Delete "$INSTDIR\source\zlib\INFCODES.C" - Delete "$INSTDIR\source\zlib\INFCODES.H" - Delete "$INSTDIR\source\zlib\INFFAST.C" - Delete "$INSTDIR\source\zlib\INFFAST.H" - Delete "$INSTDIR\source\zlib\INFFIXED.H" - Delete "$INSTDIR\source\zlib\INFLATE.C" - Delete "$INSTDIR\source\zlib\INFTREES.C" - Delete "$INSTDIR\source\zlib\INFTREES.H" - Delete "$INSTDIR\source\zlib\INFUTIL.C" - Delete "$INSTDIR\source\zlib\INFUTIL.H" - Delete "$INSTDIR\source\zlib\Unzip.c" - Delete "$INSTDIR\source\zlib\UNZIP.H" - Delete "$INSTDIR\source\zlib\ZCONF.H" - Delete "$INSTDIR\source\zlib\ZLIB.H" - Delete "$INSTDIR\source\zlib\Zutil.c" - Delete "$INSTDIR\source\zlib\ZUTIL.H" - - Delete "$INSTDIR\nsisunz_uninstall.exe" - RMDir "$INSTDIR\source\zlib\" - RMDir "$INSTDIR\source\" - RMDir "$INSTDIR\" - - ; Remove shortcuts - Delete "$SMPROGRAMS\NSIS\3rdparty\nsisunz\examples and source.lnk" - Delete "$SMPROGRAMS\NSIS\3rdparty\nsisunz\readme.lnk" - Delete "$SMPROGRAMS\NSIS\3rdparty\nsisunz\Uninstall nsisunz.lnk" - RMDir "$SMPROGRAMS\NSIS\3rdparty\nsisunz" - - !insertmacro REMOVEFROMADDREMOVELIST nsisunz - -SectionEnd -; Number of File lines: 28 -; Number of SetOutPath lines: 1 -; Total size of all files: 298 kB (304897 bytes) diff --git a/data/nsis/Contrib/nsisunz/readme.kjd b/data/nsis/Contrib/nsisunz/readme.kjd deleted file mode 100644 index 462fb73a4..000000000 --- a/data/nsis/Contrib/nsisunz/readme.kjd +++ /dev/null @@ -1,12 +0,0 @@ -This is a further reduced build by removing CRT dependency with Win32 calls. -It is barely tested, so use with caution; ie I may have introduced bugs. -The uncompressed plugin is now 40KB instead of 80KB; compresses via UPX down to 22KB. - -Changes from original realeas: -Added miniclib (from untgz plugin but with strstr() added) & adjusted files to use it. -Updated zlib from 1.1.3 to 1.2.2; except unzip.c/.h -Note: zlib is adjusted to use miniclib (ie direct Win32 calls) and not standard release. -Updated MSVC6 project files to reflect above changes (VC7 ones out of date!). - -KJD -050713 diff --git a/data/nsis/Contrib/nsisunz/zippage.ini b/data/nsis/Contrib/nsisunz/zippage.ini deleted file mode 100644 index db5b91d95..000000000 --- a/data/nsis/Contrib/nsisunz/zippage.ini +++ /dev/null @@ -1,65 +0,0 @@ -; Ini file generated by the HM NIS Edit IO designer. -[Settings] -NumFields=7 -CancelButtonText=Close -NextButtonText=Extract - -[Field 1] -Type=Icon -Left=0 -Right=21 -Top=0 -Bottom=19 - -[Field 2] -Type=Label -Text=To unzip, select a ZIP file using the edit box below (use [...] button to browse) and choose a destination folder for the extracted files. Then click the "Extract" button. -Left=26 -Right=-1 -Top=0 -Bottom=25 - -[Field 3] -Type=Groupbox -Text=Select ZIP file -Left=0 -Right=-1 -Top=33 -Bottom=68 - -[Field 4] -Type=FileRequest -MinLen=1 -ValidateText=Please specify a ZIP file! -Filter=ZIP archives (*.zip)|*.zip|Winamp SkinZip (*.wsz)|*.wsz|Winamp Abstraction Layer (*.wal)|*.wal|All files|*.* -Left=5 -Right=-6 -Top=49 -Bottom=62 - -[Field 5] -Type=Groupbox -Text=Select destination folder -Left=0 -Right=-1 -Top=73 -Bottom=108 - -[Field 6] -Type=DirRequest -MinLen=1 -Text=Select destination folder -ValidateText=Please specify a destination folder! -Left=5 -Right=-6 -Top=88 -Bottom=100 - -[Field 7] -Type=Checkbox -Text=Do not extract paths -Left=0 -Right=102 -Top=113 -Bottom=123 - diff --git a/data/nsis/Contrib/nsisunz/zlib/ADLER32.C b/data/nsis/Contrib/nsisunz/zlib/ADLER32.C deleted file mode 100644 index 624a1696e..000000000 --- a/data/nsis/Contrib/nsisunz/zlib/ADLER32.C +++ /dev/null @@ -1,74 +0,0 @@ -/* adler32.c -- compute the Adler-32 checksum of a data stream - * Copyright (C) 1995-2003 Mark Adler - * For conditions of distribution and use, see copyright notice in zlib.h - */ - -/* @(#) $Id$ */ - -#define ZLIB_INTERNAL -#include "zlib.h" - -#define BASE 65521UL /* largest prime smaller than 65536 */ -#define NMAX 5552 -/* NMAX is the largest n such that 255n(n+1)/2 + (n+1)(BASE-1) <= 2^32-1 */ - -#define DO1(buf,i) {s1 += buf[i]; s2 += s1;} -#define DO2(buf,i) DO1(buf,i); DO1(buf,i+1); -#define DO4(buf,i) DO2(buf,i); DO2(buf,i+2); -#define DO8(buf,i) DO4(buf,i); DO4(buf,i+4); -#define DO16(buf) DO8(buf,0); DO8(buf,8); - -#ifdef NO_DIVIDE -# define MOD(a) \ - do { \ - if (a >= (BASE << 16)) a -= (BASE << 16); \ - if (a >= (BASE << 15)) a -= (BASE << 15); \ - if (a >= (BASE << 14)) a -= (BASE << 14); \ - if (a >= (BASE << 13)) a -= (BASE << 13); \ - if (a >= (BASE << 12)) a -= (BASE << 12); \ - if (a >= (BASE << 11)) a -= (BASE << 11); \ - if (a >= (BASE << 10)) a -= (BASE << 10); \ - if (a >= (BASE << 9)) a -= (BASE << 9); \ - if (a >= (BASE << 8)) a -= (BASE << 8); \ - if (a >= (BASE << 7)) a -= (BASE << 7); \ - if (a >= (BASE << 6)) a -= (BASE << 6); \ - if (a >= (BASE << 5)) a -= (BASE << 5); \ - if (a >= (BASE << 4)) a -= (BASE << 4); \ - if (a >= (BASE << 3)) a -= (BASE << 3); \ - if (a >= (BASE << 2)) a -= (BASE << 2); \ - if (a >= (BASE << 1)) a -= (BASE << 1); \ - if (a >= BASE) a -= BASE; \ - } while (0) -#else -# define MOD(a) a %= BASE -#endif - -/* ========================================================================= */ -uLong ZEXPORT adler32(adler, buf, len) - uLong adler; - const Bytef *buf; - uInt len; -{ - unsigned long s1 = adler & 0xffff; - unsigned long s2 = (adler >> 16) & 0xffff; - int k; - - if (buf == Z_NULL) return 1L; - - while (len > 0) { - k = len < NMAX ? (int)len : NMAX; - len -= k; - while (k >= 16) { - DO16(buf); - buf += 16; - k -= 16; - } - if (k != 0) do { - s1 += *buf++; - s2 += s1; - } while (--k); - MOD(s1); - MOD(s2); - } - return (s2 << 16) | s1; -} diff --git a/data/nsis/Contrib/nsisunz/zlib/CRC32.C b/data/nsis/Contrib/nsisunz/zlib/CRC32.C deleted file mode 100644 index b39c7e125..000000000 --- a/data/nsis/Contrib/nsisunz/zlib/CRC32.C +++ /dev/null @@ -1,333 +0,0 @@ -/* crc32.c -- compute the CRC-32 of a data stream - * Copyright (C) 1995-2003 Mark Adler - * For conditions of distribution and use, see copyright notice in zlib.h - * - * Thanks to Rodney Brown for his contribution of faster - * CRC methods: exclusive-oring 32 bits of data at a time, and pre-computing - * tables for updating the shift register in one step with three exclusive-ors - * instead of four steps with four exclusive-ors. This results about a factor - * of two increase in speed on a Power PC G4 (PPC7455) using gcc -O3. - */ - -/* @(#) $Id$ */ - -/* - Note on the use of DYNAMIC_CRC_TABLE: there is no mutex or semaphore - protection on the static variables used to control the first-use generation - of the crc tables. Therefore, if you #define DYNAMIC_CRC_TABLE, you should - first call get_crc_table() to initialize the tables before allowing more than - one thread to use crc32(). - */ - -#ifdef MAKECRCH -# include -# ifndef DYNAMIC_CRC_TABLE -# define DYNAMIC_CRC_TABLE -# endif /* !DYNAMIC_CRC_TABLE */ -#endif /* MAKECRCH */ - -#include "zutil.h" /* for STDC and FAR definitions */ - -#define local static - -/* Find a four-byte integer type for crc32_little() and crc32_big(). */ -#ifndef NOBYFOUR -# ifdef STDC /* need ANSI C limits.h to determine sizes */ -# include -# define BYFOUR -# if (UINT_MAX == 0xffffffffUL) - typedef unsigned int u4; -# else -# if (ULONG_MAX == 0xffffffffUL) - typedef unsigned long u4; -# else -# if (USHRT_MAX == 0xffffffffUL) - typedef unsigned short u4; -# else -# undef BYFOUR /* can't find a four-byte integer type! */ -# endif -# endif -# endif -# endif /* STDC */ -#endif /* !NOBYFOUR */ - -/* Definitions for doing the crc four data bytes at a time. */ -#ifdef BYFOUR -# define REV(w) (((w)>>24)+(((w)>>8)&0xff00)+ \ - (((w)&0xff00)<<8)+(((w)&0xff)<<24)) - local unsigned long crc32_little OF((unsigned long, - const unsigned char FAR *, unsigned)); - local unsigned long crc32_big OF((unsigned long, - const unsigned char FAR *, unsigned)); -# define TBLS 8 -#else -# define TBLS 1 -#endif /* BYFOUR */ - -#ifdef DYNAMIC_CRC_TABLE - -local volatile int crc_table_empty = 1; -local unsigned long FAR crc_table[TBLS][256]; -local void make_crc_table OF((void)); -#ifdef MAKECRCH - local void write_table OF((FILE *, const unsigned long FAR *)); -#endif /* MAKECRCH */ - -/* - Generate tables for a byte-wise 32-bit CRC calculation on the polynomial: - x^32+x^26+x^23+x^22+x^16+x^12+x^11+x^10+x^8+x^7+x^5+x^4+x^2+x+1. - - Polynomials over GF(2) are represented in binary, one bit per coefficient, - with the lowest powers in the most significant bit. Then adding polynomials - is just exclusive-or, and multiplying a polynomial by x is a right shift by - one. If we call the above polynomial p, and represent a byte as the - polynomial q, also with the lowest power in the most significant bit (so the - byte 0xb1 is the polynomial x^7+x^3+x+1), then the CRC is (q*x^32) mod p, - where a mod b means the remainder after dividing a by b. - - This calculation is done using the shift-register method of multiplying and - taking the remainder. The register is initialized to zero, and for each - incoming bit, x^32 is added mod p to the register if the bit is a one (where - x^32 mod p is p+x^32 = x^26+...+1), and the register is multiplied mod p by - x (which is shifting right by one and adding x^32 mod p if the bit shifted - out is a one). We start with the highest power (least significant bit) of - q and repeat for all eight bits of q. - - The first table is simply the CRC of all possible eight bit values. This is - all the information needed to generate CRCs on data a byte at a time for all - combinations of CRC register values and incoming bytes. The remaining tables - allow for word-at-a-time CRC calculation for both big-endian and little- - endian machines, where a word is four bytes. -*/ -local void make_crc_table() -{ - unsigned long c; - int n, k; - unsigned long poly; /* polynomial exclusive-or pattern */ - /* terms of polynomial defining this crc (except x^32): */ - static volatile int first = 1; /* flag to limit concurrent making */ - static const unsigned char p[] = {0,1,2,4,5,7,8,10,11,12,16,22,23,26}; - - /* See if another task is already doing this (not thread-safe, but better - than nothing -- significantly reduces duration of vulnerability in - case the advice about DYNAMIC_CRC_TABLE is ignored) */ - if (first) { - first = 0; - - /* make exclusive-or pattern from polynomial (0xedb88320UL) */ - poly = 0UL; - for (n = 0; n < sizeof(p)/sizeof(unsigned char); n++) - poly |= 1UL << (31 - p[n]); - - /* generate a crc for every 8-bit value */ - for (n = 0; n < 256; n++) { - c = (unsigned long)n; - for (k = 0; k < 8; k++) - c = c & 1 ? poly ^ (c >> 1) : c >> 1; - crc_table[0][n] = c; - } - -#ifdef BYFOUR - /* generate crc for each value followed by one, two, and three zeros, - and then the byte reversal of those as well as the first table */ - for (n = 0; n < 256; n++) { - c = crc_table[0][n]; - crc_table[4][n] = REV(c); - for (k = 1; k < 4; k++) { - c = crc_table[0][c & 0xff] ^ (c >> 8); - crc_table[k][n] = c; - crc_table[k + 4][n] = REV(c); - } - } -#endif /* BYFOUR */ - - crc_table_empty = 0; - } - else { /* not first */ - /* wait for the other guy to finish (not efficient, but rare) */ - while (crc_table_empty) - ; - } - -#ifdef MAKECRCH - /* write out CRC tables to crc32.h */ - { - FILE *out; - - out = fopen("crc32.h", "w"); - if (out == NULL) return; - fprintf(out, "/* crc32.h -- tables for rapid CRC calculation\n"); - fprintf(out, " * Generated automatically by crc32.c\n */\n\n"); - fprintf(out, "local const unsigned long FAR "); - fprintf(out, "crc_table[TBLS][256] =\n{\n {\n"); - write_table(out, crc_table[0]); -# ifdef BYFOUR - fprintf(out, "#ifdef BYFOUR\n"); - for (k = 1; k < 8; k++) { - fprintf(out, " },\n {\n"); - write_table(out, crc_table[k]); - } - fprintf(out, "#endif\n"); -# endif /* BYFOUR */ - fprintf(out, " }\n};\n"); - fclose(out); - } -#endif /* MAKECRCH */ -} - -#ifdef MAKECRCH -local void write_table(out, table) - FILE *out; - const unsigned long FAR *table; -{ - int n; - - for (n = 0; n < 256; n++) - fprintf(out, "%s0x%08lxUL%s", n % 5 ? "" : " ", table[n], - n == 255 ? "\n" : (n % 5 == 4 ? ",\n" : ", ")); -} -#endif /* MAKECRCH */ - -#else /* !DYNAMIC_CRC_TABLE */ -/* ======================================================================== - * Tables of CRC-32s of all single-byte values, made by make_crc_table(). - */ -#include "crc32.h" -#endif /* DYNAMIC_CRC_TABLE */ - -/* ========================================================================= - * This function can be used by asm versions of crc32() - */ -const unsigned long FAR * ZEXPORT get_crc_table() -{ -#ifdef DYNAMIC_CRC_TABLE - if (crc_table_empty) - make_crc_table(); -#endif /* DYNAMIC_CRC_TABLE */ - return (const unsigned long FAR *)crc_table; -} - -/* ========================================================================= */ -#define DO1 crc = crc_table[0][((int)crc ^ (*buf++)) & 0xff] ^ (crc >> 8) -#define DO8 DO1; DO1; DO1; DO1; DO1; DO1; DO1; DO1 - -/* ========================================================================= */ -unsigned long ZEXPORT crc32(crc, buf, len) - unsigned long crc; - const unsigned char FAR *buf; - unsigned len; -{ - if (buf == Z_NULL) return 0UL; - -#ifdef DYNAMIC_CRC_TABLE - if (crc_table_empty) - make_crc_table(); -#endif /* DYNAMIC_CRC_TABLE */ - -#ifdef BYFOUR - if (sizeof(void *) == sizeof(ptrdiff_t)) { - u4 endian; - - endian = 1; - if (*((unsigned char *)(&endian))) - return crc32_little(crc, buf, len); - else - return crc32_big(crc, buf, len); - } -#endif /* BYFOUR */ - crc = crc ^ 0xffffffffUL; - while (len >= 8) { - DO8; - len -= 8; - } - if (len) do { - DO1; - } while (--len); - return crc ^ 0xffffffffUL; -} - -#ifdef BYFOUR - -/* ========================================================================= */ -#define DOLIT4 c ^= *buf4++; \ - c = crc_table[3][c & 0xff] ^ crc_table[2][(c >> 8) & 0xff] ^ \ - crc_table[1][(c >> 16) & 0xff] ^ crc_table[0][c >> 24] -#define DOLIT32 DOLIT4; DOLIT4; DOLIT4; DOLIT4; DOLIT4; DOLIT4; DOLIT4; DOLIT4 - -/* ========================================================================= */ -local unsigned long crc32_little(crc, buf, len) - unsigned long crc; - const unsigned char FAR *buf; - unsigned len; -{ - register u4 c; - register const u4 FAR *buf4; - - c = (u4)crc; - c = ~c; - while (len && ((ptrdiff_t)buf & 3)) { - c = crc_table[0][(c ^ *buf++) & 0xff] ^ (c >> 8); - len--; - } - - buf4 = (const u4 FAR *)buf; - while (len >= 32) { - DOLIT32; - len -= 32; - } - while (len >= 4) { - DOLIT4; - len -= 4; - } - buf = (const unsigned char FAR *)buf4; - - if (len) do { - c = crc_table[0][(c ^ *buf++) & 0xff] ^ (c >> 8); - } while (--len); - c = ~c; - return (unsigned long)c; -} - -/* ========================================================================= */ -#define DOBIG4 c ^= *++buf4; \ - c = crc_table[4][c & 0xff] ^ crc_table[5][(c >> 8) & 0xff] ^ \ - crc_table[6][(c >> 16) & 0xff] ^ crc_table[7][c >> 24] -#define DOBIG32 DOBIG4; DOBIG4; DOBIG4; DOBIG4; DOBIG4; DOBIG4; DOBIG4; DOBIG4 - -/* ========================================================================= */ -local unsigned long crc32_big(crc, buf, len) - unsigned long crc; - const unsigned char FAR *buf; - unsigned len; -{ - register u4 c; - register const u4 FAR *buf4; - - c = REV((u4)crc); - c = ~c; - while (len && ((ptrdiff_t)buf & 3)) { - c = crc_table[4][(c >> 24) ^ *buf++] ^ (c << 8); - len--; - } - - buf4 = (const u4 FAR *)buf; - buf4--; - while (len >= 32) { - DOBIG32; - len -= 32; - } - while (len >= 4) { - DOBIG4; - len -= 4; - } - buf4++; - buf = (const unsigned char FAR *)buf4; - - if (len) do { - c = crc_table[4][(c >> 24) ^ *buf++] ^ (c << 8); - } while (--len); - c = ~c; - return (unsigned long)(REV(c)); -} - -#endif /* BYFOUR */ diff --git a/data/nsis/Contrib/nsisunz/zlib/INFFAST.C b/data/nsis/Contrib/nsisunz/zlib/INFFAST.C deleted file mode 100644 index 8c02a178d..000000000 --- a/data/nsis/Contrib/nsisunz/zlib/INFFAST.C +++ /dev/null @@ -1,305 +0,0 @@ -/* inffast.c -- fast decoding - * Copyright (C) 1995-2004 Mark Adler - * For conditions of distribution and use, see copyright notice in zlib.h - */ - -#include "zutil.h" -#include "inftrees.h" -#include "inflate.h" -#include "inffast.h" - -#ifndef ASMINF - -/* Allow machine dependent optimization for post-increment or pre-increment. - Based on testing to date, - Pre-increment preferred for: - - PowerPC G3 (Adler) - - MIPS R5000 (Randers-Pehrson) - Post-increment preferred for: - - none - No measurable difference: - - Pentium III (Anderson) - - M68060 (Nikl) - */ -#ifdef POSTINC -# define OFF 0 -# define PUP(a) *(a)++ -#else -# define OFF 1 -# define PUP(a) *++(a) -#endif - -/* - Decode literal, length, and distance codes and write out the resulting - literal and match bytes until either not enough input or output is - available, an end-of-block is encountered, or a data error is encountered. - When large enough input and output buffers are supplied to inflate(), for - example, a 16K input buffer and a 64K output buffer, more than 95% of the - inflate execution time is spent in this routine. - - Entry assumptions: - - state->mode == LEN - strm->avail_in >= 6 - strm->avail_out >= 258 - start >= strm->avail_out - state->bits < 8 - - On return, state->mode is one of: - - LEN -- ran out of enough output space or enough available input - TYPE -- reached end of block code, inflate() to interpret next block - BAD -- error in block data - - Notes: - - - The maximum input bits used by a length/distance pair is 15 bits for the - length code, 5 bits for the length extra, 15 bits for the distance code, - and 13 bits for the distance extra. This totals 48 bits, or six bytes. - Therefore if strm->avail_in >= 6, then there is enough input to avoid - checking for available input while decoding. - - - The maximum bytes that a single length/distance pair can output is 258 - bytes, which is the maximum length that can be coded. inflate_fast() - requires strm->avail_out >= 258 for each loop to avoid checking for - output space. - */ -void inflate_fast(strm, start) -z_streamp strm; -unsigned start; /* inflate()'s starting value for strm->avail_out */ -{ - struct inflate_state FAR *state; - unsigned char FAR *in; /* local strm->next_in */ - unsigned char FAR *last; /* while in < last, enough input available */ - unsigned char FAR *out; /* local strm->next_out */ - unsigned char FAR *beg; /* inflate()'s initial strm->next_out */ - unsigned char FAR *end; /* while out < end, enough space available */ - unsigned wsize; /* window size or zero if not using window */ - unsigned whave; /* valid bytes in the window */ - unsigned write; /* window write index */ - unsigned char FAR *window; /* allocated sliding window, if wsize != 0 */ - unsigned long hold; /* local strm->hold */ - unsigned bits; /* local strm->bits */ - code const FAR *lcode; /* local strm->lencode */ - code const FAR *dcode; /* local strm->distcode */ - unsigned lmask; /* mask for first level of length codes */ - unsigned dmask; /* mask for first level of distance codes */ - code this; /* retrieved table entry */ - unsigned op; /* code bits, operation, extra bits, or */ - /* window position, window bytes to copy */ - unsigned len; /* match length, unused bytes */ - unsigned dist; /* match distance */ - unsigned char FAR *from; /* where to copy match from */ - - /* copy state to local variables */ - state = (struct inflate_state FAR *)strm->state; - in = strm->next_in - OFF; - last = in + (strm->avail_in - 5); - out = strm->next_out - OFF; - beg = out - (start - strm->avail_out); - end = out + (strm->avail_out - 257); - wsize = state->wsize; - whave = state->whave; - write = state->write; - window = state->window; - hold = state->hold; - bits = state->bits; - lcode = state->lencode; - dcode = state->distcode; - lmask = (1U << state->lenbits) - 1; - dmask = (1U << state->distbits) - 1; - - /* decode literals and length/distances until end-of-block or not enough - input data or output space */ - do { - if (bits < 15) { - hold += (unsigned long)(PUP(in)) << bits; - bits += 8; - hold += (unsigned long)(PUP(in)) << bits; - bits += 8; - } - this = lcode[hold & lmask]; - dolen: - op = (unsigned)(this.bits); - hold >>= op; - bits -= op; - op = (unsigned)(this.op); - if (op == 0) { /* literal */ - Tracevv((stderr, this.val >= 0x20 && this.val < 0x7f ? - "inflate: literal '%c'\n" : - "inflate: literal 0x%02x\n", this.val)); - PUP(out) = (unsigned char)(this.val); - } - else if (op & 16) { /* length base */ - len = (unsigned)(this.val); - op &= 15; /* number of extra bits */ - if (op) { - if (bits < op) { - hold += (unsigned long)(PUP(in)) << bits; - bits += 8; - } - len += (unsigned)hold & ((1U << op) - 1); - hold >>= op; - bits -= op; - } - Tracevv((stderr, "inflate: length %u\n", len)); - if (bits < 15) { - hold += (unsigned long)(PUP(in)) << bits; - bits += 8; - hold += (unsigned long)(PUP(in)) << bits; - bits += 8; - } - this = dcode[hold & dmask]; - dodist: - op = (unsigned)(this.bits); - hold >>= op; - bits -= op; - op = (unsigned)(this.op); - if (op & 16) { /* distance base */ - dist = (unsigned)(this.val); - op &= 15; /* number of extra bits */ - if (bits < op) { - hold += (unsigned long)(PUP(in)) << bits; - bits += 8; - if (bits < op) { - hold += (unsigned long)(PUP(in)) << bits; - bits += 8; - } - } - dist += (unsigned)hold & ((1U << op) - 1); - hold >>= op; - bits -= op; - Tracevv((stderr, "inflate: distance %u\n", dist)); - op = (unsigned)(out - beg); /* max distance in output */ - if (dist > op) { /* see if copy from window */ - op = dist - op; /* distance back in window */ - if (op > whave) { - strm->msg = (char *)"invalid distance too far back"; - state->mode = BAD; - break; - } - from = window - OFF; - if (write == 0) { /* very common case */ - from += wsize - op; - if (op < len) { /* some from window */ - len -= op; - do { - PUP(out) = PUP(from); - } while (--op); - from = out - dist; /* rest from output */ - } - } - else if (write < op) { /* wrap around window */ - from += wsize + write - op; - op -= write; - if (op < len) { /* some from end of window */ - len -= op; - do { - PUP(out) = PUP(from); - } while (--op); - from = window - OFF; - if (write < len) { /* some from start of window */ - op = write; - len -= op; - do { - PUP(out) = PUP(from); - } while (--op); - from = out - dist; /* rest from output */ - } - } - } - else { /* contiguous in window */ - from += write - op; - if (op < len) { /* some from window */ - len -= op; - do { - PUP(out) = PUP(from); - } while (--op); - from = out - dist; /* rest from output */ - } - } - while (len > 2) { - PUP(out) = PUP(from); - PUP(out) = PUP(from); - PUP(out) = PUP(from); - len -= 3; - } - if (len) { - PUP(out) = PUP(from); - if (len > 1) - PUP(out) = PUP(from); - } - } - else { - from = out - dist; /* copy direct from output */ - do { /* minimum length is three */ - PUP(out) = PUP(from); - PUP(out) = PUP(from); - PUP(out) = PUP(from); - len -= 3; - } while (len > 2); - if (len) { - PUP(out) = PUP(from); - if (len > 1) - PUP(out) = PUP(from); - } - } - } - else if ((op & 64) == 0) { /* 2nd level distance code */ - this = dcode[this.val + (hold & ((1U << op) - 1))]; - goto dodist; - } - else { - strm->msg = (char *)"invalid distance code"; - state->mode = BAD; - break; - } - } - else if ((op & 64) == 0) { /* 2nd level length code */ - this = lcode[this.val + (hold & ((1U << op) - 1))]; - goto dolen; - } - else if (op & 32) { /* end-of-block */ - Tracevv((stderr, "inflate: end of block\n")); - state->mode = TYPE; - break; - } - else { - strm->msg = (char *)"invalid literal/length code"; - state->mode = BAD; - break; - } - } while (in < last && out < end); - - /* return unused bytes (on entry, bits < 8, so in won't go too far back) */ - len = bits >> 3; - in -= len; - bits -= len << 3; - hold &= (1U << bits) - 1; - - /* update state and return */ - strm->next_in = in + OFF; - strm->next_out = out + OFF; - strm->avail_in = (unsigned)(in < last ? 5 + (last - in) : 5 - (in - last)); - strm->avail_out = (unsigned)(out < end ? - 257 + (end - out) : 257 - (out - end)); - state->hold = hold; - state->bits = bits; - return; -} - -/* - inflate_fast() speedups that turned out slower (on a PowerPC G3 750CXe): - - Using bit fields for code structure - - Different op definition to avoid & for extra bits (do & for table bits) - - Three separate decoding do-loops for direct, window, and write == 0 - - Special case for distance > 1 copies to do overlapped load and store copy - - Explicit branch predictions (based on measured branch probabilities) - - Deferring match copy and interspersed it with decoding subsequent codes - - Swapping literal/length else - - Swapping window/direct else - - Larger unrolled copy loops (three is about right) - - Moving len -= 3 statement into middle of loop - */ - -#endif /* !ASMINF */ diff --git a/data/nsis/Contrib/nsisunz/zlib/INFFAST.H b/data/nsis/Contrib/nsisunz/zlib/INFFAST.H deleted file mode 100644 index 1e88d2d97..000000000 --- a/data/nsis/Contrib/nsisunz/zlib/INFFAST.H +++ /dev/null @@ -1,11 +0,0 @@ -/* inffast.h -- header to use inffast.c - * Copyright (C) 1995-2003 Mark Adler - * For conditions of distribution and use, see copyright notice in zlib.h - */ - -/* WARNING: this file should *not* be used by applications. It is - part of the implementation of the compression library and is - subject to change. Applications should only use zlib.h. - */ - -void inflate_fast OF((z_streamp strm, unsigned start)); diff --git a/data/nsis/Contrib/nsisunz/zlib/INFFIXED.H b/data/nsis/Contrib/nsisunz/zlib/INFFIXED.H deleted file mode 100644 index 75ed4b597..000000000 --- a/data/nsis/Contrib/nsisunz/zlib/INFFIXED.H +++ /dev/null @@ -1,94 +0,0 @@ - /* inffixed.h -- table for decoding fixed codes - * Generated automatically by makefixed(). - */ - - /* WARNING: this file should *not* be used by applications. It - is part of the implementation of the compression library and - is subject to change. Applications should only use zlib.h. - */ - - static const code lenfix[512] = { - {96,7,0},{0,8,80},{0,8,16},{20,8,115},{18,7,31},{0,8,112},{0,8,48}, - {0,9,192},{16,7,10},{0,8,96},{0,8,32},{0,9,160},{0,8,0},{0,8,128}, - {0,8,64},{0,9,224},{16,7,6},{0,8,88},{0,8,24},{0,9,144},{19,7,59}, - {0,8,120},{0,8,56},{0,9,208},{17,7,17},{0,8,104},{0,8,40},{0,9,176}, - {0,8,8},{0,8,136},{0,8,72},{0,9,240},{16,7,4},{0,8,84},{0,8,20}, - {21,8,227},{19,7,43},{0,8,116},{0,8,52},{0,9,200},{17,7,13},{0,8,100}, - {0,8,36},{0,9,168},{0,8,4},{0,8,132},{0,8,68},{0,9,232},{16,7,8}, - {0,8,92},{0,8,28},{0,9,152},{20,7,83},{0,8,124},{0,8,60},{0,9,216}, - {18,7,23},{0,8,108},{0,8,44},{0,9,184},{0,8,12},{0,8,140},{0,8,76}, - {0,9,248},{16,7,3},{0,8,82},{0,8,18},{21,8,163},{19,7,35},{0,8,114}, - {0,8,50},{0,9,196},{17,7,11},{0,8,98},{0,8,34},{0,9,164},{0,8,2}, - {0,8,130},{0,8,66},{0,9,228},{16,7,7},{0,8,90},{0,8,26},{0,9,148}, - {20,7,67},{0,8,122},{0,8,58},{0,9,212},{18,7,19},{0,8,106},{0,8,42}, - {0,9,180},{0,8,10},{0,8,138},{0,8,74},{0,9,244},{16,7,5},{0,8,86}, - {0,8,22},{64,8,0},{19,7,51},{0,8,118},{0,8,54},{0,9,204},{17,7,15}, - {0,8,102},{0,8,38},{0,9,172},{0,8,6},{0,8,134},{0,8,70},{0,9,236}, - {16,7,9},{0,8,94},{0,8,30},{0,9,156},{20,7,99},{0,8,126},{0,8,62}, - {0,9,220},{18,7,27},{0,8,110},{0,8,46},{0,9,188},{0,8,14},{0,8,142}, - {0,8,78},{0,9,252},{96,7,0},{0,8,81},{0,8,17},{21,8,131},{18,7,31}, - {0,8,113},{0,8,49},{0,9,194},{16,7,10},{0,8,97},{0,8,33},{0,9,162}, - {0,8,1},{0,8,129},{0,8,65},{0,9,226},{16,7,6},{0,8,89},{0,8,25}, - {0,9,146},{19,7,59},{0,8,121},{0,8,57},{0,9,210},{17,7,17},{0,8,105}, - {0,8,41},{0,9,178},{0,8,9},{0,8,137},{0,8,73},{0,9,242},{16,7,4}, - {0,8,85},{0,8,21},{16,8,258},{19,7,43},{0,8,117},{0,8,53},{0,9,202}, - {17,7,13},{0,8,101},{0,8,37},{0,9,170},{0,8,5},{0,8,133},{0,8,69}, - {0,9,234},{16,7,8},{0,8,93},{0,8,29},{0,9,154},{20,7,83},{0,8,125}, - {0,8,61},{0,9,218},{18,7,23},{0,8,109},{0,8,45},{0,9,186},{0,8,13}, - {0,8,141},{0,8,77},{0,9,250},{16,7,3},{0,8,83},{0,8,19},{21,8,195}, - {19,7,35},{0,8,115},{0,8,51},{0,9,198},{17,7,11},{0,8,99},{0,8,35}, - {0,9,166},{0,8,3},{0,8,131},{0,8,67},{0,9,230},{16,7,7},{0,8,91}, - {0,8,27},{0,9,150},{20,7,67},{0,8,123},{0,8,59},{0,9,214},{18,7,19}, - {0,8,107},{0,8,43},{0,9,182},{0,8,11},{0,8,139},{0,8,75},{0,9,246}, - {16,7,5},{0,8,87},{0,8,23},{64,8,0},{19,7,51},{0,8,119},{0,8,55}, - {0,9,206},{17,7,15},{0,8,103},{0,8,39},{0,9,174},{0,8,7},{0,8,135}, - {0,8,71},{0,9,238},{16,7,9},{0,8,95},{0,8,31},{0,9,158},{20,7,99}, - {0,8,127},{0,8,63},{0,9,222},{18,7,27},{0,8,111},{0,8,47},{0,9,190}, - {0,8,15},{0,8,143},{0,8,79},{0,9,254},{96,7,0},{0,8,80},{0,8,16}, - {20,8,115},{18,7,31},{0,8,112},{0,8,48},{0,9,193},{16,7,10},{0,8,96}, - {0,8,32},{0,9,161},{0,8,0},{0,8,128},{0,8,64},{0,9,225},{16,7,6}, - {0,8,88},{0,8,24},{0,9,145},{19,7,59},{0,8,120},{0,8,56},{0,9,209}, - {17,7,17},{0,8,104},{0,8,40},{0,9,177},{0,8,8},{0,8,136},{0,8,72}, - {0,9,241},{16,7,4},{0,8,84},{0,8,20},{21,8,227},{19,7,43},{0,8,116}, - {0,8,52},{0,9,201},{17,7,13},{0,8,100},{0,8,36},{0,9,169},{0,8,4}, - {0,8,132},{0,8,68},{0,9,233},{16,7,8},{0,8,92},{0,8,28},{0,9,153}, - {20,7,83},{0,8,124},{0,8,60},{0,9,217},{18,7,23},{0,8,108},{0,8,44}, - {0,9,185},{0,8,12},{0,8,140},{0,8,76},{0,9,249},{16,7,3},{0,8,82}, - {0,8,18},{21,8,163},{19,7,35},{0,8,114},{0,8,50},{0,9,197},{17,7,11}, - {0,8,98},{0,8,34},{0,9,165},{0,8,2},{0,8,130},{0,8,66},{0,9,229}, - {16,7,7},{0,8,90},{0,8,26},{0,9,149},{20,7,67},{0,8,122},{0,8,58}, - {0,9,213},{18,7,19},{0,8,106},{0,8,42},{0,9,181},{0,8,10},{0,8,138}, - {0,8,74},{0,9,245},{16,7,5},{0,8,86},{0,8,22},{64,8,0},{19,7,51}, - {0,8,118},{0,8,54},{0,9,205},{17,7,15},{0,8,102},{0,8,38},{0,9,173}, - {0,8,6},{0,8,134},{0,8,70},{0,9,237},{16,7,9},{0,8,94},{0,8,30}, - {0,9,157},{20,7,99},{0,8,126},{0,8,62},{0,9,221},{18,7,27},{0,8,110}, - {0,8,46},{0,9,189},{0,8,14},{0,8,142},{0,8,78},{0,9,253},{96,7,0}, - {0,8,81},{0,8,17},{21,8,131},{18,7,31},{0,8,113},{0,8,49},{0,9,195}, - {16,7,10},{0,8,97},{0,8,33},{0,9,163},{0,8,1},{0,8,129},{0,8,65}, - {0,9,227},{16,7,6},{0,8,89},{0,8,25},{0,9,147},{19,7,59},{0,8,121}, - {0,8,57},{0,9,211},{17,7,17},{0,8,105},{0,8,41},{0,9,179},{0,8,9}, - {0,8,137},{0,8,73},{0,9,243},{16,7,4},{0,8,85},{0,8,21},{16,8,258}, - {19,7,43},{0,8,117},{0,8,53},{0,9,203},{17,7,13},{0,8,101},{0,8,37}, - {0,9,171},{0,8,5},{0,8,133},{0,8,69},{0,9,235},{16,7,8},{0,8,93}, - {0,8,29},{0,9,155},{20,7,83},{0,8,125},{0,8,61},{0,9,219},{18,7,23}, - {0,8,109},{0,8,45},{0,9,187},{0,8,13},{0,8,141},{0,8,77},{0,9,251}, - {16,7,3},{0,8,83},{0,8,19},{21,8,195},{19,7,35},{0,8,115},{0,8,51}, - {0,9,199},{17,7,11},{0,8,99},{0,8,35},{0,9,167},{0,8,3},{0,8,131}, - {0,8,67},{0,9,231},{16,7,7},{0,8,91},{0,8,27},{0,9,151},{20,7,67}, - {0,8,123},{0,8,59},{0,9,215},{18,7,19},{0,8,107},{0,8,43},{0,9,183}, - {0,8,11},{0,8,139},{0,8,75},{0,9,247},{16,7,5},{0,8,87},{0,8,23}, - {64,8,0},{19,7,51},{0,8,119},{0,8,55},{0,9,207},{17,7,15},{0,8,103}, - {0,8,39},{0,9,175},{0,8,7},{0,8,135},{0,8,71},{0,9,239},{16,7,9}, - {0,8,95},{0,8,31},{0,9,159},{20,7,99},{0,8,127},{0,8,63},{0,9,223}, - {18,7,27},{0,8,111},{0,8,47},{0,9,191},{0,8,15},{0,8,143},{0,8,79}, - {0,9,255} - }; - - static const code distfix[32] = { - {16,5,1},{23,5,257},{19,5,17},{27,5,4097},{17,5,5},{25,5,1025}, - {21,5,65},{29,5,16385},{16,5,3},{24,5,513},{20,5,33},{28,5,8193}, - {18,5,9},{26,5,2049},{22,5,129},{64,5,0},{16,5,2},{23,5,385}, - {19,5,25},{27,5,6145},{17,5,7},{25,5,1537},{21,5,97},{29,5,24577}, - {16,5,4},{24,5,769},{20,5,49},{28,5,12289},{18,5,13},{26,5,3073}, - {22,5,193},{64,5,0} - }; diff --git a/data/nsis/Contrib/nsisunz/zlib/INFLATE.C b/data/nsis/Contrib/nsisunz/zlib/INFLATE.C deleted file mode 100644 index c6d38266d..000000000 --- a/data/nsis/Contrib/nsisunz/zlib/INFLATE.C +++ /dev/null @@ -1,1274 +0,0 @@ -/* inflate.c -- zlib decompression - * Copyright (C) 1995-2003 Mark Adler - * For conditions of distribution and use, see copyright notice in zlib.h - */ - -/* - * Change history: - * - * 1.2.beta0 24 Nov 2002 - * - First version -- complete rewrite of inflate to simplify code, avoid - * creation of window when not needed, minimize use of window when it is - * needed, make inffast.c even faster, implement gzip decoding, and to - * improve code readability and style over the previous zlib inflate code - * - * 1.2.beta1 25 Nov 2002 - * - Use pointers for available input and output checking in inffast.c - * - Remove input and output counters in inffast.c - * - Change inffast.c entry and loop from avail_in >= 7 to >= 6 - * - Remove unnecessary second byte pull from length extra in inffast.c - * - Unroll direct copy to three copies per loop in inffast.c - * - * 1.2.beta2 4 Dec 2002 - * - Change external routine names to reduce potential conflicts - * - Correct filename to inffixed.h for fixed tables in inflate.c - * - Make hbuf[] unsigned char to match parameter type in inflate.c - * - Change strm->next_out[-state->offset] to *(strm->next_out - state->offset) - * to avoid negation problem on Alphas (64 bit) in inflate.c - * - * 1.2.beta3 22 Dec 2002 - * - Add comments on state->bits assertion in inffast.c - * - Add comments on op field in inftrees.h - * - Fix bug in reuse of allocated window after inflateReset() - * - Remove bit fields--back to byte structure for speed - * - Remove distance extra == 0 check in inflate_fast()--only helps for lengths - * - Change post-increments to pre-increments in inflate_fast(), PPC biased? - * - Add compile time option, POSTINC, to use post-increments instead (Intel?) - * - Make MATCH copy in inflate() much faster for when inflate_fast() not used - * - Use local copies of stream next and avail values, as well as local bit - * buffer and bit count in inflate()--for speed when inflate_fast() not used - * - * 1.2.beta4 1 Jan 2003 - * - Split ptr - 257 statements in inflate_table() to avoid compiler warnings - * - Move a comment on output buffer sizes from inffast.c to inflate.c - * - Add comments in inffast.c to introduce the inflate_fast() routine - * - Rearrange window copies in inflate_fast() for speed and simplification - * - Unroll last copy for window match in inflate_fast() - * - Use local copies of window variables in inflate_fast() for speed - * - Pull out common write == 0 case for speed in inflate_fast() - * - Make op and len in inflate_fast() unsigned for consistency - * - Add FAR to lcode and dcode declarations in inflate_fast() - * - Simplified bad distance check in inflate_fast() - * - Added inflateBackInit(), inflateBack(), and inflateBackEnd() in new - * source file infback.c to provide a call-back interface to inflate for - * programs like gzip and unzip -- uses window as output buffer to avoid - * window copying - * - * 1.2.beta5 1 Jan 2003 - * - Improved inflateBack() interface to allow the caller to provide initial - * input in strm. - * - Fixed stored blocks bug in inflateBack() - * - * 1.2.beta6 4 Jan 2003 - * - Added comments in inffast.c on effectiveness of POSTINC - * - Typecasting all around to reduce compiler warnings - * - Changed loops from while (1) or do {} while (1) to for (;;), again to - * make compilers happy - * - Changed type of window in inflateBackInit() to unsigned char * - * - * 1.2.beta7 27 Jan 2003 - * - Changed many types to unsigned or unsigned short to avoid warnings - * - Added inflateCopy() function - * - * 1.2.0 9 Mar 2003 - * - Changed inflateBack() interface to provide separate opaque descriptors - * for the in() and out() functions - * - Changed inflateBack() argument and in_func typedef to swap the length - * and buffer address return values for the input function - * - Check next_in and next_out for Z_NULL on entry to inflate() - * - * The history for versions after 1.2.0 are in ChangeLog in zlib distribution. - */ - -#include "zutil.h" -#include "inftrees.h" -#include "inflate.h" -#include "inffast.h" - -#ifdef MAKEFIXED -# ifndef BUILDFIXED -# define BUILDFIXED -# endif -#endif - -/* function prototypes */ -local void fixedtables OF((struct inflate_state FAR *state)); -local int updatewindow OF((z_streamp strm, unsigned out)); -#ifdef BUILDFIXED - void makefixed OF((void)); -#endif -local unsigned syncsearch OF((unsigned FAR *have, unsigned char FAR *buf, - unsigned len)); - -int ZEXPORT inflateReset(strm) -z_streamp strm; -{ - struct inflate_state FAR *state; - - if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR; - state = (struct inflate_state FAR *)strm->state; - strm->total_in = strm->total_out = state->total = 0; - strm->msg = Z_NULL; - strm->adler = 1; /* to support ill-conceived Java test suite */ - state->mode = HEAD; - state->last = 0; - state->havedict = 0; - state->wsize = 0; - state->whave = 0; - state->hold = 0; - state->bits = 0; - state->lencode = state->distcode = state->next = state->codes; - Tracev((stderr, "inflate: reset\n")); - return Z_OK; -} - -int ZEXPORT inflateInit2_(strm, windowBits, version, stream_size) -z_streamp strm; -int windowBits; -const char *version; -int stream_size; -{ - struct inflate_state FAR *state; - - if (version == Z_NULL || version[0] != ZLIB_VERSION[0] || - stream_size != (int)(sizeof(z_stream))) - return Z_VERSION_ERROR; - if (strm == Z_NULL) return Z_STREAM_ERROR; - strm->msg = Z_NULL; /* in case we return an error */ - if (strm->zalloc == (alloc_func)0) { - strm->zalloc = zcalloc; - strm->opaque = (voidpf)0; - } - if (strm->zfree == (free_func)0) strm->zfree = zcfree; - state = (struct inflate_state FAR *) - ZALLOC(strm, 1, sizeof(struct inflate_state)); - if (state == Z_NULL) return Z_MEM_ERROR; - Tracev((stderr, "inflate: allocated\n")); - strm->state = (voidpf)state; - if (windowBits < 0) { - state->wrap = 0; - windowBits = -windowBits; - } - else { - state->wrap = (windowBits >> 4) + 1; -#ifdef GUNZIP - if (windowBits < 48) windowBits &= 15; -#endif - } - if (windowBits < 8 || windowBits > 15) { - ZFREE(strm, state); - strm->state = Z_NULL; - return Z_STREAM_ERROR; - } - state->wbits = (unsigned)windowBits; - state->window = Z_NULL; - return inflateReset(strm); -} - -int ZEXPORT inflateInit_(strm, version, stream_size) -z_streamp strm; -const char *version; -int stream_size; -{ - return inflateInit2_(strm, DEF_WBITS, version, stream_size); -} - -/* - Return state with length and distance decoding tables and index sizes set to - fixed code decoding. Normally this returns fixed tables from inffixed.h. - If BUILDFIXED is defined, then instead this routine builds the tables the - first time it's called, and returns those tables the first time and - thereafter. This reduces the size of the code by about 2K bytes, in - exchange for a little execution time. However, BUILDFIXED should not be - used for threaded applications, since the rewriting of the tables and virgin - may not be thread-safe. - */ -local void fixedtables(state) -struct inflate_state FAR *state; -{ -#ifdef BUILDFIXED - static int virgin = 1; - static code *lenfix, *distfix; - static code fixed[544]; - - /* build fixed huffman tables if first call (may not be thread safe) */ - if (virgin) { - unsigned sym, bits; - static code *next; - - /* literal/length table */ - sym = 0; - while (sym < 144) state->lens[sym++] = 8; - while (sym < 256) state->lens[sym++] = 9; - while (sym < 280) state->lens[sym++] = 7; - while (sym < 288) state->lens[sym++] = 8; - next = fixed; - lenfix = next; - bits = 9; - inflate_table(LENS, state->lens, 288, &(next), &(bits), state->work); - - /* distance table */ - sym = 0; - while (sym < 32) state->lens[sym++] = 5; - distfix = next; - bits = 5; - inflate_table(DISTS, state->lens, 32, &(next), &(bits), state->work); - - /* do this just once */ - virgin = 0; - } -#else /* !BUILDFIXED */ -# include "inffixed.h" -#endif /* BUILDFIXED */ - state->lencode = lenfix; - state->lenbits = 9; - state->distcode = distfix; - state->distbits = 5; -} - -#ifdef MAKEFIXED -#include - -/* - Write out the inffixed.h that is #include'd above. Defining MAKEFIXED also - defines BUILDFIXED, so the tables are built on the fly. makefixed() writes - those tables to stdout, which would be piped to inffixed.h. A small program - can simply call makefixed to do this: - - void makefixed(void); - - int main(void) - { - makefixed(); - return 0; - } - - Then that can be linked with zlib built with MAKEFIXED defined and run: - - a.out > inffixed.h - */ -void makefixed() -{ - unsigned low, size; - struct inflate_state state; - - fixedtables(&state); - puts(" /* inffixed.h -- table for decoding fixed codes"); - puts(" * Generated automatically by makefixed()."); - puts(" */"); - puts(""); - puts(" /* WARNING: this file should *not* be used by applications."); - puts(" It is part of the implementation of this library and is"); - puts(" subject to change. Applications should only use zlib.h."); - puts(" */"); - puts(""); - size = 1U << 9; - printf(" static const code lenfix[%u] = {", size); - low = 0; - for (;;) { - if ((low % 7) == 0) printf("\n "); - printf("{%u,%u,%d}", state.lencode[low].op, state.lencode[low].bits, - state.lencode[low].val); - if (++low == size) break; - putchar(','); - } - puts("\n };"); - size = 1U << 5; - printf("\n static const code distfix[%u] = {", size); - low = 0; - for (;;) { - if ((low % 6) == 0) printf("\n "); - printf("{%u,%u,%d}", state.distcode[low].op, state.distcode[low].bits, - state.distcode[low].val); - if (++low == size) break; - putchar(','); - } - puts("\n };"); -} -#endif /* MAKEFIXED */ - -/* - Update the window with the last wsize (normally 32K) bytes written before - returning. If window does not exist yet, create it. This is only called - when a window is already in use, or when output has been written during this - inflate call, but the end of the deflate stream has not been reached yet. - It is also called to create a window for dictionary data when a dictionary - is loaded. - - Providing output buffers larger than 32K to inflate() should provide a speed - advantage, since only the last 32K of output is copied to the sliding window - upon return from inflate(), and since all distances after the first 32K of - output will fall in the output data, making match copies simpler and faster. - The advantage may be dependent on the size of the processor's data caches. - */ -local int updatewindow(strm, out) -z_streamp strm; -unsigned out; -{ - struct inflate_state FAR *state; - unsigned copy, dist; - - state = (struct inflate_state FAR *)strm->state; - - /* if it hasn't been done already, allocate space for the window */ - if (state->window == Z_NULL) { - state->window = (unsigned char FAR *) - ZALLOC(strm, 1U << state->wbits, - sizeof(unsigned char)); - if (state->window == Z_NULL) return 1; - } - - /* if window not in use yet, initialize */ - if (state->wsize == 0) { - state->wsize = 1U << state->wbits; - state->write = 0; - state->whave = 0; - } - - /* copy state->wsize or less output bytes into the circular window */ - copy = out - strm->avail_out; - if (copy >= state->wsize) { - zmemcpy(state->window, strm->next_out - state->wsize, state->wsize); - state->write = 0; - state->whave = state->wsize; - } - else { - dist = state->wsize - state->write; - if (dist > copy) dist = copy; - zmemcpy(state->window + state->write, strm->next_out - copy, dist); - copy -= dist; - if (copy) { - zmemcpy(state->window, strm->next_out - copy, copy); - state->write = copy; - state->whave = state->wsize; - } - else { - state->write += dist; - if (state->write == state->wsize) state->write = 0; - if (state->whave < state->wsize) state->whave += dist; - } - } - return 0; -} - -/* Macros for inflate(): */ - -/* check function to use adler32() for zlib or crc32() for gzip */ -#ifdef GUNZIP -# define UPDATE(check, buf, len) \ - (state->flags ? crc32(check, buf, len) : adler32(check, buf, len)) -#else -# define UPDATE(check, buf, len) adler32(check, buf, len) -#endif - -/* check macros for header crc */ -#ifdef GUNZIP -# define CRC2(check, word) \ - do { \ - hbuf[0] = (unsigned char)(word); \ - hbuf[1] = (unsigned char)((word) >> 8); \ - check = crc32(check, hbuf, 2); \ - } while (0) - -# define CRC4(check, word) \ - do { \ - hbuf[0] = (unsigned char)(word); \ - hbuf[1] = (unsigned char)((word) >> 8); \ - hbuf[2] = (unsigned char)((word) >> 16); \ - hbuf[3] = (unsigned char)((word) >> 24); \ - check = crc32(check, hbuf, 4); \ - } while (0) -#endif - -/* Load registers with state in inflate() for speed */ -#define LOAD() \ - do { \ - put = strm->next_out; \ - left = strm->avail_out; \ - next = strm->next_in; \ - have = strm->avail_in; \ - hold = state->hold; \ - bits = state->bits; \ - } while (0) - -/* Restore state from registers in inflate() */ -#define RESTORE() \ - do { \ - strm->next_out = put; \ - strm->avail_out = left; \ - strm->next_in = next; \ - strm->avail_in = have; \ - state->hold = hold; \ - state->bits = bits; \ - } while (0) - -/* Clear the input bit accumulator */ -#define INITBITS() \ - do { \ - hold = 0; \ - bits = 0; \ - } while (0) - -/* Get a byte of input into the bit accumulator, or return from inflate() - if there is no input available. */ -#define PULLBYTE() \ - do { \ - if (have == 0) goto inf_leave; \ - have--; \ - hold += (unsigned long)(*next++) << bits; \ - bits += 8; \ - } while (0) - -/* Assure that there are at least n bits in the bit accumulator. If there is - not enough available input to do that, then return from inflate(). */ -#define NEEDBITS(n) \ - do { \ - while (bits < (unsigned)(n)) \ - PULLBYTE(); \ - } while (0) - -/* Return the low n bits of the bit accumulator (n < 16) */ -#define BITS(n) \ - ((unsigned)hold & ((1U << (n)) - 1)) - -/* Remove n bits from the bit accumulator */ -#define DROPBITS(n) \ - do { \ - hold >>= (n); \ - bits -= (unsigned)(n); \ - } while (0) - -/* Remove zero to seven bits as needed to go to a byte boundary */ -#define BYTEBITS() \ - do { \ - hold >>= bits & 7; \ - bits -= bits & 7; \ - } while (0) - -/* Reverse the bytes in a 32-bit value */ -#define REVERSE(q) \ - ((((q) >> 24) & 0xff) + (((q) >> 8) & 0xff00) + \ - (((q) & 0xff00) << 8) + (((q) & 0xff) << 24)) - -/* - inflate() uses a state machine to process as much input data and generate as - much output data as possible before returning. The state machine is - structured roughly as follows: - - for (;;) switch (state) { - ... - case STATEn: - if (not enough input data or output space to make progress) - return; - ... make progress ... - state = STATEm; - break; - ... - } - - so when inflate() is called again, the same case is attempted again, and - if the appropriate resources are provided, the machine proceeds to the - next state. The NEEDBITS() macro is usually the way the state evaluates - whether it can proceed or should return. NEEDBITS() does the return if - the requested bits are not available. The typical use of the BITS macros - is: - - NEEDBITS(n); - ... do something with BITS(n) ... - DROPBITS(n); - - where NEEDBITS(n) either returns from inflate() if there isn't enough - input left to load n bits into the accumulator, or it continues. BITS(n) - gives the low n bits in the accumulator. When done, DROPBITS(n) drops - the low n bits off the accumulator. INITBITS() clears the accumulator - and sets the number of available bits to zero. BYTEBITS() discards just - enough bits to put the accumulator on a byte boundary. After BYTEBITS() - and a NEEDBITS(8), then BITS(8) would return the next byte in the stream. - - NEEDBITS(n) uses PULLBYTE() to get an available byte of input, or to return - if there is no input available. The decoding of variable length codes uses - PULLBYTE() directly in order to pull just enough bytes to decode the next - code, and no more. - - Some states loop until they get enough input, making sure that enough - state information is maintained to continue the loop where it left off - if NEEDBITS() returns in the loop. For example, want, need, and keep - would all have to actually be part of the saved state in case NEEDBITS() - returns: - - case STATEw: - while (want < need) { - NEEDBITS(n); - keep[want++] = BITS(n); - DROPBITS(n); - } - state = STATEx; - case STATEx: - - As shown above, if the next state is also the next case, then the break - is omitted. - - A state may also return if there is not enough output space available to - complete that state. Those states are copying stored data, writing a - literal byte, and copying a matching string. - - When returning, a "goto inf_leave" is used to update the total counters, - update the check value, and determine whether any progress has been made - during that inflate() call in order to return the proper return code. - Progress is defined as a change in either strm->avail_in or strm->avail_out. - When there is a window, goto inf_leave will update the window with the last - output written. If a goto inf_leave occurs in the middle of decompression - and there is no window currently, goto inf_leave will create one and copy - output to the window for the next call of inflate(). - - In this implementation, the flush parameter of inflate() only affects the - return code (per zlib.h). inflate() always writes as much as possible to - strm->next_out, given the space available and the provided input--the effect - documented in zlib.h of Z_SYNC_FLUSH. Furthermore, inflate() always defers - the allocation of and copying into a sliding window until necessary, which - provides the effect documented in zlib.h for Z_FINISH when the entire input - stream available. So the only thing the flush parameter actually does is: - when flush is set to Z_FINISH, inflate() cannot return Z_OK. Instead it - will return Z_BUF_ERROR if it has not reached the end of the stream. - */ - -int ZEXPORT inflate(strm, flush) -z_streamp strm; -int flush; -{ - struct inflate_state FAR *state; - unsigned char FAR *next; /* next input */ - unsigned char FAR *put; /* next output */ - unsigned have, left; /* available input and output */ - unsigned long hold; /* bit buffer */ - unsigned bits; /* bits in bit buffer */ - unsigned in, out; /* save starting available input and output */ - unsigned copy; /* number of stored or match bytes to copy */ - unsigned char FAR *from; /* where to copy match bytes from */ - code this; /* current decoding table entry */ - code last; /* parent table entry */ - unsigned len; /* length to copy for repeats, bits to drop */ - int ret; /* return code */ -#ifdef GUNZIP - unsigned char hbuf[4]; /* buffer for gzip header crc calculation */ -#endif - static const unsigned short order[19] = /* permutation of code lengths */ - {16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15}; - - if (strm == Z_NULL || strm->state == Z_NULL || strm->next_out == Z_NULL || - (strm->next_in == Z_NULL && strm->avail_in != 0)) - return Z_STREAM_ERROR; - - state = (struct inflate_state FAR *)strm->state; - if (state->mode == TYPE) state->mode = TYPEDO; /* skip check */ - LOAD(); - in = have; - out = left; - ret = Z_OK; - for (;;) - switch (state->mode) { - case HEAD: - if (state->wrap == 0) { - state->mode = TYPEDO; - break; - } - NEEDBITS(16); -#ifdef GUNZIP - if ((state->wrap & 2) && hold == 0x8b1f) { /* gzip header */ - state->check = crc32(0L, Z_NULL, 0); - CRC2(state->check, hold); - INITBITS(); - state->mode = FLAGS; - break; - } - state->flags = 0; /* expect zlib header */ - if (!(state->wrap & 1) || /* check if zlib header allowed */ -#else - if ( -#endif - ((BITS(8) << 8) + (hold >> 8)) % 31) { - strm->msg = (char *)"incorrect header check"; - state->mode = BAD; - break; - } - if (BITS(4) != Z_DEFLATED) { - strm->msg = (char *)"unknown compression method"; - state->mode = BAD; - break; - } - DROPBITS(4); - if (BITS(4) + 8 > state->wbits) { - strm->msg = (char *)"invalid window size"; - state->mode = BAD; - break; - } - Tracev((stderr, "inflate: zlib header ok\n")); - strm->adler = state->check = adler32(0L, Z_NULL, 0); - state->mode = hold & 0x200 ? DICTID : TYPE; - INITBITS(); - break; -#ifdef GUNZIP - case FLAGS: - NEEDBITS(16); - state->flags = (int)(hold); - if ((state->flags & 0xff) != Z_DEFLATED) { - strm->msg = (char *)"unknown compression method"; - state->mode = BAD; - break; - } - if (state->flags & 0xe000) { - strm->msg = (char *)"unknown header flags set"; - state->mode = BAD; - break; - } - if (state->flags & 0x0200) CRC2(state->check, hold); - INITBITS(); - state->mode = TIME; - case TIME: - NEEDBITS(32); - if (state->flags & 0x0200) CRC4(state->check, hold); - INITBITS(); - state->mode = OS; - case OS: - NEEDBITS(16); - if (state->flags & 0x0200) CRC2(state->check, hold); - INITBITS(); - state->mode = EXLEN; - case EXLEN: - if (state->flags & 0x0400) { - NEEDBITS(16); - state->length = (unsigned)(hold); - if (state->flags & 0x0200) CRC2(state->check, hold); - INITBITS(); - } - state->mode = EXTRA; - case EXTRA: - if (state->flags & 0x0400) { - copy = state->length; - if (copy > have) copy = have; - if (copy) { - if (state->flags & 0x0200) - state->check = crc32(state->check, next, copy); - have -= copy; - next += copy; - state->length -= copy; - } - if (state->length) goto inf_leave; - } - state->mode = NAME; - case NAME: - if (state->flags & 0x0800) { - if (have == 0) goto inf_leave; - copy = 0; - do { - len = (unsigned)(next[copy++]); - } while (len && copy < have); - if (state->flags & 0x02000) - state->check = crc32(state->check, next, copy); - have -= copy; - next += copy; - if (len) goto inf_leave; - } - state->mode = COMMENT; - case COMMENT: - if (state->flags & 0x1000) { - if (have == 0) goto inf_leave; - copy = 0; - do { - len = (unsigned)(next[copy++]); - } while (len && copy < have); - if (state->flags & 0x02000) - state->check = crc32(state->check, next, copy); - have -= copy; - next += copy; - if (len) goto inf_leave; - } - state->mode = HCRC; - case HCRC: - if (state->flags & 0x0200) { - NEEDBITS(16); - if (hold != (state->check & 0xffff)) { - strm->msg = (char *)"header crc mismatch"; - state->mode = BAD; - break; - } - INITBITS(); - } - strm->adler = state->check = crc32(0L, Z_NULL, 0); - state->mode = TYPE; - break; -#endif - case DICTID: - NEEDBITS(32); - strm->adler = state->check = REVERSE(hold); - INITBITS(); - state->mode = DICT; - case DICT: - if (state->havedict == 0) { - RESTORE(); - return Z_NEED_DICT; - } - strm->adler = state->check = adler32(0L, Z_NULL, 0); - state->mode = TYPE; - case TYPE: - if (flush == Z_BLOCK) goto inf_leave; - case TYPEDO: - if (state->last) { - BYTEBITS(); - state->mode = CHECK; - break; - } - NEEDBITS(3); - state->last = BITS(1); - DROPBITS(1); - switch (BITS(2)) { - case 0: /* stored block */ - Tracev((stderr, "inflate: stored block%s\n", - state->last ? " (last)" : "")); - state->mode = STORED; - break; - case 1: /* fixed block */ - fixedtables(state); - Tracev((stderr, "inflate: fixed codes block%s\n", - state->last ? " (last)" : "")); - state->mode = LEN; /* decode codes */ - break; - case 2: /* dynamic block */ - Tracev((stderr, "inflate: dynamic codes block%s\n", - state->last ? " (last)" : "")); - state->mode = TABLE; - break; - case 3: - strm->msg = (char *)"invalid block type"; - state->mode = BAD; - } - DROPBITS(2); - break; - case STORED: - BYTEBITS(); /* go to byte boundary */ - NEEDBITS(32); - if ((hold & 0xffff) != ((hold >> 16) ^ 0xffff)) { - strm->msg = (char *)"invalid stored block lengths"; - state->mode = BAD; - break; - } - state->length = (unsigned)hold & 0xffff; - Tracev((stderr, "inflate: stored length %u\n", - state->length)); - INITBITS(); - state->mode = COPY; - case COPY: - copy = state->length; - if (copy) { - if (copy > have) copy = have; - if (copy > left) copy = left; - if (copy == 0) goto inf_leave; - zmemcpy(put, next, copy); - have -= copy; - next += copy; - left -= copy; - put += copy; - state->length -= copy; - break; - } - Tracev((stderr, "inflate: stored end\n")); - state->mode = TYPE; - break; - case TABLE: - NEEDBITS(14); - state->nlen = BITS(5) + 257; - DROPBITS(5); - state->ndist = BITS(5) + 1; - DROPBITS(5); - state->ncode = BITS(4) + 4; - DROPBITS(4); -#ifndef PKZIP_BUG_WORKAROUND - if (state->nlen > 286 || state->ndist > 30) { - strm->msg = (char *)"too many length or distance symbols"; - state->mode = BAD; - break; - } -#endif - Tracev((stderr, "inflate: table sizes ok\n")); - state->have = 0; - state->mode = LENLENS; - case LENLENS: - while (state->have < state->ncode) { - NEEDBITS(3); - state->lens[order[state->have++]] = (unsigned short)BITS(3); - DROPBITS(3); - } - while (state->have < 19) - state->lens[order[state->have++]] = 0; - state->next = state->codes; - state->lencode = (code const FAR *)(state->next); - state->lenbits = 7; - ret = inflate_table(CODES, state->lens, 19, &(state->next), - &(state->lenbits), state->work); - if (ret) { - strm->msg = (char *)"invalid code lengths set"; - state->mode = BAD; - break; - } - Tracev((stderr, "inflate: code lengths ok\n")); - state->have = 0; - state->mode = CODELENS; - case CODELENS: - while (state->have < state->nlen + state->ndist) { - for (;;) { - this = state->lencode[BITS(state->lenbits)]; - if ((unsigned)(this.bits) <= bits) break; - PULLBYTE(); - } - if (this.val < 16) { - NEEDBITS(this.bits); - DROPBITS(this.bits); - state->lens[state->have++] = this.val; - } - else { - if (this.val == 16) { - NEEDBITS(this.bits + 2); - DROPBITS(this.bits); - if (state->have == 0) { - strm->msg = (char *)"invalid bit length repeat"; - state->mode = BAD; - break; - } - len = state->lens[state->have - 1]; - copy = 3 + BITS(2); - DROPBITS(2); - } - else if (this.val == 17) { - NEEDBITS(this.bits + 3); - DROPBITS(this.bits); - len = 0; - copy = 3 + BITS(3); - DROPBITS(3); - } - else { - NEEDBITS(this.bits + 7); - DROPBITS(this.bits); - len = 0; - copy = 11 + BITS(7); - DROPBITS(7); - } - if (state->have + copy > state->nlen + state->ndist) { - strm->msg = (char *)"invalid bit length repeat"; - state->mode = BAD; - break; - } - while (copy--) - state->lens[state->have++] = (unsigned short)len; - } - } - - /* handle error breaks in while */ - if (state->mode == BAD) break; - - /* build code tables */ - state->next = state->codes; - state->lencode = (code const FAR *)(state->next); - state->lenbits = 9; - ret = inflate_table(LENS, state->lens, state->nlen, &(state->next), - &(state->lenbits), state->work); - if (ret) { - strm->msg = (char *)"invalid literal/lengths set"; - state->mode = BAD; - break; - } - state->distcode = (code const FAR *)(state->next); - state->distbits = 6; - ret = inflate_table(DISTS, state->lens + state->nlen, state->ndist, - &(state->next), &(state->distbits), state->work); - if (ret) { - strm->msg = (char *)"invalid distances set"; - state->mode = BAD; - break; - } - Tracev((stderr, "inflate: codes ok\n")); - state->mode = LEN; - case LEN: - if (have >= 6 && left >= 258) { - RESTORE(); - inflate_fast(strm, out); - LOAD(); - break; - } - for (;;) { - this = state->lencode[BITS(state->lenbits)]; - if ((unsigned)(this.bits) <= bits) break; - PULLBYTE(); - } - if (this.op && (this.op & 0xf0) == 0) { - last = this; - for (;;) { - this = state->lencode[last.val + - (BITS(last.bits + last.op) >> last.bits)]; - if ((unsigned)(last.bits + this.bits) <= bits) break; - PULLBYTE(); - } - DROPBITS(last.bits); - } - DROPBITS(this.bits); - state->length = (unsigned)this.val; - if ((int)(this.op) == 0) { - Tracevv((stderr, this.val >= 0x20 && this.val < 0x7f ? - "inflate: literal '%c'\n" : - "inflate: literal 0x%02x\n", this.val)); - state->mode = LIT; - break; - } - if (this.op & 32) { - Tracevv((stderr, "inflate: end of block\n")); - state->mode = TYPE; - break; - } - if (this.op & 64) { - strm->msg = (char *)"invalid literal/length code"; - state->mode = BAD; - break; - } - state->extra = (unsigned)(this.op) & 15; - state->mode = LENEXT; - case LENEXT: - if (state->extra) { - NEEDBITS(state->extra); - state->length += BITS(state->extra); - DROPBITS(state->extra); - } - Tracevv((stderr, "inflate: length %u\n", state->length)); - state->mode = DIST; - case DIST: - for (;;) { - this = state->distcode[BITS(state->distbits)]; - if ((unsigned)(this.bits) <= bits) break; - PULLBYTE(); - } - if ((this.op & 0xf0) == 0) { - last = this; - for (;;) { - this = state->distcode[last.val + - (BITS(last.bits + last.op) >> last.bits)]; - if ((unsigned)(last.bits + this.bits) <= bits) break; - PULLBYTE(); - } - DROPBITS(last.bits); - } - DROPBITS(this.bits); - if (this.op & 64) { - strm->msg = (char *)"invalid distance code"; - state->mode = BAD; - break; - } - state->offset = (unsigned)this.val; - state->extra = (unsigned)(this.op) & 15; - state->mode = DISTEXT; - case DISTEXT: - if (state->extra) { - NEEDBITS(state->extra); - state->offset += BITS(state->extra); - DROPBITS(state->extra); - } - if (state->offset > state->whave + out - left) { - strm->msg = (char *)"invalid distance too far back"; - state->mode = BAD; - break; - } - Tracevv((stderr, "inflate: distance %u\n", state->offset)); - state->mode = MATCH; - case MATCH: - if (left == 0) goto inf_leave; - copy = out - left; - if (state->offset > copy) { /* copy from window */ - copy = state->offset - copy; - if (copy > state->write) { - copy -= state->write; - from = state->window + (state->wsize - copy); - } - else - from = state->window + (state->write - copy); - if (copy > state->length) copy = state->length; - } - else { /* copy from output */ - from = put - state->offset; - copy = state->length; - } - if (copy > left) copy = left; - left -= copy; - state->length -= copy; - do { - *put++ = *from++; - } while (--copy); - if (state->length == 0) state->mode = LEN; - break; - case LIT: - if (left == 0) goto inf_leave; - *put++ = (unsigned char)(state->length); - left--; - state->mode = LEN; - break; - case CHECK: - if (state->wrap) { - NEEDBITS(32); - out -= left; - strm->total_out += out; - state->total += out; - if (out) - strm->adler = state->check = - UPDATE(state->check, put - out, out); - out = left; - if (( -#ifdef GUNZIP - state->flags ? hold : -#endif - REVERSE(hold)) != state->check) { - strm->msg = (char *)"incorrect data check"; - state->mode = BAD; - break; - } - INITBITS(); - Tracev((stderr, "inflate: check matches trailer\n")); - } -#ifdef GUNZIP - state->mode = LENGTH; - case LENGTH: - if (state->wrap && state->flags) { - NEEDBITS(32); - if (hold != (state->total & 0xffffffffUL)) { - strm->msg = (char *)"incorrect length check"; - state->mode = BAD; - break; - } - INITBITS(); - Tracev((stderr, "inflate: length matches trailer\n")); - } -#endif - state->mode = DONE; - case DONE: - ret = Z_STREAM_END; - goto inf_leave; - case BAD: - ret = Z_DATA_ERROR; - goto inf_leave; - case MEM: - return Z_MEM_ERROR; - case SYNC: - default: - return Z_STREAM_ERROR; - } - - /* - Return from inflate(), updating the total counts and the check value. - If there was no progress during the inflate() call, return a buffer - error. Call updatewindow() to create and/or update the window state. - Note: a memory error from inflate() is non-recoverable. - */ - inf_leave: - RESTORE(); - if (state->wsize || (state->mode < CHECK && out != strm->avail_out)) - if (updatewindow(strm, out)) { - state->mode = MEM; - return Z_MEM_ERROR; - } - in -= strm->avail_in; - out -= strm->avail_out; - strm->total_in += in; - strm->total_out += out; - state->total += out; - if (state->wrap && out) - strm->adler = state->check = - UPDATE(state->check, strm->next_out - out, out); - strm->data_type = state->bits + (state->last ? 64 : 0) + - (state->mode == TYPE ? 128 : 0); - if (((in == 0 && out == 0) || flush == Z_FINISH) && ret == Z_OK) - ret = Z_BUF_ERROR; - return ret; -} - -int ZEXPORT inflateEnd(strm) -z_streamp strm; -{ - struct inflate_state FAR *state; - if (strm == Z_NULL || strm->state == Z_NULL || strm->zfree == (free_func)0) - return Z_STREAM_ERROR; - state = (struct inflate_state FAR *)strm->state; - if (state->window != Z_NULL) ZFREE(strm, state->window); - ZFREE(strm, strm->state); - strm->state = Z_NULL; - Tracev((stderr, "inflate: end\n")); - return Z_OK; -} - -int ZEXPORT inflateSetDictionary(strm, dictionary, dictLength) -z_streamp strm; -const Bytef *dictionary; -uInt dictLength; -{ - struct inflate_state FAR *state; - unsigned long id; - - /* check state */ - if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR; - state = (struct inflate_state FAR *)strm->state; - if (state->mode != DICT) return Z_STREAM_ERROR; - - /* check for correct dictionary id */ - id = adler32(0L, Z_NULL, 0); - id = adler32(id, dictionary, dictLength); - if (id != state->check) return Z_DATA_ERROR; - - /* copy dictionary to window */ - if (updatewindow(strm, strm->avail_out)) { - state->mode = MEM; - return Z_MEM_ERROR; - } - if (dictLength > state->wsize) { - zmemcpy(state->window, dictionary + dictLength - state->wsize, - state->wsize); - state->whave = state->wsize; - } - else { - zmemcpy(state->window + state->wsize - dictLength, dictionary, - dictLength); - state->whave = dictLength; - } - state->havedict = 1; - Tracev((stderr, "inflate: dictionary set\n")); - return Z_OK; -} - -/* - Search buf[0..len-1] for the pattern: 0, 0, 0xff, 0xff. Return when found - or when out of input. When called, *have is the number of pattern bytes - found in order so far, in 0..3. On return *have is updated to the new - state. If on return *have equals four, then the pattern was found and the - return value is how many bytes were read including the last byte of the - pattern. If *have is less than four, then the pattern has not been found - yet and the return value is len. In the latter case, syncsearch() can be - called again with more data and the *have state. *have is initialized to - zero for the first call. - */ -local unsigned syncsearch(have, buf, len) -unsigned FAR *have; -unsigned char FAR *buf; -unsigned len; -{ - unsigned got; - unsigned next; - - got = *have; - next = 0; - while (next < len && got < 4) { - if ((int)(buf[next]) == (got < 2 ? 0 : 0xff)) - got++; - else if (buf[next]) - got = 0; - else - got = 4 - got; - next++; - } - *have = got; - return next; -} - -int ZEXPORT inflateSync(strm) -z_streamp strm; -{ - unsigned len; /* number of bytes to look at or looked at */ - unsigned long in, out; /* temporary to save total_in and total_out */ - unsigned char buf[4]; /* to restore bit buffer to byte string */ - struct inflate_state FAR *state; - - /* check parameters */ - if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR; - state = (struct inflate_state FAR *)strm->state; - if (strm->avail_in == 0 && state->bits < 8) return Z_BUF_ERROR; - - /* if first time, start search in bit buffer */ - if (state->mode != SYNC) { - state->mode = SYNC; - state->hold <<= state->bits & 7; - state->bits -= state->bits & 7; - len = 0; - while (state->bits >= 8) { - buf[len++] = (unsigned char)(state->hold); - state->hold >>= 8; - state->bits -= 8; - } - state->have = 0; - syncsearch(&(state->have), buf, len); - } - - /* search available input */ - len = syncsearch(&(state->have), strm->next_in, strm->avail_in); - strm->avail_in -= len; - strm->next_in += len; - strm->total_in += len; - - /* return no joy or set up to restart inflate() on a new block */ - if (state->have != 4) return Z_DATA_ERROR; - in = strm->total_in; out = strm->total_out; - inflateReset(strm); - strm->total_in = in; strm->total_out = out; - state->mode = TYPE; - return Z_OK; -} - -/* - Returns true if inflate is currently at the end of a block generated by - Z_SYNC_FLUSH or Z_FULL_FLUSH. This function is used by one PPP - implementation to provide an additional safety check. PPP uses - Z_SYNC_FLUSH but removes the length bytes of the resulting empty stored - block. When decompressing, PPP checks that at the end of input packet, - inflate is waiting for these length bytes. - */ -int ZEXPORT inflateSyncPoint(strm) -z_streamp strm; -{ - struct inflate_state FAR *state; - - if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR; - state = (struct inflate_state FAR *)strm->state; - return state->mode == STORED && state->bits == 0; -} - -int ZEXPORT inflateCopy(dest, source) -z_streamp dest; -z_streamp source; -{ - struct inflate_state FAR *state; - struct inflate_state FAR *copy; - unsigned char FAR *window; - - /* check input */ - if (dest == Z_NULL || source == Z_NULL || source->state == Z_NULL || - source->zalloc == (alloc_func)0 || source->zfree == (free_func)0) - return Z_STREAM_ERROR; - state = (struct inflate_state FAR *)source->state; - - /* allocate space */ - copy = (struct inflate_state FAR *) - ZALLOC(source, 1, sizeof(struct inflate_state)); - if (copy == Z_NULL) return Z_MEM_ERROR; - window = Z_NULL; - if (state->window != Z_NULL) { - window = (unsigned char FAR *) - ZALLOC(source, 1U << state->wbits, sizeof(unsigned char)); - if (window == Z_NULL) { - ZFREE(source, copy); - return Z_MEM_ERROR; - } - } - - /* copy state */ - *dest = *source; - *copy = *state; - copy->lencode = copy->codes + (state->lencode - state->codes); - copy->distcode = copy->codes + (state->distcode - state->codes); - copy->next = copy->codes + (state->next - state->codes); - if (window != Z_NULL) - zmemcpy(window, state->window, 1U << state->wbits); - copy->window = window; - dest->state = (voidpf)copy; - return Z_OK; -} diff --git a/data/nsis/Contrib/nsisunz/zlib/INFTREES.C b/data/nsis/Contrib/nsisunz/zlib/INFTREES.C deleted file mode 100644 index 8a896b287..000000000 --- a/data/nsis/Contrib/nsisunz/zlib/INFTREES.C +++ /dev/null @@ -1,328 +0,0 @@ -/* inftrees.c -- generate Huffman trees for efficient decoding - * Copyright (C) 1995-2004 Mark Adler - * For conditions of distribution and use, see copyright notice in zlib.h - */ - -#include "zutil.h" -#include "inftrees.h" - -#define MAXBITS 15 - -const char inflate_copyright[] = - " inflate 1.2.2 Copyright 1995-2004 Mark Adler "; -/* - If you use the zlib library in a product, an acknowledgment is welcome - in the documentation of your product. If for some reason you cannot - include such an acknowledgment, I would appreciate that you keep this - copyright string in the executable of your product. - */ - -/* - Build a set of tables to decode the provided canonical Huffman code. - The code lengths are lens[0..codes-1]. The result starts at *table, - whose indices are 0..2^bits-1. work is a writable array of at least - lens shorts, which is used as a work area. type is the type of code - to be generated, CODES, LENS, or DISTS. On return, zero is success, - -1 is an invalid code, and +1 means that ENOUGH isn't enough. table - on return points to the next available entry's address. bits is the - requested root table index bits, and on return it is the actual root - table index bits. It will differ if the request is greater than the - longest code or if it is less than the shortest code. - */ -int inflate_table(type, lens, codes, table, bits, work) -codetype type; -unsigned short FAR *lens; -unsigned codes; -code FAR * FAR *table; -unsigned FAR *bits; -unsigned short FAR *work; -{ - unsigned len; /* a code's length in bits */ - unsigned sym; /* index of code symbols */ - unsigned min, max; /* minimum and maximum code lengths */ - unsigned root; /* number of index bits for root table */ - unsigned curr; /* number of index bits for current table */ - unsigned drop; /* code bits to drop for sub-table */ - int left; /* number of prefix codes available */ - unsigned used; /* code entries in table used */ - unsigned huff; /* Huffman code */ - unsigned incr; /* for incrementing code, index */ - unsigned fill; /* index for replicating entries */ - unsigned low; /* low bits for current root entry */ - unsigned mask; /* mask for low root bits */ - code this; /* table entry for duplication */ - code FAR *next; /* next available space in table */ - const unsigned short FAR *base; /* base value table to use */ - const unsigned short FAR *extra; /* extra bits table to use */ - int end; /* use base and extra for symbol > end */ - unsigned short count[MAXBITS+1]; /* number of codes of each length */ - unsigned short offs[MAXBITS+1]; /* offsets in table for each length */ - static const unsigned short lbase[31] = { /* Length codes 257..285 base */ - 3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 15, 17, 19, 23, 27, 31, - 35, 43, 51, 59, 67, 83, 99, 115, 131, 163, 195, 227, 258, 0, 0}; - static const unsigned short lext[31] = { /* Length codes 257..285 extra */ - 16, 16, 16, 16, 16, 16, 16, 16, 17, 17, 17, 17, 18, 18, 18, 18, - 19, 19, 19, 19, 20, 20, 20, 20, 21, 21, 21, 21, 16, 199, 198}; - static const unsigned short dbase[32] = { /* Distance codes 0..29 base */ - 1, 2, 3, 4, 5, 7, 9, 13, 17, 25, 33, 49, 65, 97, 129, 193, - 257, 385, 513, 769, 1025, 1537, 2049, 3073, 4097, 6145, - 8193, 12289, 16385, 24577, 0, 0}; - static const unsigned short dext[32] = { /* Distance codes 0..29 extra */ - 16, 16, 16, 16, 17, 17, 18, 18, 19, 19, 20, 20, 21, 21, 22, 22, - 23, 23, 24, 24, 25, 25, 26, 26, 27, 27, - 28, 28, 29, 29, 64, 64}; - - /* - Process a set of code lengths to create a canonical Huffman code. The - code lengths are lens[0..codes-1]. Each length corresponds to the - symbols 0..codes-1. The Huffman code is generated by first sorting the - symbols by length from short to long, and retaining the symbol order - for codes with equal lengths. Then the code starts with all zero bits - for the first code of the shortest length, and the codes are integer - increments for the same length, and zeros are appended as the length - increases. For the deflate format, these bits are stored backwards - from their more natural integer increment ordering, and so when the - decoding tables are built in the large loop below, the integer codes - are incremented backwards. - - This routine assumes, but does not check, that all of the entries in - lens[] are in the range 0..MAXBITS. The caller must assure this. - 1..MAXBITS is interpreted as that code length. zero means that that - symbol does not occur in this code. - - The codes are sorted by computing a count of codes for each length, - creating from that a table of starting indices for each length in the - sorted table, and then entering the symbols in order in the sorted - table. The sorted table is work[], with that space being provided by - the caller. - - The length counts are used for other purposes as well, i.e. finding - the minimum and maximum length codes, determining if there are any - codes at all, checking for a valid set of lengths, and looking ahead - at length counts to determine sub-table sizes when building the - decoding tables. - */ - - /* accumulate lengths for codes (assumes lens[] all in 0..MAXBITS) */ - for (len = 0; len <= MAXBITS; len++) - count[len] = 0; - for (sym = 0; sym < codes; sym++) - count[lens[sym]]++; - - /* bound code lengths, force root to be within code lengths */ - root = *bits; - for (max = MAXBITS; max >= 1; max--) - if (count[max] != 0) break; - if (root > max) root = max; - if (max == 0) { /* no symbols to code at all */ - this.op = (unsigned char)64; /* invalid code marker */ - this.bits = (unsigned char)1; - this.val = (unsigned short)0; - *(*table)++ = this; /* make a table to force an error */ - *(*table)++ = this; - *bits = 1; - return 0; /* no symbols, but wait for decoding to report error */ - } - for (min = 1; min <= MAXBITS; min++) - if (count[min] != 0) break; - if (root < min) root = min; - - /* check for an over-subscribed or incomplete set of lengths */ - left = 1; - for (len = 1; len <= MAXBITS; len++) { - left <<= 1; - left -= count[len]; - if (left < 0) return -1; /* over-subscribed */ - } - if (left > 0 && (type == CODES || (codes - count[0] != 1))) - return -1; /* incomplete set */ - - /* generate offsets into symbol table for each length for sorting */ - offs[1] = 0; - for (len = 1; len < MAXBITS; len++) - offs[len + 1] = offs[len] + count[len]; - - /* sort symbols by length, by symbol order within each length */ - for (sym = 0; sym < codes; sym++) - if (lens[sym] != 0) work[offs[lens[sym]]++] = (unsigned short)sym; - - /* - Create and fill in decoding tables. In this loop, the table being - filled is at next and has curr index bits. The code being used is huff - with length len. That code is converted to an index by dropping drop - bits off of the bottom. For codes where len is less than drop + curr, - those top drop + curr - len bits are incremented through all values to - fill the table with replicated entries. - - root is the number of index bits for the root table. When len exceeds - root, sub-tables are created pointed to by the root entry with an index - of the low root bits of huff. This is saved in low to check for when a - new sub-table should be started. drop is zero when the root table is - being filled, and drop is root when sub-tables are being filled. - - When a new sub-table is needed, it is necessary to look ahead in the - code lengths to determine what size sub-table is needed. The length - counts are used for this, and so count[] is decremented as codes are - entered in the tables. - - used keeps track of how many table entries have been allocated from the - provided *table space. It is checked when a LENS table is being made - against the space in *table, ENOUGH, minus the maximum space needed by - the worst case distance code, MAXD. This should never happen, but the - sufficiency of ENOUGH has not been proven exhaustively, hence the check. - This assumes that when type == LENS, bits == 9. - - sym increments through all symbols, and the loop terminates when - all codes of length max, i.e. all codes, have been processed. This - routine permits incomplete codes, so another loop after this one fills - in the rest of the decoding tables with invalid code markers. - */ - - /* set up for code type */ - switch (type) { - case CODES: - base = extra = work; /* dummy value--not used */ - end = 19; - break; - case LENS: - base = lbase; - base -= 257; - extra = lext; - extra -= 257; - end = 256; - break; - default: /* DISTS */ - base = dbase; - extra = dext; - end = -1; - } - - /* initialize state for loop */ - huff = 0; /* starting code */ - sym = 0; /* starting code symbol */ - len = min; /* starting code length */ - next = *table; /* current table to fill in */ - curr = root; /* current table index bits */ - drop = 0; /* current bits to drop from code for index */ - low = (unsigned)(-1); /* trigger new sub-table when len > root */ - used = 1U << root; /* use root table entries */ - mask = used - 1; /* mask for comparing low */ - - /* check available table space */ - if (type == LENS && used >= ENOUGH - MAXD) - return 1; - - /* process all codes and make table entries */ - for (;;) { - /* create table entry */ - this.bits = (unsigned char)(len - drop); - if ((int)(work[sym]) < end) { - this.op = (unsigned char)0; - this.val = work[sym]; - } - else if ((int)(work[sym]) > end) { - this.op = (unsigned char)(extra[work[sym]]); - this.val = base[work[sym]]; - } - else { - this.op = (unsigned char)(32 + 64); /* end of block */ - this.val = 0; - } - - /* replicate for those indices with low len bits equal to huff */ - incr = 1U << (len - drop); - fill = 1U << curr; - do { - fill -= incr; - next[(huff >> drop) + fill] = this; - } while (fill != 0); - - /* backwards increment the len-bit code huff */ - incr = 1U << (len - 1); - while (huff & incr) - incr >>= 1; - if (incr != 0) { - huff &= incr - 1; - huff += incr; - } - else - huff = 0; - - /* go to next symbol, update count, len */ - sym++; - if (--(count[len]) == 0) { - if (len == max) break; - len = lens[work[sym]]; - } - - /* create new sub-table if needed */ - if (len > root && (huff & mask) != low) { - /* if first time, transition to sub-tables */ - if (drop == 0) - drop = root; - - /* increment past last table */ - next += 1U << curr; - - /* determine length of next table */ - curr = len - drop; - left = (int)(1 << curr); - while (curr + drop < max) { - left -= count[curr + drop]; - if (left <= 0) break; - curr++; - left <<= 1; - } - - /* check for enough space */ - used += 1U << curr; - if (type == LENS && used >= ENOUGH - MAXD) - return 1; - - /* point entry in root table to sub-table */ - low = huff & mask; - (*table)[low].op = (unsigned char)curr; - (*table)[low].bits = (unsigned char)root; - (*table)[low].val = (unsigned short)(next - *table); - } - } - - /* - Fill in rest of table for incomplete codes. This loop is similar to the - loop above in incrementing huff for table indices. It is assumed that - len is equal to curr + drop, so there is no loop needed to increment - through high index bits. When the current sub-table is filled, the loop - drops back to the root table to fill in any remaining entries there. - */ - this.op = (unsigned char)64; /* invalid code marker */ - this.bits = (unsigned char)(len - drop); - this.val = (unsigned short)0; - while (huff != 0) { - /* when done with sub-table, drop back to root table */ - if (drop != 0 && (huff & mask) != low) { - drop = 0; - len = root; - next = *table; - this.bits = (unsigned char)len; - } - - /* put invalid code marker in table */ - next[huff >> drop] = this; - - /* backwards increment the len-bit code huff */ - incr = 1U << (len - 1); - while (huff & incr) - incr >>= 1; - if (incr != 0) { - huff &= incr - 1; - huff += incr; - } - else - huff = 0; - } - - /* set return parameters */ - *table += used; - *bits = root; - return 0; -} diff --git a/data/nsis/Contrib/nsisunz/zlib/INFTREES.H b/data/nsis/Contrib/nsisunz/zlib/INFTREES.H deleted file mode 100644 index 82d365a7e..000000000 --- a/data/nsis/Contrib/nsisunz/zlib/INFTREES.H +++ /dev/null @@ -1,55 +0,0 @@ -/* inftrees.h -- header to use inftrees.c - * Copyright (C) 1995-2003 Mark Adler - * For conditions of distribution and use, see copyright notice in zlib.h - */ - -/* WARNING: this file should *not* be used by applications. It is - part of the implementation of the compression library and is - subject to change. Applications should only use zlib.h. - */ - -/* Structure for decoding tables. Each entry provides either the - information needed to do the operation requested by the code that - indexed that table entry, or it provides a pointer to another - table that indexes more bits of the code. op indicates whether - the entry is a pointer to another table, a literal, a length or - distance, an end-of-block, or an invalid code. For a table - pointer, the low four bits of op is the number of index bits of - that table. For a length or distance, the low four bits of op - is the number of extra bits to get after the code. bits is - the number of bits in this code or part of the code to drop off - of the bit buffer. val is the actual byte to output in the case - of a literal, the base length or distance, or the offset from - the current table to the next table. Each entry is four bytes. */ -typedef struct { - unsigned char op; /* operation, extra bits, table bits */ - unsigned char bits; /* bits in this part of the code */ - unsigned short val; /* offset in table or code value */ -} code; - -/* op values as set by inflate_table(): - 00000000 - literal - 0000tttt - table link, tttt != 0 is the number of table index bits - 0001eeee - length or distance, eeee is the number of extra bits - 01100000 - end of block - 01000000 - invalid code - */ - -/* Maximum size of dynamic tree. The maximum found in a long but non- - exhaustive search was 1004 code structures (850 for length/literals - and 154 for distances, the latter actually the result of an - exhaustive search). The true maximum is not known, but the value - below is more than safe. */ -#define ENOUGH 1440 -#define MAXD 154 - -/* Type of code to build for inftable() */ -typedef enum { - CODES, - LENS, - DISTS -} codetype; - -extern int inflate_table OF((codetype type, unsigned short FAR *lens, - unsigned codes, code FAR * FAR *table, - unsigned FAR *bits, unsigned short FAR *work)); diff --git a/data/nsis/Contrib/nsisunz/zlib/README b/data/nsis/Contrib/nsisunz/zlib/README deleted file mode 100644 index df95ae13f..000000000 --- a/data/nsis/Contrib/nsisunz/zlib/README +++ /dev/null @@ -1,126 +0,0 @@ -ZLIB DATA COMPRESSION LIBRARY - -zlib 1.2.2 is a general purpose data compression library. All the code is -thread safe. The data format used by the zlib library is described by RFCs -(Request for Comments) 1950 to 1952 in the files -http://www.ietf.org/rfc/rfc1950.txt (zlib format), rfc1951.txt (deflate format) -and rfc1952.txt (gzip format). These documents are also available in other -formats from ftp://ftp.uu.net/graphics/png/documents/zlib/zdoc-index.html - -All functions of the compression library are documented in the file zlib.h -(volunteer to write man pages welcome, contact zlib@gzip.org). A usage example -of the library is given in the file example.c which also tests that the library -is working correctly. Another example is given in the file minigzip.c. The -compression library itself is composed of all source files except example.c and -minigzip.c. - -To compile all files and run the test program, follow the instructions given at -the top of Makefile. In short "make test; make install" should work for most -machines. For Unix: "./configure; make test; make install" For MSDOS, use one -of the special makefiles such as Makefile.msc. For VMS, use Make_vms.com or -descrip.mms. - -Questions about zlib should be sent to , or to Gilles Vollant - for the Windows DLL version. The zlib home page is -http://www.zlib.org or http://www.gzip.org/zlib/ Before reporting a problem, -please check this site to verify that you have the latest version of zlib; -otherwise get the latest version and check whether the problem still exists or -not. - -PLEASE read the zlib FAQ http://www.gzip.org/zlib/zlib_faq.html before asking -for help. - -Mark Nelson wrote an article about zlib for the Jan. 1997 -issue of Dr. Dobb's Journal; a copy of the article is available in -http://dogma.net/markn/articles/zlibtool/zlibtool.htm - -The changes made in version 1.2.2 are documented in the file ChangeLog. - -Unsupported third party contributions are provided in directory "contrib". - -A Java implementation of zlib is available in the Java Development Kit -http://java.sun.com/j2se/1.4.2/docs/api/java/util/zip/package-summary.html -See the zlib home page http://www.zlib.org for details. - -A Perl interface to zlib written by Paul Marquess is in the -CPAN (Comprehensive Perl Archive Network) sites -http://www.cpan.org/modules/by-module/Compress/ - -A Python interface to zlib written by A.M. Kuchling is -available in Python 1.5 and later versions, see -http://www.python.org/doc/lib/module-zlib.html - -A zlib binding for TCL written by Andreas Kupries is -availlable at http://www.oche.de/~akupries/soft/trf/trf_zip.html - -An experimental package to read and write files in .zip format, written on top -of zlib by Gilles Vollant , is available in the -contrib/minizip directory of zlib. - - -Notes for some targets: - -- For Windows DLL versions, please see win32/DLL_FAQ.txt - -- For 64-bit Irix, deflate.c must be compiled without any optimization. With - -O, one libpng test fails. The test works in 32 bit mode (with the -n32 - compiler flag). The compiler bug has been reported to SGI. - -- zlib doesn't work with gcc 2.6.3 on a DEC 3000/300LX under OSF/1 2.1 it works - when compiled with cc. - -- On Digital Unix 4.0D (formely OSF/1) on AlphaServer, the cc option -std1 is - necessary to get gzprintf working correctly. This is done by configure. - -- zlib doesn't work on HP-UX 9.05 with some versions of /bin/cc. It works with - other compilers. Use "make test" to check your compiler. - -- gzdopen is not supported on RISCOS, BEOS and by some Mac compilers. - -- For PalmOs, see http://palmzlib.sourceforge.net/ - -- When building a shared, i.e. dynamic library on Mac OS X, the library must be - installed before testing (do "make install" before "make test"), since the - library location is specified in the library. - - -Acknowledgments: - - The deflate format used by zlib was defined by Phil Katz. The deflate - and zlib specifications were written by L. Peter Deutsch. Thanks to all the - people who reported problems and suggested various improvements in zlib; - they are too numerous to cite here. - -Copyright notice: - - (C) 1995-2004 Jean-loup Gailly and Mark Adler - - This software is provided 'as-is', without any express or implied - warranty. In no event will the authors be held liable for any damages - arising from the use of this software. - - Permission is granted to anyone to use this software for any purpose, - including commercial applications, and to alter it and redistribute it - freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - 3. This notice may not be removed or altered from any source distribution. - - Jean-loup Gailly Mark Adler - jloup@gzip.org madler@alumni.caltech.edu - -If you use the zlib library in a product, we would appreciate *not* -receiving lengthy legal documents to sign. The sources are provided -for free but without warranty of any kind. The library has been -entirely written by Jean-loup Gailly and Mark Adler; it does not -include third-party code. - -If you redistribute modified sources, we would appreciate that you include -in the file ChangeLog history information documenting your changes. Please -read the FAQ for more information on the distribution of modified source -versions. diff --git a/data/nsis/Contrib/nsisunz/zlib/UNZIP.H b/data/nsis/Contrib/nsisunz/zlib/UNZIP.H deleted file mode 100644 index 76692cb70..000000000 --- a/data/nsis/Contrib/nsisunz/zlib/UNZIP.H +++ /dev/null @@ -1,275 +0,0 @@ -/* unzip.h -- IO for uncompress .zip files using zlib - Version 0.15 beta, Mar 19th, 1998, - - Copyright (C) 1998 Gilles Vollant - - This unzip package allow extract file from .ZIP file, compatible with PKZip 2.04g - WinZip, InfoZip tools and compatible. - Encryption and multi volume ZipFile (span) are not supported. - Old compressions used by old PKZip 1.x are not supported - - THIS IS AN ALPHA VERSION. AT THIS STAGE OF DEVELOPPEMENT, SOMES API OR STRUCTURE - CAN CHANGE IN FUTURE VERSION !! - I WAIT FEEDBACK at mail info@winimage.com - Visit also http://www.winimage.com/zLibDll/unzip.htm for evolution - - Condition of use and distribution are the same than zlib : - - This software is provided 'as-is', without any express or implied - warranty. In no event will the authors be held liable for any damages - arising from the use of this software. - - Permission is granted to anyone to use this software for any purpose, - including commercial applications, and to alter it and redistribute it - freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - 3. This notice may not be removed or altered from any source distribution. - - -*/ -/* for more info about .ZIP format, see - ftp://ftp.cdrom.com/pub/infozip/doc/appnote-970311-iz.zip - PkWare has also a specification at : - ftp://ftp.pkware.com/probdesc.zip */ - -#ifndef _unz_H -#define _unz_H - -#ifdef __cplusplus -extern "C" { -#endif - -#ifndef _ZLIB_H -#include "zlib.h" -#endif - -#if defined(STRICTUNZIP) || defined(STRICTZIPUNZIP) -/* like the STRICT of WIN32, we define a pointer that cannot be converted - from (void*) without cast */ -typedef struct TagunzFile__ { int unused; } unzFile__; -typedef unzFile__ *unzFile; -#else -typedef voidp unzFile; -#endif - - -#define UNZ_OK (0) -#define UNZ_END_OF_LIST_OF_FILE (-100) -#define UNZ_ERRNO (Z_ERRNO) -#define UNZ_EOF (0) -#define UNZ_PARAMERROR (-102) -#define UNZ_BADZIPFILE (-103) -#define UNZ_INTERNALERROR (-104) -#define UNZ_CRCERROR (-105) - -/* tm_unz contain date/time info */ -typedef struct tm_unz_s -{ - uInt tm_sec; /* seconds after the minute - [0,59] */ - uInt tm_min; /* minutes after the hour - [0,59] */ - uInt tm_hour; /* hours since midnight - [0,23] */ - uInt tm_mday; /* day of the month - [1,31] */ - uInt tm_mon; /* months since January - [0,11] */ - uInt tm_year; /* years - [1980..2044] */ -} tm_unz; - -/* unz_global_info structure contain global data about the ZIPfile - These data comes from the end of central dir */ -typedef struct unz_global_info_s -{ - uLong number_entry; /* total number of entries in - the central dir on this disk */ - uLong size_comment; /* size of the global comment of the zipfile */ -} unz_global_info; - - -/* unz_file_info contain information about a file in the zipfile */ -typedef struct unz_file_info_s -{ - uLong version; /* version made by 2 bytes */ - uLong version_needed; /* version needed to extract 2 bytes */ - uLong flag; /* general purpose bit flag 2 bytes */ - uLong compression_method; /* compression method 2 bytes */ - uLong dosDate; /* last mod file date in Dos fmt 4 bytes */ - uLong crc; /* crc-32 4 bytes */ - uLong compressed_size; /* compressed size 4 bytes */ - uLong uncompressed_size; /* uncompressed size 4 bytes */ - uLong size_filename; /* filename length 2 bytes */ - uLong size_file_extra; /* extra field length 2 bytes */ - uLong size_file_comment; /* file comment length 2 bytes */ - - uLong disk_num_start; /* disk number start 2 bytes */ - uLong internal_fa; /* internal file attributes 2 bytes */ - uLong external_fa; /* external file attributes 4 bytes */ - - tm_unz tmu_date; -} unz_file_info; - -extern int ZEXPORT unzStringFileNameCompare OF ((const char* fileName1, - const char* fileName2, - int iCaseSensitivity)); -/* - Compare two filename (fileName1,fileName2). - If iCaseSenisivity = 1, comparision is case sensitivity (like strcmp) - If iCaseSenisivity = 2, comparision is not case sensitivity (like strcmpi - or strcasecmp) - If iCaseSenisivity = 0, case sensitivity is defaut of your operating system - (like 1 on Unix, 2 on Windows) -*/ - - -extern unzFile ZEXPORT unzOpen OF((const char *path)); -/* - Open a Zip file. path contain the full pathname (by example, - on a Windows NT computer "c:\\zlib\\zlib111.zip" or on an Unix computer - "zlib/zlib111.zip". - If the zipfile cannot be opened (file don't exist or in not valid), the - return value is NULL. - Else, the return value is a unzFile Handle, usable with other function - of this unzip package. -*/ - -extern int ZEXPORT unzClose OF((unzFile file)); -/* - Close a ZipFile opened with unzipOpen. - If there is files inside the .Zip opened with unzOpenCurrentFile (see later), - these files MUST be closed with unzipCloseCurrentFile before call unzipClose. - return UNZ_OK if there is no problem. */ - -extern int ZEXPORT unzGetGlobalInfo OF((unzFile file, - unz_global_info *pglobal_info)); -/* - Write info about the ZipFile in the *pglobal_info structure. - No preparation of the structure is needed - return UNZ_OK if there is no problem. */ - - -extern int ZEXPORT unzGetGlobalComment OF((unzFile file, - char *szComment, - uLong uSizeBuf)); -/* - Get the global comment string of the ZipFile, in the szComment buffer. - uSizeBuf is the size of the szComment buffer. - return the number of byte copied or an error code <0 -*/ - - -/***************************************************************************/ -/* Unzip package allow you browse the directory of the zipfile */ - -extern int ZEXPORT unzGoToFirstFile OF((unzFile file)); -/* - Set the current file of the zipfile to the first file. - return UNZ_OK if there is no problem -*/ - -extern int ZEXPORT unzGoToNextFile OF((unzFile file)); -/* - Set the current file of the zipfile to the next file. - return UNZ_OK if there is no problem - return UNZ_END_OF_LIST_OF_FILE if the actual file was the latest. -*/ - -extern int ZEXPORT unzLocateFile OF((unzFile file, - const char *szFileName, - int iCaseSensitivity)); -/* - Try locate the file szFileName in the zipfile. - For the iCaseSensitivity signification, see unzStringFileNameCompare - - return value : - UNZ_OK if the file is found. It becomes the current file. - UNZ_END_OF_LIST_OF_FILE if the file is not found -*/ - - -extern int ZEXPORT unzGetCurrentFileInfo OF((unzFile file, - unz_file_info *pfile_info, - char *szFileName, - uLong fileNameBufferSize, - void *extraField, - uLong extraFieldBufferSize, - char *szComment, - uLong commentBufferSize)); -/* - Get Info about the current file - if pfile_info!=NULL, the *pfile_info structure will contain somes info about - the current file - if szFileName!=NULL, the filemane string will be copied in szFileName - (fileNameBufferSize is the size of the buffer) - if extraField!=NULL, the extra field information will be copied in extraField - (extraFieldBufferSize is the size of the buffer). - This is the Central-header version of the extra field - if szComment!=NULL, the comment string of the file will be copied in szComment - (commentBufferSize is the size of the buffer) -*/ - -/***************************************************************************/ -/* for reading the content of the current zipfile, you can open it, read data - from it, and close it (you can close it before reading all the file) - */ - -extern int ZEXPORT unzOpenCurrentFile OF((unzFile file)); -/* - Open for reading data the current file in the zipfile. - If there is no error, the return value is UNZ_OK. -*/ - -extern int ZEXPORT unzCloseCurrentFile OF((unzFile file)); -/* - Close the file in zip opened with unzOpenCurrentFile - Return UNZ_CRCERROR if all the file was read but the CRC is not good -*/ - - -extern int ZEXPORT unzReadCurrentFile OF((unzFile file, - voidp buf, - unsigned len)); -/* - Read bytes from the current file (opened by unzOpenCurrentFile) - buf contain buffer where data must be copied - len the size of buf. - - return the number of byte copied if somes bytes are copied - return 0 if the end of file was reached - return <0 with error code if there is an error - (UNZ_ERRNO for IO error, or zLib error for uncompress error) -*/ - -extern z_off_t ZEXPORT unztell OF((unzFile file)); -/* - Give the current position in uncompressed data -*/ - -extern int ZEXPORT unzeof OF((unzFile file)); -/* - return 1 if the end of file was reached, 0 elsewhere -*/ - -extern int ZEXPORT unzGetLocalExtrafield OF((unzFile file, - voidp buf, - unsigned len)); -/* - Read extra field from the current file (opened by unzOpenCurrentFile) - This is the local-header version of the extra field (sometimes, there is - more info in the local-header version than in the central-header) - - if buf==NULL, it return the size of the local extra field - - if buf!=NULL, len is the size of the buffer, the extra header is copied in - buf. - the return value is the number of bytes copied in buf, or (if <0) - the error code -*/ - -#ifdef __cplusplus -} -#endif - -#endif /* _unz_H */ diff --git a/data/nsis/Contrib/nsisunz/zlib/Unzip.c b/data/nsis/Contrib/nsisunz/zlib/Unzip.c deleted file mode 100644 index 20e41c230..000000000 --- a/data/nsis/Contrib/nsisunz/zlib/Unzip.c +++ /dev/null @@ -1,1297 +0,0 @@ -/* unzip.c -- IO on .zip files using zlib - Version 0.15 beta, Mar 19th, 1998, - - Read unzip.h for more info -*/ -#include - - -//#include -//#include -//#include -#include "../miniclib.h" - -#include "zlib.h" -#include "unzip.h" - -//#ifdef STDC -//# include -//# include -//# include -//#endif -//#ifdef NO_ERRNO_H -// extern int errno; -//#else -//# include -//#endif - - -#ifndef local -# define local static -#endif -/* compile with -Dlocal if your debugger can't find static symbols */ - - - -#if !defined(unix) && !defined(CASESENSITIVITYDEFAULT_YES) && \ - !defined(CASESENSITIVITYDEFAULT_NO) -#define CASESENSITIVITYDEFAULT_NO -#endif - - -#ifndef UNZ_BUFSIZE -#define UNZ_BUFSIZE (16384) -#endif - -#ifndef UNZ_MAXFILENAMEINZIP -#define UNZ_MAXFILENAMEINZIP (256) -#endif - -#ifndef ALLOC -# define ALLOC(size) (GlobalAlloc(GMEM_FIXED,size)) -#endif -#ifndef TRYFREE -# define TRYFREE(p) {if (p) GlobalFree(p);} -#endif - -#define SIZECENTRALDIRITEM (0x2e) -#define SIZEZIPLOCALHEADER (0x1e) - - -/* I've found an old Unix (a SunOS 4.1.3_U1) without all SEEK_* defined.... */ - -#ifndef SEEK_CUR -#define SEEK_CUR 1 -#endif - -#ifndef SEEK_END -#define SEEK_END 2 -#endif - -#ifndef SEEK_SET -#define SEEK_SET 0 -#endif - -const char unz_copyright[] = - " unzip 0.15 Copyright 1998 Gilles Vollant "; - -/* unz_file_info_interntal contain internal info about a file in zipfile*/ -typedef struct unz_file_info_internal_s -{ - uLong offset_curfile;/* relative offset of local header 4 bytes */ -} unz_file_info_internal; - - -/* file_in_zip_read_info_s contain internal information about a file in zipfile, - when reading and decompress it */ -typedef struct -{ - char *read_buffer; /* internal buffer for compressed data */ - z_stream stream; /* zLib stream structure for inflate */ - - uLong pos_in_zipfile; /* position in byte on the zipfile, for fseek*/ - uLong stream_initialised; /* flag set if stream structure is initialised*/ - - uLong offset_local_extrafield;/* offset of the local extra field */ - uInt size_local_extrafield;/* size of the local extra field */ - uLong pos_local_extrafield; /* position in the local extra field in read*/ - - uLong crc32; /* crc32 of all data uncompressed */ - uLong crc32_wait; /* crc32 we must obtain after decompress all */ - uLong rest_read_compressed; /* number of byte to be decompressed */ - uLong rest_read_uncompressed;/*number of byte to be obtained after decomp*/ - FILE* file; /* io structore of the zipfile */ - uLong compression_method; /* compression method (0==store) */ - uLong byte_before_the_zipfile;/* byte before the zipfile, (>0 for sfx)*/ -} file_in_zip_read_info_s; - - -/* unz_s contain internal information about the zipfile -*/ -typedef struct -{ - FILE* file; /* io structore of the zipfile */ - unz_global_info gi; /* public global information */ - uLong byte_before_the_zipfile;/* byte before the zipfile, (>0 for sfx)*/ - uLong num_file; /* number of the current file in the zipfile*/ - uLong pos_in_central_dir; /* pos of the current file in the central dir*/ - uLong current_file_ok; /* flag about the usability of the current file*/ - uLong central_pos; /* position of the beginning of the central dir*/ - - uLong size_central_dir; /* size of the central directory */ - uLong offset_central_dir; /* offset of start of central directory with - respect to the starting disk number */ - - unz_file_info cur_file_info; /* public info about the current file in zip*/ - unz_file_info_internal cur_file_info_internal; /* private info about it*/ - file_in_zip_read_info_s* pfile_in_zip_read; /* structure about the current - file if we are decompressing it */ -} unz_s; - - -/* =========================================================================== - Read a byte from a gz_stream; update next_in and avail_in. Return EOF - for end of file. - IN assertion: the stream s has been sucessfully opened for reading. -*/ - - -local int unzlocal_getByte(fin,pi) - FILE *fin; - int *pi; -{ - unsigned char c; - int err = fread(&c, 1, 1, fin); - if (err==1) - { - *pi = (int)c; - return UNZ_OK; - } - else - { - if (ferror(fin)) - return UNZ_ERRNO; - else - return UNZ_EOF; - } -} - - -/* =========================================================================== - Reads a long in LSB order from the given gz_stream. Sets -*/ -local int unzlocal_getShort (fin,pX) - FILE* fin; - uLong *pX; -{ - uLong x ; - int i; - int err; - - err = unzlocal_getByte(fin,&i); - x = (uLong)i; - - if (err==UNZ_OK) - err = unzlocal_getByte(fin,&i); - x += ((uLong)i)<<8; - - if (err==UNZ_OK) - *pX = x; - else - *pX = 0; - return err; -} - -local int unzlocal_getLong (fin,pX) - FILE* fin; - uLong *pX; -{ - uLong x ; - int i; - int err; - - err = unzlocal_getByte(fin,&i); - x = (uLong)i; - - if (err==UNZ_OK) - err = unzlocal_getByte(fin,&i); - x += ((uLong)i)<<8; - - if (err==UNZ_OK) - err = unzlocal_getByte(fin,&i); - x += ((uLong)i)<<16; - - if (err==UNZ_OK) - err = unzlocal_getByte(fin,&i); - x += ((uLong)i)<<24; - - if (err==UNZ_OK) - *pX = x; - else - *pX = 0; - return err; -} - - -/* My own strcmpi / strcasecmp */ -local int strcmpcasenosensitive_internal (fileName1,fileName2) - const char* fileName1; - const char* fileName2; -{ - for (;;) - { - char c1=*(fileName1++); - char c2=*(fileName2++); - if ((c1>='a') && (c1<='z')) - c1 -= 0x20; - if ((c2>='a') && (c2<='z')) - c2 -= 0x20; - if (c1=='\0') - return ((c2=='\0') ? 0 : -1); - if (c2=='\0') - return 1; - if (c1c2) - return 1; - } -} - - -#ifdef CASESENSITIVITYDEFAULT_NO -#define CASESENSITIVITYDEFAULTVALUE 2 -#else -#define CASESENSITIVITYDEFAULTVALUE 1 -#endif - -#ifndef STRCMPCASENOSENTIVEFUNCTION -#define STRCMPCASENOSENTIVEFUNCTION strcmpcasenosensitive_internal -#endif - -/* - Compare two filename (fileName1,fileName2). - If iCaseSenisivity = 1, comparision is case sensitivity (like strcmp) - If iCaseSenisivity = 2, comparision is not case sensitivity (like strcmpi - or strcasecmp) - If iCaseSenisivity = 0, case sensitivity is defaut of your operating system - (like 1 on Unix, 2 on Windows) - -*/ -extern int ZEXPORT unzStringFileNameCompare (fileName1,fileName2,iCaseSensitivity) - const char* fileName1; - const char* fileName2; - int iCaseSensitivity; -{ - if (iCaseSensitivity==0) - iCaseSensitivity=CASESENSITIVITYDEFAULTVALUE; - - if (iCaseSensitivity==1) - return strcmp(fileName1,fileName2); - - return STRCMPCASENOSENTIVEFUNCTION(fileName1,fileName2); -} - -#define BUFREADCOMMENT (0x400) - -/* - Locate the Central directory of a zipfile (at the end, just before - the global comment) -*/ -local uLong unzlocal_SearchCentralDir(fin) - FILE *fin; -{ - unsigned char* buf; - uLong uSizeFile; - uLong uBackRead; - uLong uMaxBack=0xffff; /* maximum size of global comment */ - uLong uPosFound=0; - - if (fseek(fin,0,SEEK_END) != 0) - return 0; - - - uSizeFile = ftell( fin ); - - if (uMaxBack>uSizeFile) - uMaxBack = uSizeFile; - - buf = (unsigned char*)ALLOC(BUFREADCOMMENT+4); - if (buf==NULL) - return 0; - - uBackRead = 4; - while (uBackReaduMaxBack) - uBackRead = uMaxBack; - else - uBackRead+=BUFREADCOMMENT; - uReadPos = uSizeFile-uBackRead ; - - uReadSize = ((BUFREADCOMMENT+4) < (uSizeFile-uReadPos)) ? - (BUFREADCOMMENT+4) : (uSizeFile-uReadPos); - if (fseek(fin,uReadPos,SEEK_SET)!=0) - break; - - if (fread(buf,(uInt)uReadSize,1,fin)!=1) - break; - - for (i=(int)uReadSize-3; (i--)>0;) - if (((*(buf+i))==0x50) && ((*(buf+i+1))==0x4b) && - ((*(buf+i+2))==0x05) && ((*(buf+i+3))==0x06)) - { - uPosFound = uReadPos+i; - break; - } - - if (uPosFound!=0) - break; - } - TRYFREE(buf); - return uPosFound; -} - -/* - Open a Zip file. path contain the full pathname (by example, - on a Windows NT computer "c:\\test\\zlib109.zip" or on an Unix computer - "zlib/zlib109.zip". - If the zipfile cannot be opened (file don't exist or in not valid), the - return value is NULL. - Else, the return value is a unzFile Handle, usable with other function - of this unzip package. -*/ -extern unzFile ZEXPORT unzOpen (path) - const char *path; -{ - unz_s us; - unz_s *s; - uLong central_pos,uL; - FILE * fin ; - - uLong number_disk; /* number of the current dist, used for - spaning ZIP, unsupported, always 0*/ - uLong number_disk_with_CD; /* number the the disk with central dir, used - for spaning ZIP, unsupported, always 0*/ - uLong number_entry_CD; /* total number of entries in - the central dir - (same than number_entry on nospan) */ - - int err=UNZ_OK; - - if (unz_copyright[0]!=' ') - return NULL; - - fin=fopen(path,"rb"); - if (fin==NULL) - return NULL; - - central_pos = unzlocal_SearchCentralDir(fin); - if (central_pos==0) - err=UNZ_ERRNO; - - if (fseek(fin,central_pos,SEEK_SET)!=0) - err=UNZ_ERRNO; - - /* the signature, already checked */ - if (unzlocal_getLong(fin,&uL)!=UNZ_OK) - err=UNZ_ERRNO; - - /* number of this disk */ - if (unzlocal_getShort(fin,&number_disk)!=UNZ_OK) - err=UNZ_ERRNO; - - /* number of the disk with the start of the central directory */ - if (unzlocal_getShort(fin,&number_disk_with_CD)!=UNZ_OK) - err=UNZ_ERRNO; - - /* total number of entries in the central dir on this disk */ - if (unzlocal_getShort(fin,&us.gi.number_entry)!=UNZ_OK) - err=UNZ_ERRNO; - - /* total number of entries in the central dir */ - if (unzlocal_getShort(fin,&number_entry_CD)!=UNZ_OK) - err=UNZ_ERRNO; - - if ((number_entry_CD!=us.gi.number_entry) || - (number_disk_with_CD!=0) || - (number_disk!=0)) - err=UNZ_BADZIPFILE; - - /* size of the central directory */ - if (unzlocal_getLong(fin,&us.size_central_dir)!=UNZ_OK) - err=UNZ_ERRNO; - - /* offset of start of central directory with respect to the - starting disk number */ - if (unzlocal_getLong(fin,&us.offset_central_dir)!=UNZ_OK) - err=UNZ_ERRNO; - - /* zipfile comment length */ - if (unzlocal_getShort(fin,&us.gi.size_comment)!=UNZ_OK) - err=UNZ_ERRNO; - - if ((central_pospfile_in_zip_read!=NULL) - unzCloseCurrentFile(file); - - fclose(s->file); - TRYFREE(s); - return UNZ_OK; -} - - -/* - Write info about the ZipFile in the *pglobal_info structure. - No preparation of the structure is needed - return UNZ_OK if there is no problem. */ -extern int ZEXPORT unzGetGlobalInfo (file,pglobal_info) - unzFile file; - unz_global_info *pglobal_info; -{ - unz_s* s; - if (file==NULL) - return UNZ_PARAMERROR; - s=(unz_s*)file; - *pglobal_info=s->gi; - return UNZ_OK; -} - - -/* - Translate date/time from Dos format to tm_unz (readable more easilty) -*/ -local void unzlocal_DosDateToTmuDate (ulDosDate, ptm) - uLong ulDosDate; - tm_unz* ptm; -{ - uLong uDate; - uDate = (uLong)(ulDosDate>>16); - ptm->tm_mday = (uInt)(uDate&0x1f) ; - ptm->tm_mon = (uInt)((((uDate)&0x1E0)/0x20)-1) ; - ptm->tm_year = (uInt)(((uDate&0x0FE00)/0x0200)+1980) ; - - ptm->tm_hour = (uInt) ((ulDosDate &0xF800)/0x800); - ptm->tm_min = (uInt) ((ulDosDate&0x7E0)/0x20) ; - ptm->tm_sec = (uInt) (2*(ulDosDate&0x1f)) ; -} - -/* - Get Info about the current file in the zipfile, with internal only info -*/ -local int unzlocal_GetCurrentFileInfoInternal OF((unzFile file, - unz_file_info *pfile_info, - unz_file_info_internal - *pfile_info_internal, - char *szFileName, - uLong fileNameBufferSize, - void *extraField, - uLong extraFieldBufferSize, - char *szComment, - uLong commentBufferSize)); - -local int unzlocal_GetCurrentFileInfoInternal (file, - pfile_info, - pfile_info_internal, - szFileName, fileNameBufferSize, - extraField, extraFieldBufferSize, - szComment, commentBufferSize) - unzFile file; - unz_file_info *pfile_info; - unz_file_info_internal *pfile_info_internal; - char *szFileName; - uLong fileNameBufferSize; - void *extraField; - uLong extraFieldBufferSize; - char *szComment; - uLong commentBufferSize; -{ - unz_s* s; - unz_file_info file_info; - unz_file_info_internal file_info_internal; - int err=UNZ_OK; - uLong uMagic; - long lSeek=0; - - if (file==NULL) - return UNZ_PARAMERROR; - s=(unz_s*)file; - if (fseek(s->file,s->pos_in_central_dir+s->byte_before_the_zipfile,SEEK_SET)!=0) - err=UNZ_ERRNO; - - - /* we check the magic */ - if (err==UNZ_OK) - if (unzlocal_getLong(s->file,&uMagic) != UNZ_OK) - err=UNZ_ERRNO; - else if (uMagic!=0x02014b50) - err=UNZ_BADZIPFILE; - - if (unzlocal_getShort(s->file,&file_info.version) != UNZ_OK) - err=UNZ_ERRNO; - - if (unzlocal_getShort(s->file,&file_info.version_needed) != UNZ_OK) - err=UNZ_ERRNO; - - if (unzlocal_getShort(s->file,&file_info.flag) != UNZ_OK) - err=UNZ_ERRNO; - - if (unzlocal_getShort(s->file,&file_info.compression_method) != UNZ_OK) - err=UNZ_ERRNO; - - if (unzlocal_getLong(s->file,&file_info.dosDate) != UNZ_OK) - err=UNZ_ERRNO; - - unzlocal_DosDateToTmuDate(file_info.dosDate,&file_info.tmu_date); - - if (unzlocal_getLong(s->file,&file_info.crc) != UNZ_OK) - err=UNZ_ERRNO; - - if (unzlocal_getLong(s->file,&file_info.compressed_size) != UNZ_OK) - err=UNZ_ERRNO; - - if (unzlocal_getLong(s->file,&file_info.uncompressed_size) != UNZ_OK) - err=UNZ_ERRNO; - - if (unzlocal_getShort(s->file,&file_info.size_filename) != UNZ_OK) - err=UNZ_ERRNO; - - if (unzlocal_getShort(s->file,&file_info.size_file_extra) != UNZ_OK) - err=UNZ_ERRNO; - - if (unzlocal_getShort(s->file,&file_info.size_file_comment) != UNZ_OK) - err=UNZ_ERRNO; - - if (unzlocal_getShort(s->file,&file_info.disk_num_start) != UNZ_OK) - err=UNZ_ERRNO; - - if (unzlocal_getShort(s->file,&file_info.internal_fa) != UNZ_OK) - err=UNZ_ERRNO; - - if (unzlocal_getLong(s->file,&file_info.external_fa) != UNZ_OK) - err=UNZ_ERRNO; - - if (unzlocal_getLong(s->file,&file_info_internal.offset_curfile) != UNZ_OK) - err=UNZ_ERRNO; - - lSeek+=file_info.size_filename; - if ((err==UNZ_OK) && (szFileName!=NULL)) - { - uLong uSizeRead ; - if (file_info.size_filename0) && (fileNameBufferSize>0)) - if (fread(szFileName,(uInt)uSizeRead,1,s->file)!=1) - err=UNZ_ERRNO; - lSeek -= uSizeRead; - } - - - if ((err==UNZ_OK) && (extraField!=NULL)) - { - uLong uSizeRead ; - if (file_info.size_file_extrafile,lSeek,SEEK_CUR)==0) - lSeek=0; - else - err=UNZ_ERRNO; - if ((file_info.size_file_extra>0) && (extraFieldBufferSize>0)) - if (fread(extraField,(uInt)uSizeRead,1,s->file)!=1) - err=UNZ_ERRNO; - lSeek += file_info.size_file_extra - uSizeRead; - } - else - lSeek+=file_info.size_file_extra; - - - if ((err==UNZ_OK) && (szComment!=NULL)) - { - uLong uSizeRead ; - if (file_info.size_file_commentfile,lSeek,SEEK_CUR)==0) - lSeek=0; - else - err=UNZ_ERRNO; - if ((file_info.size_file_comment>0) && (commentBufferSize>0)) - if (fread(szComment,(uInt)uSizeRead,1,s->file)!=1) - err=UNZ_ERRNO; - lSeek+=file_info.size_file_comment - uSizeRead; - } - else - lSeek+=file_info.size_file_comment; - - if ((err==UNZ_OK) && (pfile_info!=NULL)) - *pfile_info=file_info; - - if ((err==UNZ_OK) && (pfile_info_internal!=NULL)) - *pfile_info_internal=file_info_internal; - - return err; -} - - - -/* - Write info about the ZipFile in the *pglobal_info structure. - No preparation of the structure is needed - return UNZ_OK if there is no problem. -*/ -extern int ZEXPORT unzGetCurrentFileInfo (file, - pfile_info, - szFileName, fileNameBufferSize, - extraField, extraFieldBufferSize, - szComment, commentBufferSize) - unzFile file; - unz_file_info *pfile_info; - char *szFileName; - uLong fileNameBufferSize; - void *extraField; - uLong extraFieldBufferSize; - char *szComment; - uLong commentBufferSize; -{ - return unzlocal_GetCurrentFileInfoInternal(file,pfile_info,NULL, - szFileName,fileNameBufferSize, - extraField,extraFieldBufferSize, - szComment,commentBufferSize); -} - -/* - Set the current file of the zipfile to the first file. - return UNZ_OK if there is no problem -*/ -extern int ZEXPORT unzGoToFirstFile (file) - unzFile file; -{ - int err=UNZ_OK; - unz_s* s; - if (file==NULL) - return UNZ_PARAMERROR; - s=(unz_s*)file; - s->pos_in_central_dir=s->offset_central_dir; - s->num_file=0; - err=unzlocal_GetCurrentFileInfoInternal(file,&s->cur_file_info, - &s->cur_file_info_internal, - NULL,0,NULL,0,NULL,0); - s->current_file_ok = (err == UNZ_OK); - return err; -} - - -/* - Set the current file of the zipfile to the next file. - return UNZ_OK if there is no problem - return UNZ_END_OF_LIST_OF_FILE if the actual file was the latest. -*/ -extern int ZEXPORT unzGoToNextFile (file) - unzFile file; -{ - unz_s* s; - int err; - - if (file==NULL) - return UNZ_PARAMERROR; - s=(unz_s*)file; - if (!s->current_file_ok) - return UNZ_END_OF_LIST_OF_FILE; - if (s->num_file+1==s->gi.number_entry) - return UNZ_END_OF_LIST_OF_FILE; - - s->pos_in_central_dir += SIZECENTRALDIRITEM + s->cur_file_info.size_filename + - s->cur_file_info.size_file_extra + s->cur_file_info.size_file_comment ; - s->num_file++; - err = unzlocal_GetCurrentFileInfoInternal(file,&s->cur_file_info, - &s->cur_file_info_internal, - NULL,0,NULL,0,NULL,0); - s->current_file_ok = (err == UNZ_OK); - return err; -} - - -/* - Try locate the file szFileName in the zipfile. - For the iCaseSensitivity signification, see unzipStringFileNameCompare - - return value : - UNZ_OK if the file is found. It becomes the current file. - UNZ_END_OF_LIST_OF_FILE if the file is not found -*/ -extern int ZEXPORT unzLocateFile (file, szFileName, iCaseSensitivity) - unzFile file; - const char *szFileName; - int iCaseSensitivity; -{ - unz_s* s; - int err; - - - uLong num_fileSaved; - uLong pos_in_central_dirSaved; - - - if (file==NULL) - return UNZ_PARAMERROR; - - if (strlen(szFileName)>=UNZ_MAXFILENAMEINZIP) - return UNZ_PARAMERROR; - - s=(unz_s*)file; - if (!s->current_file_ok) - return UNZ_END_OF_LIST_OF_FILE; - - num_fileSaved = s->num_file; - pos_in_central_dirSaved = s->pos_in_central_dir; - - err = unzGoToFirstFile(file); - - while (err == UNZ_OK) - { - char szCurrentFileName[UNZ_MAXFILENAMEINZIP+1]; - unzGetCurrentFileInfo(file,NULL, - szCurrentFileName,sizeof(szCurrentFileName)-1, - NULL,0,NULL,0); - if (unzStringFileNameCompare(szCurrentFileName, - szFileName,iCaseSensitivity)==0) - return UNZ_OK; - err = unzGoToNextFile(file); - } - - s->num_file = num_fileSaved ; - s->pos_in_central_dir = pos_in_central_dirSaved ; - return err; -} - - -/* - Read the local header of the current zipfile - Check the coherency of the local header and info in the end of central - directory about this file - store in *piSizeVar the size of extra info in local header - (filename and size of extra field data) -*/ -local int unzlocal_CheckCurrentFileCoherencyHeader (s,piSizeVar, - poffset_local_extrafield, - psize_local_extrafield) - unz_s* s; - uInt* piSizeVar; - uLong *poffset_local_extrafield; - uInt *psize_local_extrafield; -{ - uLong uMagic,uData,uFlags; - uLong size_filename; - uLong size_extra_field; - int err=UNZ_OK; - - *piSizeVar = 0; - *poffset_local_extrafield = 0; - *psize_local_extrafield = 0; - - if (fseek(s->file,s->cur_file_info_internal.offset_curfile + - s->byte_before_the_zipfile,SEEK_SET)!=0) - return UNZ_ERRNO; - - - if (err==UNZ_OK) - if (unzlocal_getLong(s->file,&uMagic) != UNZ_OK) - err=UNZ_ERRNO; - else if (uMagic!=0x04034b50) - err=UNZ_BADZIPFILE; - - if (unzlocal_getShort(s->file,&uData) != UNZ_OK) - err=UNZ_ERRNO; -/* - else if ((err==UNZ_OK) && (uData!=s->cur_file_info.wVersion)) - err=UNZ_BADZIPFILE; -*/ - if (unzlocal_getShort(s->file,&uFlags) != UNZ_OK) - err=UNZ_ERRNO; - - if (unzlocal_getShort(s->file,&uData) != UNZ_OK) - err=UNZ_ERRNO; - else if ((err==UNZ_OK) && (uData!=s->cur_file_info.compression_method)) - err=UNZ_BADZIPFILE; - - if ((err==UNZ_OK) && (s->cur_file_info.compression_method!=0) && - (s->cur_file_info.compression_method!=Z_DEFLATED)) - err=UNZ_BADZIPFILE; - - if (unzlocal_getLong(s->file,&uData) != UNZ_OK) /* date/time */ - err=UNZ_ERRNO; - - if (unzlocal_getLong(s->file,&uData) != UNZ_OK) /* crc */ - err=UNZ_ERRNO; - else if ((err==UNZ_OK) && (uData!=s->cur_file_info.crc) && - ((uFlags & 8)==0)) - err=UNZ_BADZIPFILE; - - if (unzlocal_getLong(s->file,&uData) != UNZ_OK) /* size compr */ - err=UNZ_ERRNO; - else if ((err==UNZ_OK) && (uData!=s->cur_file_info.compressed_size) && - ((uFlags & 8)==0)) - err=UNZ_BADZIPFILE; - - if (unzlocal_getLong(s->file,&uData) != UNZ_OK) /* size uncompr */ - err=UNZ_ERRNO; - else if ((err==UNZ_OK) && (uData!=s->cur_file_info.uncompressed_size) && - ((uFlags & 8)==0)) - err=UNZ_BADZIPFILE; - - - if (unzlocal_getShort(s->file,&size_filename) != UNZ_OK) - err=UNZ_ERRNO; - else if ((err==UNZ_OK) && (size_filename!=s->cur_file_info.size_filename)) - err=UNZ_BADZIPFILE; - - *piSizeVar += (uInt)size_filename; - - if (unzlocal_getShort(s->file,&size_extra_field) != UNZ_OK) - err=UNZ_ERRNO; - *poffset_local_extrafield= s->cur_file_info_internal.offset_curfile + - SIZEZIPLOCALHEADER + size_filename; - *psize_local_extrafield = (uInt)size_extra_field; - - *piSizeVar += (uInt)size_extra_field; - - return err; -} - -/* - Open for reading data the current file in the zipfile. - If there is no error and the file is opened, the return value is UNZ_OK. -*/ -extern int ZEXPORT unzOpenCurrentFile (file) - unzFile file; -{ - int err=UNZ_OK; - int Store; - uInt iSizeVar; - unz_s* s; - file_in_zip_read_info_s* pfile_in_zip_read_info; - uLong offset_local_extrafield; /* offset of the local extra field */ - uInt size_local_extrafield; /* size of the local extra field */ - - if (file==NULL) - return UNZ_PARAMERROR; - s=(unz_s*)file; - if (!s->current_file_ok) - return UNZ_PARAMERROR; - - if (s->pfile_in_zip_read != NULL) - unzCloseCurrentFile(file); - - if (unzlocal_CheckCurrentFileCoherencyHeader(s,&iSizeVar, - &offset_local_extrafield,&size_local_extrafield)!=UNZ_OK) - return UNZ_BADZIPFILE; - - pfile_in_zip_read_info = (file_in_zip_read_info_s*) - ALLOC(sizeof(file_in_zip_read_info_s)); - if (pfile_in_zip_read_info==NULL) - return UNZ_INTERNALERROR; - - pfile_in_zip_read_info->read_buffer=(char*)ALLOC(UNZ_BUFSIZE); - pfile_in_zip_read_info->offset_local_extrafield = offset_local_extrafield; - pfile_in_zip_read_info->size_local_extrafield = size_local_extrafield; - pfile_in_zip_read_info->pos_local_extrafield=0; - - if (pfile_in_zip_read_info->read_buffer==NULL) - { - TRYFREE(pfile_in_zip_read_info); - return UNZ_INTERNALERROR; - } - - pfile_in_zip_read_info->stream_initialised=0; - - if ((s->cur_file_info.compression_method!=0) && - (s->cur_file_info.compression_method!=Z_DEFLATED)) - err=UNZ_BADZIPFILE; - Store = s->cur_file_info.compression_method==0; - - pfile_in_zip_read_info->crc32_wait=s->cur_file_info.crc; - pfile_in_zip_read_info->crc32=0; - pfile_in_zip_read_info->compression_method = - s->cur_file_info.compression_method; - pfile_in_zip_read_info->file=s->file; - pfile_in_zip_read_info->byte_before_the_zipfile=s->byte_before_the_zipfile; - - pfile_in_zip_read_info->stream.total_out = 0; - - if (!Store) - { - pfile_in_zip_read_info->stream.zalloc = (alloc_func)0; - pfile_in_zip_read_info->stream.zfree = (free_func)0; - pfile_in_zip_read_info->stream.opaque = (voidpf)0; - - err=inflateInit2(&pfile_in_zip_read_info->stream, -MAX_WBITS); - if (err == Z_OK) - pfile_in_zip_read_info->stream_initialised=1; - /* windowBits is passed < 0 to tell that there is no zlib header. - * Note that in this case inflate *requires* an extra "dummy" byte - * after the compressed stream in order to complete decompression and - * return Z_STREAM_END. - * In unzip, i don't wait absolutely Z_STREAM_END because I known the - * size of both compressed and uncompressed data - */ - } - pfile_in_zip_read_info->rest_read_compressed = - s->cur_file_info.compressed_size ; - pfile_in_zip_read_info->rest_read_uncompressed = - s->cur_file_info.uncompressed_size ; - - - pfile_in_zip_read_info->pos_in_zipfile = - s->cur_file_info_internal.offset_curfile + SIZEZIPLOCALHEADER + - iSizeVar; - - pfile_in_zip_read_info->stream.avail_in = (uInt)0; - - - s->pfile_in_zip_read = pfile_in_zip_read_info; - return UNZ_OK; -} - - -/* - Read bytes from the current file. - buf contain buffer where data must be copied - len the size of buf. - - return the number of byte copied if somes bytes are copied - return 0 if the end of file was reached - return <0 with error code if there is an error - (UNZ_ERRNO for IO error, or zLib error for uncompress error) -*/ -extern int ZEXPORT unzReadCurrentFile (file, buf, len) - unzFile file; - voidp buf; - unsigned len; -{ - int err=UNZ_OK; - uInt iRead = 0; - unz_s* s; - file_in_zip_read_info_s* pfile_in_zip_read_info; - if (file==NULL) - return UNZ_PARAMERROR; - s=(unz_s*)file; - pfile_in_zip_read_info=s->pfile_in_zip_read; - - if (pfile_in_zip_read_info==NULL) - return UNZ_PARAMERROR; - - - if ((pfile_in_zip_read_info->read_buffer == NULL)) - return UNZ_END_OF_LIST_OF_FILE; - if (len==0) - return 0; - - pfile_in_zip_read_info->stream.next_out = (Bytef*)buf; - - pfile_in_zip_read_info->stream.avail_out = (uInt)len; - - if (len>pfile_in_zip_read_info->rest_read_uncompressed) - pfile_in_zip_read_info->stream.avail_out = - (uInt)pfile_in_zip_read_info->rest_read_uncompressed; - - while (pfile_in_zip_read_info->stream.avail_out>0) - { - if ((pfile_in_zip_read_info->stream.avail_in==0) && - (pfile_in_zip_read_info->rest_read_compressed>0)) - { - uInt uReadThis = UNZ_BUFSIZE; - if (pfile_in_zip_read_info->rest_read_compressedrest_read_compressed; - if (uReadThis == 0) - return UNZ_EOF; - if (fseek(pfile_in_zip_read_info->file, - pfile_in_zip_read_info->pos_in_zipfile + - pfile_in_zip_read_info->byte_before_the_zipfile,SEEK_SET)!=0) - return UNZ_ERRNO; - if (fread(pfile_in_zip_read_info->read_buffer,uReadThis,1, - pfile_in_zip_read_info->file)!=1) - return UNZ_ERRNO; - pfile_in_zip_read_info->pos_in_zipfile += uReadThis; - - pfile_in_zip_read_info->rest_read_compressed-=uReadThis; - - pfile_in_zip_read_info->stream.next_in = - (Bytef*)pfile_in_zip_read_info->read_buffer; - pfile_in_zip_read_info->stream.avail_in = (uInt)uReadThis; - } - - if (pfile_in_zip_read_info->compression_method==0) - { - uInt uDoCopy,i ; - if (pfile_in_zip_read_info->stream.avail_out < - pfile_in_zip_read_info->stream.avail_in) - uDoCopy = pfile_in_zip_read_info->stream.avail_out ; - else - uDoCopy = pfile_in_zip_read_info->stream.avail_in ; - - for (i=0;istream.next_out+i) = - *(pfile_in_zip_read_info->stream.next_in+i); - - pfile_in_zip_read_info->crc32 = crc32(pfile_in_zip_read_info->crc32, - pfile_in_zip_read_info->stream.next_out, - uDoCopy); - pfile_in_zip_read_info->rest_read_uncompressed-=uDoCopy; - pfile_in_zip_read_info->stream.avail_in -= uDoCopy; - pfile_in_zip_read_info->stream.avail_out -= uDoCopy; - pfile_in_zip_read_info->stream.next_out += uDoCopy; - pfile_in_zip_read_info->stream.next_in += uDoCopy; - pfile_in_zip_read_info->stream.total_out += uDoCopy; - iRead += uDoCopy; - } - else - { - uLong uTotalOutBefore,uTotalOutAfter; - const Bytef *bufBefore; - uLong uOutThis; - int flush=Z_SYNC_FLUSH; - - uTotalOutBefore = pfile_in_zip_read_info->stream.total_out; - bufBefore = pfile_in_zip_read_info->stream.next_out; - - /* - if ((pfile_in_zip_read_info->rest_read_uncompressed == - pfile_in_zip_read_info->stream.avail_out) && - (pfile_in_zip_read_info->rest_read_compressed == 0)) - flush = Z_FINISH; - */ - err=inflate(&pfile_in_zip_read_info->stream,flush); - - uTotalOutAfter = pfile_in_zip_read_info->stream.total_out; - uOutThis = uTotalOutAfter-uTotalOutBefore; - - pfile_in_zip_read_info->crc32 = - crc32(pfile_in_zip_read_info->crc32,bufBefore, - (uInt)(uOutThis)); - - pfile_in_zip_read_info->rest_read_uncompressed -= - uOutThis; - - iRead += (uInt)(uTotalOutAfter - uTotalOutBefore); - - if (err==Z_STREAM_END) - return (iRead==0) ? UNZ_EOF : iRead; - if (err!=Z_OK) - break; - } - } - - if (err==Z_OK) - return iRead; - return err; -} - - -/* - Give the current position in uncompressed data -*/ -extern z_off_t ZEXPORT unztell (file) - unzFile file; -{ - unz_s* s; - file_in_zip_read_info_s* pfile_in_zip_read_info; - if (file==NULL) - return UNZ_PARAMERROR; - s=(unz_s*)file; - pfile_in_zip_read_info=s->pfile_in_zip_read; - - if (pfile_in_zip_read_info==NULL) - return UNZ_PARAMERROR; - - return (z_off_t)pfile_in_zip_read_info->stream.total_out; -} - - -/* - return 1 if the end of file was reached, 0 elsewhere -*/ -extern int ZEXPORT unzeof (file) - unzFile file; -{ - unz_s* s; - file_in_zip_read_info_s* pfile_in_zip_read_info; - if (file==NULL) - return UNZ_PARAMERROR; - s=(unz_s*)file; - pfile_in_zip_read_info=s->pfile_in_zip_read; - - if (pfile_in_zip_read_info==NULL) - return UNZ_PARAMERROR; - - if (pfile_in_zip_read_info->rest_read_uncompressed == 0) - return 1; - else - return 0; -} - - - -/* - Read extra field from the current file (opened by unzOpenCurrentFile) - This is the local-header version of the extra field (sometimes, there is - more info in the local-header version than in the central-header) - - if buf==NULL, it return the size of the local extra field that can be read - - if buf!=NULL, len is the size of the buffer, the extra header is copied in - buf. - the return value is the number of bytes copied in buf, or (if <0) - the error code -*/ -extern int ZEXPORT unzGetLocalExtrafield (file,buf,len) - unzFile file; - voidp buf; - unsigned len; -{ - unz_s* s; - file_in_zip_read_info_s* pfile_in_zip_read_info; - uInt read_now; - uLong size_to_read; - - if (file==NULL) - return UNZ_PARAMERROR; - s=(unz_s*)file; - pfile_in_zip_read_info=s->pfile_in_zip_read; - - if (pfile_in_zip_read_info==NULL) - return UNZ_PARAMERROR; - - size_to_read = (pfile_in_zip_read_info->size_local_extrafield - - pfile_in_zip_read_info->pos_local_extrafield); - - if (buf==NULL) - return (int)size_to_read; - - if (len>size_to_read) - read_now = (uInt)size_to_read; - else - read_now = (uInt)len ; - - if (read_now==0) - return 0; - - if (fseek(pfile_in_zip_read_info->file, - pfile_in_zip_read_info->offset_local_extrafield + - pfile_in_zip_read_info->pos_local_extrafield,SEEK_SET)!=0) - return UNZ_ERRNO; - - if (fread(buf,(uInt)size_to_read,1,pfile_in_zip_read_info->file)!=1) - return UNZ_ERRNO; - - return (int)read_now; -} - -/* - Close the file in zip opened with unzipOpenCurrentFile - Return UNZ_CRCERROR if all the file was read but the CRC is not good -*/ -extern int ZEXPORT unzCloseCurrentFile (file) - unzFile file; -{ - int err=UNZ_OK; - - unz_s* s; - file_in_zip_read_info_s* pfile_in_zip_read_info; - if (file==NULL) - return UNZ_PARAMERROR; - s=(unz_s*)file; - pfile_in_zip_read_info=s->pfile_in_zip_read; - - if (pfile_in_zip_read_info==NULL) - return UNZ_PARAMERROR; - - - if (pfile_in_zip_read_info->rest_read_uncompressed == 0) - { - if (pfile_in_zip_read_info->crc32 != pfile_in_zip_read_info->crc32_wait) - err=UNZ_CRCERROR; - } - - - TRYFREE(pfile_in_zip_read_info->read_buffer); - pfile_in_zip_read_info->read_buffer = NULL; - if (pfile_in_zip_read_info->stream_initialised) - inflateEnd(&pfile_in_zip_read_info->stream); - - pfile_in_zip_read_info->stream_initialised = 0; - TRYFREE(pfile_in_zip_read_info); - - s->pfile_in_zip_read=NULL; - - return err; -} - - -/* - Get the global comment string of the ZipFile, in the szComment buffer. - uSizeBuf is the size of the szComment buffer. - return the number of byte copied or an error code <0 -*/ -extern int ZEXPORT unzGetGlobalComment (file, szComment, uSizeBuf) - unzFile file; - char *szComment; - uLong uSizeBuf; -{ - int err=UNZ_OK; - unz_s* s; - uLong uReadThis ; - if (file==NULL) - return UNZ_PARAMERROR; - s=(unz_s*)file; - - uReadThis = uSizeBuf; - if (uReadThis>s->gi.size_comment) - uReadThis = s->gi.size_comment; - - if (fseek(s->file,s->central_pos+22,SEEK_SET)!=0) - return UNZ_ERRNO; - - if (uReadThis>0) - { - *szComment='\0'; - if (fread(szComment,(uInt)uReadThis,1,s->file)!=1) - return UNZ_ERRNO; - } - - if ((szComment != NULL) && (uSizeBuf > s->gi.size_comment)) - *(szComment+s->gi.size_comment)='\0'; - return (int)uReadThis; -} diff --git a/data/nsis/Contrib/nsisunz/zlib/ZCONF.H b/data/nsis/Contrib/nsisunz/zlib/ZCONF.H deleted file mode 100644 index 0776aadd5..000000000 --- a/data/nsis/Contrib/nsisunz/zlib/ZCONF.H +++ /dev/null @@ -1,330 +0,0 @@ -/* zconf.h -- configuration of the zlib compression library - * Copyright (C) 1995-2004 Jean-loup Gailly. - * For conditions of distribution and use, see copyright notice in zlib.h - */ - -/* @(#) $Id$ */ - -#ifndef ZCONF_H -#define ZCONF_H - -/* - * If you *really* need a unique prefix for all types and library functions, - * compile with -DZ_PREFIX. The "standard" zlib should be compiled without it. - */ -#ifdef Z_PREFIX -# define deflateInit_ z_deflateInit_ -# define deflate z_deflate -# define deflateEnd z_deflateEnd -# define inflateInit_ z_inflateInit_ -# define inflate z_inflate -# define inflateEnd z_inflateEnd -# define deflateInit2_ z_deflateInit2_ -# define deflateSetDictionary z_deflateSetDictionary -# define deflateCopy z_deflateCopy -# define deflateReset z_deflateReset -# define deflateParams z_deflateParams -# define deflateBound z_deflateBound -# define deflatePrime z_deflatePrime -# define inflateInit2_ z_inflateInit2_ -# define inflateSetDictionary z_inflateSetDictionary -# define inflateSync z_inflateSync -# define inflateSyncPoint z_inflateSyncPoint -# define inflateCopy z_inflateCopy -# define inflateReset z_inflateReset -# define inflateBack z_inflateBack -# define inflateBackEnd z_inflateBackEnd -# define compress z_compress -# define compress2 z_compress2 -# define compressBound z_compressBound -# define uncompress z_uncompress -# define adler32 z_adler32 -# define crc32 z_crc32 -# define get_crc_table z_get_crc_table -# define zError z_zError - -# define Byte z_Byte -# define uInt z_uInt -# define uLong z_uLong -# define Bytef z_Bytef -# define charf z_charf -# define intf z_intf -# define uIntf z_uIntf -# define uLongf z_uLongf -# define voidpf z_voidpf -# define voidp z_voidp -#endif - -#if defined(__MSDOS__) && !defined(MSDOS) -# define MSDOS -#endif -#if (defined(OS_2) || defined(__OS2__)) && !defined(OS2) -# define OS2 -#endif -#if defined(_WINDOWS) && !defined(WINDOWS) -# define WINDOWS -#endif -#if (defined(_WIN32) || defined(__WIN32__)) && !defined(WIN32) -# define WIN32 -#endif -#if (defined(MSDOS) || defined(OS2) || defined(WINDOWS)) && !defined(WIN32) -# if !defined(__GNUC__) && !defined(__FLAT__) && !defined(__386__) -# ifndef SYS16BIT -# define SYS16BIT -# endif -# endif -#endif - -/* - * Compile with -DMAXSEG_64K if the alloc function cannot allocate more - * than 64k bytes at a time (needed on systems with 16-bit int). - */ -#ifdef SYS16BIT -# define MAXSEG_64K -#endif -#ifdef MSDOS -# define UNALIGNED_OK -#endif - -#ifdef __STDC_VERSION__ -# ifndef STDC -# define STDC -# endif -# if __STDC_VERSION__ >= 199901L -# ifndef STDC99 -# define STDC99 -# endif -# endif -#endif -#if !defined(STDC) && (defined(__STDC__) || defined(__cplusplus)) -# define STDC -#endif -#if !defined(STDC) && (defined(__GNUC__) || defined(__BORLANDC__)) -# define STDC -#endif -#if !defined(STDC) && (defined(MSDOS) || defined(WINDOWS) || defined(WIN32)) -# define STDC -#endif -#if !defined(STDC) && (defined(OS2) || defined(__HOS_AIX__)) -# define STDC -#endif - -#if defined(__OS400__) && !defined(STDC) /* iSeries (formerly AS/400). */ -# define STDC -#endif - -#ifndef STDC -# ifndef const /* cannot use !defined(STDC) && !defined(const) on Mac */ -# define const /* note: need a more gentle solution here */ -# endif -#endif - -/* Some Mac compilers merge all .h files incorrectly: */ -#if defined(__MWERKS__)||defined(applec)||defined(THINK_C)||defined(__SC__) -# define NO_DUMMY_DECL -#endif - -/* Maximum value for memLevel in deflateInit2 */ -#ifndef MAX_MEM_LEVEL -# ifdef MAXSEG_64K -# define MAX_MEM_LEVEL 8 -# else -# define MAX_MEM_LEVEL 9 -# endif -#endif - -/* Maximum value for windowBits in deflateInit2 and inflateInit2. - * WARNING: reducing MAX_WBITS makes minigzip unable to extract .gz files - * created by gzip. (Files created by minigzip can still be extracted by - * gzip.) - */ -#ifndef MAX_WBITS -# define MAX_WBITS 15 /* 32K LZ77 window */ -#endif - -/* The memory requirements for deflate are (in bytes): - (1 << (windowBits+2)) + (1 << (memLevel+9)) - that is: 128K for windowBits=15 + 128K for memLevel = 8 (default values) - plus a few kilobytes for small objects. For example, if you want to reduce - the default memory requirements from 256K to 128K, compile with - make CFLAGS="-O -DMAX_WBITS=14 -DMAX_MEM_LEVEL=7" - Of course this will generally degrade compression (there's no free lunch). - - The memory requirements for inflate are (in bytes) 1 << windowBits - that is, 32K for windowBits=15 (default value) plus a few kilobytes - for small objects. -*/ - - /* Type declarations */ - -#ifndef OF /* function prototypes */ -# ifdef STDC -# define OF(args) args -# else -# define OF(args) () -# endif -#endif - -/* The following definitions for FAR are needed only for MSDOS mixed - * model programming (small or medium model with some far allocations). - * This was tested only with MSC; for other MSDOS compilers you may have - * to define NO_MEMCPY in zutil.h. If you don't need the mixed model, - * just define FAR to be empty. - */ -#ifdef SYS16BIT -# if defined(M_I86SM) || defined(M_I86MM) - /* MSC small or medium model */ -# define SMALL_MEDIUM -# ifdef _MSC_VER -# define FAR _far -# else -# define FAR far -# endif -# endif -# if (defined(__SMALL__) || defined(__MEDIUM__)) - /* Turbo C small or medium model */ -# define SMALL_MEDIUM -# ifdef __BORLANDC__ -# define FAR _far -# else -# define FAR far -# endif -# endif -#endif - -#if defined(WINDOWS) || defined(WIN32) - /* If building or using zlib as a DLL, define ZLIB_DLL. - * This is not mandatory, but it offers a little performance increase. - */ -# ifdef ZLIB_DLL -# if defined(WIN32) && (!defined(__BORLANDC__) || (__BORLANDC__ >= 0x500)) -# ifdef ZLIB_INTERNAL -# define ZEXTERN extern __declspec(dllexport) -# else -# define ZEXTERN extern __declspec(dllimport) -# endif -# endif -# endif /* ZLIB_DLL */ - /* If building or using zlib with the WINAPI/WINAPIV calling convention, - * define ZLIB_WINAPI. - * Caution: the standard ZLIB1.DLL is NOT compiled using ZLIB_WINAPI. - */ -# ifdef ZLIB_WINAPI -# ifdef FAR -# undef FAR -# endif -# include - /* No need for _export, use ZLIB.DEF instead. */ - /* For complete Windows compatibility, use WINAPI, not __stdcall. */ -# define ZEXPORT WINAPI -# ifdef WIN32 -# define ZEXPORTVA WINAPIV -# else -# define ZEXPORTVA FAR CDECL -# endif -# endif -#endif - -#if defined (__BEOS__) -# ifdef ZLIB_DLL -# ifdef ZLIB_INTERNAL -# define ZEXPORT __declspec(dllexport) -# define ZEXPORTVA __declspec(dllexport) -# else -# define ZEXPORT __declspec(dllimport) -# define ZEXPORTVA __declspec(dllimport) -# endif -# endif -#endif - -#ifndef ZEXTERN -# define ZEXTERN extern -#endif -#ifndef ZEXPORT -# define ZEXPORT -#endif -#ifndef ZEXPORTVA -# define ZEXPORTVA -#endif - -#ifndef FAR -# define FAR -#endif - -#if !defined(__MACTYPES__) -typedef unsigned char Byte; /* 8 bits */ -#endif -typedef unsigned int uInt; /* 16 bits or more */ -typedef unsigned long uLong; /* 32 bits or more */ - -#ifdef SMALL_MEDIUM - /* Borland C/C++ and some old MSC versions ignore FAR inside typedef */ -# define Bytef Byte FAR -#else - typedef Byte FAR Bytef; -#endif -typedef char FAR charf; -typedef int FAR intf; -typedef uInt FAR uIntf; -typedef uLong FAR uLongf; - -#ifdef STDC - typedef void const *voidpc; - typedef void FAR *voidpf; - typedef void *voidp; -#else - typedef Byte const *voidpc; - typedef Byte FAR *voidpf; - typedef Byte *voidp; -#endif - -#if 0 /* HAVE_UNISTD_H -- this line is updated by ./configure */ -# include /* for off_t */ -# include /* for SEEK_* and off_t */ -# ifdef VMS -# include /* for off_t */ -# endif -# define z_off_t off_t -#endif -#ifndef SEEK_SET -# define SEEK_SET 0 /* Seek from beginning of file. */ -# define SEEK_CUR 1 /* Seek from current position. */ -# define SEEK_END 2 /* Set file pointer to EOF plus "offset" */ -#endif -#ifndef z_off_t -# define z_off_t long -#endif - -#if 1 /* MINICLIB */ -# define NO_vsnprintf -#endif - -#if defined(__OS400__) -# define NO_vsnprintf -#endif - -#if defined(__MVS__) -# define NO_vsnprintf -# ifdef FAR -# undef FAR -# endif -#endif - -/* MVS linker does not support external names larger than 8 bytes */ -#if defined(__MVS__) -# pragma map(deflateInit_,"DEIN") -# pragma map(deflateInit2_,"DEIN2") -# pragma map(deflateEnd,"DEEND") -# pragma map(deflateBound,"DEBND") -# pragma map(inflateInit_,"ININ") -# pragma map(inflateInit2_,"ININ2") -# pragma map(inflateEnd,"INEND") -# pragma map(inflateSync,"INSY") -# pragma map(inflateSetDictionary,"INSEDI") -# pragma map(compressBound,"CMBND") -# pragma map(inflate_table,"INTABL") -# pragma map(inflate_fast,"INFA") -# pragma map(inflate_copyright,"INCOPY") -#endif - -#endif /* ZCONF_H */ diff --git a/data/nsis/Contrib/nsisunz/zlib/ZLIB.H b/data/nsis/Contrib/nsisunz/zlib/ZLIB.H deleted file mode 100644 index b4ddd3439..000000000 --- a/data/nsis/Contrib/nsisunz/zlib/ZLIB.H +++ /dev/null @@ -1,1200 +0,0 @@ -/* zlib.h -- interface of the 'zlib' general purpose compression library - version 1.2.2, October 3rd, 2004 - - Copyright (C) 1995-2004 Jean-loup Gailly and Mark Adler - - This software is provided 'as-is', without any express or implied - warranty. In no event will the authors be held liable for any damages - arising from the use of this software. - - Permission is granted to anyone to use this software for any purpose, - including commercial applications, and to alter it and redistribute it - freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - 3. This notice may not be removed or altered from any source distribution. - - Jean-loup Gailly Mark Adler - jloup@gzip.org madler@alumni.caltech.edu - - - The data format used by the zlib library is described by RFCs (Request for - Comments) 1950 to 1952 in the files http://www.ietf.org/rfc/rfc1950.txt - (zlib format), rfc1951.txt (deflate format) and rfc1952.txt (gzip format). -*/ - -#ifndef ZLIB_H -#define ZLIB_H - -#include "zconf.h" - -#ifdef __cplusplus -extern "C" { -#endif - -#define ZLIB_VERSION "1.2.2" -#define ZLIB_VERNUM 0x1220 - -/* - The 'zlib' compression library provides in-memory compression and - decompression functions, including integrity checks of the uncompressed - data. This version of the library supports only one compression method - (deflation) but other algorithms will be added later and will have the same - stream interface. - - Compression can be done in a single step if the buffers are large - enough (for example if an input file is mmap'ed), or can be done by - repeated calls of the compression function. In the latter case, the - application must provide more input and/or consume the output - (providing more output space) before each call. - - The compressed data format used by default by the in-memory functions is - the zlib format, which is a zlib wrapper documented in RFC 1950, wrapped - around a deflate stream, which is itself documented in RFC 1951. - - The library also supports reading and writing files in gzip (.gz) format - with an interface similar to that of stdio using the functions that start - with "gz". The gzip format is different from the zlib format. gzip is a - gzip wrapper, documented in RFC 1952, wrapped around a deflate stream. - - This library can optionally read and write gzip streams in memory as well. - - The zlib format was designed to be compact and fast for use in memory - and on communications channels. The gzip format was designed for single- - file compression on file systems, has a larger header than zlib to maintain - directory information, and uses a different, slower check method than zlib. - - The library does not install any signal handler. The decoder checks - the consistency of the compressed data, so the library should never - crash even in case of corrupted input. -*/ - -typedef voidpf (*alloc_func) OF((voidpf opaque, uInt items, uInt size)); -typedef void (*free_func) OF((voidpf opaque, voidpf address)); - -struct internal_state; - -typedef struct z_stream_s { - Bytef *next_in; /* next input byte */ - uInt avail_in; /* number of bytes available at next_in */ - uLong total_in; /* total nb of input bytes read so far */ - - Bytef *next_out; /* next output byte should be put there */ - uInt avail_out; /* remaining free space at next_out */ - uLong total_out; /* total nb of bytes output so far */ - - char *msg; /* last error message, NULL if no error */ - struct internal_state FAR *state; /* not visible by applications */ - - alloc_func zalloc; /* used to allocate the internal state */ - free_func zfree; /* used to free the internal state */ - voidpf opaque; /* private data object passed to zalloc and zfree */ - - int data_type; /* best guess about the data type: ascii or binary */ - uLong adler; /* adler32 value of the uncompressed data */ - uLong reserved; /* reserved for future use */ -} z_stream; - -typedef z_stream FAR *z_streamp; - -/* - The application must update next_in and avail_in when avail_in has - dropped to zero. It must update next_out and avail_out when avail_out - has dropped to zero. The application must initialize zalloc, zfree and - opaque before calling the init function. All other fields are set by the - compression library and must not be updated by the application. - - The opaque value provided by the application will be passed as the first - parameter for calls of zalloc and zfree. This can be useful for custom - memory management. The compression library attaches no meaning to the - opaque value. - - zalloc must return Z_NULL if there is not enough memory for the object. - If zlib is used in a multi-threaded application, zalloc and zfree must be - thread safe. - - On 16-bit systems, the functions zalloc and zfree must be able to allocate - exactly 65536 bytes, but will not be required to allocate more than this - if the symbol MAXSEG_64K is defined (see zconf.h). WARNING: On MSDOS, - pointers returned by zalloc for objects of exactly 65536 bytes *must* - have their offset normalized to zero. The default allocation function - provided by this library ensures this (see zutil.c). To reduce memory - requirements and avoid any allocation of 64K objects, at the expense of - compression ratio, compile the library with -DMAX_WBITS=14 (see zconf.h). - - The fields total_in and total_out can be used for statistics or - progress reports. After compression, total_in holds the total size of - the uncompressed data and may be saved for use in the decompressor - (particularly if the decompressor wants to decompress everything in - a single step). -*/ - - /* constants */ - -#define Z_NO_FLUSH 0 -#define Z_PARTIAL_FLUSH 1 /* will be removed, use Z_SYNC_FLUSH instead */ -#define Z_SYNC_FLUSH 2 -#define Z_FULL_FLUSH 3 -#define Z_FINISH 4 -#define Z_BLOCK 5 -/* Allowed flush values; see deflate() and inflate() below for details */ - -#define Z_OK 0 -#define Z_STREAM_END 1 -#define Z_NEED_DICT 2 -#define Z_ERRNO (-1) -#define Z_STREAM_ERROR (-2) -#define Z_DATA_ERROR (-3) -#define Z_MEM_ERROR (-4) -#define Z_BUF_ERROR (-5) -#define Z_VERSION_ERROR (-6) -/* Return codes for the compression/decompression functions. Negative - * values are errors, positive values are used for special but normal events. - */ - -#define Z_NO_COMPRESSION 0 -#define Z_BEST_SPEED 1 -#define Z_BEST_COMPRESSION 9 -#define Z_DEFAULT_COMPRESSION (-1) -/* compression levels */ - -#define Z_FILTERED 1 -#define Z_HUFFMAN_ONLY 2 -#define Z_RLE 3 -#define Z_DEFAULT_STRATEGY 0 -/* compression strategy; see deflateInit2() below for details */ - -#define Z_BINARY 0 -#define Z_ASCII 1 -#define Z_UNKNOWN 2 -/* Possible values of the data_type field (though see inflate()) */ - -#define Z_DEFLATED 8 -/* The deflate compression method (the only one supported in this version) */ - -#define Z_NULL 0 /* for initializing zalloc, zfree, opaque */ - -#define zlib_version zlibVersion() -/* for compatibility with versions < 1.0.2 */ - - /* basic functions */ - -ZEXTERN const char * ZEXPORT zlibVersion OF((void)); -/* The application can compare zlibVersion and ZLIB_VERSION for consistency. - If the first character differs, the library code actually used is - not compatible with the zlib.h header file used by the application. - This check is automatically made by deflateInit and inflateInit. - */ - -/* -ZEXTERN int ZEXPORT deflateInit OF((z_streamp strm, int level)); - - Initializes the internal stream state for compression. The fields - zalloc, zfree and opaque must be initialized before by the caller. - If zalloc and zfree are set to Z_NULL, deflateInit updates them to - use default allocation functions. - - The compression level must be Z_DEFAULT_COMPRESSION, or between 0 and 9: - 1 gives best speed, 9 gives best compression, 0 gives no compression at - all (the input data is simply copied a block at a time). - Z_DEFAULT_COMPRESSION requests a default compromise between speed and - compression (currently equivalent to level 6). - - deflateInit returns Z_OK if success, Z_MEM_ERROR if there was not - enough memory, Z_STREAM_ERROR if level is not a valid compression level, - Z_VERSION_ERROR if the zlib library version (zlib_version) is incompatible - with the version assumed by the caller (ZLIB_VERSION). - msg is set to null if there is no error message. deflateInit does not - perform any compression: this will be done by deflate(). -*/ - - -ZEXTERN int ZEXPORT deflate OF((z_streamp strm, int flush)); -/* - deflate compresses as much data as possible, and stops when the input - buffer becomes empty or the output buffer becomes full. It may introduce some - output latency (reading input without producing any output) except when - forced to flush. - - The detailed semantics are as follows. deflate performs one or both of the - following actions: - - - Compress more input starting at next_in and update next_in and avail_in - accordingly. If not all input can be processed (because there is not - enough room in the output buffer), next_in and avail_in are updated and - processing will resume at this point for the next call of deflate(). - - - Provide more output starting at next_out and update next_out and avail_out - accordingly. This action is forced if the parameter flush is non zero. - Forcing flush frequently degrades the compression ratio, so this parameter - should be set only when necessary (in interactive applications). - Some output may be provided even if flush is not set. - - Before the call of deflate(), the application should ensure that at least - one of the actions is possible, by providing more input and/or consuming - more output, and updating avail_in or avail_out accordingly; avail_out - should never be zero before the call. The application can consume the - compressed output when it wants, for example when the output buffer is full - (avail_out == 0), or after each call of deflate(). If deflate returns Z_OK - and with zero avail_out, it must be called again after making room in the - output buffer because there might be more output pending. - - If the parameter flush is set to Z_SYNC_FLUSH, all pending output is - flushed to the output buffer and the output is aligned on a byte boundary, so - that the decompressor can get all input data available so far. (In particular - avail_in is zero after the call if enough output space has been provided - before the call.) Flushing may degrade compression for some compression - algorithms and so it should be used only when necessary. - - If flush is set to Z_FULL_FLUSH, all output is flushed as with - Z_SYNC_FLUSH, and the compression state is reset so that decompression can - restart from this point if previous compressed data has been damaged or if - random access is desired. Using Z_FULL_FLUSH too often can seriously degrade - the compression. - - If deflate returns with avail_out == 0, this function must be called again - with the same value of the flush parameter and more output space (updated - avail_out), until the flush is complete (deflate returns with non-zero - avail_out). In the case of a Z_FULL_FLUSH or Z_SYNC_FLUSH, make sure that - avail_out is greater than six to avoid repeated flush markers due to - avail_out == 0 on return. - - If the parameter flush is set to Z_FINISH, pending input is processed, - pending output is flushed and deflate returns with Z_STREAM_END if there - was enough output space; if deflate returns with Z_OK, this function must be - called again with Z_FINISH and more output space (updated avail_out) but no - more input data, until it returns with Z_STREAM_END or an error. After - deflate has returned Z_STREAM_END, the only possible operations on the - stream are deflateReset or deflateEnd. - - Z_FINISH can be used immediately after deflateInit if all the compression - is to be done in a single step. In this case, avail_out must be at least - the value returned by deflateBound (see below). If deflate does not return - Z_STREAM_END, then it must be called again as described above. - - deflate() sets strm->adler to the adler32 checksum of all input read - so far (that is, total_in bytes). - - deflate() may update data_type if it can make a good guess about - the input data type (Z_ASCII or Z_BINARY). In doubt, the data is considered - binary. This field is only for information purposes and does not affect - the compression algorithm in any manner. - - deflate() returns Z_OK if some progress has been made (more input - processed or more output produced), Z_STREAM_END if all input has been - consumed and all output has been produced (only when flush is set to - Z_FINISH), Z_STREAM_ERROR if the stream state was inconsistent (for example - if next_in or next_out was NULL), Z_BUF_ERROR if no progress is possible - (for example avail_in or avail_out was zero). Note that Z_BUF_ERROR is not - fatal, and deflate() can be called again with more input and more output - space to continue compressing. -*/ - - -ZEXTERN int ZEXPORT deflateEnd OF((z_streamp strm)); -/* - All dynamically allocated data structures for this stream are freed. - This function discards any unprocessed input and does not flush any - pending output. - - deflateEnd returns Z_OK if success, Z_STREAM_ERROR if the - stream state was inconsistent, Z_DATA_ERROR if the stream was freed - prematurely (some input or output was discarded). In the error case, - msg may be set but then points to a static string (which must not be - deallocated). -*/ - - -/* -ZEXTERN int ZEXPORT inflateInit OF((z_streamp strm)); - - Initializes the internal stream state for decompression. The fields - next_in, avail_in, zalloc, zfree and opaque must be initialized before by - the caller. If next_in is not Z_NULL and avail_in is large enough (the exact - value depends on the compression method), inflateInit determines the - compression method from the zlib header and allocates all data structures - accordingly; otherwise the allocation will be deferred to the first call of - inflate. If zalloc and zfree are set to Z_NULL, inflateInit updates them to - use default allocation functions. - - inflateInit returns Z_OK if success, Z_MEM_ERROR if there was not enough - memory, Z_VERSION_ERROR if the zlib library version is incompatible with the - version assumed by the caller. msg is set to null if there is no error - message. inflateInit does not perform any decompression apart from reading - the zlib header if present: this will be done by inflate(). (So next_in and - avail_in may be modified, but next_out and avail_out are unchanged.) -*/ - - -ZEXTERN int ZEXPORT inflate OF((z_streamp strm, int flush)); -/* - inflate decompresses as much data as possible, and stops when the input - buffer becomes empty or the output buffer becomes full. It may introduce - some output latency (reading input without producing any output) except when - forced to flush. - - The detailed semantics are as follows. inflate performs one or both of the - following actions: - - - Decompress more input starting at next_in and update next_in and avail_in - accordingly. If not all input can be processed (because there is not - enough room in the output buffer), next_in is updated and processing - will resume at this point for the next call of inflate(). - - - Provide more output starting at next_out and update next_out and avail_out - accordingly. inflate() provides as much output as possible, until there - is no more input data or no more space in the output buffer (see below - about the flush parameter). - - Before the call of inflate(), the application should ensure that at least - one of the actions is possible, by providing more input and/or consuming - more output, and updating the next_* and avail_* values accordingly. - The application can consume the uncompressed output when it wants, for - example when the output buffer is full (avail_out == 0), or after each - call of inflate(). If inflate returns Z_OK and with zero avail_out, it - must be called again after making room in the output buffer because there - might be more output pending. - - The flush parameter of inflate() can be Z_NO_FLUSH, Z_SYNC_FLUSH, - Z_FINISH, or Z_BLOCK. Z_SYNC_FLUSH requests that inflate() flush as much - output as possible to the output buffer. Z_BLOCK requests that inflate() stop - if and when it get to the next deflate block boundary. When decoding the zlib - or gzip format, this will cause inflate() to return immediately after the - header and before the first block. When doing a raw inflate, inflate() will - go ahead and process the first block, and will return when it gets to the end - of that block, or when it runs out of data. - - The Z_BLOCK option assists in appending to or combining deflate streams. - Also to assist in this, on return inflate() will set strm->data_type to the - number of unused bits in the last byte taken from strm->next_in, plus 64 - if inflate() is currently decoding the last block in the deflate stream, - plus 128 if inflate() returned immediately after decoding an end-of-block - code or decoding the complete header up to just before the first byte of the - deflate stream. The end-of-block will not be indicated until all of the - uncompressed data from that block has been written to strm->next_out. The - number of unused bits may in general be greater than seven, except when - bit 7 of data_type is set, in which case the number of unused bits will be - less than eight. - - inflate() should normally be called until it returns Z_STREAM_END or an - error. However if all decompression is to be performed in a single step - (a single call of inflate), the parameter flush should be set to - Z_FINISH. In this case all pending input is processed and all pending - output is flushed; avail_out must be large enough to hold all the - uncompressed data. (The size of the uncompressed data may have been saved - by the compressor for this purpose.) The next operation on this stream must - be inflateEnd to deallocate the decompression state. The use of Z_FINISH - is never required, but can be used to inform inflate that a faster approach - may be used for the single inflate() call. - - In this implementation, inflate() always flushes as much output as - possible to the output buffer, and always uses the faster approach on the - first call. So the only effect of the flush parameter in this implementation - is on the return value of inflate(), as noted below, or when it returns early - because Z_BLOCK is used. - - If a preset dictionary is needed after this call (see inflateSetDictionary - below), inflate sets strm->adler to the adler32 checksum of the dictionary - chosen by the compressor and returns Z_NEED_DICT; otherwise it sets - strm->adler to the adler32 checksum of all output produced so far (that is, - total_out bytes) and returns Z_OK, Z_STREAM_END or an error code as described - below. At the end of the stream, inflate() checks that its computed adler32 - checksum is equal to that saved by the compressor and returns Z_STREAM_END - only if the checksum is correct. - - inflate() will decompress and check either zlib-wrapped or gzip-wrapped - deflate data. The header type is detected automatically. Any information - contained in the gzip header is not retained, so applications that need that - information should instead use raw inflate, see inflateInit2() below, or - inflateBack() and perform their own processing of the gzip header and - trailer. - - inflate() returns Z_OK if some progress has been made (more input processed - or more output produced), Z_STREAM_END if the end of the compressed data has - been reached and all uncompressed output has been produced, Z_NEED_DICT if a - preset dictionary is needed at this point, Z_DATA_ERROR if the input data was - corrupted (input stream not conforming to the zlib format or incorrect check - value), Z_STREAM_ERROR if the stream structure was inconsistent (for example - if next_in or next_out was NULL), Z_MEM_ERROR if there was not enough memory, - Z_BUF_ERROR if no progress is possible or if there was not enough room in the - output buffer when Z_FINISH is used. Note that Z_BUF_ERROR is not fatal, and - inflate() can be called again with more input and more output space to - continue decompressing. If Z_DATA_ERROR is returned, the application may then - call inflateSync() to look for a good compression block if a partial recovery - of the data is desired. -*/ - - -ZEXTERN int ZEXPORT inflateEnd OF((z_streamp strm)); -/* - All dynamically allocated data structures for this stream are freed. - This function discards any unprocessed input and does not flush any - pending output. - - inflateEnd returns Z_OK if success, Z_STREAM_ERROR if the stream state - was inconsistent. In the error case, msg may be set but then points to a - static string (which must not be deallocated). -*/ - - /* Advanced functions */ - -/* - The following functions are needed only in some special applications. -*/ - -/* -ZEXTERN int ZEXPORT deflateInit2 OF((z_streamp strm, - int level, - int method, - int windowBits, - int memLevel, - int strategy)); - - This is another version of deflateInit with more compression options. The - fields next_in, zalloc, zfree and opaque must be initialized before by - the caller. - - The method parameter is the compression method. It must be Z_DEFLATED in - this version of the library. - - The windowBits parameter is the base two logarithm of the window size - (the size of the history buffer). It should be in the range 8..15 for this - version of the library. Larger values of this parameter result in better - compression at the expense of memory usage. The default value is 15 if - deflateInit is used instead. - - windowBits can also be -8..-15 for raw deflate. In this case, -windowBits - determines the window size. deflate() will then generate raw deflate data - with no zlib header or trailer, and will not compute an adler32 check value. - - windowBits can also be greater than 15 for optional gzip encoding. Add - 16 to windowBits to write a simple gzip header and trailer around the - compressed data instead of a zlib wrapper. The gzip header will have no - file name, no extra data, no comment, no modification time (set to zero), - no header crc, and the operating system will be set to 255 (unknown). If a - gzip stream is being written, strm->adler is a crc32 instead of an adler32. - - The memLevel parameter specifies how much memory should be allocated - for the internal compression state. memLevel=1 uses minimum memory but - is slow and reduces compression ratio; memLevel=9 uses maximum memory - for optimal speed. The default value is 8. See zconf.h for total memory - usage as a function of windowBits and memLevel. - - The strategy parameter is used to tune the compression algorithm. Use the - value Z_DEFAULT_STRATEGY for normal data, Z_FILTERED for data produced by a - filter (or predictor), Z_HUFFMAN_ONLY to force Huffman encoding only (no - string match), or Z_RLE to limit match distances to one (run-length - encoding). Filtered data consists mostly of small values with a somewhat - random distribution. In this case, the compression algorithm is tuned to - compress them better. The effect of Z_FILTERED is to force more Huffman - coding and less string matching; it is somewhat intermediate between - Z_DEFAULT and Z_HUFFMAN_ONLY. Z_RLE is designed to be almost as fast as - Z_HUFFMAN_ONLY, but give better compression for PNG image data. The strategy - parameter only affects the compression ratio but not the correctness of the - compressed output even if it is not set appropriately. - - deflateInit2 returns Z_OK if success, Z_MEM_ERROR if there was not enough - memory, Z_STREAM_ERROR if a parameter is invalid (such as an invalid - method). msg is set to null if there is no error message. deflateInit2 does - not perform any compression: this will be done by deflate(). -*/ - -ZEXTERN int ZEXPORT deflateSetDictionary OF((z_streamp strm, - const Bytef *dictionary, - uInt dictLength)); -/* - Initializes the compression dictionary from the given byte sequence - without producing any compressed output. This function must be called - immediately after deflateInit, deflateInit2 or deflateReset, before any - call of deflate. The compressor and decompressor must use exactly the same - dictionary (see inflateSetDictionary). - - The dictionary should consist of strings (byte sequences) that are likely - to be encountered later in the data to be compressed, with the most commonly - used strings preferably put towards the end of the dictionary. Using a - dictionary is most useful when the data to be compressed is short and can be - predicted with good accuracy; the data can then be compressed better than - with the default empty dictionary. - - Depending on the size of the compression data structures selected by - deflateInit or deflateInit2, a part of the dictionary may in effect be - discarded, for example if the dictionary is larger than the window size in - deflate or deflate2. Thus the strings most likely to be useful should be - put at the end of the dictionary, not at the front. - - Upon return of this function, strm->adler is set to the adler32 value - of the dictionary; the decompressor may later use this value to determine - which dictionary has been used by the compressor. (The adler32 value - applies to the whole dictionary even if only a subset of the dictionary is - actually used by the compressor.) If a raw deflate was requested, then the - adler32 value is not computed and strm->adler is not set. - - deflateSetDictionary returns Z_OK if success, or Z_STREAM_ERROR if a - parameter is invalid (such as NULL dictionary) or the stream state is - inconsistent (for example if deflate has already been called for this stream - or if the compression method is bsort). deflateSetDictionary does not - perform any compression: this will be done by deflate(). -*/ - -ZEXTERN int ZEXPORT deflateCopy OF((z_streamp dest, - z_streamp source)); -/* - Sets the destination stream as a complete copy of the source stream. - - This function can be useful when several compression strategies will be - tried, for example when there are several ways of pre-processing the input - data with a filter. The streams that will be discarded should then be freed - by calling deflateEnd. Note that deflateCopy duplicates the internal - compression state which can be quite large, so this strategy is slow and - can consume lots of memory. - - deflateCopy returns Z_OK if success, Z_MEM_ERROR if there was not - enough memory, Z_STREAM_ERROR if the source stream state was inconsistent - (such as zalloc being NULL). msg is left unchanged in both source and - destination. -*/ - -ZEXTERN int ZEXPORT deflateReset OF((z_streamp strm)); -/* - This function is equivalent to deflateEnd followed by deflateInit, - but does not free and reallocate all the internal compression state. - The stream will keep the same compression level and any other attributes - that may have been set by deflateInit2. - - deflateReset returns Z_OK if success, or Z_STREAM_ERROR if the source - stream state was inconsistent (such as zalloc or state being NULL). -*/ - -ZEXTERN int ZEXPORT deflateParams OF((z_streamp strm, - int level, - int strategy)); -/* - Dynamically update the compression level and compression strategy. The - interpretation of level and strategy is as in deflateInit2. This can be - used to switch between compression and straight copy of the input data, or - to switch to a different kind of input data requiring a different - strategy. If the compression level is changed, the input available so far - is compressed with the old level (and may be flushed); the new level will - take effect only at the next call of deflate(). - - Before the call of deflateParams, the stream state must be set as for - a call of deflate(), since the currently available input may have to - be compressed and flushed. In particular, strm->avail_out must be non-zero. - - deflateParams returns Z_OK if success, Z_STREAM_ERROR if the source - stream state was inconsistent or if a parameter was invalid, Z_BUF_ERROR - if strm->avail_out was zero. -*/ - -ZEXTERN uLong ZEXPORT deflateBound OF((z_streamp strm, - uLong sourceLen)); -/* - deflateBound() returns an upper bound on the compressed size after - deflation of sourceLen bytes. It must be called after deflateInit() - or deflateInit2(). This would be used to allocate an output buffer - for deflation in a single pass, and so would be called before deflate(). -*/ - -ZEXTERN int ZEXPORT deflatePrime OF((z_streamp strm, - int bits, - int value)); -/* - deflatePrime() inserts bits in the deflate output stream. The intent - is that this function is used to start off the deflate output with the - bits leftover from a previous deflate stream when appending to it. As such, - this function can only be used for raw deflate, and must be used before the - first deflate() call after a deflateInit2() or deflateReset(). bits must be - less than or equal to 16, and that many of the least significant bits of - value will be inserted in the output. - - deflatePrime returns Z_OK if success, or Z_STREAM_ERROR if the source - stream state was inconsistent. -*/ - -/* -ZEXTERN int ZEXPORT inflateInit2 OF((z_streamp strm, - int windowBits)); - - This is another version of inflateInit with an extra parameter. The - fields next_in, avail_in, zalloc, zfree and opaque must be initialized - before by the caller. - - The windowBits parameter is the base two logarithm of the maximum window - size (the size of the history buffer). It should be in the range 8..15 for - this version of the library. The default value is 15 if inflateInit is used - instead. windowBits must be greater than or equal to the windowBits value - provided to deflateInit2() while compressing, or it must be equal to 15 if - deflateInit2() was not used. If a compressed stream with a larger window - size is given as input, inflate() will return with the error code - Z_DATA_ERROR instead of trying to allocate a larger window. - - windowBits can also be -8..-15 for raw inflate. In this case, -windowBits - determines the window size. inflate() will then process raw deflate data, - not looking for a zlib or gzip header, not generating a check value, and not - looking for any check values for comparison at the end of the stream. This - is for use with other formats that use the deflate compressed data format - such as zip. Those formats provide their own check values. If a custom - format is developed using the raw deflate format for compressed data, it is - recommended that a check value such as an adler32 or a crc32 be applied to - the uncompressed data as is done in the zlib, gzip, and zip formats. For - most applications, the zlib format should be used as is. Note that comments - above on the use in deflateInit2() applies to the magnitude of windowBits. - - windowBits can also be greater than 15 for optional gzip decoding. Add - 32 to windowBits to enable zlib and gzip decoding with automatic header - detection, or add 16 to decode only the gzip format (the zlib format will - return a Z_DATA_ERROR. If a gzip stream is being decoded, strm->adler is - a crc32 instead of an adler32. - - inflateInit2 returns Z_OK if success, Z_MEM_ERROR if there was not enough - memory, Z_STREAM_ERROR if a parameter is invalid (such as a negative - memLevel). msg is set to null if there is no error message. inflateInit2 - does not perform any decompression apart from reading the zlib header if - present: this will be done by inflate(). (So next_in and avail_in may be - modified, but next_out and avail_out are unchanged.) -*/ - -ZEXTERN int ZEXPORT inflateSetDictionary OF((z_streamp strm, - const Bytef *dictionary, - uInt dictLength)); -/* - Initializes the decompression dictionary from the given uncompressed byte - sequence. This function must be called immediately after a call of inflate - if this call returned Z_NEED_DICT. The dictionary chosen by the compressor - can be determined from the adler32 value returned by this call of - inflate. The compressor and decompressor must use exactly the same - dictionary (see deflateSetDictionary). - - inflateSetDictionary returns Z_OK if success, Z_STREAM_ERROR if a - parameter is invalid (such as NULL dictionary) or the stream state is - inconsistent, Z_DATA_ERROR if the given dictionary doesn't match the - expected one (incorrect adler32 value). inflateSetDictionary does not - perform any decompression: this will be done by subsequent calls of - inflate(). -*/ - -ZEXTERN int ZEXPORT inflateSync OF((z_streamp strm)); -/* - Skips invalid compressed data until a full flush point (see above the - description of deflate with Z_FULL_FLUSH) can be found, or until all - available input is skipped. No output is provided. - - inflateSync returns Z_OK if a full flush point has been found, Z_BUF_ERROR - if no more input was provided, Z_DATA_ERROR if no flush point has been found, - or Z_STREAM_ERROR if the stream structure was inconsistent. In the success - case, the application may save the current current value of total_in which - indicates where valid compressed data was found. In the error case, the - application may repeatedly call inflateSync, providing more input each time, - until success or end of the input data. -*/ - -ZEXTERN int ZEXPORT inflateCopy OF((z_streamp dest, - z_streamp source)); -/* - Sets the destination stream as a complete copy of the source stream. - - This function can be useful when randomly accessing a large stream. The - first pass through the stream can periodically record the inflate state, - allowing restarting inflate at those points when randomly accessing the - stream. - - inflateCopy returns Z_OK if success, Z_MEM_ERROR if there was not - enough memory, Z_STREAM_ERROR if the source stream state was inconsistent - (such as zalloc being NULL). msg is left unchanged in both source and - destination. -*/ - -ZEXTERN int ZEXPORT inflateReset OF((z_streamp strm)); -/* - This function is equivalent to inflateEnd followed by inflateInit, - but does not free and reallocate all the internal decompression state. - The stream will keep attributes that may have been set by inflateInit2. - - inflateReset returns Z_OK if success, or Z_STREAM_ERROR if the source - stream state was inconsistent (such as zalloc or state being NULL). -*/ - -/* -ZEXTERN int ZEXPORT inflateBackInit OF((z_stream FAR *strm, int windowBits, - unsigned char FAR *window)); - - Initialize the internal stream state for decompression using inflateBack() - calls. The fields zalloc, zfree and opaque in strm must be initialized - before the call. If zalloc and zfree are Z_NULL, then the default library- - derived memory allocation routines are used. windowBits is the base two - logarithm of the window size, in the range 8..15. window is a caller - supplied buffer of that size. Except for special applications where it is - assured that deflate was used with small window sizes, windowBits must be 15 - and a 32K byte window must be supplied to be able to decompress general - deflate streams. - - See inflateBack() for the usage of these routines. - - inflateBackInit will return Z_OK on success, Z_STREAM_ERROR if any of - the paramaters are invalid, Z_MEM_ERROR if the internal state could not - be allocated, or Z_VERSION_ERROR if the version of the library does not - match the version of the header file. -*/ - -typedef unsigned (*in_func) OF((void FAR *, unsigned char FAR * FAR *)); -typedef int (*out_func) OF((void FAR *, unsigned char FAR *, unsigned)); - -ZEXTERN int ZEXPORT inflateBack OF((z_stream FAR *strm, - in_func in, void FAR *in_desc, - out_func out, void FAR *out_desc)); -/* - inflateBack() does a raw inflate with a single call using a call-back - interface for input and output. This is more efficient than inflate() for - file i/o applications in that it avoids copying between the output and the - sliding window by simply making the window itself the output buffer. This - function trusts the application to not change the output buffer passed by - the output function, at least until inflateBack() returns. - - inflateBackInit() must be called first to allocate the internal state - and to initialize the state with the user-provided window buffer. - inflateBack() may then be used multiple times to inflate a complete, raw - deflate stream with each call. inflateBackEnd() is then called to free - the allocated state. - - A raw deflate stream is one with no zlib or gzip header or trailer. - This routine would normally be used in a utility that reads zip or gzip - files and writes out uncompressed files. The utility would decode the - header and process the trailer on its own, hence this routine expects - only the raw deflate stream to decompress. This is different from the - normal behavior of inflate(), which expects either a zlib or gzip header and - trailer around the deflate stream. - - inflateBack() uses two subroutines supplied by the caller that are then - called by inflateBack() for input and output. inflateBack() calls those - routines until it reads a complete deflate stream and writes out all of the - uncompressed data, or until it encounters an error. The function's - parameters and return types are defined above in the in_func and out_func - typedefs. inflateBack() will call in(in_desc, &buf) which should return the - number of bytes of provided input, and a pointer to that input in buf. If - there is no input available, in() must return zero--buf is ignored in that - case--and inflateBack() will return a buffer error. inflateBack() will call - out(out_desc, buf, len) to write the uncompressed data buf[0..len-1]. out() - should return zero on success, or non-zero on failure. If out() returns - non-zero, inflateBack() will return with an error. Neither in() nor out() - are permitted to change the contents of the window provided to - inflateBackInit(), which is also the buffer that out() uses to write from. - The length written by out() will be at most the window size. Any non-zero - amount of input may be provided by in(). - - For convenience, inflateBack() can be provided input on the first call by - setting strm->next_in and strm->avail_in. If that input is exhausted, then - in() will be called. Therefore strm->next_in must be initialized before - calling inflateBack(). If strm->next_in is Z_NULL, then in() will be called - immediately for input. If strm->next_in is not Z_NULL, then strm->avail_in - must also be initialized, and then if strm->avail_in is not zero, input will - initially be taken from strm->next_in[0 .. strm->avail_in - 1]. - - The in_desc and out_desc parameters of inflateBack() is passed as the - first parameter of in() and out() respectively when they are called. These - descriptors can be optionally used to pass any information that the caller- - supplied in() and out() functions need to do their job. - - On return, inflateBack() will set strm->next_in and strm->avail_in to - pass back any unused input that was provided by the last in() call. The - return values of inflateBack() can be Z_STREAM_END on success, Z_BUF_ERROR - if in() or out() returned an error, Z_DATA_ERROR if there was a format - error in the deflate stream (in which case strm->msg is set to indicate the - nature of the error), or Z_STREAM_ERROR if the stream was not properly - initialized. In the case of Z_BUF_ERROR, an input or output error can be - distinguished using strm->next_in which will be Z_NULL only if in() returned - an error. If strm->next is not Z_NULL, then the Z_BUF_ERROR was due to - out() returning non-zero. (in() will always be called before out(), so - strm->next_in is assured to be defined if out() returns non-zero.) Note - that inflateBack() cannot return Z_OK. -*/ - -ZEXTERN int ZEXPORT inflateBackEnd OF((z_stream FAR *strm)); -/* - All memory allocated by inflateBackInit() is freed. - - inflateBackEnd() returns Z_OK on success, or Z_STREAM_ERROR if the stream - state was inconsistent. -*/ - -ZEXTERN uLong ZEXPORT zlibCompileFlags OF((void)); -/* Return flags indicating compile-time options. - - Type sizes, two bits each, 00 = 16 bits, 01 = 32, 10 = 64, 11 = other: - 1.0: size of uInt - 3.2: size of uLong - 5.4: size of voidpf (pointer) - 7.6: size of z_off_t - - Compiler, assembler, and debug options: - 8: DEBUG - 9: ASMV or ASMINF -- use ASM code - 10: ZLIB_WINAPI -- exported functions use the WINAPI calling convention - 11: 0 (reserved) - - One-time table building (smaller code, but not thread-safe if true): - 12: BUILDFIXED -- build static block decoding tables when needed - 13: DYNAMIC_CRC_TABLE -- build CRC calculation tables when needed - 14,15: 0 (reserved) - - Library content (indicates missing functionality): - 16: NO_GZCOMPRESS -- gz* functions cannot compress (to avoid linking - deflate code when not needed) - 17: NO_GZIP -- deflate can't write gzip streams, and inflate can't detect - and decode gzip streams (to avoid linking crc code) - 18-19: 0 (reserved) - - Operation variations (changes in library functionality): - 20: PKZIP_BUG_WORKAROUND -- slightly more permissive inflate - 21: FASTEST -- deflate algorithm with only one, lowest compression level - 22,23: 0 (reserved) - - The sprintf variant used by gzprintf (zero is best): - 24: 0 = vs*, 1 = s* -- 1 means limited to 20 arguments after the format - 25: 0 = *nprintf, 1 = *printf -- 1 means gzprintf() not secure! - 26: 0 = returns value, 1 = void -- 1 means inferred string length returned - - Remainder: - 27-31: 0 (reserved) - */ - - - /* utility functions */ - -/* - The following utility functions are implemented on top of the - basic stream-oriented functions. To simplify the interface, some - default options are assumed (compression level and memory usage, - standard memory allocation functions). The source code of these - utility functions can easily be modified if you need special options. -*/ - -ZEXTERN int ZEXPORT compress OF((Bytef *dest, uLongf *destLen, - const Bytef *source, uLong sourceLen)); -/* - Compresses the source buffer into the destination buffer. sourceLen is - the byte length of the source buffer. Upon entry, destLen is the total - size of the destination buffer, which must be at least the value returned - by compressBound(sourceLen). Upon exit, destLen is the actual size of the - compressed buffer. - This function can be used to compress a whole file at once if the - input file is mmap'ed. - compress returns Z_OK if success, Z_MEM_ERROR if there was not - enough memory, Z_BUF_ERROR if there was not enough room in the output - buffer. -*/ - -ZEXTERN int ZEXPORT compress2 OF((Bytef *dest, uLongf *destLen, - const Bytef *source, uLong sourceLen, - int level)); -/* - Compresses the source buffer into the destination buffer. The level - parameter has the same meaning as in deflateInit. sourceLen is the byte - length of the source buffer. Upon entry, destLen is the total size of the - destination buffer, which must be at least the value returned by - compressBound(sourceLen). Upon exit, destLen is the actual size of the - compressed buffer. - - compress2 returns Z_OK if success, Z_MEM_ERROR if there was not enough - memory, Z_BUF_ERROR if there was not enough room in the output buffer, - Z_STREAM_ERROR if the level parameter is invalid. -*/ - -ZEXTERN uLong ZEXPORT compressBound OF((uLong sourceLen)); -/* - compressBound() returns an upper bound on the compressed size after - compress() or compress2() on sourceLen bytes. It would be used before - a compress() or compress2() call to allocate the destination buffer. -*/ - -ZEXTERN int ZEXPORT uncompress OF((Bytef *dest, uLongf *destLen, - const Bytef *source, uLong sourceLen)); -/* - Decompresses the source buffer into the destination buffer. sourceLen is - the byte length of the source buffer. Upon entry, destLen is the total - size of the destination buffer, which must be large enough to hold the - entire uncompressed data. (The size of the uncompressed data must have - been saved previously by the compressor and transmitted to the decompressor - by some mechanism outside the scope of this compression library.) - Upon exit, destLen is the actual size of the compressed buffer. - This function can be used to decompress a whole file at once if the - input file is mmap'ed. - - uncompress returns Z_OK if success, Z_MEM_ERROR if there was not - enough memory, Z_BUF_ERROR if there was not enough room in the output - buffer, or Z_DATA_ERROR if the input data was corrupted or incomplete. -*/ - - -typedef voidp gzFile; - -ZEXTERN gzFile ZEXPORT gzopen OF((const char *path, const char *mode)); -/* - Opens a gzip (.gz) file for reading or writing. The mode parameter - is as in fopen ("rb" or "wb") but can also include a compression level - ("wb9") or a strategy: 'f' for filtered data as in "wb6f", 'h' for - Huffman only compression as in "wb1h", or 'R' for run-length encoding - as in "wb1R". (See the description of deflateInit2 for more information - about the strategy parameter.) - - gzopen can be used to read a file which is not in gzip format; in this - case gzread will directly read from the file without decompression. - - gzopen returns NULL if the file could not be opened or if there was - insufficient memory to allocate the (de)compression state; errno - can be checked to distinguish the two cases (if errno is zero, the - zlib error is Z_MEM_ERROR). */ - -ZEXTERN gzFile ZEXPORT gzdopen OF((int fd, const char *mode)); -/* - gzdopen() associates a gzFile with the file descriptor fd. File - descriptors are obtained from calls like open, dup, creat, pipe or - fileno (in the file has been previously opened with fopen). - The mode parameter is as in gzopen. - The next call of gzclose on the returned gzFile will also close the - file descriptor fd, just like fclose(fdopen(fd), mode) closes the file - descriptor fd. If you want to keep fd open, use gzdopen(dup(fd), mode). - gzdopen returns NULL if there was insufficient memory to allocate - the (de)compression state. -*/ - -ZEXTERN int ZEXPORT gzsetparams OF((gzFile file, int level, int strategy)); -/* - Dynamically update the compression level or strategy. See the description - of deflateInit2 for the meaning of these parameters. - gzsetparams returns Z_OK if success, or Z_STREAM_ERROR if the file was not - opened for writing. -*/ - -ZEXTERN int ZEXPORT gzread OF((gzFile file, voidp buf, unsigned len)); -/* - Reads the given number of uncompressed bytes from the compressed file. - If the input file was not in gzip format, gzread copies the given number - of bytes into the buffer. - gzread returns the number of uncompressed bytes actually read (0 for - end of file, -1 for error). */ - -ZEXTERN int ZEXPORT gzwrite OF((gzFile file, - voidpc buf, unsigned len)); -/* - Writes the given number of uncompressed bytes into the compressed file. - gzwrite returns the number of uncompressed bytes actually written - (0 in case of error). -*/ - -ZEXTERN int ZEXPORTVA gzprintf OF((gzFile file, const char *format, ...)); -/* - Converts, formats, and writes the args to the compressed file under - control of the format string, as in fprintf. gzprintf returns the number of - uncompressed bytes actually written (0 in case of error). The number of - uncompressed bytes written is limited to 4095. The caller should assure that - this limit is not exceeded. If it is exceeded, then gzprintf() will return - return an error (0) with nothing written. In this case, there may also be a - buffer overflow with unpredictable consequences, which is possible only if - zlib was compiled with the insecure functions sprintf() or vsprintf() - because the secure snprintf() or vsnprintf() functions were not available. -*/ - -ZEXTERN int ZEXPORT gzputs OF((gzFile file, const char *s)); -/* - Writes the given null-terminated string to the compressed file, excluding - the terminating null character. - gzputs returns the number of characters written, or -1 in case of error. -*/ - -ZEXTERN char * ZEXPORT gzgets OF((gzFile file, char *buf, int len)); -/* - Reads bytes from the compressed file until len-1 characters are read, or - a newline character is read and transferred to buf, or an end-of-file - condition is encountered. The string is then terminated with a null - character. - gzgets returns buf, or Z_NULL in case of error. -*/ - -ZEXTERN int ZEXPORT gzputc OF((gzFile file, int c)); -/* - Writes c, converted to an unsigned char, into the compressed file. - gzputc returns the value that was written, or -1 in case of error. -*/ - -ZEXTERN int ZEXPORT gzgetc OF((gzFile file)); -/* - Reads one byte from the compressed file. gzgetc returns this byte - or -1 in case of end of file or error. -*/ - -ZEXTERN int ZEXPORT gzungetc OF((int c, gzFile file)); -/* - Push one character back onto the stream to be read again later. - Only one character of push-back is allowed. gzungetc() returns the - character pushed, or -1 on failure. gzungetc() will fail if a - character has been pushed but not read yet, or if c is -1. The pushed - character will be discarded if the stream is repositioned with gzseek() - or gzrewind(). -*/ - -ZEXTERN int ZEXPORT gzflush OF((gzFile file, int flush)); -/* - Flushes all pending output into the compressed file. The parameter - flush is as in the deflate() function. The return value is the zlib - error number (see function gzerror below). gzflush returns Z_OK if - the flush parameter is Z_FINISH and all output could be flushed. - gzflush should be called only when strictly necessary because it can - degrade compression. -*/ - -ZEXTERN z_off_t ZEXPORT gzseek OF((gzFile file, - z_off_t offset, int whence)); -/* - Sets the starting position for the next gzread or gzwrite on the - given compressed file. The offset represents a number of bytes in the - uncompressed data stream. The whence parameter is defined as in lseek(2); - the value SEEK_END is not supported. - If the file is opened for reading, this function is emulated but can be - extremely slow. If the file is opened for writing, only forward seeks are - supported; gzseek then compresses a sequence of zeroes up to the new - starting position. - - gzseek returns the resulting offset location as measured in bytes from - the beginning of the uncompressed stream, or -1 in case of error, in - particular if the file is opened for writing and the new starting position - would be before the current position. -*/ - -ZEXTERN int ZEXPORT gzrewind OF((gzFile file)); -/* - Rewinds the given file. This function is supported only for reading. - - gzrewind(file) is equivalent to (int)gzseek(file, 0L, SEEK_SET) -*/ - -ZEXTERN z_off_t ZEXPORT gztell OF((gzFile file)); -/* - Returns the starting position for the next gzread or gzwrite on the - given compressed file. This position represents a number of bytes in the - uncompressed data stream. - - gztell(file) is equivalent to gzseek(file, 0L, SEEK_CUR) -*/ - -ZEXTERN int ZEXPORT gzeof OF((gzFile file)); -/* - Returns 1 when EOF has previously been detected reading the given - input stream, otherwise zero. -*/ - -ZEXTERN int ZEXPORT gzclose OF((gzFile file)); -/* - Flushes all pending output if necessary, closes the compressed file - and deallocates all the (de)compression state. The return value is the zlib - error number (see function gzerror below). -*/ - -ZEXTERN const char * ZEXPORT gzerror OF((gzFile file, int *errnum)); -/* - Returns the error message for the last error which occurred on the - given compressed file. errnum is set to zlib error number. If an - error occurred in the file system and not in the compression library, - errnum is set to Z_ERRNO and the application may consult errno - to get the exact error code. -*/ - -ZEXTERN void ZEXPORT gzclearerr OF((gzFile file)); -/* - Clears the error and end-of-file flags for file. This is analogous to the - clearerr() function in stdio. This is useful for continuing to read a gzip - file that is being written concurrently. -*/ - - /* checksum functions */ - -/* - These functions are not related to compression but are exported - anyway because they might be useful in applications using the - compression library. -*/ - -ZEXTERN uLong ZEXPORT adler32 OF((uLong adler, const Bytef *buf, uInt len)); - -/* - Update a running Adler-32 checksum with the bytes buf[0..len-1] and - return the updated checksum. If buf is NULL, this function returns - the required initial value for the checksum. - An Adler-32 checksum is almost as reliable as a CRC32 but can be computed - much faster. Usage example: - - uLong adler = adler32(0L, Z_NULL, 0); - - while (read_buffer(buffer, length) != EOF) { - adler = adler32(adler, buffer, length); - } - if (adler != original_adler) error(); -*/ - -ZEXTERN uLong ZEXPORT crc32 OF((uLong crc, const Bytef *buf, uInt len)); -/* - Update a running crc with the bytes buf[0..len-1] and return the updated - crc. If buf is NULL, this function returns the required initial value - for the crc. Pre- and post-conditioning (one's complement) is performed - within this function so it shouldn't be done by the application. - Usage example: - - uLong crc = crc32(0L, Z_NULL, 0); - - while (read_buffer(buffer, length) != EOF) { - crc = crc32(crc, buffer, length); - } - if (crc != original_crc) error(); -*/ - - - /* various hacks, don't look :) */ - -/* deflateInit and inflateInit are macros to allow checking the zlib version - * and the compiler's view of z_stream: - */ -ZEXTERN int ZEXPORT deflateInit_ OF((z_streamp strm, int level, - const char *version, int stream_size)); -ZEXTERN int ZEXPORT inflateInit_ OF((z_streamp strm, - const char *version, int stream_size)); -ZEXTERN int ZEXPORT deflateInit2_ OF((z_streamp strm, int level, int method, - int windowBits, int memLevel, - int strategy, const char *version, - int stream_size)); -ZEXTERN int ZEXPORT inflateInit2_ OF((z_streamp strm, int windowBits, - const char *version, int stream_size)); -ZEXTERN int ZEXPORT inflateBackInit_ OF((z_stream FAR *strm, int windowBits, - unsigned char FAR *window, - const char *version, - int stream_size)); -#define deflateInit(strm, level) \ - deflateInit_((strm), (level), ZLIB_VERSION, sizeof(z_stream)) -#define inflateInit(strm) \ - inflateInit_((strm), ZLIB_VERSION, sizeof(z_stream)) -#define deflateInit2(strm, level, method, windowBits, memLevel, strategy) \ - deflateInit2_((strm),(level),(method),(windowBits),(memLevel),\ - (strategy), ZLIB_VERSION, sizeof(z_stream)) -#define inflateInit2(strm, windowBits) \ - inflateInit2_((strm), (windowBits), ZLIB_VERSION, sizeof(z_stream)) -#define inflateBackInit(strm, windowBits, window) \ - inflateBackInit_((strm), (windowBits), (window), \ - ZLIB_VERSION, sizeof(z_stream)) - - -#if !defined(ZUTIL_H) && !defined(NO_DUMMY_DECL) - struct internal_state {int dummy;}; /* hack for buggy compilers */ -#endif - -ZEXTERN const char * ZEXPORT zError OF((int)); -ZEXTERN int ZEXPORT inflateSyncPoint OF((z_streamp z)); -ZEXTERN const uLongf * ZEXPORT get_crc_table OF((void)); - -#ifdef __cplusplus -} -#endif - -#endif /* ZLIB_H */ diff --git a/data/nsis/Contrib/nsisunz/zlib/ZUTIL.H b/data/nsis/Contrib/nsisunz/zlib/ZUTIL.H deleted file mode 100644 index 63608b1b0..000000000 --- a/data/nsis/Contrib/nsisunz/zlib/ZUTIL.H +++ /dev/null @@ -1,254 +0,0 @@ -/* zutil.h -- internal interface and configuration of the compression library - * Copyright (C) 1995-2003 Jean-loup Gailly. - * For conditions of distribution and use, see copyright notice in zlib.h - */ - -/* WARNING: this file should *not* be used by applications. It is - part of the implementation of the compression library and is - subject to change. Applications should only use zlib.h. - */ - -/* @(#) $Id$ */ - -#ifndef ZUTIL_H -#define ZUTIL_H - -#define ZLIB_INTERNAL -#include "zlib.h" - -#include "../miniclib.h" - -#ifndef local -# define local static -#endif -/* compile with -Dlocal if your debugger can't find static symbols */ - -typedef unsigned char uch; -typedef uch FAR uchf; -typedef unsigned short ush; -typedef ush FAR ushf; -typedef unsigned long ulg; - -extern const char * const z_errmsg[10]; /* indexed by 2-zlib_error */ -/* (size given to avoid silly warnings with Visual C++) */ - -#define ERR_MSG(err) z_errmsg[Z_NEED_DICT-(err)] - -#define ERR_RETURN(strm,err) \ - return (strm->msg = (char*)ERR_MSG(err), (err)) -/* To be used only when the state is known to be valid */ - - /* common constants */ - -#ifndef DEF_WBITS -# define DEF_WBITS MAX_WBITS -#endif -/* default windowBits for decompression. MAX_WBITS is for compression only */ - -#if MAX_MEM_LEVEL >= 8 -# define DEF_MEM_LEVEL 8 -#else -# define DEF_MEM_LEVEL MAX_MEM_LEVEL -#endif -/* default memLevel */ - -#define STORED_BLOCK 0 -#define STATIC_TREES 1 -#define DYN_TREES 2 -/* The three kinds of block type */ - -#define MIN_MATCH 3 -#define MAX_MATCH 258 -/* The minimum and maximum match lengths */ - -#define PRESET_DICT 0x20 /* preset dictionary flag in zlib header */ - - /* target dependencies */ - -#if defined(MSDOS) || (defined(WINDOWS) && !defined(WIN32)) -# define OS_CODE 0x00 -# if defined(__TURBOC__) || defined(__BORLANDC__) -# if(__STDC__ == 1) && (defined(__LARGE__) || defined(__COMPACT__)) - /* Allow compilation with ANSI keywords only enabled */ - void _Cdecl farfree( void *block ); - void *_Cdecl farmalloc( unsigned long nbytes ); -# else -# include -# endif -# else /* MSC or DJGPP */ -# include -# endif -#endif - -#ifdef AMIGA -# define OS_CODE 0x01 -#endif - -#if defined(VAXC) || defined(VMS) -# define OS_CODE 0x02 -# define F_OPEN(name, mode) \ - fopen((name), (mode), "mbc=60", "ctx=stm", "rfm=fix", "mrs=512") -#endif - -#if defined(ATARI) || defined(atarist) -# define OS_CODE 0x05 -#endif - -#ifdef OS2 -# define OS_CODE 0x06 -#endif - -#if defined(MACOS) || defined(TARGET_OS_MAC) -# define OS_CODE 0x07 -# if defined(__MWERKS__) && __dest_os != __be_os && __dest_os != __win32_os -# include /* for fdopen */ -# else -# ifndef fdopen -# define fdopen(fd,mode) NULL /* No fdopen() */ -# endif -# endif -#endif - -#ifdef TOPS20 -# define OS_CODE 0x0a -#endif - -#ifdef WIN32 -# ifndef __CYGWIN__ /* Cygwin is Unix, not Win32 */ -# define OS_CODE 0x0b -# endif -#endif - -#ifdef __50SERIES /* Prime/PRIMOS */ -# define OS_CODE 0x0f -#endif - -#if defined(_BEOS_) || defined(RISCOS) -# define fdopen(fd,mode) NULL /* No fdopen() */ -#endif - -#if (defined(_MSC_VER) && (_MSC_VER > 600)) -# ifndef _PTRDIFF_T_DEFINED - typedef int ptrdiff_t; -# define _PTRDIFF_T_DEFINED -# endif -# if defined(_WIN32_WCE) -# define fdopen(fd,mode) NULL /* No fdopen() */ -# else -# define fdopen(fd,type) _fdopen(fd,type) -# endif -#endif - - /* common defaults */ - -#ifndef OS_CODE -# define OS_CODE 0x03 /* assume Unix */ -#endif - -#ifndef F_OPEN -# define F_OPEN(name, mode) fopen((name), (mode)) -#endif - - /* functions */ - -#if defined(STDC99) || (defined(__TURBOC__) && __TURBOC__ >= 0x550) -# ifndef HAVE_VSNPRINTF -# define HAVE_VSNPRINTF -# endif -#endif -#if defined(__CYGWIN__) -# ifndef HAVE_VSNPRINTF -# define HAVE_VSNPRINTF -# endif -#endif -#ifndef HAVE_VSNPRINTF -# ifdef MSDOS - /* vsnprintf may exist on some MS-DOS compilers (DJGPP?), - but for now we just assume it doesn't. */ -# define NO_vsnprintf -# endif -# ifdef __TURBOC__ -# define NO_vsnprintf -# endif -# ifdef WIN32 - /* In Win32, vsnprintf is available as the "non-ANSI" _vsnprintf. */ -# if !defined(vsnprintf) && !defined(NO_vsnprintf) -# define vsnprintf _vsnprintf -# endif -# endif -# ifdef __SASC -# define NO_vsnprintf -# endif -#endif -#ifdef VMS -# define NO_vsnprintf -#endif - -#ifdef HAVE_STRERROR -# ifndef VMS - extern char *strerror OF((int)); -# endif -# define zstrerror(errnum) strerror(errnum) -#else -# define zstrerror(errnum) "" -#endif - -#if defined(pyr) -# define NO_MEMCPY -#endif -#if defined(SMALL_MEDIUM) && !defined(_MSC_VER) && !defined(__SC__) - /* Use our own functions for small and medium model with MSC <= 5.0. - * You may have to use the same strategy for Borland C (untested). - * The __SC__ check is for Symantec. - */ -# define NO_MEMCPY -#endif -#if defined(STDC) && !defined(HAVE_MEMCPY) && !defined(NO_MEMCPY) -# define HAVE_MEMCPY -#endif -#ifdef HAVE_MEMCPY -# ifdef SMALL_MEDIUM /* MSDOS small or medium model */ -# define zmemcpy _fmemcpy -# define zmemcmp _fmemcmp -# define zmemzero(dest, len) _fmemset(dest, 0, len) -# else -# define zmemcpy memcpy -# define zmemcmp memcmp -# define zmemzero(dest, len) memset(dest, 0, len) -# endif -#else - extern void zmemcpy OF((Bytef* dest, const Bytef* source, uInt len)); - extern int zmemcmp OF((const Bytef* s1, const Bytef* s2, uInt len)); - extern void zmemzero OF((Bytef* dest, uInt len)); -#endif - -/* Diagnostic functions */ -#ifdef DEBUG -# include - extern int z_verbose; - extern void z_error OF((char *m)); -# define Assert(cond,msg) {if(!(cond)) z_error(msg);} -# define Trace(x) {if (z_verbose>=0) fprintf x ;} -# define Tracev(x) {if (z_verbose>0) fprintf x ;} -# define Tracevv(x) {if (z_verbose>1) fprintf x ;} -# define Tracec(c,x) {if (z_verbose>0 && (c)) fprintf x ;} -# define Tracecv(c,x) {if (z_verbose>1 && (c)) fprintf x ;} -#else -# define Assert(cond,msg) -# define Trace(x) -# define Tracev(x) -# define Tracevv(x) -# define Tracec(c,x) -# define Tracecv(c,x) -#endif - - -voidpf zcalloc OF((voidpf opaque, unsigned items, unsigned size)); -void zcfree OF((voidpf opaque, voidpf ptr)); - -#define ZALLOC(strm, items, size) \ - (*((strm)->zalloc))((strm)->opaque, (items), (size)) -#define ZFREE(strm, addr) (*((strm)->zfree))((strm)->opaque, (voidpf)(addr)) -#define TRY_FREE(s, p) {if (p) ZFREE(s, p);} - -#endif /* ZUTIL_H */ diff --git a/data/nsis/Contrib/nsisunz/zlib/Zutil.c b/data/nsis/Contrib/nsisunz/zlib/Zutil.c deleted file mode 100644 index 1ce26127f..000000000 --- a/data/nsis/Contrib/nsisunz/zlib/Zutil.c +++ /dev/null @@ -1,44 +0,0 @@ -/* zutil.c -- target dependent utility functions for the compression library - * Copyright (C) 1995-2003 Jean-loup Gailly. - * For conditions of distribution and use, see copyright notice in zlib.h - */ - -/* @(#) $Id$ */ - -#include "zutil.h" - - -const char * const z_errmsg[10] = { -"need dictionary", /* Z_NEED_DICT 2 */ -"stream end", /* Z_STREAM_END 1 */ -"", /* Z_OK 0 */ -"file error", /* Z_ERRNO (-1) */ -"stream error", /* Z_STREAM_ERROR (-2) */ -"data error", /* Z_DATA_ERROR (-3) */ -"insufficient memory", /* Z_MEM_ERROR (-4) */ -"buffer error", /* Z_BUF_ERROR (-5) */ -"incompatible version",/* Z_VERSION_ERROR (-6) */ -""}; - - -#ifndef MY_ZCALLOC /* Any system without a special alloc function */ - -voidpf zcalloc (opaque, items, size) - voidpf opaque; - unsigned items; - unsigned size; -{ - if (opaque) items += size - size; /* make compiler happy */ - return sizeof(uInt) > 2 ? (voidpf)malloc(items * size) : - (voidpf)calloc(items, size); -} - -void zcfree (opaque, ptr) - voidpf opaque; - voidpf ptr; -{ - free(ptr); - if (opaque) return; /* make compiler happy */ -} - -#endif /* MY_ZCALLOC */ diff --git a/data/nsis/Contrib/nsisunz/zlib/crc32.h b/data/nsis/Contrib/nsisunz/zlib/crc32.h deleted file mode 100644 index 8053b6117..000000000 --- a/data/nsis/Contrib/nsisunz/zlib/crc32.h +++ /dev/null @@ -1,441 +0,0 @@ -/* crc32.h -- tables for rapid CRC calculation - * Generated automatically by crc32.c - */ - -local const unsigned long FAR crc_table[TBLS][256] = -{ - { - 0x00000000UL, 0x77073096UL, 0xee0e612cUL, 0x990951baUL, 0x076dc419UL, - 0x706af48fUL, 0xe963a535UL, 0x9e6495a3UL, 0x0edb8832UL, 0x79dcb8a4UL, - 0xe0d5e91eUL, 0x97d2d988UL, 0x09b64c2bUL, 0x7eb17cbdUL, 0xe7b82d07UL, - 0x90bf1d91UL, 0x1db71064UL, 0x6ab020f2UL, 0xf3b97148UL, 0x84be41deUL, - 0x1adad47dUL, 0x6ddde4ebUL, 0xf4d4b551UL, 0x83d385c7UL, 0x136c9856UL, - 0x646ba8c0UL, 0xfd62f97aUL, 0x8a65c9ecUL, 0x14015c4fUL, 0x63066cd9UL, - 0xfa0f3d63UL, 0x8d080df5UL, 0x3b6e20c8UL, 0x4c69105eUL, 0xd56041e4UL, - 0xa2677172UL, 0x3c03e4d1UL, 0x4b04d447UL, 0xd20d85fdUL, 0xa50ab56bUL, - 0x35b5a8faUL, 0x42b2986cUL, 0xdbbbc9d6UL, 0xacbcf940UL, 0x32d86ce3UL, - 0x45df5c75UL, 0xdcd60dcfUL, 0xabd13d59UL, 0x26d930acUL, 0x51de003aUL, - 0xc8d75180UL, 0xbfd06116UL, 0x21b4f4b5UL, 0x56b3c423UL, 0xcfba9599UL, - 0xb8bda50fUL, 0x2802b89eUL, 0x5f058808UL, 0xc60cd9b2UL, 0xb10be924UL, - 0x2f6f7c87UL, 0x58684c11UL, 0xc1611dabUL, 0xb6662d3dUL, 0x76dc4190UL, - 0x01db7106UL, 0x98d220bcUL, 0xefd5102aUL, 0x71b18589UL, 0x06b6b51fUL, - 0x9fbfe4a5UL, 0xe8b8d433UL, 0x7807c9a2UL, 0x0f00f934UL, 0x9609a88eUL, - 0xe10e9818UL, 0x7f6a0dbbUL, 0x086d3d2dUL, 0x91646c97UL, 0xe6635c01UL, - 0x6b6b51f4UL, 0x1c6c6162UL, 0x856530d8UL, 0xf262004eUL, 0x6c0695edUL, - 0x1b01a57bUL, 0x8208f4c1UL, 0xf50fc457UL, 0x65b0d9c6UL, 0x12b7e950UL, - 0x8bbeb8eaUL, 0xfcb9887cUL, 0x62dd1ddfUL, 0x15da2d49UL, 0x8cd37cf3UL, - 0xfbd44c65UL, 0x4db26158UL, 0x3ab551ceUL, 0xa3bc0074UL, 0xd4bb30e2UL, - 0x4adfa541UL, 0x3dd895d7UL, 0xa4d1c46dUL, 0xd3d6f4fbUL, 0x4369e96aUL, - 0x346ed9fcUL, 0xad678846UL, 0xda60b8d0UL, 0x44042d73UL, 0x33031de5UL, - 0xaa0a4c5fUL, 0xdd0d7cc9UL, 0x5005713cUL, 0x270241aaUL, 0xbe0b1010UL, - 0xc90c2086UL, 0x5768b525UL, 0x206f85b3UL, 0xb966d409UL, 0xce61e49fUL, - 0x5edef90eUL, 0x29d9c998UL, 0xb0d09822UL, 0xc7d7a8b4UL, 0x59b33d17UL, - 0x2eb40d81UL, 0xb7bd5c3bUL, 0xc0ba6cadUL, 0xedb88320UL, 0x9abfb3b6UL, - 0x03b6e20cUL, 0x74b1d29aUL, 0xead54739UL, 0x9dd277afUL, 0x04db2615UL, - 0x73dc1683UL, 0xe3630b12UL, 0x94643b84UL, 0x0d6d6a3eUL, 0x7a6a5aa8UL, - 0xe40ecf0bUL, 0x9309ff9dUL, 0x0a00ae27UL, 0x7d079eb1UL, 0xf00f9344UL, - 0x8708a3d2UL, 0x1e01f268UL, 0x6906c2feUL, 0xf762575dUL, 0x806567cbUL, - 0x196c3671UL, 0x6e6b06e7UL, 0xfed41b76UL, 0x89d32be0UL, 0x10da7a5aUL, - 0x67dd4accUL, 0xf9b9df6fUL, 0x8ebeeff9UL, 0x17b7be43UL, 0x60b08ed5UL, - 0xd6d6a3e8UL, 0xa1d1937eUL, 0x38d8c2c4UL, 0x4fdff252UL, 0xd1bb67f1UL, - 0xa6bc5767UL, 0x3fb506ddUL, 0x48b2364bUL, 0xd80d2bdaUL, 0xaf0a1b4cUL, - 0x36034af6UL, 0x41047a60UL, 0xdf60efc3UL, 0xa867df55UL, 0x316e8eefUL, - 0x4669be79UL, 0xcb61b38cUL, 0xbc66831aUL, 0x256fd2a0UL, 0x5268e236UL, - 0xcc0c7795UL, 0xbb0b4703UL, 0x220216b9UL, 0x5505262fUL, 0xc5ba3bbeUL, - 0xb2bd0b28UL, 0x2bb45a92UL, 0x5cb36a04UL, 0xc2d7ffa7UL, 0xb5d0cf31UL, - 0x2cd99e8bUL, 0x5bdeae1dUL, 0x9b64c2b0UL, 0xec63f226UL, 0x756aa39cUL, - 0x026d930aUL, 0x9c0906a9UL, 0xeb0e363fUL, 0x72076785UL, 0x05005713UL, - 0x95bf4a82UL, 0xe2b87a14UL, 0x7bb12baeUL, 0x0cb61b38UL, 0x92d28e9bUL, - 0xe5d5be0dUL, 0x7cdcefb7UL, 0x0bdbdf21UL, 0x86d3d2d4UL, 0xf1d4e242UL, - 0x68ddb3f8UL, 0x1fda836eUL, 0x81be16cdUL, 0xf6b9265bUL, 0x6fb077e1UL, - 0x18b74777UL, 0x88085ae6UL, 0xff0f6a70UL, 0x66063bcaUL, 0x11010b5cUL, - 0x8f659effUL, 0xf862ae69UL, 0x616bffd3UL, 0x166ccf45UL, 0xa00ae278UL, - 0xd70dd2eeUL, 0x4e048354UL, 0x3903b3c2UL, 0xa7672661UL, 0xd06016f7UL, - 0x4969474dUL, 0x3e6e77dbUL, 0xaed16a4aUL, 0xd9d65adcUL, 0x40df0b66UL, - 0x37d83bf0UL, 0xa9bcae53UL, 0xdebb9ec5UL, 0x47b2cf7fUL, 0x30b5ffe9UL, - 0xbdbdf21cUL, 0xcabac28aUL, 0x53b39330UL, 0x24b4a3a6UL, 0xbad03605UL, - 0xcdd70693UL, 0x54de5729UL, 0x23d967bfUL, 0xb3667a2eUL, 0xc4614ab8UL, - 0x5d681b02UL, 0x2a6f2b94UL, 0xb40bbe37UL, 0xc30c8ea1UL, 0x5a05df1bUL, - 0x2d02ef8dUL -#ifdef BYFOUR - }, - { - 0x00000000UL, 0x191b3141UL, 0x32366282UL, 0x2b2d53c3UL, 0x646cc504UL, - 0x7d77f445UL, 0x565aa786UL, 0x4f4196c7UL, 0xc8d98a08UL, 0xd1c2bb49UL, - 0xfaefe88aUL, 0xe3f4d9cbUL, 0xacb54f0cUL, 0xb5ae7e4dUL, 0x9e832d8eUL, - 0x87981ccfUL, 0x4ac21251UL, 0x53d92310UL, 0x78f470d3UL, 0x61ef4192UL, - 0x2eaed755UL, 0x37b5e614UL, 0x1c98b5d7UL, 0x05838496UL, 0x821b9859UL, - 0x9b00a918UL, 0xb02dfadbUL, 0xa936cb9aUL, 0xe6775d5dUL, 0xff6c6c1cUL, - 0xd4413fdfUL, 0xcd5a0e9eUL, 0x958424a2UL, 0x8c9f15e3UL, 0xa7b24620UL, - 0xbea97761UL, 0xf1e8e1a6UL, 0xe8f3d0e7UL, 0xc3de8324UL, 0xdac5b265UL, - 0x5d5daeaaUL, 0x44469febUL, 0x6f6bcc28UL, 0x7670fd69UL, 0x39316baeUL, - 0x202a5aefUL, 0x0b07092cUL, 0x121c386dUL, 0xdf4636f3UL, 0xc65d07b2UL, - 0xed705471UL, 0xf46b6530UL, 0xbb2af3f7UL, 0xa231c2b6UL, 0x891c9175UL, - 0x9007a034UL, 0x179fbcfbUL, 0x0e848dbaUL, 0x25a9de79UL, 0x3cb2ef38UL, - 0x73f379ffUL, 0x6ae848beUL, 0x41c51b7dUL, 0x58de2a3cUL, 0xf0794f05UL, - 0xe9627e44UL, 0xc24f2d87UL, 0xdb541cc6UL, 0x94158a01UL, 0x8d0ebb40UL, - 0xa623e883UL, 0xbf38d9c2UL, 0x38a0c50dUL, 0x21bbf44cUL, 0x0a96a78fUL, - 0x138d96ceUL, 0x5ccc0009UL, 0x45d73148UL, 0x6efa628bUL, 0x77e153caUL, - 0xbabb5d54UL, 0xa3a06c15UL, 0x888d3fd6UL, 0x91960e97UL, 0xded79850UL, - 0xc7cca911UL, 0xece1fad2UL, 0xf5facb93UL, 0x7262d75cUL, 0x6b79e61dUL, - 0x4054b5deUL, 0x594f849fUL, 0x160e1258UL, 0x0f152319UL, 0x243870daUL, - 0x3d23419bUL, 0x65fd6ba7UL, 0x7ce65ae6UL, 0x57cb0925UL, 0x4ed03864UL, - 0x0191aea3UL, 0x188a9fe2UL, 0x33a7cc21UL, 0x2abcfd60UL, 0xad24e1afUL, - 0xb43fd0eeUL, 0x9f12832dUL, 0x8609b26cUL, 0xc94824abUL, 0xd05315eaUL, - 0xfb7e4629UL, 0xe2657768UL, 0x2f3f79f6UL, 0x362448b7UL, 0x1d091b74UL, - 0x04122a35UL, 0x4b53bcf2UL, 0x52488db3UL, 0x7965de70UL, 0x607eef31UL, - 0xe7e6f3feUL, 0xfefdc2bfUL, 0xd5d0917cUL, 0xcccba03dUL, 0x838a36faUL, - 0x9a9107bbUL, 0xb1bc5478UL, 0xa8a76539UL, 0x3b83984bUL, 0x2298a90aUL, - 0x09b5fac9UL, 0x10aecb88UL, 0x5fef5d4fUL, 0x46f46c0eUL, 0x6dd93fcdUL, - 0x74c20e8cUL, 0xf35a1243UL, 0xea412302UL, 0xc16c70c1UL, 0xd8774180UL, - 0x9736d747UL, 0x8e2de606UL, 0xa500b5c5UL, 0xbc1b8484UL, 0x71418a1aUL, - 0x685abb5bUL, 0x4377e898UL, 0x5a6cd9d9UL, 0x152d4f1eUL, 0x0c367e5fUL, - 0x271b2d9cUL, 0x3e001cddUL, 0xb9980012UL, 0xa0833153UL, 0x8bae6290UL, - 0x92b553d1UL, 0xddf4c516UL, 0xc4eff457UL, 0xefc2a794UL, 0xf6d996d5UL, - 0xae07bce9UL, 0xb71c8da8UL, 0x9c31de6bUL, 0x852aef2aUL, 0xca6b79edUL, - 0xd37048acUL, 0xf85d1b6fUL, 0xe1462a2eUL, 0x66de36e1UL, 0x7fc507a0UL, - 0x54e85463UL, 0x4df36522UL, 0x02b2f3e5UL, 0x1ba9c2a4UL, 0x30849167UL, - 0x299fa026UL, 0xe4c5aeb8UL, 0xfdde9ff9UL, 0xd6f3cc3aUL, 0xcfe8fd7bUL, - 0x80a96bbcUL, 0x99b25afdUL, 0xb29f093eUL, 0xab84387fUL, 0x2c1c24b0UL, - 0x350715f1UL, 0x1e2a4632UL, 0x07317773UL, 0x4870e1b4UL, 0x516bd0f5UL, - 0x7a468336UL, 0x635db277UL, 0xcbfad74eUL, 0xd2e1e60fUL, 0xf9ccb5ccUL, - 0xe0d7848dUL, 0xaf96124aUL, 0xb68d230bUL, 0x9da070c8UL, 0x84bb4189UL, - 0x03235d46UL, 0x1a386c07UL, 0x31153fc4UL, 0x280e0e85UL, 0x674f9842UL, - 0x7e54a903UL, 0x5579fac0UL, 0x4c62cb81UL, 0x8138c51fUL, 0x9823f45eUL, - 0xb30ea79dUL, 0xaa1596dcUL, 0xe554001bUL, 0xfc4f315aUL, 0xd7626299UL, - 0xce7953d8UL, 0x49e14f17UL, 0x50fa7e56UL, 0x7bd72d95UL, 0x62cc1cd4UL, - 0x2d8d8a13UL, 0x3496bb52UL, 0x1fbbe891UL, 0x06a0d9d0UL, 0x5e7ef3ecUL, - 0x4765c2adUL, 0x6c48916eUL, 0x7553a02fUL, 0x3a1236e8UL, 0x230907a9UL, - 0x0824546aUL, 0x113f652bUL, 0x96a779e4UL, 0x8fbc48a5UL, 0xa4911b66UL, - 0xbd8a2a27UL, 0xf2cbbce0UL, 0xebd08da1UL, 0xc0fdde62UL, 0xd9e6ef23UL, - 0x14bce1bdUL, 0x0da7d0fcUL, 0x268a833fUL, 0x3f91b27eUL, 0x70d024b9UL, - 0x69cb15f8UL, 0x42e6463bUL, 0x5bfd777aUL, 0xdc656bb5UL, 0xc57e5af4UL, - 0xee530937UL, 0xf7483876UL, 0xb809aeb1UL, 0xa1129ff0UL, 0x8a3fcc33UL, - 0x9324fd72UL - }, - { - 0x00000000UL, 0x01c26a37UL, 0x0384d46eUL, 0x0246be59UL, 0x0709a8dcUL, - 0x06cbc2ebUL, 0x048d7cb2UL, 0x054f1685UL, 0x0e1351b8UL, 0x0fd13b8fUL, - 0x0d9785d6UL, 0x0c55efe1UL, 0x091af964UL, 0x08d89353UL, 0x0a9e2d0aUL, - 0x0b5c473dUL, 0x1c26a370UL, 0x1de4c947UL, 0x1fa2771eUL, 0x1e601d29UL, - 0x1b2f0bacUL, 0x1aed619bUL, 0x18abdfc2UL, 0x1969b5f5UL, 0x1235f2c8UL, - 0x13f798ffUL, 0x11b126a6UL, 0x10734c91UL, 0x153c5a14UL, 0x14fe3023UL, - 0x16b88e7aUL, 0x177ae44dUL, 0x384d46e0UL, 0x398f2cd7UL, 0x3bc9928eUL, - 0x3a0bf8b9UL, 0x3f44ee3cUL, 0x3e86840bUL, 0x3cc03a52UL, 0x3d025065UL, - 0x365e1758UL, 0x379c7d6fUL, 0x35dac336UL, 0x3418a901UL, 0x3157bf84UL, - 0x3095d5b3UL, 0x32d36beaUL, 0x331101ddUL, 0x246be590UL, 0x25a98fa7UL, - 0x27ef31feUL, 0x262d5bc9UL, 0x23624d4cUL, 0x22a0277bUL, 0x20e69922UL, - 0x2124f315UL, 0x2a78b428UL, 0x2bbade1fUL, 0x29fc6046UL, 0x283e0a71UL, - 0x2d711cf4UL, 0x2cb376c3UL, 0x2ef5c89aUL, 0x2f37a2adUL, 0x709a8dc0UL, - 0x7158e7f7UL, 0x731e59aeUL, 0x72dc3399UL, 0x7793251cUL, 0x76514f2bUL, - 0x7417f172UL, 0x75d59b45UL, 0x7e89dc78UL, 0x7f4bb64fUL, 0x7d0d0816UL, - 0x7ccf6221UL, 0x798074a4UL, 0x78421e93UL, 0x7a04a0caUL, 0x7bc6cafdUL, - 0x6cbc2eb0UL, 0x6d7e4487UL, 0x6f38fadeUL, 0x6efa90e9UL, 0x6bb5866cUL, - 0x6a77ec5bUL, 0x68315202UL, 0x69f33835UL, 0x62af7f08UL, 0x636d153fUL, - 0x612bab66UL, 0x60e9c151UL, 0x65a6d7d4UL, 0x6464bde3UL, 0x662203baUL, - 0x67e0698dUL, 0x48d7cb20UL, 0x4915a117UL, 0x4b531f4eUL, 0x4a917579UL, - 0x4fde63fcUL, 0x4e1c09cbUL, 0x4c5ab792UL, 0x4d98dda5UL, 0x46c49a98UL, - 0x4706f0afUL, 0x45404ef6UL, 0x448224c1UL, 0x41cd3244UL, 0x400f5873UL, - 0x4249e62aUL, 0x438b8c1dUL, 0x54f16850UL, 0x55330267UL, 0x5775bc3eUL, - 0x56b7d609UL, 0x53f8c08cUL, 0x523aaabbUL, 0x507c14e2UL, 0x51be7ed5UL, - 0x5ae239e8UL, 0x5b2053dfUL, 0x5966ed86UL, 0x58a487b1UL, 0x5deb9134UL, - 0x5c29fb03UL, 0x5e6f455aUL, 0x5fad2f6dUL, 0xe1351b80UL, 0xe0f771b7UL, - 0xe2b1cfeeUL, 0xe373a5d9UL, 0xe63cb35cUL, 0xe7fed96bUL, 0xe5b86732UL, - 0xe47a0d05UL, 0xef264a38UL, 0xeee4200fUL, 0xeca29e56UL, 0xed60f461UL, - 0xe82fe2e4UL, 0xe9ed88d3UL, 0xebab368aUL, 0xea695cbdUL, 0xfd13b8f0UL, - 0xfcd1d2c7UL, 0xfe976c9eUL, 0xff5506a9UL, 0xfa1a102cUL, 0xfbd87a1bUL, - 0xf99ec442UL, 0xf85cae75UL, 0xf300e948UL, 0xf2c2837fUL, 0xf0843d26UL, - 0xf1465711UL, 0xf4094194UL, 0xf5cb2ba3UL, 0xf78d95faUL, 0xf64fffcdUL, - 0xd9785d60UL, 0xd8ba3757UL, 0xdafc890eUL, 0xdb3ee339UL, 0xde71f5bcUL, - 0xdfb39f8bUL, 0xddf521d2UL, 0xdc374be5UL, 0xd76b0cd8UL, 0xd6a966efUL, - 0xd4efd8b6UL, 0xd52db281UL, 0xd062a404UL, 0xd1a0ce33UL, 0xd3e6706aUL, - 0xd2241a5dUL, 0xc55efe10UL, 0xc49c9427UL, 0xc6da2a7eUL, 0xc7184049UL, - 0xc25756ccUL, 0xc3953cfbUL, 0xc1d382a2UL, 0xc011e895UL, 0xcb4dafa8UL, - 0xca8fc59fUL, 0xc8c97bc6UL, 0xc90b11f1UL, 0xcc440774UL, 0xcd866d43UL, - 0xcfc0d31aUL, 0xce02b92dUL, 0x91af9640UL, 0x906dfc77UL, 0x922b422eUL, - 0x93e92819UL, 0x96a63e9cUL, 0x976454abUL, 0x9522eaf2UL, 0x94e080c5UL, - 0x9fbcc7f8UL, 0x9e7eadcfUL, 0x9c381396UL, 0x9dfa79a1UL, 0x98b56f24UL, - 0x99770513UL, 0x9b31bb4aUL, 0x9af3d17dUL, 0x8d893530UL, 0x8c4b5f07UL, - 0x8e0de15eUL, 0x8fcf8b69UL, 0x8a809decUL, 0x8b42f7dbUL, 0x89044982UL, - 0x88c623b5UL, 0x839a6488UL, 0x82580ebfUL, 0x801eb0e6UL, 0x81dcdad1UL, - 0x8493cc54UL, 0x8551a663UL, 0x8717183aUL, 0x86d5720dUL, 0xa9e2d0a0UL, - 0xa820ba97UL, 0xaa6604ceUL, 0xaba46ef9UL, 0xaeeb787cUL, 0xaf29124bUL, - 0xad6fac12UL, 0xacadc625UL, 0xa7f18118UL, 0xa633eb2fUL, 0xa4755576UL, - 0xa5b73f41UL, 0xa0f829c4UL, 0xa13a43f3UL, 0xa37cfdaaUL, 0xa2be979dUL, - 0xb5c473d0UL, 0xb40619e7UL, 0xb640a7beUL, 0xb782cd89UL, 0xb2cddb0cUL, - 0xb30fb13bUL, 0xb1490f62UL, 0xb08b6555UL, 0xbbd72268UL, 0xba15485fUL, - 0xb853f606UL, 0xb9919c31UL, 0xbcde8ab4UL, 0xbd1ce083UL, 0xbf5a5edaUL, - 0xbe9834edUL - }, - { - 0x00000000UL, 0xb8bc6765UL, 0xaa09c88bUL, 0x12b5afeeUL, 0x8f629757UL, - 0x37def032UL, 0x256b5fdcUL, 0x9dd738b9UL, 0xc5b428efUL, 0x7d084f8aUL, - 0x6fbde064UL, 0xd7018701UL, 0x4ad6bfb8UL, 0xf26ad8ddUL, 0xe0df7733UL, - 0x58631056UL, 0x5019579fUL, 0xe8a530faUL, 0xfa109f14UL, 0x42acf871UL, - 0xdf7bc0c8UL, 0x67c7a7adUL, 0x75720843UL, 0xcdce6f26UL, 0x95ad7f70UL, - 0x2d111815UL, 0x3fa4b7fbUL, 0x8718d09eUL, 0x1acfe827UL, 0xa2738f42UL, - 0xb0c620acUL, 0x087a47c9UL, 0xa032af3eUL, 0x188ec85bUL, 0x0a3b67b5UL, - 0xb28700d0UL, 0x2f503869UL, 0x97ec5f0cUL, 0x8559f0e2UL, 0x3de59787UL, - 0x658687d1UL, 0xdd3ae0b4UL, 0xcf8f4f5aUL, 0x7733283fUL, 0xeae41086UL, - 0x525877e3UL, 0x40edd80dUL, 0xf851bf68UL, 0xf02bf8a1UL, 0x48979fc4UL, - 0x5a22302aUL, 0xe29e574fUL, 0x7f496ff6UL, 0xc7f50893UL, 0xd540a77dUL, - 0x6dfcc018UL, 0x359fd04eUL, 0x8d23b72bUL, 0x9f9618c5UL, 0x272a7fa0UL, - 0xbafd4719UL, 0x0241207cUL, 0x10f48f92UL, 0xa848e8f7UL, 0x9b14583dUL, - 0x23a83f58UL, 0x311d90b6UL, 0x89a1f7d3UL, 0x1476cf6aUL, 0xaccaa80fUL, - 0xbe7f07e1UL, 0x06c36084UL, 0x5ea070d2UL, 0xe61c17b7UL, 0xf4a9b859UL, - 0x4c15df3cUL, 0xd1c2e785UL, 0x697e80e0UL, 0x7bcb2f0eUL, 0xc377486bUL, - 0xcb0d0fa2UL, 0x73b168c7UL, 0x6104c729UL, 0xd9b8a04cUL, 0x446f98f5UL, - 0xfcd3ff90UL, 0xee66507eUL, 0x56da371bUL, 0x0eb9274dUL, 0xb6054028UL, - 0xa4b0efc6UL, 0x1c0c88a3UL, 0x81dbb01aUL, 0x3967d77fUL, 0x2bd27891UL, - 0x936e1ff4UL, 0x3b26f703UL, 0x839a9066UL, 0x912f3f88UL, 0x299358edUL, - 0xb4446054UL, 0x0cf80731UL, 0x1e4da8dfUL, 0xa6f1cfbaUL, 0xfe92dfecUL, - 0x462eb889UL, 0x549b1767UL, 0xec277002UL, 0x71f048bbUL, 0xc94c2fdeUL, - 0xdbf98030UL, 0x6345e755UL, 0x6b3fa09cUL, 0xd383c7f9UL, 0xc1366817UL, - 0x798a0f72UL, 0xe45d37cbUL, 0x5ce150aeUL, 0x4e54ff40UL, 0xf6e89825UL, - 0xae8b8873UL, 0x1637ef16UL, 0x048240f8UL, 0xbc3e279dUL, 0x21e91f24UL, - 0x99557841UL, 0x8be0d7afUL, 0x335cb0caUL, 0xed59b63bUL, 0x55e5d15eUL, - 0x47507eb0UL, 0xffec19d5UL, 0x623b216cUL, 0xda874609UL, 0xc832e9e7UL, - 0x708e8e82UL, 0x28ed9ed4UL, 0x9051f9b1UL, 0x82e4565fUL, 0x3a58313aUL, - 0xa78f0983UL, 0x1f336ee6UL, 0x0d86c108UL, 0xb53aa66dUL, 0xbd40e1a4UL, - 0x05fc86c1UL, 0x1749292fUL, 0xaff54e4aUL, 0x322276f3UL, 0x8a9e1196UL, - 0x982bbe78UL, 0x2097d91dUL, 0x78f4c94bUL, 0xc048ae2eUL, 0xd2fd01c0UL, - 0x6a4166a5UL, 0xf7965e1cUL, 0x4f2a3979UL, 0x5d9f9697UL, 0xe523f1f2UL, - 0x4d6b1905UL, 0xf5d77e60UL, 0xe762d18eUL, 0x5fdeb6ebUL, 0xc2098e52UL, - 0x7ab5e937UL, 0x680046d9UL, 0xd0bc21bcUL, 0x88df31eaUL, 0x3063568fUL, - 0x22d6f961UL, 0x9a6a9e04UL, 0x07bda6bdUL, 0xbf01c1d8UL, 0xadb46e36UL, - 0x15080953UL, 0x1d724e9aUL, 0xa5ce29ffUL, 0xb77b8611UL, 0x0fc7e174UL, - 0x9210d9cdUL, 0x2aacbea8UL, 0x38191146UL, 0x80a57623UL, 0xd8c66675UL, - 0x607a0110UL, 0x72cfaefeUL, 0xca73c99bUL, 0x57a4f122UL, 0xef189647UL, - 0xfdad39a9UL, 0x45115eccUL, 0x764dee06UL, 0xcef18963UL, 0xdc44268dUL, - 0x64f841e8UL, 0xf92f7951UL, 0x41931e34UL, 0x5326b1daUL, 0xeb9ad6bfUL, - 0xb3f9c6e9UL, 0x0b45a18cUL, 0x19f00e62UL, 0xa14c6907UL, 0x3c9b51beUL, - 0x842736dbUL, 0x96929935UL, 0x2e2efe50UL, 0x2654b999UL, 0x9ee8defcUL, - 0x8c5d7112UL, 0x34e11677UL, 0xa9362eceUL, 0x118a49abUL, 0x033fe645UL, - 0xbb838120UL, 0xe3e09176UL, 0x5b5cf613UL, 0x49e959fdUL, 0xf1553e98UL, - 0x6c820621UL, 0xd43e6144UL, 0xc68bceaaUL, 0x7e37a9cfUL, 0xd67f4138UL, - 0x6ec3265dUL, 0x7c7689b3UL, 0xc4caeed6UL, 0x591dd66fUL, 0xe1a1b10aUL, - 0xf3141ee4UL, 0x4ba87981UL, 0x13cb69d7UL, 0xab770eb2UL, 0xb9c2a15cUL, - 0x017ec639UL, 0x9ca9fe80UL, 0x241599e5UL, 0x36a0360bUL, 0x8e1c516eUL, - 0x866616a7UL, 0x3eda71c2UL, 0x2c6fde2cUL, 0x94d3b949UL, 0x090481f0UL, - 0xb1b8e695UL, 0xa30d497bUL, 0x1bb12e1eUL, 0x43d23e48UL, 0xfb6e592dUL, - 0xe9dbf6c3UL, 0x516791a6UL, 0xccb0a91fUL, 0x740cce7aUL, 0x66b96194UL, - 0xde0506f1UL - }, - { - 0x00000000UL, 0x96300777UL, 0x2c610eeeUL, 0xba510999UL, 0x19c46d07UL, - 0x8ff46a70UL, 0x35a563e9UL, 0xa395649eUL, 0x3288db0eUL, 0xa4b8dc79UL, - 0x1ee9d5e0UL, 0x88d9d297UL, 0x2b4cb609UL, 0xbd7cb17eUL, 0x072db8e7UL, - 0x911dbf90UL, 0x6410b71dUL, 0xf220b06aUL, 0x4871b9f3UL, 0xde41be84UL, - 0x7dd4da1aUL, 0xebe4dd6dUL, 0x51b5d4f4UL, 0xc785d383UL, 0x56986c13UL, - 0xc0a86b64UL, 0x7af962fdUL, 0xecc9658aUL, 0x4f5c0114UL, 0xd96c0663UL, - 0x633d0ffaUL, 0xf50d088dUL, 0xc8206e3bUL, 0x5e10694cUL, 0xe44160d5UL, - 0x727167a2UL, 0xd1e4033cUL, 0x47d4044bUL, 0xfd850dd2UL, 0x6bb50aa5UL, - 0xfaa8b535UL, 0x6c98b242UL, 0xd6c9bbdbUL, 0x40f9bcacUL, 0xe36cd832UL, - 0x755cdf45UL, 0xcf0dd6dcUL, 0x593dd1abUL, 0xac30d926UL, 0x3a00de51UL, - 0x8051d7c8UL, 0x1661d0bfUL, 0xb5f4b421UL, 0x23c4b356UL, 0x9995bacfUL, - 0x0fa5bdb8UL, 0x9eb80228UL, 0x0888055fUL, 0xb2d90cc6UL, 0x24e90bb1UL, - 0x877c6f2fUL, 0x114c6858UL, 0xab1d61c1UL, 0x3d2d66b6UL, 0x9041dc76UL, - 0x0671db01UL, 0xbc20d298UL, 0x2a10d5efUL, 0x8985b171UL, 0x1fb5b606UL, - 0xa5e4bf9fUL, 0x33d4b8e8UL, 0xa2c90778UL, 0x34f9000fUL, 0x8ea80996UL, - 0x18980ee1UL, 0xbb0d6a7fUL, 0x2d3d6d08UL, 0x976c6491UL, 0x015c63e6UL, - 0xf4516b6bUL, 0x62616c1cUL, 0xd8306585UL, 0x4e0062f2UL, 0xed95066cUL, - 0x7ba5011bUL, 0xc1f40882UL, 0x57c40ff5UL, 0xc6d9b065UL, 0x50e9b712UL, - 0xeab8be8bUL, 0x7c88b9fcUL, 0xdf1ddd62UL, 0x492dda15UL, 0xf37cd38cUL, - 0x654cd4fbUL, 0x5861b24dUL, 0xce51b53aUL, 0x7400bca3UL, 0xe230bbd4UL, - 0x41a5df4aUL, 0xd795d83dUL, 0x6dc4d1a4UL, 0xfbf4d6d3UL, 0x6ae96943UL, - 0xfcd96e34UL, 0x468867adUL, 0xd0b860daUL, 0x732d0444UL, 0xe51d0333UL, - 0x5f4c0aaaUL, 0xc97c0dddUL, 0x3c710550UL, 0xaa410227UL, 0x10100bbeUL, - 0x86200cc9UL, 0x25b56857UL, 0xb3856f20UL, 0x09d466b9UL, 0x9fe461ceUL, - 0x0ef9de5eUL, 0x98c9d929UL, 0x2298d0b0UL, 0xb4a8d7c7UL, 0x173db359UL, - 0x810db42eUL, 0x3b5cbdb7UL, 0xad6cbac0UL, 0x2083b8edUL, 0xb6b3bf9aUL, - 0x0ce2b603UL, 0x9ad2b174UL, 0x3947d5eaUL, 0xaf77d29dUL, 0x1526db04UL, - 0x8316dc73UL, 0x120b63e3UL, 0x843b6494UL, 0x3e6a6d0dUL, 0xa85a6a7aUL, - 0x0bcf0ee4UL, 0x9dff0993UL, 0x27ae000aUL, 0xb19e077dUL, 0x44930ff0UL, - 0xd2a30887UL, 0x68f2011eUL, 0xfec20669UL, 0x5d5762f7UL, 0xcb676580UL, - 0x71366c19UL, 0xe7066b6eUL, 0x761bd4feUL, 0xe02bd389UL, 0x5a7ada10UL, - 0xcc4add67UL, 0x6fdfb9f9UL, 0xf9efbe8eUL, 0x43beb717UL, 0xd58eb060UL, - 0xe8a3d6d6UL, 0x7e93d1a1UL, 0xc4c2d838UL, 0x52f2df4fUL, 0xf167bbd1UL, - 0x6757bca6UL, 0xdd06b53fUL, 0x4b36b248UL, 0xda2b0dd8UL, 0x4c1b0aafUL, - 0xf64a0336UL, 0x607a0441UL, 0xc3ef60dfUL, 0x55df67a8UL, 0xef8e6e31UL, - 0x79be6946UL, 0x8cb361cbUL, 0x1a8366bcUL, 0xa0d26f25UL, 0x36e26852UL, - 0x95770cccUL, 0x03470bbbUL, 0xb9160222UL, 0x2f260555UL, 0xbe3bbac5UL, - 0x280bbdb2UL, 0x925ab42bUL, 0x046ab35cUL, 0xa7ffd7c2UL, 0x31cfd0b5UL, - 0x8b9ed92cUL, 0x1daede5bUL, 0xb0c2649bUL, 0x26f263ecUL, 0x9ca36a75UL, - 0x0a936d02UL, 0xa906099cUL, 0x3f360eebUL, 0x85670772UL, 0x13570005UL, - 0x824abf95UL, 0x147ab8e2UL, 0xae2bb17bUL, 0x381bb60cUL, 0x9b8ed292UL, - 0x0dbed5e5UL, 0xb7efdc7cUL, 0x21dfdb0bUL, 0xd4d2d386UL, 0x42e2d4f1UL, - 0xf8b3dd68UL, 0x6e83da1fUL, 0xcd16be81UL, 0x5b26b9f6UL, 0xe177b06fUL, - 0x7747b718UL, 0xe65a0888UL, 0x706a0fffUL, 0xca3b0666UL, 0x5c0b0111UL, - 0xff9e658fUL, 0x69ae62f8UL, 0xd3ff6b61UL, 0x45cf6c16UL, 0x78e20aa0UL, - 0xeed20dd7UL, 0x5483044eUL, 0xc2b30339UL, 0x612667a7UL, 0xf71660d0UL, - 0x4d476949UL, 0xdb776e3eUL, 0x4a6ad1aeUL, 0xdc5ad6d9UL, 0x660bdf40UL, - 0xf03bd837UL, 0x53aebca9UL, 0xc59ebbdeUL, 0x7fcfb247UL, 0xe9ffb530UL, - 0x1cf2bdbdUL, 0x8ac2bacaUL, 0x3093b353UL, 0xa6a3b424UL, 0x0536d0baUL, - 0x9306d7cdUL, 0x2957de54UL, 0xbf67d923UL, 0x2e7a66b3UL, 0xb84a61c4UL, - 0x021b685dUL, 0x942b6f2aUL, 0x37be0bb4UL, 0xa18e0cc3UL, 0x1bdf055aUL, - 0x8def022dUL - }, - { - 0x00000000UL, 0x41311b19UL, 0x82623632UL, 0xc3532d2bUL, 0x04c56c64UL, - 0x45f4777dUL, 0x86a75a56UL, 0xc796414fUL, 0x088ad9c8UL, 0x49bbc2d1UL, - 0x8ae8effaUL, 0xcbd9f4e3UL, 0x0c4fb5acUL, 0x4d7eaeb5UL, 0x8e2d839eUL, - 0xcf1c9887UL, 0x5112c24aUL, 0x1023d953UL, 0xd370f478UL, 0x9241ef61UL, - 0x55d7ae2eUL, 0x14e6b537UL, 0xd7b5981cUL, 0x96848305UL, 0x59981b82UL, - 0x18a9009bUL, 0xdbfa2db0UL, 0x9acb36a9UL, 0x5d5d77e6UL, 0x1c6c6cffUL, - 0xdf3f41d4UL, 0x9e0e5acdUL, 0xa2248495UL, 0xe3159f8cUL, 0x2046b2a7UL, - 0x6177a9beUL, 0xa6e1e8f1UL, 0xe7d0f3e8UL, 0x2483dec3UL, 0x65b2c5daUL, - 0xaaae5d5dUL, 0xeb9f4644UL, 0x28cc6b6fUL, 0x69fd7076UL, 0xae6b3139UL, - 0xef5a2a20UL, 0x2c09070bUL, 0x6d381c12UL, 0xf33646dfUL, 0xb2075dc6UL, - 0x715470edUL, 0x30656bf4UL, 0xf7f32abbUL, 0xb6c231a2UL, 0x75911c89UL, - 0x34a00790UL, 0xfbbc9f17UL, 0xba8d840eUL, 0x79dea925UL, 0x38efb23cUL, - 0xff79f373UL, 0xbe48e86aUL, 0x7d1bc541UL, 0x3c2ade58UL, 0x054f79f0UL, - 0x447e62e9UL, 0x872d4fc2UL, 0xc61c54dbUL, 0x018a1594UL, 0x40bb0e8dUL, - 0x83e823a6UL, 0xc2d938bfUL, 0x0dc5a038UL, 0x4cf4bb21UL, 0x8fa7960aUL, - 0xce968d13UL, 0x0900cc5cUL, 0x4831d745UL, 0x8b62fa6eUL, 0xca53e177UL, - 0x545dbbbaUL, 0x156ca0a3UL, 0xd63f8d88UL, 0x970e9691UL, 0x5098d7deUL, - 0x11a9ccc7UL, 0xd2fae1ecUL, 0x93cbfaf5UL, 0x5cd76272UL, 0x1de6796bUL, - 0xdeb55440UL, 0x9f844f59UL, 0x58120e16UL, 0x1923150fUL, 0xda703824UL, - 0x9b41233dUL, 0xa76bfd65UL, 0xe65ae67cUL, 0x2509cb57UL, 0x6438d04eUL, - 0xa3ae9101UL, 0xe29f8a18UL, 0x21cca733UL, 0x60fdbc2aUL, 0xafe124adUL, - 0xeed03fb4UL, 0x2d83129fUL, 0x6cb20986UL, 0xab2448c9UL, 0xea1553d0UL, - 0x29467efbUL, 0x687765e2UL, 0xf6793f2fUL, 0xb7482436UL, 0x741b091dUL, - 0x352a1204UL, 0xf2bc534bUL, 0xb38d4852UL, 0x70de6579UL, 0x31ef7e60UL, - 0xfef3e6e7UL, 0xbfc2fdfeUL, 0x7c91d0d5UL, 0x3da0cbccUL, 0xfa368a83UL, - 0xbb07919aUL, 0x7854bcb1UL, 0x3965a7a8UL, 0x4b98833bUL, 0x0aa99822UL, - 0xc9fab509UL, 0x88cbae10UL, 0x4f5def5fUL, 0x0e6cf446UL, 0xcd3fd96dUL, - 0x8c0ec274UL, 0x43125af3UL, 0x022341eaUL, 0xc1706cc1UL, 0x804177d8UL, - 0x47d73697UL, 0x06e62d8eUL, 0xc5b500a5UL, 0x84841bbcUL, 0x1a8a4171UL, - 0x5bbb5a68UL, 0x98e87743UL, 0xd9d96c5aUL, 0x1e4f2d15UL, 0x5f7e360cUL, - 0x9c2d1b27UL, 0xdd1c003eUL, 0x120098b9UL, 0x533183a0UL, 0x9062ae8bUL, - 0xd153b592UL, 0x16c5f4ddUL, 0x57f4efc4UL, 0x94a7c2efUL, 0xd596d9f6UL, - 0xe9bc07aeUL, 0xa88d1cb7UL, 0x6bde319cUL, 0x2aef2a85UL, 0xed796bcaUL, - 0xac4870d3UL, 0x6f1b5df8UL, 0x2e2a46e1UL, 0xe136de66UL, 0xa007c57fUL, - 0x6354e854UL, 0x2265f34dUL, 0xe5f3b202UL, 0xa4c2a91bUL, 0x67918430UL, - 0x26a09f29UL, 0xb8aec5e4UL, 0xf99fdefdUL, 0x3accf3d6UL, 0x7bfde8cfUL, - 0xbc6ba980UL, 0xfd5ab299UL, 0x3e099fb2UL, 0x7f3884abUL, 0xb0241c2cUL, - 0xf1150735UL, 0x32462a1eUL, 0x73773107UL, 0xb4e17048UL, 0xf5d06b51UL, - 0x3683467aUL, 0x77b25d63UL, 0x4ed7facbUL, 0x0fe6e1d2UL, 0xccb5ccf9UL, - 0x8d84d7e0UL, 0x4a1296afUL, 0x0b238db6UL, 0xc870a09dUL, 0x8941bb84UL, - 0x465d2303UL, 0x076c381aUL, 0xc43f1531UL, 0x850e0e28UL, 0x42984f67UL, - 0x03a9547eUL, 0xc0fa7955UL, 0x81cb624cUL, 0x1fc53881UL, 0x5ef42398UL, - 0x9da70eb3UL, 0xdc9615aaUL, 0x1b0054e5UL, 0x5a314ffcUL, 0x996262d7UL, - 0xd85379ceUL, 0x174fe149UL, 0x567efa50UL, 0x952dd77bUL, 0xd41ccc62UL, - 0x138a8d2dUL, 0x52bb9634UL, 0x91e8bb1fUL, 0xd0d9a006UL, 0xecf37e5eUL, - 0xadc26547UL, 0x6e91486cUL, 0x2fa05375UL, 0xe836123aUL, 0xa9070923UL, - 0x6a542408UL, 0x2b653f11UL, 0xe479a796UL, 0xa548bc8fUL, 0x661b91a4UL, - 0x272a8abdUL, 0xe0bccbf2UL, 0xa18dd0ebUL, 0x62defdc0UL, 0x23efe6d9UL, - 0xbde1bc14UL, 0xfcd0a70dUL, 0x3f838a26UL, 0x7eb2913fUL, 0xb924d070UL, - 0xf815cb69UL, 0x3b46e642UL, 0x7a77fd5bUL, 0xb56b65dcUL, 0xf45a7ec5UL, - 0x370953eeUL, 0x763848f7UL, 0xb1ae09b8UL, 0xf09f12a1UL, 0x33cc3f8aUL, - 0x72fd2493UL - }, - { - 0x00000000UL, 0x376ac201UL, 0x6ed48403UL, 0x59be4602UL, 0xdca80907UL, - 0xebc2cb06UL, 0xb27c8d04UL, 0x85164f05UL, 0xb851130eUL, 0x8f3bd10fUL, - 0xd685970dUL, 0xe1ef550cUL, 0x64f91a09UL, 0x5393d808UL, 0x0a2d9e0aUL, - 0x3d475c0bUL, 0x70a3261cUL, 0x47c9e41dUL, 0x1e77a21fUL, 0x291d601eUL, - 0xac0b2f1bUL, 0x9b61ed1aUL, 0xc2dfab18UL, 0xf5b56919UL, 0xc8f23512UL, - 0xff98f713UL, 0xa626b111UL, 0x914c7310UL, 0x145a3c15UL, 0x2330fe14UL, - 0x7a8eb816UL, 0x4de47a17UL, 0xe0464d38UL, 0xd72c8f39UL, 0x8e92c93bUL, - 0xb9f80b3aUL, 0x3cee443fUL, 0x0b84863eUL, 0x523ac03cUL, 0x6550023dUL, - 0x58175e36UL, 0x6f7d9c37UL, 0x36c3da35UL, 0x01a91834UL, 0x84bf5731UL, - 0xb3d59530UL, 0xea6bd332UL, 0xdd011133UL, 0x90e56b24UL, 0xa78fa925UL, - 0xfe31ef27UL, 0xc95b2d26UL, 0x4c4d6223UL, 0x7b27a022UL, 0x2299e620UL, - 0x15f32421UL, 0x28b4782aUL, 0x1fdeba2bUL, 0x4660fc29UL, 0x710a3e28UL, - 0xf41c712dUL, 0xc376b32cUL, 0x9ac8f52eUL, 0xada2372fUL, 0xc08d9a70UL, - 0xf7e75871UL, 0xae591e73UL, 0x9933dc72UL, 0x1c259377UL, 0x2b4f5176UL, - 0x72f11774UL, 0x459bd575UL, 0x78dc897eUL, 0x4fb64b7fUL, 0x16080d7dUL, - 0x2162cf7cUL, 0xa4748079UL, 0x931e4278UL, 0xcaa0047aUL, 0xfdcac67bUL, - 0xb02ebc6cUL, 0x87447e6dUL, 0xdefa386fUL, 0xe990fa6eUL, 0x6c86b56bUL, - 0x5bec776aUL, 0x02523168UL, 0x3538f369UL, 0x087faf62UL, 0x3f156d63UL, - 0x66ab2b61UL, 0x51c1e960UL, 0xd4d7a665UL, 0xe3bd6464UL, 0xba032266UL, - 0x8d69e067UL, 0x20cbd748UL, 0x17a11549UL, 0x4e1f534bUL, 0x7975914aUL, - 0xfc63de4fUL, 0xcb091c4eUL, 0x92b75a4cUL, 0xa5dd984dUL, 0x989ac446UL, - 0xaff00647UL, 0xf64e4045UL, 0xc1248244UL, 0x4432cd41UL, 0x73580f40UL, - 0x2ae64942UL, 0x1d8c8b43UL, 0x5068f154UL, 0x67023355UL, 0x3ebc7557UL, - 0x09d6b756UL, 0x8cc0f853UL, 0xbbaa3a52UL, 0xe2147c50UL, 0xd57ebe51UL, - 0xe839e25aUL, 0xdf53205bUL, 0x86ed6659UL, 0xb187a458UL, 0x3491eb5dUL, - 0x03fb295cUL, 0x5a456f5eUL, 0x6d2fad5fUL, 0x801b35e1UL, 0xb771f7e0UL, - 0xeecfb1e2UL, 0xd9a573e3UL, 0x5cb33ce6UL, 0x6bd9fee7UL, 0x3267b8e5UL, - 0x050d7ae4UL, 0x384a26efUL, 0x0f20e4eeUL, 0x569ea2ecUL, 0x61f460edUL, - 0xe4e22fe8UL, 0xd388ede9UL, 0x8a36abebUL, 0xbd5c69eaUL, 0xf0b813fdUL, - 0xc7d2d1fcUL, 0x9e6c97feUL, 0xa90655ffUL, 0x2c101afaUL, 0x1b7ad8fbUL, - 0x42c49ef9UL, 0x75ae5cf8UL, 0x48e900f3UL, 0x7f83c2f2UL, 0x263d84f0UL, - 0x115746f1UL, 0x944109f4UL, 0xa32bcbf5UL, 0xfa958df7UL, 0xcdff4ff6UL, - 0x605d78d9UL, 0x5737bad8UL, 0x0e89fcdaUL, 0x39e33edbUL, 0xbcf571deUL, - 0x8b9fb3dfUL, 0xd221f5ddUL, 0xe54b37dcUL, 0xd80c6bd7UL, 0xef66a9d6UL, - 0xb6d8efd4UL, 0x81b22dd5UL, 0x04a462d0UL, 0x33cea0d1UL, 0x6a70e6d3UL, - 0x5d1a24d2UL, 0x10fe5ec5UL, 0x27949cc4UL, 0x7e2adac6UL, 0x494018c7UL, - 0xcc5657c2UL, 0xfb3c95c3UL, 0xa282d3c1UL, 0x95e811c0UL, 0xa8af4dcbUL, - 0x9fc58fcaUL, 0xc67bc9c8UL, 0xf1110bc9UL, 0x740744ccUL, 0x436d86cdUL, - 0x1ad3c0cfUL, 0x2db902ceUL, 0x4096af91UL, 0x77fc6d90UL, 0x2e422b92UL, - 0x1928e993UL, 0x9c3ea696UL, 0xab546497UL, 0xf2ea2295UL, 0xc580e094UL, - 0xf8c7bc9fUL, 0xcfad7e9eUL, 0x9613389cUL, 0xa179fa9dUL, 0x246fb598UL, - 0x13057799UL, 0x4abb319bUL, 0x7dd1f39aUL, 0x3035898dUL, 0x075f4b8cUL, - 0x5ee10d8eUL, 0x698bcf8fUL, 0xec9d808aUL, 0xdbf7428bUL, 0x82490489UL, - 0xb523c688UL, 0x88649a83UL, 0xbf0e5882UL, 0xe6b01e80UL, 0xd1dadc81UL, - 0x54cc9384UL, 0x63a65185UL, 0x3a181787UL, 0x0d72d586UL, 0xa0d0e2a9UL, - 0x97ba20a8UL, 0xce0466aaUL, 0xf96ea4abUL, 0x7c78ebaeUL, 0x4b1229afUL, - 0x12ac6fadUL, 0x25c6adacUL, 0x1881f1a7UL, 0x2feb33a6UL, 0x765575a4UL, - 0x413fb7a5UL, 0xc429f8a0UL, 0xf3433aa1UL, 0xaafd7ca3UL, 0x9d97bea2UL, - 0xd073c4b5UL, 0xe71906b4UL, 0xbea740b6UL, 0x89cd82b7UL, 0x0cdbcdb2UL, - 0x3bb10fb3UL, 0x620f49b1UL, 0x55658bb0UL, 0x6822d7bbUL, 0x5f4815baUL, - 0x06f653b8UL, 0x319c91b9UL, 0xb48adebcUL, 0x83e01cbdUL, 0xda5e5abfUL, - 0xed3498beUL - }, - { - 0x00000000UL, 0x6567bcb8UL, 0x8bc809aaUL, 0xeeafb512UL, 0x5797628fUL, - 0x32f0de37UL, 0xdc5f6b25UL, 0xb938d79dUL, 0xef28b4c5UL, 0x8a4f087dUL, - 0x64e0bd6fUL, 0x018701d7UL, 0xb8bfd64aUL, 0xddd86af2UL, 0x3377dfe0UL, - 0x56106358UL, 0x9f571950UL, 0xfa30a5e8UL, 0x149f10faUL, 0x71f8ac42UL, - 0xc8c07bdfUL, 0xada7c767UL, 0x43087275UL, 0x266fcecdUL, 0x707fad95UL, - 0x1518112dUL, 0xfbb7a43fUL, 0x9ed01887UL, 0x27e8cf1aUL, 0x428f73a2UL, - 0xac20c6b0UL, 0xc9477a08UL, 0x3eaf32a0UL, 0x5bc88e18UL, 0xb5673b0aUL, - 0xd00087b2UL, 0x6938502fUL, 0x0c5fec97UL, 0xe2f05985UL, 0x8797e53dUL, - 0xd1878665UL, 0xb4e03addUL, 0x5a4f8fcfUL, 0x3f283377UL, 0x8610e4eaUL, - 0xe3775852UL, 0x0dd8ed40UL, 0x68bf51f8UL, 0xa1f82bf0UL, 0xc49f9748UL, - 0x2a30225aUL, 0x4f579ee2UL, 0xf66f497fUL, 0x9308f5c7UL, 0x7da740d5UL, - 0x18c0fc6dUL, 0x4ed09f35UL, 0x2bb7238dUL, 0xc518969fUL, 0xa07f2a27UL, - 0x1947fdbaUL, 0x7c204102UL, 0x928ff410UL, 0xf7e848a8UL, 0x3d58149bUL, - 0x583fa823UL, 0xb6901d31UL, 0xd3f7a189UL, 0x6acf7614UL, 0x0fa8caacUL, - 0xe1077fbeUL, 0x8460c306UL, 0xd270a05eUL, 0xb7171ce6UL, 0x59b8a9f4UL, - 0x3cdf154cUL, 0x85e7c2d1UL, 0xe0807e69UL, 0x0e2fcb7bUL, 0x6b4877c3UL, - 0xa20f0dcbUL, 0xc768b173UL, 0x29c70461UL, 0x4ca0b8d9UL, 0xf5986f44UL, - 0x90ffd3fcUL, 0x7e5066eeUL, 0x1b37da56UL, 0x4d27b90eUL, 0x284005b6UL, - 0xc6efb0a4UL, 0xa3880c1cUL, 0x1ab0db81UL, 0x7fd76739UL, 0x9178d22bUL, - 0xf41f6e93UL, 0x03f7263bUL, 0x66909a83UL, 0x883f2f91UL, 0xed589329UL, - 0x546044b4UL, 0x3107f80cUL, 0xdfa84d1eUL, 0xbacff1a6UL, 0xecdf92feUL, - 0x89b82e46UL, 0x67179b54UL, 0x027027ecUL, 0xbb48f071UL, 0xde2f4cc9UL, - 0x3080f9dbUL, 0x55e74563UL, 0x9ca03f6bUL, 0xf9c783d3UL, 0x176836c1UL, - 0x720f8a79UL, 0xcb375de4UL, 0xae50e15cUL, 0x40ff544eUL, 0x2598e8f6UL, - 0x73888baeUL, 0x16ef3716UL, 0xf8408204UL, 0x9d273ebcUL, 0x241fe921UL, - 0x41785599UL, 0xafd7e08bUL, 0xcab05c33UL, 0x3bb659edUL, 0x5ed1e555UL, - 0xb07e5047UL, 0xd519ecffUL, 0x6c213b62UL, 0x094687daUL, 0xe7e932c8UL, - 0x828e8e70UL, 0xd49eed28UL, 0xb1f95190UL, 0x5f56e482UL, 0x3a31583aUL, - 0x83098fa7UL, 0xe66e331fUL, 0x08c1860dUL, 0x6da63ab5UL, 0xa4e140bdUL, - 0xc186fc05UL, 0x2f294917UL, 0x4a4ef5afUL, 0xf3762232UL, 0x96119e8aUL, - 0x78be2b98UL, 0x1dd99720UL, 0x4bc9f478UL, 0x2eae48c0UL, 0xc001fdd2UL, - 0xa566416aUL, 0x1c5e96f7UL, 0x79392a4fUL, 0x97969f5dUL, 0xf2f123e5UL, - 0x05196b4dUL, 0x607ed7f5UL, 0x8ed162e7UL, 0xebb6de5fUL, 0x528e09c2UL, - 0x37e9b57aUL, 0xd9460068UL, 0xbc21bcd0UL, 0xea31df88UL, 0x8f566330UL, - 0x61f9d622UL, 0x049e6a9aUL, 0xbda6bd07UL, 0xd8c101bfUL, 0x366eb4adUL, - 0x53090815UL, 0x9a4e721dUL, 0xff29cea5UL, 0x11867bb7UL, 0x74e1c70fUL, - 0xcdd91092UL, 0xa8beac2aUL, 0x46111938UL, 0x2376a580UL, 0x7566c6d8UL, - 0x10017a60UL, 0xfeaecf72UL, 0x9bc973caUL, 0x22f1a457UL, 0x479618efUL, - 0xa939adfdUL, 0xcc5e1145UL, 0x06ee4d76UL, 0x6389f1ceUL, 0x8d2644dcUL, - 0xe841f864UL, 0x51792ff9UL, 0x341e9341UL, 0xdab12653UL, 0xbfd69aebUL, - 0xe9c6f9b3UL, 0x8ca1450bUL, 0x620ef019UL, 0x07694ca1UL, 0xbe519b3cUL, - 0xdb362784UL, 0x35999296UL, 0x50fe2e2eUL, 0x99b95426UL, 0xfcdee89eUL, - 0x12715d8cUL, 0x7716e134UL, 0xce2e36a9UL, 0xab498a11UL, 0x45e63f03UL, - 0x208183bbUL, 0x7691e0e3UL, 0x13f65c5bUL, 0xfd59e949UL, 0x983e55f1UL, - 0x2106826cUL, 0x44613ed4UL, 0xaace8bc6UL, 0xcfa9377eUL, 0x38417fd6UL, - 0x5d26c36eUL, 0xb389767cUL, 0xd6eecac4UL, 0x6fd61d59UL, 0x0ab1a1e1UL, - 0xe41e14f3UL, 0x8179a84bUL, 0xd769cb13UL, 0xb20e77abUL, 0x5ca1c2b9UL, - 0x39c67e01UL, 0x80fea99cUL, 0xe5991524UL, 0x0b36a036UL, 0x6e511c8eUL, - 0xa7166686UL, 0xc271da3eUL, 0x2cde6f2cUL, 0x49b9d394UL, 0xf0810409UL, - 0x95e6b8b1UL, 0x7b490da3UL, 0x1e2eb11bUL, 0x483ed243UL, 0x2d596efbUL, - 0xc3f6dbe9UL, 0xa6916751UL, 0x1fa9b0ccUL, 0x7ace0c74UL, 0x9461b966UL, - 0xf10605deUL -#endif - } -}; diff --git a/data/nsis/Contrib/nsisunz/zlib/inflate.h b/data/nsis/Contrib/nsisunz/zlib/inflate.h deleted file mode 100644 index 9a12c8fd2..000000000 --- a/data/nsis/Contrib/nsisunz/zlib/inflate.h +++ /dev/null @@ -1,117 +0,0 @@ -/* inflate.h -- internal inflate state definition - * Copyright (C) 1995-2003 Mark Adler - * For conditions of distribution and use, see copyright notice in zlib.h - */ - -/* WARNING: this file should *not* be used by applications. It is - part of the implementation of the compression library and is - subject to change. Applications should only use zlib.h. - */ - -/* define NO_GZIP when compiling if you want to disable gzip header and - trailer decoding by inflate(). NO_GZIP would be used to avoid linking in - the crc code when it is not needed. For shared libraries, gzip decoding - should be left enabled. */ -#ifndef NO_GZIP -# define GUNZIP -#endif - -/* Possible inflate modes between inflate() calls */ -typedef enum { - HEAD, /* i: waiting for magic header */ -#ifdef GUNZIP - FLAGS, /* i: waiting for method and flags (gzip) */ - TIME, /* i: waiting for modification time (gzip) */ - OS, /* i: waiting for extra flags and operating system (gzip) */ - EXLEN, /* i: waiting for extra length (gzip) */ - EXTRA, /* i: waiting for extra bytes (gzip) */ - NAME, /* i: waiting for end of file name (gzip) */ - COMMENT, /* i: waiting for end of comment (gzip) */ - HCRC, /* i: waiting for header crc (gzip) */ -#endif - DICTID, /* i: waiting for dictionary check value */ - DICT, /* waiting for inflateSetDictionary() call */ - TYPE, /* i: waiting for type bits, including last-flag bit */ - TYPEDO, /* i: same, but skip check to exit inflate on new block */ - STORED, /* i: waiting for stored size (length and complement) */ - COPY, /* i/o: waiting for input or output to copy stored block */ - TABLE, /* i: waiting for dynamic block table lengths */ - LENLENS, /* i: waiting for code length code lengths */ - CODELENS, /* i: waiting for length/lit and distance code lengths */ - LEN, /* i: waiting for length/lit code */ - LENEXT, /* i: waiting for length extra bits */ - DIST, /* i: waiting for distance code */ - DISTEXT, /* i: waiting for distance extra bits */ - MATCH, /* o: waiting for output space to copy string */ - LIT, /* o: waiting for output space to write literal */ - CHECK, /* i: waiting for 32-bit check value */ -#ifdef GUNZIP - LENGTH, /* i: waiting for 32-bit length (gzip) */ -#endif - DONE, /* finished check, done -- remain here until reset */ - BAD, /* got a data error -- remain here until reset */ - MEM, /* got an inflate() memory error -- remain here until reset */ - SYNC /* looking for synchronization bytes to restart inflate() */ -} inflate_mode; - -/* - State transitions between above modes - - - (most modes can go to the BAD or MEM mode -- not shown for clarity) - - Process header: - HEAD -> (gzip) or (zlib) - (gzip) -> FLAGS -> TIME -> OS -> EXLEN -> EXTRA -> NAME - NAME -> COMMENT -> HCRC -> TYPE - (zlib) -> DICTID or TYPE - DICTID -> DICT -> TYPE - Read deflate blocks: - TYPE -> STORED or TABLE or LEN or CHECK - STORED -> COPY -> TYPE - TABLE -> LENLENS -> CODELENS -> LEN - Read deflate codes: - LEN -> LENEXT or LIT or TYPE - LENEXT -> DIST -> DISTEXT -> MATCH -> LEN - LIT -> LEN - Process trailer: - CHECK -> LENGTH -> DONE - */ - -/* state maintained between inflate() calls. Approximately 7K bytes. */ -struct inflate_state { - inflate_mode mode; /* current inflate mode */ - int last; /* true if processing last block */ - int wrap; /* bit 0 true for zlib, bit 1 true for gzip */ - int havedict; /* true if dictionary provided */ - int flags; /* gzip header method and flags (0 if zlib) */ - unsigned long check; /* protected copy of check value */ - unsigned long total; /* protected copy of output count */ - /* sliding window */ - unsigned wbits; /* log base 2 of requested window size */ - unsigned wsize; /* window size or zero if not using window */ - unsigned whave; /* valid bytes in the window */ - unsigned write; /* window write index */ - unsigned char FAR *window; /* allocated sliding window, if needed */ - /* bit accumulator */ - unsigned long hold; /* input bit accumulator */ - unsigned bits; /* number of bits in "in" */ - /* for string and stored block copying */ - unsigned length; /* literal or length of data to copy */ - unsigned offset; /* distance back to copy string from */ - /* for table and code decoding */ - unsigned extra; /* extra bits needed */ - /* fixed and dynamic code tables */ - code const FAR *lencode; /* starting table for length/literal codes */ - code const FAR *distcode; /* starting table for distance codes */ - unsigned lenbits; /* index bits for lencode */ - unsigned distbits; /* index bits for distcode */ - /* dynamic table building */ - unsigned ncode; /* number of code length code lengths */ - unsigned nlen; /* number of length code lengths */ - unsigned ndist; /* number of distance code lengths */ - unsigned have; /* number of code lengths in lens[] */ - code FAR *next; /* next available space in codes[] */ - unsigned short lens[320]; /* temporary storage for code lengths */ - unsigned short work[288]; /* work area for code table building */ - code codes[ENOUGH]; /* space for code tables */ -}; diff --git a/data/nsis/Docs/Inetc/Readme.htm b/data/nsis/Docs/Inetc/Readme.htm deleted file mode 100644 index 0913e7425..000000000 --- a/data/nsis/Docs/Inetc/Readme.htm +++ /dev/null @@ -1,153 +0,0 @@ -
-

Contents

-
    -
  • 1 Links -
  • 2 Description -
  • 3 Commands -
      -
    • 3.1 get -
    • 3.2 post -
    • 3.3 head -
    • 3.4 put -
    -
  • 4 Examples -
  • 5 Credits -
-
- -

Links

-Download: http://nsis.sourceforge.net/Inetc_plug-in - -

Description

-Internet client plug-in for files download and upload. Based on the InetLoad plug-in. -Network implementation uses MS WinInet API, supports http/https and ftp protocols. -Plugin has better proxy support compare to NSISdl plug-in. Command line may include -few URL/File pairs to be transfered. If server or proxy login/password are not setten in the script, -displays IE-style authentication dialog (except silent mode). Plug-in supports 3 -"transfer in progress" display modes: -
    -
  • old NSISdl style - additional embedded progress bar and text on the INSTFILES page; -
  • POPUP dialog mode with detailed info; -
  • BANNER mode with simple popup window. -
-Plug-in recognizes Installer's Silent mode and this case hides any output (this feature -requires NSIS 2.03 or later). Program implements simple re-get functionality - host -reconnect and download from current position after short pause. While program depends on IE settings, -it changes current IE mode to online. NSISdl code fragment was used for progress bar displaying -in the "old style" mode. For ftp use "host/path" for file location relative to user's home dir and -"host//path" for absolute path. - -

Commands

- -Plug-in DLL functions (entry points): get, post, head, put - -

get

- -inetc::get [/PROXY IP:PORT] [/USERNAME PROXY_LOGIN /PASSWORD PROXY_PASSWD] [/NOCOOKIES] - [/NOPROXY] [/NOCANCEL] [/CONNECTTIMEOUT TO_SEC] [/RECEIVETIMEOUT TO_SEC] [/SILENT] [/WEAKSECURITY] - [/CAPTION TEXT] [/NOCOOKIES] [/RESUME RETRY_QUESTION] [/POPUP HOST_ALIAS | /BANNER TEXT] - [/CANCELTEXT CANCEL_TEXT] [/QUESTION CANCEL_QUESTION] [/USERAGENT USER_AGENT_TEXT] - [/HEADER HEADER_TEXT] [/TRANSLATE LANG_PARAMS] [/TOSTACK | /TOSTACKCONV] - URL1 local_file1 [URL2 local_file2 [...]] [/END] -

This call returns "OK" string if successful, error description string if failed (see included InetLoad.cpp file for a full set of status strings). Usage and result processing samples are included to the package. -

/PROXY - -Overwrites current proxy settings, not required in most cases. IE settings will be used by default. -

/USERNAME - -Proxy username (http only). -

/PASSWORD - -Proxy password (http only). For server (http/ftp) authentication it is possible to use URL encoded name and password, for example http://username:password@nsis.sourceforge.net. -

/NOPROXY - -Disables proxy settings for this connection (if any) -

/NOCANCEL - -Prevents download from being interrupted by user (locks Esc, Alt-F4, Cancel handling, removes sysmenu) -

/CONNECTTIMEOUT - -Sets INTERNET_OPTION_CONNECT_TIMEOUT, seconds, default - IE current parameter value. -

/RECEIVETIMEOUT - -Sets INTERNET_OPTION_RECEIVE_TIMEOUT, seconds, default - IE current parameter value. -

/SILENT - -Key hides plug-in' output (both popup dialog and embedded progress bar). Not required if 'SilentInstall silent' mode was defined in script (NSIS 2.03 or later). -

/WEAKSECURITY - -Ignore unknown and revoked certificates -

/RESUME - -On the permanent connection/transfer error instead of exit first displays message box with "resume download" question. Useful for dial-up connections and big files - allows user to restore connection and resume download. Default is "Your internet connection seems to have dropped out!\nPlease reconnect and click Retry to resume downloading...". -

/CAPTION - -Defines caption text for /BANNER mode, caption prefix (left of '-') for /POPUP mode and caption for RESUME MessageBox. Default is "InetLoad plug-in" if not set or "". 127 chars maximum. -

/POPUP - -This mode displays detailed download dialog instead of embedded progress bar. Also useful in .onInit function (i.e. not in Section). If HOST_ALIAS is not "", text will replace URL in the dialog - this allows to hide real URL (including password). -

/BANNER - -Displays simple popup dialog (MSI Banner mode) and sets dialog TEXT (up to 3 lines using $\n). -

/CANCELTEXT - -Text for the Cancel button in the NSISdl mode. Default is NSIS dialog Cancel button text (current lang). -

/QUESTION - -Text for the optional MessageBox if user tries to cancel download. If /QUESTION "" was used default -"Are you sure that you want to stop download?" will be substituted. -

/USERAGENT - -UserAgent http request header value. Default is "NSIS_Inetc (Mozilla)". 256 chars maximum. -

/HEADER - -Adds or replaces http request header. Common HEADER_TEXT format is "header: value". -

/NOCOOKIES - -Removes cookies from http request -

/TOSTACK - -Outputs the post/get/head response to the NSIS stack rather than to the file (specify an empty string for local_file1, local_file2 etc.) -

/TOSTACKCONV - -Outputs the post/get/head response to the NSIS stack while converting character encodings:
-ASCII -> Unicode for the Unicode plug-in build
-Unicode -> ASCII for the ASCII plug-in build -

/END - -Allows to limit plug-in stack reading (optional, required if you stores other vars in the stack). -

/TRANSLATE - -Allows translating plug-in text in the POPUP or NSISdl modes. 8 parameters both cases.
- -NSISdl mode parameters:
- /TRANSLATE downloading connecting second minute hour plural progress remaining
-With default values:
- "Downloading %s" "Connecting ..." second minute hour s "%dkB (%d%%) of %dkB @ %d.%01dkB/s" "(%d %s%s remaining)"
- -POPUP mode parameters:
- /TRANSLATE url downloading connecting file_name received file_size remaining_time total_time
-With default values:
- URL Downloading Connecting "File Name" Received "File Size" "Remaining Time" "Total Time"
- -

post

- -inetc::post TEXT2POST [/FILE] [/PROXY IP:PORT] [/NOPROXY] [/NOCANCEL] - [/USERNAME PROXY_LOGIN /PASSWORD PROXY_PASSWD] [/TIMEOUT INT_MS] [/SILENT] [/WEAKSECURITY] - [/CAPTION TEXT] [/POPUP | /BANNER TEXT] [/CANCELTEXT CANCEL_TEXT] - [/USERAGENT USER_AGENT_TEXT] [/TRANSLATE LANG_PARAMS] [/TOSTACK | /TOSTACKCONV] - URL1 local_file1 [URL2 local_file2 [...]] [/END] -

Sets POST http mode and defines text string to be used in the POST (http only). Disables auto re-get. No char replaces used (%20 and others). -If /FILE presents in command line, TEXT2POST is filename to be sent in POST request. Also 'Filename:' header will be added to HTTP headers. - -

head

- -The same as get, but requests http headers only. Writes raw headers to file. - -

put

- -inetc::put [/PROXY IP:PORT] [/USERNAME PROXY_LOGIN /PASSWORD PROXY_PASSWD] [/NOPROXY] - [/NOCANCEL] [/TIMEOUT INT_MS] [/SILENT] [/WEAKSECURITY] [/CAPTION TEXT] [/POPUP | /BANNER TEXT] - [/CANCELTEXT CANCEL_TEXT] [/USERAGENT USER_AGENT_TEXT] - [/TRANSLATE LANG_PARAMS] URL1 local_file1 [URL2 local_file2 [...]] [/END] -

Return value and parameters (if applicable) are the same as for previous entry point. - -

Examples

-
  inetc::put "http://dl.zvuki.ru/6306/mp3/12.mp3" "$EXEDIR\12.mp3" \
-     "ftp://dl.zvuki.ru/6306/mp3/11.mp3" "$EXEDIR\11.mp3"
-  Pop $0
-  inetc::put /BANNER "Cameron Diaz upload in progress..." \
-    "http://www.dreamgirlswallpaper.co.uk/fiveyearsonline/wallpaper/Cameron_Diaz/camerond09big.JPG" \
-    "$EXEDIR\cd.jpg"
-  Pop $0
-  StrCmp $0 "OK" dlok
-  MessageBox MB_OK|MB_ICONEXCLAMATION "http upload Error, click OK to abort installation" /SD IDOK
-  Abort
-dlok:
-  ...
- -

Credits

-

Many thanks to Backland who offered a simple way to fix NSISdl mode crashes, added 'center parent' function, offers few nice design ideas and spent a lot of time testing the plug-in.

-
-

v1.0.4.4 by Stuart 'Afrow UK' Welch

-

v1.0.5.0..v1.0.5.2 by anders_k

-
-

See Contrib\inetc\inetc.cpp for changes.

diff --git a/data/nsis/Docs/Inetc/wiki.txt b/data/nsis/Docs/Inetc/wiki.txt deleted file mode 100644 index 384bdd37c..000000000 --- a/data/nsis/Docs/Inetc/wiki.txt +++ /dev/null @@ -1,161 +0,0 @@ -{{PageAuthor|Takhir}} - -== Links == - -Download:
-Inetc.zip
- -[http://forums.winamp.com/showthread.php?threadid=198596 Forum thread] - -== Description == - -Internet client plug-in for files download and upload. Based on the InetLoad plug-in. Network implementation uses MS WinInet API, supports http/https and ftp protocols. Plugin has better proxy support compared to NSISdl plug-in. Command line may include few URL/File pairs to be transfered. If server or proxy login/password are not set in the script, it displays IE-style authentication dialog (except silent mode). Plug-in supports 3 "transfer in progress" display modes: - -# old NSISdl style - additional embedded progress bar and text on the INSTFILES page; -# POPUP dialog mode with detailed info; -# BANNER mode with simple popup window. - -Plug-in recognizes Installer's Silent mode and this case hides any output (this feature requires NSIS 2.03 or later). Program implements simple re-get functionality - host reconnect and download from current position after short pause. While program depends on IE settings, it changes current IE mode to online. NSISdl code fragment was used for progress bar displaying in the "old style" mode. -For ftp use "host/path" for file location relative to user's home dir and -"host//path" for absolute path. - -== Commands == - -Plug-in DLL functions (entry points): get, post, head, put - -=== get === - -inetc::get [/PROXY IP:PORT] [/USERNAME PROXY_LOGIN /PASSWORD PROXY_PASSWD] - [/NOPROXY] [/NOCANCEL] [/CONNECTTIMEOUT TO_SEC] [/RECEIVETIMEOUT TO_SEC] [/SILENT] [/WEAKSECURITY] - [/CAPTION TEXT] [/NOCOOKIES] [/RESUME RETRY_QUESTION] [/POPUP HOST_ALIAS | /BANNER TEXT] - [/CANCELTEXT CANCEL_TEXT] [/QUESTION CANCEL_QUESTION] [/USERAGENT USER_AGENT_TEXT] - [/HEADER HEADER_TEXT] [/TRANSLATE LANG_PARAMS] [/TOSTACK | /TOSTACKCONV] - URL1 local_file1 [URL2 local_file2 [...]] [/END] -This call returns "OK" string if successful, error description string if failed (see included InetLoad.cpp file for a full set of status strings). Usage and result processing samples are included to the package. - -; /PROXY -: Overwrites current proxy settings, not required in most cases. IE settings will be used by default. - -; /USERNAME -: Proxy username (http only). - -; /PASSWORD -: Proxy password (http only). For server (http/ftp) authentication it is possible to use URL encoded name and password, for example http://username:password@nsis.sourceforge.net. - -; /NOPROXY -: Disables proxy settings for this connection (if any) - -; /NOCANCEL -: Prevents download from being interrupted by user (locks Esc, Alt-F4, Cancel handling) - -; /CONNECTTIMEOUT - -:Sets INTERNET_OPTION_CONNECT_TIMEOUT, seconds, default - IE current parameter value. - -; /RECEIVETIMEOUT - -:Sets INTERNET_OPTION_RECEIVE_TIMEOUT, seconds, default - IE current parameter value. - -; /SILENT -: Key hides plug-in' output (both popup dialog and embedded progress bar). Not required if 'SilentInstall silent' mode was defined in script (NSIS 2.03 or later). - -; /WEAKSECURITY -: Ignore unknown and revoked certificates - -; /RESUME -: On the permanent connection/transfer error instead of exit first displays message box with "resume download" question. Useful for dial-up connections and big files - allows user to restore connection and resume download. Default is "Your internet connection seems to have dropped out!\nPlease reconnect and click Retry to resume downloading...". - -; /CAPTION -: Defines caption text for /BANNER mode, caption prefix (left of '-') for /POPUP mode and caption for RESUME MessageBox. Default is "InetLoad plug-in" if not set or "". - -; /POPUP -: This mode displays detailed download dialog instead of embedded progress bar. Also useful in .onInit function (i.e. not in Section). If HOST_ALIAS is not "", text will replace URL in the dialog - this allows to hide real URL (including password). - -; /BANNER -: Displays simple popup dialog (MSI Banner mode) and sets dialog TEXT (up to 3 lines using $\n). - -; /CANCELTEXT -: Text for the Cancel button in the NSISdl mode. Default is NSIS dialog Cancel button text (current lang). - -; /QUESTION -: Text for the optional MessageBox if user tries to cancel download. If /QUESTION "" was used default "Are you sure that you want to stop download?" will be substituted. - -; /USERAGENT -: UserAgent http request header value. Default is "NSIS_Inetc (Mozilla)". - -; /HEADER -: Adds or replaces http request header. Common HEADER_TEXT format is "header: value". - -; /NOCOOKIES -: Removes cookies from http request - -; /TOSTACK -: Outputs the post/get/head response to the NSIS stack rather than to the file (specify an empty string for local_file1, local_file2 etc.) - -; /TOSTACKCONV -: Outputs the post/get/head response to the NSIS stack while converting character encodings: -: ASCII -> Unicode for the Unicode plug-in build -: Unicode -> ASCII for the ASCII plug-in build - -; /END -: Allows to limit plug-in stack reading (optional, required if you stores other vars in the stack). - -; /TRANSLATE -: Allows translating plug-in text in the POPUP or "old style" (NSISdl) modes (see Readme for parameters). In the BANNER mode text is also customizable. - -=== post === - -inetc::post TEXT2POST [/PROXY IP:PORT] [/USERNAME PROXY_LOGIN /PASSWORD PROXY_PASSWD] - [/NOPROXY] [/NOCANCEL] [/CONNECTTIMEOUT TO_SEC] [/RECEIVETIMEOUT TO_SEC] [/SILENT] [/WEAKSECURITY] - [/FILE] [/CAPTION TEXT] [/NOCOOKIES] [/POPUP HOST_ALIAS | /BANNER TEXT] - [/CANCELTEXT CANCEL_TEXT] [/USERAGENT USER_AGENT_TEXT] [/TRANSLATE LANG_PARAMS] - [/TOSTACK | /TOSTACKCONV] - URL1 local_file1 [URL2 local_file2 [...]] [/END] -Sets POST http mode and defines text string or file name to be used in the POST (http only). Disables auto re-get. No char replaces used (%20 and others). /FILE option allows to send TEXT2POST file content to server, additional 'Filename:' header added to request this case. - -=== head === - -The same as get, but requests http headers only. Writes raw headers to file. - -=== put === - -inetc::put [/PROXY IP:PORT] [/USERNAME PROXY_LOGIN /PASSWORD PROXY_PASSWD] [/NOPROXY] - [/NOCANCEL] [/CONNECTTIMEOUT TO_SEC] [/RECEIVETIMEOUT TO_SEC] [/SILENT] [/WEAKSECURITY] [/CAPTION TEXT] - [/POPUP HOST_ALIAS | /BANNER TEXT] [/CANCELTEXT CANCEL_TEXT] [/USERAGENT USER_AGENT_TEXT] - [/TRANSLATE LANG_PARAMS] [/NOCOOKIES] - URL1 local_file1 [URL2 local_file2 [...]] [/END] -Return value and parameters (if applicable) are the same as for previous entry point. - -== Examples == - - -inetc::put "http://dl.zvuki.ru/6306/mp3/12.mp3" "$EXEDIR\12.mp3" \ - "ftp://dl.zvuki.ru/6306/mp3/11.mp3" "$EXEDIR\11.mp3" -Pop $0 - - - -inetc::put /BANNER "Cameron Diaz upload in progress..." \ -"http://www.dreamgirlswallpaper.co.uk/fiveyearsonline/wallpaper/Cameron_Diaz/camerond09big.JPG" \ -"$EXEDIR\cd.jpg" - Pop $0 - StrCmp $0 "OK" dlok - MessageBox MB_OK|MB_ICONEXCLAMATION "http upload Error, click OK to abort installation" /SD IDOK - Abort -dlok: - ... - - - -; Following attribute also can restore installer Window -; BGGradient 000000 000080 FFFFFF - -== Credits == - -

Many thanks to Backland who offered a simple way to fix NSISdl mode crashes, added 'center parent' function, offers few nice design ideas and spent a lot of time testing the plug-in.

-
-

v1.0.4.4 by Stuart 'Afrow UK' Welch

-

v1.0.5.0..v1.0.5.2 by anders_k

-
-

See Contrib\inetc\inetc.cpp for changes.

- - -[[Category:Plugins]] diff --git a/data/nsis/Docs/md5dll/readme.txt b/data/nsis/Docs/md5dll/readme.txt deleted file mode 100644 index a8d3572c7..000000000 --- a/data/nsis/Docs/md5dll/readme.txt +++ /dev/null @@ -1,68 +0,0 @@ -Calculates the md5sum of a file or string. -Has been tested to work with NSIS 2.0+ - - -Derived from the RSA Data Security, Inc. MD5 Message-Digest Algorithm - -[Md5Dll] -Matthew "IGx89" Lieder - -Original plugin Author - -Sunjammer (12th May 2002) - -Original usage notes and example script - -[Md5Dll.0.1] -KJD (2004) - -Modified to reduce size and use exdll.h - (reduced to about 6KB uncompressed, by removing CRTL dependency) - -[Md5dll.0.2] -Davy Durham (2004) - -MD5.cpp fix (correct for loop used to replace memset, exceeded bounds) - -[Md5dll.0.3] -Shengalts Aleksander aka Instructor (2005) - -New command: "GetMD5Random" - -Changed names: "GetFileMD5" -> "GetMD5File", "GetMD5" -> "GetMD5String" - -Fixed: string length error - -[Md5dll.0.4] -KJD (2005) - -Added dual name to exports for backwards compatibility - - --------------------------------- - -Usage: - -Push $1 ;string -CallInstDll "md5dll" GetMD5String -Pop $1 ;md5 of string - --or- - -Push $1 ;filename -CallInstDll "md5dll" GetMD5File -Pop $1 ;md5 of file - --------------------------------- - -Example usage in recent NSIS versions - -OutFile "md5test.exe" -Section "" - #generate MD5sum of a string - md5dll::GetMD5String "md5me" - Pop $0 - DetailPrint "md5: [$0]" - - # generate MD5sum of a file - md5dll::GetMD5File "${NSISDIR}\makensis.exe" - Pop $0 - DetailPrint "md5: [$0]" - - #generate random MD5sum - md5dll::GetMD5Random - Pop $0 - DetailPrint "md5: [$0]" -SectionEnd diff --git a/data/nsis/Docs/nsisunz/nsisunz_readme.html b/data/nsis/Docs/nsisunz/nsisunz_readme.html deleted file mode 100644 index 87017bbb0..000000000 --- a/data/nsis/Docs/nsisunz/nsisunz_readme.html +++ /dev/null @@ -1,361 +0,0 @@ - - - -nsisunz - - - - -
- - - - -
-

nsisunz

-
-

Introduction

-

nsisunz is a NSIS plugin which allows you to extract files from ZIP -archives.

-

nsisunz is great when you use another NSIS plug-in named -NSISdl to download a ZIP file from the internet. -Download a small installer which lets the user choose the components he/she -want to install and the installer downloads it (QuickTime Setup does -this).

-

Note: -nsisunz does not support password protected ZIP archives -(encrypted).
-To extract only a specific file from the archive use the -"/file" option. -

-

How to use

-

Setting it up

-

To see a great example of how to use the plug-in, -check out the included example script.

-

You use the Unzip, UnzipToLog or the -UnzipToStack function to extract files -from a ZIP archive.

-

In my opinion the best way to describe things is by showing an example, -so here is one:

-
-InitPluginsDir
-; Call plug-in. Push filename to ZIP first, and the dest. folder last.
-nsisunz::UnzipToLog "$PLUGINSDIR\myzipfile.zip" "$INSTDIR"
-
-; Always check result on stack
-Pop $0
-StrCmp $0 "success" ok
-  DetailPrint "$0" ;print error message to log
-ok:
-
-; You can also use the "Unzip" function if you don't want to use the log.
-; It is a lot quicker, and is preferred for large ZIP archives.
-nsisunz::Unzip "$PLUGINSDIR\myzipfile.zip" "$INSTDIR"
-
-

The UnzipToStack function

-

The UnzipToStack function can be used instead of the UnzipToLog function -if you want the extraction to be a lot faster when extracting from very large ZIP archives and still -want to see the files extracted. This is how you use it: -

-
-nsisunz::UnzipToStack "$PLUGINSDIR\myzipfile.zip" "$INSTDIR"
-Pop $0
-StrCmp $0 "success" ok
-  DetailPrint "$0" ;print error message to log
-  Goto skiplist
-ok:
-
-; Print out list of files extracted to log
-next:
-  Pop $0
-  DetailPrint $0
-StrCmp $0 "" 0 next ; pop strings until a blank one arrives
-
-skiplist:
-
-

Extracting specific files

-

-To extract only a specific file use the "/file" option like this: -

-
-nsisunz::UnzipToLog /file "AnyPathInsideZIP/AFile.txt" "myzip.zip" "c:\myfiles"
-
-

-The path is relative to the root of the ZIP archive so you don't have to -prepend a slash ("/"). Furthermore the foldernames are extracted with the file so -the example above creates a file named "c:\myfiles\AnyPathInsideZIP\AFile.txt". -To avoid this use "/noextractpath" like this: -

-
-nsisunz::UnzipToLog /noextractpath /file \
-  "AnyPathInsideZIP/AFile.txt" "myzip.zip" "c:\myfiles"
-
-

Using nsisunz with NSISdl

-

To use NSISdl with nsisunz to download and extract a ZIP archive, -do something like this:

-
-InitPluginsDir
-NSISdl::download http://www.domain.com/file "$PLUGINSDIR\localfile.zip"
-Pop $R0 ;Get the return value
-StrCmp $R0 "success" +3
-  MessageBox MB_OK "Download failed: $R0"
-  Quit
-
-nsisunz::UnzipToLog "$PLUGINSDIR\localfile.zip" "$INSTDIR"
-Pop $R0
-StrCmp $R0 "success" +2
-  DetailPrint "$R0" ;print error message to log
-
-
-

Options

-

These are the optional parameters you can specify when calling nsisunz.

- - - - - - - - - - - - - -
/noextractpathThis option makes the plug-in extract all files to - the destination directory without regard to paths stored in ZIP file. - Is often used in conjunction with "/file" to extract a single file - from anywhere in an archive to a destination directory.
/fileExtract a specific file. Filename must be specified - as next parameter and must match a file in the ZIP including any - subdirectories. If the file couldn't be found in the ZIP file, - nsisunz pushes the string "File not found in ZIP file" on the - stack.
/textSets the format of the text used in the log to the - next param. "%f" is replaced with the filename, "%c" is - replaced with the compressed size and "%u" is replaced with the - uncompressed size. -
-

Return value

-

After you have called the DLL, nsisunz adds either "success" or a specific error message -on the stack. This is the possible error messages:

-
    -
  • Error opening ZIP file
  • -
  • Error opening output file(s)
  • -
  • Error writing output file(s)
  • -
  • Error extracting from ZIP file
  • -
  • File not found in ZIP file
  • -
-

Usually, you don't need to check this value, but you still have to remove it from the stack -(have a look at the example above).

-

Reserve files

-

If you are using BZIP2 (solid) compression, it's important that files which are being extracted -in init- or page functions function are located before other files in the data block, because this -will make your installer faster.

-

If there are File commands in your sections or functions above the init- or page functions, add -ReserveFile commands above your sections and functions:

-
-ReserveFile "myzipfile.zip"
-ReserveFile "${NSISDIR}\Plugins\nsisunz.dll"
-
-

Localization

-

Use the "/text" parameter to localize the text used by nsisunz -for the log output. -

-
-; Localized strings for use with nsisunz
-; The "%f" in the string is replaced with the filename on run-time.
-; "%c" and "%u" is replaced with compressed size and
-; uncompressed size respectively. See example script.
-
-LoadLanguageFile "${NSISDIR}\Contrib\Language files\english.nlf"
-LoadLanguageFile "${NSISDIR}\Contrib\Language files\norwegian.nlf"
-
-LangString nsisunz_text ${LANG_ENGLISH} "Extract: %f"
-LangString nsisunz_text ${LANG_NORWEGIAN} "Pakk ut: %f"
-
-Function .onInit
-  nsisunz:: /text "" "$(nsisunz_text)"
-FunctionEnd
-
-

Notes

-

-The plug-in is compressed with UPX to make it smaller.
-If you make changes to the source, re-compile and use UPX you may get this -message:
-upx: nsisunz.dll: CantPackException: file is possibly packed/protected -(try --force)
-I used the "--force" parameter as proposed, -and without problems UPX reduced the size of nsisunz.dll from ~71 kb -to 31,5 kb
-The reason for why you get this message is that the source #include's -"AggressiveOptimize.h" which makes the linker merge the code sections of the -final executable. This makes UPX think it's already packed (which it kinda is). -But by using the "--force" parameter, UPX may shrink it a lot -more.
-I hope people appreciate my struggles to keep the size of the plug-in small. -If someone have any suggestions for making it even smaller I would like if -someone sendt me an e-mail. -

-

Contact

-

nsisunz is written by Saivert.
-Homepage: -http://saivert.inthegray.com/
-E-mail: saivert@gmail.com - -

-

Version history

-
    -
  • DLL version 1.0 (12/4/2004) -
      -
    • First public release!
    • -
    -
  • -
-

Credits

-

-Based on code in NSIS Zip2Exe
-portions Copyright © 1999-2001 Miguel Garrido (mgarrido01@hotmail.com)
-Uses ZLIB - Copyright © Mark Adler
-ZIP format routines - Copyright © 1998 Gilles Vollant
-Thanks to Tim Kosse for the LogMessage function, even though I -could figure this out myself.
-And thanks to Joost Verburg for the readme HTML page design.

-

License

-
-This software is provided 'as-is', without any express or implied
-warranty. In no event will the authors be held liable for any damages
-arising from the use of this software.
-
-Permission is granted to anyone to use this software for any purpose,
-including commercial applications, and to alter it and redistribute
-it freely, subject to the following restrictions:
-
-1. The origin of this software must not be misrepresented;
-   you must not claim that you wrote the original software.
-   If you use this software in a product, an acknowledgment in the
-   product documentation would be appreciated but is not required.
-2. Altered versions must be plainly marked as such,
-   and must not be misrepresented as being the original software.
-3. This notice may not be removed or altered from any distribution.
-
-
-
- - diff --git a/data/nsis/Examples/Inetc/Example.nsi b/data/nsis/Examples/Inetc/Example.nsi deleted file mode 100644 index 4f63c175d..000000000 --- a/data/nsis/Examples/Inetc/Example.nsi +++ /dev/null @@ -1,54 +0,0 @@ - -;-------------------------------- -; General Attributes - -Name "Inetc plug-in Test" -OutFile "inetc.exe" -;SilentInstall silent -RequestExecutionLevel user - - -;-------------------------------- -;Interface Settings - - !include "MUI2.nsh" - !define MUI_ICON "${NSISDIR}\Contrib\Graphics\Icons\modern-install-colorful.ico" - !insertmacro MUI_PAGE_WELCOME - !insertmacro MUI_PAGE_INSTFILES - !insertmacro MUI_LANGUAGE "English" - -;SetFont 14 - -;-------------------------------- -;Installer Sections - -Section "Dummy Section" SecDummy - - SetDetailsView hide - -; two files download, popup mode - inetc::get /caption "2003-2004 reports" /popup "" "http://ineum.narod.ru/spr_2003.htm" "$EXEDIR\spr3.htm" "http://ineum.narod.ru/spr_2004.htm" "$EXEDIR\spr4.htm" /end - Pop $0 # return value = exit code, "OK" means OK - -; single file, NSISdl-style embedded progress bar with specific cancel button text - inetc::get /caption "2005 report" /canceltext "interrupt!" "http://ineum.narod.ru/spr_2005.htm" "$EXEDIR\spr5.htm" /end - Pop $1 # return value = exit code, "OK" means OK - -; banner with 2 text lines and disabled Cancel button - inetc::get /caption "2006 report" /banner "Banner mode with /nocancel option setten$\nSecond Line" /nocancel "http://ineum.narod.ru/spr_2006.htm" "$EXEDIR\spr6.htm" /end - Pop $2 # return value = exit code, "OK" means OK - - MessageBox MB_OK "Download Status: $0, $1, $2" -SectionEnd - - -;-------------------------------- -;Installer Functions - -Function .onInit - -; plug-in auto-recognizes 'no parent dlg' in onInit and works accordingly -; inetc::head /RESUME "Network error. Retry?" "http://ineum.narod.ru/spr_2003.htm" "$EXEDIR\spr3.txt" -; Pop $4 - -FunctionEnd \ No newline at end of file diff --git a/data/nsis/Examples/Inetc/auth_dlg.nsi b/data/nsis/Examples/Inetc/auth_dlg.nsi deleted file mode 100644 index 6fc8ee17d..000000000 --- a/data/nsis/Examples/Inetc/auth_dlg.nsi +++ /dev/null @@ -1,32 +0,0 @@ - -;-------------------------------- -; General Attributes - -Name "Inetc http auth Test" -OutFile "auth_dlg.exe" -RequestExecutionLevel user - - -;-------------------------------- -;Interface Settings - - !include "MUI2.nsh" - !define MUI_ICON "${NSISDIR}\Contrib\Graphics\Icons\modern-install-colorful.ico" - !insertmacro MUI_PAGE_INSTFILES - !insertmacro MUI_LANGUAGE "English" - - -;-------------------------------- -;Installer Sections - -Section "Dummy Section" SecDummy - -; Displays IE auth dialog. -; Both server and proxy auth. -; Please test this with your own link. - - inetc::get "http://www.cnt.ru/personal" "$EXEDIR\auth.html" - Pop $0 # return value = exit code, "OK" if OK - MessageBox MB_OK "Download Status: $0" - -SectionEnd diff --git a/data/nsis/Examples/Inetc/ftp_auth.nsi b/data/nsis/Examples/Inetc/ftp_auth.nsi deleted file mode 100644 index 83c1d967b..000000000 --- a/data/nsis/Examples/Inetc/ftp_auth.nsi +++ /dev/null @@ -1,32 +0,0 @@ - -;-------------------------------- -; General Attributes - -Name "Inetc ftp authentication Test" -OutFile "ftp_auth.exe" -RequestExecutionLevel user - - -;-------------------------------- -;Interface Settings - - !include "MUI2.nsh" - !define MUI_ICON "${NSISDIR}\Contrib\Graphics\Icons\modern-install-colorful.ico" - !insertmacro MUI_PAGE_INSTFILES - !insertmacro MUI_LANGUAGE "English" - - -;-------------------------------- -;Installer Sections - -Section "Dummy Section" SecDummy - -; use your own URL and login@pwd. Password hidden from user with /popup "ALIAS" - - inetc::get /caption "service pack download" /popup "ftp://localhost/" "ftp://login:pwd@localhost/W2Ksp3.exe" "$EXEDIR\sp3.exe" -; inetc::put /caption "service pack upload" /popup "" "ftp://login:pwd@localhost/W2Ksp3.bu.exe" "$EXEDIR\sp3.exe" - Pop $0 # return value = exit code, "OK" if OK - MessageBox MB_OK "Download Status: $0" - -SectionEnd - diff --git a/data/nsis/Examples/Inetc/head.nsi b/data/nsis/Examples/Inetc/head.nsi deleted file mode 100644 index fef90ec5e..000000000 --- a/data/nsis/Examples/Inetc/head.nsi +++ /dev/null @@ -1,30 +0,0 @@ - -;-------------------------------- -; General Attributes - -Name "Inetc Head Test" -OutFile "head.exe" -RequestExecutionLevel user - - -;-------------------------------- -;Interface Settings - - !include "MUI2.nsh" - !insertmacro MUI_PAGE_INSTFILES - !insertmacro MUI_LANGUAGE "English" - - -;-------------------------------- -;Installer Sections - -Section "Dummy Section" SecDummy - - DetailPrint "New version check out (internet connection)" - inetc::head /silent "http://ineum.narod.ru/spr_2006.htm" "$EXEDIR\head.txt" - Pop $0 # return value = exit code, "OK" if OK - MessageBox MB_OK "Download Status: $0" - -SectionEnd - - diff --git a/data/nsis/Examples/Inetc/headers.nsi b/data/nsis/Examples/Inetc/headers.nsi deleted file mode 100644 index b4a2b4841..000000000 --- a/data/nsis/Examples/Inetc/headers.nsi +++ /dev/null @@ -1,32 +0,0 @@ - -;-------------------------------- -; General Attributes - -Name "Headers Test" -OutFile "headers.exe" -RequestExecutionLevel user - - -;-------------------------------- -;Interface Settings - - !include "MUI2.nsh" - !insertmacro MUI_PAGE_INSTFILES - !insertmacro MUI_LANGUAGE "English" - - - -;-------------------------------- -;Installer Sections - -Section "Dummy Section" SecDummy - -; additional headers. Sample php returns raw headers - inetc::get /useragent "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1)" /header "SOAPAction: urn:anonOutInOpe" "http://localhost/headers.php" "$EXEDIR\headers.html" - Pop $0 - - MessageBox MB_OK "Download Status: $0" - -SectionEnd - - diff --git a/data/nsis/Examples/Inetc/headers.php b/data/nsis/Examples/Inetc/headers.php deleted file mode 100644 index 3e395321b..000000000 --- a/data/nsis/Examples/Inetc/headers.php +++ /dev/null @@ -1,7 +0,0 @@ - $value) { - echo "$header: $value
\n"; -} -?> \ No newline at end of file diff --git a/data/nsis/Examples/Inetc/https.nsi b/data/nsis/Examples/Inetc/https.nsi deleted file mode 100644 index 9bc9975db..000000000 --- a/data/nsis/Examples/Inetc/https.nsi +++ /dev/null @@ -1,27 +0,0 @@ - -;-------------------------------- -; General Attributes - -Name "Inetc https Test" -OutFile "https.exe" -RequestExecutionLevel user - - -;-------------------------------- -;Interface Settings - - !include "MUI2.nsh" - !insertmacro MUI_PAGE_INSTFILES - !insertmacro MUI_LANGUAGE "English" - - -;-------------------------------- -;Installer Sections - -Section "Dummy Section" SecDummy - - inetc::get /POPUP "" /CAPTION "bending_property_demo.zip" "https://secure.codeproject.com/cs/miscctrl/bending_property/bending_property_src.zip" "$EXEDIR\bending_property_src.zip" - Pop $0 # return value = exit code, "OK" if OK - MessageBox MB_OK "Download Status: $0" - -SectionEnd diff --git a/data/nsis/Examples/Inetc/inetc_local.nsi b/data/nsis/Examples/Inetc/inetc_local.nsi deleted file mode 100644 index 53160aa70..000000000 --- a/data/nsis/Examples/Inetc/inetc_local.nsi +++ /dev/null @@ -1,81 +0,0 @@ - -;-------------------------------- -; General Attributes - -Name "Inetc Local Test" -OutFile "inetc_local.exe" -RequestExecutionLevel user - - -;-------------------------------- -;Interface Settings - - !include "MUI2.nsh" - !define MUI_ICON "${NSISDIR}\Contrib\Graphics\Icons\modern-install-colorful.ico" - !insertmacro MUI_PAGE_INSTFILES - !insertmacro MUI_LANGUAGE "English" - - -;-------------------------------- -;Installer Sections - -Section "Dummy Section" SecDummy - - -; PUT test - -; FTP requires anonymous access in sample below. -; HTTP sample put.php included to package. Stores test.jpg as m2.bmp -; check server files present after upload - - inetc::put "http://localhost/put.php" "$EXEDIR\test.jpg" - Pop $0 - - inetc::put "ftp://localhost/test.jpg" "$EXEDIR\test.jpg" -; not anonymous format -; inetc::put "ftp://login:password@localhost/test.jpg" "$EXEDIR\test.jpg" - Pop $1 - - DetailPrint "PUT: HTTP $0, FTP $1 (verify server files)" - - -; POST test - -; HTTP sample post.php and post_form.htm (to compare results) included - - inetc::post "login=ami&passwd=333" "http://localhost/post.php?lg=iam&pw=44" "$EXEDIR\post_reply.htm" - Pop $2 - - DetailPrint "POST: $2 (post_reply.htm)" - - -; HEAD test - -; uses uploaded earlier test.jpg - - inetc::head /silent "http://localhost/m2.bmp" "$EXEDIR\head.txt" - Pop $3 - - DetailPrint "HEAD: $3 (head.txt)" - - -; GET test - -; 2 files download in nsisdl mode - inetc::get "http://localhost/m2.bmp" "$EXEDIR\get1.jpg" "http://localhost/m2.bmp" "$EXEDIR\get2.jpg" - Pop $4 - - inetc::get /popup "Localhost:GET with Popup" "http://localhost/m2.bmp" "$EXEDIR\get3.jpg" - Pop $5 - - inetc::get /banner "Local Test GET with Banner" "http://localhost/m2.bmp" "$EXEDIR\get4.jpg" - Pop $6 - - inetc::get /silent "ftp://localhost/test.jpg" "$EXEDIR\get5.jpg" - Pop $7 - - DetailPrint "GET: NSISDL $4, POPUP $5, BANNER $6, FTP $7 (get1-5.jpg)" - - SetDetailsView show - -SectionEnd diff --git a/data/nsis/Examples/Inetc/post.nsi b/data/nsis/Examples/Inetc/post.nsi deleted file mode 100644 index 3c64117f8..000000000 --- a/data/nsis/Examples/Inetc/post.nsi +++ /dev/null @@ -1,31 +0,0 @@ - -;-------------------------------- -; General Attributes - -Name "Inetc Post Test" -OutFile "post.exe" -RequestExecutionLevel user - - -;-------------------------------- -;Interface Settings - - !include "MUI2.nsh" - !insertmacro MUI_PAGE_INSTFILES - !insertmacro MUI_LANGUAGE "English" - - -;-------------------------------- -;Installer Sections - -Section "Dummy Section" SecDummy - -; this is my LAN sample, use your own URL for tests. Sample post.php included - - inetc::post "login=ami&passwd=333" "http://localhost/post.php?lg=iam&pw=44" "$EXEDIR\post_reply.htm" - Pop $0 # return value = exit code, "OK" if OK - MessageBox MB_OK "Download Status: $0" - -SectionEnd - - diff --git a/data/nsis/Examples/Inetc/post.php b/data/nsis/Examples/Inetc/post.php deleted file mode 100644 index d2a40bcb8..000000000 --- a/data/nsis/Examples/Inetc/post.php +++ /dev/null @@ -1,13 +0,0 @@ - - - - -"; -echo "post.passwd=".$_POST['passwd']."
"; -echo "get.lg=".$_GET['lg']."
"; -echo "get.pw=".$_GET['pw']."
"; -?> - - - diff --git a/data/nsis/Examples/Inetc/post_file.nsi b/data/nsis/Examples/Inetc/post_file.nsi deleted file mode 100644 index c93f2961a..000000000 --- a/data/nsis/Examples/Inetc/post_file.nsi +++ /dev/null @@ -1,31 +0,0 @@ - -;-------------------------------- -; General Attributes - -Name "Inetc Post Test" -OutFile "post_file.exe" -RequestExecutionLevel user - - -;-------------------------------- -;Interface Settings - - !include "MUI2.nsh" - !insertmacro MUI_PAGE_INSTFILES - !insertmacro MUI_LANGUAGE "English" - - -;-------------------------------- -;Installer Sections - -Section "Dummy Section" SecDummy - -; this is my LAN sample, use your own URL for tests. Sample post.php included - - inetc::post "$EXEDIR\inetc.cpp" /file "http://localhost/post_file.php" "$EXEDIR\post_file.htm" - Pop $0 # return value = exit code, "OK" if OK - MessageBox MB_OK "Download Status: $0" - -SectionEnd - - diff --git a/data/nsis/Examples/Inetc/post_file.php b/data/nsis/Examples/Inetc/post_file.php deleted file mode 100644 index 1d7b38735..000000000 --- a/data/nsis/Examples/Inetc/post_file.php +++ /dev/null @@ -1,10 +0,0 @@ - $value) { - echo "$header: $value
\n"; -} -echo "new
"; -foreach ($_FILES as $key => $value) echo $key . "<>" . $value . "
\n"; -echo file_get_contents('php://input'); -?> \ No newline at end of file diff --git a/data/nsis/Examples/Inetc/post_form.html b/data/nsis/Examples/Inetc/post_form.html deleted file mode 100644 index 0bde9208d..000000000 --- a/data/nsis/Examples/Inetc/post_form.html +++ /dev/null @@ -1,18 +0,0 @@ - - -Registration form for post.php test - - -This form sends POST request to server. It was interesting to compare server echo
-reply (by included post.php) for this form and InetLoad plug-in - in my
-tests server did not see any difference between them :)
-
- -
-
- - -
- - - diff --git a/data/nsis/Examples/Inetc/put.nsi b/data/nsis/Examples/Inetc/put.nsi deleted file mode 100644 index ce74a0403..000000000 --- a/data/nsis/Examples/Inetc/put.nsi +++ /dev/null @@ -1,31 +0,0 @@ - -;-------------------------------- -; General Attributes - -Name "Inetc Test" -OutFile "put.exe" -RequestExecutionLevel user - - -;-------------------------------- -;Interface Settings - - !include "MUI2.nsh" - !define MUI_ICON "${NSISDIR}\Contrib\Graphics\Icons\modern-install-colorful.ico" - !insertmacro MUI_PAGE_INSTFILES - !insertmacro MUI_LANGUAGE "English" - - -;-------------------------------- -;Installer Sections - -Section "Dummy Section" SecDummy - -; this is my LAN sample, use your own URL for tests. Login/pwd hidden from user. Sample put.php (for http request) included - - inetc::put "http://localhost/put.php" "$EXEDIR\test.jpg" -; inetc::put /POPUP "ftp://localhost/" /CAPTION "my local ftp upload" "ftp://localhost/test.jpg" "$EXEDIR\test.jpg" - Pop $0 - MessageBox MB_OK "Upload Status: $0" - -SectionEnd diff --git a/data/nsis/Examples/Inetc/put.php b/data/nsis/Examples/Inetc/put.php deleted file mode 100644 index dc71943be..000000000 --- a/data/nsis/Examples/Inetc/put.php +++ /dev/null @@ -1,19 +0,0 @@ - diff --git a/data/nsis/Examples/Inetc/recursive.nsi b/data/nsis/Examples/Inetc/recursive.nsi deleted file mode 100644 index a21aa12aa..000000000 --- a/data/nsis/Examples/Inetc/recursive.nsi +++ /dev/null @@ -1,65 +0,0 @@ -Name "Inetc Recursive Dir Upload Test" -OutFile "recursive.exe" -RequestExecutionLevel user - -!include "MUI2.nsh" -!insertmacro MUI_PAGE_INSTFILES -!insertmacro MUI_LANGUAGE "English" -!include "FileFunc.nsh" -!insertmacro GetFileAttributes - -var url -var path - -Function dirul - - Push $0 ; search handle - Push $1 ; file name - Push $2 ; attributes - - FindFirst $0 $1 "$path\*" -loop: - StrCmp $1 "" done - ${GetFileAttributes} "$path\$1" DIRECTORY $2 - IntCmp $2 1 isdir -retry: - Inetc::put $url/$1 "$path\$1" /end - Pop $2 - DetailPrint "$2 $path\$1" - StrCmp $2 "OK" cont - MessageBox MB_YESNO "$path\$1 file upload failed. Retry?" IDYES retry - Abort "terminated by user" - Goto cont -isdir: - StrCmp $1 . cont - StrCmp $1 .. cont - Push $path - Push $url - StrCpy $path "$path\$1" - StrCpy $url "$url/$1" - Call dirul - Pop $url - Pop $path -cont: - FindNext $0 $1 - Goto loop -done: - FindClose $0 - - Pop $2 - Pop $1 - Pop $0 - -FunctionEnd - - -Section "Dummy Section" SecDummy - - SetDetailsView hide - StrCpy $path "$EXEDIR" -; put is dir in the user's ftp home, use //put for root-relative path - StrCpy $url ftp://takhir:pwd@localhost/put - Call dirul - SetDetailsView show - -SectionEnd diff --git a/data/nsis/Examples/Inetc/redirect.nsi b/data/nsis/Examples/Inetc/redirect.nsi deleted file mode 100644 index 3761692ca..000000000 --- a/data/nsis/Examples/Inetc/redirect.nsi +++ /dev/null @@ -1,31 +0,0 @@ - -;-------------------------------- -; General Attributes - -Name "Redirect Test" -OutFile "redirect.exe" -RequestExecutionLevel user - - -;-------------------------------- -;Interface Settings - - !include "MUI2.nsh" - !insertmacro MUI_PAGE_INSTFILES - !insertmacro MUI_LANGUAGE "English" - - -;-------------------------------- -;Installer Sections - -Section "Dummy Section" SecDummy - - SetDetailsView hide - - inetc::get "http://localhost/redirect.php" "$EXEDIR\redirect.htm" /end - Pop $1 - - MessageBox MB_OK "Download Status: $1" - -SectionEnd - diff --git a/data/nsis/Examples/Inetc/redirect.php b/data/nsis/Examples/Inetc/redirect.php deleted file mode 100644 index 900833fe1..000000000 --- a/data/nsis/Examples/Inetc/redirect.php +++ /dev/null @@ -1,6 +0,0 @@ - diff --git a/data/nsis/Examples/Inetc/timeout.nsi b/data/nsis/Examples/Inetc/timeout.nsi deleted file mode 100644 index a8a306963..000000000 --- a/data/nsis/Examples/Inetc/timeout.nsi +++ /dev/null @@ -1,32 +0,0 @@ - -;-------------------------------- -; General Attributes - -Name "Timeout Test" -OutFile "to.exe" -RequestExecutionLevel user - - -;-------------------------------- -;Interface Settings - - !include "MUI2.nsh" - !insertmacro MUI_PAGE_INSTFILES - !insertmacro MUI_LANGUAGE "English" - - - -;-------------------------------- -;Installer Sections - -Section "Dummy Section" SecDummy - -; additional headers. Sample php returns raw headers - inetc::get /receivetimeout 12 "http://localhost/to.php" "$EXEDIR\to.html" - Pop $0 - - MessageBox MB_OK "Download Status: $0" - -SectionEnd - - diff --git a/data/nsis/Examples/Inetc/tostack.nsi b/data/nsis/Examples/Inetc/tostack.nsi deleted file mode 100644 index cfd729b7b..000000000 --- a/data/nsis/Examples/Inetc/tostack.nsi +++ /dev/null @@ -1,32 +0,0 @@ - -;-------------------------------- -; General Attributes - -Name "Inetc To Stack Test" -OutFile "ToStack.exe" -RequestExecutionLevel user - - -;-------------------------------- -;Interface Settings - - !include "MUI2.nsh" - !define MUI_ICON "${NSISDIR}\Contrib\Graphics\Icons\modern-install-colorful.ico" - !insertmacro MUI_PAGE_INSTFILES - !insertmacro MUI_LANGUAGE "English" - - -;-------------------------------- -;Installer Sections - -Section "Dummy Section" SecDummy - - inetc::get /TOSTACK "http://www.google.com" "" /END - Pop $0 # return value = exit code, "OK" if OK - MessageBox MB_OK "Download Status: $0" - Pop $0 # return text - StrLen $1 $0 - MessageBox MB_OK "Download Length: $1" - MessageBox MB_OK "$0" - -SectionEnd diff --git a/data/nsis/Examples/Inetc/translate.nsi b/data/nsis/Examples/Inetc/translate.nsi deleted file mode 100644 index 079cfea08..000000000 --- a/data/nsis/Examples/Inetc/translate.nsi +++ /dev/null @@ -1,33 +0,0 @@ - -;-------------------------------- -; General Attributes - -Name "Inetc Translate Test" -OutFile "Translate.exe" -RequestExecutionLevel user - - -;-------------------------------- -;Interface Settings - - !include "MUI2.nsh" - !define MUI_ICON "${NSISDIR}\Contrib\Graphics\Icons\modern-install-colorful.ico" - !insertmacro MUI_PAGE_WELCOME - !insertmacro MUI_PAGE_INSTFILES - !insertmacro MUI_PAGE_FINISH - !insertmacro MUI_LANGUAGE "Russian" - - -;-------------------------------- -;Installer Sections - -Section "Dummy Section" SecDummy - -; This is russian variant. See Readme.txt for a list of parameters. -; Use LangStrings as TRANSLATE parameters for multilang options - - inetc::load /POPUP "" /CAPTION "Ôàéë ãàëåðåè" /TRANSLATE "URL" "Çàãðóçêà" "Ïîïûòêà ñîåäèíåíèÿ" "Èìÿ ôàéëà" Ïîëó÷åíî "Ðàçìåð" "Îñòàëîñü" "Ïðîøëî" "http://ineum.narod.ru/g06s.htm" "$EXEDIR\g06s.htm" - Pop $0 # return value = exit code, "OK" if OK - MessageBox MB_OK "Download Status: $0" - -SectionEnd diff --git a/data/nsis/Inetc.zip b/data/nsis/Inetc.zip new file mode 100644 index 0000000000000000000000000000000000000000..0da83c6e6648b4dd767836ccba3bcee9139c301e GIT binary patch literal 82721 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

4DvKQ>3ydbwT6k6VTf8+&9bQS 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%0Ab~Co*2Fp4i)N5lFXzj^5L&#at^Qf^9? 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 Ee?|IGh5!Hn literal 0 HcmV?d00001 diff --git a/data/nsis/Md5dll.zip b/data/nsis/Md5dll.zip new file mode 100644 index 0000000000000000000000000000000000000000..1d807717b46875007a32cf086dc3735b86e2a200 GIT binary patch literal 22087 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 z


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 KSQvF#b^jl_BDE&~ literal 0 HcmV?d00001 diff --git a/data/nsis/Nsisunz.zip b/data/nsis/Nsisunz.zip new file mode 100644 index 0000000000000000000000000000000000000000..e7ee2d91d48e95bb04b8d4e1be35c4b0c1910899 GIT binary patch literal 141287 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 )M{5@k!8B@g^-b;7lnyOohgdt^WLah}rp$S{ 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 Cl6}Mg literal 0 HcmV?d00001 diff --git a/doc/build_win.rst b/doc/build_win.rst index c575b548e..7ac4eb53d 100644 --- a/doc/build_win.rst +++ b/doc/build_win.rst @@ -18,7 +18,7 @@ Windows Vista should also work but has not been tested. .. admonition:: already installed? :class: note - There are many similarities to the usual installation process here. if you + There are many similarities to the usual installation process here. If you have already installed ghini.desktop you can skip the first two steps and proceed to step 4 @@ -95,23 +95,22 @@ and enter:: .. admonition:: about the installer :class: note - - The installer is capable of single user or global installs. + - Capable of single user or global installs. - - At this point in time the ghini.desktop installed this way will not check + - At this point in time ghini.desktop installed this way will not check or or notify you of any updated version. You will need to check yourself. - - The installer is capable of downloading extra components: + - Capable of downloading and installing optional extra components: - Apache FOP - If you plan on using xslt templates to produce PDFs then - install FOP. There is no uninstaller with this component. FOP - requires the Java Runtime so if you do not currently have it installed - the ghini.desktop installer will let you know and can open the Oracle - web site for you to download and install it from. + install FOP. FOP requires the Java Runtime. If you do not currently + have it installed the installer will let you know and offer to open + the Oracle web site for you to download and install it from. - MS Visual C runtime - You most likely don't need this but if you have any trouble getting ghini.desktop to run try installing the MS Visual - C runtime (rerun the installer and select this component only). + C runtime (e.g. rerun the installer and select this component only). - Can be run silently using switches (e.g. for remote deployment) where: @@ -121,12 +120,12 @@ and enter:: - ``/C=[gFC]`` to specify components where: - g = Deselect the main ghini.desktop component (used for component - only installs) + ``g`` = Deselect the main ghini.desktop component (used for + component only installs) - F = select Apache FOP + ``F`` = select Apache FOP - C = select MS Visual C runtime + ``C`` = select MS Visual C runtime .. _Direct link to download git: https://github.com/git-for-windows/git/releases/download/v2.13.3.windows.1/Git-2.13.3-32-bit.exe diff --git a/scripts/build_win.bat b/scripts/build_win.bat index 575d4148f..8734a456a 100644 --- a/scripts/build_win.bat +++ b/scripts/build_win.bat @@ -26,10 +26,10 @@ pip install Pygments ECHO cleaning up python setup.py clean -ECHO installing dependencies - without eggs +ECHO installing without eggs pip install . -ECHO building frozen distribution +ECHO building frozen python setup.py py2exe REM Freeze only? diff --git a/setup.py b/setup.py index d96b17c67..17d474e24 100755 --- a/setup.py +++ b/setup.py @@ -2,7 +2,7 @@ # # Copyright (c) 2005,2006,2007,2008,2009 Brett Adams # Copyright (c) 2015 Mario Frasca -# Copyright (c) 2016 Ross Demuth +# Copyright (c) 2016,2017 Ross Demuth # # This file is part of ghini.desktop. # @@ -129,6 +129,7 @@ [m.replace(os.sep, '/') for m in matches])) class py2exe_cmd(_py2exe_cmd): + description = 'build standalone Windows executable' def run(self): # TODO: make sure we have everything installed that we need to # bundle e.g. sqlite, psycopg2, others... @@ -181,34 +182,44 @@ def run(self): file_util.copy_file("LICENSE", os.path.join(self.dist_dir, 'share', 'LICENSE.ghini')) - class nsis_cmd(Command): - # 1. copy the gtk dist to the dist directory - # 2. run the script to update the pixbuf paths - # 3. run the nsis command to create the installer - # 4. do everything silent, don't use the NSIS compiler GUI - user_options = [] + class NsisCmd(Command): + """Command to create a Windows NSIS installer""" - def initialize_options(self): - pass + description = 'build windows NSIS installer' - def finalize_options(self): - pass + user_options = [ + ('makensis=', 'm', 'path to makensis'), + ('nsis-script=', 's', 'script to build installer from') + ] - def run(self): - # if all(parts in (None, "") for parts in (sp, rank, cv)): + def initialize_options(self): envars = ['programw6432', 'programfiles', 'localappdata'] mns = 'nsis\\makensis' - nsis_script = 'scripts\\build-multiuser.nsi' locs = [os.path.join(os.getenv(ev, 'c:\\'), mns) for ev in envars] - makensis = ([loc for loc in locs if spawn.find_executable(loc)] + - [spawn.find_executable('makensis')])[0] - if not makensis: - msg = ('** Error: Building Ghini.desktop NSIS installer ' - 'requires NSIS to be installed somewhere easy to find') - print msg - sys.exit(1) - print 'using %s to build %s' % (makensis, nsis_script) - os.system('"%s" %s' % (makensis, nsis_script)) + self.makensis = ( + [loc for loc in locs if spawn.find_executable(loc)] + + [spawn.find_executable('makensis')])[0] + self.nsis_script = 'scripts\\build-multiuser.nsi' + + def finalize_options(self): + if self.makensis: + is_exe = spawn.find_executable(self.makensis) is not None + exe_name = os.path.split(self.makensis)[-1] + is_makensis = exe_name in ('makensis', 'makensis.exe') + if not is_exe or not is_makensis: + raise Exception('makensis not found at: %s' % self.makensis) + else: + raise Exception('can not find makensis, NSIS needs to be ' + 'installed in the default location, on the ' + 'path or provided using --makensis=') + + if not os.path.exists(self.nsis_script): + raise Exception('can not find nsis build script at: %s' + % self.nsis_script) + + def run(self): + print 'using %s to build %s' % (self.makensis, self.nsis_script) + os.system('"%s" %s' % (self.makensis, self.nsis_script)) else: py2exe_options = {} @@ -229,9 +240,11 @@ def run(self): print sys.exit(1) class py2exe_cmd(_empty_cmd): + description = 'build Windows executable *ONLY AVAILABLE IN WINDOWS' pass - class nsis_cmd(_empty_cmd): + class NsisCmd(_empty_cmd): + description = 'build Windows NSIS installer *ONLY AVAILABLE IN WINDOWS' pass @@ -442,7 +455,7 @@ def run(self): # package_data or data_files setuptools.setup(name="ghini.desktop", cmdclass={'build': build, 'install': install, - 'py2exe': py2exe_cmd, 'nsis': nsis_cmd, + 'py2exe': py2exe_cmd, 'nsis': NsisCmd, 'docs': docs, 'clean': clean, 'run': run}, version=version, scripts=scripts, From 62b436fce14c454a015e163c97aaa41b0ac580dc Mon Sep 17 00:00:00 2001 From: RoDuth Date: Sun, 22 Oct 2017 09:45:14 +1000 Subject: [PATCH 23/25] Provide a method to register gtk components For win frozen state after py2exe build. --- doc/build_win.rst | 7 ++++++- scripts/build_win.bat | 6 +++++- scripts/win_gtk.bat | 4 ++++ 3 files changed, 15 insertions(+), 2 deletions(-) create mode 100644 scripts/win_gtk.bat diff --git a/doc/build_win.rst b/doc/build_win.rst index 7ac4eb53d..21a0678e2 100644 --- a/doc/build_win.rst +++ b/doc/build_win.rst @@ -75,7 +75,12 @@ Windows Vista should also work but has not been tested. Files``). If all you want is this frozen copy then you will not need to install NSIS and can run the above command with the '/f' switch (i.e. ``scripts\build_win.bat /f``). To start ghini.desktop double click - ``ghini.exe`` in explorer or (create a shortcut to it). + ``ghini.exe`` in explorer (or create a shortcut to it). If you have issues + with PyGTK not displaying correctly you need to run the script + ``win_gtk.bat`` from the ``dist`` folder to set up paths correctly. Runing + ``build_win /f`` will place this script in the dist folder for you. You + will only need to run this once each time the location of the folder + changes. There after ``ghini.exe`` will run as expected. In future if you wish to build further installers just open a command prompt and enter:: diff --git a/scripts/build_win.bat b/scripts/build_win.bat index 8734a456a..792562928 100644 --- a/scripts/build_win.bat +++ b/scripts/build_win.bat @@ -33,7 +33,11 @@ ECHO building frozen python setup.py py2exe REM Freeze only? -if "%1"=="/f" GOTO :EOF +if "%1"=="/f" GOTO SKIP_NSIS ECHO building NSIS installer python setup.py nsis +GOTO :EOF + +:SKIP_NSIS +copy scripts\win_gtk.bat dist diff --git a/scripts/win_gtk.bat b/scripts/win_gtk.bat new file mode 100644 index 000000000..0c43cd908 --- /dev/null +++ b/scripts/win_gtk.bat @@ -0,0 +1,4 @@ +gtk\bin\pango-querymodules.exe > gtk\etc\pango\pango.modules' +gtk\bin\gtk-query-immodules-2.0.exe > gtk\etc\gtk-2.0\gtk.immodules' +gtk\bin\gdk-pixbuf-query-loaders.exe > gtk\etc\gtk-2.0\gdk-pixbuf.loaders' +gtk\bin\gdk-pixbuf-query-loaders.exe > gtk\lib\gdk-pixbuf-2.0\2.10.0\loaders.cache' From b19f2827f7c1f4d11a15ad45dc61482888cc4909 Mon Sep 17 00:00:00 2001 From: RoDuth Date: Sun, 22 Oct 2017 11:25:37 +1000 Subject: [PATCH 24/25] remove old build.nsi from bump_version --- scripts/bump_version.py | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/scripts/bump_version.py b/scripts/bump_version.py index 0b8405933..deb7c6357 100755 --- a/scripts/bump_version.py +++ b/scripts/bump_version.py @@ -125,7 +125,7 @@ def bump_desktop_file(filename): bump_file(filename, rx) -def bump_nsi_file(filename, varname='version'): +def bump_nsi_file(filename, varname='VERSION'): """ bump NSIS installer files """ @@ -136,9 +136,7 @@ def bump_nsi_file(filename, varname='version'): bump_py_file(os.path.join(root_of_clone(), 'bauble/version.py')) bump_py_file(os.path.join(root_of_clone(), 'doc/conf.py'), 'release') bump_desktop_file(os.path.join(root_of_clone(), 'data/ghini.desktop')) -bump_nsi_file(os.path.join(root_of_clone(), 'scripts/build.nsi')) -bump_nsi_file(os.path.join(root_of_clone(), 'scripts/build-multiuser.nsi'), - 'VERSION') +bump_nsi_file(os.path.join(root_of_clone(), 'scripts/build-multiuser.nsi')) rx = "(^VERSION=\").*?\..*?\..*?(\".*?%s.*?$)" % bump_tag bump_file(os.path.join(root_of_clone(), 'packages/builddeb.sh'), rx) From 23aa20ce1cfec5c1bf3a04f1e2193ef5f2aec0c6 Mon Sep 17 00:00:00 2001 From: RoDuth Date: Mon, 23 Oct 2017 01:32:03 +1000 Subject: [PATCH 25/25] build_win accept spaces in homepath --- scripts/build_win.bat | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/scripts/build_win.bat b/scripts/build_win.bat index 792562928..25cb3b04f 100644 --- a/scripts/build_win.bat +++ b/scripts/build_win.bat @@ -1,20 +1,20 @@ @echo off -IF NOT EXIST %HOMEDRIVE%%HOMEPATH%\.virtualenvs\ghi2exe\Scripts\activate.bat ( +IF NOT EXIST "%HOMEDRIVE%%HOMEPATH%"\.virtualenvs\ghi2exe\Scripts\activate.bat ( ECHO creating an isolated virtual environment to build in pip install virtualenv - virtualenv --system-site-packages %HOMEDRIVE%%HOMEPATH%\.virtualenvs\ghi2exe + virtualenv --system-site-packages "%HOMEDRIVE%%HOMEPATH%"\.virtualenvs\ghi2exe ) IF "%VIRTUAL_ENV%"=="" ( ECHO Activating virtual environment to build in. - call %HOMEDRIVE%%HOMEPATH%\.virtualenvs\ghi2exe\Scripts\activate.bat + call "%HOMEDRIVE%%HOMEPATH%"\.virtualenvs\ghi2exe\Scripts\activate.bat ) else ( ECHO Currently using virtual environment: "%VIRTUAL_ENV%" IF NOT "%VIRTUAL_ENV%"=="%HOMEDRIVE%%HOMEPATH%\.virtualenvs\ghi2exe" ( ECHO deactivating previous virtual environment and activating one to build in deactivate - call %HOMEDRIVE%%HOMEPATH%\.virtualenvs\ghi2exe\Scripts\activate.bat + call "%HOMEDRIVE%%HOMEPATH%"\.virtualenvs\ghi2exe\Scripts\activate.bat ) )