This commit was generated by cvs2svn to compensate for changes in r2,
which included commits to RCS files with non-trunk default branches. git-svn-id: https://svn.code.sf.net/p/nsis/code/NSIS/trunk@625 212acab6-be3b-0410-9dea-997c60f758d6
102
Contrib/ExDLL/exdll.c
Normal file
|
@ -0,0 +1,102 @@
|
|||
#include <windows.h>
|
||||
|
||||
typedef struct _stack_t {
|
||||
struct _stack_t *next;
|
||||
char text[1]; // this should be the length of string_size
|
||||
} stack_t;
|
||||
|
||||
int popstring(char *str); // 0 on success, 1 on empty stack
|
||||
void pushstring(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_LAST
|
||||
};
|
||||
|
||||
char *getuservariable(int varnum);
|
||||
|
||||
|
||||
HINSTANCE g_hInstance;
|
||||
HWND g_hwndParent;
|
||||
int g_stringsize;
|
||||
stack_t **g_stacktop;
|
||||
char *g_variables;
|
||||
|
||||
void __declspec(dllexport) myFunction(HWND hwndParent, int string_size,
|
||||
char *variables, stack_t **stacktop)
|
||||
{
|
||||
g_hwndParent=hwndParent;
|
||||
g_stringsize=string_size;
|
||||
g_stacktop=stacktop;
|
||||
g_variables=variables;
|
||||
|
||||
// do your stuff here
|
||||
{
|
||||
char buf[1024];
|
||||
wsprintf(buf,"$0=%s\n",getuservariable(INST_0));
|
||||
MessageBox(g_hwndParent,buf,0,MB_OK);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
BOOL WINAPI _DllMainCRTStartup(HANDLE hInst, ULONG ul_reason_for_call, LPVOID lpReserved)
|
||||
{
|
||||
g_hInstance=hInst;
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
|
||||
// utility functions (not required but often useful)
|
||||
int 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;
|
||||
}
|
||||
|
||||
void pushstring(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;
|
||||
}
|
||||
|
||||
char *getuservariable(int varnum)
|
||||
{
|
||||
if (varnum < 0 || varnum >= __INST_LAST) return NULL;
|
||||
return g_variables+varnum*g_stringsize;
|
||||
}
|
||||
|
||||
|
122
Contrib/ExDLL/exdll.dpr
Normal file
|
@ -0,0 +1,122 @@
|
|||
{
|
||||
NSIS ExDLL example
|
||||
(C) 2001 - Peter Windridge
|
||||
|
||||
Fixed and formatted by Alexander Tereschenko
|
||||
http://futuris.plastiqueweb.com/
|
||||
|
||||
Tested in Delphi 6.01
|
||||
}
|
||||
|
||||
library exdll;
|
||||
|
||||
uses Windows;
|
||||
|
||||
type
|
||||
VarConstants = (
|
||||
INST_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_LAST
|
||||
);
|
||||
TVariableList = INST_0..__INST_LAST;
|
||||
pstack_t = ^stack_t;
|
||||
stack_t = record
|
||||
next: pstack_t;
|
||||
text: PChar;
|
||||
end;
|
||||
|
||||
var
|
||||
g_stringsize: integer;
|
||||
g_stacktop: ^pstack_t;
|
||||
g_variables: PChar;
|
||||
g_hwndParent: HWND;
|
||||
|
||||
function PopString(str: PChar):integer;
|
||||
var
|
||||
th: pstack_t;
|
||||
begin
|
||||
if integer(g_stacktop^) = 0 then
|
||||
begin
|
||||
Result:=1;
|
||||
Exit;
|
||||
end;
|
||||
th:=g_stacktop^;
|
||||
lstrcpy(str,@th.text);
|
||||
g_stacktop^ := th.next;
|
||||
GlobalFree(HGLOBAL(th));
|
||||
Result:=0;
|
||||
end;
|
||||
|
||||
function PushString(str: PChar):integer;
|
||||
var
|
||||
th: pstack_t;
|
||||
begin
|
||||
if integer(g_stacktop) = 0 then
|
||||
begin
|
||||
Result:=1;
|
||||
Exit;
|
||||
end;
|
||||
th:=pstack_t(GlobalAlloc(GPTR,sizeof(stack_t)+g_stringsize));
|
||||
lstrcpyn(@th.text,str,g_stringsize);
|
||||
th.next:=g_stacktop^;
|
||||
g_stacktop^:=th;
|
||||
Result:=0;
|
||||
end;
|
||||
|
||||
function GetUserVariable(varnum: TVariableList):PChar;
|
||||
begin
|
||||
if (integer(varnum) < 0) or (integer(varnum) >= integer(__INST_LAST)) then
|
||||
begin
|
||||
Result:='';
|
||||
Exit;
|
||||
end;
|
||||
Result:=g_variables+integer(varnum)*g_stringsize;
|
||||
end;
|
||||
|
||||
function ex_dll(hwndParent: HWND; string_size: integer; variables: PChar; stacktop: pointer):integer; cdecl;
|
||||
var
|
||||
c: PChar;
|
||||
buf: array[0..1024] of char;
|
||||
begin
|
||||
// set up global variables
|
||||
g_stringsize:=string_size;
|
||||
g_hwndParent:=hwndParent;
|
||||
g_stringsize:=string_size;
|
||||
g_stacktop:=stacktop;
|
||||
g_variables:=variables;
|
||||
|
||||
c:=GetUserVariable(INST_0);
|
||||
MessageBox(g_hwndParent,c,'The value of $0',MB_OK);
|
||||
PopString(@buf);
|
||||
MessageBox(g_hwndParent,@buf,'pop',MB_OK);
|
||||
PushString(PChar('Hello, this is a push'));
|
||||
|
||||
Result:=1;
|
||||
end;
|
||||
|
||||
exports ex_dll;
|
||||
|
||||
begin
|
||||
end.
|
107
Contrib/ExDLL/exdll.dsp
Normal file
|
@ -0,0 +1,107 @@
|
|||
# Microsoft Developer Studio Project File - Name="exdll" - Package Owner=<4>
|
||||
# Microsoft Developer Studio Generated Build File, Format Version 6.00
|
||||
# ** DO NOT EDIT **
|
||||
|
||||
# TARGTYPE "Win32 (x86) Dynamic-Link Library" 0x0102
|
||||
|
||||
CFG=exdll - 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 "exdll.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 "exdll.mak" CFG="exdll - Win32 Debug"
|
||||
!MESSAGE
|
||||
!MESSAGE Possible choices for configuration are:
|
||||
!MESSAGE
|
||||
!MESSAGE "exdll - Win32 Release" (based on "Win32 (x86) Dynamic-Link Library")
|
||||
!MESSAGE "exdll - 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)" == "exdll - 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 "EXDLL_EXPORTS" /YX /FD /c
|
||||
# ADD CPP /nologo /MT /W3 /GX /O1 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "EXDLL_EXPORTS" /YX /FD /c
|
||||
# ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /win32
|
||||
# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /win32
|
||||
# ADD BASE RSC /l 0x409 /d "NDEBUG"
|
||||
# ADD RSC /l 0x409 /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 gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /entry:"_DllMainCRTStartup" /dll /machine:I386 /nodefaultlib /out:"../../exdll.dll" /opt:nowin98
|
||||
# SUBTRACT LINK32 /pdb:none
|
||||
|
||||
!ELSEIF "$(CFG)" == "exdll - 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 "EXDLL_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 "EXDLL_EXPORTS" /YX /FD /GZ /c
|
||||
# ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /win32
|
||||
# ADD MTL /nologo /D "_DEBUG" /mktyplib203 /win32
|
||||
# ADD BASE RSC /l 0x409 /d "_DEBUG"
|
||||
# ADD RSC /l 0x409 /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 "exdll - Win32 Release"
|
||||
# Name "exdll - Win32 Debug"
|
||||
# Begin Group "Source Files"
|
||||
|
||||
# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat"
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=.\exdll.c
|
||||
# End Source File
|
||||
# End Group
|
||||
# Begin Group "Header Files"
|
||||
|
||||
# PROP Default_Filter "h;hpp;hxx;hm;inl"
|
||||
# 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
|
29
Contrib/ExDLL/exdll.dsw
Normal file
|
@ -0,0 +1,29 @@
|
|||
Microsoft Developer Studio Workspace File, Format Version 6.00
|
||||
# WARNING: DO NOT EDIT OR DELETE THIS WORKSPACE FILE!
|
||||
|
||||
###############################################################################
|
||||
|
||||
Project: "exdll"=.\exdll.dsp - Package Owner=<4>
|
||||
|
||||
Package=<5>
|
||||
{{{
|
||||
}}}
|
||||
|
||||
Package=<4>
|
||||
{{{
|
||||
}}}
|
||||
|
||||
###############################################################################
|
||||
|
||||
Global:
|
||||
|
||||
Package=<5>
|
||||
{{{
|
||||
}}}
|
||||
|
||||
Package=<3>
|
||||
{{{
|
||||
}}}
|
||||
|
||||
###############################################################################
|
||||
|
BIN
Contrib/Icons/checks1.bmp
Normal file
After Width: | Height: | Size: 886 B |
BIN
Contrib/Icons/checks2.bmp
Normal file
After Width: | Height: | Size: 886 B |
BIN
Contrib/Icons/checks4.bmp
Normal file
After Width: | Height: | Size: 886 B |
BIN
Contrib/Icons/checksX.bmp
Normal file
After Width: | Height: | Size: 886 B |
BIN
Contrib/Icons/checksX2.bmp
Normal file
After Width: | Height: | Size: 886 B |
BIN
Contrib/Icons/jarsonic-checks.bmp
Normal file
After Width: | Height: | Size: 886 B |
BIN
Contrib/Icons/lucas-checks.bmp
Normal file
After Width: | Height: | Size: 886 B |
BIN
Contrib/Icons/normal-install.ico
Normal file
After Width: | Height: | Size: 766 B |
BIN
Contrib/Icons/normal-uninstall.ico
Normal file
After Width: | Height: | Size: 766 B |
BIN
Contrib/Icons/setup.ico
Normal file
After Width: | Height: | Size: 766 B |
363
Contrib/InstallOptions/Install Options.html
Normal file
|
@ -0,0 +1,363 @@
|
|||
<HTML><HEAD><TITLE>Install Options/DLL Documentation</TITLE></HEAD>
|
||||
<BODY bgColor=#ffffff>
|
||||
<CENTER><FONT size=+2><A
|
||||
href="http://installoptions.sourceforge.net/"><B>Install
|
||||
Options</B></A> (/DLL)</FONT><BR><FONT size=-1>Copyright © 2001 <A
|
||||
href="mailto:mbishop@bytealliance.com?subject=Installer Options">Michael
|
||||
Bishop</A> (original version) and Nullsoft, Inc. (DLL conversion and integration)
|
||||
</FONT></CENTER>
|
||||
<UL><B>Table of Contents</B>
|
||||
<LI><A
|
||||
href="#introduction">Introduction</A>
|
||||
|
||||
<LI><A
|
||||
href="#history">Version
|
||||
History</A>
|
||||
<LI><A
|
||||
href="#license">License</A>
|
||||
</LI></UL>
|
||||
<HR>
|
||||
<A name=introduction><B>Introduction:</B><BR><I>Installer Options</I> was a quick
|
||||
application Michael Bishop threw together so he could prompt the user for some information
|
||||
during the install process. This version is a highly modified version of it that is designed
|
||||
as a NSIS extension DLL for the <A
|
||||
href="http://www.nullsoft.com/free/nsis/">NSIS</A> installer. Installer Options will create a
|
||||
dialog box which will be displayed inside of the NSIS window. The dialog box is
|
||||
defined by an INI file, which allows you to define the layout of controls by
|
||||
changing the INI file.
|
||||
<P>To use the DLL, you should include it as part of your installation.
|
||||
Extract it to known location (probably $TEMP), and then load it using CallInstDLL, passing one parameter on the stack.
|
||||
The one parameter is a name of an .ini file that defines the window.
|
||||
Example: <PRE>
|
||||
SetOutPath $TEMP
|
||||
File inst.ini
|
||||
File InstallOptions.dll
|
||||
Push $TEMP\inst.ini
|
||||
CallInstDLL $TEMP\InstallOptions.dll dialog
|
||||
Pop $0
|
||||
; ($0 would be "success" "cancel" "back" or some other value on error.
|
||||
|
||||
ReadINIStr $1 $TEMP\inst.ini "Field 1" State ; $1 = field #1's state
|
||||
|
||||
Delete $TEMP\inst.nsi
|
||||
Delete $TEMP\InstallOptions.dll
|
||||
</PRE>
|
||||
It is often very useful to call InstallOptions from the NSIS callback functions .onNextPage and .onPrevPage.
|
||||
<P>The INI file has one required section. This section includes the number of controls to be created as well as general window attributes. The INI file also
|
||||
includes a variable number of Field sections which are used to create the
|
||||
controls to be displayed.
|
||||
<P>The required section is named "<I>Settings</I>". It will contain the
|
||||
following values:
|
||||
<UL>
|
||||
<TABLE border=0>
|
||||
<TBODY>
|
||||
<TR>
|
||||
<TD vAlign=top bgColor=#cccccc><B>NumFields</B></TD>
|
||||
<TD vAlign=top bgColor=#cccccc><I>(required)</I></TD>
|
||||
<TD vAlign=top bgColor=#eeeeee>The number of control elements to be
|
||||
displayed on the dialog window.</TD></TR>
|
||||
<TR>
|
||||
<TD vAlign=top bgColor=#cccccc><B>Title</B></TD>
|
||||
<TD vAlign=top bgColor=#cccccc><I>(optional)</I></TD>
|
||||
<TD vAlign=top bgColor=#eeeeee>If specified, gives the text to set the
|
||||
titlebar to. Otherwise, the titlebar text is not changed.</TD></TR>
|
||||
<TR>
|
||||
<TD vAlign=top bgColor=#cccccc><B>CancelConfirm</B></TD>
|
||||
<TD vAlign=top bgColor=#cccccc><I>(optional)</I></TD>
|
||||
<TD vAlign=top bgColor=#eeeeee>If specified, prompts the user (With text) whether or not to cancel if they select the cancel button.</TD></TR>
|
||||
<TR>
|
||||
<TD vAlign=top bgColor=#cccccc><B>BackEnabled</B></TD>
|
||||
<TD vAlign=top bgColor=#cccccc><I>(optional)</I></TD>
|
||||
<TD vAlign=top bgColor=#eeeeee>Controls whether or not the back button in the NSIS window is enabled. If set to 0 or omitted, the back button will be disabled. If set to 1, the back button will be enabled.</TD></TR>
|
||||
<TR>
|
||||
<TD vAlign=top bgColor=#cccccc><B>CancelButtonText</B></TD>
|
||||
<TD vAlign=top bgColor=#cccccc><I>(optional)</I></TD>
|
||||
<TD vAlign=top bgColor=#eeeeee>Overrides the text for the cancel button. If not specified, the cancel button text will not be changed. Recommended value: "Cancel"</TD></TR>
|
||||
<TR>
|
||||
<TD vAlign=top bgColor=#cccccc><B>NextButtonText</B></TD>
|
||||
<TD vAlign=top bgColor=#cccccc><I>(optional)</I></TD>
|
||||
<TD vAlign=top bgColor=#eeeeee>Overrides the text for the next button. If not specified, the next button text will not be changed. Recommended value: "Next >"</TD></TR>
|
||||
<TR>
|
||||
<TD vAlign=top bgColor=#cccccc><B>BackButtonText</B></TD>
|
||||
<TD vAlign=top bgColor=#cccccc><I>(optional)</I></TD>
|
||||
<TD vAlign=top bgColor=#eeeeee>Overrides the text for the back button. If not specified, the back button text will not be changed. Recommended value: "< Back"</TD></TR>
|
||||
</TBODY></TABLE></UL>
|
||||
<P>Each field section has the heading "Field #" where # must be sequential
|
||||
numbers from 1 to NumFields. Each Field section contains the following values:
|
||||
<UL>
|
||||
<TABLE border=0>
|
||||
<TBODY>
|
||||
<TR>
|
||||
<TD vAlign=top bgColor=#cccccc><B>Type</B></TD>
|
||||
<TD vAlign=top bgColor=#cccccc><I>(required)</I></TD>
|
||||
<TD vAlign=top bgColor=#eeeeee>Type of control to be created. Valid
|
||||
values are "<I>Label</I>", "<I>Text</I>", "<I>Password</I>",
|
||||
"<I>Combobox</I>", "<I>DropList</I>", "<I>Listbox</I>", "<I>CheckBox</I>",
|
||||
"<I>RadioButton</I>",
|
||||
"<I>FileRequest</I>", or "<I>DirRequest</I>".<BR><FONT size=-1>A
|
||||
"<I>label</I>" is used to display static text. (i.e. a caption for a
|
||||
textbox)<BR>A "<I>textbox</I>" and "<I>password</I>" accept text input
|
||||
from the user. "<I>password</I>" masks the input with * characters.<BR>A
|
||||
"<I>combobox</I>" allows the user to type text not in the popup list, a
|
||||
"<I>droplist</I>" only allows selection of items in the list.<BR>A
|
||||
"<I>listbox</I>" shows multiple items and can optionally allow the user
|
||||
to select more than one item.<BR>
|
||||
A "<I>CheckBox</I>" control displays a check box with label.<BR>
|
||||
A "<I>RadioButton</I>" control displays a radio button with label.<BR>
|
||||
A "<I>FileRequest</I>" control displays
|
||||
a textbox and a browse button. Clicking the browse button will display a
|
||||
file requester where the user can browse for a file.<BR>A
|
||||
"<I>DirRequest</I>" control displays a textbox and a browse button.
|
||||
Clicking the browse button will display a directory requester where the
|
||||
user can browse for a directory.<BR></FONT></TD></TR>
|
||||
<TR>
|
||||
<TD vAlign=top bgColor=#cccccc><B>Text</B></TD>
|
||||
<TD vAlign=top bgColor=#cccccc><I>(optional)</I></TD>
|
||||
<TD vAlign=top bgColor=#eeeeee>Specifies the caption of a label, checkbox, or radio button control.
|
||||
</TD></TR>
|
||||
<TR>
|
||||
<TD vAlign=top bgColor=#cccccc><B>State</B></TD>
|
||||
<TD vAlign=top bgColor=#cccccc><I>(optional)</I></TD>
|
||||
<TD vAlign=top bgColor=#eeeeee>Specifies the state of the control. This is updated when the user closes the window,
|
||||
so you can read from it from NSIS. For edit texts and dir and file request boxes, this is the string that is
|
||||
specified. For radio button and check boxes, this can be '0' or '1' (for unchecked or checked).
|
||||
</TD></TR>
|
||||
<TR>
|
||||
<TD vAlign=top bgColor=#cccccc><B>ListItems</B></TD>
|
||||
<TD vAlign=top bgColor=#cccccc><I>(optional)</I></TD>
|
||||
<TD vAlign=top bgColor=#eeeeee>A list of items to display in a combobox,
|
||||
droplist, or listbox.<BR>This is a single line of text with each item
|
||||
separated by a pipe character '<B>|</B>'</TD></TR>
|
||||
<TR>
|
||||
<TD vAlign=top bgColor=#cccccc><B>MaxLen</B></TD>
|
||||
<TD vAlign=top bgColor=#cccccc><I>(optional)</I></TD>
|
||||
<TD vAlign=top bgColor=#eeeeee>Causes validation on the selected control
|
||||
to limit the maximum length of text.<BR>If the user specifies more text
|
||||
than this, a message box will appear when they click "OK" and the dialog
|
||||
will not be dismissed.<BR><FONT size=-1>You should not use this on a
|
||||
"<I>combobox</I>" since the user can not control what is
|
||||
selected.</FONT><BR><FONT size=-1>This should be set to a maximum of 260
|
||||
for "<I>FileRequest</I>" and "<I>DirRequest</I>"
|
||||
controls.</FONT><BR><FONT size=-1>Ignored on "<I>label</I>"
|
||||
controls.</FONT></TD></TR>
|
||||
<TR>
|
||||
<TD vAlign=top bgColor=#cccccc><B>MinLen</B></TD>
|
||||
<TD vAlign=top bgColor=#cccccc><I>(optional)</I></TD>
|
||||
<TD vAlign=top bgColor=#eeeeee>Causes validation on the selected control
|
||||
to force the user to enter a minimum amount of text.<BR>If the user
|
||||
specifies less text than this, a message box will appear when they click
|
||||
"OK" and the dialog will not be dismissed.<BR>Unlike MaxLen, this is
|
||||
useful for "<I>Combobox</I>" controls. By setting this to a value of "1"
|
||||
the program will force the user to select an item.<BR><FONT
|
||||
size=-1>Ignored on "<I>label</I>" controls.</FONT></TD></TR>
|
||||
<TR>
|
||||
<TD vAlign=top bgColor=#cccccc><B>ValidateText</B></TD>
|
||||
<TD vAlign=top bgColor=#cccccc><I>(optional)</I></TD>
|
||||
<TD vAlign=top bgColor=#eeeeee>If a particular field fails the test for
|
||||
"<I>MinLen</I>" or "<I>MaxLen</I>", a messagebox will be displayed with
|
||||
this text.<BR><FONT size=-1>NOTE: The only formatting performed on this
|
||||
text is "\n" will be replaced with a newline in the
|
||||
messagebox.</FONT></TD></TR>
|
||||
<TR>
|
||||
<TD vAlign=top bgColor=#cccccc><B>Left<BR>Right<BR>Top<BR>Bottom</B></TD>
|
||||
<TD vAlign=top bgColor=#cccccc><I>(required)</I></TD>
|
||||
<TD vAlign=top bgColor=#eeeeee>The position on the dialog where this
|
||||
control appears.<BR>Sorry, no GUI here to help you.<BR><FONT color=red
|
||||
size=-1>NOTE: For combobox or droplist, the "<I>bottom</I>" value is not
|
||||
used in the same way.<BR>In this case, the bottom value is the maximum
|
||||
size of the window when the pop-up list is being displayed. All other
|
||||
times, the combobox is automatically szed to be one element tall. If you
|
||||
have trouble where you can not see the combobox drop-down, then check
|
||||
the bottom value and ensure it is large enough. <BR>NOTE (2):
|
||||
FileRequest and DirRequest controls will allocate 20 pixels to the
|
||||
browse button. Make this control wide enough the contents of the textbox
|
||||
can be seen. Note that you can specify negative coordinates to specify the distance from the right or bottom edge.</FONT></TD></TR>
|
||||
<TR>
|
||||
<TD vAlign=top bgColor=#cccccc><B>Filter</B></TD>
|
||||
<TD vAlign=top bgColor=#cccccc><I>(optional)</I></TD>
|
||||
<TD vAlign=top bgColor=#eeeeee>Specifies the filter to be used in the
|
||||
"<I>FileRequest</I>" control.<BR>This is constructed by putting pairs of
|
||||
entries together, each item seperated by a | character.<BR>The first
|
||||
value in each pair is the text to display for the filter.<BR>The second
|
||||
value is the pattern to use to match files.<BR>For example, you might
|
||||
specify:<BR>
|
||||
<UL>Filter=Text Files|*.txt|Programs|*.exe;*.com|All Files|*.*
|
||||
</UL><FONT size=-1>If not specified, then the filter defaults to All
|
||||
Files|*.*</FONT><BR><FONT size=-1>NOTE: you should not put any extra
|
||||
spaces around the | characters.</FONT> </TD></TR>
|
||||
<TR>
|
||||
<TD vAlign=top bgColor=#cccccc><B>Root</B></TD>
|
||||
<TD vAlign=top bgColor=#cccccc><I>(optional)</I></TD>
|
||||
<TD vAlign=top bgColor=#eeeeee>Used by <I>DirRequest</I> controls to
|
||||
specify the root directory of the search. By default, this allows the
|
||||
user to browse any directory on the computer. This will limit the search
|
||||
to a particular directory on the system.</TD></TR>
|
||||
<TR>
|
||||
<TD vAlign=top bgColor=#cccccc><B>Flags</B></TD>
|
||||
<TD vAlign=top bgColor=#cccccc><I>(optional)</I></TD>
|
||||
<TD vAlign=top bgColor=#eeeeee>This specifies additional flags for the
|
||||
display of different controls. Each value should be seperated by a |
|
||||
character, and you should be careful not to put any spaces around the |
|
||||
character.<BR>
|
||||
<TABLE border=0>
|
||||
<TBODY>
|
||||
<TR>
|
||||
<TD vAlign=top><B>Value</B></TD>
|
||||
<TD vAlign=top><B>Meaning</B></TD></TR>
|
||||
<TR>
|
||||
<TD vAlign=top>REQ_SAVE</TD>
|
||||
<TD vAlign=top>This causes the "<I>FileRequest</I>" to dislpay a
|
||||
Save As dialog. If not specified, an Open dialog is used.</TD></TR>
|
||||
<TR>
|
||||
<TD vAlign=top>FILE_MUST_EXIST</TD>
|
||||
<TD vAlign=top>Used by "<I>FileRequest</I>" to determine if the
|
||||
selected file must exist.<BR>This only applies if an "Open" dialog
|
||||
is being displayed.<BR><FONT size=-1>This currently does not force
|
||||
the file to exist other than through the browse
|
||||
button.</FONT></TD></TR>
|
||||
<TR>
|
||||
<TD vAlign=top>FILE_EXPLORER</TD>
|
||||
<TD vAlign=top>Used by "<I>FileRequest</I>", enables new file request look (recommended)</FONT></TD></TR>
|
||||
<TR>
|
||||
<TD vAlign=top>FILE_HIDEREADONLY</TD>
|
||||
<TD vAlign=top>Used by "<I>FileRequest</I>", hides "open read only" checkbox in open dialog.</FONT></TD></TR>
|
||||
<TR>
|
||||
<TD vAlign=top>WARN_IF_EXIST</TD>
|
||||
<TD vAlign=top>Used by "<I>FileRequest</I>" to display a warning
|
||||
message if the selected file already exists.<BR><FONT size=-1>The
|
||||
warning message is only displayed for files selected with the
|
||||
browse button.</FONT></TD></TR>
|
||||
<TR>
|
||||
<TD vAlign=top>PATH_MUST_EXIST</TD>
|
||||
<TD vAlign=top>Used by "<I>FileRequest</I>" to force the path to
|
||||
exist. Prevents the user from typing a non-existant path into the
|
||||
browse dialog window.<BR><FONT size=-1>This only validates path's
|
||||
selected with the browse button.</FONT></TD></TR>
|
||||
<TR>
|
||||
<TD vAlign=top>PROMPT_CREATE</TD>
|
||||
<TD vAlign=top>Used by "<I>FileRequest</I>" to display a warning
|
||||
if the selected file does not exist. However, it still allows the
|
||||
user to select the file.<BR><FONT size=-1>This only displays the
|
||||
warning for files selected with the browse button.</FONT></TD></TR>
|
||||
<TR>
|
||||
<TD vAlign=top>RIGHT</TD>
|
||||
<TD vAlign=top>Used by "<I>Checkbox</I>" and "<I>Radiobutton</I>"
|
||||
controls to specify you want the checkbox to the right of the text
|
||||
instead of the left as is the default. </TD></TR>
|
||||
<TR>
|
||||
<TD vAlign=top>MULTISELECT</TD>
|
||||
<TD vAlign=top>Used by "<I>Listbox</I>" controls to specify if
|
||||
more than item may be selected. If this flag is not specified,
|
||||
then only one item may be selected from the
|
||||
list.</TD></TR></TBODY></TABLE></TD></TR></TBODY></TABLE></UL>
|
||||
<HR>
|
||||
<A name=history><A name=top><B>History:</B>
|
||||
<P>
|
||||
<UL>
|
||||
<LI><a name=DLL1.1>DLL version 1.2 beta (7/31/2002)
|
||||
<UL>
|
||||
<li>Added CancelEnabled (by ORTIM)
|
||||
<li>Added CancelConfirmCaption and CancelConfirmIcon (by Amir Szekely)
|
||||
</UL>
|
||||
<LI><a name=DLL1.1>DLL version 1.1 beta (7/22/2002)
|
||||
<UL>
|
||||
<li>Font is now taken from the main NSIS window (by Amir Szekely)
|
||||
</UL>
|
||||
<LI><a name=DLL1.0>DLL version 1.0 beta (12/16/2001)
|
||||
<UL>
|
||||
<LI>Moved to DLL, no longer need parentwnd ini writing
|
||||
<li>Tons of changes - no longer fully compatible (see source for a big list)
|
||||
<LI>removed support for silent installers (it seems the old version would bring up it's own dialog)
|
||||
</UL>
|
||||
<LI><A name=1.4>version 1.4 (11/18/2001)
|
||||
<UL>
|
||||
<LI>Added <I>Listbox</I> controls.
|
||||
<UL>
|
||||
<LI>Added <I>MULTISELECT</I> flag. </LI></UL>
|
||||
<LI>Made the HWND list for the parent window controls dynamically allocated.
|
||||
This prevents a crash if NSIS ever gets more than 150 controls on it's main
|
||||
window.
|
||||
<LI>The <I>TEXT</I> property of DirRequest control can be used to specify an
|
||||
initial directory. The current directory is automatically selected when
|
||||
clicking the browse button of the DirRequest control.
|
||||
<LI>Added <I>ROOT</I> property to DirRequest which can be used to set the
|
||||
root directory. (mostly due to felfert)
|
||||
<LI>Edit controls will now auto scroll. (thanks felfert)
|
||||
<LI>Fixed a problem where the window wouldn't draw properly on some systems.
|
||||
(thanks felfert) </LI></UL>
|
||||
<LI><A name=1.3>version 1.3 (11/03/2001)
|
||||
<UL>
|
||||
<LI>Got rid of the call to RedrawWindow() because it's no longer needed with
|
||||
the WS_CLIPCHILDREN flag for NSIS.
|
||||
<LI>Removed a few hardcoded limits of buffer sizes.
|
||||
<LI>Added <I>Checkbox</I> and <I>RadioButton</I> controls.
|
||||
<UL>
|
||||
<LI>Added <I>RIGHT</I> and <I>CHECKED</I> flags. </LI></UL></LI></UL>
|
||||
<LI><A name=1.2.2>version 1.2.2 (10/30/2001)
|
||||
<UL>
|
||||
<LI>Additional size reductions. Further reduced the size down to 8k.
|
||||
<LI>The text parameter to a combobox can now be used to specify the initial
|
||||
value.
|
||||
<LI>Changed from InvalidateRect() to RedrawWindow() to force a redraw after
|
||||
a browse dialog.
|
||||
<LI>On startup, set the flags of the NSIS window to include WS_CLIPCHILDREN.
|
||||
Otherwise, our controls don't get drawn right. </LI></UL>
|
||||
<LI><A name=1.2.1>version 1.2.1 (10/28/2001)
|
||||
<UL>
|
||||
<LI>Bug fix. ControlID for the caption and the OK button were reused by the
|
||||
first two controls. (Thanks Schultz) </LI></UL>
|
||||
<LI><A name=1.2j>version 1.2j (10/28/2001) (justin frankel's modifications)
|
||||
<UL>
|
||||
<LI>8.5kb from 44kb. heh. </LI></UL>
|
||||
<LI><A name=1.2>version 1.2 (10/28/2001)
|
||||
<UL><FONT size=-1>(Thanks to Schultz for requesting the first
|
||||
item.)</FONT><BR><FONT size=-1>Still 44k, but would like to make it smaller.
|
||||
All of NSIS only amounts to 35.5k</FONT>
|
||||
<LI>Added the "<I>FileRequest</I>" and "<I>DirRequest</I>" control
|
||||
types.<BR><FONT size=-1>NOTE: Please let me know if this is going to require
|
||||
any DLL's which might not be on the target machine.<BR>Keep in mind that
|
||||
although we are using system DLL's, the program will exit before NSIS tries
|
||||
to copy any files.</FONT>
|
||||
<LI>Added "<I>MinLen</I>", "<I>MaxLen</I>", and "<I>ValidateText</I>"
|
||||
properties to fields.
|
||||
<LI>Added "<I>Flags</I>" as a way to specifiy additional parameters for
|
||||
controls.
|
||||
<LI>Few more changes to the documentation.
|
||||
<LI>Cleaned the code in a few places...still trying to make it smaller.
|
||||
</LI></UL>
|
||||
<LI><A name=1.1>version 1.1 (10/27/2001)
|
||||
<UL><FONT size=-1>(Thanks to Alex ??? for requesting the first
|
||||
three.)</FONT>
|
||||
<LI>Added the "<I>Title</I>" option.
|
||||
<LI>Moved the OK button so it is in the same location as the buttons on the
|
||||
main NSIS window.
|
||||
<LI>Pressing "ENTER" will now automatically select the OK butt/FONT>
|
||||
<LI>Slightly improved the documentation. </LI></UL>
|
||||
<LI><A name=1.01>version 1.01: (10/25/2001)
|
||||
<UL>
|
||||
<LI>Fixed the SetFocus loop so it exits after the first control like it was
|
||||
supposed to.
|
||||
<LI>Added the license to the documentation. </LI></UL>
|
||||
<LI><A name=1.0>version 1.0: (10/25/2001)
|
||||
<UL>
|
||||
<LI>Barely qualifies as a distribution. </LI></UL></LI></UL>
|
||||
<HR>
|
||||
<A name=license><PRE> Copyright © 2001 Michael Bishop
|
||||
Portions Copyright © 2001 Nullsoft, Inc.
|
||||
|
||||
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.
|
||||
</PRE></A></BODY></HTML>
|
1074
Contrib/InstallOptions/InstallerOptions.cpp
Normal file
115
Contrib/InstallOptions/io.dsp
Normal file
|
@ -0,0 +1,115 @@
|
|||
# Microsoft Developer Studio Project File - Name="io" - Package Owner=<4>
|
||||
# Microsoft Developer Studio Generated Build File, Format Version 6.00
|
||||
# ** DO NOT EDIT **
|
||||
|
||||
# TARGTYPE "Win32 (x86) Dynamic-Link Library" 0x0102
|
||||
|
||||
CFG=io - 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 "io.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 "io.mak" CFG="io - Win32 Debug"
|
||||
!MESSAGE
|
||||
!MESSAGE Possible choices for configuration are:
|
||||
!MESSAGE
|
||||
!MESSAGE "io - Win32 Release" (based on "Win32 (x86) Dynamic-Link Library")
|
||||
!MESSAGE "io - 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)" == "io - 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 "INSTOPTDLL_EXPORTS" /YX /FD /c
|
||||
# ADD CPP /nologo /MT /W3 /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "INSTOPTDLL_EXPORTS" /D "WIN32_LEAN_AND_MEAN" /YX /FD /c
|
||||
# ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /win32
|
||||
# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /win32
|
||||
# ADD BASE RSC /l 0x409 /d "NDEBUG"
|
||||
# ADD RSC /l 0x409 /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 gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /machine:I386 /nodefaultlib /out:"../../Bin/InstallOptions.dll" /opt:nowin98
|
||||
# SUBTRACT LINK32 /pdb:none
|
||||
|
||||
!ELSEIF "$(CFG)" == "io - 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 "INSTOPTDLL_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 "INSTOPTDLL_EXPORTS" /YX /FD /GZ /c
|
||||
# ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /win32
|
||||
# ADD MTL /nologo /D "_DEBUG" /mktyplib203 /win32
|
||||
# ADD BASE RSC /l 0x409 /d "_DEBUG"
|
||||
# ADD RSC /l 0x409 /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 "io - Win32 Release"
|
||||
# Name "io - Win32 Debug"
|
||||
# Begin Group "Source Files"
|
||||
|
||||
# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat"
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=.\InstallerOptions.cpp
|
||||
# End Source File
|
||||
# End Group
|
||||
# Begin Group "Header Files"
|
||||
|
||||
# PROP Default_Filter "h;hpp;hxx;hm;inl"
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=.\resource.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"
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=.\ioptdll.rc
|
||||
# End Source File
|
||||
# End Group
|
||||
# End Target
|
||||
# End Project
|
29
Contrib/InstallOptions/io.dsw
Normal file
|
@ -0,0 +1,29 @@
|
|||
Microsoft Developer Studio Workspace File, Format Version 6.00
|
||||
# WARNING: DO NOT EDIT OR DELETE THIS WORKSPACE FILE!
|
||||
|
||||
###############################################################################
|
||||
|
||||
Project: "io"=.\io.dsp - Package Owner=<4>
|
||||
|
||||
Package=<5>
|
||||
{{{
|
||||
}}}
|
||||
|
||||
Package=<4>
|
||||
{{{
|
||||
}}}
|
||||
|
||||
###############################################################################
|
||||
|
||||
Global:
|
||||
|
||||
Package=<5>
|
||||
{{{
|
||||
}}}
|
||||
|
||||
Package=<3>
|
||||
{{{
|
||||
}}}
|
||||
|
||||
###############################################################################
|
||||
|
94
Contrib/InstallOptions/ioptdll.rc
Normal file
|
@ -0,0 +1,94 @@
|
|||
//Microsoft Developer Studio generated resource script.
|
||||
//
|
||||
#include "resource.h"
|
||||
|
||||
#define APSTUDIO_READONLY_SYMBOLS
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// Generated from the TEXTINCLUDE 2 resource.
|
||||
//
|
||||
#include "afxres.h"
|
||||
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
#undef APSTUDIO_READONLY_SYMBOLS
|
||||
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
// English (U.S.) resources
|
||||
|
||||
#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU)
|
||||
#ifdef _WIN32
|
||||
LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US
|
||||
#pragma code_page(1252)
|
||||
#endif //_WIN32
|
||||
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// Dialog
|
||||
//
|
||||
|
||||
IDD_DIALOG1 DIALOG DISCARDABLE 0, 0, 57, 41
|
||||
STYLE DS_CONTROL | WS_CHILD
|
||||
FONT 8, "MS Sans Serif"
|
||||
BEGIN
|
||||
END
|
||||
|
||||
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// DESIGNINFO
|
||||
//
|
||||
|
||||
#ifdef APSTUDIO_INVOKED
|
||||
GUIDELINES DESIGNINFO DISCARDABLE
|
||||
BEGIN
|
||||
IDD_DIALOG1, DIALOG
|
||||
BEGIN
|
||||
LEFTMARGIN, 7
|
||||
RIGHTMARGIN, 50
|
||||
TOPMARGIN, 7
|
||||
BOTTOMMARGIN, 34
|
||||
END
|
||||
END
|
||||
#endif // APSTUDIO_INVOKED
|
||||
|
||||
|
||||
#ifdef APSTUDIO_INVOKED
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// TEXTINCLUDE
|
||||
//
|
||||
|
||||
1 TEXTINCLUDE DISCARDABLE
|
||||
BEGIN
|
||||
"resource.h\0"
|
||||
END
|
||||
|
||||
2 TEXTINCLUDE DISCARDABLE
|
||||
BEGIN
|
||||
"#include ""afxres.h""\r\n"
|
||||
"\0"
|
||||
END
|
||||
|
||||
3 TEXTINCLUDE DISCARDABLE
|
||||
BEGIN
|
||||
"\r\n"
|
||||
"\0"
|
||||
END
|
||||
|
||||
#endif // APSTUDIO_INVOKED
|
||||
|
||||
#endif // English (U.S.) resources
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
|
||||
|
||||
#ifndef APSTUDIO_INVOKED
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// Generated from the TEXTINCLUDE 3 resource.
|
||||
//
|
||||
|
||||
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
#endif // not APSTUDIO_INVOKED
|
||||
|
16
Contrib/InstallOptions/resource.h
Normal file
|
@ -0,0 +1,16 @@
|
|||
//{{NO_DEPENDENCIES}}
|
||||
// Microsoft Developer Studio generated include file.
|
||||
// Used by ioptdll.rc
|
||||
//
|
||||
#define IDD_DIALOG1 101
|
||||
|
||||
// Next default values for new objects
|
||||
//
|
||||
#ifdef APSTUDIO_INVOKED
|
||||
#ifndef APSTUDIO_READONLY_SYMBOLS
|
||||
#define _APS_NEXT_RESOURCE_VALUE 102
|
||||
#define _APS_NEXT_COMMAND_VALUE 40001
|
||||
#define _APS_NEXT_CONTROL_VALUE 1000
|
||||
#define _APS_NEXT_SYMED_VALUE 101
|
||||
#endif
|
||||
#endif
|
67
Contrib/InstallOptions/test.ini
Normal file
|
@ -0,0 +1,67 @@
|
|||
[Settings]
|
||||
NumFields=6
|
||||
|
||||
Title=Test Install Setup: Testing Installer Options
|
||||
|
||||
; uncomment this to confirm on exit.
|
||||
; CancelConfirm=Are you sure you want to cancel the install?
|
||||
|
||||
; comment this out to hide the back button
|
||||
BackEnabled=1
|
||||
|
||||
; you can override the defaults here
|
||||
CancelButtonText=Cancel
|
||||
NextButtonText=Next >
|
||||
BackButtonText=< Back
|
||||
|
||||
[Field 1]
|
||||
Type=checkbox
|
||||
text=Install support for X
|
||||
left=0
|
||||
right=300
|
||||
top=0
|
||||
bottom=15
|
||||
state=0
|
||||
|
||||
[Field 2]
|
||||
Type=checkbox
|
||||
text=Install support for Y
|
||||
left=0
|
||||
right=300
|
||||
top=15
|
||||
bottom=30
|
||||
state=1
|
||||
|
||||
[Field 3]
|
||||
Type=checkbox
|
||||
text=Install support for Z
|
||||
left=0
|
||||
right=300
|
||||
top=30
|
||||
bottom=45
|
||||
state=0
|
||||
|
||||
[Field 4]
|
||||
Type=FileRequest
|
||||
State=C:\poop.poop
|
||||
Left=0
|
||||
Right=-1
|
||||
Top=45
|
||||
Bottom=64
|
||||
Filter=Poop Files|*.poop|All files|*.*
|
||||
Flags=FILE_MUST_EXIST|OFN_EXPLORER|OFN_HIDEREADONLY
|
||||
|
||||
[Field 5]
|
||||
Type=DirRequest
|
||||
Left=0
|
||||
Right=-1
|
||||
Top=65
|
||||
Bottom=84
|
||||
|
||||
[Field 6]
|
||||
Type=Label
|
||||
Left=0
|
||||
Right=-1
|
||||
Top=85
|
||||
Bottom=104
|
||||
Text=This is a label...
|
128
Contrib/InstallOptions/test.nsi
Normal file
|
@ -0,0 +1,128 @@
|
|||
; Copyright (C) 2001 Michael Bishop
|
||||
;
|
||||
; 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.
|
||||
;
|
||||
|
||||
; Test installation script
|
||||
|
||||
; The name of the installer
|
||||
Name "Test Install"
|
||||
|
||||
; The file to write
|
||||
OutFile "test-setup.exe"
|
||||
ShowInstDetails show
|
||||
|
||||
; The default installation directory
|
||||
InstallDir $PROGRAMFILES\Test
|
||||
|
||||
DirText "Choose dir"
|
||||
LicenseText "You are about to install test install and it owns, you will love it, we think."
|
||||
LicenseData "..\..\license.txt"
|
||||
ComponentText "Choose components"
|
||||
|
||||
; Do not automatically close the installation window
|
||||
AutoCloseWindow false
|
||||
|
||||
; Define some installation templates
|
||||
InstType "Typical" ; 1
|
||||
|
||||
Section "Required Components"
|
||||
ReadINIStr $R0 $7 "Field 1" State
|
||||
DetailPrint "Install X=$R0"
|
||||
ReadINIStr $R0 $7 "Field 2" State
|
||||
DetailPrint "Install Y=$R0"
|
||||
ReadINIStr $R0 $7 "Field 3" State
|
||||
DetailPrint "Install Z=$R0"
|
||||
ReadINIStr $R0 $7 "Field 4" State
|
||||
DetailPrint "File=$R0"
|
||||
ReadINIStr $R0 $7 "Field 5" State
|
||||
DetailPrint "Dir=$R0"
|
||||
|
||||
SectionEnd
|
||||
|
||||
Section "more components"
|
||||
Nop
|
||||
SectionEnd
|
||||
|
||||
|
||||
; $9 = counter
|
||||
; $8 = DLL
|
||||
; $7 = ini
|
||||
Function .onInit
|
||||
StrCpy $9 0
|
||||
GetTempFileName $8
|
||||
GetTempFileName $7
|
||||
File /oname=$8 ..\..\Bin\InstallOptions.dll
|
||||
File /oname=$7 "test.ini"
|
||||
FunctionEnd
|
||||
|
||||
; cleanup on exit.
|
||||
Function .onInstSuccess
|
||||
Call Cleanup
|
||||
FunctionEnd
|
||||
|
||||
Function .onInstFailed
|
||||
Call Cleanup
|
||||
FunctionEnd
|
||||
|
||||
Function .onUserAbort
|
||||
Call Cleanup
|
||||
FunctionEnd
|
||||
|
||||
Function Cleanup
|
||||
Delete $8
|
||||
Delete $7
|
||||
FunctionEnd
|
||||
|
||||
Function .onNextPage
|
||||
StrCmp $9 1 good
|
||||
IntOp $9 $9 + 1
|
||||
Return
|
||||
good:
|
||||
Call RunConfigure
|
||||
Pop $0
|
||||
StrCmp $0 "cancel" "" nocancel
|
||||
Call Cleanup
|
||||
Quit
|
||||
nocancel:
|
||||
StrCmp $0 "back" "" noback
|
||||
Abort
|
||||
noback:
|
||||
IntOp $9 $9 + 1
|
||||
FunctionEnd
|
||||
|
||||
Function .onPrevPage
|
||||
StrCmp $9 2 good
|
||||
IntOp $9 $9 - 1
|
||||
Return
|
||||
good:
|
||||
Call RunConfigure
|
||||
Pop $0
|
||||
StrCmp $0 "cancel" "" nocancel
|
||||
Call Cleanup
|
||||
Quit
|
||||
nocancel:
|
||||
StrCmp $0 "back" back
|
||||
Abort
|
||||
back:
|
||||
IntOp $9 $9 - 1
|
||||
FunctionEnd
|
||||
|
||||
Function RunConfigure
|
||||
Push $7
|
||||
CallInstDLL $8 dialog
|
||||
FunctionEnd
|
18
Contrib/Makensisw/License.txt
Normal file
|
@ -0,0 +1,18 @@
|
|||
Copyright (c) 2002 Robert Rainwter <rrainwater@yahoo.com>
|
||||
-- this version was slightly modified by Justin Frankel --
|
||||
|
||||
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.
|
152
Contrib/Makensisw/Readme.txt
Normal file
|
@ -0,0 +1,152 @@
|
|||
----------------------------------------------------
|
||||
MakeNSISW - MakeNSIS Windows Wrapper
|
||||
----------------------------------------------------
|
||||
|
||||
|
||||
About MakeNSISW
|
||||
---------------
|
||||
MakeNSISW is a wrapper for the MakeNSIS that is distributed with
|
||||
NSIS (http://www.nullsoft.com/free/nsis/). MakeNSISW allows you
|
||||
to compile NSIS scripts using a Windows GUI interface. To install
|
||||
MakeNSISW, compile the source using Visual C++ or Mingw.
|
||||
|
||||
|
||||
Requirements
|
||||
------------
|
||||
MakeNSISW requires NSIS be installed on your system. The default
|
||||
directory for this installation is $PROGRAMFILES\NSIS\Contrib\MakeNSISW.
|
||||
|
||||
|
||||
Usage:
|
||||
------
|
||||
If you installed the Shell Extensions option during the installation, then
|
||||
all that is required is that you choose 'Compile NSI' from the right-
|
||||
click menu on a NSIS script. This will invoke MakeNSISW.
|
||||
|
||||
The format of the parameters when calling MakeNSISW from the commandline is:
|
||||
makensisw full_path_of_makensis.exe [options] [script.nsi | - [...]]
|
||||
|
||||
Where full_path_of_makensis.exe is the full name including the path of the
|
||||
compiler. For the options, please see the MakeNSIS documentation.
|
||||
|
||||
|
||||
Shortcut Keys
|
||||
-------------
|
||||
Ctrl+R: Recompiles the script
|
||||
Ctrl+X: Exits the application
|
||||
Ctrl+T: Tests the installer
|
||||
Ctrl+E: Edits the script
|
||||
|
||||
|
||||
Version History
|
||||
---------------
|
||||
0.1
|
||||
- Initial Release
|
||||
|
||||
0.2
|
||||
- Added ability to save output and copy output
|
||||
|
||||
0.3
|
||||
- Added option to recompile script (F2 or File|Recompile)
|
||||
- Added Help Menu
|
||||
- Return code is now always set
|
||||
- Added Accelerator key support for Exit and Recompile
|
||||
- No longer uses NSIS's version string
|
||||
- Made clearer status message in title bar
|
||||
- Disabled menu/accelerator functions during compile
|
||||
|
||||
0.4
|
||||
- Fixed Copy Selected bug
|
||||
|
||||
0.5
|
||||
- Minor Makefile changes (mingw)
|
||||
- Moved strings into global strings to make editing easier
|
||||
- Added Clear Log Command under Edit menu
|
||||
- Recompile no longer clears the log window (use F5)
|
||||
- Close is now the default button when you hit enter
|
||||
- added VC++ project, updated resources to work with VC++
|
||||
- rearranged directory structure
|
||||
- makefiles now target ../../makensisw.exe
|
||||
- removed makensisw home link in help menu (hope this is ok,
|
||||
doesn't really seem needed to me)
|
||||
- made display use a fixed width font (Some people may not like
|
||||
this, but I do)
|
||||
- added 'test' button (peeks output for 'Output' line)
|
||||
- made it so that the log shows the most recent 32k.
|
||||
- made it so that the log always clears on a recompile.
|
||||
- compiled with VC++ so no longer needs msvcrt.dll
|
||||
- made the compiler name be a full path (for more flexibility)
|
||||
|
||||
0.6
|
||||
- print correct usage if unable to execute compiler
|
||||
- removed mingw warnings
|
||||
- set title/branding before errors
|
||||
- some docs changes
|
||||
- Added Edit|Edit Script function
|
||||
|
||||
0.7
|
||||
- Edit Script should now work for output>32k
|
||||
- Added resize support (thanks to felfert)
|
||||
- Added window position saving (thanks to felfert)
|
||||
- Disable some items when exec of makensis failed
|
||||
|
||||
0.8
|
||||
- Added window size constraints (thanks to bcheck)
|
||||
- Cleaned up the resource file
|
||||
|
||||
0.9
|
||||
- Removed global strings (moved into #defines)
|
||||
- Some GUI changes
|
||||
- No longer focused Close button (its default anyways)
|
||||
- Fixed resize bug on minimize/restore (thanks to felfert)
|
||||
- Made window placement stored in HKLM instead of HKCU, cause
|
||||
I hate things that get littered in HKCU.
|
||||
|
||||
1.0
|
||||
- Fixed bug with large output causing crash
|
||||
|
||||
1.1
|
||||
- Crash may actually be fixed
|
||||
|
||||
1.2
|
||||
- XP visual style support
|
||||
|
||||
1.3
|
||||
- Added Documentation menu item
|
||||
- Fix GUI problem with About dialog
|
||||
|
||||
1.4
|
||||
- Edit Script command will now work with or without file associations
|
||||
- Added default filename for save dialog
|
||||
- Use standard fonts
|
||||
- Documentation menuitem caused recompile
|
||||
|
||||
1.5
|
||||
- Fixed Copy All function
|
||||
|
||||
1.6
|
||||
- Reduced size from 44k to 12k (kickik)
|
||||
- Editbox not limited to 32k (now using richedit control)
|
||||
- Made the log window font-size smaller.
|
||||
|
||||
|
||||
Copyright Information
|
||||
---------------------
|
||||
Copyright (c) 2002 Robert Rainwater
|
||||
Portions Copyright (c) 2002 Justin Frankel and Fritz Elfert
|
||||
|
||||
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.
|
5
Contrib/Makensisw/afxres.h
Normal file
|
@ -0,0 +1,5 @@
|
|||
#include <windows.h>
|
||||
|
||||
#ifndef IDC_STATIC
|
||||
#define IDC_STATIC -1
|
||||
#endif
|
363
Contrib/Makensisw/makensisw.cpp
Normal file
|
@ -0,0 +1,363 @@
|
|||
/*
|
||||
Copyright (c) 2002 Robert Rainwater
|
||||
Portions Copyright (c) 2002 Justin Frankel and Fritz Elfert
|
||||
|
||||
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.
|
||||
|
||||
*/
|
||||
#include <windows.h>
|
||||
#include <stdio.h>
|
||||
|
||||
#include "makensisw.h"
|
||||
#include "resource.h"
|
||||
#include "noclib.h"
|
||||
|
||||
char *g_script;
|
||||
int g_retcode;
|
||||
|
||||
static RECT resizeRect;
|
||||
static int dx;
|
||||
static int dy;
|
||||
|
||||
HINSTANCE g_hInstance;
|
||||
HWND g_hwnd;
|
||||
HANDLE g_hThread;
|
||||
|
||||
int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrevInst, char *cmdParam, int cmdShow) {
|
||||
HACCEL haccel;
|
||||
g_hInstance=GetModuleHandle(0);
|
||||
g_script=GetCommandLine(); // set commandline global string
|
||||
if (*g_script++=='"') while (*g_script++!='"');
|
||||
else while (*g_script++!=' ');
|
||||
while (*g_script==' ') g_script++;
|
||||
g_retcode = -1; // return code is always false unless set to true by GetExitCodeProcess
|
||||
HWND hDialog = CreateDialog(g_hInstance,MAKEINTRESOURCE(DLG_MAIN),0,DialogProc);
|
||||
if (!hDialog) {
|
||||
char buf [MAX_STRING];
|
||||
wsprintf(buf, "Error creating dialog box.\n\nError: %x", GetLastError ());
|
||||
MessageBox(0, buf, "Error", MB_ICONEXCLAMATION | MB_OK);
|
||||
return 1;
|
||||
}
|
||||
haccel = LoadAccelerators(g_hInstance, MAKEINTRESOURCE(IDK_ACCEL));
|
||||
MSG msg;
|
||||
int status;
|
||||
while ((status=GetMessage(&msg,0,0,0))!=0) {
|
||||
if (status==-1) return -1;
|
||||
if (!TranslateAccelerator(hDialog,haccel,&msg)) {
|
||||
if (!IsDialogMessage(hDialog,&msg)) {
|
||||
TranslateMessage(&msg);
|
||||
DispatchMessage(&msg);
|
||||
}
|
||||
}
|
||||
}
|
||||
ExitProcess(msg.wParam);
|
||||
return msg.wParam;
|
||||
}
|
||||
|
||||
BOOL CALLBACK DialogProc(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam) {
|
||||
static HINSTANCE hRichEditDLL = 0;
|
||||
if (!hRichEditDLL) hRichEditDLL= LoadLibrary("RichEd32.dll");
|
||||
switch (msg) {
|
||||
case WM_INITDIALOG:
|
||||
{
|
||||
g_hwnd=hwndDlg;
|
||||
HICON hIcon = LoadIcon(g_hInstance,MAKEINTRESOURCE(IDI_ICON));
|
||||
SetClassLong(hwndDlg,GCL_HICON,(long)hIcon);
|
||||
HFONT hFont = CreateFont(14,0,0,0,FW_NORMAL,0,0,0,DEFAULT_CHARSET,OUT_CHARACTER_PRECIS,CLIP_DEFAULT_PRECIS,DEFAULT_QUALITY,FIXED_PITCH|FF_DONTCARE,"Courier New");
|
||||
SendDlgItemMessage(hwndDlg,IDC_LOGWIN,WM_SETFONT,(WPARAM)hFont,0);
|
||||
SendDlgItemMessage(hwndDlg,IDC_LOGWIN,EM_SETBKGNDCOLOR,0,GetSysColor(COLOR_BTNFACE));
|
||||
RestoreWindowPos(g_hwnd);
|
||||
CompileNSISScript();
|
||||
return TRUE;
|
||||
}
|
||||
case WM_DESTROY:
|
||||
{
|
||||
SaveWindowPos(g_hwnd);
|
||||
PostQuitMessage(0);
|
||||
return TRUE;
|
||||
}
|
||||
case WM_CLOSE:
|
||||
{
|
||||
if (!g_hThread) {
|
||||
DestroyWindow(hwndDlg);
|
||||
FreeLibrary(hRichEditDLL);
|
||||
}
|
||||
return TRUE;
|
||||
}
|
||||
case WM_GETMINMAXINFO:
|
||||
{
|
||||
((MINMAXINFO*)lParam)->ptMinTrackSize.x=MINWIDTH;
|
||||
((MINMAXINFO*)lParam)->ptMinTrackSize.y=MINHEIGHT;
|
||||
}
|
||||
case WM_ENTERSIZEMOVE:
|
||||
{
|
||||
|
||||
GetClientRect(g_hwnd, &resizeRect);
|
||||
return TRUE;
|
||||
}
|
||||
case WM_SIZE:
|
||||
{
|
||||
if ((wParam == SIZE_MAXHIDE)||(wParam == SIZE_MAXSHOW)) return TRUE;
|
||||
}
|
||||
case WM_SIZING:
|
||||
{
|
||||
RECT rSize;
|
||||
if (hwndDlg == g_hwnd) {
|
||||
GetClientRect(g_hwnd, &rSize);
|
||||
if (((rSize.right==0)&&(rSize.bottom==0))||((resizeRect.right==0)&&(resizeRect.bottom==0)))
|
||||
return TRUE;
|
||||
dx = rSize.right - resizeRect.right;
|
||||
dy = rSize.bottom - resizeRect.bottom;
|
||||
EnumChildWindows(g_hwnd, DialogResize, (LPARAM)0);
|
||||
resizeRect = rSize;
|
||||
}
|
||||
return TRUE;
|
||||
}
|
||||
case WM_MAKENSIS_PROCESSCOMPLETE:
|
||||
{
|
||||
if (g_hThread) {
|
||||
CloseHandle(g_hThread);
|
||||
g_hThread=0;
|
||||
}
|
||||
if (g_retcode==0) SetTitle(g_hwnd,"Finished Sucessfully");
|
||||
else SetTitle(g_hwnd,"Compile Error: See Log for Details");
|
||||
EnableItems(g_hwnd);
|
||||
return TRUE;
|
||||
}
|
||||
case WM_COMMAND:
|
||||
{
|
||||
switch (LOWORD(wParam)) {
|
||||
case IDM_ABOUT:
|
||||
{
|
||||
DialogBox(g_hInstance,MAKEINTRESOURCE(DLG_ABOUT),g_hwnd,(DLGPROC)AboutProc);
|
||||
return TRUE;
|
||||
}
|
||||
case IDM_NSISHOME:
|
||||
{
|
||||
ShellExecute(g_hwnd,"open",NSIS_URL,NULL,NULL,SW_SHOWNORMAL);
|
||||
return TRUE;
|
||||
}
|
||||
case IDM_DOCS:
|
||||
{
|
||||
char pathf[MAX_PATH],*path;
|
||||
GetModuleFileName(NULL,pathf,sizeof(pathf));
|
||||
path=my_strrchr(pathf,'\\');
|
||||
if(path!=NULL) *path=0;
|
||||
lstrcat(pathf,"\\makensis.htm");
|
||||
if ((int)ShellExecute(g_hwnd,"open",pathf,NULL,NULL,SW_SHOWNORMAL)<=32)
|
||||
ShellExecute(g_hwnd,"open",DOCPATH,NULL,NULL,SW_SHOWNORMAL);
|
||||
return TRUE;
|
||||
}
|
||||
case IDM_RECOMPILE:
|
||||
{
|
||||
CompileNSISScript();
|
||||
return TRUE;
|
||||
}
|
||||
case IDM_TEST:
|
||||
case IDC_TEST:
|
||||
{
|
||||
if (g_output_exe[0]) {
|
||||
ShellExecute(g_hwnd,"open",g_output_exe,NULL,NULL,SW_SHOWNORMAL);
|
||||
}
|
||||
return TRUE;
|
||||
}
|
||||
case IDM_EDITSCRIPT:
|
||||
{
|
||||
if (g_input_script[0]) {
|
||||
if ((int)ShellExecute(g_hwnd,"open",g_input_script,NULL,NULL,SW_SHOWNORMAL)<=32) {
|
||||
char path[MAX_PATH];
|
||||
if (GetWindowsDirectory(path,sizeof(path))) {
|
||||
lstrcat(path,"\\notepad.exe");
|
||||
ShellExecute(g_hwnd,"open",path,g_input_script,NULL,SW_SHOWNORMAL);
|
||||
}
|
||||
}
|
||||
}
|
||||
return TRUE;
|
||||
}
|
||||
case IDC_CLOSE:
|
||||
case IDM_EXIT:
|
||||
{
|
||||
if (!g_hThread) {
|
||||
DestroyWindow(hwndDlg);
|
||||
}
|
||||
return TRUE;
|
||||
}
|
||||
case IDM_COPY:
|
||||
{
|
||||
CopyToClipboard(g_hwnd);
|
||||
return TRUE;
|
||||
}
|
||||
case IDM_COPYSELECTED:
|
||||
{
|
||||
SendMessage(GetDlgItem(g_hwnd,IDC_LOGWIN), WM_COPY, 0, 0);
|
||||
return TRUE;
|
||||
}
|
||||
case IDM_SAVE:
|
||||
{
|
||||
OPENFILENAME l={sizeof(l),};
|
||||
char buf[MAX_STRING];
|
||||
l.hwndOwner = hwndDlg;
|
||||
l.lpstrFilter = "Log Files (*.log)\0Text Files (*.txt)\0*.txt\0All Files (*.*)\0*.*\0";
|
||||
l.lpstrFile = buf;
|
||||
l.nMaxFile = 1023;
|
||||
l.lpstrTitle = "Save Output";
|
||||
l.lpstrDefExt = "log";
|
||||
l.lpstrInitialDir = NULL;
|
||||
l.Flags = OFN_HIDEREADONLY|OFN_EXPLORER|OFN_PATHMUSTEXIST;
|
||||
lstrcpy(buf,"output.log");
|
||||
if (GetSaveFileName(&l)) {
|
||||
HANDLE hFile = CreateFile(buf,GENERIC_WRITE,0,0,CREATE_ALWAYS,0,0);
|
||||
if (hFile) {
|
||||
int len=SendDlgItemMessage(g_hwnd,IDC_LOGWIN,WM_GETTEXTLENGTH,0,0);
|
||||
char *existing_text=(char*)GlobalAlloc(GPTR,len);
|
||||
existing_text[0]=0;
|
||||
GetDlgItemText(g_hwnd, IDC_LOGWIN, existing_text, len);
|
||||
DWORD dwWritten = 0;
|
||||
WriteFile(hFile,existing_text,len,&dwWritten,0);
|
||||
CloseHandle(hFile);
|
||||
GlobalFree(existing_text);
|
||||
}
|
||||
}
|
||||
return TRUE;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
DWORD WINAPI MakeNSISProc(LPVOID p) {
|
||||
char buf[1024];
|
||||
STARTUPINFO si={sizeof(si),};
|
||||
SECURITY_ATTRIBUTES sa={sizeof(sa),};
|
||||
SECURITY_DESCRIPTOR sd={0,};
|
||||
PROCESS_INFORMATION pi={0,};
|
||||
HANDLE newstdout=0,read_stdout=0;
|
||||
|
||||
OSVERSIONINFO osv={sizeof(osv)};
|
||||
GetVersionEx(&osv);
|
||||
if (osv.dwPlatformId == VER_PLATFORM_WIN32_NT) {
|
||||
InitializeSecurityDescriptor(&sd,SECURITY_DESCRIPTOR_REVISION);
|
||||
SetSecurityDescriptorDacl(&sd,true,NULL,false);
|
||||
sa.lpSecurityDescriptor = &sd;
|
||||
}
|
||||
else sa.lpSecurityDescriptor = NULL;
|
||||
sa.bInheritHandle = true;
|
||||
if (!CreatePipe(&read_stdout,&newstdout,&sa,0)) {
|
||||
ErrorMessage(g_hwnd,"There was an error creating the pipe.");
|
||||
PostMessage(g_hwnd,WM_MAKENSIS_PROCESSCOMPLETE,0,0);
|
||||
return 1;
|
||||
}
|
||||
GetStartupInfo(&si);
|
||||
si.dwFlags = STARTF_USESTDHANDLES|STARTF_USESHOWWINDOW;
|
||||
si.wShowWindow = SW_HIDE;
|
||||
si.hStdOutput = newstdout;
|
||||
si.hStdError = newstdout;
|
||||
if (!CreateProcess(NULL,g_script,NULL,NULL,TRUE,CREATE_NEW_CONSOLE,NULL,NULL,&si,&pi)) {
|
||||
char buf[MAX_STRING];
|
||||
wsprintf(buf,"Could not execute:\r\n %s.",g_script);
|
||||
ErrorMessage(g_hwnd,buf);
|
||||
CloseHandle(newstdout);
|
||||
CloseHandle(read_stdout);
|
||||
PostMessage(g_hwnd,WM_MAKENSIS_PROCESSCOMPLETE,0,0);
|
||||
return 1;
|
||||
}
|
||||
unsigned long exit=0,read,avail;
|
||||
my_memset(buf,0,sizeof(buf));
|
||||
while(1) {
|
||||
PeekNamedPipe(read_stdout,buf,sizeof(buf)-1,&read,&avail,NULL);
|
||||
if (read != 0) {
|
||||
my_memset(buf,0,sizeof(buf));
|
||||
if (avail > sizeof(buf)-1) {
|
||||
while (read >= sizeof(buf)-1) {
|
||||
ReadFile(read_stdout,buf,sizeof(buf)-1,&read,NULL);
|
||||
LogMessage(g_hwnd,buf);
|
||||
my_memset(buf,0,sizeof(buf));
|
||||
}
|
||||
}
|
||||
else {
|
||||
ReadFile(read_stdout,buf,sizeof(buf),&read,NULL);
|
||||
LogMessage(g_hwnd,buf);
|
||||
}
|
||||
}
|
||||
GetExitCodeProcess(pi.hProcess,&exit);
|
||||
if (exit != STILL_ACTIVE) break;
|
||||
Sleep(TIMEOUT);
|
||||
}
|
||||
g_retcode = exit;
|
||||
CloseHandle(pi.hThread);
|
||||
CloseHandle(pi.hProcess);
|
||||
CloseHandle(newstdout);
|
||||
CloseHandle(read_stdout);
|
||||
PostMessage(g_hwnd,WM_MAKENSIS_PROCESSCOMPLETE,0,0);
|
||||
return 0;
|
||||
}
|
||||
|
||||
BOOL CALLBACK DialogResize(HWND hWnd, LPARAM /* unused */)
|
||||
{
|
||||
RECT r;
|
||||
GetWindowRect(hWnd, &r);
|
||||
ScreenToClient(g_hwnd, (LPPOINT)&r);
|
||||
ScreenToClient(g_hwnd, ((LPPOINT)&r)+1);
|
||||
switch (GetDlgCtrlID(hWnd)) {
|
||||
case IDC_LOGWIN:
|
||||
SetWindowPos(hWnd, 0, r.left, r.top,r.right - r.left + dx, r.bottom - r.top + dy, SWP_NOZORDER|SWP_NOMOVE);
|
||||
break;
|
||||
case IDC_TEST:
|
||||
case IDC_CLOSE:
|
||||
SetWindowPos(hWnd, 0, r.left + dx, r.top + dy, 0, 0, SWP_NOZORDER|SWP_NOSIZE);
|
||||
break;
|
||||
default:
|
||||
SetWindowPos(hWnd, 0, r.left, r.top + dy, r.right - r.left + dx, r.bottom - r.top, SWP_NOZORDER);
|
||||
break;
|
||||
}
|
||||
RedrawWindow(hWnd,NULL,NULL,RDW_INVALIDATE);
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
BOOL CALLBACK AboutProc(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam) {
|
||||
switch(msg) {
|
||||
case WM_INITDIALOG:
|
||||
{
|
||||
HFONT bfont = CreateFont(14,0,0,0,FW_BOLD,FALSE,FALSE,FALSE,DEFAULT_CHARSET,
|
||||
OUT_DEFAULT_PRECIS,CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY,
|
||||
FIXED_PITCH|FF_DONTCARE, "MS Shell Dlg");
|
||||
HFONT rfont = CreateFont(12,0,0,0,FW_NORMAL,FALSE,FALSE,FALSE,DEFAULT_CHARSET,
|
||||
OUT_DEFAULT_PRECIS,CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY,
|
||||
FIXED_PITCH|FF_DONTCARE, "MS Shell Dlg");
|
||||
if (bfont) SendDlgItemMessage(hwndDlg, IDC_ABOUTVERSION, WM_SETFONT, (WPARAM)bfont, FALSE);
|
||||
if (rfont) {
|
||||
SendDlgItemMessage(hwndDlg, IDC_ABOUTCOPY, WM_SETFONT, (WPARAM)rfont, FALSE);
|
||||
SendDlgItemMessage(hwndDlg, IDC_ABOUTPORTIONS, WM_SETFONT, (WPARAM)rfont, FALSE);
|
||||
}
|
||||
char buf[MAX_STRING];
|
||||
wsprintf(buf,"MakeNSISW %s",NSISW_VERSION);
|
||||
SetDlgItemText(hwndDlg,IDC_ABOUTVERSION,buf);
|
||||
SetDlgItemText(hwndDlg,IDC_ABOUTCOPY,COPYRIGHT);
|
||||
SetDlgItemText(hwndDlg,IDC_ABOUTPORTIONS,CONTRIBUTOR);
|
||||
}
|
||||
case WM_COMMAND:
|
||||
{
|
||||
switch (LOWORD(wParam)) {
|
||||
case IDOK: {
|
||||
EndDialog(hwndDlg, TRUE);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return FALSE;
|
||||
}
|
160
Contrib/Makensisw/makensisw.dsp
Normal file
|
@ -0,0 +1,160 @@
|
|||
# Microsoft Developer Studio Project File - Name="makensisw" - Package Owner=<4>
|
||||
# Microsoft Developer Studio Generated Build File, Format Version 6.00
|
||||
# ** DO NOT EDIT **
|
||||
|
||||
# TARGTYPE "Win32 (x86) Application" 0x0101
|
||||
|
||||
CFG=makensisw - 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 "makensisw.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 "makensisw.mak" CFG="makensisw - Win32 Debug"
|
||||
!MESSAGE
|
||||
!MESSAGE Possible choices for configuration are:
|
||||
!MESSAGE
|
||||
!MESSAGE "makensisw - Win32 Release" (based on "Win32 (x86) Application")
|
||||
!MESSAGE "makensisw - Win32 Debug" (based on "Win32 (x86) Application")
|
||||
!MESSAGE
|
||||
|
||||
# Begin Project
|
||||
# PROP AllowPerConfigDependencies 0
|
||||
# PROP Scc_ProjName ""
|
||||
# PROP Scc_LocalPath ""
|
||||
CPP=cl.exe
|
||||
MTL=midl.exe
|
||||
RSC=rc.exe
|
||||
|
||||
!IF "$(CFG)" == "makensisw - 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 /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /YX /FD /c
|
||||
# ADD CPP /nologo /W3 /O1 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D RELEASE=1.6 /FD /c
|
||||
# ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /win32
|
||||
# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /win32
|
||||
# ADD BASE RSC /l 0x409 /d "NDEBUG"
|
||||
# ADD RSC /l 0x409 /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 /subsystem:windows /machine:I386
|
||||
# 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 /entry:"WinMain" /subsystem:windows /machine:I386 /nodefaultlib /out:"../../makensisw.exe" /opt:nowin98
|
||||
# SUBTRACT LINK32 /pdb:none
|
||||
|
||||
!ELSEIF "$(CFG)" == "makensisw - 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 Ignore_Export_Lib 0
|
||||
# PROP Target_Dir ""
|
||||
# ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /YX /FD /GZ /c
|
||||
# ADD CPP /nologo /W3 /Gm /GX /ZI /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /YX /FD /GZ /c
|
||||
# ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /win32
|
||||
# ADD MTL /nologo /D "_DEBUG" /mktyplib203 /win32
|
||||
# ADD BASE RSC /l 0x409 /d "_DEBUG"
|
||||
# ADD RSC /l 0x409 /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 /subsystem:windows /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 /subsystem:windows /debug /machine:I386 /pdbtype:sept
|
||||
|
||||
!ENDIF
|
||||
|
||||
# Begin Target
|
||||
|
||||
# Name "makensisw - Win32 Release"
|
||||
# Name "makensisw - Win32 Debug"
|
||||
# Begin Group "Source Files"
|
||||
|
||||
# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat"
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=.\makensisw.cpp
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=.\noclib.cpp
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=.\utils.cpp
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=.\version.cpp
|
||||
# End Source File
|
||||
# End Group
|
||||
# Begin Group "Header Files"
|
||||
|
||||
# PROP Default_Filter "h;hpp;hxx;hm;inl"
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=.\afxres.h
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=.\makensisw.h
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=.\noclib.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"
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=..\..\Source\default1.bin
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=..\..\source\icon.ico
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=.\resource.rc
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=..\..\Source\rt_manif.bin
|
||||
# End Source File
|
||||
# End Group
|
||||
# Begin Group "Documentation"
|
||||
|
||||
# PROP Default_Filter ""
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=.\Readme.txt
|
||||
# End Source File
|
||||
# End Group
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=.\makensisw.xml
|
||||
# End Source File
|
||||
# End Target
|
||||
# End Project
|
29
Contrib/Makensisw/makensisw.dsw
Normal file
|
@ -0,0 +1,29 @@
|
|||
Microsoft Developer Studio Workspace File, Format Version 6.00
|
||||
# WARNING: DO NOT EDIT OR DELETE THIS WORKSPACE FILE!
|
||||
|
||||
###############################################################################
|
||||
|
||||
Project: "makensisw"=.\makensisw.dsp - Package Owner=<4>
|
||||
|
||||
Package=<5>
|
||||
{{{
|
||||
}}}
|
||||
|
||||
Package=<4>
|
||||
{{{
|
||||
}}}
|
||||
|
||||
###############################################################################
|
||||
|
||||
Global:
|
||||
|
||||
Package=<5>
|
||||
{{{
|
||||
}}}
|
||||
|
||||
Package=<3>
|
||||
{{{
|
||||
}}}
|
||||
|
||||
###############################################################################
|
||||
|
74
Contrib/Makensisw/makensisw.h
Normal file
|
@ -0,0 +1,74 @@
|
|||
/*
|
||||
Copyright (c) 2002 Robert Rainwater
|
||||
Portions Copyright (c) 2002 Justin Frankel and Fritz Elfert
|
||||
|
||||
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.
|
||||
|
||||
*/
|
||||
#ifndef MAKENSIS_H
|
||||
#define MAKENSIS_H
|
||||
|
||||
#include <commctrl.h>
|
||||
|
||||
#define _RICHEDIT_VER 0x0200
|
||||
#include <RichEdit.h>
|
||||
#undef _RICHEDIT_VER
|
||||
|
||||
// Defines
|
||||
#define NSIS_URL "http://www.nullsoft.com/free/nsis/"
|
||||
#define USAGE "Usage:\r\n makensisw full_path_of_makensis.exe [options] [script.nsi | - [...]]\r\n"
|
||||
#define COPYRIGHT "Copyright (c) 2002 Robert Rainwater"
|
||||
#define CONTRIBUTOR "Portions Copyright (c) 2002 Justin Frankel and Fritz Elfert"
|
||||
#define DOCPATH "http://firehose.net/free/nsis/makensis.htm"
|
||||
#define REGSEC HKEY_LOCAL_MACHINE
|
||||
#define REGKEY "Software\\NSIS"
|
||||
#define REGLOC "MakeNSISWPlacement"
|
||||
#define MAX_STRING 256
|
||||
#define TIMEOUT 200
|
||||
#define MINWIDTH 350
|
||||
#define MINHEIGHT 180
|
||||
|
||||
#define WM_MAKENSIS_PROCESSCOMPLETE (WM_USER+1001)
|
||||
|
||||
// Extern Variables
|
||||
extern const char *NSISW_VERSION;
|
||||
extern char *g_script;
|
||||
extern HWND g_hwnd;
|
||||
extern HANDLE g_hThread;
|
||||
extern char g_output_exe[1024];
|
||||
extern char g_input_script[1024];
|
||||
|
||||
// makensisw
|
||||
int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrevInst, char *cmdParam, int cmdShow);
|
||||
static BOOL CALLBACK DialogProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam);
|
||||
DWORD WINAPI MakeNSISProc(LPVOID p);
|
||||
BOOL CALLBACK DialogResize(HWND hWnd, LPARAM /* unused*/);
|
||||
BOOL CALLBACK AboutProc(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam);
|
||||
void CompileNSISScript();
|
||||
|
||||
// utils
|
||||
void SetTitle(HWND hwnd,char *substr);
|
||||
void SetBranding(HWND hwnd);
|
||||
void CopyToClipboard(HWND hwnd);
|
||||
void ClearLog(HWND hwnd);
|
||||
void LogMessage(HWND hwnd,const char *str);
|
||||
void ErrorMessage(HWND hwnd,const char *str);
|
||||
void DisableItems(HWND hwnd);
|
||||
void EnableItems(HWND hwnd);
|
||||
void RestoreWindowPos(HWND hwnd);
|
||||
void SaveWindowPos(HWND hwnd);
|
||||
#endif
|
10
Contrib/Makensisw/makensisw.xml
Normal file
|
@ -0,0 +1,10 @@
|
|||
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
|
||||
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
|
||||
<assemblyIdentity version="1.0.0.0" processorArchitecture="X86" name="Nullsoft.NSIS.makensisw" type="win32"/>
|
||||
<description>MakeNSIS Wrapper</description>
|
||||
<dependency>
|
||||
<dependentAssembly>
|
||||
<assemblyIdentity type="win32" name="Microsoft.Windows.Common-Controls" version="6.0.0.0" processorArchitecture="X86" publicKeyToken="6595b64144ccf1df" language="*" />
|
||||
</dependentAssembly>
|
||||
</dependency>
|
||||
</assembly>
|
52
Contrib/Makensisw/noclib.cpp
Normal file
|
@ -0,0 +1,52 @@
|
|||
/*
|
||||
Copyright (c) 2002 Robert Rainwater
|
||||
Portions Copyright (c) 2002 Justin Frankel and Fritz Elfert
|
||||
|
||||
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.
|
||||
|
||||
*/
|
||||
/*
|
||||
Contribution by kickik
|
||||
*/
|
||||
#include <windows.h>
|
||||
#include "noclib.h"
|
||||
|
||||
char *my_strrchr(const char *string, int c) {
|
||||
for (int i = lstrlen(string); i >= 0; i--)
|
||||
if (string[i] == c)
|
||||
return (char*)&string[i];
|
||||
return 0;
|
||||
}
|
||||
|
||||
void *my_memset(void *dest, int c, size_t count) {
|
||||
for (size_t i = 0; i < count; i++) ((char*)dest)[i]=c;
|
||||
return dest;
|
||||
}
|
||||
|
||||
char *my_strstr(const char *string, const char *strCharSet) {
|
||||
if (!*strCharSet) return (char*)string;
|
||||
size_t chklen=lstrlen(string)-lstrlen(strCharSet);
|
||||
char *s1, *s2;
|
||||
for (size_t i = 0; i < chklen; i++) {
|
||||
s1=&((char*)string)[i];
|
||||
s2=(char*)strCharSet;
|
||||
while (*s1++ == *s2++)
|
||||
if (!*s2)
|
||||
return &((char*)string)[i];
|
||||
}
|
||||
return 0;
|
||||
}
|
32
Contrib/Makensisw/noclib.h
Normal file
|
@ -0,0 +1,32 @@
|
|||
/*
|
||||
Copyright (c) 2002 Robert Rainwater
|
||||
Portions Copyright (c) 2002 Justin Frankel and Fritz Elfert
|
||||
|
||||
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.
|
||||
|
||||
*/
|
||||
/*
|
||||
Contribution by kickik
|
||||
*/
|
||||
#ifndef NOCLIB_H
|
||||
#define NOCLIB_H
|
||||
|
||||
char *my_strrchr(const char *string, int c);
|
||||
void *my_memset(void *dest, int c, size_t count);
|
||||
char *my_strstr(const char *string, const char *strCharSet);
|
||||
|
||||
#endif
|
38
Contrib/Makensisw/resource.h
Normal file
|
@ -0,0 +1,38 @@
|
|||
//{{NO_DEPENDENCIES}}
|
||||
// Microsoft Developer Studio generated include file.
|
||||
// Used by resource.rc
|
||||
//
|
||||
#define DLG_MAIN 101
|
||||
#define IDI_ICON 102
|
||||
#define DLG_ABOUT 103
|
||||
#define IDM_MENU 104
|
||||
#define IDK_ACCEL 105
|
||||
#define IDR_DEFAULT1 108
|
||||
#define IDC_LOGWIN 402
|
||||
#define IDC_VERSION 405
|
||||
#define IDC_CLOSE 406
|
||||
#define IDM_ABOUT 501
|
||||
#define IDM_EXIT 502
|
||||
#define IDM_SAVE 503
|
||||
#define IDM_COPY 504
|
||||
#define IDM_COPYSELECTED 505
|
||||
#define IDM_RECOMPILE 506
|
||||
#define IDM_NSISHOME 507
|
||||
#define IDC_TEST 1000
|
||||
#define IDC_ABOUTVERSION 1001
|
||||
#define IDC_ABOUTCOPY 1003
|
||||
#define IDC_ABOUTPORTIONS 1005
|
||||
#define IDM_TEST 40002
|
||||
#define IDM_EDITSCRIPT 40003
|
||||
#define IDM_DOCS 40004
|
||||
|
||||
// Next default values for new objects
|
||||
//
|
||||
#ifdef APSTUDIO_INVOKED
|
||||
#ifndef APSTUDIO_READONLY_SYMBOLS
|
||||
#define _APS_NEXT_RESOURCE_VALUE 109
|
||||
#define _APS_NEXT_COMMAND_VALUE 40005
|
||||
#define _APS_NEXT_CONTROL_VALUE 1009
|
||||
#define _APS_NEXT_SYMED_VALUE 101
|
||||
#endif
|
||||
#endif
|
179
Contrib/Makensisw/resource.rc
Normal file
|
@ -0,0 +1,179 @@
|
|||
//Microsoft Developer Studio generated resource script.
|
||||
//
|
||||
#include "resource.h"
|
||||
|
||||
#define APSTUDIO_READONLY_SYMBOLS
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// Generated from the TEXTINCLUDE 2 resource.
|
||||
//
|
||||
#include "afxres.h"
|
||||
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
#undef APSTUDIO_READONLY_SYMBOLS
|
||||
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
// English (U.S.) resources
|
||||
|
||||
#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU)
|
||||
#ifdef _WIN32
|
||||
LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US
|
||||
#pragma code_page(1252)
|
||||
#endif //_WIN32
|
||||
|
||||
#ifdef APSTUDIO_INVOKED
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// TEXTINCLUDE
|
||||
//
|
||||
|
||||
1 TEXTINCLUDE DISCARDABLE
|
||||
BEGIN
|
||||
"resource.h\0"
|
||||
END
|
||||
|
||||
2 TEXTINCLUDE DISCARDABLE
|
||||
BEGIN
|
||||
"#include ""afxres.h""\r\n"
|
||||
"\0"
|
||||
END
|
||||
|
||||
3 TEXTINCLUDE DISCARDABLE
|
||||
BEGIN
|
||||
"\r\n"
|
||||
"\0"
|
||||
END
|
||||
|
||||
#endif // APSTUDIO_INVOKED
|
||||
|
||||
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// Icon
|
||||
//
|
||||
|
||||
// Icon with lowest ID value placed first to ensure application icon
|
||||
// remains consistent on all systems.
|
||||
IDI_ICON ICON DISCARDABLE "..\\..\\source\\icon.ico"
|
||||
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// Menu
|
||||
//
|
||||
|
||||
IDM_MENU MENU DISCARDABLE
|
||||
BEGIN
|
||||
POPUP "&File"
|
||||
BEGIN
|
||||
MENUITEM "&Recompile\tCtrl+R", IDM_RECOMPILE
|
||||
MENUITEM "&Test\tCtrl+T", IDM_TEST
|
||||
MENUITEM "&Save Output...", IDM_SAVE
|
||||
MENUITEM SEPARATOR
|
||||
MENUITEM "E&xit\tCtrl+X", IDM_EXIT
|
||||
END
|
||||
POPUP "&Edit"
|
||||
BEGIN
|
||||
MENUITEM "Edit Script\tCtrl+E", IDM_EDITSCRIPT
|
||||
MENUITEM SEPARATOR
|
||||
MENUITEM "Copy &All", IDM_COPY
|
||||
MENUITEM "Copy &Selected", IDM_COPYSELECTED
|
||||
END
|
||||
POPUP "&Help"
|
||||
BEGIN
|
||||
MENUITEM "NSIS Home", IDM_NSISHOME
|
||||
MENUITEM "Documentation", IDM_DOCS
|
||||
MENUITEM SEPARATOR
|
||||
MENUITEM "&About", IDM_ABOUT
|
||||
END
|
||||
END
|
||||
|
||||
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// Accelerator
|
||||
//
|
||||
|
||||
IDK_ACCEL ACCELERATORS PRELOAD MOVEABLE PURE
|
||||
BEGIN
|
||||
"E", IDM_EDITSCRIPT, VIRTKEY, CONTROL, NOINVERT
|
||||
"R", IDM_RECOMPILE, VIRTKEY, CONTROL, NOINVERT
|
||||
"T", IDM_TEST, VIRTKEY, CONTROL, NOINVERT
|
||||
"X", IDM_EXIT, VIRTKEY, CONTROL, NOINVERT
|
||||
END
|
||||
|
||||
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// Dialog
|
||||
//
|
||||
|
||||
DLG_MAIN DIALOG DISCARDABLE 0, 0, 361, 228
|
||||
STYLE DS_3DLOOK | DS_CENTER | WS_MINIMIZEBOX | WS_MAXIMIZEBOX | WS_POPUP |
|
||||
WS_VISIBLE | WS_CAPTION | WS_SYSMENU | WS_THICKFRAME
|
||||
CAPTION "MakeNSIS"
|
||||
MENU IDM_MENU
|
||||
FONT 8, "MS Shell Dlg"
|
||||
BEGIN
|
||||
CONTROL "",IDC_LOGWIN,"RICHEDIT",ES_MULTILINE | ES_AUTOVSCROLL |
|
||||
ES_READONLY | WS_BORDER | WS_VSCROLL,7,4,345,186
|
||||
CONTROL "",IDC_STATIC,"Static",SS_ETCHEDHORZ,7,202,346,1
|
||||
LTEXT "",IDC_VERSION,7,212,200,12,WS_DISABLED
|
||||
DEFPUSHBUTTON "Clo&se",IDC_CLOSE,303,209,49,14
|
||||
PUSHBUTTON "&Test",IDC_TEST,247,209,50,14,WS_DISABLED
|
||||
END
|
||||
|
||||
DLG_ABOUT DIALOG DISCARDABLE 0, 0, 235, 86
|
||||
STYLE DS_MODALFRAME | DS_3DLOOK | DS_CENTER | WS_POPUP | WS_CAPTION |
|
||||
WS_SYSMENU
|
||||
CAPTION "About MakeNSISW"
|
||||
FONT 8, "MS Shell Dlg"
|
||||
BEGIN
|
||||
ICON IDI_ICON,IDC_STATIC,7,4,20,20
|
||||
DEFPUSHBUTTON "Clo&se",IDOK,185,64,43,15
|
||||
LTEXT "MakeNSISW",IDC_ABOUTVERSION,44,4,184,8
|
||||
LTEXT "Copyright",IDC_ABOUTCOPY,44,18,184,8
|
||||
CONTROL "",IDC_STATIC,"Static",SS_ETCHEDHORZ,45,55,183,1
|
||||
LTEXT "Portions Copyright",IDC_ABOUTPORTIONS,44,30,184,20
|
||||
END
|
||||
|
||||
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// DESIGNINFO
|
||||
//
|
||||
|
||||
#ifdef APSTUDIO_INVOKED
|
||||
GUIDELINES DESIGNINFO DISCARDABLE
|
||||
BEGIN
|
||||
DLG_ABOUT, DIALOG
|
||||
BEGIN
|
||||
LEFTMARGIN, 7
|
||||
RIGHTMARGIN, 228
|
||||
TOPMARGIN, 4
|
||||
BOTTOMMARGIN, 79
|
||||
END
|
||||
END
|
||||
#endif // APSTUDIO_INVOKED
|
||||
|
||||
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// 24
|
||||
//
|
||||
|
||||
1 24 MOVEABLE PURE "makensisw.xml"
|
||||
#endif // English (U.S.) resources
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
|
||||
|
||||
#ifndef APSTUDIO_INVOKED
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// Generated from the TEXTINCLUDE 3 resource.
|
||||
//
|
||||
|
||||
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
#endif // not APSTUDIO_INVOKED
|
||||
|
185
Contrib/Makensisw/utils.cpp
Normal file
|
@ -0,0 +1,185 @@
|
|||
/*
|
||||
Copyright (c) 2002 Robert Rainwater
|
||||
Portions Copyright (c) 2002 Justin Frankel and Fritz Elfert
|
||||
|
||||
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.
|
||||
|
||||
*/
|
||||
#include <windows.h>
|
||||
#include "resource.h"
|
||||
#include "makensisw.h"
|
||||
#include "noclib.h"
|
||||
|
||||
void SetTitle(HWND hwnd,char *substr) {
|
||||
char title[64];
|
||||
if (substr==NULL) wsprintf(title,"MakeNSISW");
|
||||
else wsprintf(title,"MakeNSISW - %s",substr);
|
||||
SetWindowText(hwnd,title);
|
||||
}
|
||||
|
||||
void SetBranding(HWND hwnd) {
|
||||
char title[64];
|
||||
wsprintf(title,"MakeNSISW %s",NSISW_VERSION);
|
||||
SetDlgItemText(hwnd, IDC_VERSION, title);
|
||||
}
|
||||
|
||||
void CopyToClipboard(HWND hwnd) {
|
||||
int len=SendDlgItemMessage(hwnd,IDC_LOGWIN,WM_GETTEXTLENGTH,0,0);
|
||||
char *existing_text=(char*)GlobalAlloc(GPTR,len);
|
||||
if (!hwnd||!OpenClipboard(hwnd)||!existing_text) return;
|
||||
EmptyClipboard();
|
||||
existing_text[0]=0;
|
||||
GetDlgItemText(hwnd, IDC_LOGWIN, existing_text, len);
|
||||
SetClipboardData(CF_TEXT,existing_text);
|
||||
CloseClipboard();
|
||||
}
|
||||
|
||||
|
||||
void ClearLog(HWND hwnd) {
|
||||
SetDlgItemText(hwnd, IDC_LOGWIN, "");
|
||||
}
|
||||
|
||||
char g_output_exe[1024];
|
||||
char g_input_script[1024];
|
||||
BOOL g_input_found;
|
||||
void LogMessage(HWND hwnd,const char *str) {
|
||||
if (!str || !*str) return;
|
||||
int len=SendDlgItemMessage(hwnd,IDC_LOGWIN,WM_GETTEXTLENGTH,0,0);
|
||||
char *existing_text=(char*)GlobalAlloc(GPTR,len+lstrlen(str)+3);//3=\r\n\0
|
||||
if (!existing_text) return;
|
||||
existing_text[0]=0;
|
||||
GETTEXTEX gt={0};
|
||||
gt.cb = len;
|
||||
gt.codepage = CP_ACP;
|
||||
gt.flags = GT_DEFAULT;
|
||||
SendDlgItemMessage(hwnd,IDC_LOGWIN,EM_GETTEXTEX,(WPARAM)>,(LPARAM)existing_text);
|
||||
lstrcat(existing_text,str);
|
||||
if (!g_input_found) {
|
||||
char *p1=my_strstr(existing_text,"\r\nProcessing script file: \"");
|
||||
if (p1) {
|
||||
while (*p1++ != '"');
|
||||
char *p2=my_strstr(p1,"\r\n");
|
||||
lstrcpyn(g_input_script,p1,p2-p1);
|
||||
g_input_found=TRUE;
|
||||
}
|
||||
}
|
||||
SetDlgItemText(hwnd, IDC_LOGWIN, existing_text);
|
||||
SendDlgItemMessage(hwnd, IDC_LOGWIN,EM_SETSEL,lstrlen(existing_text),lstrlen(existing_text));
|
||||
SendDlgItemMessage(hwnd, IDC_LOGWIN,EM_SCROLLCARET,0,0);
|
||||
GlobalFree(existing_text);
|
||||
}
|
||||
|
||||
|
||||
|
||||
void ErrorMessage(HWND hwnd,const char *str) {
|
||||
if (!str) return;
|
||||
char buf[1028];
|
||||
wsprintf(buf,"Error - %s\r\n",str);
|
||||
LogMessage(hwnd,buf);
|
||||
}
|
||||
|
||||
void DisableItems(HWND hwnd) {
|
||||
g_output_exe[0]=0;
|
||||
g_input_script[0]=0;
|
||||
g_input_found=FALSE;
|
||||
EnableWindow(GetDlgItem(hwnd,IDC_CLOSE),0);
|
||||
EnableWindow(GetDlgItem(hwnd,IDC_TEST),0);
|
||||
HMENU m = GetMenu(hwnd);
|
||||
EnableMenuItem(m,IDM_SAVE,MF_GRAYED);
|
||||
EnableMenuItem(m,IDM_TEST,MF_GRAYED);
|
||||
EnableMenuItem(m,IDM_EXIT,MF_GRAYED);
|
||||
EnableMenuItem(m,IDM_RECOMPILE,MF_GRAYED);
|
||||
EnableMenuItem(m,IDM_COPY,MF_GRAYED);
|
||||
EnableMenuItem(m,IDM_COPYSELECTED,MF_GRAYED);
|
||||
EnableMenuItem(m,IDM_EDITSCRIPT,MF_GRAYED);
|
||||
}
|
||||
|
||||
void EnableItems(HWND hwnd) {
|
||||
int len=SendDlgItemMessage(hwnd,IDC_LOGWIN,WM_GETTEXTLENGTH,0,0);
|
||||
char *existing_text=(char*)GlobalAlloc(GPTR,len);
|
||||
if (!existing_text) return;
|
||||
existing_text[0]=0;
|
||||
GetDlgItemText(hwnd, IDC_LOGWIN, existing_text, len);
|
||||
char *p=existing_text;
|
||||
char *p2;
|
||||
char *p3;
|
||||
if ((p2=my_strstr(p,"\r\nOutput: \""))) {
|
||||
while (*p2 != '\"') p2++;
|
||||
p2++;
|
||||
if ((p3=my_strstr(p2,"\"\r\n")) && p3 < my_strstr(p2,"\r\n")) {
|
||||
*p3=0;
|
||||
lstrcpy(g_output_exe,p2);
|
||||
}
|
||||
}
|
||||
|
||||
HMENU m = GetMenu(hwnd);
|
||||
if (g_output_exe[0]) {
|
||||
EnableWindow(GetDlgItem(hwnd,IDC_TEST),1);
|
||||
EnableMenuItem(m,IDM_TEST,MF_ENABLED);
|
||||
}
|
||||
EnableWindow(GetDlgItem(hwnd,IDC_CLOSE),1);
|
||||
EnableMenuItem(m,IDM_SAVE,MF_ENABLED);
|
||||
EnableMenuItem(m,IDM_EXIT,MF_ENABLED);
|
||||
EnableMenuItem(m,IDM_RECOMPILE,MF_ENABLED);
|
||||
EnableMenuItem(m,IDM_COPY,MF_ENABLED);
|
||||
EnableMenuItem(m,IDM_COPYSELECTED,MF_ENABLED);
|
||||
EnableMenuItem(m,IDM_EDITSCRIPT,MF_ENABLED);
|
||||
}
|
||||
|
||||
void CompileNSISScript() {
|
||||
ClearLog(g_hwnd);
|
||||
SetTitle(g_hwnd,NULL);
|
||||
SetBranding(g_hwnd);
|
||||
if (lstrlen(g_script)==0) {
|
||||
HMENU m = GetMenu(g_hwnd);
|
||||
LogMessage(g_hwnd,USAGE);
|
||||
EnableMenuItem(m,IDM_RECOMPILE,MF_GRAYED);
|
||||
EnableMenuItem(m,IDM_EDITSCRIPT,MF_GRAYED);
|
||||
EnableMenuItem(m,IDM_TEST,MF_GRAYED);
|
||||
EnableWindow(GetDlgItem(g_hwnd,IDC_TEST),0);
|
||||
return;
|
||||
}
|
||||
// Disable buttons during compile
|
||||
DisableItems(g_hwnd);
|
||||
DWORD id;
|
||||
g_hThread=CreateThread(NULL,0,MakeNSISProc,0,0,&id);
|
||||
}
|
||||
|
||||
void RestoreWindowPos(HWND hwnd) {
|
||||
HKEY hKey;
|
||||
WINDOWPLACEMENT p;
|
||||
if (RegOpenKeyEx(REGSEC,REGKEY,0,KEY_READ,&hKey) == ERROR_SUCCESS) {
|
||||
DWORD l = sizeof(p);
|
||||
DWORD t;
|
||||
if ((RegQueryValueEx(hKey,REGLOC,NULL,&t,(unsigned char*)&p,&l)==ERROR_SUCCESS)&&(t == REG_BINARY)&&(l==sizeof(p))) {
|
||||
p.length = sizeof(p);
|
||||
SetWindowPlacement(hwnd, &p);
|
||||
}
|
||||
RegCloseKey(hKey);
|
||||
}
|
||||
}
|
||||
|
||||
void SaveWindowPos(HWND hwnd) {
|
||||
HKEY hKey;
|
||||
WINDOWPLACEMENT p;
|
||||
p.length = sizeof(p);
|
||||
GetWindowPlacement(hwnd, &p);
|
||||
if (RegCreateKey(REGSEC,REGKEY,&hKey) == ERROR_SUCCESS) {
|
||||
RegSetValueEx(hKey,REGLOC,0,REG_BINARY,(unsigned char*)&p,sizeof(p));
|
||||
RegCloseKey(hKey);
|
||||
}
|
||||
}
|
46
Contrib/Makensisw/utils.h
Normal file
|
@ -0,0 +1,46 @@
|
|||
/*
|
||||
Copyright (c) 2002 Robert Rainwater
|
||||
Portions Copyright (c) 2002 Justin Frankel and Fritz Elfert
|
||||
|
||||
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.
|
||||
|
||||
*/
|
||||
#ifndef UTILS_H
|
||||
#define UTILS_H
|
||||
|
||||
#define REGSEC HKEY_LOCAL_MACHINE // JF> modified this to HKLM so that
|
||||
// nsis uninstaller would remove. this means
|
||||
// window placement is shared across users, but
|
||||
// bfd.
|
||||
#define REGKEY "Software\\NSIS"
|
||||
#define REGLOC "MakeNSISWPlacement"
|
||||
|
||||
extern const char *NSISW_VERSION;
|
||||
|
||||
// Methods
|
||||
void SetTitle(HWND hwnd,char *substr);
|
||||
void SetBranding(HWND hwnd);
|
||||
void CopyToClipboard(HWND hwnd);
|
||||
void ClearLog(HWND hwnd);
|
||||
void LogMessage(HWND hwnd,const char *str);
|
||||
void ErrorMessage(HWND hwnd,const char *str);
|
||||
void DisableItems(HWND hwnd);
|
||||
void EnableItems(HWND hwnd);
|
||||
void RestoreWindowPos(HWND hwnd);
|
||||
void SaveWindowPos(HWND hwnd);
|
||||
|
||||
#endif
|
30
Contrib/Makensisw/version.cpp
Normal file
|
@ -0,0 +1,30 @@
|
|||
/*
|
||||
Copyright (c) 2002 Robert Rainwater
|
||||
Portions Copyright (c) 2002 Justin Frankel and Fritz Elfert
|
||||
|
||||
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.
|
||||
|
||||
*/
|
||||
// Turns a define into a string
|
||||
#define REALSTR(x) #x
|
||||
#define STR(x) REALSTR(x)
|
||||
|
||||
#ifdef RELEASE
|
||||
const char *NSISW_VERSION = STR(RELEASE);
|
||||
#else
|
||||
const char *NSISW_VERSION = "Local Build: " __DATE__;
|
||||
#endif
|
59
Contrib/NSISdl/ReadMe.txt
Normal file
|
@ -0,0 +1,59 @@
|
|||
NSIS-DL 1.1 - http downloading DLL for NSIS
|
||||
Copyright (C) 2001 Yaroslav Faybishenko & Justin Frankel
|
||||
|
||||
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.
|
||||
|
||||
|
||||
|
||||
|
||||
This dll can be used from NSIS to download files via http.
|
||||
|
||||
How to use (for another example, see waplugin.nsi in the nsis directory):
|
||||
|
||||
Pass the url and filename on the stack
|
||||
Result is returned in $0
|
||||
"cancel" if cancelled
|
||||
"success" if success
|
||||
otherwise, an error string describing the error
|
||||
|
||||
Example:
|
||||
; pack the dll in the install file
|
||||
File /oname=$TEMP\nsdtmp09.dll nsisdl.dll
|
||||
|
||||
; make the call to download
|
||||
Push "http://www.xcf.berkeley.edu/~yaroslav/photos/mike/mike1-full.jpg"
|
||||
Push "$INSTDIR\test.jpg"
|
||||
CallInstDLL $TEMP\nsdtmp09.dll download ; for a quiet install, use download_quiet
|
||||
|
||||
; delete DLL from temporary directory
|
||||
Delete $TEMP\nsdtmp09.dll
|
||||
|
||||
; check if download succeeded
|
||||
StrCmp $0 "success" successful
|
||||
StrCmp $0 "cancel" cancelled
|
||||
|
||||
; we failed
|
||||
DetailPrint "Download failed: $0"
|
||||
goto done
|
||||
|
||||
cancelled:
|
||||
DetailPrint "Download cancelled"
|
||||
goto done
|
||||
successful:
|
||||
DetailPrint "Download successful"
|
||||
ExecShell $INSTDIR\test.jpg
|
||||
goto done
|
78
Contrib/NSISdl/Script1.rc
Normal file
|
@ -0,0 +1,78 @@
|
|||
//Microsoft Developer Studio generated resource script.
|
||||
//
|
||||
#include "resource.h"
|
||||
|
||||
#define APSTUDIO_READONLY_SYMBOLS
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// Generated from the TEXTINCLUDE 2 resource.
|
||||
//
|
||||
#include "afxres.h"
|
||||
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
#undef APSTUDIO_READONLY_SYMBOLS
|
||||
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
// English (U.S.) resources
|
||||
|
||||
#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU)
|
||||
#ifdef _WIN32
|
||||
LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US
|
||||
#pragma code_page(1252)
|
||||
#endif //_WIN32
|
||||
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// Dialog
|
||||
//
|
||||
|
||||
IDD_DIALOG1 DIALOG DISCARDABLE 0, 0, 265, 104
|
||||
STYLE DS_CONTROL | WS_CHILD
|
||||
FONT 8, "MS Sans Serif"
|
||||
BEGIN
|
||||
CONTROL "Progress1",IDC_PROGRESS1,"msctls_progress32",WS_BORDER,
|
||||
0,36,265,11
|
||||
CTEXT "",IDC_STATIC2,0,25,263,8
|
||||
END
|
||||
|
||||
|
||||
#ifdef APSTUDIO_INVOKED
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// TEXTINCLUDE
|
||||
//
|
||||
|
||||
1 TEXTINCLUDE DISCARDABLE
|
||||
BEGIN
|
||||
"resource.h\0"
|
||||
END
|
||||
|
||||
2 TEXTINCLUDE DISCARDABLE
|
||||
BEGIN
|
||||
"#include ""afxres.h""\r\n"
|
||||
"\0"
|
||||
END
|
||||
|
||||
3 TEXTINCLUDE DISCARDABLE
|
||||
BEGIN
|
||||
"\r\n"
|
||||
"\0"
|
||||
END
|
||||
|
||||
#endif // APSTUDIO_INVOKED
|
||||
|
||||
#endif // English (U.S.) resources
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
|
||||
|
||||
#ifndef APSTUDIO_INVOKED
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// Generated from the TEXTINCLUDE 3 resource.
|
||||
//
|
||||
|
||||
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
#endif // not APSTUDIO_INVOKED
|
||||
|
78
Contrib/NSISdl/asyncdns.cpp
Normal file
|
@ -0,0 +1,78 @@
|
|||
/*
|
||||
** JNetLib
|
||||
** Copyright (C) 2000-2001 Nullsoft, Inc.
|
||||
** Author: Justin Frankel
|
||||
** File: asyncdns.cpp - JNL portable asynchronous DNS implementation
|
||||
** License: see jnetlib.h
|
||||
*/
|
||||
|
||||
|
||||
#include "netinc.h"
|
||||
#include "util.h"
|
||||
#include "asyncdns.h"
|
||||
|
||||
JNL_AsyncDNS::JNL_AsyncDNS(int max_cache_entries)
|
||||
{
|
||||
m_thread_kill=1;
|
||||
m_thread=0;
|
||||
m_addr=0;
|
||||
m_hostname[0]=0;
|
||||
}
|
||||
|
||||
JNL_AsyncDNS::~JNL_AsyncDNS()
|
||||
{
|
||||
m_thread_kill=1;
|
||||
|
||||
if (m_thread)
|
||||
{
|
||||
WaitForSingleObject(m_thread,INFINITE);
|
||||
CloseHandle(m_thread);
|
||||
}
|
||||
}
|
||||
|
||||
unsigned long WINAPI JNL_AsyncDNS::_threadfunc(LPVOID _d)
|
||||
{
|
||||
JNL_AsyncDNS *_this=(JNL_AsyncDNS*)_d;
|
||||
int nowinsock=JNL::open_socketlib();
|
||||
struct hostent *hostentry;
|
||||
hostentry=::gethostbyname(_this->m_hostname);
|
||||
if (hostentry)
|
||||
{
|
||||
_this->m_addr=*((int*)hostentry->h_addr);
|
||||
}
|
||||
else
|
||||
_this->m_addr=INADDR_NONE;
|
||||
if (!nowinsock) JNL::close_socketlib();
|
||||
_this->m_thread_kill=1;
|
||||
return 0;
|
||||
}
|
||||
|
||||
int JNL_AsyncDNS::resolve(char *hostname, unsigned long *addr)
|
||||
{
|
||||
// return 0 on success, 1 on wait, -1 on unresolvable
|
||||
unsigned long ip=inet_addr(hostname);
|
||||
if (ip != INADDR_NONE)
|
||||
{
|
||||
*addr=ip;
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (lstrcmpi(m_hostname,hostname)) m_addr=0;
|
||||
else if (m_addr == INADDR_NONE) return -1;
|
||||
else if (m_addr)
|
||||
{
|
||||
*addr=m_addr;
|
||||
return 0;
|
||||
}
|
||||
lstrcpy(m_hostname,hostname);
|
||||
|
||||
if (m_thread_kill)
|
||||
{
|
||||
DWORD id;
|
||||
if (m_thread) return -1;
|
||||
m_thread_kill=0;
|
||||
m_thread=CreateThread(NULL,0,_threadfunc,(LPVOID)this,0,&id);
|
||||
if (!m_thread) return -1;
|
||||
}
|
||||
return 1;
|
||||
}
|
38
Contrib/NSISdl/asyncdns.h
Normal file
|
@ -0,0 +1,38 @@
|
|||
/*
|
||||
** JNetLib
|
||||
** Copyright (C) 2000-2001 Nullsoft, Inc.
|
||||
** Author: Justin Frankel
|
||||
** File: asyncdns.h - JNL portable asynchronous DNS interface
|
||||
** License: see jnetlib.h
|
||||
**
|
||||
** Usage:
|
||||
** 1. Create JNL_AsyncDNS object, optionally with the number of cache entries.
|
||||
** 2. call resolve() to resolve a hostname into an address. The return value of
|
||||
** resolve is 0 on success (host successfully resolved), 1 on wait (meaning
|
||||
** try calling resolve() with the same hostname in a few hundred milliseconds
|
||||
** or so), or -1 on error (i.e. the host can't resolve).
|
||||
** 4. enjoy.
|
||||
*/
|
||||
|
||||
#ifndef _ASYNCDNS_H_
|
||||
#define _ASYNCDNS_H_
|
||||
|
||||
class JNL_AsyncDNS
|
||||
{
|
||||
public:
|
||||
JNL_AsyncDNS(int max_cache_entries=64);
|
||||
~JNL_AsyncDNS();
|
||||
|
||||
int resolve(char *hostname, unsigned long *addr); // return 0 on success, 1 on wait, -1 on unresolvable
|
||||
|
||||
private:
|
||||
char m_hostname[256];
|
||||
unsigned long m_addr;
|
||||
|
||||
volatile int m_thread_kill;
|
||||
HANDLE m_thread;
|
||||
static unsigned long WINAPI _threadfunc(LPVOID _d);
|
||||
|
||||
};
|
||||
|
||||
#endif //_ASYNCDNS_H_
|
447
Contrib/NSISdl/connection.cpp
Normal file
|
@ -0,0 +1,447 @@
|
|||
/*
|
||||
** JNetLib
|
||||
** Copyright (C) 2000-2001 Nullsoft, Inc.
|
||||
** Author: Justin Frankel
|
||||
** File: connection.cpp - JNL TCP connection implementation
|
||||
** License: see jnetlib.h
|
||||
*/
|
||||
|
||||
#include "netinc.h"
|
||||
#include "util.h"
|
||||
#include "connection.h"
|
||||
|
||||
|
||||
JNL_Connection::JNL_Connection(JNL_AsyncDNS *dns, int sendbufsize, int recvbufsize)
|
||||
{
|
||||
m_errorstr="";
|
||||
if (dns == JNL_CONNECTION_AUTODNS)
|
||||
{
|
||||
m_dns=new JNL_AsyncDNS();
|
||||
m_dns_owned=1;
|
||||
}
|
||||
else
|
||||
{
|
||||
m_dns=dns;
|
||||
m_dns_owned=0;
|
||||
}
|
||||
m_recv_buffer_len=recvbufsize;
|
||||
m_send_buffer_len=sendbufsize;
|
||||
m_recv_buffer=(char*)malloc(m_recv_buffer_len);
|
||||
m_send_buffer=(char*)malloc(m_send_buffer_len);
|
||||
m_socket=-1;
|
||||
memset(m_recv_buffer,0,recvbufsize);
|
||||
memset(m_send_buffer,0,sendbufsize);
|
||||
m_remote_port=0;
|
||||
m_state=STATE_NOCONNECTION;
|
||||
m_recv_len=m_recv_pos=0;
|
||||
m_send_len=m_send_pos=0;
|
||||
m_host[0]=0;
|
||||
memset(&m_saddr,0,sizeof(m_saddr));
|
||||
}
|
||||
|
||||
void JNL_Connection::connect(int s, struct sockaddr_in *loc)
|
||||
{
|
||||
close(1);
|
||||
m_socket=s;
|
||||
m_remote_port=0;
|
||||
m_dns=NULL;
|
||||
if (loc) m_saddr=*loc;
|
||||
else memset(&m_saddr,0,sizeof(m_saddr));
|
||||
if (m_socket != -1)
|
||||
{
|
||||
SET_SOCK_BLOCK(m_socket,0);
|
||||
m_state=STATE_CONNECTED;
|
||||
}
|
||||
else
|
||||
{
|
||||
m_errorstr="invalid socket passed to connect";
|
||||
m_state=STATE_ERROR;
|
||||
}
|
||||
}
|
||||
|
||||
void JNL_Connection::connect(char *hostname, int port)
|
||||
{
|
||||
close(1);
|
||||
m_remote_port=(short)port;
|
||||
m_socket=::socket(AF_INET,SOCK_STREAM,0);
|
||||
if (m_socket==-1)
|
||||
{
|
||||
m_errorstr="creating socket";
|
||||
m_state=STATE_ERROR;
|
||||
}
|
||||
else
|
||||
{
|
||||
SET_SOCK_BLOCK(m_socket,0);
|
||||
strncpy(m_host,hostname,sizeof(m_host)-1);
|
||||
m_host[sizeof(m_host)-1]=0;
|
||||
memset(&m_saddr,0,sizeof(m_saddr));
|
||||
if (!m_host[0])
|
||||
{
|
||||
m_errorstr="empty hostname";
|
||||
m_state=STATE_ERROR;
|
||||
}
|
||||
else
|
||||
{
|
||||
m_state=STATE_RESOLVING;
|
||||
m_saddr.sin_family=AF_INET;
|
||||
m_saddr.sin_port=htons((unsigned short)port);
|
||||
m_saddr.sin_addr.s_addr=inet_addr(hostname);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
JNL_Connection::~JNL_Connection()
|
||||
{
|
||||
if (m_socket >= 0)
|
||||
{
|
||||
::shutdown(m_socket, SHUT_RDWR);
|
||||
::closesocket(m_socket);
|
||||
m_socket=-1;
|
||||
}
|
||||
free(m_recv_buffer);
|
||||
free(m_send_buffer);
|
||||
if (m_dns_owned)
|
||||
{
|
||||
delete m_dns;
|
||||
}
|
||||
}
|
||||
|
||||
void JNL_Connection::run(int max_send_bytes, int max_recv_bytes, int *bytes_sent, int *bytes_rcvd)
|
||||
{
|
||||
int bytes_allowed_to_send=(max_send_bytes<0)?m_send_buffer_len:max_send_bytes;
|
||||
int bytes_allowed_to_recv=(max_recv_bytes<0)?m_recv_buffer_len:max_recv_bytes;
|
||||
|
||||
if (bytes_sent) *bytes_sent=0;
|
||||
if (bytes_rcvd) *bytes_rcvd=0;
|
||||
|
||||
switch (m_state)
|
||||
{
|
||||
case STATE_RESOLVING:
|
||||
if (m_saddr.sin_addr.s_addr == INADDR_NONE)
|
||||
{
|
||||
int a=m_dns?m_dns->resolve(m_host,(unsigned long int *)&m_saddr.sin_addr.s_addr):-1;
|
||||
if (!a) { m_state=STATE_CONNECTING; }
|
||||
else if (a == 1)
|
||||
{
|
||||
m_state=STATE_RESOLVING;
|
||||
break;
|
||||
}
|
||||
else
|
||||
{
|
||||
m_errorstr="resolving hostname";
|
||||
m_state=STATE_ERROR;
|
||||
return;
|
||||
}
|
||||
}
|
||||
if (!::connect(m_socket,(struct sockaddr *)&m_saddr,16))
|
||||
{
|
||||
m_state=STATE_CONNECTED;
|
||||
}
|
||||
else if (ERRNO!=EINPROGRESS)
|
||||
{
|
||||
m_errorstr="connecting to host";
|
||||
m_state=STATE_ERROR;
|
||||
}
|
||||
else { m_state=STATE_CONNECTING; }
|
||||
break;
|
||||
case STATE_CONNECTING:
|
||||
{
|
||||
fd_set f[3];
|
||||
FD_ZERO(&f[0]);
|
||||
FD_ZERO(&f[1]);
|
||||
FD_ZERO(&f[2]);
|
||||
FD_SET(m_socket,&f[0]);
|
||||
FD_SET(m_socket,&f[1]);
|
||||
FD_SET(m_socket,&f[2]);
|
||||
struct timeval tv;
|
||||
memset(&tv,0,sizeof(tv));
|
||||
if (select(m_socket+1,&f[0],&f[1],&f[2],&tv)==-1)
|
||||
{
|
||||
m_errorstr="connecting to host (calling select())";
|
||||
m_state=STATE_ERROR;
|
||||
}
|
||||
else if (FD_ISSET(m_socket,&f[1]))
|
||||
{
|
||||
m_state=STATE_CONNECTED;
|
||||
}
|
||||
else if (FD_ISSET(m_socket,&f[2]))
|
||||
{
|
||||
m_errorstr="connecting to host";
|
||||
m_state=STATE_ERROR;
|
||||
}
|
||||
}
|
||||
break;
|
||||
case STATE_CONNECTED:
|
||||
case STATE_CLOSING:
|
||||
if (m_send_len>0 && bytes_allowed_to_send>0)
|
||||
{
|
||||
int len=m_send_buffer_len-m_send_pos;
|
||||
if (len > m_send_len) len=m_send_len;
|
||||
if (len > bytes_allowed_to_send) len=bytes_allowed_to_send;
|
||||
if (len > 0)
|
||||
{
|
||||
int res=::send(m_socket,m_send_buffer+m_send_pos,len,0);
|
||||
if (res==-1 && ERRNO != EWOULDBLOCK)
|
||||
{
|
||||
// m_state=STATE_CLOSED;
|
||||
// return;
|
||||
}
|
||||
if (res>0)
|
||||
{
|
||||
bytes_allowed_to_send-=res;
|
||||
if (bytes_sent) *bytes_sent+=res;
|
||||
m_send_pos+=res;
|
||||
m_send_len-=res;
|
||||
}
|
||||
}
|
||||
if (m_send_pos>=m_send_buffer_len)
|
||||
{
|
||||
m_send_pos=0;
|
||||
if (m_send_len>0)
|
||||
{
|
||||
len=m_send_buffer_len-m_send_pos;
|
||||
if (len > m_send_len) len=m_send_len;
|
||||
if (len > bytes_allowed_to_send) len=bytes_allowed_to_send;
|
||||
int res=::send(m_socket,m_send_buffer+m_send_pos,len,0);
|
||||
if (res==-1 && ERRNO != EWOULDBLOCK)
|
||||
{
|
||||
// m_state=STATE_CLOSED;
|
||||
}
|
||||
if (res>0)
|
||||
{
|
||||
bytes_allowed_to_send-=res;
|
||||
if (bytes_sent) *bytes_sent+=res;
|
||||
m_send_pos+=res;
|
||||
m_send_len-=res;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
if (m_recv_len<m_recv_buffer_len)
|
||||
{
|
||||
int len=m_recv_buffer_len-m_recv_pos;
|
||||
if (len > m_recv_buffer_len-m_recv_len) len=m_recv_buffer_len-m_recv_len;
|
||||
if (len > bytes_allowed_to_recv) len=bytes_allowed_to_recv;
|
||||
if (len>0)
|
||||
{
|
||||
int res=::recv(m_socket,m_recv_buffer+m_recv_pos,len,0);
|
||||
if (res == 0 || (res < 0 && ERRNO != EWOULDBLOCK))
|
||||
{
|
||||
m_state=STATE_CLOSED;
|
||||
break;
|
||||
}
|
||||
if (res > 0)
|
||||
{
|
||||
bytes_allowed_to_recv-=res;
|
||||
if (bytes_rcvd) *bytes_rcvd+=res;
|
||||
m_recv_pos+=res;
|
||||
m_recv_len+=res;
|
||||
}
|
||||
}
|
||||
if (m_recv_pos >= m_recv_buffer_len)
|
||||
{
|
||||
m_recv_pos=0;
|
||||
if (m_recv_len < m_recv_buffer_len)
|
||||
{
|
||||
len=m_recv_buffer_len-m_recv_len;
|
||||
if (len > bytes_allowed_to_recv) len=bytes_allowed_to_recv;
|
||||
if (len > 0)
|
||||
{
|
||||
int res=::recv(m_socket,m_recv_buffer+m_recv_pos,len,0);
|
||||
if (res == 0 || (res < 0 && ERRNO != EWOULDBLOCK))
|
||||
{
|
||||
m_state=STATE_CLOSED;
|
||||
break;
|
||||
}
|
||||
if (res > 0)
|
||||
{
|
||||
bytes_allowed_to_recv-=res;
|
||||
if (bytes_rcvd) *bytes_rcvd+=res;
|
||||
m_recv_pos+=res;
|
||||
m_recv_len+=res;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
if (m_state == STATE_CLOSING)
|
||||
{
|
||||
if (m_send_len < 1) m_state = STATE_CLOSED;
|
||||
}
|
||||
break;
|
||||
default: break;
|
||||
}
|
||||
}
|
||||
|
||||
void JNL_Connection::close(int quick)
|
||||
{
|
||||
if (quick || m_state == STATE_RESOLVING || m_state == STATE_CONNECTING)
|
||||
{
|
||||
m_state=STATE_CLOSED;
|
||||
if (m_socket >= 0)
|
||||
{
|
||||
::shutdown(m_socket, SHUT_RDWR);
|
||||
::closesocket(m_socket);
|
||||
}
|
||||
m_socket=-1;
|
||||
memset(m_recv_buffer,0,m_recv_buffer_len);
|
||||
memset(m_send_buffer,0,m_send_buffer_len);
|
||||
m_remote_port=0;
|
||||
m_recv_len=m_recv_pos=0;
|
||||
m_send_len=m_send_pos=0;
|
||||
m_host[0]=0;
|
||||
memset(&m_saddr,0,sizeof(m_saddr));
|
||||
}
|
||||
else
|
||||
{
|
||||
if (m_state == STATE_CONNECTED) m_state=STATE_CLOSING;
|
||||
}
|
||||
}
|
||||
|
||||
int JNL_Connection::send_bytes_in_queue(void)
|
||||
{
|
||||
return m_send_len;
|
||||
}
|
||||
|
||||
int JNL_Connection::send_bytes_available(void)
|
||||
{
|
||||
return m_send_buffer_len-m_send_len;
|
||||
}
|
||||
|
||||
int JNL_Connection::send(char *data, int length)
|
||||
{
|
||||
if (length > send_bytes_available())
|
||||
{
|
||||
return -1;
|
||||
}
|
||||
|
||||
int write_pos=m_send_pos+m_send_len;
|
||||
if (write_pos >= m_send_buffer_len)
|
||||
{
|
||||
write_pos-=m_send_buffer_len;
|
||||
}
|
||||
|
||||
int len=m_send_buffer_len-write_pos;
|
||||
if (len > length)
|
||||
{
|
||||
len=length;
|
||||
}
|
||||
|
||||
memcpy(m_send_buffer+write_pos,data,len);
|
||||
if (length > len)
|
||||
{
|
||||
memcpy(m_send_buffer,data+len,length-len);
|
||||
}
|
||||
m_send_len+=length;
|
||||
return 0;
|
||||
}
|
||||
|
||||
int JNL_Connection::send_string(char *line)
|
||||
{
|
||||
return send(line,strlen(line));
|
||||
}
|
||||
|
||||
int JNL_Connection::recv_bytes_available(void)
|
||||
{
|
||||
return m_recv_len;
|
||||
}
|
||||
|
||||
int JNL_Connection::peek_bytes(char *data, int maxlength)
|
||||
{
|
||||
if (maxlength > m_recv_len)
|
||||
{
|
||||
maxlength=m_recv_len;
|
||||
}
|
||||
int read_pos=m_recv_pos-m_recv_len;
|
||||
if (read_pos < 0)
|
||||
{
|
||||
read_pos += m_recv_buffer_len;
|
||||
}
|
||||
int len=m_recv_buffer_len-read_pos;
|
||||
if (len > maxlength)
|
||||
{
|
||||
len=maxlength;
|
||||
}
|
||||
memcpy(data,m_recv_buffer+read_pos,len);
|
||||
if (len < maxlength)
|
||||
{
|
||||
memcpy(data+len,m_recv_buffer,maxlength-len);
|
||||
}
|
||||
|
||||
return maxlength;
|
||||
}
|
||||
|
||||
int JNL_Connection::recv_bytes(char *data, int maxlength)
|
||||
{
|
||||
|
||||
int ml=peek_bytes(data,maxlength);
|
||||
m_recv_len-=ml;
|
||||
return ml;
|
||||
}
|
||||
|
||||
int JNL_Connection::getbfromrecv(int pos, int remove)
|
||||
{
|
||||
int read_pos=m_recv_pos-m_recv_len + pos;
|
||||
if (pos < 0 || pos > m_recv_len) return -1;
|
||||
if (read_pos < 0)
|
||||
{
|
||||
read_pos += m_recv_buffer_len;
|
||||
}
|
||||
if (read_pos >= m_recv_buffer_len)
|
||||
{
|
||||
read_pos-=m_recv_buffer_len;
|
||||
}
|
||||
if (remove) m_recv_len--;
|
||||
return m_recv_buffer[read_pos];
|
||||
}
|
||||
|
||||
int JNL_Connection::recv_lines_available(void)
|
||||
{
|
||||
int l=recv_bytes_available();
|
||||
int lcount=0;
|
||||
int lastch=0;
|
||||
int pos;
|
||||
for (pos=0; pos < l; pos ++)
|
||||
{
|
||||
int t=getbfromrecv(pos,0);
|
||||
if (t == -1) return lcount;
|
||||
if ((t=='\r' || t=='\n') &&(
|
||||
(lastch != '\r' && lastch != '\n') || lastch==t
|
||||
)) lcount++;
|
||||
lastch=t;
|
||||
}
|
||||
return lcount;
|
||||
}
|
||||
|
||||
int JNL_Connection::recv_line(char *line, int maxlength)
|
||||
{
|
||||
if (maxlength > m_recv_len) maxlength=m_recv_len;
|
||||
while (maxlength--)
|
||||
{
|
||||
int t=getbfromrecv(0,1);
|
||||
if (t == -1)
|
||||
{
|
||||
*line=0;
|
||||
return 0;
|
||||
}
|
||||
if (t == '\r' || t == '\n')
|
||||
{
|
||||
int r=getbfromrecv(0,0);
|
||||
if ((r == '\r' || r == '\n') && r != t) getbfromrecv(0,1);
|
||||
*line=0;
|
||||
return 0;
|
||||
}
|
||||
*line++=(char)t;
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
|
||||
unsigned long JNL_Connection::get_interface(void)
|
||||
{
|
||||
if (m_socket==-1) return 0;
|
||||
struct sockaddr_in sin;
|
||||
memset(&sin,0,sizeof(sin));
|
||||
socklen_t len=16;
|
||||
if (::getsockname(m_socket,(struct sockaddr *)&sin,&len)) return 0;
|
||||
return (unsigned long) sin.sin_addr.s_addr;
|
||||
}
|
135
Contrib/NSISdl/connection.h
Normal file
|
@ -0,0 +1,135 @@
|
|||
/*
|
||||
** JNetLib
|
||||
** Copyright (C) 2000-2001 Nullsoft, Inc.
|
||||
** Author: Justin Frankel
|
||||
** File: connection.h - JNL TCP connection interface
|
||||
** License: see jnetlib.h
|
||||
**
|
||||
** Usage:
|
||||
** 1. Create a JNL_Connection object, optionally specifying a JNL_AsyncDNS
|
||||
** object to use (or NULL for none, or JNL_CONNECTION_AUTODNS for auto),
|
||||
** and the send and receive buffer sizes.
|
||||
** 2. Call connect() to have it connect to a host/port (the hostname will be
|
||||
** resolved if possible).
|
||||
** 3. call run() with the maximum send/recv amounts, and optionally parameters
|
||||
** so you can tell how much has been send/received. You want to do this a lot, while:
|
||||
** 4. check get_state() to check the state of the connection. The states are:
|
||||
** JNL_Connection::STATE_ERROR
|
||||
** - an error has occured on the connection. the connection has closed,
|
||||
** and you can no longer write to the socket (there still might be
|
||||
** data in the receive buffer - use recv_bytes_available()).
|
||||
** JNL_Connection::STATE_NOCONNECTION
|
||||
** - no connection has been made yet. call connect() already! :)
|
||||
** JNL_Connection::STATE_RESOLVING
|
||||
** - the connection is still waiting for a JNL_AsycnDNS to resolve the
|
||||
** host.
|
||||
** JNL_Connection::STATE_CONNECTING
|
||||
** - the asynchronous call to connect() is still running.
|
||||
** JNL_Connection::STATE_CONNECTED
|
||||
** - the connection has connected, all is well.
|
||||
** JNL_Connection::STATE_CLOSING
|
||||
** - the connection is closing. This happens after a call to close,
|
||||
** without the quick parameter set. This means that the connection
|
||||
** will close once the data in the send buffer is sent (data could
|
||||
** still be being received when it would be closed). After it is
|
||||
** closed, the state will transition to:
|
||||
** JNL_Connection::STATE_CLOSED
|
||||
** - the connection has closed, generally without error. There still
|
||||
** might be data in the receieve buffer, use recv_bytes_available().
|
||||
** 5. Use send() and send_string() to send data. You can use
|
||||
** send_bytes_in_queue() to see how much has yet to go out, or
|
||||
** send_bytes_available() to see how much you can write. If you use send()
|
||||
** or send_string() and not enough room is available, both functions will
|
||||
** return error ( < 0)
|
||||
** 6. Use recv() and recv_line() to get data. If you want to see how much data
|
||||
** there is, use recv_bytes_available() and recv_lines_available(). If you
|
||||
** call recv() and not enough data is available, recv() will return how much
|
||||
** data was actually read. See comments at the function defs.
|
||||
**
|
||||
** 7. To close, call close(1) for a quick close, or close() for a close that will
|
||||
** make the socket close after sending all the data sent.
|
||||
**
|
||||
** 8. delete ye' ol' object.
|
||||
*/
|
||||
|
||||
#ifndef _CONNECTION_H_
|
||||
#define _CONNECTION_H_
|
||||
|
||||
#include "asyncdns.h"
|
||||
|
||||
#define JNL_CONNECTION_AUTODNS ((JNL_AsyncDNS*)-1)
|
||||
|
||||
class JNL_Connection
|
||||
{
|
||||
public:
|
||||
typedef enum
|
||||
{
|
||||
STATE_ERROR,
|
||||
STATE_NOCONNECTION,
|
||||
STATE_RESOLVING,
|
||||
STATE_CONNECTING,
|
||||
STATE_CONNECTED,
|
||||
STATE_CLOSING,
|
||||
STATE_CLOSED
|
||||
} state;
|
||||
|
||||
JNL_Connection(JNL_AsyncDNS *dns=JNL_CONNECTION_AUTODNS, int sendbufsize=8192, int recvbufsize=8192);
|
||||
~JNL_Connection();
|
||||
|
||||
void connect(char *hostname, int port);
|
||||
void connect(int sock, struct sockaddr_in *loc=NULL); // used by the listen object, usually not needed by users.
|
||||
|
||||
void run(int max_send_bytes=-1, int max_recv_bytes=-1, int *bytes_sent=NULL, int *bytes_rcvd=NULL);
|
||||
int get_state() { return m_state; }
|
||||
char *get_errstr() { return m_errorstr; }
|
||||
|
||||
void close(int quick=0);
|
||||
void flush_send(void) { m_send_len=m_send_pos=0; }
|
||||
|
||||
int send_bytes_in_queue(void);
|
||||
int send_bytes_available(void);
|
||||
int send(char *data, int length); // returns -1 if not enough room
|
||||
int send_string(char *line); // returns -1 if not enough room
|
||||
|
||||
|
||||
int recv_bytes_available(void);
|
||||
int recv_bytes(char *data, int maxlength); // returns actual bytes read
|
||||
unsigned int recv_int(void);
|
||||
int recv_lines_available(void);
|
||||
int recv_line(char *line, int maxlength); // returns 0 if the line was terminated with a \r or \n, 1 if not.
|
||||
// (i.e. if you specify maxlength=10, and the line is 12 bytes long
|
||||
// it will return 1. or if there is no \r or \n and that's all the data
|
||||
// the connection has.)
|
||||
int peek_bytes(char *data, int maxlength); // returns bytes peeked
|
||||
|
||||
unsigned long get_interface(void); // this returns the interface the connection is on
|
||||
unsigned long get_remote(void) { return m_saddr.sin_addr.s_addr; } // remote host ip.
|
||||
short get_remote_port(void) { return m_remote_port; } // this returns the remote port of connection
|
||||
|
||||
protected:
|
||||
int m_socket;
|
||||
short m_remote_port;
|
||||
char *m_recv_buffer;
|
||||
char *m_send_buffer;
|
||||
int m_recv_buffer_len;
|
||||
int m_send_buffer_len;
|
||||
|
||||
int m_recv_pos;
|
||||
int m_recv_len;
|
||||
int m_send_pos;
|
||||
int m_send_len;
|
||||
|
||||
struct sockaddr_in m_saddr;
|
||||
char m_host[256];
|
||||
|
||||
JNL_AsyncDNS *m_dns;
|
||||
int m_dns_owned;
|
||||
|
||||
state m_state;
|
||||
char *m_errorstr;
|
||||
|
||||
int getbfromrecv(int pos, int remove); // used by recv_line*
|
||||
|
||||
};
|
||||
|
||||
#endif // _Connection_H_
|
471
Contrib/NSISdl/httpget.cpp
Normal file
|
@ -0,0 +1,471 @@
|
|||
/*
|
||||
** JNetLib
|
||||
** Copyright (C) 2000-2001 Nullsoft, Inc.
|
||||
** Author: Justin Frankel
|
||||
** File: httpget.cpp - JNL HTTP GET implementation
|
||||
** License: see jnetlib.h
|
||||
*/
|
||||
|
||||
#include "netinc.h"
|
||||
#include "util.h"
|
||||
#include "httpget.h"
|
||||
|
||||
|
||||
JNL_HTTPGet::JNL_HTTPGet(JNL_AsyncDNS *dns, int recvbufsize, char *proxy)
|
||||
{
|
||||
m_recvbufsize=recvbufsize;
|
||||
m_dns=dns;
|
||||
m_con=NULL;
|
||||
m_http_proxylpinfo=0;
|
||||
m_http_proxyhost=0;
|
||||
m_http_proxyport=0;
|
||||
if (proxy && *proxy)
|
||||
{
|
||||
char *p=(char*)malloc(strlen(proxy)+1);
|
||||
if (p)
|
||||
{
|
||||
char *r=NULL;
|
||||
strcpy(p,proxy);
|
||||
do_parse_url(p,&m_http_proxyhost,&m_http_proxyport,&r,&m_http_proxylpinfo);
|
||||
free(r);
|
||||
free(p);
|
||||
}
|
||||
}
|
||||
m_sendheaders=NULL;
|
||||
reinit();
|
||||
}
|
||||
|
||||
void JNL_HTTPGet::reinit()
|
||||
{
|
||||
m_errstr=0;
|
||||
m_recvheaders=NULL;
|
||||
m_recvheaders_size=0;
|
||||
m_http_state=0;
|
||||
m_http_port=0;
|
||||
m_http_url=0;
|
||||
m_reply=0;
|
||||
m_http_host=m_http_lpinfo=m_http_request=NULL;
|
||||
}
|
||||
|
||||
void JNL_HTTPGet::deinit()
|
||||
{
|
||||
delete m_con;
|
||||
free(m_recvheaders);
|
||||
|
||||
free(m_http_url);
|
||||
free(m_http_host);
|
||||
free(m_http_lpinfo);
|
||||
free(m_http_request);
|
||||
free(m_errstr);
|
||||
free(m_reply);
|
||||
reinit();
|
||||
}
|
||||
|
||||
JNL_HTTPGet::~JNL_HTTPGet()
|
||||
{
|
||||
deinit();
|
||||
free(m_sendheaders);
|
||||
free(m_http_proxylpinfo);
|
||||
free(m_http_proxyhost);
|
||||
|
||||
}
|
||||
|
||||
|
||||
void JNL_HTTPGet::addheader(char *header)
|
||||
{
|
||||
//if (strstr(header,"\r") || strstr(header,"\n")) return;
|
||||
if (!m_sendheaders)
|
||||
{
|
||||
m_sendheaders=(char*)malloc(strlen(header)+3);
|
||||
if (m_sendheaders)
|
||||
{
|
||||
strcpy(m_sendheaders,header);
|
||||
strcat(m_sendheaders,"\r\n");
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
char *t=(char*)malloc(strlen(header)+strlen(m_sendheaders)+1+2);
|
||||
if (t)
|
||||
{
|
||||
strcpy(t,m_sendheaders);
|
||||
strcat(t,header);
|
||||
strcat(t,"\r\n");
|
||||
free(m_sendheaders);
|
||||
m_sendheaders=t;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void JNL_HTTPGet::do_encode_mimestr(char *in, char *out)
|
||||
{
|
||||
char alphabet[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
|
||||
int shift = 0;
|
||||
int accum = 0;
|
||||
|
||||
while (*in)
|
||||
{
|
||||
if (*in)
|
||||
{
|
||||
accum <<= 8;
|
||||
shift += 8;
|
||||
accum |= *in++;
|
||||
}
|
||||
while ( shift >= 6 )
|
||||
{
|
||||
shift -= 6;
|
||||
*out++ = alphabet[(accum >> shift) & 0x3F];
|
||||
}
|
||||
}
|
||||
if (shift == 4)
|
||||
{
|
||||
*out++ = alphabet[(accum & 0xF)<<2];
|
||||
*out++='=';
|
||||
}
|
||||
else if (shift == 2)
|
||||
{
|
||||
*out++ = alphabet[(accum & 0x3)<<4];
|
||||
*out++='=';
|
||||
*out++='=';
|
||||
}
|
||||
|
||||
*out++=0;
|
||||
}
|
||||
|
||||
|
||||
void JNL_HTTPGet::connect(char *url)
|
||||
{
|
||||
deinit();
|
||||
m_http_url=(char*)malloc(strlen(url)+1);
|
||||
strcpy(m_http_url,url);
|
||||
do_parse_url(m_http_url,&m_http_host,&m_http_port,&m_http_request, &m_http_lpinfo);
|
||||
strcpy(m_http_url,url);
|
||||
if (!m_http_host || !m_http_host[0] || !m_http_port)
|
||||
{
|
||||
m_http_state=-1;
|
||||
seterrstr("invalid URL");
|
||||
return;
|
||||
}
|
||||
|
||||
int sendbufferlen=0;
|
||||
|
||||
if (!m_http_proxyhost || !m_http_proxyhost[0])
|
||||
{
|
||||
sendbufferlen += 4 /* GET */ + strlen(m_http_request) + 9 /* HTTP/1.0 */ + 2;
|
||||
}
|
||||
else
|
||||
{
|
||||
sendbufferlen += 4 /* GET */ + strlen(m_http_url) + 9 /* HTTP/1.0 */ + 2;
|
||||
if (m_http_proxylpinfo&&m_http_proxylpinfo[0])
|
||||
{
|
||||
sendbufferlen+=58+strlen(m_http_proxylpinfo)*2; // being safe here
|
||||
}
|
||||
}
|
||||
sendbufferlen += 5 /* Host: */ + strlen(m_http_host) + 2;
|
||||
|
||||
if (m_http_lpinfo&&m_http_lpinfo[0])
|
||||
{
|
||||
sendbufferlen+=46+strlen(m_http_lpinfo)*2; // being safe here
|
||||
}
|
||||
|
||||
if (m_sendheaders) sendbufferlen+=strlen(m_sendheaders);
|
||||
|
||||
char *str=(char*)malloc(sendbufferlen+1024);
|
||||
if (!str)
|
||||
{
|
||||
seterrstr("error allocating memory");
|
||||
m_http_state=-1;
|
||||
}
|
||||
|
||||
if (!m_http_proxyhost || !m_http_proxyhost[0])
|
||||
{
|
||||
wsprintf(str,"GET %s HTTP/1.0\r\n",m_http_request);
|
||||
}
|
||||
else
|
||||
{
|
||||
wsprintf(str,"GET %s HTTP/1.0\r\n",m_http_url);
|
||||
}
|
||||
|
||||
wsprintf(str+strlen(str),"Host:%s\r\n",m_http_host);
|
||||
|
||||
if (m_http_lpinfo&&m_http_lpinfo[0])
|
||||
{
|
||||
strcat(str,"Authorization: Basic ");
|
||||
do_encode_mimestr(m_http_lpinfo,str+strlen(str));
|
||||
strcat(str,"\r\n");
|
||||
}
|
||||
if (m_http_proxylpinfo&&m_http_proxylpinfo[0])
|
||||
{
|
||||
strcat(str,"Proxy-Authorization: Basic ");
|
||||
do_encode_mimestr(m_http_proxylpinfo,str+strlen(str));
|
||||
strcat(str,"\r\n");
|
||||
}
|
||||
|
||||
if (m_sendheaders) strcat(str,m_sendheaders);
|
||||
strcat(str,"\r\n");
|
||||
|
||||
int a=m_recvbufsize;
|
||||
if (a < 4096) a=4096;
|
||||
m_con=new JNL_Connection(m_dns,strlen(str)+4,a);
|
||||
if (m_con)
|
||||
{
|
||||
if (!m_http_proxyhost || !m_http_proxyhost[0])
|
||||
{
|
||||
m_con->connect(m_http_host,m_http_port);
|
||||
}
|
||||
else
|
||||
{
|
||||
m_con->connect(m_http_proxyhost,m_http_proxyport);
|
||||
}
|
||||
m_con->send_string(str);
|
||||
}
|
||||
else
|
||||
{
|
||||
m_http_state=-1;
|
||||
seterrstr("could not create connection object");
|
||||
}
|
||||
free(str);
|
||||
|
||||
}
|
||||
|
||||
static int _strnicmp(char *b1, char *b2, int l)
|
||||
{
|
||||
while (l-- && *b1 && *b2)
|
||||
{
|
||||
char bb1=*b1++;
|
||||
char bb2=*b2++;
|
||||
if (bb1>='a' && bb1 <= 'z') bb1+='A'-'a';
|
||||
if (bb2>='a' && bb2 <= 'z') bb2+='A'-'a';
|
||||
if (bb1 != bb2) return bb1-bb2;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
char *_strstr(char *i, char *s)
|
||||
{
|
||||
if (strlen(i)>=strlen(s)) while (i[strlen(s)-1])
|
||||
{
|
||||
int l=strlen(s)+1;
|
||||
char *ii=i;
|
||||
char *is=s;
|
||||
while (--l>0)
|
||||
{
|
||||
if (*ii != *is) break;
|
||||
ii++;
|
||||
is++;
|
||||
}
|
||||
if (l==0) return i;
|
||||
i++;
|
||||
}
|
||||
return NULL;
|
||||
}
|
||||
|
||||
#define strstr _strstr
|
||||
|
||||
void JNL_HTTPGet::do_parse_url(char *url, char **host, int *port, char **req, char **lp)
|
||||
{
|
||||
char *p,*np;
|
||||
free(*host); *host=0;
|
||||
free(*req); *req=0;
|
||||
free(*lp); *lp=0;
|
||||
|
||||
if (strstr(url,"://")) np=p=strstr(url,"://")+3;
|
||||
else np=p=url;
|
||||
while (*np != '/' && *np) np++;
|
||||
if (*np)
|
||||
{
|
||||
*req=(char*)malloc(strlen(np)+1);
|
||||
if (*req) strcpy(*req,np);
|
||||
*np++=0;
|
||||
}
|
||||
else
|
||||
{
|
||||
*req=(char*)malloc(2);
|
||||
if (*req) strcpy(*req,"/");
|
||||
}
|
||||
|
||||
np=p;
|
||||
while (*np != '@' && *np) np++;
|
||||
if (*np)
|
||||
{
|
||||
*np++=0;
|
||||
*lp=(char*)malloc(strlen(p)+1);
|
||||
if (*lp) strcpy(*lp,p);
|
||||
p=np;
|
||||
}
|
||||
else
|
||||
{
|
||||
*lp=(char*)malloc(1);
|
||||
if (*lp) strcpy(*lp,"");
|
||||
}
|
||||
np=p;
|
||||
while (*np != ':' && *np) np++;
|
||||
if (*np)
|
||||
{
|
||||
*np++=0;
|
||||
*port=my_atoi(np);
|
||||
} else *port=80;
|
||||
*host=(char*)malloc(strlen(p)+1);
|
||||
if (*host) strcpy(*host,p);
|
||||
}
|
||||
|
||||
|
||||
char *JNL_HTTPGet::getallheaders()
|
||||
{ // double null terminated, null delimited list
|
||||
if (m_recvheaders) return m_recvheaders;
|
||||
else return "\0\0";
|
||||
}
|
||||
|
||||
char *JNL_HTTPGet::getheader(char *headername)
|
||||
{
|
||||
char *ret=NULL;
|
||||
if (strlen(headername)<1||!m_recvheaders) return NULL;
|
||||
char *p=m_recvheaders;
|
||||
while (*p)
|
||||
{
|
||||
if (!_strnicmp(headername,p,strlen(headername)))
|
||||
{
|
||||
ret=p+strlen(headername);
|
||||
while (*ret == ' ') ret++;
|
||||
break;
|
||||
}
|
||||
p+=strlen(p)+1;
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
int JNL_HTTPGet::run()
|
||||
{
|
||||
int cnt=0;
|
||||
if (m_http_state==-1||!m_con) return -1; // error
|
||||
|
||||
|
||||
run_again:
|
||||
static char buf[4096];
|
||||
m_con->run();
|
||||
|
||||
if (m_con->get_state()==JNL_Connection::STATE_ERROR)
|
||||
{
|
||||
seterrstr(m_con->get_errstr());
|
||||
return -1;
|
||||
}
|
||||
if (m_con->get_state()==JNL_Connection::STATE_CLOSED) return 1;
|
||||
|
||||
if (m_http_state==0) // connected, waiting for reply
|
||||
{
|
||||
if (m_con->recv_lines_available()>0)
|
||||
{
|
||||
m_con->recv_line(buf,4095);
|
||||
buf[4095]=0;
|
||||
m_reply=(char*)malloc(strlen(buf)+1);
|
||||
strcpy(m_reply,buf);
|
||||
|
||||
if (strstr(buf,"200")) m_http_state=2; // proceed to read headers normally
|
||||
else if (strstr(buf,"301") || strstr(buf,"302"))
|
||||
{
|
||||
m_http_state=1; // redirect city
|
||||
}
|
||||
else
|
||||
{
|
||||
seterrstr(buf);
|
||||
m_http_state=-1;
|
||||
return -1;
|
||||
}
|
||||
cnt=0;
|
||||
}
|
||||
else if (!cnt++) goto run_again;
|
||||
}
|
||||
if (m_http_state == 1) // redirect
|
||||
{
|
||||
while (m_con->recv_lines_available() > 0)
|
||||
{
|
||||
m_con->recv_line(buf,4096);
|
||||
if (!buf[0])
|
||||
{
|
||||
m_http_state=-1;
|
||||
return -1;
|
||||
}
|
||||
if (!_strnicmp(buf,"Location:",9))
|
||||
{
|
||||
char *p=buf+9; while (*p== ' ') p++;
|
||||
if (*p)
|
||||
{
|
||||
connect(p);
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
if (m_http_state==2)
|
||||
{
|
||||
if (!cnt++ && m_con->recv_lines_available() < 1) goto run_again;
|
||||
while (m_con->recv_lines_available() > 0)
|
||||
{
|
||||
m_con->recv_line(buf,4096);
|
||||
if (!buf[0]) { m_http_state=3; break; }
|
||||
if (!m_recvheaders)
|
||||
{
|
||||
m_recvheaders_size=strlen(buf)+1;
|
||||
m_recvheaders=(char*)malloc(m_recvheaders_size+1);
|
||||
if (m_recvheaders)
|
||||
{
|
||||
strcpy(m_recvheaders,buf);
|
||||
m_recvheaders[m_recvheaders_size]=0;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
int oldsize=m_recvheaders_size;
|
||||
m_recvheaders_size+=strlen(buf)+1;
|
||||
char *n=(char*)malloc(m_recvheaders_size+1);
|
||||
if (n)
|
||||
{
|
||||
memcpy(n,m_recvheaders,oldsize);
|
||||
strcpy(n+oldsize,buf);
|
||||
n[m_recvheaders_size]=0;
|
||||
free(m_recvheaders);
|
||||
m_recvheaders=n;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
if (m_http_state==3)
|
||||
{
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
int JNL_HTTPGet::get_status() // returns 0 if connecting, 1 if reading headers,
|
||||
// 2 if reading content, -1 if error.
|
||||
{
|
||||
if (m_http_state < 0) return -1;
|
||||
if (m_http_state < 2) return 0;
|
||||
if (m_http_state == 2) return 1;
|
||||
if (m_http_state == 3) return 2;
|
||||
return -1;
|
||||
}
|
||||
|
||||
int JNL_HTTPGet::getreplycode()// returns 0 if none yet, otherwise returns http reply code.
|
||||
{
|
||||
if (!m_reply) return 0;
|
||||
char *p=m_reply;
|
||||
while (*p && *p != ' ') p++; // skip over HTTP/x.x
|
||||
if (!*p) return 0;
|
||||
return my_atoi(++p);
|
||||
}
|
||||
|
||||
int JNL_HTTPGet::bytes_available()
|
||||
{
|
||||
if (m_con && m_http_state==3) return m_con->recv_bytes_available();
|
||||
return 0;
|
||||
}
|
||||
int JNL_HTTPGet::get_bytes(char *buf, int len)
|
||||
{
|
||||
if (m_con && m_http_state==3) return m_con->recv_bytes(buf,len);
|
||||
return 0;
|
||||
}
|
||||
int JNL_HTTPGet::peek_bytes(char *buf, int len)
|
||||
{
|
||||
if (m_con && m_http_state==3) return m_con->peek_bytes(buf,len);
|
||||
return 0;
|
||||
}
|
109
Contrib/NSISdl/httpget.h
Normal file
|
@ -0,0 +1,109 @@
|
|||
/*
|
||||
** JNetLib
|
||||
** Copyright (C) 2000-2001 Nullsoft, Inc.
|
||||
** Author: Justin Frankel
|
||||
** File: httpget.h - JNL interface for doing HTTP GETs.
|
||||
** License: see jnetlib.h
|
||||
**
|
||||
** Usage:
|
||||
** 1. Create a JNL_HTTPGet object, optionally specifying a JNL_AsyncDNS
|
||||
** object to use (or NULL for none, or JNL_CONNECTION_AUTODNS for auto),
|
||||
** and the receive buffer size, and a string specifying proxy (or NULL
|
||||
** for none). See note on proxy string below.
|
||||
** 2. call addheader() to add whatever headers you want. It is recommended to
|
||||
** add at least the following two:
|
||||
** addheader("User-Agent:MyApp (Mozilla)");
|
||||
*/// addheader("Accept:*/*");
|
||||
/* ( the comment weirdness is there so I Can do the star-slash :)
|
||||
** 3. Call connect() with the URL you wish to GET (see URL string note below)
|
||||
** 4. Call run() once in a while, checking to see if it returns -1
|
||||
** (if it does return -1, call geterrorstr() to see what the error is).
|
||||
** (if it returns 1, no big deal, the connection has closed).
|
||||
** 5. While you're at it, you can call bytes_available() to see if any data
|
||||
** from the http stream is available, or getheader() to see if any headers
|
||||
** are available, or getreply() to see the HTTP reply, or getallheaders()
|
||||
** to get a double null terminated, null delimited list of headers returned.
|
||||
** 6. If you want to read from the stream, call get_bytes (which returns how much
|
||||
** was actually read).
|
||||
** 7. content_length() is a helper function that uses getheader() to check the
|
||||
** content-length header.
|
||||
** 8. Delete ye' ol' object when done.
|
||||
**
|
||||
** Proxy String:
|
||||
** should be in the format of host:port, or user@host:port, or
|
||||
** user:password@host:port. if port is not specified, 80 is assumed.
|
||||
** URL String:
|
||||
** should be in the format of http://user:pass@host:port/requestwhatever
|
||||
** note that user, pass, port, and /requestwhatever are all optional :)
|
||||
** note that also, http:// is really not important. if you do poo://
|
||||
** or even leave out the http:// altogether, it will still work.
|
||||
*/
|
||||
|
||||
#ifndef _HTTPGET_H_
|
||||
#define _HTTPGET_H_
|
||||
|
||||
#include "connection.h"
|
||||
|
||||
class JNL_HTTPGet
|
||||
{
|
||||
public:
|
||||
JNL_HTTPGet(JNL_AsyncDNS *dns=JNL_CONNECTION_AUTODNS, int recvbufsize=16384, char *proxy=NULL);
|
||||
~JNL_HTTPGet();
|
||||
|
||||
void addheader(char *header);
|
||||
|
||||
void connect(char *url);
|
||||
|
||||
int run(); // returns: 0 if all is OK. -1 if error (call geterrorstr()). 1 if connection closed.
|
||||
|
||||
int get_status(); // returns 0 if connecting, 1 if reading headers,
|
||||
// 2 if reading content, -1 if error.
|
||||
|
||||
char *getallheaders(); // double null terminated, null delimited list
|
||||
char *getheader(char *headername);
|
||||
char *getreply() { return m_reply; }
|
||||
int getreplycode(); // returns 0 if none yet, otherwise returns http reply code.
|
||||
|
||||
char *geterrorstr() { return m_errstr;}
|
||||
|
||||
int bytes_available();
|
||||
int get_bytes(char *buf, int len);
|
||||
int peek_bytes(char *buf, int len);
|
||||
|
||||
int content_length() { char *p=getheader("content-length:"); if (p) return my_atoi(p); return 0; }
|
||||
|
||||
JNL_Connection *get_con() { return m_con; }
|
||||
|
||||
public:
|
||||
void reinit();
|
||||
void deinit();
|
||||
void seterrstr(char *str) { if (m_errstr) free(m_errstr); m_errstr=(char*)malloc(strlen(str)+1); strcpy(m_errstr,str); }
|
||||
|
||||
void do_parse_url(char *url, char **host, int *port, char **req, char **lp);
|
||||
void do_encode_mimestr(char *in, char *out);
|
||||
|
||||
JNL_AsyncDNS *m_dns;
|
||||
JNL_Connection *m_con;
|
||||
int m_recvbufsize;
|
||||
|
||||
int m_http_state;
|
||||
|
||||
int m_http_port;
|
||||
char *m_http_url;
|
||||
char *m_http_host;
|
||||
char *m_http_lpinfo;
|
||||
char *m_http_request;
|
||||
|
||||
char *m_http_proxylpinfo;
|
||||
char *m_http_proxyhost;
|
||||
int m_http_proxyport;
|
||||
|
||||
char *m_sendheaders;
|
||||
char *m_recvheaders;
|
||||
int m_recvheaders_size;
|
||||
char *m_reply;
|
||||
|
||||
char *m_errstr;
|
||||
};
|
||||
|
||||
#endif // _HTTPGET_H_
|
82
Contrib/NSISdl/netinc.h
Normal file
|
@ -0,0 +1,82 @@
|
|||
/*
|
||||
** JNetLib
|
||||
** Copyright (C) 2000-2001 Nullsoft, Inc.
|
||||
** Author: Justin Frankel
|
||||
** File: netinc.h - network includes and portability defines (used internally)
|
||||
** License: see jnetlib.h
|
||||
*/
|
||||
|
||||
#ifndef _NETINC_H_
|
||||
#define _NETINC_H_
|
||||
|
||||
#ifdef _WIN32
|
||||
|
||||
#include <windows.h>
|
||||
#include <stdio.h>
|
||||
#include <time.h>
|
||||
#define strcasecmp(x,y) stricmp(x,y)
|
||||
#define ERRNO (WSAGetLastError())
|
||||
#define SET_SOCK_BLOCK(s,block) { unsigned long __i=block?0:1; ioctlsocket(s,FIONBIO,&__i); }
|
||||
#define EWOULDBLOCK WSAEWOULDBLOCK
|
||||
#define EINPROGRESS WSAEWOULDBLOCK
|
||||
typedef int socklen_t;
|
||||
|
||||
#else
|
||||
|
||||
#ifndef THREAD_SAFE
|
||||
#define THREAD_SAFE
|
||||
#endif
|
||||
#ifndef _REENTRANT
|
||||
#define _REENTRANT
|
||||
#endif
|
||||
#include <pthread.h>
|
||||
#include <sys/types.h>
|
||||
#include <sys/stat.h>
|
||||
#include <sys/socket.h>
|
||||
#include <netinet/in.h>
|
||||
#include <sys/time.h>
|
||||
#include <arpa/inet.h>
|
||||
#include <netdb.h>
|
||||
#include <stdarg.h>
|
||||
#include <stdio.h>
|
||||
#include <fcntl.h>
|
||||
#include <unistd.h>
|
||||
#include <signal.h>
|
||||
#include <stdlib.h>
|
||||
#include <errno.h>
|
||||
#include <string.h>
|
||||
|
||||
#define ERRNO errno
|
||||
#define closesocket(s) close(s)
|
||||
#define SET_SOCK_BLOCK(s,block) { int __flags; if ((__flags = fcntl(s, F_GETFL, 0)) != -1) { if (!block) __flags |= O_NONBLOCK; else __flags &= ~O_NONBLOCK; fcntl(s, F_SETFL, __flags); } }
|
||||
|
||||
#define stricmp(x,y) strcasecmp(x,y)
|
||||
#define strnicmp(x,y,z) strncasecmp(x,y,z)
|
||||
#define wsprintf sprintf
|
||||
|
||||
#endif // !_WIN32
|
||||
|
||||
#ifndef INADDR_NONE
|
||||
#define INADDR_NONE 0xffffffff
|
||||
#endif
|
||||
|
||||
#ifndef INADDR_ANY
|
||||
#define INADDR_ANY 0
|
||||
#endif
|
||||
|
||||
#ifndef SHUT_RDWR
|
||||
#define SHUT_RDWR 2
|
||||
#endif
|
||||
|
||||
extern void mini_memset(void *,char,int);
|
||||
extern void mini_memcpy(void *,void*,int);
|
||||
#define memset mini_memset
|
||||
#define memcpy mini_memcpy
|
||||
#define strcpy lstrcpy
|
||||
#define strncpy lstrcpyn
|
||||
#define strcat lstrcat
|
||||
#define strlen lstrlen
|
||||
#define malloc(x) GlobalAlloc(GPTR,(x))
|
||||
#define free(x) { if (x) GlobalFree(x); }
|
||||
|
||||
#endif //_NETINC_H_
|
448
Contrib/NSISdl/nsisdl.cpp
Normal file
|
@ -0,0 +1,448 @@
|
|||
/*
|
||||
NSIS-DL 1.1 - http downloading DLL for NSIS
|
||||
Copyright (C) 2001 Yaroslav Faybishenko & Justin Frankel
|
||||
|
||||
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.
|
||||
|
||||
|
||||
|
||||
Note: this source code is pretty hacked together right now, improvements
|
||||
and cleanups will come later.
|
||||
|
||||
*/
|
||||
|
||||
#include <windows.h>
|
||||
#include <stdio.h>
|
||||
#include <commctrl.h>
|
||||
|
||||
#include "netinc.h"
|
||||
#include "util.h"
|
||||
#include "resource.h"
|
||||
#include "httpget.h"
|
||||
|
||||
|
||||
void *operator new( unsigned int num_bytes )
|
||||
{
|
||||
return GlobalAlloc(GPTR,num_bytes);
|
||||
}
|
||||
void operator delete( void *p ) { if (p) GlobalFree(p); }
|
||||
|
||||
typedef struct _stack_t {
|
||||
struct _stack_t *next;
|
||||
char text[1]; // this should be the length of string_size
|
||||
} stack_t;
|
||||
|
||||
static int popstring(char *str); // 0 on success, 1 on empty stack
|
||||
static void setuservariable(int varnum, char *var);
|
||||
|
||||
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_LAST
|
||||
};
|
||||
|
||||
|
||||
HANDLE hModule;
|
||||
HWND g_parent;
|
||||
HWND g_dialog;
|
||||
HWND g_childwnd;
|
||||
int g_stringsize;
|
||||
stack_t **g_stacktop;
|
||||
char *g_variables;
|
||||
static int g_cancelled;
|
||||
|
||||
BOOL CALLBACK DownloadDialogProc(HWND hwndDlg,
|
||||
UINT uMsg,
|
||||
WPARAM wParam,
|
||||
LPARAM lParam)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
static void *lpWndProcOld;
|
||||
|
||||
static LRESULT CALLBACK ParentWndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
|
||||
{
|
||||
if (message == WM_COMMAND && LOWORD(wParam) == IDCANCEL)
|
||||
{
|
||||
g_cancelled = 1;
|
||||
return 0;
|
||||
}
|
||||
return CallWindowProc((long (__stdcall *)(struct HWND__ *,unsigned int,unsigned int,long))lpWndProcOld,hwnd,message,wParam,lParam);
|
||||
}
|
||||
|
||||
|
||||
BOOL APIENTRY DllMain( HANDLE _hModule,
|
||||
DWORD ul_reason_for_call,
|
||||
LPVOID lpReserved
|
||||
)
|
||||
{
|
||||
|
||||
switch (ul_reason_for_call)
|
||||
{
|
||||
case DLL_PROCESS_ATTACH:
|
||||
case DLL_THREAD_ATTACH:
|
||||
hModule = _hModule;
|
||||
JNL::open_socketlib ();
|
||||
break;
|
||||
|
||||
case DLL_THREAD_DETACH:
|
||||
case DLL_PROCESS_DETACH:
|
||||
JNL::close_socketlib ();
|
||||
break;
|
||||
|
||||
}
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
|
||||
static int g_file_size;
|
||||
|
||||
static void progress_callback(char *msg, int read_bytes)
|
||||
{
|
||||
if (g_dialog)
|
||||
{
|
||||
HWND hwndProgressBar = GetDlgItem (g_dialog, IDC_PROGRESS1);
|
||||
|
||||
SetDlgItemText (g_dialog, IDC_STATIC2, msg);
|
||||
if (g_file_size) SendMessage(hwndProgressBar, PBM_SETPOS, (WPARAM)MulDiv(read_bytes,30000,g_file_size), 0);
|
||||
}
|
||||
}
|
||||
|
||||
static int getProxyInfo(char *out)
|
||||
{
|
||||
DWORD v=0;
|
||||
HKEY hKey;
|
||||
if (RegOpenKeyEx(HKEY_CURRENT_USER,"Software\\Microsoft\\Windows\\CurrentVersion\\Internet Settings",0,KEY_READ,&hKey) == ERROR_SUCCESS)
|
||||
{
|
||||
DWORD l = 4;
|
||||
DWORD t;
|
||||
if (RegQueryValueEx(hKey,"ProxyEnable",NULL,&t,(unsigned char *)&v,&l) == ERROR_SUCCESS && t == REG_DWORD)
|
||||
{
|
||||
l=8192;
|
||||
if (RegQueryValueEx(hKey,"ProxyServer",NULL,&t,(unsigned char *)out,&l ) != ERROR_SUCCESS || t != REG_SZ)
|
||||
{
|
||||
v=0;
|
||||
*out=0;
|
||||
}
|
||||
}
|
||||
else v=0;
|
||||
out[8192-1]=0;
|
||||
RegCloseKey(hKey);
|
||||
}
|
||||
return v;
|
||||
}
|
||||
|
||||
|
||||
extern char *_strstr(char *i, char *s);
|
||||
|
||||
static
|
||||
void downloadFile(char *url,
|
||||
HANDLE hFile,
|
||||
char **error)
|
||||
{
|
||||
static char buf[8192];
|
||||
char *p=NULL;
|
||||
if (getProxyInfo(buf))
|
||||
{
|
||||
p=_strstr(buf,"http=");
|
||||
if (!p) p=buf;
|
||||
else
|
||||
{
|
||||
p+=5;
|
||||
char *tp=_strstr(p,";");
|
||||
if (tp) *tp=0;
|
||||
}
|
||||
}
|
||||
DWORD start_time=GetTickCount();
|
||||
JNL_HTTPGet *get=new JNL_HTTPGet(JNL_CONNECTION_AUTODNS,16384,(p&&p[0])?p:NULL);
|
||||
int st;
|
||||
int has_printed_headers = 0;
|
||||
int cl;
|
||||
int len;
|
||||
int sofar = 0;
|
||||
|
||||
get->addheader ("User-Agent: NSISDL/1.1 (Mozilla)");
|
||||
get->addheader ("Accept: */*");
|
||||
|
||||
get->connect (url);
|
||||
|
||||
while (1) {
|
||||
if (g_dialog)
|
||||
{
|
||||
MSG msg;
|
||||
while (PeekMessage(&msg,g_dialog,0,0,PM_REMOVE))
|
||||
{
|
||||
TranslateMessage(&msg);
|
||||
DispatchMessage(&msg);
|
||||
}
|
||||
}
|
||||
|
||||
Sleep(25);
|
||||
|
||||
if (g_cancelled) break;
|
||||
|
||||
st = get->run ();
|
||||
|
||||
if (st == -1) {
|
||||
*error=get->geterrorstr();
|
||||
break;
|
||||
} else if (st == 1) {
|
||||
if (sofar < cl)
|
||||
*error="download incomplete";
|
||||
break;
|
||||
} else {
|
||||
|
||||
if (get->get_status () == 0) {
|
||||
// progressFunc ("Connecting ...", 0);
|
||||
|
||||
} else if (get->get_status () == 1) {
|
||||
|
||||
progress_callback("Reading headers", 0);
|
||||
|
||||
} else if (get->get_status () == 2) {
|
||||
|
||||
if (! has_printed_headers) {
|
||||
has_printed_headers = 1;
|
||||
|
||||
cl = get->content_length ();
|
||||
if (cl == 0) {
|
||||
*error = "Server did not specify content length.";
|
||||
break;
|
||||
} else if (g_dialog) {
|
||||
HWND hwndProgressBar = GetDlgItem (g_dialog, IDC_PROGRESS1);
|
||||
SendMessage(hwndProgressBar, PBM_SETRANGE, 0, MAKELPARAM(0,30000));
|
||||
g_file_size=cl;
|
||||
}
|
||||
}
|
||||
|
||||
while ((len = get->bytes_available ()) > 0) {
|
||||
if (len > 8192)
|
||||
len = 8192;
|
||||
len = get->get_bytes (buf, len);
|
||||
if (len > 0) {
|
||||
DWORD dw;
|
||||
WriteFile(hFile,buf,len,&dw,NULL);
|
||||
sofar += len;
|
||||
int time_sofar=(GetTickCount()-start_time)/1000;
|
||||
int bps=sofar/(time_sofar?time_sofar:1);
|
||||
int remain=MulDiv(time_sofar,cl,sofar) - time_sofar;
|
||||
char *rtext="second";
|
||||
if (remain >= 60)
|
||||
{
|
||||
remain/=60;
|
||||
rtext="minute";
|
||||
if (remain >= 60)
|
||||
{
|
||||
remain/=60;
|
||||
rtext="hour";
|
||||
}
|
||||
}
|
||||
wsprintf (buf,
|
||||
"%dkB (%d%%) of %dkB @ %d.%01dkB/s",
|
||||
sofar/1024,
|
||||
MulDiv(100,sofar,cl),
|
||||
cl/1024,
|
||||
bps/1024,((bps*10)/1024)%10
|
||||
);
|
||||
if (remain) wsprintf(buf+lstrlen(buf)," (%d %s%s remaining)",
|
||||
remain,
|
||||
rtext,
|
||||
remain==1?"":"s"
|
||||
);
|
||||
progress_callback(buf, sofar);
|
||||
} else {
|
||||
if (sofar < cl)
|
||||
*error = "Server aborted.";
|
||||
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
} else {
|
||||
*error = "Bad response status.";
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
if (*error)
|
||||
{
|
||||
char *t=*error;
|
||||
*error = (char *)GlobalAlloc(GPTR,strlen(t)+1);
|
||||
lstrcpy(*error,t);
|
||||
}
|
||||
delete get;
|
||||
}
|
||||
|
||||
extern "C"
|
||||
{
|
||||
|
||||
__declspec(dllexport) void download (HWND parent,
|
||||
int stringsize,
|
||||
char *variables,
|
||||
stack_t **stacktop)
|
||||
{
|
||||
static char buf[1024];
|
||||
static char url[1024];
|
||||
static char filename[1024];
|
||||
int wasen=0;
|
||||
HWND hwndL=0;
|
||||
HWND hwndB=0;
|
||||
|
||||
g_parent = parent;
|
||||
g_stringsize = stringsize;
|
||||
g_variables = variables;
|
||||
g_stacktop = stacktop;
|
||||
|
||||
popstring (filename);
|
||||
popstring (url);
|
||||
|
||||
HANDLE hFile = CreateFile(filename,GENERIC_WRITE,FILE_SHARE_READ,NULL,CREATE_ALWAYS,0,NULL);
|
||||
|
||||
if (hFile == INVALID_HANDLE_VALUE) {
|
||||
wsprintf (buf, "Unable to open %s", filename);
|
||||
setuservariable(INST_0, buf);
|
||||
} else {
|
||||
if (g_parent)
|
||||
{
|
||||
g_childwnd=FindWindowEx(g_parent,NULL,"#32770",NULL);
|
||||
hwndL=GetDlgItem(g_childwnd,1016);
|
||||
hwndB=GetDlgItem(g_childwnd,1027);
|
||||
if (hwndL && IsWindowVisible(hwndL)) ShowWindow(hwndL,SW_HIDE);
|
||||
else hwndL=NULL;
|
||||
if (hwndB && IsWindowVisible(hwndB)) ShowWindow(hwndB,SW_HIDE);
|
||||
else hwndB=NULL;
|
||||
|
||||
wasen=EnableWindow(GetDlgItem(g_parent,IDCANCEL),1);
|
||||
lpWndProcOld = (void *) GetWindowLong(g_parent,GWL_WNDPROC);
|
||||
SetWindowLong(g_parent,GWL_WNDPROC,(long)ParentWndProc);
|
||||
|
||||
g_dialog = CreateDialog((HINSTANCE)hModule,
|
||||
MAKEINTRESOURCE(IDD_DIALOG1),
|
||||
g_childwnd,
|
||||
DownloadDialogProc);
|
||||
if (g_dialog)
|
||||
{
|
||||
RECT r;
|
||||
GetWindowRect(GetDlgItem(g_childwnd,1016),&r);
|
||||
ScreenToClient(g_childwnd,(LPPOINT)&r);
|
||||
SetWindowPos(g_dialog,0,r.left,r.top,0,0,SWP_NOACTIVATE|SWP_NOSIZE|SWP_NOZORDER);
|
||||
ShowWindow(g_dialog,SW_SHOWNA);
|
||||
char *p=filename;
|
||||
while (*p) p++;
|
||||
while (*p != '\\' && p != filename) p=CharPrev(filename,p);
|
||||
wsprintf(buf,"Downloading %s", p+1);
|
||||
SetDlgItemText(g_childwnd,1006,buf);
|
||||
|
||||
wsprintf(buf,"Connecting ...");
|
||||
SetDlgItemText (g_dialog, IDC_STATIC2, buf);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
char *error=NULL;
|
||||
|
||||
downloadFile(url, hFile, &error);
|
||||
|
||||
CloseHandle(hFile);
|
||||
if (g_parent)
|
||||
{
|
||||
if (g_dialog) DestroyWindow(g_dialog);
|
||||
if (lpWndProcOld)
|
||||
SetWindowLong(g_parent,GWL_WNDPROC,(long)lpWndProcOld);
|
||||
if (g_childwnd)
|
||||
{
|
||||
if (hwndB) ShowWindow(hwndB,SW_SHOWNA);
|
||||
if (hwndL) ShowWindow(hwndL,SW_SHOWNA);
|
||||
}
|
||||
if (wasen) EnableWindow(GetDlgItem(g_parent,IDCANCEL),0);
|
||||
}
|
||||
|
||||
|
||||
|
||||
if (g_cancelled) {
|
||||
setuservariable(INST_0, "cancel");
|
||||
DeleteFile(filename);
|
||||
} else if (error == NULL) {
|
||||
setuservariable(INST_0, "success");
|
||||
} else {
|
||||
DeleteFile(filename);
|
||||
setuservariable(INST_0, error);
|
||||
}
|
||||
if (error) GlobalFree(error);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
__declspec(dllexport) void download_quiet(HWND parent,
|
||||
int stringsize,
|
||||
char *variables,
|
||||
stack_t **stacktop)
|
||||
{
|
||||
download(NULL,stringsize,variables,stacktop);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
// utility functions (not required but often useful)
|
||||
static
|
||||
int 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 setuservariable(int varnum, char *var)
|
||||
{
|
||||
if (var != NULL && varnum >= 0 && varnum < __INST_LAST) {
|
||||
lstrcpy (g_variables + varnum*g_stringsize, var);
|
||||
|
||||
}
|
||||
}
|
152
Contrib/NSISdl/nsisdl.dsp
Normal file
|
@ -0,0 +1,152 @@
|
|||
# Microsoft Developer Studio Project File - Name="nsisdl" - Package Owner=<4>
|
||||
# Microsoft Developer Studio Generated Build File, Format Version 6.00
|
||||
# ** DO NOT EDIT **
|
||||
|
||||
# TARGTYPE "Win32 (x86) Dynamic-Link Library" 0x0102
|
||||
|
||||
CFG=nsisdl - 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 "nsisdl.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 "nsisdl.mak" CFG="nsisdl - Win32 Debug"
|
||||
!MESSAGE
|
||||
!MESSAGE Possible choices for configuration are:
|
||||
!MESSAGE
|
||||
!MESSAGE "nsisdl - Win32 Release" (based on "Win32 (x86) Dynamic-Link Library")
|
||||
!MESSAGE "nsisdl - 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)" == "nsisdl - 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 "NSISDL_EXPORTS" /YX /FD /c
|
||||
# ADD CPP /nologo /MT /W3 /O1 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "NSISDL_EXPORTS" /YX /FD /c
|
||||
# ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /win32
|
||||
# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /win32
|
||||
# ADD BASE RSC /l 0x409 /d "NDEBUG"
|
||||
# ADD RSC /l 0x409 /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 gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib wsock32.lib /nologo /entry:"DllMain" /dll /machine:I386 /nodefaultlib /out:"../../nsisdl.dll" /opt:nowin98
|
||||
# SUBTRACT LINK32 /pdb:none
|
||||
|
||||
!ELSEIF "$(CFG)" == "nsisdl - 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 Ignore_Export_Lib 0
|
||||
# PROP Target_Dir ""
|
||||
# ADD BASE CPP /nologo /MTd /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "NSISDL_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 "NSISDL_EXPORTS" /YX /FD /GZ /c
|
||||
# ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /win32
|
||||
# ADD MTL /nologo /D "_DEBUG" /mktyplib203 /win32
|
||||
# ADD BASE RSC /l 0x409 /d "_DEBUG"
|
||||
# ADD RSC /l 0x409 /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 wsock32.lib /nologo /dll /debug /machine:I386 /pdbtype:sept
|
||||
|
||||
!ENDIF
|
||||
|
||||
# Begin Target
|
||||
|
||||
# Name "nsisdl - Win32 Release"
|
||||
# Name "nsisdl - Win32 Debug"
|
||||
# Begin Group "Source Files"
|
||||
|
||||
# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat"
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=.\asyncdns.cpp
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=.\connection.cpp
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=.\httpget.cpp
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=.\nsisdl.cpp
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=.\Script1.rc
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=.\util.cpp
|
||||
# End Source File
|
||||
# End Group
|
||||
# Begin Group "Header Files"
|
||||
|
||||
# PROP Default_Filter "h;hpp;hxx;hm;inl"
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=.\asyncdns.h
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=.\connection.h
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=.\httpget.h
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=.\netinc.h
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=.\resource.h
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=.\util.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
|
29
Contrib/NSISdl/nsisdl.dsw
Normal file
|
@ -0,0 +1,29 @@
|
|||
Microsoft Developer Studio Workspace File, Format Version 6.00
|
||||
# WARNING: DO NOT EDIT OR DELETE THIS WORKSPACE FILE!
|
||||
|
||||
###############################################################################
|
||||
|
||||
Project: "nsisdl"=.\nsisdl.dsp - Package Owner=<4>
|
||||
|
||||
Package=<5>
|
||||
{{{
|
||||
}}}
|
||||
|
||||
Package=<4>
|
||||
{{{
|
||||
}}}
|
||||
|
||||
###############################################################################
|
||||
|
||||
Global:
|
||||
|
||||
Package=<5>
|
||||
{{{
|
||||
}}}
|
||||
|
||||
Package=<3>
|
||||
{{{
|
||||
}}}
|
||||
|
||||
###############################################################################
|
||||
|
19
Contrib/NSISdl/resource.h
Normal file
|
@ -0,0 +1,19 @@
|
|||
//{{NO_DEPENDENCIES}}
|
||||
// Microsoft Developer Studio generated include file.
|
||||
// Used by Script1.rc
|
||||
//
|
||||
#define IDD_DIALOG1 101
|
||||
#define IDC_PROGRESS1 1001
|
||||
#define IDC_STATIC1 1002
|
||||
#define IDC_STATIC2 1003
|
||||
|
||||
// Next default values for new objects
|
||||
//
|
||||
#ifdef APSTUDIO_INVOKED
|
||||
#ifndef APSTUDIO_READONLY_SYMBOLS
|
||||
#define _APS_NEXT_RESOURCE_VALUE 103
|
||||
#define _APS_NEXT_COMMAND_VALUE 40001
|
||||
#define _APS_NEXT_CONTROL_VALUE 1004
|
||||
#define _APS_NEXT_SYMED_VALUE 101
|
||||
#endif
|
||||
#endif
|
64
Contrib/NSISdl/util.cpp
Normal file
|
@ -0,0 +1,64 @@
|
|||
/*
|
||||
** JNetLib
|
||||
** Copyright (C) 2000-2001 Nullsoft, Inc.
|
||||
** Author: Justin Frankel
|
||||
** File: util.cpp - JNL implementation of basic network utilities
|
||||
** License: see jnetlib.h
|
||||
*/
|
||||
|
||||
#include "netinc.h"
|
||||
|
||||
#include "util.h"
|
||||
|
||||
int JNL::open_socketlib()
|
||||
{
|
||||
#ifdef _WIN32
|
||||
WSADATA wsaData;
|
||||
if (WSAStartup(MAKEWORD(1, 1), &wsaData)) return 1;
|
||||
#endif
|
||||
return 0;
|
||||
}
|
||||
void JNL::close_socketlib()
|
||||
{
|
||||
#ifdef _WIN32
|
||||
WSACleanup();
|
||||
#endif
|
||||
}
|
||||
unsigned long JNL::ipstr_to_addr(const char *cp)
|
||||
{
|
||||
return ::inet_addr(cp);
|
||||
}
|
||||
|
||||
void JNL::addr_to_ipstr(unsigned long addr, char *host, int maxhostlen)
|
||||
{
|
||||
struct in_addr a; a.s_addr=addr;
|
||||
char *p=::inet_ntoa(a); strncpy(host,p?p:"",maxhostlen);
|
||||
}
|
||||
|
||||
int my_atoi(char *s)
|
||||
{
|
||||
int sign=0;
|
||||
int v=0;
|
||||
if (*s == '-') { s++; sign++; }
|
||||
for (;;)
|
||||
{
|
||||
int c=*s++ - '0';
|
||||
if (c < 0 || c > 9) break;
|
||||
v*=10;
|
||||
v+=c;
|
||||
}
|
||||
if (sign) return -(int) v;
|
||||
return (int)v;
|
||||
}
|
||||
|
||||
void mini_memset(void *o,char i,int l)
|
||||
{
|
||||
char *oo=(char*)o;
|
||||
while (l-- > 0) *oo++=i;
|
||||
}
|
||||
void mini_memcpy(void *o,void*i,int l)
|
||||
{
|
||||
char *oo=(char*)o;
|
||||
char *ii=(char*)i;
|
||||
while (l-- > 0) *oo++=*ii++;
|
||||
}
|
41
Contrib/NSISdl/util.h
Normal file
|
@ -0,0 +1,41 @@
|
|||
/*
|
||||
** JNetLib
|
||||
** Copyright (C) 2000-2001 Nullsoft, Inc.
|
||||
** Author: Justin Frankel
|
||||
** File: util.h - JNL interface for basic network utilities
|
||||
** License: see jnetlib.h
|
||||
**
|
||||
** routines you may be interested in:
|
||||
** JNL::open_socketlib();
|
||||
** opens the socket library. Call this once before using any network
|
||||
** code. If you create a new thread, call this again. Only really an
|
||||
** issue for Win32 support, but use it anyway for portability/
|
||||
**
|
||||
** JNL::close_Socketlib();
|
||||
** closes the socketlib. Call this when you're done with the network,
|
||||
** after all your JNetLib objects have been destroyed.
|
||||
**
|
||||
** unsigned long JNL::ipstr_to_addr(const char *cp);
|
||||
** gives you the integer representation of a ip address in dotted
|
||||
** decimal form.
|
||||
**
|
||||
** JNL::addr_to_ipstr(unsigned long addr, char *host, int maxhostlen);
|
||||
** gives you the dotted decimal notation of an integer ip address.
|
||||
**
|
||||
*/
|
||||
|
||||
#ifndef _UTIL_H_
|
||||
#define _UTIL_H_
|
||||
|
||||
class JNL
|
||||
{
|
||||
public:
|
||||
static int open_socketlib();
|
||||
static void close_socketlib();
|
||||
static unsigned long ipstr_to_addr(const char *cp);
|
||||
static void addr_to_ipstr(unsigned long addr, char *host, int maxhostlen);
|
||||
};
|
||||
|
||||
int my_atoi(char *p);
|
||||
|
||||
#endif //_UTIL_H_
|
137
Contrib/Splash/splash.c
Normal file
|
@ -0,0 +1,137 @@
|
|||
#include <windows.h>
|
||||
|
||||
HBITMAP g_hbm;
|
||||
int sleep_val;
|
||||
int g_rv;
|
||||
|
||||
static LRESULT CALLBACK WndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
|
||||
{
|
||||
if (uMsg == WM_CREATE)
|
||||
{
|
||||
BITMAP bm;
|
||||
RECT vp;
|
||||
GetObject(g_hbm, sizeof(bm), (LPSTR)&bm);
|
||||
SystemParametersInfo(SPI_GETWORKAREA, 0, &vp, 0);
|
||||
SetWindowLong(hwnd,GWL_STYLE,0);
|
||||
SetWindowPos(hwnd,NULL,
|
||||
vp.left+(vp.right-vp.left-bm.bmWidth)/2,
|
||||
vp.top+(vp.bottom-vp.top-bm.bmHeight)/2,
|
||||
bm.bmWidth,bm.bmHeight,
|
||||
SWP_NOZORDER);
|
||||
ShowWindow(hwnd,SW_SHOW);
|
||||
SetTimer(hwnd,1,sleep_val,NULL);
|
||||
return 0;
|
||||
}
|
||||
if (uMsg == WM_PAINT)
|
||||
{
|
||||
PAINTSTRUCT ps;
|
||||
RECT r;
|
||||
HDC curdc=BeginPaint(hwnd,&ps);
|
||||
HDC hdc=CreateCompatibleDC(curdc);
|
||||
HBITMAP oldbm;
|
||||
GetClientRect(hwnd,&r);
|
||||
oldbm=(HBITMAP)SelectObject(hdc,g_hbm);
|
||||
BitBlt(curdc,r.left,r.top,r.right-r.left,r.bottom-r.top,hdc,0,0,SRCCOPY);
|
||||
SelectObject(hdc,oldbm);
|
||||
DeleteDC(hdc);
|
||||
EndPaint(hwnd,&ps);
|
||||
return 0;
|
||||
}
|
||||
if (uMsg == WM_CLOSE) return 0;
|
||||
if (uMsg == WM_DESTROY)
|
||||
{
|
||||
PostQuitMessage(0);
|
||||
return 0;
|
||||
}
|
||||
if (uMsg == WM_TIMER || uMsg == WM_LBUTTONDOWN)
|
||||
{
|
||||
g_rv=(uMsg == WM_LBUTTONDOWN);
|
||||
DestroyWindow(hwnd);
|
||||
}
|
||||
return DefWindowProc(hwnd,uMsg,wParam,lParam);
|
||||
}
|
||||
|
||||
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInst,LPSTR lpszCmdParam, int nCmdShow)
|
||||
{
|
||||
char fn[MAX_PATH];
|
||||
int hwndParent;
|
||||
char *o=fn;
|
||||
|
||||
hInstance=GetModuleHandle(NULL);
|
||||
lpszCmdParam=GetCommandLine();
|
||||
if (*lpszCmdParam == '\"')
|
||||
{
|
||||
do
|
||||
{
|
||||
lpszCmdParam++;
|
||||
} while (*lpszCmdParam != '\"' && *lpszCmdParam);
|
||||
if (*lpszCmdParam) lpszCmdParam++;
|
||||
}
|
||||
else
|
||||
{
|
||||
do
|
||||
{
|
||||
lpszCmdParam++;
|
||||
} while (*lpszCmdParam != ' ' && *lpszCmdParam);
|
||||
}
|
||||
while (*lpszCmdParam == ' ') lpszCmdParam++;
|
||||
sleep_val=0;
|
||||
while (*lpszCmdParam >= '0' && *lpszCmdParam <= '9')
|
||||
{
|
||||
sleep_val*=10;
|
||||
sleep_val += *lpszCmdParam++-'0';
|
||||
}
|
||||
|
||||
while (*lpszCmdParam == ' ') lpszCmdParam++;
|
||||
hwndParent=0;
|
||||
while (*lpszCmdParam >= '0' && *lpszCmdParam <= '9')
|
||||
{
|
||||
hwndParent*=10;
|
||||
hwndParent += *lpszCmdParam++-'0';
|
||||
}
|
||||
|
||||
while (*lpszCmdParam == ' ') lpszCmdParam++;
|
||||
while (*lpszCmdParam)
|
||||
{
|
||||
*o++=*lpszCmdParam++;
|
||||
}
|
||||
*o=0;
|
||||
|
||||
if (fn[0] && sleep_val>0)
|
||||
{
|
||||
MSG msg;
|
||||
char classname[4]="_sp";
|
||||
static WNDCLASS wc;
|
||||
wc.lpfnWndProc = WndProc;
|
||||
wc.hInstance = hInstance;
|
||||
wc.hCursor = LoadCursor(NULL,IDC_ARROW);
|
||||
wc.lpszClassName = classname;
|
||||
if (RegisterClass(&wc))
|
||||
{
|
||||
char fn2[MAX_PATH];
|
||||
lstrcpy(fn2,fn);
|
||||
lstrcat(fn,".bmp");
|
||||
lstrcat(fn2,".wav");
|
||||
g_hbm=LoadImage(NULL,fn,IMAGE_BITMAP,0,0,LR_CREATEDIBSECTION|LR_LOADFROMFILE);
|
||||
if (g_hbm)
|
||||
{
|
||||
BOOL s=0;
|
||||
HANDLE f=CreateFile(fn2,0,0,NULL,OPEN_EXISTING,0,NULL);
|
||||
if (f != INVALID_HANDLE_VALUE) { CloseHandle(f); s=PlaySound(fn2,NULL,SND_ASYNC|SND_FILENAME); }
|
||||
|
||||
CreateWindowEx(WS_EX_TOOLWINDOW,classname,classname,
|
||||
0,0,0,0,0,(HWND)hwndParent,NULL,hInstance,NULL);
|
||||
|
||||
while (GetMessage(&msg,NULL,0,0))
|
||||
{
|
||||
DispatchMessage(&msg);
|
||||
}
|
||||
|
||||
if (s) PlaySound(NULL,0,0);
|
||||
|
||||
DeleteObject(g_hbm);
|
||||
}
|
||||
}
|
||||
}
|
||||
ExitProcess(g_rv);
|
||||
}
|
108
Contrib/Splash/splash.dsp
Normal file
|
@ -0,0 +1,108 @@
|
|||
# Microsoft Developer Studio Project File - Name="splash" - Package Owner=<4>
|
||||
# Microsoft Developer Studio Generated Build File, Format Version 6.00
|
||||
# ** DO NOT EDIT **
|
||||
|
||||
# TARGTYPE "Win32 (x86) Application" 0x0101
|
||||
|
||||
CFG=splash - 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 "splash.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 "splash.mak" CFG="splash - Win32 Debug"
|
||||
!MESSAGE
|
||||
!MESSAGE Possible choices for configuration are:
|
||||
!MESSAGE
|
||||
!MESSAGE "splash - Win32 Release" (based on "Win32 (x86) Application")
|
||||
!MESSAGE "splash - Win32 Debug" (based on "Win32 (x86) Application")
|
||||
!MESSAGE
|
||||
|
||||
# Begin Project
|
||||
# PROP AllowPerConfigDependencies 0
|
||||
# PROP Scc_ProjName ""
|
||||
# PROP Scc_LocalPath ""
|
||||
CPP=cl.exe
|
||||
MTL=midl.exe
|
||||
RSC=rc.exe
|
||||
|
||||
!IF "$(CFG)" == "splash - 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 /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /YX /FD /c
|
||||
# ADD CPP /nologo /W3 /GX /Og /Os /Oy /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /FD /c
|
||||
# SUBTRACT CPP /Ox /Ow /YX
|
||||
# ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /win32
|
||||
# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /win32
|
||||
# ADD BASE RSC /l 0x409 /d "NDEBUG"
|
||||
# ADD RSC /l 0x409 /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 /subsystem:windows /machine:I386
|
||||
# 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 winmm.lib /nologo /entry:"WinMain" /subsystem:windows /machine:I386 /nodefaultlib /out:"../../splash.exe" /opt:nowin98
|
||||
# SUBTRACT LINK32 /pdb:none
|
||||
|
||||
!ELSEIF "$(CFG)" == "splash - 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 /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /YX /FD /GZ /c
|
||||
# ADD CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /YX /FD /GZ /c
|
||||
# ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /win32
|
||||
# ADD MTL /nologo /D "_DEBUG" /mktyplib203 /win32
|
||||
# ADD BASE RSC /l 0x409 /d "_DEBUG"
|
||||
# ADD RSC /l 0x409 /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 /subsystem:windows /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 /subsystem:windows /debug /machine:I386 /pdbtype:sept
|
||||
|
||||
!ENDIF
|
||||
|
||||
# Begin Target
|
||||
|
||||
# Name "splash - Win32 Release"
|
||||
# Name "splash - Win32 Debug"
|
||||
# Begin Group "Source Files"
|
||||
|
||||
# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat"
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=.\splash.c
|
||||
# End Source File
|
||||
# End Group
|
||||
# Begin Group "Header Files"
|
||||
|
||||
# PROP Default_Filter "h;hpp;hxx;hm;inl"
|
||||
# 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
|
29
Contrib/Splash/splash.dsw
Normal file
|
@ -0,0 +1,29 @@
|
|||
Microsoft Developer Studio Workspace File, Format Version 6.00
|
||||
# WARNING: DO NOT EDIT OR DELETE THIS WORKSPACE FILE!
|
||||
|
||||
###############################################################################
|
||||
|
||||
Project: "splash"=.\splash.dsp - Package Owner=<4>
|
||||
|
||||
Package=<5>
|
||||
{{{
|
||||
}}}
|
||||
|
||||
Package=<4>
|
||||
{{{
|
||||
}}}
|
||||
|
||||
###############################################################################
|
||||
|
||||
Global:
|
||||
|
||||
Package=<5>
|
||||
{{{
|
||||
}}}
|
||||
|
||||
Package=<3>
|
||||
{{{
|
||||
}}}
|
||||
|
||||
###############################################################################
|
||||
|
38
Contrib/Splash/splash.txt
Normal file
|
@ -0,0 +1,38 @@
|
|||
Splash.exe - small (3.5k), simple (one file) program that lets you throw
|
||||
up a splash screen in NSIS installers.
|
||||
|
||||
--- UPDATED in 1.50 - will break old scripts ---
|
||||
|
||||
To use:
|
||||
|
||||
Create a .BMP file of your splash screen.
|
||||
(optional) Create a .WAV file to play while your splash screen shows.
|
||||
|
||||
Add the following lines to your .NSI file:
|
||||
|
||||
Function .onInit
|
||||
SetOutPath $TEMP
|
||||
File /oname=spltmp.bmp "my_splash.bmp"
|
||||
|
||||
; optional
|
||||
; File /oname=spltmp.wav "my_splashshit.wav"
|
||||
|
||||
File /oname=spltmp.exe "C:\program files\nsis\splash.exe"
|
||||
ExecWait '"$TEMP\spltmp.exe" 1000 $HWNDPARENT $TEMP\spltmp'
|
||||
Delete $TEMP\spltmp.exe
|
||||
Delete $TEMP\spltmp.bmp
|
||||
; Delete $TEMP\spltmp.wav
|
||||
FunctionEnd
|
||||
|
||||
Note that the first parameter to splash.exe is the length to show the
|
||||
screen for (in milliseconds), the second is the parent window (in decimal),
|
||||
and the last is the splash bitmap filename (without the .bmp). The BMP file
|
||||
used will be this parameter.bmp, and the wave file used (if present) will be
|
||||
this parameter.wav.
|
||||
|
||||
(If you already have an .onInit function, put that in it)
|
||||
|
||||
Note: the return value of splash.exe is 1 if the user closed the splash
|
||||
screen early (you can check it using ClearErrors/IfErrors)
|
||||
|
||||
-Justin
|
BIN
Contrib/UIs/default.exe
Executable file
BIN
Contrib/UIs/mlbl.exe
Executable file
BIN
Contrib/UIs/mlbl2.exe
Executable file
BIN
Contrib/zip2exe/icon.ico
Normal file
After Width: | Height: | Size: 766 B |
715
Contrib/zip2exe/main.cpp
Normal file
|
@ -0,0 +1,715 @@
|
|||
#include <windows.h>
|
||||
#include <stdio.h>
|
||||
|
||||
// portions Copyright © 1999-2001 Miguel Garrido (mgarrido01@hotmail.com)
|
||||
|
||||
extern "C"
|
||||
{
|
||||
#include "zlib/unzip.h"
|
||||
};
|
||||
#include "resource.h"
|
||||
|
||||
const char *g_errcaption="ZIP2EXE Error";
|
||||
|
||||
HINSTANCE g_hInstance;
|
||||
HWND g_hwnd;
|
||||
HANDLE g_hThread;
|
||||
char g_cmdline[1024];
|
||||
char g_makensis_path[MAX_PATH];
|
||||
int g_extracting;
|
||||
int g_zipfile_size;
|
||||
|
||||
char *g_options="";//"/V3";
|
||||
|
||||
static BOOL CALLBACK DlgProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam);
|
||||
|
||||
|
||||
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInst,
|
||||
LPSTR lpszCmdParam, int nCmdShow)
|
||||
{
|
||||
g_hInstance=hInstance;
|
||||
|
||||
|
||||
return DialogBox(hInstance,MAKEINTRESOURCE(IDD_DIALOG1),GetDesktopWindow(),DlgProc);
|
||||
}
|
||||
char tempzip_path[1024];
|
||||
|
||||
|
||||
int made;
|
||||
|
||||
static void doRMDir(char *buf)
|
||||
{
|
||||
HANDLE h;
|
||||
WIN32_FIND_DATA fd;
|
||||
char *p=buf;
|
||||
while (*p) p++;
|
||||
lstrcpy(p,"\\*.*");
|
||||
h = FindFirstFile(buf,&fd);
|
||||
if (h != INVALID_HANDLE_VALUE)
|
||||
{
|
||||
do
|
||||
{
|
||||
if (fd.cFileName[0] != '.' ||
|
||||
(fd.cFileName[1] != '.' && fd.cFileName[1]))
|
||||
{
|
||||
lstrcpy(p+1,fd.cFileName);
|
||||
if (fd.dwFileAttributes & FILE_ATTRIBUTE_READONLY)
|
||||
SetFileAttributes(buf,fd.dwFileAttributes^FILE_ATTRIBUTE_READONLY);
|
||||
if (fd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) doRMDir(buf);
|
||||
else
|
||||
{
|
||||
DeleteFile(buf);
|
||||
}
|
||||
}
|
||||
} while (FindNextFile(h,&fd));
|
||||
FindClose(h);
|
||||
}
|
||||
p[0]=0; // fix buffer
|
||||
RemoveDirectory(buf);
|
||||
}
|
||||
|
||||
static 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);
|
||||
}
|
||||
|
||||
|
||||
|
||||
void tempzip_cleanup(HWND hwndDlg, int err)
|
||||
{
|
||||
if (tempzip_path[0]) doRMDir(tempzip_path);
|
||||
tempzip_path[0]=0;
|
||||
if (err)
|
||||
{
|
||||
SendDlgItemMessage(hwndDlg,IDC_ZIPINFO_FILES,LB_RESETCONTENT,0,0);
|
||||
EnableWindow(GetDlgItem(hwndDlg,IDOK),0);
|
||||
SetDlgItemText(hwndDlg,IDC_ZIPINFO_SUMMARY,"");
|
||||
SetDlgItemText(hwndDlg,IDC_ZIPFILE,"");
|
||||
SetDlgItemText(hwndDlg,IDC_OUTFILE,"");
|
||||
}
|
||||
}
|
||||
|
||||
int tempzip_make(HWND hwndDlg, char *fn)
|
||||
{
|
||||
char buf[MAX_PATH];
|
||||
GetTempPath(MAX_PATH,buf);
|
||||
GetTempFileName(buf,"z2e",GetTickCount(),tempzip_path);
|
||||
if (!CreateDirectory(tempzip_path,NULL))
|
||||
{
|
||||
GetTempPath(MAX_PATH,tempzip_path);
|
||||
strcat(tempzip_path,"\\nsi");
|
||||
if (!CreateDirectory(tempzip_path,NULL))
|
||||
{
|
||||
tempzip_path[0]=0;
|
||||
MessageBox(hwndDlg,"Error creating temporary directory",g_errcaption,MB_OK|MB_ICONSTOP);
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
FILE *fp=fopen(fn,"rb");
|
||||
if (fp)
|
||||
{
|
||||
fseek(fp,0,SEEK_END);
|
||||
g_zipfile_size=ftell(fp);
|
||||
fclose(fp);
|
||||
}
|
||||
else g_zipfile_size=0;
|
||||
unzFile f;
|
||||
f = unzOpen(fn);
|
||||
if (!f || unzGoToFirstFile(f) != UNZ_OK)
|
||||
{
|
||||
if (f) unzClose(f);
|
||||
MessageBox(hwndDlg,"Error opening ZIP file",g_errcaption,MB_OK|MB_ICONSTOP);
|
||||
return 1;
|
||||
}
|
||||
|
||||
int nf=0, nkb=0;
|
||||
g_extracting=1;
|
||||
do {
|
||||
char filename[MAX_PATH];
|
||||
unzGetCurrentFileInfo(f,NULL,filename,sizeof(filename),NULL,0,NULL,0);
|
||||
if (filename[0] &&
|
||||
filename[strlen(filename)-1] != '\\' &&
|
||||
filename[strlen(filename)-1] != '/')
|
||||
{
|
||||
char *pfn=filename;
|
||||
while (*pfn)
|
||||
{
|
||||
if (*pfn == '/') *pfn='\\';
|
||||
pfn++;
|
||||
}
|
||||
pfn=filename;
|
||||
if (pfn[1] == ':' && pfn[2] == '\\') pfn+=3;
|
||||
while (*pfn == '\\') pfn++;
|
||||
|
||||
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)
|
||||
{
|
||||
SendDlgItemMessage(hwndDlg,IDC_ZIPINFO_FILES,LB_ADDSTRING,0,(LPARAM)pfn);
|
||||
FILE *fp;
|
||||
int l;
|
||||
fp = fopen(out_filename,"wb");
|
||||
if (fp)
|
||||
{
|
||||
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);
|
||||
MessageBox(hwndDlg,"Error writing output file(s)",g_errcaption,MB_OK|MB_ICONSTOP);
|
||||
g_extracting=0;
|
||||
return 1;
|
||||
}
|
||||
nkb++;
|
||||
}
|
||||
} while (l > 0);
|
||||
|
||||
fclose(fp);
|
||||
}
|
||||
else
|
||||
{
|
||||
unzClose(f);
|
||||
MessageBox(hwndDlg,"Error opening output file(s)",g_errcaption,MB_OK|MB_ICONSTOP);
|
||||
g_extracting=0;
|
||||
return 1;
|
||||
}
|
||||
nf++;
|
||||
wsprintf(buf,"Extracting: %d files, %dKB",nf,nkb);
|
||||
SetDlgItemText(hwndDlg,IDC_ZIPINFO_SUMMARY,buf);
|
||||
MSG msg;
|
||||
int quit=0;
|
||||
while (PeekMessage(&msg,NULL,0,0,PM_REMOVE))
|
||||
{
|
||||
if (msg.message == WM_DESTROY && msg.hwnd == g_hwnd)
|
||||
{
|
||||
quit++;
|
||||
break;
|
||||
}
|
||||
TranslateMessage(&msg);
|
||||
DispatchMessage(&msg);
|
||||
}
|
||||
unzCloseCurrentFile(f);
|
||||
if (quit) break;
|
||||
}
|
||||
else
|
||||
{
|
||||
unzClose(f);
|
||||
MessageBox(hwndDlg,"Error extracting from ZIP file",g_errcaption,MB_OK|MB_ICONSTOP);
|
||||
g_extracting=0;
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
} while (unzGoToNextFile(f) == UNZ_OK);
|
||||
|
||||
g_extracting=0;
|
||||
wsprintf(buf,"Extracted: %d files, %dKB",nf,nkb);
|
||||
SetDlgItemText(hwndDlg,IDC_ZIPINFO_SUMMARY,buf);
|
||||
unzClose(f);
|
||||
return 0;
|
||||
}
|
||||
|
||||
char *gp_winamp = "(WINAMP DIRECTORY)";
|
||||
char *gp_winamp_plugins = "(WINAMP PLUG-INS DIRECTORY)";
|
||||
char *gp_winamp_vis = "(WINAMP VIS PLUG-INS DIRECTORY)";
|
||||
char *gp_winamp_dsp = "(WINAMP DSP PLUG-INS DIRECTORY)";
|
||||
char *gp_winamp_skins = "(WINAMP SKINS DIRECTORY)";
|
||||
char *gp_poi = "(PATH OF INSTALLER)";
|
||||
|
||||
|
||||
void wnd_printf(const char *str)
|
||||
{
|
||||
if (!*str) return;
|
||||
char existing_text[32000];
|
||||
existing_text[0]=0;
|
||||
UINT l=GetDlgItemText(g_hwnd, IDC_OUTPUTTEXT, existing_text, 32000);
|
||||
l+=strlen(str);
|
||||
|
||||
char *p=existing_text;
|
||||
existing_text[31000]=0;
|
||||
while (l > 31000 && *p)
|
||||
{
|
||||
while (*p != '\r' && *p != '\n' && *p)
|
||||
{
|
||||
p++;
|
||||
l--;
|
||||
}
|
||||
while (*p == '\r' || *p == '\n')
|
||||
{
|
||||
p++;
|
||||
l--;
|
||||
}
|
||||
}
|
||||
|
||||
char buf[31000];
|
||||
lstrcpy(buf,p);
|
||||
lstrcpy(existing_text,buf);
|
||||
lstrcat(existing_text,str);
|
||||
|
||||
SetDlgItemText(g_hwnd, IDC_OUTPUTTEXT, existing_text);
|
||||
SendDlgItemMessage(g_hwnd, IDC_OUTPUTTEXT, EM_LINESCROLL, 0, SendDlgItemMessage(g_hwnd, IDC_OUTPUTTEXT, EM_GETLINECOUNT, 0, 0)); // scroll to the last line of the textbox
|
||||
|
||||
}
|
||||
|
||||
void ErrorMessage(char *str) //display detailed error info
|
||||
{
|
||||
LPVOID msg;
|
||||
FormatMessage(
|
||||
FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM,
|
||||
NULL,
|
||||
GetLastError(),
|
||||
MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // Default language
|
||||
(LPTSTR) &msg,
|
||||
0,
|
||||
NULL
|
||||
);
|
||||
wnd_printf(str);
|
||||
wnd_printf(": ");
|
||||
wnd_printf((char*)msg);
|
||||
LocalFree(msg);
|
||||
}
|
||||
|
||||
DWORD WINAPI ThreadProc(LPVOID p) // thread that will start & monitor wwwinamp
|
||||
{
|
||||
char buf[1024]; //i/o buffer
|
||||
STARTUPINFO si={sizeof(si),};
|
||||
SECURITY_ATTRIBUTES sa={sizeof(sa),};
|
||||
SECURITY_DESCRIPTOR sd={0,}; //security information for pipes
|
||||
PROCESS_INFORMATION pi={0,};
|
||||
HANDLE newstdout=0,read_stdout=0; //pipe handles
|
||||
|
||||
OSVERSIONINFO osv={sizeof(osv)};
|
||||
GetVersionEx(&osv);
|
||||
if (osv.dwPlatformId == VER_PLATFORM_WIN32_NT) //initialize security descriptor (Windows NT)
|
||||
{
|
||||
InitializeSecurityDescriptor(&sd,SECURITY_DESCRIPTOR_REVISION);
|
||||
SetSecurityDescriptorDacl(&sd, true, NULL, false);
|
||||
sa.lpSecurityDescriptor = &sd;
|
||||
}
|
||||
else sa.lpSecurityDescriptor = NULL;
|
||||
sa.bInheritHandle = true; //allow inheritable handles
|
||||
|
||||
if (!CreatePipe(&read_stdout,&newstdout,&sa,0)) //create stdout pipe
|
||||
{
|
||||
ErrorMessage("CreatePipe");
|
||||
PostMessage(g_hwnd,WM_USER+1203,0,1);
|
||||
return 1;
|
||||
}
|
||||
|
||||
GetStartupInfo(&si); //set startupinfo for the spawned process
|
||||
/*
|
||||
The dwFlags member tells CreateProcess how to make the process.
|
||||
STARTF_USESTDHANDLES validates the hStd* members. STARTF_USESHOWWINDOW
|
||||
validates the wShowWindow member.
|
||||
*/
|
||||
si.dwFlags = STARTF_USESTDHANDLES|STARTF_USESHOWWINDOW;
|
||||
si.wShowWindow = SW_HIDE;
|
||||
si.hStdOutput = newstdout;
|
||||
si.hStdError = newstdout; //set the new handles for the child process
|
||||
|
||||
// *******************************************************************
|
||||
// If there is a command line in the config file, use it for create process
|
||||
|
||||
//spawn the child process
|
||||
if (!CreateProcess(NULL,g_cmdline,NULL,NULL,TRUE,CREATE_NEW_CONSOLE,
|
||||
NULL,tempzip_path,&si,&pi))
|
||||
{
|
||||
ErrorMessage("CreateProcess");
|
||||
wnd_printf("\r\nPlease make sure the path to makensis.exe is correct.");
|
||||
CloseHandle(newstdout);
|
||||
CloseHandle(read_stdout);
|
||||
PostMessage(g_hwnd,WM_USER+1203,0,1);
|
||||
return 1;
|
||||
}
|
||||
|
||||
unsigned long exit=0; //process exit code
|
||||
unsigned long bread; //bytes read
|
||||
unsigned long avail; //bytes available
|
||||
|
||||
memset(buf,0,sizeof(buf));
|
||||
while (1) //main program loop
|
||||
{
|
||||
PeekNamedPipe(read_stdout,buf,1023,&bread,&avail,NULL);
|
||||
//check to see if there is any data to read from stdout
|
||||
if (bread != 0)
|
||||
{
|
||||
memset(buf,0,sizeof(buf));
|
||||
if (avail > 1023)
|
||||
{
|
||||
while (bread >= 1023)
|
||||
{
|
||||
ReadFile(read_stdout,buf,1023,&bread,NULL); //read the stdout pipe
|
||||
wnd_printf(buf);
|
||||
memset(buf,0,sizeof(buf));
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
ReadFile(read_stdout,buf,1023,&bread,NULL);
|
||||
wnd_printf(buf);
|
||||
}
|
||||
}
|
||||
|
||||
GetExitCodeProcess(pi.hProcess,&exit); //while the process is running
|
||||
if (exit != STILL_ACTIVE)
|
||||
break;
|
||||
|
||||
Sleep(100);
|
||||
}
|
||||
CloseHandle(pi.hThread);
|
||||
CloseHandle(pi.hProcess);
|
||||
CloseHandle(newstdout);
|
||||
CloseHandle(read_stdout);
|
||||
|
||||
|
||||
wsprintf(buf,"(source ZIP size was %d bytes)\r\n",g_zipfile_size);
|
||||
wnd_printf(buf);
|
||||
|
||||
PostMessage(g_hwnd,WM_USER+1203,0,0);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
char nsifilename[MAX_PATH];
|
||||
|
||||
|
||||
|
||||
void makeEXE(HWND hwndDlg)
|
||||
{
|
||||
char buf[2048];
|
||||
GetTempPath(MAX_PATH,buf);
|
||||
GetTempFileName(buf,"zne",0,nsifilename);
|
||||
FILE *fp=fopen(nsifilename,"w");
|
||||
if (!fp)
|
||||
{
|
||||
MessageBox(hwndDlg,"Error writing .NSI file",g_errcaption,MB_OK|MB_ICONSTOP);
|
||||
return;
|
||||
}
|
||||
GetDlgItemText(hwndDlg,IDC_INSTNAME,buf,sizeof(buf));
|
||||
fprintf(fp,"Name `%s`\n",buf);
|
||||
fprintf(fp,"Caption `%s Self Extractor`\n",buf);
|
||||
GetDlgItemText(hwndDlg,IDC_OUTFILE,buf,sizeof(buf));
|
||||
fprintf(fp,"OutFile `%s`\n",buf);
|
||||
GetDlgItemText(hwndDlg,IDC_INSTPATH,buf,sizeof(buf));
|
||||
char *outpath = "$INSTDIR";
|
||||
int iswinamp=0;
|
||||
char *iswinampmode=NULL;
|
||||
if (!strcmp(buf,gp_poi)) lstrcpy(buf,"$EXEDIR");
|
||||
|
||||
if (!strcmp(buf,gp_winamp))
|
||||
{
|
||||
iswinamp=1;
|
||||
fprintf(fp,"Function SetMyOutPath\n"
|
||||
" SetOutPath $INSTDIR\n"
|
||||
"FunctionEnd\n");
|
||||
}
|
||||
if (!strcmp(buf,gp_winamp_plugins))
|
||||
{
|
||||
iswinamp=1;
|
||||
fprintf(fp,"Function SetMyOutPath\n"
|
||||
" SetOutPath $INSTDIR\\Plugins\n"
|
||||
"FunctionEnd\n");
|
||||
}
|
||||
if (!strcmp(buf,gp_winamp_vis))
|
||||
{
|
||||
iswinamp=1;
|
||||
iswinampmode="VisDir";
|
||||
}
|
||||
if (!strcmp(buf,gp_winamp_dsp))
|
||||
{
|
||||
iswinamp=1;
|
||||
iswinampmode="DSPDir";
|
||||
}
|
||||
if (!strcmp(buf,gp_winamp_skins))
|
||||
{
|
||||
iswinamp=1;
|
||||
iswinampmode="SkinDir";
|
||||
}
|
||||
|
||||
if (iswinamp)
|
||||
{
|
||||
fprintf(fp,"InstallDir `$PROGRAMFILES\\Winamp`\n");
|
||||
fprintf(fp,"InstallDirRegKey HKEY_LOCAL_MACHINE `Software\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\Winamp` `UninstallString`\n");
|
||||
|
||||
fprintf(fp,"Function .onVerifyInstDir\n"
|
||||
" IfFileExists $INSTDIR\\winamp.exe WinampInstalled\n"
|
||||
" Abort\n"
|
||||
" WinampInstalled:\n"
|
||||
"FunctionEnd\n");
|
||||
|
||||
if (iswinampmode)
|
||||
{
|
||||
fprintf(fp,"Function SetMyOutPath\n"
|
||||
" StrCpy $1 $INSTDIR\\Plugins\n"
|
||||
" ReadINIStr $9 $INSTDIR\\winamp.ini Winamp %s\n"
|
||||
" StrCmp $9 '' End\n"
|
||||
" IfFileExists $9 0 End\n"
|
||||
" StrCpy $1 $9\n"
|
||||
" End:\n"
|
||||
" SetOutPath $1\n"
|
||||
"FunctionEnd\n",iswinampmode);
|
||||
}
|
||||
}
|
||||
else // set out path to $INSTDIR
|
||||
{
|
||||
fprintf(fp,"InstallDir `%s`\n",buf);
|
||||
fprintf(fp,"Function SetMyOutPath\n"
|
||||
" SetOutPath $INSTDIR\n"
|
||||
"FunctionEnd\n");
|
||||
}
|
||||
|
||||
GetDlgItemText(hwndDlg,IDC_DESCTEXT,buf,sizeof(buf));
|
||||
fprintf(fp,"DirText `%s`\n",buf);
|
||||
|
||||
fprintf(fp,"Section\n");
|
||||
fprintf(fp,"Call SetMyOutPath\n");
|
||||
fprintf(fp,"File /r `%s\\*.*`\n",tempzip_path);
|
||||
fprintf(fp,"SectionEnd\n");
|
||||
fclose(fp);
|
||||
|
||||
wsprintf(g_cmdline,"\"%s\" %s \"%s\"",g_makensis_path,g_options,nsifilename);
|
||||
|
||||
|
||||
DWORD id;
|
||||
g_hThread=CreateThread(NULL,0,ThreadProc,0,0,&id);
|
||||
|
||||
}
|
||||
|
||||
|
||||
BOOL CALLBACK DlgProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
|
||||
{
|
||||
static int ids[]={IDC_SZIPFRAME,IDC_BROWSE,IDC_ZIPFILE,IDC_ZIPINFO_SUMMARY,IDC_ZIPINFO_FILES,IDC_OFRAME,IDC_INAMEST,
|
||||
IDC_INSTNAME,IDC_DTEXTST,IDC_DESCTEXT,IDC_DEPST,IDC_INSTPATH,IDC_OEFST,IDC_OUTFILE,IDC_BROWSE2,IDC_BROWSE3,IDC_COMPILER};
|
||||
static HICON hIcon;
|
||||
static HFONT hFont;
|
||||
if (uMsg == WM_DESTROY) { if (hIcon) DeleteObject(hIcon); hIcon=0; if (hFont) DeleteObject(hFont); hFont=0; }
|
||||
switch (uMsg)
|
||||
{
|
||||
case WM_INITDIALOG:
|
||||
g_hwnd=hwndDlg;
|
||||
SendDlgItemMessage(hwndDlg,IDC_INSTPATH,CB_ADDSTRING,0,(LPARAM)gp_poi);
|
||||
SendDlgItemMessage(hwndDlg,IDC_INSTPATH,CB_ADDSTRING,0,(LPARAM)"$TEMP");
|
||||
SendDlgItemMessage(hwndDlg,IDC_INSTPATH,CB_ADDSTRING,0,(LPARAM)"$SYSDIR");
|
||||
SendDlgItemMessage(hwndDlg,IDC_INSTPATH,CB_ADDSTRING,0,(LPARAM)"$WINDIR");
|
||||
SendDlgItemMessage(hwndDlg,IDC_INSTPATH,CB_ADDSTRING,0,(LPARAM)"$DESKTOP");
|
||||
SendDlgItemMessage(hwndDlg,IDC_INSTPATH,CB_ADDSTRING,0,(LPARAM)"$DESKTOP\\Poop");
|
||||
SendDlgItemMessage(hwndDlg,IDC_INSTPATH,CB_ADDSTRING,0,(LPARAM)"$PROGRAMFILES\\Poop");
|
||||
SendDlgItemMessage(hwndDlg,IDC_INSTPATH,CB_ADDSTRING,0,(LPARAM)"$STARTMENU");
|
||||
SendDlgItemMessage(hwndDlg,IDC_INSTPATH,CB_ADDSTRING,0,(LPARAM)"$SMPROGRAMS");
|
||||
|
||||
SendDlgItemMessage(hwndDlg,IDC_INSTPATH,CB_ADDSTRING,0,(LPARAM)gp_winamp);
|
||||
SendDlgItemMessage(hwndDlg,IDC_INSTPATH,CB_ADDSTRING,0,(LPARAM)gp_winamp_plugins);
|
||||
SendDlgItemMessage(hwndDlg,IDC_INSTPATH,CB_ADDSTRING,0,(LPARAM)gp_winamp_vis);
|
||||
SendDlgItemMessage(hwndDlg,IDC_INSTPATH,CB_ADDSTRING,0,(LPARAM)gp_winamp_dsp);
|
||||
SendDlgItemMessage(hwndDlg,IDC_INSTPATH,CB_ADDSTRING,0,(LPARAM)gp_winamp_skins);
|
||||
|
||||
SetDlgItemText(hwndDlg,IDC_INSTPATH,gp_poi);
|
||||
SetDlgItemText(hwndDlg,IDC_DESCTEXT,"Select the folder where you would like to extract the files to:");
|
||||
hIcon=LoadIcon(g_hInstance,MAKEINTRESOURCE(IDI_ICON1));
|
||||
SetClassLong(hwndDlg,GCL_HICON,(long)hIcon);
|
||||
|
||||
hFont=CreateFont(15,0,0,0,FW_NORMAL,0,0,0,DEFAULT_CHARSET,
|
||||
OUT_CHARACTER_PRECIS,
|
||||
CLIP_DEFAULT_PRECIS,
|
||||
DEFAULT_QUALITY,FIXED_PITCH|FF_DONTCARE,"Courier New");
|
||||
SendDlgItemMessage(hwndDlg,IDC_OUTPUTTEXT,WM_SETFONT,(WPARAM)hFont,0);
|
||||
{
|
||||
char *p=g_makensis_path;
|
||||
GetModuleFileName(g_hInstance,g_makensis_path,sizeof(g_makensis_path));
|
||||
while (*p) p++;
|
||||
while (p >= g_makensis_path && *p != '\\') p--;
|
||||
strcpy(++p,"makensis.exe");
|
||||
}
|
||||
SetDlgItemText(hwndDlg,IDC_COMPILER,g_makensis_path);
|
||||
return 1;
|
||||
case WM_CLOSE:
|
||||
if (!g_hThread)
|
||||
{
|
||||
tempzip_cleanup(hwndDlg,0);
|
||||
EndDialog(hwndDlg,1);
|
||||
}
|
||||
break;
|
||||
case WM_USER+1203:
|
||||
|
||||
if (g_hThread)
|
||||
{
|
||||
if (!lParam)
|
||||
{
|
||||
ShowWindow(GetDlgItem(hwndDlg,IDC_TEST),SW_SHOWNA);
|
||||
}
|
||||
made=1;
|
||||
ShowWindow(GetDlgItem(hwndDlg,IDC_BACK),SW_SHOWNA);
|
||||
EnableWindow(GetDlgItem(hwndDlg,IDOK),1);
|
||||
CloseHandle(g_hThread);
|
||||
g_hThread=0;
|
||||
if (nsifilename[0]) DeleteFile(nsifilename);
|
||||
nsifilename[0]=0;
|
||||
}
|
||||
break;
|
||||
case WM_COMMAND:
|
||||
switch (LOWORD(wParam))
|
||||
{
|
||||
case IDC_BROWSE:
|
||||
if (!g_extracting) {
|
||||
OPENFILENAME l={sizeof(l),};
|
||||
char buf[1024];
|
||||
l.hwndOwner = hwndDlg;
|
||||
l.lpstrFilter = "ZIP files\0*.zip\0All files\0*.*\0";
|
||||
l.lpstrFile = buf;
|
||||
l.nMaxFile = 1023;
|
||||
l.lpstrTitle = "Open ZIP file";
|
||||
l.lpstrDefExt = "zip";
|
||||
l.lpstrInitialDir = NULL;
|
||||
l.Flags = OFN_HIDEREADONLY|OFN_EXPLORER|OFN_PATHMUSTEXIST;
|
||||
buf[0]=0;
|
||||
if (GetOpenFileName(&l))
|
||||
{
|
||||
char buf2[1024];
|
||||
lstrcpy(buf2,buf);
|
||||
tempzip_cleanup(hwndDlg,1);
|
||||
SetDlgItemText(hwndDlg,IDC_ZIPFILE,buf);
|
||||
char *t=buf+strlen(buf);
|
||||
while (t > buf && *t != '\\' && *t != '.') t--;
|
||||
{
|
||||
char *p=t;
|
||||
while (p >= buf && *p != '\\') p--;
|
||||
p++;
|
||||
*t=0;
|
||||
SetDlgItemText(hwndDlg,IDC_INSTNAME,p[0]?p:"Stuff");
|
||||
}
|
||||
strcpy(t,".exe");
|
||||
SetDlgItemText(hwndDlg,IDC_OUTFILE,buf);
|
||||
if (tempzip_make(hwndDlg,buf2)) tempzip_cleanup(hwndDlg,1);
|
||||
else
|
||||
{
|
||||
EnableWindow(GetDlgItem(hwndDlg,IDOK),1);
|
||||
}
|
||||
}
|
||||
}
|
||||
break;
|
||||
case IDC_BROWSE2:
|
||||
{
|
||||
OPENFILENAME l={sizeof(l),};
|
||||
char buf[1024];
|
||||
l.hwndOwner = hwndDlg;
|
||||
l.lpstrFilter = "EXE files\0*.exe\0All files\0*.*\0";
|
||||
l.lpstrFile = buf;
|
||||
l.nMaxFile = 1023;
|
||||
l.lpstrTitle = "Select output EXE file";
|
||||
l.lpstrDefExt = "exe";
|
||||
l.lpstrInitialDir = NULL;
|
||||
l.Flags = OFN_HIDEREADONLY|OFN_EXPLORER;
|
||||
GetDlgItemText(hwndDlg,IDC_OUTFILE,buf,sizeof(buf));
|
||||
if (GetSaveFileName(&l))
|
||||
{
|
||||
SetDlgItemText(hwndDlg,IDC_OUTFILE,buf);
|
||||
}
|
||||
}
|
||||
break;
|
||||
case IDC_BROWSE3:
|
||||
{
|
||||
OPENFILENAME l={sizeof(l),};
|
||||
char buf[1024];
|
||||
l.hwndOwner = hwndDlg;
|
||||
l.lpstrFilter = "Makensis EXE files (Makensis*.exe)\0Makensis*.exe\0All files\0*.*\0";
|
||||
l.lpstrFile = buf;
|
||||
l.nMaxFile = 1023;
|
||||
l.lpstrTitle = "Select compiler EXE file";
|
||||
l.lpstrDefExt = "exe";
|
||||
l.lpstrInitialDir = NULL;
|
||||
l.Flags = OFN_HIDEREADONLY|OFN_EXPLORER|OFN_PATHMUSTEXIST;
|
||||
GetDlgItemText(hwndDlg,IDC_COMPILER,buf,sizeof(buf));
|
||||
if (GetOpenFileName(&l))
|
||||
{
|
||||
SetDlgItemText(hwndDlg,IDC_COMPILER,buf);
|
||||
}
|
||||
}
|
||||
break;
|
||||
case IDC_BACK:
|
||||
if (!g_hThread)
|
||||
{
|
||||
made=0;
|
||||
ShowWindow(GetDlgItem(hwndDlg,IDC_BACK),SW_HIDE);
|
||||
ShowWindow(GetDlgItem(hwndDlg,IDC_TEST),SW_HIDE);
|
||||
ShowWindow(GetDlgItem(hwndDlg,IDC_OUTPUTTEXT),SW_HIDE);
|
||||
{
|
||||
int x;
|
||||
for (x = 0; x < sizeof(ids)/sizeof(ids[0]); x ++)
|
||||
ShowWindow(GetDlgItem(hwndDlg,ids[x]),SW_SHOWNA);
|
||||
SetDlgItemText(hwndDlg,IDOK,"Convert");
|
||||
EnableWindow(GetDlgItem(hwndDlg,IDOK),1);
|
||||
}
|
||||
}
|
||||
break;
|
||||
case IDC_TEST:
|
||||
if (!g_hThread) {
|
||||
char buf[1024];
|
||||
GetDlgItemText(hwndDlg,IDC_OUTFILE,buf,sizeof(buf));
|
||||
ShellExecute(hwndDlg,"open",buf,"","",SW_SHOW);
|
||||
}
|
||||
break;
|
||||
case IDOK:
|
||||
if (!g_hThread)
|
||||
{
|
||||
if (!made)
|
||||
{
|
||||
GetDlgItemText(hwndDlg,IDC_COMPILER,g_makensis_path,sizeof(g_makensis_path));
|
||||
SetDlgItemText(g_hwnd, IDC_OUTPUTTEXT, "");
|
||||
int x;
|
||||
for (x = 0; x < sizeof(ids)/sizeof(ids[0]); x ++)
|
||||
ShowWindow(GetDlgItem(hwndDlg,ids[x]),SW_HIDE);
|
||||
ShowWindow(GetDlgItem(hwndDlg,IDC_OUTPUTTEXT),SW_SHOWNA);
|
||||
SetDlgItemText(hwndDlg,IDOK,"Close");
|
||||
EnableWindow(GetDlgItem(hwndDlg,IDOK),0);
|
||||
|
||||
makeEXE(hwndDlg);
|
||||
}
|
||||
else
|
||||
{
|
||||
tempzip_cleanup(hwndDlg,0);
|
||||
EndDialog(hwndDlg,0);
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
break;
|
||||
}
|
||||
return 0;
|
||||
}
|
132
Contrib/zip2exe/res.rc
Normal file
|
@ -0,0 +1,132 @@
|
|||
//Microsoft Developer Studio generated resource script.
|
||||
//
|
||||
#include "resource.h"
|
||||
|
||||
#define APSTUDIO_READONLY_SYMBOLS
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// Generated from the TEXTINCLUDE 2 resource.
|
||||
//
|
||||
#include "afxres.h"
|
||||
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
#undef APSTUDIO_READONLY_SYMBOLS
|
||||
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
// English (U.S.) resources
|
||||
|
||||
#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU)
|
||||
#ifdef _WIN32
|
||||
LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US
|
||||
#pragma code_page(1252)
|
||||
#endif //_WIN32
|
||||
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// Dialog
|
||||
//
|
||||
|
||||
IDD_DIALOG1 DIALOG DISCARDABLE 0, 0, 361, 234
|
||||
STYLE DS_CENTER | WS_POPUP | WS_CAPTION | WS_SYSMENU
|
||||
CAPTION "Nullsoft ZIP2EXE v0.16"
|
||||
FONT 8, "MS Sans Serif"
|
||||
BEGIN
|
||||
PUSHBUTTON "Open &ZIP",IDC_BROWSE,13,17,49,14
|
||||
EDITTEXT IDC_ZIPFILE,66,18,284,12,ES_AUTOHSCROLL | ES_READONLY |
|
||||
NOT WS_TABSTOP
|
||||
LISTBOX IDC_ZIPINFO_FILES,13,45,335,56,LBS_NOINTEGRALHEIGHT |
|
||||
LBS_NOSEL | WS_VSCROLL
|
||||
EDITTEXT IDC_INSTNAME,81,113,267,12,ES_AUTOHSCROLL
|
||||
EDITTEXT IDC_DESCTEXT,81,129,267,12,ES_AUTOHSCROLL
|
||||
COMBOBOX IDC_INSTPATH,81,144,268,126,CBS_DROPDOWN | WS_VSCROLL |
|
||||
WS_TABSTOP
|
||||
EDITTEXT IDC_OUTFILE,13,169,292,12,ES_AUTOHSCROLL
|
||||
PUSHBUTTON "Browse",IDC_BROWSE2,307,168,41,14
|
||||
DEFPUSHBUTTON "Convert",IDOK,304,213,50,14,WS_DISABLED
|
||||
GROUPBOX "Source ZIP file",IDC_SZIPFRAME,7,7,347,180
|
||||
LTEXT "",IDC_ZIPINFO_SUMMARY,13,33,245,8
|
||||
GROUPBOX "Output",IDC_OFRAME,7,102,347,85
|
||||
LTEXT "Default extract path:",IDC_DEPST,13,145,66,8
|
||||
LTEXT "Description text:",IDC_DTEXTST,13,131,66,8
|
||||
LTEXT "Output EXE file:",IDC_OEFST,14,157,51,8
|
||||
LTEXT "Installer name",IDC_INAMEST,13,116,66,8
|
||||
PUSHBUTTON "Test",IDC_TEST,251,213,50,14,NOT WS_VISIBLE
|
||||
PUSHBUTTON "< Back",IDC_BACK,7,213,50,14,NOT WS_VISIBLE
|
||||
CONTROL "",IDC_STATIC,"Static",SS_ETCHEDHORZ,7,210,347,1
|
||||
PUSHBUTTON "Change Compiler",IDC_BROWSE3,7,190,62,14
|
||||
EDITTEXT IDC_COMPILER,74,191,280,12,ES_AUTOHSCROLL | ES_READONLY |
|
||||
NOT WS_TABSTOP
|
||||
EDITTEXT IDC_OUTPUTTEXT,7,7,347,202,ES_MULTILINE | ES_AUTOVSCROLL |
|
||||
ES_AUTOHSCROLL | ES_READONLY | NOT WS_VISIBLE |
|
||||
WS_VSCROLL | WS_HSCROLL
|
||||
END
|
||||
|
||||
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// DESIGNINFO
|
||||
//
|
||||
|
||||
#ifdef APSTUDIO_INVOKED
|
||||
GUIDELINES DESIGNINFO DISCARDABLE
|
||||
BEGIN
|
||||
IDD_DIALOG1, DIALOG
|
||||
BEGIN
|
||||
LEFTMARGIN, 7
|
||||
RIGHTMARGIN, 354
|
||||
TOPMARGIN, 7
|
||||
BOTTOMMARGIN, 227
|
||||
END
|
||||
END
|
||||
#endif // APSTUDIO_INVOKED
|
||||
|
||||
|
||||
#ifdef APSTUDIO_INVOKED
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// TEXTINCLUDE
|
||||
//
|
||||
|
||||
1 TEXTINCLUDE DISCARDABLE
|
||||
BEGIN
|
||||
"resource.h\0"
|
||||
END
|
||||
|
||||
2 TEXTINCLUDE DISCARDABLE
|
||||
BEGIN
|
||||
"#include ""afxres.h""\r\n"
|
||||
"\0"
|
||||
END
|
||||
|
||||
3 TEXTINCLUDE DISCARDABLE
|
||||
BEGIN
|
||||
"\r\n"
|
||||
"\0"
|
||||
END
|
||||
|
||||
#endif // APSTUDIO_INVOKED
|
||||
|
||||
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// Icon
|
||||
//
|
||||
|
||||
// Icon with lowest ID value placed first to ensure application icon
|
||||
// remains consistent on all systems.
|
||||
IDI_ICON1 ICON DISCARDABLE "icon.ico"
|
||||
#endif // English (U.S.) resources
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
|
||||
|
||||
#ifndef APSTUDIO_INVOKED
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// Generated from the TEXTINCLUDE 3 resource.
|
||||
//
|
||||
|
||||
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
#endif // not APSTUDIO_INVOKED
|
||||
|
37
Contrib/zip2exe/resource.h
Normal file
|
@ -0,0 +1,37 @@
|
|||
//{{NO_DEPENDENCIES}}
|
||||
// Microsoft Developer Studio generated include file.
|
||||
// Used by res.rc
|
||||
//
|
||||
#define IDD_DIALOG1 101
|
||||
#define IDI_ICON1 102
|
||||
#define IDC_ZIPFILE 1000
|
||||
#define IDC_BROWSE 1001
|
||||
#define IDC_ZIPINFO_SUMMARY 1002
|
||||
#define IDC_BROWSE3 1003
|
||||
#define IDC_ZIPINFO_FILES 1004
|
||||
#define IDC_INSTPATH 1005
|
||||
#define IDC_DESCTEXT 1006
|
||||
#define IDC_OUTFILE 1007
|
||||
#define IDC_BROWSE2 1008
|
||||
#define IDC_INSTNAME 1009
|
||||
#define IDC_SZIPFRAME 1010
|
||||
#define IDC_OFRAME 1011
|
||||
#define IDC_INAMEST 1012
|
||||
#define IDC_DTEXTST 1013
|
||||
#define IDC_DEPST 1014
|
||||
#define IDC_OEFST 1015
|
||||
#define IDC_OUTPUTTEXT 1016
|
||||
#define IDC_TEST 1017
|
||||
#define IDC_BACK 1018
|
||||
#define IDC_COMPILER 1019
|
||||
|
||||
// Next default values for new objects
|
||||
//
|
||||
#ifdef APSTUDIO_INVOKED
|
||||
#ifndef APSTUDIO_READONLY_SYMBOLS
|
||||
#define _APS_NEXT_RESOURCE_VALUE 103
|
||||
#define _APS_NEXT_COMMAND_VALUE 40001
|
||||
#define _APS_NEXT_CONTROL_VALUE 1020
|
||||
#define _APS_NEXT_SYMED_VALUE 101
|
||||
#endif
|
||||
#endif
|
160
Contrib/zip2exe/zip2exe.dsp
Normal file
|
@ -0,0 +1,160 @@
|
|||
# Microsoft Developer Studio Project File - Name="zip2exe" - Package Owner=<4>
|
||||
# Microsoft Developer Studio Generated Build File, Format Version 6.00
|
||||
# ** DO NOT EDIT **
|
||||
|
||||
# TARGTYPE "Win32 (x86) Application" 0x0101
|
||||
|
||||
CFG=zip2exe - 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 "zip2exe.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 "zip2exe.mak" CFG="zip2exe - Win32 Debug"
|
||||
!MESSAGE
|
||||
!MESSAGE Possible choices for configuration are:
|
||||
!MESSAGE
|
||||
!MESSAGE "zip2exe - Win32 Release" (based on "Win32 (x86) Application")
|
||||
!MESSAGE "zip2exe - Win32 Debug" (based on "Win32 (x86) Application")
|
||||
!MESSAGE
|
||||
|
||||
# Begin Project
|
||||
# PROP AllowPerConfigDependencies 0
|
||||
# PROP Scc_ProjName ""
|
||||
# PROP Scc_LocalPath ""
|
||||
CPP=cl.exe
|
||||
MTL=midl.exe
|
||||
RSC=rc.exe
|
||||
|
||||
!IF "$(CFG)" == "zip2exe - 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 /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /YX /FD /c
|
||||
# ADD CPP /nologo /W3 /GX- /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /FD /c
|
||||
# SUBTRACT CPP /YX
|
||||
# ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /win32
|
||||
# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /win32
|
||||
# ADD BASE RSC /l 0x409 /d "NDEBUG"
|
||||
# ADD RSC /l 0x409 /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 /subsystem:windows /machine:I386
|
||||
# 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 /subsystem:windows /machine:I386 /out:"../../zip2exe.exe" /opt:nowin98
|
||||
# SUBTRACT LINK32 /pdb:none
|
||||
|
||||
!ELSEIF "$(CFG)" == "zip2exe - 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 /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /YX /FD /GZ /c
|
||||
# ADD CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /YX /FD /GZ /c
|
||||
# ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /win32
|
||||
# ADD MTL /nologo /D "_DEBUG" /mktyplib203 /win32
|
||||
# ADD BASE RSC /l 0x409 /d "_DEBUG"
|
||||
# ADD RSC /l 0x409 /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 /subsystem:windows /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 /subsystem:windows /debug /machine:I386 /pdbtype:sept
|
||||
|
||||
!ENDIF
|
||||
|
||||
# Begin Target
|
||||
|
||||
# Name "zip2exe - Win32 Release"
|
||||
# Name "zip2exe - Win32 Debug"
|
||||
# Begin Group "Source Files"
|
||||
|
||||
# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat"
|
||||
# Begin Group "zlib"
|
||||
|
||||
# PROP Default_Filter ""
|
||||
# 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\Infblock.c
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=.\zlib\Infcodes.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=.\zlib\Infutil.c
|
||||
# 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 Source File
|
||||
|
||||
SOURCE=.\main.cpp
|
||||
# End Source File
|
||||
# End Group
|
||||
# Begin Group "Header Files"
|
||||
|
||||
# PROP Default_Filter "h;hpp;hxx;hm;inl"
|
||||
# End Group
|
||||
# Begin Group "Resource Files"
|
||||
|
||||
# PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe"
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=.\icon.ico
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=.\res.rc
|
||||
# End Source File
|
||||
# End Group
|
||||
# End Target
|
||||
# End Project
|
29
Contrib/zip2exe/zip2exe.dsw
Normal file
|
@ -0,0 +1,29 @@
|
|||
Microsoft Developer Studio Workspace File, Format Version 6.00
|
||||
# WARNING: DO NOT EDIT OR DELETE THIS WORKSPACE FILE!
|
||||
|
||||
###############################################################################
|
||||
|
||||
Project: "zip2exe"=.\zip2exe.dsp - Package Owner=<4>
|
||||
|
||||
Package=<5>
|
||||
{{{
|
||||
}}}
|
||||
|
||||
Package=<4>
|
||||
{{{
|
||||
}}}
|
||||
|
||||
###############################################################################
|
||||
|
||||
Global:
|
||||
|
||||
Package=<5>
|
||||
{{{
|
||||
}}}
|
||||
|
||||
Package=<3>
|
||||
{{{
|
||||
}}}
|
||||
|
||||
###############################################################################
|
||||
|
48
Contrib/zip2exe/zlib/ADLER32.C
Normal file
|
@ -0,0 +1,48 @@
|
|||
/* adler32.c -- compute the Adler-32 checksum of a data stream
|
||||
* Copyright (C) 1995-1998 Mark Adler
|
||||
* For conditions of distribution and use, see copyright notice in zlib.h
|
||||
*/
|
||||
|
||||
/* @(#) $Id$ */
|
||||
|
||||
#include "zlib.h"
|
||||
|
||||
#define BASE 65521L /* 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);
|
||||
|
||||
/* ========================================================================= */
|
||||
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 ? len : NMAX;
|
||||
len -= k;
|
||||
while (k >= 16) {
|
||||
DO16(buf);
|
||||
buf += 16;
|
||||
k -= 16;
|
||||
}
|
||||
if (k != 0) do {
|
||||
s1 += *buf++;
|
||||
s2 += s1;
|
||||
} while (--k);
|
||||
s1 %= BASE;
|
||||
s2 %= BASE;
|
||||
}
|
||||
return (s2 << 16) | s1;
|
||||
}
|
162
Contrib/zip2exe/zlib/CRC32.C
Normal file
|
@ -0,0 +1,162 @@
|
|||
/* crc32.c -- compute the CRC-32 of a data stream
|
||||
* Copyright (C) 1995-1998 Mark Adler
|
||||
* For conditions of distribution and use, see copyright notice in zlib.h
|
||||
*/
|
||||
|
||||
/* @(#) $Id$ */
|
||||
|
||||
#include "zlib.h"
|
||||
|
||||
#define local static
|
||||
|
||||
#ifdef DYNAMIC_CRC_TABLE
|
||||
|
||||
local int crc_table_empty = 1;
|
||||
local uLongf crc_table[256];
|
||||
local void make_crc_table OF((void));
|
||||
|
||||
/*
|
||||
Generate a table 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 table is simply the CRC of all possible eight bit values. This is all
|
||||
the information needed to generate CRC's on data a byte at a time for all
|
||||
combinations of CRC register values and incoming bytes.
|
||||
*/
|
||||
local void make_crc_table()
|
||||
{
|
||||
uLong c;
|
||||
int n, k;
|
||||
uLong poly; /* polynomial exclusive-or pattern */
|
||||
/* terms of polynomial defining this crc (except x^32): */
|
||||
static const Byte p[] = {0,1,2,4,5,7,8,10,11,12,16,22,23,26};
|
||||
|
||||
/* make exclusive-or pattern from polynomial (0xedb88320L) */
|
||||
poly = 0L;
|
||||
for (n = 0; n < sizeof(p)/sizeof(Byte); n++)
|
||||
poly |= 1L << (31 - p[n]);
|
||||
|
||||
for (n = 0; n < 256; n++)
|
||||
{
|
||||
c = (uLong)n;
|
||||
for (k = 0; k < 8; k++)
|
||||
c = c & 1 ? poly ^ (c >> 1) : c >> 1;
|
||||
crc_table[n] = c;
|
||||
}
|
||||
crc_table_empty = 0;
|
||||
}
|
||||
#else
|
||||
/* ========================================================================
|
||||
* Table of CRC-32's of all single-byte values (made by make_crc_table)
|
||||
*/
|
||||
local const uLongf crc_table[256] = {
|
||||
0x00000000L, 0x77073096L, 0xee0e612cL, 0x990951baL, 0x076dc419L,
|
||||
0x706af48fL, 0xe963a535L, 0x9e6495a3L, 0x0edb8832L, 0x79dcb8a4L,
|
||||
0xe0d5e91eL, 0x97d2d988L, 0x09b64c2bL, 0x7eb17cbdL, 0xe7b82d07L,
|
||||
0x90bf1d91L, 0x1db71064L, 0x6ab020f2L, 0xf3b97148L, 0x84be41deL,
|
||||
0x1adad47dL, 0x6ddde4ebL, 0xf4d4b551L, 0x83d385c7L, 0x136c9856L,
|
||||
0x646ba8c0L, 0xfd62f97aL, 0x8a65c9ecL, 0x14015c4fL, 0x63066cd9L,
|
||||
0xfa0f3d63L, 0x8d080df5L, 0x3b6e20c8L, 0x4c69105eL, 0xd56041e4L,
|
||||
0xa2677172L, 0x3c03e4d1L, 0x4b04d447L, 0xd20d85fdL, 0xa50ab56bL,
|
||||
0x35b5a8faL, 0x42b2986cL, 0xdbbbc9d6L, 0xacbcf940L, 0x32d86ce3L,
|
||||
0x45df5c75L, 0xdcd60dcfL, 0xabd13d59L, 0x26d930acL, 0x51de003aL,
|
||||
0xc8d75180L, 0xbfd06116L, 0x21b4f4b5L, 0x56b3c423L, 0xcfba9599L,
|
||||
0xb8bda50fL, 0x2802b89eL, 0x5f058808L, 0xc60cd9b2L, 0xb10be924L,
|
||||
0x2f6f7c87L, 0x58684c11L, 0xc1611dabL, 0xb6662d3dL, 0x76dc4190L,
|
||||
0x01db7106L, 0x98d220bcL, 0xefd5102aL, 0x71b18589L, 0x06b6b51fL,
|
||||
0x9fbfe4a5L, 0xe8b8d433L, 0x7807c9a2L, 0x0f00f934L, 0x9609a88eL,
|
||||
0xe10e9818L, 0x7f6a0dbbL, 0x086d3d2dL, 0x91646c97L, 0xe6635c01L,
|
||||
0x6b6b51f4L, 0x1c6c6162L, 0x856530d8L, 0xf262004eL, 0x6c0695edL,
|
||||
0x1b01a57bL, 0x8208f4c1L, 0xf50fc457L, 0x65b0d9c6L, 0x12b7e950L,
|
||||
0x8bbeb8eaL, 0xfcb9887cL, 0x62dd1ddfL, 0x15da2d49L, 0x8cd37cf3L,
|
||||
0xfbd44c65L, 0x4db26158L, 0x3ab551ceL, 0xa3bc0074L, 0xd4bb30e2L,
|
||||
0x4adfa541L, 0x3dd895d7L, 0xa4d1c46dL, 0xd3d6f4fbL, 0x4369e96aL,
|
||||
0x346ed9fcL, 0xad678846L, 0xda60b8d0L, 0x44042d73L, 0x33031de5L,
|
||||
0xaa0a4c5fL, 0xdd0d7cc9L, 0x5005713cL, 0x270241aaL, 0xbe0b1010L,
|
||||
0xc90c2086L, 0x5768b525L, 0x206f85b3L, 0xb966d409L, 0xce61e49fL,
|
||||
0x5edef90eL, 0x29d9c998L, 0xb0d09822L, 0xc7d7a8b4L, 0x59b33d17L,
|
||||
0x2eb40d81L, 0xb7bd5c3bL, 0xc0ba6cadL, 0xedb88320L, 0x9abfb3b6L,
|
||||
0x03b6e20cL, 0x74b1d29aL, 0xead54739L, 0x9dd277afL, 0x04db2615L,
|
||||
0x73dc1683L, 0xe3630b12L, 0x94643b84L, 0x0d6d6a3eL, 0x7a6a5aa8L,
|
||||
0xe40ecf0bL, 0x9309ff9dL, 0x0a00ae27L, 0x7d079eb1L, 0xf00f9344L,
|
||||
0x8708a3d2L, 0x1e01f268L, 0x6906c2feL, 0xf762575dL, 0x806567cbL,
|
||||
0x196c3671L, 0x6e6b06e7L, 0xfed41b76L, 0x89d32be0L, 0x10da7a5aL,
|
||||
0x67dd4accL, 0xf9b9df6fL, 0x8ebeeff9L, 0x17b7be43L, 0x60b08ed5L,
|
||||
0xd6d6a3e8L, 0xa1d1937eL, 0x38d8c2c4L, 0x4fdff252L, 0xd1bb67f1L,
|
||||
0xa6bc5767L, 0x3fb506ddL, 0x48b2364bL, 0xd80d2bdaL, 0xaf0a1b4cL,
|
||||
0x36034af6L, 0x41047a60L, 0xdf60efc3L, 0xa867df55L, 0x316e8eefL,
|
||||
0x4669be79L, 0xcb61b38cL, 0xbc66831aL, 0x256fd2a0L, 0x5268e236L,
|
||||
0xcc0c7795L, 0xbb0b4703L, 0x220216b9L, 0x5505262fL, 0xc5ba3bbeL,
|
||||
0xb2bd0b28L, 0x2bb45a92L, 0x5cb36a04L, 0xc2d7ffa7L, 0xb5d0cf31L,
|
||||
0x2cd99e8bL, 0x5bdeae1dL, 0x9b64c2b0L, 0xec63f226L, 0x756aa39cL,
|
||||
0x026d930aL, 0x9c0906a9L, 0xeb0e363fL, 0x72076785L, 0x05005713L,
|
||||
0x95bf4a82L, 0xe2b87a14L, 0x7bb12baeL, 0x0cb61b38L, 0x92d28e9bL,
|
||||
0xe5d5be0dL, 0x7cdcefb7L, 0x0bdbdf21L, 0x86d3d2d4L, 0xf1d4e242L,
|
||||
0x68ddb3f8L, 0x1fda836eL, 0x81be16cdL, 0xf6b9265bL, 0x6fb077e1L,
|
||||
0x18b74777L, 0x88085ae6L, 0xff0f6a70L, 0x66063bcaL, 0x11010b5cL,
|
||||
0x8f659effL, 0xf862ae69L, 0x616bffd3L, 0x166ccf45L, 0xa00ae278L,
|
||||
0xd70dd2eeL, 0x4e048354L, 0x3903b3c2L, 0xa7672661L, 0xd06016f7L,
|
||||
0x4969474dL, 0x3e6e77dbL, 0xaed16a4aL, 0xd9d65adcL, 0x40df0b66L,
|
||||
0x37d83bf0L, 0xa9bcae53L, 0xdebb9ec5L, 0x47b2cf7fL, 0x30b5ffe9L,
|
||||
0xbdbdf21cL, 0xcabac28aL, 0x53b39330L, 0x24b4a3a6L, 0xbad03605L,
|
||||
0xcdd70693L, 0x54de5729L, 0x23d967bfL, 0xb3667a2eL, 0xc4614ab8L,
|
||||
0x5d681b02L, 0x2a6f2b94L, 0xb40bbe37L, 0xc30c8ea1L, 0x5a05df1bL,
|
||||
0x2d02ef8dL
|
||||
};
|
||||
#endif
|
||||
|
||||
/* =========================================================================
|
||||
* This function can be used by asm versions of crc32()
|
||||
*/
|
||||
const uLongf * ZEXPORT get_crc_table()
|
||||
{
|
||||
#ifdef DYNAMIC_CRC_TABLE
|
||||
if (crc_table_empty) make_crc_table();
|
||||
#endif
|
||||
return (const uLongf *)crc_table;
|
||||
}
|
||||
|
||||
/* ========================================================================= */
|
||||
#define DO1(buf) crc = crc_table[((int)crc ^ (*buf++)) & 0xff] ^ (crc >> 8);
|
||||
#define DO2(buf) DO1(buf); DO1(buf);
|
||||
#define DO4(buf) DO2(buf); DO2(buf);
|
||||
#define DO8(buf) DO4(buf); DO4(buf);
|
||||
|
||||
/* ========================================================================= */
|
||||
uLong ZEXPORT crc32(crc, buf, len)
|
||||
uLong crc;
|
||||
const Bytef *buf;
|
||||
uInt len;
|
||||
{
|
||||
if (buf == Z_NULL) return 0L;
|
||||
#ifdef DYNAMIC_CRC_TABLE
|
||||
if (crc_table_empty)
|
||||
make_crc_table();
|
||||
#endif
|
||||
crc = crc ^ 0xffffffffL;
|
||||
while (len >= 8)
|
||||
{
|
||||
DO8(buf);
|
||||
len -= 8;
|
||||
}
|
||||
if (len) do {
|
||||
DO1(buf);
|
||||
} while (--len);
|
||||
return crc ^ 0xffffffffL;
|
||||
}
|
398
Contrib/zip2exe/zlib/INFBLOCK.C
Normal file
|
@ -0,0 +1,398 @@
|
|||
/* infblock.c -- interpret and process block types to last block
|
||||
* Copyright (C) 1995-1998 Mark Adler
|
||||
* For conditions of distribution and use, see copyright notice in zlib.h
|
||||
*/
|
||||
|
||||
#include "zutil.h"
|
||||
#include "infblock.h"
|
||||
#include "inftrees.h"
|
||||
#include "infcodes.h"
|
||||
#include "infutil.h"
|
||||
|
||||
struct inflate_codes_state {int dummy;}; /* for buggy compilers */
|
||||
|
||||
/* simplify the use of the inflate_huft type with some defines */
|
||||
#define exop word.what.Exop
|
||||
#define bits word.what.Bits
|
||||
|
||||
/* Table for deflate from PKZIP's appnote.txt. */
|
||||
local const uInt border[] = { /* Order of the bit length code lengths */
|
||||
16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15};
|
||||
|
||||
/*
|
||||
Notes beyond the 1.93a appnote.txt:
|
||||
|
||||
1. Distance pointers never point before the beginning of the output
|
||||
stream.
|
||||
2. Distance pointers can point back across blocks, up to 32k away.
|
||||
3. There is an implied maximum of 7 bits for the bit length table and
|
||||
15 bits for the actual data.
|
||||
4. If only one code exists, then it is encoded using one bit. (Zero
|
||||
would be more efficient, but perhaps a little confusing.) If two
|
||||
codes exist, they are coded using one bit each (0 and 1).
|
||||
5. There is no way of sending zero distance codes--a dummy must be
|
||||
sent if there are none. (History: a pre 2.0 version of PKZIP would
|
||||
store blocks with no distance codes, but this was discovered to be
|
||||
too harsh a criterion.) Valid only for 1.93a. 2.04c does allow
|
||||
zero distance codes, which is sent as one code of zero bits in
|
||||
length.
|
||||
6. There are up to 286 literal/length codes. Code 256 represents the
|
||||
end-of-block. Note however that the static length tree defines
|
||||
288 codes just to fill out the Huffman codes. Codes 286 and 287
|
||||
cannot be used though, since there is no length base or extra bits
|
||||
defined for them. Similarily, there are up to 30 distance codes.
|
||||
However, static trees define 32 codes (all 5 bits) to fill out the
|
||||
Huffman codes, but the last two had better not show up in the data.
|
||||
7. Unzip can check dynamic Huffman blocks for complete code sets.
|
||||
The exception is that a single code would not be complete (see #4).
|
||||
8. The five bits following the block type is really the number of
|
||||
literal codes sent minus 257.
|
||||
9. Length codes 8,16,16 are interpreted as 13 length codes of 8 bits
|
||||
(1+6+6). Therefore, to output three times the length, you output
|
||||
three codes (1+1+1), whereas to output four times the same length,
|
||||
you only need two codes (1+3). Hmm.
|
||||
10. In the tree reconstruction algorithm, Code = Code + Increment
|
||||
only if BitLength(i) is not zero. (Pretty obvious.)
|
||||
11. Correction: 4 Bits: # of Bit Length codes - 4 (4 - 19)
|
||||
12. Note: length code 284 can represent 227-258, but length code 285
|
||||
really is 258. The last length deserves its own, short code
|
||||
since it gets used a lot in very redundant files. The length
|
||||
258 is special since 258 - 3 (the min match length) is 255.
|
||||
13. The literal/length and distance code bit lengths are read as a
|
||||
single stream of lengths. It is possible (and advantageous) for
|
||||
a repeat code (16, 17, or 18) to go across the boundary between
|
||||
the two sets of lengths.
|
||||
*/
|
||||
|
||||
|
||||
void inflate_blocks_reset(s, z, c)
|
||||
inflate_blocks_statef *s;
|
||||
z_streamp z;
|
||||
uLongf *c;
|
||||
{
|
||||
if (c != Z_NULL)
|
||||
*c = s->check;
|
||||
if (s->mode == BTREE || s->mode == DTREE)
|
||||
ZFREE(z, s->sub.trees.blens);
|
||||
if (s->mode == CODES)
|
||||
inflate_codes_free(s->sub.decode.codes, z);
|
||||
s->mode = TYPE;
|
||||
s->bitk = 0;
|
||||
s->bitb = 0;
|
||||
s->read = s->write = s->window;
|
||||
if (s->checkfn != Z_NULL)
|
||||
z->adler = s->check = (*s->checkfn)(0L, (const Bytef *)Z_NULL, 0);
|
||||
Tracev((stderr, "inflate: blocks reset\n"));
|
||||
}
|
||||
|
||||
|
||||
inflate_blocks_statef *inflate_blocks_new(z, c, w)
|
||||
z_streamp z;
|
||||
check_func c;
|
||||
uInt w;
|
||||
{
|
||||
inflate_blocks_statef *s;
|
||||
|
||||
if ((s = (inflate_blocks_statef *)ZALLOC
|
||||
(z,1,sizeof(struct inflate_blocks_state))) == Z_NULL)
|
||||
return s;
|
||||
if ((s->hufts =
|
||||
(inflate_huft *)ZALLOC(z, sizeof(inflate_huft), MANY)) == Z_NULL)
|
||||
{
|
||||
ZFREE(z, s);
|
||||
return Z_NULL;
|
||||
}
|
||||
if ((s->window = (Bytef *)ZALLOC(z, 1, w)) == Z_NULL)
|
||||
{
|
||||
ZFREE(z, s->hufts);
|
||||
ZFREE(z, s);
|
||||
return Z_NULL;
|
||||
}
|
||||
s->end = s->window + w;
|
||||
s->checkfn = c;
|
||||
s->mode = TYPE;
|
||||
Tracev((stderr, "inflate: blocks allocated\n"));
|
||||
inflate_blocks_reset(s, z, Z_NULL);
|
||||
return s;
|
||||
}
|
||||
|
||||
|
||||
int inflate_blocks(s, z, r)
|
||||
inflate_blocks_statef *s;
|
||||
z_streamp z;
|
||||
int r;
|
||||
{
|
||||
uInt t; /* temporary storage */
|
||||
uLong b; /* bit buffer */
|
||||
uInt k; /* bits in bit buffer */
|
||||
Bytef *p; /* input data pointer */
|
||||
uInt n; /* bytes available there */
|
||||
Bytef *q; /* output window write pointer */
|
||||
uInt m; /* bytes to end of window or read pointer */
|
||||
|
||||
/* copy input/output information to locals (UPDATE macro restores) */
|
||||
LOAD
|
||||
|
||||
/* process input based on current state */
|
||||
while (1) switch (s->mode)
|
||||
{
|
||||
case TYPE:
|
||||
NEEDBITS(3)
|
||||
t = (uInt)b & 7;
|
||||
s->last = t & 1;
|
||||
switch (t >> 1)
|
||||
{
|
||||
case 0: /* stored */
|
||||
Tracev((stderr, "inflate: stored block%s\n",
|
||||
s->last ? " (last)" : ""));
|
||||
DUMPBITS(3)
|
||||
t = k & 7; /* go to byte boundary */
|
||||
DUMPBITS(t)
|
||||
s->mode = LENS; /* get length of stored block */
|
||||
break;
|
||||
case 1: /* fixed */
|
||||
Tracev((stderr, "inflate: fixed codes block%s\n",
|
||||
s->last ? " (last)" : ""));
|
||||
{
|
||||
uInt bl, bd;
|
||||
inflate_huft *tl, *td;
|
||||
|
||||
inflate_trees_fixed(&bl, &bd, &tl, &td, z);
|
||||
s->sub.decode.codes = inflate_codes_new(bl, bd, tl, td, z);
|
||||
if (s->sub.decode.codes == Z_NULL)
|
||||
{
|
||||
r = Z_MEM_ERROR;
|
||||
LEAVE
|
||||
}
|
||||
}
|
||||
DUMPBITS(3)
|
||||
s->mode = CODES;
|
||||
break;
|
||||
case 2: /* dynamic */
|
||||
Tracev((stderr, "inflate: dynamic codes block%s\n",
|
||||
s->last ? " (last)" : ""));
|
||||
DUMPBITS(3)
|
||||
s->mode = TABLE;
|
||||
break;
|
||||
case 3: /* illegal */
|
||||
DUMPBITS(3)
|
||||
s->mode = BAD;
|
||||
z->msg = (char*)"invalid block type";
|
||||
r = Z_DATA_ERROR;
|
||||
LEAVE
|
||||
}
|
||||
break;
|
||||
case LENS:
|
||||
NEEDBITS(32)
|
||||
if ((((~b) >> 16) & 0xffff) != (b & 0xffff))
|
||||
{
|
||||
s->mode = BAD;
|
||||
z->msg = (char*)"invalid stored block lengths";
|
||||
r = Z_DATA_ERROR;
|
||||
LEAVE
|
||||
}
|
||||
s->sub.left = (uInt)b & 0xffff;
|
||||
b = k = 0; /* dump bits */
|
||||
Tracev((stderr, "inflate: stored length %u\n", s->sub.left));
|
||||
s->mode = s->sub.left ? STORED : (s->last ? DRY : TYPE);
|
||||
break;
|
||||
case STORED:
|
||||
if (n == 0)
|
||||
LEAVE
|
||||
NEEDOUT
|
||||
t = s->sub.left;
|
||||
if (t > n) t = n;
|
||||
if (t > m) t = m;
|
||||
zmemcpy(q, p, t);
|
||||
p += t; n -= t;
|
||||
q += t; m -= t;
|
||||
if ((s->sub.left -= t) != 0)
|
||||
break;
|
||||
Tracev((stderr, "inflate: stored end, %lu total out\n",
|
||||
z->total_out + (q >= s->read ? q - s->read :
|
||||
(s->end - s->read) + (q - s->window))));
|
||||
s->mode = s->last ? DRY : TYPE;
|
||||
break;
|
||||
case TABLE:
|
||||
NEEDBITS(14)
|
||||
s->sub.trees.table = t = (uInt)b & 0x3fff;
|
||||
#ifndef PKZIP_BUG_WORKAROUND
|
||||
if ((t & 0x1f) > 29 || ((t >> 5) & 0x1f) > 29)
|
||||
{
|
||||
s->mode = BAD;
|
||||
z->msg = (char*)"too many length or distance symbols";
|
||||
r = Z_DATA_ERROR;
|
||||
LEAVE
|
||||
}
|
||||
#endif
|
||||
t = 258 + (t & 0x1f) + ((t >> 5) & 0x1f);
|
||||
if ((s->sub.trees.blens = (uIntf*)ZALLOC(z, t, sizeof(uInt))) == Z_NULL)
|
||||
{
|
||||
r = Z_MEM_ERROR;
|
||||
LEAVE
|
||||
}
|
||||
DUMPBITS(14)
|
||||
s->sub.trees.index = 0;
|
||||
Tracev((stderr, "inflate: table sizes ok\n"));
|
||||
s->mode = BTREE;
|
||||
case BTREE:
|
||||
while (s->sub.trees.index < 4 + (s->sub.trees.table >> 10))
|
||||
{
|
||||
NEEDBITS(3)
|
||||
s->sub.trees.blens[border[s->sub.trees.index++]] = (uInt)b & 7;
|
||||
DUMPBITS(3)
|
||||
}
|
||||
while (s->sub.trees.index < 19)
|
||||
s->sub.trees.blens[border[s->sub.trees.index++]] = 0;
|
||||
s->sub.trees.bb = 7;
|
||||
t = inflate_trees_bits(s->sub.trees.blens, &s->sub.trees.bb,
|
||||
&s->sub.trees.tb, s->hufts, z);
|
||||
if (t != Z_OK)
|
||||
{
|
||||
ZFREE(z, s->sub.trees.blens);
|
||||
r = t;
|
||||
if (r == Z_DATA_ERROR)
|
||||
s->mode = BAD;
|
||||
LEAVE
|
||||
}
|
||||
s->sub.trees.index = 0;
|
||||
Tracev((stderr, "inflate: bits tree ok\n"));
|
||||
s->mode = DTREE;
|
||||
case DTREE:
|
||||
while (t = s->sub.trees.table,
|
||||
s->sub.trees.index < 258 + (t & 0x1f) + ((t >> 5) & 0x1f))
|
||||
{
|
||||
inflate_huft *h;
|
||||
uInt i, j, c;
|
||||
|
||||
t = s->sub.trees.bb;
|
||||
NEEDBITS(t)
|
||||
h = s->sub.trees.tb + ((uInt)b & inflate_mask[t]);
|
||||
t = h->bits;
|
||||
c = h->base;
|
||||
if (c < 16)
|
||||
{
|
||||
DUMPBITS(t)
|
||||
s->sub.trees.blens[s->sub.trees.index++] = c;
|
||||
}
|
||||
else /* c == 16..18 */
|
||||
{
|
||||
i = c == 18 ? 7 : c - 14;
|
||||
j = c == 18 ? 11 : 3;
|
||||
NEEDBITS(t + i)
|
||||
DUMPBITS(t)
|
||||
j += (uInt)b & inflate_mask[i];
|
||||
DUMPBITS(i)
|
||||
i = s->sub.trees.index;
|
||||
t = s->sub.trees.table;
|
||||
if (i + j > 258 + (t & 0x1f) + ((t >> 5) & 0x1f) ||
|
||||
(c == 16 && i < 1))
|
||||
{
|
||||
ZFREE(z, s->sub.trees.blens);
|
||||
s->mode = BAD;
|
||||
z->msg = (char*)"invalid bit length repeat";
|
||||
r = Z_DATA_ERROR;
|
||||
LEAVE
|
||||
}
|
||||
c = c == 16 ? s->sub.trees.blens[i - 1] : 0;
|
||||
do {
|
||||
s->sub.trees.blens[i++] = c;
|
||||
} while (--j);
|
||||
s->sub.trees.index = i;
|
||||
}
|
||||
}
|
||||
s->sub.trees.tb = Z_NULL;
|
||||
{
|
||||
uInt bl, bd;
|
||||
inflate_huft *tl, *td;
|
||||
inflate_codes_statef *c;
|
||||
|
||||
bl = 9; /* must be <= 9 for lookahead assumptions */
|
||||
bd = 6; /* must be <= 9 for lookahead assumptions */
|
||||
t = s->sub.trees.table;
|
||||
t = inflate_trees_dynamic(257 + (t & 0x1f), 1 + ((t >> 5) & 0x1f),
|
||||
s->sub.trees.blens, &bl, &bd, &tl, &td,
|
||||
s->hufts, z);
|
||||
ZFREE(z, s->sub.trees.blens);
|
||||
if (t != Z_OK)
|
||||
{
|
||||
if (t == (uInt)Z_DATA_ERROR)
|
||||
s->mode = BAD;
|
||||
r = t;
|
||||
LEAVE
|
||||
}
|
||||
Tracev((stderr, "inflate: trees ok\n"));
|
||||
if ((c = inflate_codes_new(bl, bd, tl, td, z)) == Z_NULL)
|
||||
{
|
||||
r = Z_MEM_ERROR;
|
||||
LEAVE
|
||||
}
|
||||
s->sub.decode.codes = c;
|
||||
}
|
||||
s->mode = CODES;
|
||||
case CODES:
|
||||
UPDATE
|
||||
if ((r = inflate_codes(s, z, r)) != Z_STREAM_END)
|
||||
return inflate_flush(s, z, r);
|
||||
r = Z_OK;
|
||||
inflate_codes_free(s->sub.decode.codes, z);
|
||||
LOAD
|
||||
Tracev((stderr, "inflate: codes end, %lu total out\n",
|
||||
z->total_out + (q >= s->read ? q - s->read :
|
||||
(s->end - s->read) + (q - s->window))));
|
||||
if (!s->last)
|
||||
{
|
||||
s->mode = TYPE;
|
||||
break;
|
||||
}
|
||||
s->mode = DRY;
|
||||
case DRY:
|
||||
FLUSH
|
||||
if (s->read != s->write)
|
||||
LEAVE
|
||||
s->mode = DONE;
|
||||
case DONE:
|
||||
r = Z_STREAM_END;
|
||||
LEAVE
|
||||
case BAD:
|
||||
r = Z_DATA_ERROR;
|
||||
LEAVE
|
||||
default:
|
||||
r = Z_STREAM_ERROR;
|
||||
LEAVE
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
int inflate_blocks_free(s, z)
|
||||
inflate_blocks_statef *s;
|
||||
z_streamp z;
|
||||
{
|
||||
inflate_blocks_reset(s, z, Z_NULL);
|
||||
ZFREE(z, s->window);
|
||||
ZFREE(z, s->hufts);
|
||||
ZFREE(z, s);
|
||||
Tracev((stderr, "inflate: blocks freed\n"));
|
||||
return Z_OK;
|
||||
}
|
||||
|
||||
|
||||
void inflate_set_dictionary(s, d, n)
|
||||
inflate_blocks_statef *s;
|
||||
const Bytef *d;
|
||||
uInt n;
|
||||
{
|
||||
zmemcpy(s->window, d, n);
|
||||
s->read = s->write = s->window + n;
|
||||
}
|
||||
|
||||
|
||||
/* Returns true if inflate is currently at the end of a block generated
|
||||
* by Z_SYNC_FLUSH or Z_FULL_FLUSH.
|
||||
* IN assertion: s != Z_NULL
|
||||
*/
|
||||
int inflate_blocks_sync_point(s)
|
||||
inflate_blocks_statef *s;
|
||||
{
|
||||
return s->mode == LENS;
|
||||
}
|
39
Contrib/zip2exe/zlib/INFBLOCK.H
Normal file
|
@ -0,0 +1,39 @@
|
|||
/* infblock.h -- header to use infblock.c
|
||||
* Copyright (C) 1995-1998 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.
|
||||
*/
|
||||
|
||||
struct inflate_blocks_state;
|
||||
typedef struct inflate_blocks_state FAR inflate_blocks_statef;
|
||||
|
||||
extern inflate_blocks_statef * inflate_blocks_new OF((
|
||||
z_streamp z,
|
||||
check_func c, /* check function */
|
||||
uInt w)); /* window size */
|
||||
|
||||
extern int inflate_blocks OF((
|
||||
inflate_blocks_statef *,
|
||||
z_streamp ,
|
||||
int)); /* initial return code */
|
||||
|
||||
extern void inflate_blocks_reset OF((
|
||||
inflate_blocks_statef *,
|
||||
z_streamp ,
|
||||
uLongf *)); /* check value on output */
|
||||
|
||||
extern int inflate_blocks_free OF((
|
||||
inflate_blocks_statef *,
|
||||
z_streamp));
|
||||
|
||||
extern void inflate_set_dictionary OF((
|
||||
inflate_blocks_statef *s,
|
||||
const Bytef *d, /* dictionary */
|
||||
uInt n)); /* dictionary length */
|
||||
|
||||
extern int inflate_blocks_sync_point OF((
|
||||
inflate_blocks_statef *s));
|
257
Contrib/zip2exe/zlib/INFCODES.C
Normal file
|
@ -0,0 +1,257 @@
|
|||
/* infcodes.c -- process literals and length/distance pairs
|
||||
* Copyright (C) 1995-1998 Mark Adler
|
||||
* For conditions of distribution and use, see copyright notice in zlib.h
|
||||
*/
|
||||
|
||||
#include "zutil.h"
|
||||
#include "inftrees.h"
|
||||
#include "infblock.h"
|
||||
#include "infcodes.h"
|
||||
#include "infutil.h"
|
||||
#include "inffast.h"
|
||||
|
||||
/* simplify the use of the inflate_huft type with some defines */
|
||||
#define exop word.what.Exop
|
||||
#define bits word.what.Bits
|
||||
|
||||
typedef enum { /* waiting for "i:"=input, "o:"=output, "x:"=nothing */
|
||||
START, /* x: set up for LEN */
|
||||
LEN, /* i: get length/literal/eob next */
|
||||
LENEXT, /* i: getting length extra (have base) */
|
||||
DIST, /* i: get distance next */
|
||||
DISTEXT, /* i: getting distance extra */
|
||||
COPY, /* o: copying bytes in window, waiting for space */
|
||||
LIT, /* o: got literal, waiting for output space */
|
||||
WASH, /* o: got eob, possibly still output waiting */
|
||||
END, /* x: got eob and all data flushed */
|
||||
BADCODE} /* x: got error */
|
||||
inflate_codes_mode;
|
||||
|
||||
/* inflate codes private state */
|
||||
struct inflate_codes_state {
|
||||
|
||||
/* mode */
|
||||
inflate_codes_mode mode; /* current inflate_codes mode */
|
||||
|
||||
/* mode dependent information */
|
||||
uInt len;
|
||||
union {
|
||||
struct {
|
||||
inflate_huft *tree; /* pointer into tree */
|
||||
uInt need; /* bits needed */
|
||||
} code; /* if LEN or DIST, where in tree */
|
||||
uInt lit; /* if LIT, literal */
|
||||
struct {
|
||||
uInt get; /* bits to get for extra */
|
||||
uInt dist; /* distance back to copy from */
|
||||
} copy; /* if EXT or COPY, where and how much */
|
||||
} sub; /* submode */
|
||||
|
||||
/* mode independent information */
|
||||
Byte lbits; /* ltree bits decoded per branch */
|
||||
Byte dbits; /* dtree bits decoder per branch */
|
||||
inflate_huft *ltree; /* literal/length/eob tree */
|
||||
inflate_huft *dtree; /* distance tree */
|
||||
|
||||
};
|
||||
|
||||
|
||||
inflate_codes_statef *inflate_codes_new(bl, bd, tl, td, z)
|
||||
uInt bl, bd;
|
||||
inflate_huft *tl;
|
||||
inflate_huft *td; /* need separate declaration for Borland C++ */
|
||||
z_streamp z;
|
||||
{
|
||||
inflate_codes_statef *c;
|
||||
|
||||
if ((c = (inflate_codes_statef *)
|
||||
ZALLOC(z,1,sizeof(struct inflate_codes_state))) != Z_NULL)
|
||||
{
|
||||
c->mode = START;
|
||||
c->lbits = (Byte)bl;
|
||||
c->dbits = (Byte)bd;
|
||||
c->ltree = tl;
|
||||
c->dtree = td;
|
||||
Tracev((stderr, "inflate: codes new\n"));
|
||||
}
|
||||
return c;
|
||||
}
|
||||
|
||||
|
||||
int inflate_codes(s, z, r)
|
||||
inflate_blocks_statef *s;
|
||||
z_streamp z;
|
||||
int r;
|
||||
{
|
||||
uInt j; /* temporary storage */
|
||||
inflate_huft *t; /* temporary pointer */
|
||||
uInt e; /* extra bits or operation */
|
||||
uLong b; /* bit buffer */
|
||||
uInt k; /* bits in bit buffer */
|
||||
Bytef *p; /* input data pointer */
|
||||
uInt n; /* bytes available there */
|
||||
Bytef *q; /* output window write pointer */
|
||||
uInt m; /* bytes to end of window or read pointer */
|
||||
Bytef *f; /* pointer to copy strings from */
|
||||
inflate_codes_statef *c = s->sub.decode.codes; /* codes state */
|
||||
|
||||
/* copy input/output information to locals (UPDATE macro restores) */
|
||||
LOAD
|
||||
|
||||
/* process input and output based on current state */
|
||||
while (1) switch (c->mode)
|
||||
{ /* waiting for "i:"=input, "o:"=output, "x:"=nothing */
|
||||
case START: /* x: set up for LEN */
|
||||
#ifndef SLOW
|
||||
if (m >= 258 && n >= 10)
|
||||
{
|
||||
UPDATE
|
||||
r = inflate_fast(c->lbits, c->dbits, c->ltree, c->dtree, s, z);
|
||||
LOAD
|
||||
if (r != Z_OK)
|
||||
{
|
||||
c->mode = r == Z_STREAM_END ? WASH : BADCODE;
|
||||
break;
|
||||
}
|
||||
}
|
||||
#endif /* !SLOW */
|
||||
c->sub.code.need = c->lbits;
|
||||
c->sub.code.tree = c->ltree;
|
||||
c->mode = LEN;
|
||||
case LEN: /* i: get length/literal/eob next */
|
||||
j = c->sub.code.need;
|
||||
NEEDBITS(j)
|
||||
t = c->sub.code.tree + ((uInt)b & inflate_mask[j]);
|
||||
DUMPBITS(t->bits)
|
||||
e = (uInt)(t->exop);
|
||||
if (e == 0) /* literal */
|
||||
{
|
||||
c->sub.lit = t->base;
|
||||
Tracevv((stderr, t->base >= 0x20 && t->base < 0x7f ?
|
||||
"inflate: literal '%c'\n" :
|
||||
"inflate: literal 0x%02x\n", t->base));
|
||||
c->mode = LIT;
|
||||
break;
|
||||
}
|
||||
if (e & 16) /* length */
|
||||
{
|
||||
c->sub.copy.get = e & 15;
|
||||
c->len = t->base;
|
||||
c->mode = LENEXT;
|
||||
break;
|
||||
}
|
||||
if ((e & 64) == 0) /* next table */
|
||||
{
|
||||
c->sub.code.need = e;
|
||||
c->sub.code.tree = t + t->base;
|
||||
break;
|
||||
}
|
||||
if (e & 32) /* end of block */
|
||||
{
|
||||
Tracevv((stderr, "inflate: end of block\n"));
|
||||
c->mode = WASH;
|
||||
break;
|
||||
}
|
||||
c->mode = BADCODE; /* invalid code */
|
||||
z->msg = (char*)"invalid literal/length code";
|
||||
r = Z_DATA_ERROR;
|
||||
LEAVE
|
||||
case LENEXT: /* i: getting length extra (have base) */
|
||||
j = c->sub.copy.get;
|
||||
NEEDBITS(j)
|
||||
c->len += (uInt)b & inflate_mask[j];
|
||||
DUMPBITS(j)
|
||||
c->sub.code.need = c->dbits;
|
||||
c->sub.code.tree = c->dtree;
|
||||
Tracevv((stderr, "inflate: length %u\n", c->len));
|
||||
c->mode = DIST;
|
||||
case DIST: /* i: get distance next */
|
||||
j = c->sub.code.need;
|
||||
NEEDBITS(j)
|
||||
t = c->sub.code.tree + ((uInt)b & inflate_mask[j]);
|
||||
DUMPBITS(t->bits)
|
||||
e = (uInt)(t->exop);
|
||||
if (e & 16) /* distance */
|
||||
{
|
||||
c->sub.copy.get = e & 15;
|
||||
c->sub.copy.dist = t->base;
|
||||
c->mode = DISTEXT;
|
||||
break;
|
||||
}
|
||||
if ((e & 64) == 0) /* next table */
|
||||
{
|
||||
c->sub.code.need = e;
|
||||
c->sub.code.tree = t + t->base;
|
||||
break;
|
||||
}
|
||||
c->mode = BADCODE; /* invalid code */
|
||||
z->msg = (char*)"invalid distance code";
|
||||
r = Z_DATA_ERROR;
|
||||
LEAVE
|
||||
case DISTEXT: /* i: getting distance extra */
|
||||
j = c->sub.copy.get;
|
||||
NEEDBITS(j)
|
||||
c->sub.copy.dist += (uInt)b & inflate_mask[j];
|
||||
DUMPBITS(j)
|
||||
Tracevv((stderr, "inflate: distance %u\n", c->sub.copy.dist));
|
||||
c->mode = COPY;
|
||||
case COPY: /* o: copying bytes in window, waiting for space */
|
||||
#ifndef __TURBOC__ /* Turbo C bug for following expression */
|
||||
f = (uInt)(q - s->window) < c->sub.copy.dist ?
|
||||
s->end - (c->sub.copy.dist - (q - s->window)) :
|
||||
q - c->sub.copy.dist;
|
||||
#else
|
||||
f = q - c->sub.copy.dist;
|
||||
if ((uInt)(q - s->window) < c->sub.copy.dist)
|
||||
f = s->end - (c->sub.copy.dist - (uInt)(q - s->window));
|
||||
#endif
|
||||
while (c->len)
|
||||
{
|
||||
NEEDOUT
|
||||
OUTBYTE(*f++)
|
||||
if (f == s->end)
|
||||
f = s->window;
|
||||
c->len--;
|
||||
}
|
||||
c->mode = START;
|
||||
break;
|
||||
case LIT: /* o: got literal, waiting for output space */
|
||||
NEEDOUT
|
||||
OUTBYTE(c->sub.lit)
|
||||
c->mode = START;
|
||||
break;
|
||||
case WASH: /* o: got eob, possibly more output */
|
||||
if (k > 7) /* return unused byte, if any */
|
||||
{
|
||||
Assert(k < 16, "inflate_codes grabbed too many bytes")
|
||||
k -= 8;
|
||||
n++;
|
||||
p--; /* can always return one */
|
||||
}
|
||||
FLUSH
|
||||
if (s->read != s->write)
|
||||
LEAVE
|
||||
c->mode = END;
|
||||
case END:
|
||||
r = Z_STREAM_END;
|
||||
LEAVE
|
||||
case BADCODE: /* x: got error */
|
||||
r = Z_DATA_ERROR;
|
||||
LEAVE
|
||||
default:
|
||||
r = Z_STREAM_ERROR;
|
||||
LEAVE
|
||||
}
|
||||
#ifdef NEED_DUMMY_RETURN
|
||||
return Z_STREAM_ERROR; /* Some dumb compilers complain without this */
|
||||
#endif
|
||||
}
|
||||
|
||||
|
||||
void inflate_codes_free(c, z)
|
||||
inflate_codes_statef *c;
|
||||
z_streamp z;
|
||||
{
|
||||
ZFREE(z, c);
|
||||
Tracev((stderr, "inflate: codes free\n"));
|
||||
}
|
27
Contrib/zip2exe/zlib/INFCODES.H
Normal file
|
@ -0,0 +1,27 @@
|
|||
/* infcodes.h -- header to use infcodes.c
|
||||
* Copyright (C) 1995-1998 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.
|
||||
*/
|
||||
|
||||
struct inflate_codes_state;
|
||||
typedef struct inflate_codes_state FAR inflate_codes_statef;
|
||||
|
||||
extern inflate_codes_statef *inflate_codes_new OF((
|
||||
uInt, uInt,
|
||||
inflate_huft *, inflate_huft *,
|
||||
z_streamp ));
|
||||
|
||||
extern int inflate_codes OF((
|
||||
inflate_blocks_statef *,
|
||||
z_streamp ,
|
||||
int));
|
||||
|
||||
extern void inflate_codes_free OF((
|
||||
inflate_codes_statef *,
|
||||
z_streamp ));
|
||||
|
170
Contrib/zip2exe/zlib/INFFAST.C
Normal file
|
@ -0,0 +1,170 @@
|
|||
/* inffast.c -- process literals and length/distance pairs fast
|
||||
* Copyright (C) 1995-1998 Mark Adler
|
||||
* For conditions of distribution and use, see copyright notice in zlib.h
|
||||
*/
|
||||
|
||||
#include "zutil.h"
|
||||
#include "inftrees.h"
|
||||
#include "infblock.h"
|
||||
#include "infcodes.h"
|
||||
#include "infutil.h"
|
||||
#include "inffast.h"
|
||||
|
||||
struct inflate_codes_state {int dummy;}; /* for buggy compilers */
|
||||
|
||||
/* simplify the use of the inflate_huft type with some defines */
|
||||
#define exop word.what.Exop
|
||||
#define bits word.what.Bits
|
||||
|
||||
/* macros for bit input with no checking and for returning unused bytes */
|
||||
#define GRABBITS(j) {while(k<(j)){b|=((uLong)NEXTBYTE)<<k;k+=8;}}
|
||||
#define UNGRAB {c=z->avail_in-n;c=(k>>3)<c?k>>3:c;n+=c;p-=c;k-=c<<3;}
|
||||
|
||||
/* Called with number of bytes left to write in window at least 258
|
||||
(the maximum string length) and number of input bytes available
|
||||
at least ten. The ten bytes are six bytes for the longest length/
|
||||
distance pair plus four bytes for overloading the bit buffer. */
|
||||
|
||||
int inflate_fast(bl, bd, tl, td, s, z)
|
||||
uInt bl, bd;
|
||||
inflate_huft *tl;
|
||||
inflate_huft *td; /* need separate declaration for Borland C++ */
|
||||
inflate_blocks_statef *s;
|
||||
z_streamp z;
|
||||
{
|
||||
inflate_huft *t; /* temporary pointer */
|
||||
uInt e; /* extra bits or operation */
|
||||
uLong b; /* bit buffer */
|
||||
uInt k; /* bits in bit buffer */
|
||||
Bytef *p; /* input data pointer */
|
||||
uInt n; /* bytes available there */
|
||||
Bytef *q; /* output window write pointer */
|
||||
uInt m; /* bytes to end of window or read pointer */
|
||||
uInt ml; /* mask for literal/length tree */
|
||||
uInt md; /* mask for distance tree */
|
||||
uInt c; /* bytes to copy */
|
||||
uInt d; /* distance back to copy from */
|
||||
Bytef *r; /* copy source pointer */
|
||||
|
||||
/* load input, output, bit values */
|
||||
LOAD
|
||||
|
||||
/* initialize masks */
|
||||
ml = inflate_mask[bl];
|
||||
md = inflate_mask[bd];
|
||||
|
||||
/* do until not enough input or output space for fast loop */
|
||||
do { /* assume called with m >= 258 && n >= 10 */
|
||||
/* get literal/length code */
|
||||
GRABBITS(20) /* max bits for literal/length code */
|
||||
if ((e = (t = tl + ((uInt)b & ml))->exop) == 0)
|
||||
{
|
||||
DUMPBITS(t->bits)
|
||||
Tracevv((stderr, t->base >= 0x20 && t->base < 0x7f ?
|
||||
"inflate: * literal '%c'\n" :
|
||||
"inflate: * literal 0x%02x\n", t->base));
|
||||
*q++ = (Byte)t->base;
|
||||
m--;
|
||||
continue;
|
||||
}
|
||||
do {
|
||||
DUMPBITS(t->bits)
|
||||
if (e & 16)
|
||||
{
|
||||
/* get extra bits for length */
|
||||
e &= 15;
|
||||
c = t->base + ((uInt)b & inflate_mask[e]);
|
||||
DUMPBITS(e)
|
||||
Tracevv((stderr, "inflate: * length %u\n", c));
|
||||
|
||||
/* decode distance base of block to copy */
|
||||
GRABBITS(15); /* max bits for distance code */
|
||||
e = (t = td + ((uInt)b & md))->exop;
|
||||
do {
|
||||
DUMPBITS(t->bits)
|
||||
if (e & 16)
|
||||
{
|
||||
/* get extra bits to add to distance base */
|
||||
e &= 15;
|
||||
GRABBITS(e) /* get extra bits (up to 13) */
|
||||
d = t->base + ((uInt)b & inflate_mask[e]);
|
||||
DUMPBITS(e)
|
||||
Tracevv((stderr, "inflate: * distance %u\n", d));
|
||||
|
||||
/* do the copy */
|
||||
m -= c;
|
||||
if ((uInt)(q - s->window) >= d) /* offset before dest */
|
||||
{ /* just copy */
|
||||
r = q - d;
|
||||
*q++ = *r++; c--; /* minimum count is three, */
|
||||
*q++ = *r++; c--; /* so unroll loop a little */
|
||||
}
|
||||
else /* else offset after destination */
|
||||
{
|
||||
e = d - (uInt)(q - s->window); /* bytes from offset to end */
|
||||
r = s->end - e; /* pointer to offset */
|
||||
if (c > e) /* if source crosses, */
|
||||
{
|
||||
c -= e; /* copy to end of window */
|
||||
do {
|
||||
*q++ = *r++;
|
||||
} while (--e);
|
||||
r = s->window; /* copy rest from start of window */
|
||||
}
|
||||
}
|
||||
do { /* copy all or what's left */
|
||||
*q++ = *r++;
|
||||
} while (--c);
|
||||
break;
|
||||
}
|
||||
else if ((e & 64) == 0)
|
||||
{
|
||||
t += t->base;
|
||||
e = (t += ((uInt)b & inflate_mask[e]))->exop;
|
||||
}
|
||||
else
|
||||
{
|
||||
z->msg = (char*)"invalid distance code";
|
||||
UNGRAB
|
||||
UPDATE
|
||||
return Z_DATA_ERROR;
|
||||
}
|
||||
} while (1);
|
||||
break;
|
||||
}
|
||||
if ((e & 64) == 0)
|
||||
{
|
||||
t += t->base;
|
||||
if ((e = (t += ((uInt)b & inflate_mask[e]))->exop) == 0)
|
||||
{
|
||||
DUMPBITS(t->bits)
|
||||
Tracevv((stderr, t->base >= 0x20 && t->base < 0x7f ?
|
||||
"inflate: * literal '%c'\n" :
|
||||
"inflate: * literal 0x%02x\n", t->base));
|
||||
*q++ = (Byte)t->base;
|
||||
m--;
|
||||
break;
|
||||
}
|
||||
}
|
||||
else if (e & 32)
|
||||
{
|
||||
Tracevv((stderr, "inflate: * end of block\n"));
|
||||
UNGRAB
|
||||
UPDATE
|
||||
return Z_STREAM_END;
|
||||
}
|
||||
else
|
||||
{
|
||||
z->msg = (char*)"invalid literal/length code";
|
||||
UNGRAB
|
||||
UPDATE
|
||||
return Z_DATA_ERROR;
|
||||
}
|
||||
} while (1);
|
||||
} while (m >= 258 && n >= 10);
|
||||
|
||||
/* not enough input or output--restore pointers and return */
|
||||
UNGRAB
|
||||
UPDATE
|
||||
return Z_OK;
|
||||
}
|
17
Contrib/zip2exe/zlib/INFFAST.H
Normal file
|
@ -0,0 +1,17 @@
|
|||
/* inffast.h -- header to use inffast.c
|
||||
* Copyright (C) 1995-1998 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.
|
||||
*/
|
||||
|
||||
extern int inflate_fast OF((
|
||||
uInt,
|
||||
uInt,
|
||||
inflate_huft *,
|
||||
inflate_huft *,
|
||||
inflate_blocks_statef *,
|
||||
z_streamp ));
|
151
Contrib/zip2exe/zlib/INFFIXED.H
Normal file
|
@ -0,0 +1,151 @@
|
|||
/* inffixed.h -- table for decoding fixed codes
|
||||
* Generated automatically by the maketree.c program
|
||||
*/
|
||||
|
||||
/* 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.
|
||||
*/
|
||||
|
||||
local uInt fixed_bl = 9;
|
||||
local uInt fixed_bd = 5;
|
||||
local inflate_huft fixed_tl[] = {
|
||||
{{{96,7}},256}, {{{0,8}},80}, {{{0,8}},16}, {{{84,8}},115},
|
||||
{{{82,7}},31}, {{{0,8}},112}, {{{0,8}},48}, {{{0,9}},192},
|
||||
{{{80,7}},10}, {{{0,8}},96}, {{{0,8}},32}, {{{0,9}},160},
|
||||
{{{0,8}},0}, {{{0,8}},128}, {{{0,8}},64}, {{{0,9}},224},
|
||||
{{{80,7}},6}, {{{0,8}},88}, {{{0,8}},24}, {{{0,9}},144},
|
||||
{{{83,7}},59}, {{{0,8}},120}, {{{0,8}},56}, {{{0,9}},208},
|
||||
{{{81,7}},17}, {{{0,8}},104}, {{{0,8}},40}, {{{0,9}},176},
|
||||
{{{0,8}},8}, {{{0,8}},136}, {{{0,8}},72}, {{{0,9}},240},
|
||||
{{{80,7}},4}, {{{0,8}},84}, {{{0,8}},20}, {{{85,8}},227},
|
||||
{{{83,7}},43}, {{{0,8}},116}, {{{0,8}},52}, {{{0,9}},200},
|
||||
{{{81,7}},13}, {{{0,8}},100}, {{{0,8}},36}, {{{0,9}},168},
|
||||
{{{0,8}},4}, {{{0,8}},132}, {{{0,8}},68}, {{{0,9}},232},
|
||||
{{{80,7}},8}, {{{0,8}},92}, {{{0,8}},28}, {{{0,9}},152},
|
||||
{{{84,7}},83}, {{{0,8}},124}, {{{0,8}},60}, {{{0,9}},216},
|
||||
{{{82,7}},23}, {{{0,8}},108}, {{{0,8}},44}, {{{0,9}},184},
|
||||
{{{0,8}},12}, {{{0,8}},140}, {{{0,8}},76}, {{{0,9}},248},
|
||||
{{{80,7}},3}, {{{0,8}},82}, {{{0,8}},18}, {{{85,8}},163},
|
||||
{{{83,7}},35}, {{{0,8}},114}, {{{0,8}},50}, {{{0,9}},196},
|
||||
{{{81,7}},11}, {{{0,8}},98}, {{{0,8}},34}, {{{0,9}},164},
|
||||
{{{0,8}},2}, {{{0,8}},130}, {{{0,8}},66}, {{{0,9}},228},
|
||||
{{{80,7}},7}, {{{0,8}},90}, {{{0,8}},26}, {{{0,9}},148},
|
||||
{{{84,7}},67}, {{{0,8}},122}, {{{0,8}},58}, {{{0,9}},212},
|
||||
{{{82,7}},19}, {{{0,8}},106}, {{{0,8}},42}, {{{0,9}},180},
|
||||
{{{0,8}},10}, {{{0,8}},138}, {{{0,8}},74}, {{{0,9}},244},
|
||||
{{{80,7}},5}, {{{0,8}},86}, {{{0,8}},22}, {{{192,8}},0},
|
||||
{{{83,7}},51}, {{{0,8}},118}, {{{0,8}},54}, {{{0,9}},204},
|
||||
{{{81,7}},15}, {{{0,8}},102}, {{{0,8}},38}, {{{0,9}},172},
|
||||
{{{0,8}},6}, {{{0,8}},134}, {{{0,8}},70}, {{{0,9}},236},
|
||||
{{{80,7}},9}, {{{0,8}},94}, {{{0,8}},30}, {{{0,9}},156},
|
||||
{{{84,7}},99}, {{{0,8}},126}, {{{0,8}},62}, {{{0,9}},220},
|
||||
{{{82,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}},256}, {{{0,8}},81}, {{{0,8}},17}, {{{85,8}},131},
|
||||
{{{82,7}},31}, {{{0,8}},113}, {{{0,8}},49}, {{{0,9}},194},
|
||||
{{{80,7}},10}, {{{0,8}},97}, {{{0,8}},33}, {{{0,9}},162},
|
||||
{{{0,8}},1}, {{{0,8}},129}, {{{0,8}},65}, {{{0,9}},226},
|
||||
{{{80,7}},6}, {{{0,8}},89}, {{{0,8}},25}, {{{0,9}},146},
|
||||
{{{83,7}},59}, {{{0,8}},121}, {{{0,8}},57}, {{{0,9}},210},
|
||||
{{{81,7}},17}, {{{0,8}},105}, {{{0,8}},41}, {{{0,9}},178},
|
||||
{{{0,8}},9}, {{{0,8}},137}, {{{0,8}},73}, {{{0,9}},242},
|
||||
{{{80,7}},4}, {{{0,8}},85}, {{{0,8}},21}, {{{80,8}},258},
|
||||
{{{83,7}},43}, {{{0,8}},117}, {{{0,8}},53}, {{{0,9}},202},
|
||||
{{{81,7}},13}, {{{0,8}},101}, {{{0,8}},37}, {{{0,9}},170},
|
||||
{{{0,8}},5}, {{{0,8}},133}, {{{0,8}},69}, {{{0,9}},234},
|
||||
{{{80,7}},8}, {{{0,8}},93}, {{{0,8}},29}, {{{0,9}},154},
|
||||
{{{84,7}},83}, {{{0,8}},125}, {{{0,8}},61}, {{{0,9}},218},
|
||||
{{{82,7}},23}, {{{0,8}},109}, {{{0,8}},45}, {{{0,9}},186},
|
||||
{{{0,8}},13}, {{{0,8}},141}, {{{0,8}},77}, {{{0,9}},250},
|
||||
{{{80,7}},3}, {{{0,8}},83}, {{{0,8}},19}, {{{85,8}},195},
|
||||
{{{83,7}},35}, {{{0,8}},115}, {{{0,8}},51}, {{{0,9}},198},
|
||||
{{{81,7}},11}, {{{0,8}},99}, {{{0,8}},35}, {{{0,9}},166},
|
||||
{{{0,8}},3}, {{{0,8}},131}, {{{0,8}},67}, {{{0,9}},230},
|
||||
{{{80,7}},7}, {{{0,8}},91}, {{{0,8}},27}, {{{0,9}},150},
|
||||
{{{84,7}},67}, {{{0,8}},123}, {{{0,8}},59}, {{{0,9}},214},
|
||||
{{{82,7}},19}, {{{0,8}},107}, {{{0,8}},43}, {{{0,9}},182},
|
||||
{{{0,8}},11}, {{{0,8}},139}, {{{0,8}},75}, {{{0,9}},246},
|
||||
{{{80,7}},5}, {{{0,8}},87}, {{{0,8}},23}, {{{192,8}},0},
|
||||
{{{83,7}},51}, {{{0,8}},119}, {{{0,8}},55}, {{{0,9}},206},
|
||||
{{{81,7}},15}, {{{0,8}},103}, {{{0,8}},39}, {{{0,9}},174},
|
||||
{{{0,8}},7}, {{{0,8}},135}, {{{0,8}},71}, {{{0,9}},238},
|
||||
{{{80,7}},9}, {{{0,8}},95}, {{{0,8}},31}, {{{0,9}},158},
|
||||
{{{84,7}},99}, {{{0,8}},127}, {{{0,8}},63}, {{{0,9}},222},
|
||||
{{{82,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}},256}, {{{0,8}},80}, {{{0,8}},16}, {{{84,8}},115},
|
||||
{{{82,7}},31}, {{{0,8}},112}, {{{0,8}},48}, {{{0,9}},193},
|
||||
{{{80,7}},10}, {{{0,8}},96}, {{{0,8}},32}, {{{0,9}},161},
|
||||
{{{0,8}},0}, {{{0,8}},128}, {{{0,8}},64}, {{{0,9}},225},
|
||||
{{{80,7}},6}, {{{0,8}},88}, {{{0,8}},24}, {{{0,9}},145},
|
||||
{{{83,7}},59}, {{{0,8}},120}, {{{0,8}},56}, {{{0,9}},209},
|
||||
{{{81,7}},17}, {{{0,8}},104}, {{{0,8}},40}, {{{0,9}},177},
|
||||
{{{0,8}},8}, {{{0,8}},136}, {{{0,8}},72}, {{{0,9}},241},
|
||||
{{{80,7}},4}, {{{0,8}},84}, {{{0,8}},20}, {{{85,8}},227},
|
||||
{{{83,7}},43}, {{{0,8}},116}, {{{0,8}},52}, {{{0,9}},201},
|
||||
{{{81,7}},13}, {{{0,8}},100}, {{{0,8}},36}, {{{0,9}},169},
|
||||
{{{0,8}},4}, {{{0,8}},132}, {{{0,8}},68}, {{{0,9}},233},
|
||||
{{{80,7}},8}, {{{0,8}},92}, {{{0,8}},28}, {{{0,9}},153},
|
||||
{{{84,7}},83}, {{{0,8}},124}, {{{0,8}},60}, {{{0,9}},217},
|
||||
{{{82,7}},23}, {{{0,8}},108}, {{{0,8}},44}, {{{0,9}},185},
|
||||
{{{0,8}},12}, {{{0,8}},140}, {{{0,8}},76}, {{{0,9}},249},
|
||||
{{{80,7}},3}, {{{0,8}},82}, {{{0,8}},18}, {{{85,8}},163},
|
||||
{{{83,7}},35}, {{{0,8}},114}, {{{0,8}},50}, {{{0,9}},197},
|
||||
{{{81,7}},11}, {{{0,8}},98}, {{{0,8}},34}, {{{0,9}},165},
|
||||
{{{0,8}},2}, {{{0,8}},130}, {{{0,8}},66}, {{{0,9}},229},
|
||||
{{{80,7}},7}, {{{0,8}},90}, {{{0,8}},26}, {{{0,9}},149},
|
||||
{{{84,7}},67}, {{{0,8}},122}, {{{0,8}},58}, {{{0,9}},213},
|
||||
{{{82,7}},19}, {{{0,8}},106}, {{{0,8}},42}, {{{0,9}},181},
|
||||
{{{0,8}},10}, {{{0,8}},138}, {{{0,8}},74}, {{{0,9}},245},
|
||||
{{{80,7}},5}, {{{0,8}},86}, {{{0,8}},22}, {{{192,8}},0},
|
||||
{{{83,7}},51}, {{{0,8}},118}, {{{0,8}},54}, {{{0,9}},205},
|
||||
{{{81,7}},15}, {{{0,8}},102}, {{{0,8}},38}, {{{0,9}},173},
|
||||
{{{0,8}},6}, {{{0,8}},134}, {{{0,8}},70}, {{{0,9}},237},
|
||||
{{{80,7}},9}, {{{0,8}},94}, {{{0,8}},30}, {{{0,9}},157},
|
||||
{{{84,7}},99}, {{{0,8}},126}, {{{0,8}},62}, {{{0,9}},221},
|
||||
{{{82,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}},256}, {{{0,8}},81}, {{{0,8}},17}, {{{85,8}},131},
|
||||
{{{82,7}},31}, {{{0,8}},113}, {{{0,8}},49}, {{{0,9}},195},
|
||||
{{{80,7}},10}, {{{0,8}},97}, {{{0,8}},33}, {{{0,9}},163},
|
||||
{{{0,8}},1}, {{{0,8}},129}, {{{0,8}},65}, {{{0,9}},227},
|
||||
{{{80,7}},6}, {{{0,8}},89}, {{{0,8}},25}, {{{0,9}},147},
|
||||
{{{83,7}},59}, {{{0,8}},121}, {{{0,8}},57}, {{{0,9}},211},
|
||||
{{{81,7}},17}, {{{0,8}},105}, {{{0,8}},41}, {{{0,9}},179},
|
||||
{{{0,8}},9}, {{{0,8}},137}, {{{0,8}},73}, {{{0,9}},243},
|
||||
{{{80,7}},4}, {{{0,8}},85}, {{{0,8}},21}, {{{80,8}},258},
|
||||
{{{83,7}},43}, {{{0,8}},117}, {{{0,8}},53}, {{{0,9}},203},
|
||||
{{{81,7}},13}, {{{0,8}},101}, {{{0,8}},37}, {{{0,9}},171},
|
||||
{{{0,8}},5}, {{{0,8}},133}, {{{0,8}},69}, {{{0,9}},235},
|
||||
{{{80,7}},8}, {{{0,8}},93}, {{{0,8}},29}, {{{0,9}},155},
|
||||
{{{84,7}},83}, {{{0,8}},125}, {{{0,8}},61}, {{{0,9}},219},
|
||||
{{{82,7}},23}, {{{0,8}},109}, {{{0,8}},45}, {{{0,9}},187},
|
||||
{{{0,8}},13}, {{{0,8}},141}, {{{0,8}},77}, {{{0,9}},251},
|
||||
{{{80,7}},3}, {{{0,8}},83}, {{{0,8}},19}, {{{85,8}},195},
|
||||
{{{83,7}},35}, {{{0,8}},115}, {{{0,8}},51}, {{{0,9}},199},
|
||||
{{{81,7}},11}, {{{0,8}},99}, {{{0,8}},35}, {{{0,9}},167},
|
||||
{{{0,8}},3}, {{{0,8}},131}, {{{0,8}},67}, {{{0,9}},231},
|
||||
{{{80,7}},7}, {{{0,8}},91}, {{{0,8}},27}, {{{0,9}},151},
|
||||
{{{84,7}},67}, {{{0,8}},123}, {{{0,8}},59}, {{{0,9}},215},
|
||||
{{{82,7}},19}, {{{0,8}},107}, {{{0,8}},43}, {{{0,9}},183},
|
||||
{{{0,8}},11}, {{{0,8}},139}, {{{0,8}},75}, {{{0,9}},247},
|
||||
{{{80,7}},5}, {{{0,8}},87}, {{{0,8}},23}, {{{192,8}},0},
|
||||
{{{83,7}},51}, {{{0,8}},119}, {{{0,8}},55}, {{{0,9}},207},
|
||||
{{{81,7}},15}, {{{0,8}},103}, {{{0,8}},39}, {{{0,9}},175},
|
||||
{{{0,8}},7}, {{{0,8}},135}, {{{0,8}},71}, {{{0,9}},239},
|
||||
{{{80,7}},9}, {{{0,8}},95}, {{{0,8}},31}, {{{0,9}},159},
|
||||
{{{84,7}},99}, {{{0,8}},127}, {{{0,8}},63}, {{{0,9}},223},
|
||||
{{{82,7}},27}, {{{0,8}},111}, {{{0,8}},47}, {{{0,9}},191},
|
||||
{{{0,8}},15}, {{{0,8}},143}, {{{0,8}},79}, {{{0,9}},255}
|
||||
};
|
||||
local inflate_huft fixed_td[] = {
|
||||
{{{80,5}},1}, {{{87,5}},257}, {{{83,5}},17}, {{{91,5}},4097},
|
||||
{{{81,5}},5}, {{{89,5}},1025}, {{{85,5}},65}, {{{93,5}},16385},
|
||||
{{{80,5}},3}, {{{88,5}},513}, {{{84,5}},33}, {{{92,5}},8193},
|
||||
{{{82,5}},9}, {{{90,5}},2049}, {{{86,5}},129}, {{{192,5}},24577},
|
||||
{{{80,5}},2}, {{{87,5}},385}, {{{83,5}},25}, {{{91,5}},6145},
|
||||
{{{81,5}},7}, {{{89,5}},1537}, {{{85,5}},97}, {{{93,5}},24577},
|
||||
{{{80,5}},4}, {{{88,5}},769}, {{{84,5}},49}, {{{92,5}},12289},
|
||||
{{{82,5}},13}, {{{90,5}},3073}, {{{86,5}},193}, {{{192,5}},24577}
|
||||
};
|
366
Contrib/zip2exe/zlib/INFLATE.C
Normal file
|
@ -0,0 +1,366 @@
|
|||
/* inflate.c -- zlib interface to inflate modules
|
||||
* Copyright (C) 1995-1998 Mark Adler
|
||||
* For conditions of distribution and use, see copyright notice in zlib.h
|
||||
*/
|
||||
|
||||
#include "zutil.h"
|
||||
#include "infblock.h"
|
||||
|
||||
struct inflate_blocks_state {int dummy;}; /* for buggy compilers */
|
||||
|
||||
typedef enum {
|
||||
METHOD, /* waiting for method byte */
|
||||
FLAG, /* waiting for flag byte */
|
||||
DICT4, /* four dictionary check bytes to go */
|
||||
DICT3, /* three dictionary check bytes to go */
|
||||
DICT2, /* two dictionary check bytes to go */
|
||||
DICT1, /* one dictionary check byte to go */
|
||||
DICT0, /* waiting for inflateSetDictionary */
|
||||
BLOCKS, /* decompressing blocks */
|
||||
CHECK4, /* four check bytes to go */
|
||||
CHECK3, /* three check bytes to go */
|
||||
CHECK2, /* two check bytes to go */
|
||||
CHECK1, /* one check byte to go */
|
||||
DONE, /* finished check, done */
|
||||
BAD} /* got an error--stay here */
|
||||
inflate_mode;
|
||||
|
||||
/* inflate private state */
|
||||
struct internal_state {
|
||||
|
||||
/* mode */
|
||||
inflate_mode mode; /* current inflate mode */
|
||||
|
||||
/* mode dependent information */
|
||||
union {
|
||||
uInt method; /* if FLAGS, method byte */
|
||||
struct {
|
||||
uLong was; /* computed check value */
|
||||
uLong need; /* stream check value */
|
||||
} check; /* if CHECK, check values to compare */
|
||||
uInt marker; /* if BAD, inflateSync's marker bytes count */
|
||||
} sub; /* submode */
|
||||
|
||||
/* mode independent information */
|
||||
int nowrap; /* flag for no wrapper */
|
||||
uInt wbits; /* log2(window size) (8..15, defaults to 15) */
|
||||
inflate_blocks_statef
|
||||
*blocks; /* current inflate_blocks state */
|
||||
|
||||
};
|
||||
|
||||
|
||||
int ZEXPORT inflateReset(z)
|
||||
z_streamp z;
|
||||
{
|
||||
if (z == Z_NULL || z->state == Z_NULL)
|
||||
return Z_STREAM_ERROR;
|
||||
z->total_in = z->total_out = 0;
|
||||
z->msg = Z_NULL;
|
||||
z->state->mode = z->state->nowrap ? BLOCKS : METHOD;
|
||||
inflate_blocks_reset(z->state->blocks, z, Z_NULL);
|
||||
Tracev((stderr, "inflate: reset\n"));
|
||||
return Z_OK;
|
||||
}
|
||||
|
||||
|
||||
int ZEXPORT inflateEnd(z)
|
||||
z_streamp z;
|
||||
{
|
||||
if (z == Z_NULL || z->state == Z_NULL || z->zfree == Z_NULL)
|
||||
return Z_STREAM_ERROR;
|
||||
if (z->state->blocks != Z_NULL)
|
||||
inflate_blocks_free(z->state->blocks, z);
|
||||
ZFREE(z, z->state);
|
||||
z->state = Z_NULL;
|
||||
Tracev((stderr, "inflate: end\n"));
|
||||
return Z_OK;
|
||||
}
|
||||
|
||||
|
||||
int ZEXPORT inflateInit2_(z, w, version, stream_size)
|
||||
z_streamp z;
|
||||
int w;
|
||||
const char *version;
|
||||
int stream_size;
|
||||
{
|
||||
if (version == Z_NULL || version[0] != ZLIB_VERSION[0] ||
|
||||
stream_size != sizeof(z_stream))
|
||||
return Z_VERSION_ERROR;
|
||||
|
||||
/* initialize state */
|
||||
if (z == Z_NULL)
|
||||
return Z_STREAM_ERROR;
|
||||
z->msg = Z_NULL;
|
||||
if (z->zalloc == Z_NULL)
|
||||
{
|
||||
z->zalloc = zcalloc;
|
||||
z->opaque = (voidpf)0;
|
||||
}
|
||||
if (z->zfree == Z_NULL) z->zfree = zcfree;
|
||||
if ((z->state = (struct internal_state FAR *)
|
||||
ZALLOC(z,1,sizeof(struct internal_state))) == Z_NULL)
|
||||
return Z_MEM_ERROR;
|
||||
z->state->blocks = Z_NULL;
|
||||
|
||||
/* handle undocumented nowrap option (no zlib header or check) */
|
||||
z->state->nowrap = 0;
|
||||
if (w < 0)
|
||||
{
|
||||
w = - w;
|
||||
z->state->nowrap = 1;
|
||||
}
|
||||
|
||||
/* set window size */
|
||||
if (w < 8 || w > 15)
|
||||
{
|
||||
inflateEnd(z);
|
||||
return Z_STREAM_ERROR;
|
||||
}
|
||||
z->state->wbits = (uInt)w;
|
||||
|
||||
/* create inflate_blocks state */
|
||||
if ((z->state->blocks =
|
||||
inflate_blocks_new(z, z->state->nowrap ? Z_NULL : adler32, (uInt)1 << w))
|
||||
== Z_NULL)
|
||||
{
|
||||
inflateEnd(z);
|
||||
return Z_MEM_ERROR;
|
||||
}
|
||||
Tracev((stderr, "inflate: allocated\n"));
|
||||
|
||||
/* reset state */
|
||||
inflateReset(z);
|
||||
return Z_OK;
|
||||
}
|
||||
|
||||
|
||||
int ZEXPORT inflateInit_(z, version, stream_size)
|
||||
z_streamp z;
|
||||
const char *version;
|
||||
int stream_size;
|
||||
{
|
||||
return inflateInit2_(z, DEF_WBITS, version, stream_size);
|
||||
}
|
||||
|
||||
|
||||
#define NEEDBYTE {if(z->avail_in==0)return r;r=f;}
|
||||
#define NEXTBYTE (z->avail_in--,z->total_in++,*z->next_in++)
|
||||
|
||||
int ZEXPORT inflate(z, f)
|
||||
z_streamp z;
|
||||
int f;
|
||||
{
|
||||
int r;
|
||||
uInt b;
|
||||
|
||||
if (z == Z_NULL || z->state == Z_NULL || z->next_in == Z_NULL)
|
||||
return Z_STREAM_ERROR;
|
||||
f = f == Z_FINISH ? Z_BUF_ERROR : Z_OK;
|
||||
r = Z_BUF_ERROR;
|
||||
while (1) switch (z->state->mode)
|
||||
{
|
||||
case METHOD:
|
||||
NEEDBYTE
|
||||
if (((z->state->sub.method = NEXTBYTE) & 0xf) != Z_DEFLATED)
|
||||
{
|
||||
z->state->mode = BAD;
|
||||
z->msg = (char*)"unknown compression method";
|
||||
z->state->sub.marker = 5; /* can't try inflateSync */
|
||||
break;
|
||||
}
|
||||
if ((z->state->sub.method >> 4) + 8 > z->state->wbits)
|
||||
{
|
||||
z->state->mode = BAD;
|
||||
z->msg = (char*)"invalid window size";
|
||||
z->state->sub.marker = 5; /* can't try inflateSync */
|
||||
break;
|
||||
}
|
||||
z->state->mode = FLAG;
|
||||
case FLAG:
|
||||
NEEDBYTE
|
||||
b = NEXTBYTE;
|
||||
if (((z->state->sub.method << 8) + b) % 31)
|
||||
{
|
||||
z->state->mode = BAD;
|
||||
z->msg = (char*)"incorrect header check";
|
||||
z->state->sub.marker = 5; /* can't try inflateSync */
|
||||
break;
|
||||
}
|
||||
Tracev((stderr, "inflate: zlib header ok\n"));
|
||||
if (!(b & PRESET_DICT))
|
||||
{
|
||||
z->state->mode = BLOCKS;
|
||||
break;
|
||||
}
|
||||
z->state->mode = DICT4;
|
||||
case DICT4:
|
||||
NEEDBYTE
|
||||
z->state->sub.check.need = (uLong)NEXTBYTE << 24;
|
||||
z->state->mode = DICT3;
|
||||
case DICT3:
|
||||
NEEDBYTE
|
||||
z->state->sub.check.need += (uLong)NEXTBYTE << 16;
|
||||
z->state->mode = DICT2;
|
||||
case DICT2:
|
||||
NEEDBYTE
|
||||
z->state->sub.check.need += (uLong)NEXTBYTE << 8;
|
||||
z->state->mode = DICT1;
|
||||
case DICT1:
|
||||
NEEDBYTE
|
||||
z->state->sub.check.need += (uLong)NEXTBYTE;
|
||||
z->adler = z->state->sub.check.need;
|
||||
z->state->mode = DICT0;
|
||||
return Z_NEED_DICT;
|
||||
case DICT0:
|
||||
z->state->mode = BAD;
|
||||
z->msg = (char*)"need dictionary";
|
||||
z->state->sub.marker = 0; /* can try inflateSync */
|
||||
return Z_STREAM_ERROR;
|
||||
case BLOCKS:
|
||||
r = inflate_blocks(z->state->blocks, z, r);
|
||||
if (r == Z_DATA_ERROR)
|
||||
{
|
||||
z->state->mode = BAD;
|
||||
z->state->sub.marker = 0; /* can try inflateSync */
|
||||
break;
|
||||
}
|
||||
if (r == Z_OK)
|
||||
r = f;
|
||||
if (r != Z_STREAM_END)
|
||||
return r;
|
||||
r = f;
|
||||
inflate_blocks_reset(z->state->blocks, z, &z->state->sub.check.was);
|
||||
if (z->state->nowrap)
|
||||
{
|
||||
z->state->mode = DONE;
|
||||
break;
|
||||
}
|
||||
z->state->mode = CHECK4;
|
||||
case CHECK4:
|
||||
NEEDBYTE
|
||||
z->state->sub.check.need = (uLong)NEXTBYTE << 24;
|
||||
z->state->mode = CHECK3;
|
||||
case CHECK3:
|
||||
NEEDBYTE
|
||||
z->state->sub.check.need += (uLong)NEXTBYTE << 16;
|
||||
z->state->mode = CHECK2;
|
||||
case CHECK2:
|
||||
NEEDBYTE
|
||||
z->state->sub.check.need += (uLong)NEXTBYTE << 8;
|
||||
z->state->mode = CHECK1;
|
||||
case CHECK1:
|
||||
NEEDBYTE
|
||||
z->state->sub.check.need += (uLong)NEXTBYTE;
|
||||
|
||||
if (z->state->sub.check.was != z->state->sub.check.need)
|
||||
{
|
||||
z->state->mode = BAD;
|
||||
z->msg = (char*)"incorrect data check";
|
||||
z->state->sub.marker = 5; /* can't try inflateSync */
|
||||
break;
|
||||
}
|
||||
Tracev((stderr, "inflate: zlib check ok\n"));
|
||||
z->state->mode = DONE;
|
||||
case DONE:
|
||||
return Z_STREAM_END;
|
||||
case BAD:
|
||||
return Z_DATA_ERROR;
|
||||
default:
|
||||
return Z_STREAM_ERROR;
|
||||
}
|
||||
#ifdef NEED_DUMMY_RETURN
|
||||
return Z_STREAM_ERROR; /* Some dumb compilers complain without this */
|
||||
#endif
|
||||
}
|
||||
|
||||
|
||||
int ZEXPORT inflateSetDictionary(z, dictionary, dictLength)
|
||||
z_streamp z;
|
||||
const Bytef *dictionary;
|
||||
uInt dictLength;
|
||||
{
|
||||
uInt length = dictLength;
|
||||
|
||||
if (z == Z_NULL || z->state == Z_NULL || z->state->mode != DICT0)
|
||||
return Z_STREAM_ERROR;
|
||||
|
||||
if (adler32(1L, dictionary, dictLength) != z->adler) return Z_DATA_ERROR;
|
||||
z->adler = 1L;
|
||||
|
||||
if (length >= ((uInt)1<<z->state->wbits))
|
||||
{
|
||||
length = (1<<z->state->wbits)-1;
|
||||
dictionary += dictLength - length;
|
||||
}
|
||||
inflate_set_dictionary(z->state->blocks, dictionary, length);
|
||||
z->state->mode = BLOCKS;
|
||||
return Z_OK;
|
||||
}
|
||||
|
||||
|
||||
int ZEXPORT inflateSync(z)
|
||||
z_streamp z;
|
||||
{
|
||||
uInt n; /* number of bytes to look at */
|
||||
Bytef *p; /* pointer to bytes */
|
||||
uInt m; /* number of marker bytes found in a row */
|
||||
uLong r, w; /* temporaries to save total_in and total_out */
|
||||
|
||||
/* set up */
|
||||
if (z == Z_NULL || z->state == Z_NULL)
|
||||
return Z_STREAM_ERROR;
|
||||
if (z->state->mode != BAD)
|
||||
{
|
||||
z->state->mode = BAD;
|
||||
z->state->sub.marker = 0;
|
||||
}
|
||||
if ((n = z->avail_in) == 0)
|
||||
return Z_BUF_ERROR;
|
||||
p = z->next_in;
|
||||
m = z->state->sub.marker;
|
||||
|
||||
/* search */
|
||||
while (n && m < 4)
|
||||
{
|
||||
static const Byte mark[4] = {0, 0, 0xff, 0xff};
|
||||
if (*p == mark[m])
|
||||
m++;
|
||||
else if (*p)
|
||||
m = 0;
|
||||
else
|
||||
m = 4 - m;
|
||||
p++, n--;
|
||||
}
|
||||
|
||||
/* restore */
|
||||
z->total_in += p - z->next_in;
|
||||
z->next_in = p;
|
||||
z->avail_in = n;
|
||||
z->state->sub.marker = m;
|
||||
|
||||
/* return no joy or set up to restart on a new block */
|
||||
if (m != 4)
|
||||
return Z_DATA_ERROR;
|
||||
r = z->total_in; w = z->total_out;
|
||||
inflateReset(z);
|
||||
z->total_in = r; z->total_out = w;
|
||||
z->state->mode = BLOCKS;
|
||||
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(z)
|
||||
z_streamp z;
|
||||
{
|
||||
if (z == Z_NULL || z->state == Z_NULL || z->state->blocks == Z_NULL)
|
||||
return Z_STREAM_ERROR;
|
||||
return inflate_blocks_sync_point(z->state->blocks);
|
||||
}
|
455
Contrib/zip2exe/zlib/INFTREES.C
Normal file
|
@ -0,0 +1,455 @@
|
|||
/* inftrees.c -- generate Huffman trees for efficient decoding
|
||||
* Copyright (C) 1995-1998 Mark Adler
|
||||
* For conditions of distribution and use, see copyright notice in zlib.h
|
||||
*/
|
||||
|
||||
#include "zutil.h"
|
||||
#include "inftrees.h"
|
||||
|
||||
#if !defined(BUILDFIXED) && !defined(STDC)
|
||||
# define BUILDFIXED /* non ANSI compilers may not accept inffixed.h */
|
||||
#endif
|
||||
|
||||
const char inflate_copyright[] =
|
||||
" inflate 1.1.3 Copyright 1995-1998 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.
|
||||
*/
|
||||
struct internal_state {int dummy;}; /* for buggy compilers */
|
||||
|
||||
/* simplify the use of the inflate_huft type with some defines */
|
||||
#define exop word.what.Exop
|
||||
#define bits word.what.Bits
|
||||
|
||||
|
||||
local int huft_build OF((
|
||||
uIntf *, /* code lengths in bits */
|
||||
uInt, /* number of codes */
|
||||
uInt, /* number of "simple" codes */
|
||||
const uIntf *, /* list of base values for non-simple codes */
|
||||
const uIntf *, /* list of extra bits for non-simple codes */
|
||||
inflate_huft * FAR*,/* result: starting table */
|
||||
uIntf *, /* maximum lookup bits (returns actual) */
|
||||
inflate_huft *, /* space for trees */
|
||||
uInt *, /* hufts used in space */
|
||||
uIntf * )); /* space for values */
|
||||
|
||||
/* Tables for deflate from PKZIP's appnote.txt. */
|
||||
local const uInt cplens[31] = { /* Copy lengths for literal codes 257..285 */
|
||||
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};
|
||||
/* see note #13 above about 258 */
|
||||
local const uInt cplext[31] = { /* Extra bits for literal codes 257..285 */
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2,
|
||||
3, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 0, 112, 112}; /* 112==invalid */
|
||||
local const uInt cpdist[30] = { /* Copy offsets for distance codes 0..29 */
|
||||
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};
|
||||
local const uInt cpdext[30] = { /* Extra bits for distance codes */
|
||||
0, 0, 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6,
|
||||
7, 7, 8, 8, 9, 9, 10, 10, 11, 11,
|
||||
12, 12, 13, 13};
|
||||
|
||||
/*
|
||||
Huffman code decoding is performed using a multi-level table lookup.
|
||||
The fastest way to decode is to simply build a lookup table whose
|
||||
size is determined by the longest code. However, the time it takes
|
||||
to build this table can also be a factor if the data being decoded
|
||||
is not very long. The most common codes are necessarily the
|
||||
shortest codes, so those codes dominate the decoding time, and hence
|
||||
the speed. The idea is you can have a shorter table that decodes the
|
||||
shorter, more probable codes, and then point to subsidiary tables for
|
||||
the longer codes. The time it costs to decode the longer codes is
|
||||
then traded against the time it takes to make longer tables.
|
||||
|
||||
This results of this trade are in the variables lbits and dbits
|
||||
below. lbits is the number of bits the first level table for literal/
|
||||
length codes can decode in one step, and dbits is the same thing for
|
||||
the distance codes. Subsequent tables are also less than or equal to
|
||||
those sizes. These values may be adjusted either when all of the
|
||||
codes are shorter than that, in which case the longest code length in
|
||||
bits is used, or when the shortest code is *longer* than the requested
|
||||
table size, in which case the length of the shortest code in bits is
|
||||
used.
|
||||
|
||||
There are two different values for the two tables, since they code a
|
||||
different number of possibilities each. The literal/length table
|
||||
codes 286 possible values, or in a flat code, a little over eight
|
||||
bits. The distance table codes 30 possible values, or a little less
|
||||
than five bits, flat. The optimum values for speed end up being
|
||||
about one bit more than those, so lbits is 8+1 and dbits is 5+1.
|
||||
The optimum values may differ though from machine to machine, and
|
||||
possibly even between compilers. Your mileage may vary.
|
||||
*/
|
||||
|
||||
|
||||
/* If BMAX needs to be larger than 16, then h and x[] should be uLong. */
|
||||
#define BMAX 15 /* maximum bit length of any code */
|
||||
|
||||
local int huft_build(b, n, s, d, e, t, m, hp, hn, v)
|
||||
uIntf *b; /* code lengths in bits (all assumed <= BMAX) */
|
||||
uInt n; /* number of codes (assumed <= 288) */
|
||||
uInt s; /* number of simple-valued codes (0..s-1) */
|
||||
const uIntf *d; /* list of base values for non-simple codes */
|
||||
const uIntf *e; /* list of extra bits for non-simple codes */
|
||||
inflate_huft * FAR *t; /* result: starting table */
|
||||
uIntf *m; /* maximum lookup bits, returns actual */
|
||||
inflate_huft *hp; /* space for trees */
|
||||
uInt *hn; /* hufts used in space */
|
||||
uIntf *v; /* working area: values in order of bit length */
|
||||
/* Given a list of code lengths and a maximum table size, make a set of
|
||||
tables to decode that set of codes. Return Z_OK on success, Z_BUF_ERROR
|
||||
if the given code set is incomplete (the tables are still built in this
|
||||
case), Z_DATA_ERROR if the input is invalid (an over-subscribed set of
|
||||
lengths), or Z_MEM_ERROR if not enough memory. */
|
||||
{
|
||||
|
||||
uInt a; /* counter for codes of length k */
|
||||
uInt c[BMAX+1]; /* bit length count table */
|
||||
uInt f; /* i repeats in table every f entries */
|
||||
int g; /* maximum code length */
|
||||
int h; /* table level */
|
||||
register uInt i; /* counter, current code */
|
||||
register uInt j; /* counter */
|
||||
register int k; /* number of bits in current code */
|
||||
int l; /* bits per table (returned in m) */
|
||||
uInt mask; /* (1 << w) - 1, to avoid cc -O bug on HP */
|
||||
register uIntf *p; /* pointer into c[], b[], or v[] */
|
||||
inflate_huft *q; /* points to current table */
|
||||
struct inflate_huft_s r; /* table entry for structure assignment */
|
||||
inflate_huft *u[BMAX]; /* table stack */
|
||||
register int w; /* bits before this table == (l * h) */
|
||||
uInt x[BMAX+1]; /* bit offsets, then code stack */
|
||||
uIntf *xp; /* pointer into x */
|
||||
int y; /* number of dummy codes added */
|
||||
uInt z; /* number of entries in current table */
|
||||
|
||||
|
||||
/* Generate counts for each bit length */
|
||||
p = c;
|
||||
#define C0 *p++ = 0;
|
||||
#define C2 C0 C0 C0 C0
|
||||
#define C4 C2 C2 C2 C2
|
||||
C4 /* clear c[]--assume BMAX+1 is 16 */
|
||||
p = b; i = n;
|
||||
do {
|
||||
c[*p++]++; /* assume all entries <= BMAX */
|
||||
} while (--i);
|
||||
if (c[0] == n) /* null input--all zero length codes */
|
||||
{
|
||||
*t = (inflate_huft *)Z_NULL;
|
||||
*m = 0;
|
||||
return Z_OK;
|
||||
}
|
||||
|
||||
|
||||
/* Find minimum and maximum length, bound *m by those */
|
||||
l = *m;
|
||||
for (j = 1; j <= BMAX; j++)
|
||||
if (c[j])
|
||||
break;
|
||||
k = j; /* minimum code length */
|
||||
if ((uInt)l < j)
|
||||
l = j;
|
||||
for (i = BMAX; i; i--)
|
||||
if (c[i])
|
||||
break;
|
||||
g = i; /* maximum code length */
|
||||
if ((uInt)l > i)
|
||||
l = i;
|
||||
*m = l;
|
||||
|
||||
|
||||
/* Adjust last length count to fill out codes, if needed */
|
||||
for (y = 1 << j; j < i; j++, y <<= 1)
|
||||
if ((y -= c[j]) < 0)
|
||||
return Z_DATA_ERROR;
|
||||
if ((y -= c[i]) < 0)
|
||||
return Z_DATA_ERROR;
|
||||
c[i] += y;
|
||||
|
||||
|
||||
/* Generate starting offsets into the value table for each length */
|
||||
x[1] = j = 0;
|
||||
p = c + 1; xp = x + 2;
|
||||
while (--i) { /* note that i == g from above */
|
||||
*xp++ = (j += *p++);
|
||||
}
|
||||
|
||||
|
||||
/* Make a table of values in order of bit lengths */
|
||||
p = b; i = 0;
|
||||
do {
|
||||
if ((j = *p++) != 0)
|
||||
v[x[j]++] = i;
|
||||
} while (++i < n);
|
||||
n = x[g]; /* set n to length of v */
|
||||
|
||||
|
||||
/* Generate the Huffman codes and for each, make the table entries */
|
||||
x[0] = i = 0; /* first Huffman code is zero */
|
||||
p = v; /* grab values in bit order */
|
||||
h = -1; /* no tables yet--level -1 */
|
||||
w = -l; /* bits decoded == (l * h) */
|
||||
u[0] = (inflate_huft *)Z_NULL; /* just to keep compilers happy */
|
||||
q = (inflate_huft *)Z_NULL; /* ditto */
|
||||
z = 0; /* ditto */
|
||||
|
||||
/* go through the bit lengths (k already is bits in shortest code) */
|
||||
for (; k <= g; k++)
|
||||
{
|
||||
a = c[k];
|
||||
while (a--)
|
||||
{
|
||||
/* here i is the Huffman code of length k bits for value *p */
|
||||
/* make tables up to required level */
|
||||
while (k > w + l)
|
||||
{
|
||||
h++;
|
||||
w += l; /* previous table always l bits */
|
||||
|
||||
/* compute minimum size table less than or equal to l bits */
|
||||
z = g - w;
|
||||
z = z > (uInt)l ? l : z; /* table size upper limit */
|
||||
if ((f = 1 << (j = k - w)) > a + 1) /* try a k-w bit table */
|
||||
{ /* too few codes for k-w bit table */
|
||||
f -= a + 1; /* deduct codes from patterns left */
|
||||
xp = c + k;
|
||||
if (j < z)
|
||||
while (++j < z) /* try smaller tables up to z bits */
|
||||
{
|
||||
if ((f <<= 1) <= *++xp)
|
||||
break; /* enough codes to use up j bits */
|
||||
f -= *xp; /* else deduct codes from patterns */
|
||||
}
|
||||
}
|
||||
z = 1 << j; /* table entries for j-bit table */
|
||||
|
||||
/* allocate new table */
|
||||
if (*hn + z > MANY) /* (note: doesn't matter for fixed) */
|
||||
return Z_MEM_ERROR; /* not enough memory */
|
||||
u[h] = q = hp + *hn;
|
||||
*hn += z;
|
||||
|
||||
/* connect to last table, if there is one */
|
||||
if (h)
|
||||
{
|
||||
x[h] = i; /* save pattern for backing up */
|
||||
r.bits = (Byte)l; /* bits to dump before this table */
|
||||
r.exop = (Byte)j; /* bits in this table */
|
||||
j = i >> (w - l);
|
||||
r.base = (uInt)(q - u[h-1] - j); /* offset to this table */
|
||||
u[h-1][j] = r; /* connect to last table */
|
||||
}
|
||||
else
|
||||
*t = q; /* first table is returned result */
|
||||
}
|
||||
|
||||
/* set up table entry in r */
|
||||
r.bits = (Byte)(k - w);
|
||||
if (p >= v + n)
|
||||
r.exop = 128 + 64; /* out of values--invalid code */
|
||||
else if (*p < s)
|
||||
{
|
||||
r.exop = (Byte)(*p < 256 ? 0 : 32 + 64); /* 256 is end-of-block */
|
||||
r.base = *p++; /* simple code is just the value */
|
||||
}
|
||||
else
|
||||
{
|
||||
r.exop = (Byte)(e[*p - s] + 16 + 64);/* non-simple--look up in lists */
|
||||
r.base = d[*p++ - s];
|
||||
}
|
||||
|
||||
/* fill code-like entries with r */
|
||||
f = 1 << (k - w);
|
||||
for (j = i >> w; j < z; j += f)
|
||||
q[j] = r;
|
||||
|
||||
/* backwards increment the k-bit code i */
|
||||
for (j = 1 << (k - 1); i & j; j >>= 1)
|
||||
i ^= j;
|
||||
i ^= j;
|
||||
|
||||
/* backup over finished tables */
|
||||
mask = (1 << w) - 1; /* needed on HP, cc -O bug */
|
||||
while ((i & mask) != x[h])
|
||||
{
|
||||
h--; /* don't need to update q */
|
||||
w -= l;
|
||||
mask = (1 << w) - 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/* Return Z_BUF_ERROR if we were given an incomplete table */
|
||||
return y != 0 && g != 1 ? Z_BUF_ERROR : Z_OK;
|
||||
}
|
||||
|
||||
|
||||
int inflate_trees_bits(c, bb, tb, hp, z)
|
||||
uIntf *c; /* 19 code lengths */
|
||||
uIntf *bb; /* bits tree desired/actual depth */
|
||||
inflate_huft * FAR *tb; /* bits tree result */
|
||||
inflate_huft *hp; /* space for trees */
|
||||
z_streamp z; /* for messages */
|
||||
{
|
||||
int r;
|
||||
uInt hn = 0; /* hufts used in space */
|
||||
uIntf *v; /* work area for huft_build */
|
||||
|
||||
if ((v = (uIntf*)ZALLOC(z, 19, sizeof(uInt))) == Z_NULL)
|
||||
return Z_MEM_ERROR;
|
||||
r = huft_build(c, 19, 19, (uIntf*)Z_NULL, (uIntf*)Z_NULL,
|
||||
tb, bb, hp, &hn, v);
|
||||
if (r == Z_DATA_ERROR)
|
||||
z->msg = (char*)"oversubscribed dynamic bit lengths tree";
|
||||
else if (r == Z_BUF_ERROR || *bb == 0)
|
||||
{
|
||||
z->msg = (char*)"incomplete dynamic bit lengths tree";
|
||||
r = Z_DATA_ERROR;
|
||||
}
|
||||
ZFREE(z, v);
|
||||
return r;
|
||||
}
|
||||
|
||||
|
||||
int inflate_trees_dynamic(nl, nd, c, bl, bd, tl, td, hp, z)
|
||||
uInt nl; /* number of literal/length codes */
|
||||
uInt nd; /* number of distance codes */
|
||||
uIntf *c; /* that many (total) code lengths */
|
||||
uIntf *bl; /* literal desired/actual bit depth */
|
||||
uIntf *bd; /* distance desired/actual bit depth */
|
||||
inflate_huft * FAR *tl; /* literal/length tree result */
|
||||
inflate_huft * FAR *td; /* distance tree result */
|
||||
inflate_huft *hp; /* space for trees */
|
||||
z_streamp z; /* for messages */
|
||||
{
|
||||
int r;
|
||||
uInt hn = 0; /* hufts used in space */
|
||||
uIntf *v; /* work area for huft_build */
|
||||
|
||||
/* allocate work area */
|
||||
if ((v = (uIntf*)ZALLOC(z, 288, sizeof(uInt))) == Z_NULL)
|
||||
return Z_MEM_ERROR;
|
||||
|
||||
/* build literal/length tree */
|
||||
r = huft_build(c, nl, 257, cplens, cplext, tl, bl, hp, &hn, v);
|
||||
if (r != Z_OK || *bl == 0)
|
||||
{
|
||||
if (r == Z_DATA_ERROR)
|
||||
z->msg = (char*)"oversubscribed literal/length tree";
|
||||
else if (r != Z_MEM_ERROR)
|
||||
{
|
||||
z->msg = (char*)"incomplete literal/length tree";
|
||||
r = Z_DATA_ERROR;
|
||||
}
|
||||
ZFREE(z, v);
|
||||
return r;
|
||||
}
|
||||
|
||||
/* build distance tree */
|
||||
r = huft_build(c + nl, nd, 0, cpdist, cpdext, td, bd, hp, &hn, v);
|
||||
if (r != Z_OK || (*bd == 0 && nl > 257))
|
||||
{
|
||||
if (r == Z_DATA_ERROR)
|
||||
z->msg = (char*)"oversubscribed distance tree";
|
||||
else if (r == Z_BUF_ERROR) {
|
||||
#ifdef PKZIP_BUG_WORKAROUND
|
||||
r = Z_OK;
|
||||
}
|
||||
#else
|
||||
z->msg = (char*)"incomplete distance tree";
|
||||
r = Z_DATA_ERROR;
|
||||
}
|
||||
else if (r != Z_MEM_ERROR)
|
||||
{
|
||||
z->msg = (char*)"empty distance tree with lengths";
|
||||
r = Z_DATA_ERROR;
|
||||
}
|
||||
ZFREE(z, v);
|
||||
return r;
|
||||
#endif
|
||||
}
|
||||
|
||||
/* done */
|
||||
ZFREE(z, v);
|
||||
return Z_OK;
|
||||
}
|
||||
|
||||
|
||||
/* build fixed tables only once--keep them here */
|
||||
#ifdef BUILDFIXED
|
||||
local int fixed_built = 0;
|
||||
#define FIXEDH 544 /* number of hufts used by fixed tables */
|
||||
local inflate_huft fixed_mem[FIXEDH];
|
||||
local uInt fixed_bl;
|
||||
local uInt fixed_bd;
|
||||
local inflate_huft *fixed_tl;
|
||||
local inflate_huft *fixed_td;
|
||||
#else
|
||||
#include "inffixed.h"
|
||||
#endif
|
||||
|
||||
|
||||
int inflate_trees_fixed(bl, bd, tl, td, z)
|
||||
uIntf *bl; /* literal desired/actual bit depth */
|
||||
uIntf *bd; /* distance desired/actual bit depth */
|
||||
inflate_huft * FAR *tl; /* literal/length tree result */
|
||||
inflate_huft * FAR *td; /* distance tree result */
|
||||
z_streamp z; /* for memory allocation */
|
||||
{
|
||||
#ifdef BUILDFIXED
|
||||
/* build fixed tables if not already */
|
||||
if (!fixed_built)
|
||||
{
|
||||
int k; /* temporary variable */
|
||||
uInt f = 0; /* number of hufts used in fixed_mem */
|
||||
uIntf *c; /* length list for huft_build */
|
||||
uIntf *v; /* work area for huft_build */
|
||||
|
||||
/* allocate memory */
|
||||
if ((c = (uIntf*)ZALLOC(z, 288, sizeof(uInt))) == Z_NULL)
|
||||
return Z_MEM_ERROR;
|
||||
if ((v = (uIntf*)ZALLOC(z, 288, sizeof(uInt))) == Z_NULL)
|
||||
{
|
||||
ZFREE(z, c);
|
||||
return Z_MEM_ERROR;
|
||||
}
|
||||
|
||||
/* literal table */
|
||||
for (k = 0; k < 144; k++)
|
||||
c[k] = 8;
|
||||
for (; k < 256; k++)
|
||||
c[k] = 9;
|
||||
for (; k < 280; k++)
|
||||
c[k] = 7;
|
||||
for (; k < 288; k++)
|
||||
c[k] = 8;
|
||||
fixed_bl = 9;
|
||||
huft_build(c, 288, 257, cplens, cplext, &fixed_tl, &fixed_bl,
|
||||
fixed_mem, &f, v);
|
||||
|
||||
/* distance table */
|
||||
for (k = 0; k < 30; k++)
|
||||
c[k] = 5;
|
||||
fixed_bd = 5;
|
||||
huft_build(c, 30, 0, cpdist, cpdext, &fixed_td, &fixed_bd,
|
||||
fixed_mem, &f, v);
|
||||
|
||||
/* done */
|
||||
ZFREE(z, v);
|
||||
ZFREE(z, c);
|
||||
fixed_built = 1;
|
||||
}
|
||||
#endif
|
||||
*bl = fixed_bl;
|
||||
*bd = fixed_bd;
|
||||
*tl = fixed_tl;
|
||||
*td = fixed_td;
|
||||
return Z_OK;
|
||||
}
|
58
Contrib/zip2exe/zlib/INFTREES.H
Normal file
|
@ -0,0 +1,58 @@
|
|||
/* inftrees.h -- header to use inftrees.c
|
||||
* Copyright (C) 1995-1998 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.
|
||||
*/
|
||||
|
||||
/* Huffman code lookup table entry--this entry is four bytes for machines
|
||||
that have 16-bit pointers (e.g. PC's in the small or medium model). */
|
||||
|
||||
typedef struct inflate_huft_s FAR inflate_huft;
|
||||
|
||||
struct inflate_huft_s {
|
||||
union {
|
||||
struct {
|
||||
Byte Exop; /* number of extra bits or operation */
|
||||
Byte Bits; /* number of bits in this code or subcode */
|
||||
} what;
|
||||
uInt pad; /* pad structure to a power of 2 (4 bytes for */
|
||||
} word; /* 16-bit, 8 bytes for 32-bit int's) */
|
||||
uInt base; /* literal, length base, distance base,
|
||||
or table offset */
|
||||
};
|
||||
|
||||
/* Maximum size of dynamic tree. The maximum found in a long but non-
|
||||
exhaustive search was 1004 huft structures (850 for length/literals
|
||||
and 154 for distances, the latter actually the result of an
|
||||
exhaustive search). The actual maximum is not known, but the
|
||||
value below is more than safe. */
|
||||
#define MANY 1440
|
||||
|
||||
extern int inflate_trees_bits OF((
|
||||
uIntf *, /* 19 code lengths */
|
||||
uIntf *, /* bits tree desired/actual depth */
|
||||
inflate_huft * FAR *, /* bits tree result */
|
||||
inflate_huft *, /* space for trees */
|
||||
z_streamp)); /* for messages */
|
||||
|
||||
extern int inflate_trees_dynamic OF((
|
||||
uInt, /* number of literal/length codes */
|
||||
uInt, /* number of distance codes */
|
||||
uIntf *, /* that many (total) code lengths */
|
||||
uIntf *, /* literal desired/actual bit depth */
|
||||
uIntf *, /* distance desired/actual bit depth */
|
||||
inflate_huft * FAR *, /* literal/length tree result */
|
||||
inflate_huft * FAR *, /* distance tree result */
|
||||
inflate_huft *, /* space for trees */
|
||||
z_streamp)); /* for messages */
|
||||
|
||||
extern int inflate_trees_fixed OF((
|
||||
uIntf *, /* literal desired/actual bit depth */
|
||||
uIntf *, /* distance desired/actual bit depth */
|
||||
inflate_huft * FAR *, /* literal/length tree result */
|
||||
inflate_huft * FAR *, /* distance tree result */
|
||||
z_streamp)); /* for memory allocation */
|
87
Contrib/zip2exe/zlib/INFUTIL.C
Normal file
|
@ -0,0 +1,87 @@
|
|||
/* inflate_util.c -- data and routines common to blocks and codes
|
||||
* Copyright (C) 1995-1998 Mark Adler
|
||||
* For conditions of distribution and use, see copyright notice in zlib.h
|
||||
*/
|
||||
|
||||
#include "zutil.h"
|
||||
#include "infblock.h"
|
||||
#include "inftrees.h"
|
||||
#include "infcodes.h"
|
||||
#include "infutil.h"
|
||||
|
||||
struct inflate_codes_state {int dummy;}; /* for buggy compilers */
|
||||
|
||||
/* And'ing with mask[n] masks the lower n bits */
|
||||
uInt inflate_mask[17] = {
|
||||
0x0000,
|
||||
0x0001, 0x0003, 0x0007, 0x000f, 0x001f, 0x003f, 0x007f, 0x00ff,
|
||||
0x01ff, 0x03ff, 0x07ff, 0x0fff, 0x1fff, 0x3fff, 0x7fff, 0xffff
|
||||
};
|
||||
|
||||
|
||||
/* copy as much as possible from the sliding window to the output area */
|
||||
int inflate_flush(s, z, r)
|
||||
inflate_blocks_statef *s;
|
||||
z_streamp z;
|
||||
int r;
|
||||
{
|
||||
uInt n;
|
||||
Bytef *p;
|
||||
Bytef *q;
|
||||
|
||||
/* local copies of source and destination pointers */
|
||||
p = z->next_out;
|
||||
q = s->read;
|
||||
|
||||
/* compute number of bytes to copy as far as end of window */
|
||||
n = (uInt)((q <= s->write ? s->write : s->end) - q);
|
||||
if (n > z->avail_out) n = z->avail_out;
|
||||
if (n && r == Z_BUF_ERROR) r = Z_OK;
|
||||
|
||||
/* update counters */
|
||||
z->avail_out -= n;
|
||||
z->total_out += n;
|
||||
|
||||
/* update check information */
|
||||
if (s->checkfn != Z_NULL)
|
||||
z->adler = s->check = (*s->checkfn)(s->check, q, n);
|
||||
|
||||
/* copy as far as end of window */
|
||||
zmemcpy(p, q, n);
|
||||
p += n;
|
||||
q += n;
|
||||
|
||||
/* see if more to copy at beginning of window */
|
||||
if (q == s->end)
|
||||
{
|
||||
/* wrap pointers */
|
||||
q = s->window;
|
||||
if (s->write == s->end)
|
||||
s->write = s->window;
|
||||
|
||||
/* compute bytes to copy */
|
||||
n = (uInt)(s->write - q);
|
||||
if (n > z->avail_out) n = z->avail_out;
|
||||
if (n && r == Z_BUF_ERROR) r = Z_OK;
|
||||
|
||||
/* update counters */
|
||||
z->avail_out -= n;
|
||||
z->total_out += n;
|
||||
|
||||
/* update check information */
|
||||
if (s->checkfn != Z_NULL)
|
||||
z->adler = s->check = (*s->checkfn)(s->check, q, n);
|
||||
|
||||
/* copy */
|
||||
zmemcpy(p, q, n);
|
||||
p += n;
|
||||
q += n;
|
||||
}
|
||||
|
||||
/* update pointers */
|
||||
z->next_out = p;
|
||||
s->read = q;
|
||||
|
||||
/* done */
|
||||
return r;
|
||||
}
|
98
Contrib/zip2exe/zlib/INFUTIL.H
Normal file
|
@ -0,0 +1,98 @@
|
|||
/* infutil.h -- types and macros common to blocks and codes
|
||||
* Copyright (C) 1995-1998 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.
|
||||
*/
|
||||
|
||||
#ifndef _INFUTIL_H
|
||||
#define _INFUTIL_H
|
||||
|
||||
typedef enum {
|
||||
TYPE, /* get type bits (3, including end bit) */
|
||||
LENS, /* get lengths for stored */
|
||||
STORED, /* processing stored block */
|
||||
TABLE, /* get table lengths */
|
||||
BTREE, /* get bit lengths tree for a dynamic block */
|
||||
DTREE, /* get length, distance trees for a dynamic block */
|
||||
CODES, /* processing fixed or dynamic block */
|
||||
DRY, /* output remaining window bytes */
|
||||
DONE, /* finished last block, done */
|
||||
BAD} /* got a data error--stuck here */
|
||||
inflate_block_mode;
|
||||
|
||||
/* inflate blocks semi-private state */
|
||||
struct inflate_blocks_state {
|
||||
|
||||
/* mode */
|
||||
inflate_block_mode mode; /* current inflate_block mode */
|
||||
|
||||
/* mode dependent information */
|
||||
union {
|
||||
uInt left; /* if STORED, bytes left to copy */
|
||||
struct {
|
||||
uInt table; /* table lengths (14 bits) */
|
||||
uInt index; /* index into blens (or border) */
|
||||
uIntf *blens; /* bit lengths of codes */
|
||||
uInt bb; /* bit length tree depth */
|
||||
inflate_huft *tb; /* bit length decoding tree */
|
||||
} trees; /* if DTREE, decoding info for trees */
|
||||
struct {
|
||||
inflate_codes_statef
|
||||
*codes;
|
||||
} decode; /* if CODES, current state */
|
||||
} sub; /* submode */
|
||||
uInt last; /* true if this block is the last block */
|
||||
|
||||
/* mode independent information */
|
||||
uInt bitk; /* bits in bit buffer */
|
||||
uLong bitb; /* bit buffer */
|
||||
inflate_huft *hufts; /* single malloc for tree space */
|
||||
Bytef *window; /* sliding window */
|
||||
Bytef *end; /* one byte after sliding window */
|
||||
Bytef *read; /* window read pointer */
|
||||
Bytef *write; /* window write pointer */
|
||||
check_func checkfn; /* check function */
|
||||
uLong check; /* check on output */
|
||||
|
||||
};
|
||||
|
||||
|
||||
/* defines for inflate input/output */
|
||||
/* update pointers and return */
|
||||
#define UPDBITS {s->bitb=b;s->bitk=k;}
|
||||
#define UPDIN {z->avail_in=n;z->total_in+=p-z->next_in;z->next_in=p;}
|
||||
#define UPDOUT {s->write=q;}
|
||||
#define UPDATE {UPDBITS UPDIN UPDOUT}
|
||||
#define LEAVE {UPDATE return inflate_flush(s,z,r);}
|
||||
/* get bytes and bits */
|
||||
#define LOADIN {p=z->next_in;n=z->avail_in;b=s->bitb;k=s->bitk;}
|
||||
#define NEEDBYTE {if(n)r=Z_OK;else LEAVE}
|
||||
#define NEXTBYTE (n--,*p++)
|
||||
#define NEEDBITS(j) {while(k<(j)){NEEDBYTE;b|=((uLong)NEXTBYTE)<<k;k+=8;}}
|
||||
#define DUMPBITS(j) {b>>=(j);k-=(j);}
|
||||
/* output bytes */
|
||||
#define WAVAIL (uInt)(q<s->read?s->read-q-1:s->end-q)
|
||||
#define LOADOUT {q=s->write;m=(uInt)WAVAIL;}
|
||||
#define WRAP {if(q==s->end&&s->read!=s->window){q=s->window;m=(uInt)WAVAIL;}}
|
||||
#define FLUSH {UPDOUT r=inflate_flush(s,z,r); LOADOUT}
|
||||
#define NEEDOUT {if(m==0){WRAP if(m==0){FLUSH WRAP if(m==0) LEAVE}}r=Z_OK;}
|
||||
#define OUTBYTE(a) {*q++=(Byte)(a);m--;}
|
||||
/* load local pointers */
|
||||
#define LOAD {LOADIN LOADOUT}
|
||||
|
||||
/* masks for lower bits (size given to avoid silly warnings with Visual C++) */
|
||||
extern uInt inflate_mask[17];
|
||||
|
||||
/* copy as much as possible from the sliding window to the output area */
|
||||
extern int inflate_flush OF((
|
||||
inflate_blocks_statef *,
|
||||
z_streamp ,
|
||||
int));
|
||||
|
||||
struct internal_state {int dummy;}; /* for buggy compilers */
|
||||
|
||||
#endif
|
275
Contrib/zip2exe/zlib/UNZIP.H
Normal file
|
@ -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 */
|
1295
Contrib/zip2exe/zlib/Unzip.c
Normal file
279
Contrib/zip2exe/zlib/ZCONF.H
Normal file
|
@ -0,0 +1,279 @@
|
|||
/* zconf.h -- configuration of the zlib compression library
|
||||
* Copyright (C) 1995-1998 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 inflateInit2_ z_inflateInit2_
|
||||
# define inflateSetDictionary z_inflateSetDictionary
|
||||
# define inflateSync z_inflateSync
|
||||
# define inflateSyncPoint z_inflateSyncPoint
|
||||
# define inflateReset z_inflateReset
|
||||
# define compress z_compress
|
||||
# define compress2 z_compress2
|
||||
# define uncompress z_uncompress
|
||||
# define adler32 z_adler32
|
||||
# define crc32 z_crc32
|
||||
# define get_crc_table z_get_crc_table
|
||||
|
||||
# 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(_WIN32) || defined(__WIN32__)) && !defined(WIN32)
|
||||
# define WIN32
|
||||
#endif
|
||||
#if defined(__GNUC__) || defined(WIN32) || defined(__386__) || defined(i386)
|
||||
# ifndef __32BIT__
|
||||
# define __32BIT__
|
||||
# endif
|
||||
#endif
|
||||
#if defined(__MSDOS__) && !defined(MSDOS)
|
||||
# define MSDOS
|
||||
#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).
|
||||
*/
|
||||
#if defined(MSDOS) && !defined(__32BIT__)
|
||||
# define MAXSEG_64K
|
||||
#endif
|
||||
#ifdef MSDOS
|
||||
# define UNALIGNED_OK
|
||||
#endif
|
||||
|
||||
#if (defined(MSDOS) || defined(_WINDOWS) || defined(WIN32)) && !defined(STDC)
|
||||
# define STDC
|
||||
#endif
|
||||
#if defined(__STDC__) || defined(__cplusplus) || defined(__OS2__)
|
||||
# ifndef STDC
|
||||
# define STDC
|
||||
# endif
|
||||
#endif
|
||||
|
||||
#ifndef STDC
|
||||
# ifndef const /* cannot use !defined(STDC) && !defined(const) on Mac */
|
||||
# define const
|
||||
# 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
|
||||
|
||||
/* Old Borland C incorrectly complains about missing returns: */
|
||||
#if defined(__BORLANDC__) && (__BORLANDC__ < 0x500)
|
||||
# define NEED_DUMMY_RETURN
|
||||
#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.
|
||||
*/
|
||||
#if (defined(M_I86SM) || defined(M_I86MM)) && !defined(__32BIT__)
|
||||
/* MSC small or medium model */
|
||||
# define SMALL_MEDIUM
|
||||
# ifdef _MSC_VER
|
||||
# define FAR _far
|
||||
# else
|
||||
# define FAR far
|
||||
# endif
|
||||
#endif
|
||||
#if defined(__BORLANDC__) && (defined(__SMALL__) || defined(__MEDIUM__))
|
||||
# ifndef __32BIT__
|
||||
# define SMALL_MEDIUM
|
||||
# define FAR _far
|
||||
# endif
|
||||
#endif
|
||||
|
||||
/* Compile with -DZLIB_DLL for Windows DLL support */
|
||||
#if defined(ZLIB_DLL)
|
||||
# if defined(_WINDOWS) || defined(WINDOWS)
|
||||
# ifdef FAR
|
||||
# undef FAR
|
||||
# endif
|
||||
# include <windows.h>
|
||||
# define ZEXPORT WINAPI
|
||||
# ifdef WIN32
|
||||
# define ZEXPORTVA WINAPIV
|
||||
# else
|
||||
# define ZEXPORTVA FAR _cdecl _export
|
||||
# endif
|
||||
# endif
|
||||
# if defined (__BORLANDC__)
|
||||
# if (__BORLANDC__ >= 0x0500) && defined (WIN32)
|
||||
# include <windows.h>
|
||||
# define ZEXPORT __declspec(dllexport) WINAPI
|
||||
# define ZEXPORTRVA __declspec(dllexport) WINAPIV
|
||||
# else
|
||||
# if defined (_Windows) && defined (__DLL__)
|
||||
# define ZEXPORT _export
|
||||
# define ZEXPORTVA _export
|
||||
# endif
|
||||
# endif
|
||||
# endif
|
||||
#endif
|
||||
|
||||
#if defined (__BEOS__)
|
||||
# if defined (ZLIB_DLL)
|
||||
# define ZEXTERN extern __declspec(dllexport)
|
||||
# else
|
||||
# define ZEXTERN extern __declspec(dllimport)
|
||||
# endif
|
||||
#endif
|
||||
|
||||
#ifndef ZEXPORT
|
||||
# define ZEXPORT
|
||||
#endif
|
||||
#ifndef ZEXPORTVA
|
||||
# define ZEXPORTVA
|
||||
#endif
|
||||
#ifndef ZEXTERN
|
||||
# define ZEXTERN extern
|
||||
#endif
|
||||
|
||||
#ifndef FAR
|
||||
# define FAR
|
||||
#endif
|
||||
|
||||
#if !defined(MACOS) && !defined(TARGET_OS_MAC)
|
||||
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 FAR *voidpf;
|
||||
typedef void *voidp;
|
||||
#else
|
||||
typedef Byte FAR *voidpf;
|
||||
typedef Byte *voidp;
|
||||
#endif
|
||||
|
||||
#ifdef HAVE_UNISTD_H
|
||||
# include <sys/types.h> /* for off_t */
|
||||
# include <unistd.h> /* for SEEK_* and off_t */
|
||||
# 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
|
||||
|
||||
/* 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(inflateInit_,"ININ")
|
||||
# pragma map(inflateInit2_,"ININ2")
|
||||
# pragma map(inflateEnd,"INEND")
|
||||
# pragma map(inflateSync,"INSY")
|
||||
# pragma map(inflateSetDictionary,"INSEDI")
|
||||
# pragma map(inflate_blocks,"INBL")
|
||||
# pragma map(inflate_blocks_new,"INBLNE")
|
||||
# pragma map(inflate_blocks_free,"INBLFR")
|
||||
# pragma map(inflate_blocks_reset,"INBLRE")
|
||||
# pragma map(inflate_codes_free,"INCOFR")
|
||||
# pragma map(inflate_codes,"INCO")
|
||||
# pragma map(inflate_fast,"INFA")
|
||||
# pragma map(inflate_flush,"INFLU")
|
||||
# pragma map(inflate_mask,"INMA")
|
||||
# pragma map(inflate_set_dictionary,"INSEDI2")
|
||||
# pragma map(inflate_copyright,"INCOPY")
|
||||
# pragma map(inflate_trees_bits,"INTRBI")
|
||||
# pragma map(inflate_trees_dynamic,"INTRDY")
|
||||
# pragma map(inflate_trees_fixed,"INTRFI")
|
||||
# pragma map(inflate_trees_free,"INTRFR")
|
||||
#endif
|
||||
|
||||
#endif /* _ZCONF_H */
|
893
Contrib/zip2exe/zlib/ZLIB.H
Normal file
|
@ -0,0 +1,893 @@
|
|||
/* zlib.h -- interface of the 'zlib' general purpose compression library
|
||||
version 1.1.3, July 9th, 1998
|
||||
|
||||
Copyright (C) 1995-1998 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 ftp://ds.internic.net/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.1.3"
|
||||
|
||||
/*
|
||||
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 library also supports reading and writing files in gzip (.gz) format
|
||||
with an interface similar to that of stdio.
|
||||
|
||||
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
|
||||
/* Allowed flush values; see deflate() 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_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 */
|
||||
|
||||
#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).
|
||||
|
||||
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
|
||||
0.1% larger than avail_in plus 12 bytes. 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).
|
||||
*/
|
||||
|
||||
|
||||
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 some
|
||||
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.
|
||||
|
||||
If the parameter flush is set to Z_SYNC_FLUSH, inflate flushes as much
|
||||
output as possible to the output buffer. The flushing behavior of inflate is
|
||||
not specified for values of the flush parameter other than Z_SYNC_FLUSH
|
||||
and Z_FINISH, but the current implementation actually flushes as much output
|
||||
as possible anyway.
|
||||
|
||||
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 routine
|
||||
may be used for the single inflate() call.
|
||||
|
||||
If a preset dictionary is needed at this point (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() 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
|
||||
adler32 checksum), 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. In the Z_DATA_ERROR
|
||||
case, the application may then call inflateSync to look for a good
|
||||
compression block.
|
||||
*/
|
||||
|
||||
|
||||
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.
|
||||
|
||||
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), or Z_HUFFMAN_ONLY to force Huffman encoding only (no
|
||||
string match). 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. 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.)
|
||||
|
||||
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 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. 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.
|
||||
|
||||
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 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).
|
||||
*/
|
||||
|
||||
|
||||
/* 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 0.1% larger than
|
||||
sourceLen plus 12 bytes. 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 0.1% larger than sourceLen plus
|
||||
12 bytes. 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 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.
|
||||
*/
|
||||
|
||||
|
||||
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". (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,
|
||||
const voidp 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).
|
||||
*/
|
||||
|
||||
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 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.
|
||||
*/
|
||||
|
||||
/* 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));
|
||||
#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))
|
||||
|
||||
|
||||
#if !defined(_Z_UTIL_H) && !defined(NO_DUMMY_DECL)
|
||||
struct internal_state {int dummy;}; /* hack for buggy compilers */
|
||||
#endif
|
||||
|
||||
ZEXTERN const char * ZEXPORT zError OF((int err));
|
||||
ZEXTERN int ZEXPORT inflateSyncPoint OF((z_streamp z));
|
||||
ZEXTERN const uLongf * ZEXPORT get_crc_table OF((void));
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* _ZLIB_H */
|
220
Contrib/zip2exe/zlib/ZUTIL.H
Normal file
|
@ -0,0 +1,220 @@
|
|||
/* zutil.h -- internal interface and configuration of the compression library
|
||||
* Copyright (C) 1995-1998 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 _Z_UTIL_H
|
||||
#define _Z_UTIL_H
|
||||
|
||||
#include "zlib.h"
|
||||
|
||||
#ifdef STDC
|
||||
# include <stddef.h>
|
||||
# include <string.h>
|
||||
# include <stdlib.h>
|
||||
#endif
|
||||
#ifdef NO_ERRNO_H
|
||||
extern int errno;
|
||||
#else
|
||||
# include <errno.h>
|
||||
#endif
|
||||
|
||||
#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 *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 */
|
||||
|
||||
#ifdef MSDOS
|
||||
# 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 <alloc.h>
|
||||
# endif
|
||||
# else /* MSC or DJGPP */
|
||||
# include <malloc.h>
|
||||
# endif
|
||||
#endif
|
||||
|
||||
#ifdef OS2
|
||||
# define OS_CODE 0x06
|
||||
#endif
|
||||
|
||||
#ifdef WIN32 /* Window 95 & Windows NT */
|
||||
# define OS_CODE 0x0b
|
||||
#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
|
||||
|
||||
#ifdef AMIGA
|
||||
# define OS_CODE 0x01
|
||||
#endif
|
||||
|
||||
#if defined(ATARI) || defined(atarist)
|
||||
# define OS_CODE 0x05
|
||||
#endif
|
||||
|
||||
#if defined(MACOS) || defined(TARGET_OS_MAC)
|
||||
# define OS_CODE 0x07
|
||||
# if defined(__MWERKS__) && __dest_os != __be_os && __dest_os != __win32_os
|
||||
# include <unix.h> /* for fdopen */
|
||||
# else
|
||||
# ifndef fdopen
|
||||
# define fdopen(fd,mode) NULL /* No fdopen() */
|
||||
# endif
|
||||
# endif
|
||||
#endif
|
||||
|
||||
#ifdef __50SERIES /* Prime/PRIMOS */
|
||||
# define OS_CODE 0x0F
|
||||
#endif
|
||||
|
||||
#ifdef TOPS20
|
||||
# define OS_CODE 0x0a
|
||||
#endif
|
||||
|
||||
#if defined(_BEOS_) || defined(RISCOS)
|
||||
# define fdopen(fd,mode) NULL /* No fdopen() */
|
||||
#endif
|
||||
|
||||
#if (defined(_MSC_VER) && (_MSC_VER > 600))
|
||||
# define fdopen(fd,type) _fdopen(fd,type)
|
||||
#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 */
|
||||
|
||||
#ifdef HAVE_STRERROR
|
||||
extern char *strerror OF((int));
|
||||
# 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 <stdio.h>
|
||||
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
|
||||
|
||||
|
||||
typedef uLong (ZEXPORT *check_func) OF((uLong check, const Bytef *buf,
|
||||
uInt len));
|
||||
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 /* _Z_UTIL_H */
|
226
Contrib/zip2exe/zlib/Zutil.c
Normal file
|
@ -0,0 +1,226 @@
|
|||
/* zutil.c -- target dependent utility functions for the compression library
|
||||
* Copyright (C) 1995-1998 Jean-loup Gailly.
|
||||
* For conditions of distribution and use, see copyright notice in zlib.h
|
||||
*/
|
||||
|
||||
/* @(#) $Id$ */
|
||||
#include <windows.h>
|
||||
|
||||
#include "zutil.h"
|
||||
|
||||
struct internal_state {int dummy;}; /* for buggy compilers */
|
||||
|
||||
#ifndef STDC
|
||||
extern void exit OF((int));
|
||||
#endif
|
||||
|
||||
const char *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) */
|
||||
""};
|
||||
|
||||
|
||||
const char * ZEXPORT zlibVersion()
|
||||
{
|
||||
return ZLIB_VERSION;
|
||||
}
|
||||
|
||||
#ifdef DEBUG
|
||||
|
||||
# ifndef verbose
|
||||
# define verbose 0
|
||||
# endif
|
||||
int z_verbose = verbose;
|
||||
|
||||
void z_error (m)
|
||||
char *m;
|
||||
{
|
||||
fprintf(stderr, "%s\n", m);
|
||||
exit(1);
|
||||
}
|
||||
#endif
|
||||
|
||||
/* exported to allow conversion of error code to string for compress() and
|
||||
* uncompress()
|
||||
*/
|
||||
const char * ZEXPORT zError(err)
|
||||
int err;
|
||||
{
|
||||
return ERR_MSG(err);
|
||||
}
|
||||
|
||||
|
||||
#ifndef HAVE_MEMCPY
|
||||
|
||||
void zmemcpy(dest, source, len)
|
||||
Bytef* dest;
|
||||
const Bytef* source;
|
||||
uInt len;
|
||||
{
|
||||
if (len == 0) return;
|
||||
do {
|
||||
*dest++ = *source++; /* ??? to be unrolled */
|
||||
} while (--len != 0);
|
||||
}
|
||||
|
||||
int zmemcmp(s1, s2, len)
|
||||
const Bytef* s1;
|
||||
const Bytef* s2;
|
||||
uInt len;
|
||||
{
|
||||
uInt j;
|
||||
|
||||
for (j = 0; j < len; j++) {
|
||||
if (s1[j] != s2[j]) return 2*(s1[j] > s2[j])-1;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
void zmemzero(dest, len)
|
||||
Bytef* dest;
|
||||
uInt len;
|
||||
{
|
||||
if (len == 0) return;
|
||||
do {
|
||||
*dest++ = 0; /* ??? to be unrolled */
|
||||
} while (--len != 0);
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifdef __TURBOC__
|
||||
#if (defined( __BORLANDC__) || !defined(SMALL_MEDIUM)) && !defined(__32BIT__)
|
||||
/* Small and medium model in Turbo C are for now limited to near allocation
|
||||
* with reduced MAX_WBITS and MAX_MEM_LEVEL
|
||||
*/
|
||||
# define MY_ZCALLOC
|
||||
|
||||
/* Turbo C malloc() does not allow dynamic allocation of 64K bytes
|
||||
* and farmalloc(64K) returns a pointer with an offset of 8, so we
|
||||
* must fix the pointer. Warning: the pointer must be put back to its
|
||||
* original form in order to free it, use zcfree().
|
||||
*/
|
||||
|
||||
#define MAX_PTR 10
|
||||
/* 10*64K = 640K */
|
||||
|
||||
local int next_ptr = 0;
|
||||
|
||||
typedef struct ptr_table_s {
|
||||
voidpf org_ptr;
|
||||
voidpf new_ptr;
|
||||
} ptr_table;
|
||||
|
||||
local ptr_table table[MAX_PTR];
|
||||
/* This table is used to remember the original form of pointers
|
||||
* to large buffers (64K). Such pointers are normalized with a zero offset.
|
||||
* Since MSDOS is not a preemptive multitasking OS, this table is not
|
||||
* protected from concurrent access. This hack doesn't work anyway on
|
||||
* a protected system like OS/2. Use Microsoft C instead.
|
||||
*/
|
||||
|
||||
voidpf zcalloc (voidpf opaque, unsigned items, unsigned size)
|
||||
{
|
||||
voidpf buf = opaque; /* just to make some compilers happy */
|
||||
ulg bsize = (ulg)items*size;
|
||||
|
||||
/* If we allocate less than 65520 bytes, we assume that farmalloc
|
||||
* will return a usable pointer which doesn't have to be normalized.
|
||||
*/
|
||||
if (bsize < 65520L) {
|
||||
buf = farmalloc(bsize);
|
||||
if (*(ush*)&buf != 0) return buf;
|
||||
} else {
|
||||
buf = farmalloc(bsize + 16L);
|
||||
}
|
||||
if (buf == NULL || next_ptr >= MAX_PTR) return NULL;
|
||||
table[next_ptr].org_ptr = buf;
|
||||
|
||||
/* Normalize the pointer to seg:0 */
|
||||
*((ush*)&buf+1) += ((ush)((uch*)buf-0) + 15) >> 4;
|
||||
*(ush*)&buf = 0;
|
||||
table[next_ptr++].new_ptr = buf;
|
||||
return buf;
|
||||
}
|
||||
|
||||
void zcfree (voidpf opaque, voidpf ptr)
|
||||
{
|
||||
int n;
|
||||
if (*(ush*)&ptr != 0) { /* object < 64K */
|
||||
farfree(ptr);
|
||||
return;
|
||||
}
|
||||
/* Find the original pointer */
|
||||
for (n = 0; n < next_ptr; n++) {
|
||||
if (ptr != table[n].new_ptr) continue;
|
||||
|
||||
farfree(table[n].org_ptr);
|
||||
while (++n < next_ptr) {
|
||||
table[n-1] = table[n];
|
||||
}
|
||||
next_ptr--;
|
||||
return;
|
||||
}
|
||||
ptr = opaque; /* just to make some compilers happy */
|
||||
Assert(0, "zcfree: ptr not found");
|
||||
}
|
||||
#endif
|
||||
#endif /* __TURBOC__ */
|
||||
|
||||
|
||||
#if defined(M_I86) && !defined(__32BIT__)
|
||||
/* Microsoft C in 16-bit mode */
|
||||
|
||||
# define MY_ZCALLOC
|
||||
|
||||
#if (!defined(_MSC_VER) || (_MSC_VER <= 600))
|
||||
# define _halloc halloc
|
||||
# define _hfree hfree
|
||||
#endif
|
||||
|
||||
voidpf zcalloc (voidpf opaque, unsigned items, unsigned size)
|
||||
{
|
||||
if (opaque) opaque = 0; /* to make compiler happy */
|
||||
return _halloc((long)items, size);
|
||||
}
|
||||
|
||||
void zcfree (voidpf opaque, voidpf ptr)
|
||||
{
|
||||
if (opaque) opaque = 0; /* to make compiler happy */
|
||||
_hfree(ptr);
|
||||
}
|
||||
|
||||
#endif /* MSC */
|
||||
|
||||
|
||||
#ifndef MY_ZCALLOC /* Any system without a special alloc function */
|
||||
|
||||
#ifndef STDC
|
||||
extern voidp calloc OF((uInt items, uInt size));
|
||||
extern void free OF((voidpf ptr));
|
||||
#endif
|
||||
|
||||
voidpf zcalloc (opaque, items, size)
|
||||
voidpf opaque;
|
||||
unsigned items;
|
||||
unsigned size;
|
||||
{
|
||||
if (opaque) items += size - size; /* make compiler happy */
|
||||
return (voidpf)GlobalAlloc(GPTR,items*size);
|
||||
}
|
||||
|
||||
void zcfree (opaque, ptr)
|
||||
voidpf opaque;
|
||||
voidpf ptr;
|
||||
{
|
||||
if (ptr) GlobalFree(ptr);
|
||||
if (opaque) return; /* make compiler happy */
|
||||
}
|
||||
|
||||
#endif /* MY_ZCALLOC */
|
164
Examples/WinMessages.NSH
Normal file
|
@ -0,0 +1,164 @@
|
|||
; KiCHiK put together this list of WM_ messages.
|
||||
|
||||
!define WM_NULL 0x0
|
||||
!define WM_CREATE 0x1
|
||||
!define WM_DESTROY 0x2
|
||||
!define WM_MOVE 0x3
|
||||
!define WM_SIZE 0x5
|
||||
!define WM_SETFOCUS 0x7
|
||||
!define WM_KILLFOCUS 0x8
|
||||
!define WM_ENABLE 0xA
|
||||
!define WM_SETREDRAW 0xB
|
||||
!define WM_SETTEXT 0xC
|
||||
!define WM_GETTEXT 0xD
|
||||
!define WM_GETTEXTLENGTH 0xE
|
||||
!define WM_PAINT 0xF
|
||||
!define WM_CLOSE 0x10
|
||||
!define WM_QUERYENDSESSION 0x11
|
||||
!define WM_QUIT 0x12
|
||||
!define WM_QUERYOPEN 0x13
|
||||
!define WM_ERASEBKGND 0x14
|
||||
!define WM_SYSCOLORCHANGE 0x15
|
||||
!define WM_ENDSESSION 0x16
|
||||
!define WM_SHOWWINDOW 0x18
|
||||
!define WM_WININICHANGE 0x1A
|
||||
!define WM_DEVMODECHANGE 0x1B
|
||||
!define WM_ACTIVATEAPP 0x1C
|
||||
!define WM_FONTCHANGE 0x1D
|
||||
!define WM_TIMECHANGE 0x1E
|
||||
!define WM_CANCELMODE 0x1F
|
||||
!define WM_SETCURSOR 0x20
|
||||
!define WM_MOUSEACTIVATE 0x21
|
||||
!define WM_CHILDACTIVATE 0x22
|
||||
!define WM_QUEUESYNC 0x23
|
||||
!define WM_GETMINMAXINFO 0x24
|
||||
!define WM_PAINTICON 0x26
|
||||
!define WM_ICONERASEBKGND 0x27
|
||||
!define WM_NEXTDLGCTL 0x28
|
||||
!define WM_SPOOLERSTATUS 0x2A
|
||||
!define WM_DRAWITEM 0x2B
|
||||
!define WM_MEASUREITEM 0x2C
|
||||
!define WM_DELETEITEM 0x2D
|
||||
!define WM_VKEYTOITEM 0x2E
|
||||
!define WM_CHARTOITEM 0x2F
|
||||
!define WM_SETFONT 0x30
|
||||
!define WM_GETFONT 0x31
|
||||
!define WM_SETHOTKEY 0x32
|
||||
!define WM_GETHOTKEY 0x33
|
||||
!define WM_QUERYDRAGICON 0x37
|
||||
!define WM_COMPAREITEM 0x39
|
||||
!define WM_COMPACTING 0x41
|
||||
!define WM_WINDOWPOSCHANGING 0x46
|
||||
!define WM_WINDOWPOSCHANGED 0x47
|
||||
!define WM_POWER 0x48
|
||||
!define WM_COPYDATA 0x4A
|
||||
!define WM_CANCELJOURNAL 0x4B
|
||||
!define WM_NCCREATE 0x81
|
||||
!define WM_NCDESTROY 0x82
|
||||
!define WM_NCCALCSIZE 0x83
|
||||
!define WM_NCHITTEST 0x84
|
||||
!define WM_NCPAINT 0x85
|
||||
!define WM_NCACTIVATE 0x86
|
||||
!define WM_GETDLGCODE 0x87
|
||||
!define WM_NCMOUSEMOVE 0xA0
|
||||
!define WM_NCLBUTTONDOWN 0xA1
|
||||
!define WM_NCLBUTTONUP 0xA2
|
||||
!define WM_NCLBUTTONDBLCLK 0xA3
|
||||
!define WM_NCRBUTTONDOWN 0xA4
|
||||
!define WM_NCRBUTTONUP 0xA5
|
||||
!define WM_NCRBUTTONDBLCLK 0xA6
|
||||
!define WM_NCMBUTTONDOWN 0xA7
|
||||
!define WM_NCMBUTTONUP 0xA8
|
||||
!define WM_NCMBUTTONDBLCLK 0xA9
|
||||
!define WM_KEYFIRST 0x100
|
||||
!define WM_KEYDOWN 0x100
|
||||
!define WM_KEYUP 0x101
|
||||
!define WM_CHAR 0x102
|
||||
!define WM_DEADCHAR 0x103
|
||||
!define WM_SYSKEYDOWN 0x104
|
||||
!define WM_SYSKEYUP 0x105
|
||||
!define WM_SYSCHAR 0x106
|
||||
!define WM_SYSDEADCHAR 0x107
|
||||
!define WM_KEYLAST 0x108
|
||||
!define WM_INITDIALOG 0x110
|
||||
!define WM_COMMAND 0x111
|
||||
!define WM_SYSCOMMAND 0x112
|
||||
!define WM_TIMER 0x113
|
||||
!define WM_HSCROLL 0x114
|
||||
!define WM_VSCROLL 0x115
|
||||
!define WM_INITMENU 0x116
|
||||
!define WM_INITMENUPOPUP 0x117
|
||||
!define WM_MENUSELECT 0x11F
|
||||
!define WM_MENUCHAR 0x120
|
||||
!define WM_ENTERIDLE 0x121
|
||||
!define WM_CTLCOLORMSGBOX 0x132
|
||||
!define WM_CTLCOLOREDIT 0x133
|
||||
!define WM_CTLCOLORLISTBOX 0x134
|
||||
!define WM_CTLCOLORBTN 0x135
|
||||
!define WM_CTLCOLORDLG 0x136
|
||||
!define WM_CTLCOLORSCROLLBAR 0x137
|
||||
!define WM_CTLCOLORSTATIC 0x138
|
||||
!define WM_MOUSEFIRST 0x200
|
||||
!define WM_MOUSEMOVE 0x200
|
||||
!define WM_LBUTTONDOWN 0x201
|
||||
!define WM_LBUTTONUP 0x202
|
||||
!define WM_LBUTTONDBLCLK 0x203
|
||||
!define WM_RBUTTONDOWN 0x204
|
||||
!define WM_RBUTTONUP 0x205
|
||||
!define WM_RBUTTONDBLCLK 0x206
|
||||
!define WM_MBUTTONDOWN 0x207
|
||||
!define WM_MBUTTONUP 0x208
|
||||
!define WM_MBUTTONDBLCLK 0x209
|
||||
!define WM_MOUSELAST 0x209
|
||||
!define WM_PARENTNOTIFY 0x210
|
||||
!define WM_ENTERMENULOOP 0x211
|
||||
!define WM_EXITMENULOOP 0x212
|
||||
!define WM_MDICREATE 0x220
|
||||
!define WM_MDIDESTROY 0x221
|
||||
!define WM_MDIACTIVATE 0x222
|
||||
!define WM_MDIRESTORE 0x223
|
||||
!define WM_MDINEXT 0x224
|
||||
!define WM_MDIMAXIMIZE 0x225
|
||||
!define WM_MDITILE 0x226
|
||||
!define WM_MDICASCADE 0x227
|
||||
!define WM_MDIICONARRANGE 0x228
|
||||
!define WM_MDIGETACTIVE 0x229
|
||||
!define WM_MDISETMENU 0x230
|
||||
!define WM_DROPFILES 0x233
|
||||
!define WM_MDIREFRESHMENU 0x234
|
||||
!define WM_CUT 0x300
|
||||
!define WM_COPY 0x301
|
||||
!define WM_PASTE 0x302
|
||||
!define WM_CLEAR 0x303
|
||||
!define WM_UNDO 0x304
|
||||
!define WM_RENDERFORMAT 0x305
|
||||
!define WM_RENDERALLFORMATS 0x306
|
||||
!define WM_DESTROYCLIPBOARD 0x307
|
||||
!define WM_DRAWCLIPBOARD 0x308
|
||||
!define WM_PAINTCLIPBOARD 0x309
|
||||
!define WM_VSCROLLCLIPBOARD 0x30A
|
||||
!define WM_SIZECLIPBOARD 0x30B
|
||||
!define WM_ASKCBFORMATNAME 0x30C
|
||||
!define WM_CHANGECBCHAIN 0x30D
|
||||
!define WM_HSCROLLCLIPBOARD 0x30E
|
||||
!define WM_QUERYNEWPALETTE 0x30F
|
||||
!define WM_PALETTEISCHANGING 0x310
|
||||
!define WM_PALETTECHANGED 0x311
|
||||
!define WM_HOTKEY 0x312
|
||||
!define WM_PENWINFIRST 0x380
|
||||
!define WM_PENWINLAST 0x38F
|
||||
!define WM_USER 0x400
|
||||
!define WM_DDE_FIRST 0x3E0
|
||||
!define WM_CONVERTREQUESTEX 0x108
|
||||
!define WM_IME_STARTCOMPOSITION 0x10D
|
||||
!define WM_IME_ENDCOMPOSITION 0x10E
|
||||
!define WM_IME_COMPOSITION 0x10F
|
||||
!define WM_IME_KEYLAST 0x10F
|
||||
!define WM_IME_SETCONTEXT 0x281
|
||||
!define WM_IME_NOTIFY 0x282
|
||||
!define WM_IME_CONTROL 0x283
|
||||
!define WM_IME_COMPOSITIONFULL 0x284
|
||||
!define WM_IME_SELECT 0x285
|
||||
!define WM_IME_CHAR 0x286
|
||||
!define WM_IME_KEYDOWN 0x290
|
||||
!define WM_IME_KEYUP 0x291
|
239
Examples/bigtest.nsi
Normal file
|
@ -0,0 +1,239 @@
|
|||
; bigtest.nsi
|
||||
;
|
||||
; This script attempts to test most of the functionality of NSIS.
|
||||
;
|
||||
!ifdef HAVE_UPX
|
||||
!packhdr tmp.dat "upx\upx -9 tmp.dat"
|
||||
!endif
|
||||
|
||||
!ifdef NOCOMPRESS
|
||||
SetCompress off
|
||||
!endif
|
||||
|
||||
SetDateSave on
|
||||
SetDatablockOptimize on
|
||||
CRCCheck on
|
||||
SilentInstall normal
|
||||
BGGradient 000000 800000 FFFFFF
|
||||
InstallColors FF8080 000030
|
||||
|
||||
|
||||
Name "BigNSISTest"
|
||||
Caption "NSIS Big Test"
|
||||
Icon "..\contrib\Icons\normal-install.ico"
|
||||
OutFile "bigtest.exe"
|
||||
|
||||
LicenseText "make sure this license text is all there (it's about 28k last I checked). The last line is a simple '}'."
|
||||
LicenseData "..\source\exehead\main.c"
|
||||
|
||||
InstallDir "$PROGRAMFILES\NSISCrap\BigNSISTest"
|
||||
InstallDirRegKey HKLM SOFTWARE\NSISCrap\BigNSISTest "Install_Dir"
|
||||
DirText "Choose a directory to install in to:"
|
||||
|
||||
; uninstall stuff
|
||||
UninstallText "This will uninstall example2. Hit next to continue."
|
||||
UninstallIcon "..\contrib\Icons\normal-uninstall.ico"
|
||||
|
||||
ComponentText "This will install the test on your computer. Select which optional things you want installed."
|
||||
CheckBitmap ..\contrib\Icons\checksX.bmp
|
||||
!ifndef NOINSTTYPES ; only if not defined
|
||||
InstType "Most"
|
||||
InstType "Full"
|
||||
InstType "More"
|
||||
InstType "Base"
|
||||
;InstType /NOCUSTOM
|
||||
;InstType /COMPONENTSONLYONCUSTOM
|
||||
!endif
|
||||
|
||||
AutoCloseWindow false
|
||||
ShowInstDetails show
|
||||
|
||||
|
||||
Section "" ; empty string makes it hidden, so would starting with -
|
||||
; write reg crap
|
||||
StrCpy $1 "POOOOOOOOOOOP"
|
||||
DetailPrint "I like to f*ck sheep $1"
|
||||
WriteRegStr HKLM SOFTWARE\NSISCrap\BigNSISTest "Install_Dir" "$INSTDIR"
|
||||
; write uninstall strings
|
||||
WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\BigNSISTest" "DisplayName" "BigNSISTest (remove only)"
|
||||
WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\BigNSISTest" "UninstallString" '"$INSTDIR\bt-uninst.exe"'
|
||||
#File /oname=poop.exe makensisw.exe
|
||||
|
||||
SetOutPath $INSTDIR
|
||||
File /a "..\source\exehead\bin2h.exe"
|
||||
CreateDirectory "$INSTDIR\shiz\crap" ; 2 recursively create a directory for fun.
|
||||
WriteUninstaller "bt-uninst.exe"
|
||||
Nop ; for fun
|
||||
SectionEnd
|
||||
|
||||
|
||||
Section "TempTest"
|
||||
SectionIn 1 2 3
|
||||
Start: MessageBox MB_OK "Start:"
|
||||
|
||||
MessageBox MB_YESNO "Goto Poop" IDYES Poop
|
||||
|
||||
MessageBox MB_OK "Right before Poop:"
|
||||
|
||||
Poop: MessageBox MB_OK "Poop:"
|
||||
|
||||
MessageBox MB_OK "Right after Poop:"
|
||||
|
||||
MessageBox MB_YESNO "Goto Start:?" IDYES Start
|
||||
|
||||
SectionEnd
|
||||
|
||||
|
||||
Function poopTest
|
||||
ReadINIStr $1 "$INSTDIR\test.ini" "MySectionShit" "Value1"
|
||||
StrCmp $1 $8 NoFailedMsg
|
||||
MessageBox MB_OK "WriteINIStr failed"
|
||||
NoFailedMsg: FunctionEnd
|
||||
|
||||
|
||||
SubSection /e SubSection1
|
||||
Section "Test Registry/INI functions"
|
||||
SectionIn 1 4 3
|
||||
WriteRegStr HKLM SOFTWARE\NSISCrap\BigNSISTest "StrTest_INSTDIR" "$INSTDIR"
|
||||
WriteRegDword HKLM SOFTWARE\NSISCrap\BigNSISTest "DwordTest_0xDEADBEEF" 0xdeadbeef
|
||||
WriteRegDword HKLM SOFTWARE\NSISCrap\BigNSISTest "DwordTest_123456" 123456
|
||||
WriteRegDword HKLM SOFTWARE\NSISCrap\BigNSISTest "DwordTest_0123" 0123
|
||||
WriteRegBin HKLM SOFTWARE\NSISCrap\BigNSISTest "BinTest_deadbeef01f00dbeef" "DEADBEEF01F00DBEEF"
|
||||
StrCpy $8 "$SYSDIR\Poop"
|
||||
WriteINIStr "$INSTDIR\test.ini" "MySection" "Value1" $8
|
||||
WriteINIStr "$INSTDIR\test.ini" "MySectionShit" "Value1" $8
|
||||
WriteINIStr "$INSTDIR\test.ini" "MySectionShit" "Value2" $8
|
||||
WriteINIStr "$INSTDIR\test.ini" "POOPon" "Value1" $8
|
||||
Call poopTest
|
||||
|
||||
DeleteINIStr "$INSTDIR\test.ini" "POOPon" "Value1"
|
||||
DeleteINISec "$INSTDIR\test.ini" "MySectionShit"
|
||||
|
||||
ReadINIStr $1 "$INSTDIR\test.ini" "MySectionShit" "Value1"
|
||||
StrCmp $1 "" INIDelSuccess
|
||||
MessageBox MB_OK "DeleteINISec failed"
|
||||
INIDelSuccess:
|
||||
|
||||
ClearErrors
|
||||
ReadRegStr $1 HKCR "software\microsoft" shit
|
||||
IfErrors 0 NoError
|
||||
MessageBox MB_OK "could not read from HKCR\software\microsoft\shit"
|
||||
Goto ErrorYay
|
||||
NoError:
|
||||
MessageBox MB_OK "read '$1' from HKCR\software\microsoft\shit"
|
||||
ErrorYay:
|
||||
SectionEnd
|
||||
|
||||
|
||||
Function "CSCTest"
|
||||
CreateDirectory "$SMPROGRAMS\Big NSIS Test"
|
||||
SetOutPath $INSTDIR ; for working directory
|
||||
CreateShortCut "$SMPROGRAMS\Big NSIS Test\Uninstall BIG NSIS Test.lnk" "$INSTDIR\bt-uninst.exe" ; use defaults for parameters, icon, etc.
|
||||
; this one will use notepad's icon, start it minimized, and give it a hotkey (of Ctrl+Shift+Q)
|
||||
CreateShortCut "$SMPROGRAMS\Big NSIS Test\bin2h.exe.lnk" "$INSTDIR\bin2h.exe" "" "$WINDIR\notepad.exe" 0 SW_SHOWMINIMIZED CONTROL|SHIFT|Q
|
||||
CreateShortCut "$SMPROGRAMS\Big NSIS Test\TheDir.lnk" "$INSTDIR\" "" "" 0 SW_SHOWMAXIMIZED CONTROL|SHIFT|Z
|
||||
FunctionEnd
|
||||
|
||||
|
||||
Section "Test CreateShortCut"
|
||||
SectionIn 1 2 3
|
||||
Call CSCTest
|
||||
SectionEnd
|
||||
SubSection Sub2
|
||||
|
||||
Function myfunc
|
||||
StrCpy $2 "poop=$1"
|
||||
MessageBox MB_OK "myfunc: $2"
|
||||
FunctionEnd
|
||||
|
||||
Section "Test Branching"
|
||||
BeginTestSection:
|
||||
SectionIn 1 2 3
|
||||
SetOutPath $INSTDIR
|
||||
IfFileExists "$INSTDIR\bin2h.c" 0 BranchTest69
|
||||
MessageBox MB_YESNO|MB_ICONQUESTION "Would you like to overwrite $INSTDIR\bin2h.c?" IDNO NoOverwrite ; skipped if file doesn't exist
|
||||
BranchTest69:
|
||||
SetOverwrite ifnewer ; NOT AN INSTRUCTION, NOT COUNTED IN SKIPPINGS
|
||||
NoOverwrite:
|
||||
File "..\source\exehead\bin2h.c" ; skipped if answered no
|
||||
SetOverwrite try ; NOT AN INSTRUCTION, NOT COUNTED IN SKIPPINGS
|
||||
MessageBox MB_YESNO|MB_ICONQUESTION "Would you like to skip the rest of this section?" IDYES EndTestBranch
|
||||
MessageBox MB_YESNO|MB_ICONQUESTION "Would you like to go back to the beginning of this section?" IDYES BeginTestSection
|
||||
MessageBox MB_YESNO|MB_ICONQUESTION "Would you like to hide the installer and wait five seconds?" IDNO NoHide
|
||||
HideWindow
|
||||
Sleep 5000
|
||||
BringToFront
|
||||
NoHide:
|
||||
MessageBox MB_YESNO|MB_ICONQUESTION "Would you like to call the function 5 times?" IDNO NoRecurse
|
||||
StrCpy $1 "x"
|
||||
LoopPoop:
|
||||
Call myfunc
|
||||
StrCpy $1 "x$1"
|
||||
StrCmp $1 "xxxxxx" 0 LoopPoop
|
||||
NoRecurse:
|
||||
|
||||
EndTestBranch:
|
||||
|
||||
SectionEnd
|
||||
|
||||
SubSectionEnd
|
||||
|
||||
Section "Test CopyFiles"
|
||||
SectionIn 1 2 3
|
||||
SetOutPath $INSTDIR\cpdest
|
||||
CopyFiles "$WINDIR\*.ini" "$INSTDIR\cpdest" 0
|
||||
SectionEnd
|
||||
|
||||
SubSectionEnd
|
||||
Section "Test Exec functions" CRAPIDX
|
||||
SectionIn 1 2 3
|
||||
SearchPath $1 notepad.exe
|
||||
MessageBox MB_OK "notepad.exe=$1"
|
||||
Exec '"$1"'
|
||||
ExecShell "open" '"$INSTDIR"'
|
||||
Sleep 500
|
||||
BringToFront
|
||||
SectionEnd
|
||||
|
||||
Section "Test ActiveX control registration"
|
||||
SectionIn 2
|
||||
UnRegDLL "$SYSDIR\spin32.ocx"
|
||||
Sleep 1000
|
||||
RegDLL "$SYSDIR\spin32.ocx"
|
||||
Sleep 1000
|
||||
SectionEnd
|
||||
|
||||
; special uninstall section.
|
||||
Section "Uninstall"
|
||||
DeleteRegKey HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\BigNSISTest"
|
||||
DeleteRegKey HKLM "SOFTWARE\NSISCrap\BigNSISTest"
|
||||
Delete "$INSTDIR\bin2h.exe"
|
||||
Delete "$INSTDIR\bin2h.c"
|
||||
Delete "$INSTDIR\bt-uninst.exe"
|
||||
Delete "$INSTDIR\test.ini"
|
||||
Delete "$SMPROGRAMS\Big NSIS Test\*.*"
|
||||
RMDir "$SMPROGRAMS\BiG NSIS Test"
|
||||
MessageBox MB_YESNO|MB_ICONQUESTION "Would you like to remove the directory $INSTDIR\cpdest?" IDNO NoDelete
|
||||
Delete "$INSTDIR\cpdest\*.*"
|
||||
RMDir "$INSTDIR\cpdest" ; skipped if no
|
||||
NoDelete:
|
||||
RMDir "$INSTDIR\shiz\crap"
|
||||
RMDir "$INSTDIR\shiz"
|
||||
RMDir "$INSTDIR"
|
||||
IfFileExists "$INSTDIR" 0 NoErrorMsg
|
||||
MessageBox MB_OK "Note: $INSTDIR could not be removed!" IDOK 0 ; skipped if file doesn't exist
|
||||
NoErrorMsg:
|
||||
SectionEnd
|
||||
|
||||
; eof
|
||||
|
||||
Function .onSelChange
|
||||
SectionGetText ${CRAPIDX} $0
|
||||
StrCmp $0 "" e
|
||||
SectionSetText ${CRAPIDX} ""
|
||||
Goto e2
|
||||
e:
|
||||
SectionSetText ${CRAPIDX} "Doop"
|
||||
e2:
|
||||
|
||||
FunctionEnd
|
104
Examples/branding.nsh
Normal file
|
@ -0,0 +1,104 @@
|
|||
; Written by Amir Szekely 24th July 2002
|
||||
; Please see gfx.nsi for example of usage
|
||||
|
||||
!verbose 3
|
||||
|
||||
; If we haven't included this as install macros yet
|
||||
!ifndef BI_MACROS_USED
|
||||
; If this isn't supposed to be uninstall macros
|
||||
!ifndef BI_UNINSTALL
|
||||
!define BI_MACROS_USED
|
||||
; Undefine BI_FUNC if already defined by uninstaller macros
|
||||
!ifdef BI_FUNC
|
||||
!undef BI_FUNC
|
||||
!endif
|
||||
; Define BI_FUNC
|
||||
!define BI_FUNC "BIChange"
|
||||
; If BI_VAR or BI_TEMPFILE was already defined undefine it so BI_INIT can redefine it
|
||||
!ifdef BI_VAR
|
||||
!undef BI_VAR
|
||||
!endif
|
||||
!ifdef BI_TEMPFILE
|
||||
!undef BI_TEMPFILE
|
||||
!endif
|
||||
; If macros aren't defined yet, define them
|
||||
!ifndef UBI_MACROS_USED
|
||||
!define BI_OK
|
||||
!endif
|
||||
; Done
|
||||
!endif
|
||||
!endif
|
||||
|
||||
; If we haven't included this as uninstall macros yet
|
||||
!ifndef UBI_MACROS_USED
|
||||
; If this is supposed to be uninstall macros
|
||||
!ifdef BI_UNINSTALL
|
||||
!define UBI_MACROS_USED
|
||||
; Undefine BI_FUNC if already defined by installer macros
|
||||
!ifdef BI_FUNC
|
||||
!undef BI_FUNC
|
||||
!endif
|
||||
; Define BI_FUNC
|
||||
!define BI_FUNC "un.BIChange"
|
||||
; If BI_VAR or BI_TEMPFILE was already defined undefine it so BI_INIT can redefine it
|
||||
!ifdef BI_VAR
|
||||
!undef BI_VAR
|
||||
!endif
|
||||
!ifdef BI_TEMPFILE
|
||||
!undef BI_TEMPFILE
|
||||
!endif
|
||||
; If macros aren't defined yet, define them
|
||||
!ifndef BI_MACROS_USED
|
||||
!define BI_OK
|
||||
!endif
|
||||
; Done
|
||||
!endif
|
||||
!endif
|
||||
|
||||
!ifdef BI_OK
|
||||
|
||||
!macro BI_INIT VAR
|
||||
!define BI_VAR ${VAR}
|
||||
StrCpy ${BI_VAR} 0
|
||||
!macroend
|
||||
|
||||
!macro BI_NEXT
|
||||
IntOp ${BI_VAR} ${BI_VAR} + 1
|
||||
Call ${BI_FUNC}
|
||||
!macroend
|
||||
|
||||
!macro BI_PREV
|
||||
IntOp ${BI_VAR} ${BI_VAR} - 1
|
||||
Call ${BI_FUNC}
|
||||
!macroend
|
||||
|
||||
!macro BI_LIST
|
||||
Function ${BI_FUNC}
|
||||
Push $0
|
||||
Push $1
|
||||
StrCpy $0 0
|
||||
GetTempFileName $1
|
||||
!macroend
|
||||
|
||||
!macro BI_LIST_ADD IMAGE PARMS
|
||||
IntOp $0 $0 + 1
|
||||
StrCmp ${BI_VAR} $0 0 +4
|
||||
File /oname=$1 "${IMAGE}"
|
||||
SetBrandingImage ${PARMS} $1
|
||||
Goto BI_done
|
||||
!macroend
|
||||
|
||||
!macro BI_LIST_END
|
||||
BI_done:
|
||||
Delete $1
|
||||
Pop $1
|
||||
Pop $0
|
||||
FunctionEnd
|
||||
!macroend
|
||||
|
||||
!undef BI_OK
|
||||
!endif ; ifdef BI_OK
|
||||
|
||||
!verbose 4
|
||||
|
||||
!echo "Branding macros defined successfully!"
|
29
Examples/example1.nsi
Normal file
|
@ -0,0 +1,29 @@
|
|||
; example1.nsi
|
||||
;
|
||||
; This script is perhaps one of the simplest NSIs you can make. All of the
|
||||
; optional settings are left to their default settings. The instalelr simply
|
||||
; prompts the user asking them where to install, and drops of makensisw.exe
|
||||
; there.
|
||||
;
|
||||
|
||||
; The name of the installer
|
||||
Name "Example1"
|
||||
|
||||
; The file to write
|
||||
OutFile "example1.exe"
|
||||
|
||||
; The default installation directory
|
||||
InstallDir $PROGRAMFILES\Example1
|
||||
|
||||
; The text to prompt the user to enter a directory
|
||||
DirText "This will install the very simple example1 on your computer. Choose a directory"
|
||||
|
||||
; The stuff to install
|
||||
Section "ThisNameIsIgnoredSoWhyBother?"
|
||||
; Set output path to the installation directory.
|
||||
SetOutPath $INSTDIR
|
||||
; Put file there
|
||||
File ..\makensisw.exe
|
||||
SectionEnd ; end the section
|
||||
|
||||
; eof
|
67
Examples/example2.nsi
Normal file
|
@ -0,0 +1,67 @@
|
|||
; example2.nsi
|
||||
;
|
||||
; This script is based on example1.nsi, but adds uninstall support
|
||||
; and (optionally) start menu shortcuts.
|
||||
;
|
||||
; It will install notepad.exe into a directory that the user selects,
|
||||
;
|
||||
|
||||
; The name of the installer
|
||||
Name "Example2"
|
||||
|
||||
; The file to write
|
||||
OutFile "example2.exe"
|
||||
|
||||
; The default installation directory
|
||||
InstallDir $PROGRAMFILES\Example2
|
||||
; Registry key to check for directory (so if you install again, it will
|
||||
; overwrite the old one automatically)
|
||||
InstallDirRegKey HKLM SOFTWARE\NSIS_Example2 "Install_Dir"
|
||||
|
||||
; The text to prompt the user to enter a directory
|
||||
ComponentText "This will install the less simple example2 on your computer. Select which optional things you want installed."
|
||||
; The text to prompt the user to enter a directory
|
||||
DirText "Choose a directory to install in to:"
|
||||
|
||||
; The stuff to install
|
||||
Section "Example2 (required)"
|
||||
; Set output path to the installation directory.
|
||||
SetOutPath $INSTDIR
|
||||
; Put file there
|
||||
File "..\makensisw.exe"
|
||||
; Write the installation path into the registry
|
||||
WriteRegStr HKLM SOFTWARE\NSIS_Example2 "Install_Dir" "$INSTDIR"
|
||||
; Write the uninstall keys for Windows
|
||||
WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\Example2" "DisplayName" "NSIS Example2 (remove only)"
|
||||
WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\Example2" "UninstallString" '"$INSTDIR\uninstall.exe"'
|
||||
WriteUninstaller "uninstall.exe"
|
||||
SectionEnd
|
||||
|
||||
; optional section
|
||||
Section "Start Menu Shortcuts"
|
||||
CreateDirectory "$SMPROGRAMS\Example2"
|
||||
CreateShortCut "$SMPROGRAMS\Example2\Uninstall.lnk" "$INSTDIR\uninstall.exe" "" "$INSTDIR\uninstall.exe" 0
|
||||
CreateShortCut "$SMPROGRAMS\Example2\Example2 (notepad).lnk" "$INSTDIR\notepad.exe" "" "$INSTDIR\makensisw.exe" 0
|
||||
SectionEnd
|
||||
|
||||
; uninstall stuff
|
||||
|
||||
UninstallText "This will uninstall example2. Hit next to continue."
|
||||
|
||||
; special uninstall section.
|
||||
Section "Uninstall"
|
||||
; remove registry keys
|
||||
DeleteRegKey HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\Example2"
|
||||
DeleteRegKey HKLM SOFTWARE\NSIS_Example2
|
||||
; remove files
|
||||
Delete $INSTDIR\makensisw.exe
|
||||
; MUST REMOVE UNINSTALLER, too
|
||||
Delete $INSTDIR\uninstall.exe
|
||||
; remove shortcuts, if any.
|
||||
Delete "$SMPROGRAMS\Example2\*.*"
|
||||
; remove directories used.
|
||||
RMDir "$SMPROGRAMS\Example2"
|
||||
RMDir "$INSTDIR"
|
||||
SectionEnd
|
||||
|
||||
; eof
|
614
Examples/functions.htm
Normal file
|
@ -0,0 +1,614 @@
|
|||
<HTML><HEAD><TITLE>NSIS utility functions</TITLE>
|
||||
<BODY>
|
||||
<H1>NSIS utility functions</H1>
|
||||
<H3>Contents:</H3>
|
||||
<UL>
|
||||
<li><a href="#General">General utility</a>
|
||||
<ul>
|
||||
<li><a href="#GetParent">GetParent</a>
|
||||
<li><a href="#TrimNewlines">TrimNewlines</a>
|
||||
<li><a href="#GetParameters">GetParameters</a>
|
||||
<li><a href="#StrStr">StrStr</a>
|
||||
</ul>
|
||||
<LI><A href="#Versions">System version checking</A>
|
||||
<UL>
|
||||
<LI><A href="#GetWindowsVersion">GetWindowsVersion</A>
|
||||
<LI><A href="#GetIEVersion">GetIEVersion</A>
|
||||
<LI><A href="#IsFlashInstalled">IsFlashInstalled</A>
|
||||
</UL>
|
||||
<LI><A href="#SharedDLL">Shared DLL functions</A>
|
||||
<UL>
|
||||
<LI><A href="#un.RemoveSharedDLL">un.RemoveSharedDLL</A>
|
||||
<LI><A href="#AddSharedDLL">AddSharedDLL</A>
|
||||
<LI><A href="#UpgradeDLL">UpgradeDLL</A> (macro)
|
||||
</UL>
|
||||
|
||||
<LI><A href="#Winamp">Winamp functions</A>
|
||||
<UL>
|
||||
<LI><A href="#GetWinampInstPath">GetWinampInstPath</A>
|
||||
<LI><A href="#GetWinampVisPath">GetWinampVisPath</A>
|
||||
<LI><A href="#GetWinampDSPPath">GetWinampDSPPath</A>
|
||||
<LI><A href="#GetWinampSkinPath">GetWinampSkinPath</A>
|
||||
<LI><A href="#CloseWinamp">CloseWinamp</A>
|
||||
</UL>
|
||||
<LI><A href="#Netscape">Netscape functions</A>
|
||||
<UL>
|
||||
<LI><A href="#InstallNetscapePlugin">InstallNetscapePlugin</A>
|
||||
<LI><A href="#un.RemoveNetscapePlugin">un.RemoveNetscapePlugin</A>
|
||||
</UL>
|
||||
</UL>
|
||||
|
||||
<hr>
|
||||
<A name=General>General utility: <PRE>
|
||||
;<A name=GetParent>------------------------------------------------------------------------------
|
||||
; GetParent
|
||||
; input, top of stack (i.e. C:\Program Files\Poop)
|
||||
; output, top of stack (replaces, with i.e. C:\Program Files)
|
||||
; modifies no other variables.
|
||||
;
|
||||
; Usage:
|
||||
; Push "C:\Program Files\Directory\Whatever"
|
||||
; Call GetParent
|
||||
; Pop $0
|
||||
; ; at this point $0 will equal "C:\Program Files\Directory"
|
||||
|
||||
|
||||
Function GetParent
|
||||
Exch $0 ; old $0 is on top of stack
|
||||
Push $1
|
||||
Push $2
|
||||
StrCpy $1 -1
|
||||
loop:
|
||||
StrCpy $2 $0 1 $1
|
||||
StrCmp $2 "" exit
|
||||
StrCmp $2 "\" exit
|
||||
IntOp $1 $1 - 1
|
||||
Goto loop
|
||||
exit:
|
||||
StrCpy $0 $0 $1
|
||||
Pop $2
|
||||
Pop $1
|
||||
Exch $0 ; put $0 on top of stack, restore $0 to original value
|
||||
FunctionEnd
|
||||
|
||||
;<A name=TrimNewlines>------------------------------------------------------------------------------
|
||||
; TrimNewlines
|
||||
; input, top of stack (i.e. whatever$\r$\n)
|
||||
; output, top of stack (replaces, with i.e. whatever)
|
||||
; modifies no other variables.
|
||||
;
|
||||
Function TrimNewlines
|
||||
Exch $0
|
||||
Push $1
|
||||
Push $2
|
||||
StrCpy $1 0
|
||||
loop:
|
||||
IntOp $1 $1 - 1
|
||||
StrCpy $2 $0 1 $1
|
||||
StrCmp $2 "$\r" loop
|
||||
StrCmp $2 "$\n" loop
|
||||
IntOp $1 $1 + 1
|
||||
|
||||
StrCpy $0 $0 $1
|
||||
Pop $2
|
||||
Pop $1
|
||||
Exch $0
|
||||
FunctionEnd
|
||||
|
||||
|
||||
|
||||
;<A name=GetParameters>------------------------------------------------------------------------------
|
||||
; GetParameters
|
||||
; input, none
|
||||
; output, top of stack (replaces, with i.e. whatever)
|
||||
; modifies no other variables.
|
||||
|
||||
Function GetParameters
|
||||
Push $0
|
||||
Push $1
|
||||
Push $2
|
||||
StrCpy $0 $CMDLINE 1
|
||||
StrCpy $1 '"'
|
||||
StrCpy $2 1
|
||||
StrCmp $0 '"' loop
|
||||
StrCpy $1 ' ' ; we're scanning for a space instead of a quote
|
||||
loop:
|
||||
StrCpy $0 $CMDLINE 1 $2
|
||||
StrCmp $0 $1 loop2
|
||||
StrCmp $0 "" loop2
|
||||
IntOp $2 $2 + 1
|
||||
Goto loop
|
||||
loop2:
|
||||
IntOp $2 $2 + 1
|
||||
StrCpy $0 $CMDLINE 1 $2
|
||||
StrCmp $0 " " loop2
|
||||
StrCpy $0 $CMDLINE "" $2
|
||||
Pop $2
|
||||
Pop $1
|
||||
Exch $0
|
||||
FunctionEnd
|
||||
|
||||
;<a name=StrStr>------------------------------------------------------------------------------
|
||||
; StrStr
|
||||
; input, top of stack = string to search for
|
||||
; top of stack-1 = string to search in
|
||||
; output, top of stack (replaces with the portion of the string remaining)
|
||||
; modifies no other variables.
|
||||
;
|
||||
; Usage:
|
||||
; Push "this is a long ass string"
|
||||
; Push "ass"
|
||||
; Call StrStr
|
||||
; Pop $0
|
||||
; ($0 at this point is "ass string")
|
||||
|
||||
Function StrStr
|
||||
Exch $1 ; st=haystack,old$1, $1=needle
|
||||
Exch ; st=old$1,haystack
|
||||
Exch $2 ; st=old$1,old$2, $2=haystack
|
||||
Push $3
|
||||
Push $4
|
||||
Push $5
|
||||
StrLen $3 $1
|
||||
StrCpy $4 0
|
||||
; $1=needle
|
||||
; $2=haystack
|
||||
; $3=len(needle)
|
||||
; $4=cnt
|
||||
; $5=tmp
|
||||
loop:
|
||||
StrCpy $5 $2 $3 $4
|
||||
StrCmp $5 $1 done
|
||||
StrCmp $5 "" done
|
||||
IntOp $4 $4 + 1
|
||||
Goto loop
|
||||
done:
|
||||
StrCpy $1 $2 "" $4
|
||||
Pop $5
|
||||
Pop $4
|
||||
Pop $3
|
||||
Pop $2
|
||||
Exch $1
|
||||
FunctionEnd
|
||||
|
||||
</PRE>
|
||||
<HR>
|
||||
<A name=Versions>System version checking: <PRE>
|
||||
<A name=GetWindowsVersion>;------------------------------------------------------------------------------
|
||||
; GetWindowsVersion
|
||||
;
|
||||
; Based on Yazno's function, http://yazno.tripod.com/powerpimpit/
|
||||
; Returns on top of stack
|
||||
;
|
||||
; Windows Version (95, 98, ME, NT x.x, 2000)
|
||||
; or
|
||||
; '' (Unknown Windows Version)
|
||||
;
|
||||
; Usage:
|
||||
; Call GetWindowsVersion
|
||||
; Pop $0
|
||||
; ; at this point $0 is "NT 4.0" or whatnot
|
||||
|
||||
Function GetWindowsVersion
|
||||
Push $0
|
||||
Push $9
|
||||
ReadRegStr $0 HKLM "SOFTWARE\Microsoft\Windows NT\CurrentVersion" CurrentVersion
|
||||
StrCmp $0 "" 0 lbl_winnt
|
||||
; we are not NT.
|
||||
ReadRegStr $0 HKLM SOFTWARE\Microsoft\Windows\CurrentVersion VersionNumber
|
||||
|
||||
StrCpy $9 $0 1
|
||||
StrCmp $9 '4' 0 lbl_error
|
||||
|
||||
StrCpy $9 $0 3
|
||||
|
||||
StrCmp $9 '4.0' lbl_win32_95
|
||||
StrCmp $9 '4.9' lbl_win32_ME lbl_win32_98
|
||||
|
||||
lbl_win32_95:
|
||||
StrCpy $0 '95'
|
||||
Goto lbl_done
|
||||
|
||||
lbl_win32_98:
|
||||
StrCpy $0 '98'
|
||||
Goto lbl_done
|
||||
|
||||
lbl_win32_ME:
|
||||
StrCpy $0 'ME'
|
||||
Goto lbl_done
|
||||
|
||||
lbl_winnt:
|
||||
|
||||
StrCpy $9 $0 1
|
||||
StrCmp $9 '3' lbl_winnt_x
|
||||
StrCmp $9 '4' lbl_winnt_x
|
||||
StrCmp $9 '5' lbl_winnt_5 lbl_error
|
||||
|
||||
lbl_winnt_x:
|
||||
StrCpy $0 "NT $0" 6
|
||||
Goto lbl_done
|
||||
|
||||
lbl_winnt_5:
|
||||
Strcpy $0 '2000'
|
||||
Goto lbl_done
|
||||
|
||||
lbl_error:
|
||||
Strcpy $0 ''
|
||||
lbl_done:
|
||||
Pop $9
|
||||
Exch $0
|
||||
FunctionEnd
|
||||
|
||||
<A name=GetIEVersion>;------------------------------------------------------------------------------
|
||||
; GetIEVersion
|
||||
;
|
||||
; Based on Yazno's function, http://yazno.tripod.com/powerpimpit/
|
||||
; Returns on top of stack
|
||||
; 1-6 (Installed IE Version)
|
||||
; or
|
||||
; '' (IE is not installed)
|
||||
;
|
||||
; Usage:
|
||||
; Call GetIEVersion
|
||||
; Pop $0
|
||||
; ; at this point $0 is "5" or whatnot
|
||||
|
||||
Function GetIEVersion
|
||||
Push $0
|
||||
ClearErrors
|
||||
ReadRegStr $0 HKLM "Software\Microsoft\Internet Explorer" "Version"
|
||||
IfErrors lbl_123 lbl_456
|
||||
|
||||
lbl_456: ; ie 4+
|
||||
Strcpy $0 $0 1
|
||||
Goto lbl_done
|
||||
|
||||
lbl_123: ; older ie version
|
||||
ClearErrors
|
||||
ReadRegStr $0 HKLM "Software\Microsoft\Internet Explorer" "IVer"
|
||||
IfErrors lbl_error
|
||||
|
||||
StrCpy $0 $0 3
|
||||
StrCmp $0 '100' lbl_ie1
|
||||
StrCmp $0 '101' lbl_ie2
|
||||
StrCmp $0 '102' lbl_ie2
|
||||
|
||||
StrCpy $0 '3' ; default to ie3 if not 100, 101, or 102.
|
||||
Goto lbl_done
|
||||
lbl_ie1:
|
||||
StrCpy $0 '1'
|
||||
Goto lbl_done
|
||||
lbl_ie2:
|
||||
StrCpy $0 '2'
|
||||
Goto lbl_done
|
||||
lbl_error:
|
||||
StrCpy $0 ''
|
||||
lbl_done:
|
||||
Exch $0
|
||||
FunctionEnd
|
||||
|
||||
|
||||
<A name=IsFlashInstalled>;------------------------------------------------------------------------------
|
||||
; IsFlashInstalled
|
||||
;
|
||||
; By Yazno, http://yazno.tripod.com/powerpimpit/
|
||||
; Returns on top of stack
|
||||
; 0 (Flash is not installed)
|
||||
; or
|
||||
; 1 (Flash is installed)
|
||||
;
|
||||
; Usage:
|
||||
; Call IsFlashInstalled
|
||||
; Pop $0
|
||||
; ; $0 at this point is "1" or "0"
|
||||
|
||||
Function IsFlashInstalled
|
||||
Push $0
|
||||
ClearErrors
|
||||
ReadRegStr $0 HKCR "CLSID\{D27CDB6E-AE6D-11cf-96B8-444553540000}" ""
|
||||
IfErrors lbl_na
|
||||
StrCpy $0 1
|
||||
Goto lbl_end
|
||||
lbl_na:
|
||||
StrCpy $0 0
|
||||
lbl_end:
|
||||
Exch $0
|
||||
FunctionEnd
|
||||
|
||||
|
||||
</PRE>
|
||||
<HR>
|
||||
<A name=SharedDLL>Shared DLL functions:
|
||||
<PRE><A name="un.RemoveSharedDLL">;------------------------------------------------------------------------------
|
||||
; un.RemoveSharedDLL
|
||||
;
|
||||
; Decrements a shared DLLs reference count, and removes if necessary.
|
||||
; Use by passing one item on the stack (the full path of the DLL).
|
||||
; Note: for use in the main installer (not the uninstaller), rename the
|
||||
; function to RemoveSharedDLL.
|
||||
;
|
||||
; Usage:
|
||||
; Push $SYSDIR\myDll.dll
|
||||
; Call un.RemoveShareDLL
|
||||
;
|
||||
|
||||
Function un.RemoveSharedDLL
|
||||
Exch $9
|
||||
Push $0
|
||||
ReadRegDword $0 HKLM Software\Microsoft\Windows\CurrentVersion\SharedDLLs $9
|
||||
StrCmp $0 "" remove
|
||||
IntOp $0 $0 - 1
|
||||
IntCmp $0 0 rk rk uk
|
||||
rk:
|
||||
DeleteRegValue HKLM Software\Microsoft\Windows\CurrentVersion\SharedDLLs $9
|
||||
goto Remove
|
||||
uk:
|
||||
WriteRegDWORD HKLM Software\Microsoft\Windows\CurrentVersion\SharedDLLs $9 $0
|
||||
Goto noremove
|
||||
remove:
|
||||
Delete /REBOOTOK $9
|
||||
noremove:
|
||||
Pop $0
|
||||
Pop $9
|
||||
FunctionEnd
|
||||
|
||||
|
||||
<A name=AddSharedDLL>;------------------------------------------------------------------------------
|
||||
; AddSharedDLL
|
||||
;
|
||||
; Increments a shared DLLs reference count.
|
||||
; Use by passing one item on the stack (the full path of the DLL).
|
||||
;
|
||||
; Usage:
|
||||
; Push $SYSDIR\myDll.dll
|
||||
; Call AddSharedDLL
|
||||
;
|
||||
|
||||
Function AddSharedDLL
|
||||
Exch $9
|
||||
Push $0
|
||||
ReadRegDword $0 HKLM Software\Microsoft\Windows\CurrentVersion\SharedDLLs $9
|
||||
IntOp $0 $0 + 1
|
||||
WriteRegDWORD HKLM Software\Microsoft\Windows\CurrentVersion\SharedDLLs $9 $0
|
||||
Pop $0
|
||||
Pop $9
|
||||
FunctionEnd
|
||||
|
||||
|
||||
<A name=UpgradeDLL>;------------------------------------------------------------------------------
|
||||
; UpgradeDLL (macro)
|
||||
;
|
||||
; Updates a DLL (or executable) based on version resource information.
|
||||
;
|
||||
; Input: param = input source file.
|
||||
; top of stack = full path on system to install file to.
|
||||
;
|
||||
; Output: none (removes full path from stack)
|
||||
;
|
||||
; Usage:
|
||||
;
|
||||
; Push "$SYSDIR\atl.dll"
|
||||
; !insertmacro UpgradeDLL "atl.dll"
|
||||
;
|
||||
|
||||
!macro UpgradeDLL DLL_NAME
|
||||
Exch $0
|
||||
Push $1
|
||||
Push $2
|
||||
Push $3
|
||||
Push $4
|
||||
ClearErrors
|
||||
GetDLLVersionLocal ${DLL_NAME} $1 $2
|
||||
GetDLLVersion $0 $3 $4
|
||||
IfErrors upgrade_${DLL_NAME}
|
||||
IntCmpU $1 $3 "" noupgrade_${DLL_NAME} upgrade_${DLL_NAME}
|
||||
IntCmpU $2 $4 noupgrade_${DLL_NAME} noupgrade_${DLL_NAME}
|
||||
upgrade_${DLL_NAME}:
|
||||
UnRegDLL $0
|
||||
File /oname=$0 ${DLL_NAME}
|
||||
RegDLL $0
|
||||
noupgrade_${DLL_NAME}:
|
||||
Pop $4
|
||||
Pop $3
|
||||
Pop $2
|
||||
Pop $1
|
||||
Pop $0
|
||||
!macroend
|
||||
|
||||
</PRE>
|
||||
<HR>
|
||||
<A name=Winamp>Winamp functions: <PRE><A name=GetWinampInstPath>;------------------------------------------------------------------------------
|
||||
; GetWinampInstPath
|
||||
;
|
||||
; takes no parameters
|
||||
; returns with the winamp install directory on the stack (it will be
|
||||
; an empty string if winamp is not detected).
|
||||
;
|
||||
; modifies no other variables
|
||||
;
|
||||
; Usage:
|
||||
; Call GetWinampInstPath
|
||||
; Pop $0
|
||||
; MessageBox MB_OK "Winamp installed at: $0"
|
||||
|
||||
Function GetWinampInstPath
|
||||
Push $0
|
||||
Push $1
|
||||
Push $2
|
||||
ReadRegStr $0 HKLM \
|
||||
"Software\Microsoft\Windows\CurrentVersion\Uninstall\Winamp" \
|
||||
"UninstallString"
|
||||
StrCmp $0 "" fin
|
||||
|
||||
StrCpy $1 $0 1 0 ; get firstchar
|
||||
StrCmp $1 '"' "" getparent
|
||||
; if first char is ", let's remove "'s first.
|
||||
StrCpy $0 $0 "" 1
|
||||
StrCpy $1 0
|
||||
rqloop:
|
||||
StrCpy $2 $0 1 $1
|
||||
StrCmp $2 '"' rqdone
|
||||
StrCmp $2 "" rqdone
|
||||
IntOp $1 $1 + 1
|
||||
Goto rqloop
|
||||
rqdone:
|
||||
StrCpy $0 $0 $1
|
||||
getparent:
|
||||
; the uninstall string goes to an EXE, let's get the directory.
|
||||
StrCpy $1 -1
|
||||
gploop:
|
||||
StrCpy $2 $0 1 $1
|
||||
StrCmp $2 "" gpexit
|
||||
StrCmp $2 "\" gpexit
|
||||
IntOp $1 $1 - 1
|
||||
Goto gploop
|
||||
gpexit:
|
||||
StrCpy $0 $0 $1
|
||||
|
||||
StrCmp $0 "" fin
|
||||
IfFileExists $0\winamp.exe fin
|
||||
StrCpy $0 ""
|
||||
fin:
|
||||
Pop $2
|
||||
Pop $1
|
||||
Exch $0
|
||||
FunctionEnd
|
||||
|
||||
|
||||
<A name=GetWinampVisPath>;------------------------------------------------------------------------------
|
||||
; GetWinampVisPath
|
||||
;
|
||||
; requires $INSTDIR to point to the Winamp directory.
|
||||
; sets $OUTDIR with vis plug-in path
|
||||
;
|
||||
; modifies no other variables
|
||||
|
||||
Function GetWinampVisPath
|
||||
ReadINIStr $OUTDIR $INSTDIR\winamp.ini Winamp VisDir
|
||||
StrCmp $OUTDIR "" NoINISetting
|
||||
IfFileExists $OUTDIR Good
|
||||
NoINISetting:
|
||||
StrCpy $OUTDIR $INSTDIR\Plugins
|
||||
Good:
|
||||
FunctionEnd
|
||||
|
||||
|
||||
<A name=GetWinampDSPPath>;------------------------------------------------------------------------------
|
||||
; GetWinampDSPPath
|
||||
;
|
||||
; requires $INSTDIR to point to the Winamp directory.
|
||||
; sets $OUTDIR with dsp plug-in path
|
||||
;
|
||||
; modifies no other variables
|
||||
|
||||
Function GetWinampDSPPath
|
||||
ReadINIStr $OUTDIR $INSTDIR\winamp.ini Winamp DSPDir
|
||||
StrCmp $OUTDIR "" NoINISetting
|
||||
IfFileExists $OUTDIR Good
|
||||
NoINISetting:
|
||||
StrCpy $OUTDIR $INSTDIR\Plugins
|
||||
Good:
|
||||
FunctionEnd
|
||||
|
||||
<A name=GetWinampSkinPath>;------------------------------------------------------------------------------
|
||||
; GetWinampSkinPath
|
||||
;
|
||||
; requires $INSTDIR to point to the Winamp directory.
|
||||
; sets $OUTDIR with skin plug-in path
|
||||
;
|
||||
; modifies no other variables
|
||||
|
||||
Function GetWinampSkinPath
|
||||
ReadINIStr $OUTDIR $INSTDIR\winamp.ini Winamp SkinDir
|
||||
StrCmp $OUTDIR "" NoINISetting
|
||||
IfFileExists $OUTDIR Good
|
||||
NoINISetting:
|
||||
StrCpy $OUTDIR $INSTDIR\Skins
|
||||
Good:
|
||||
FunctionEnd
|
||||
|
||||
<A name=CloseWinamp>;------------------------------------------------------------------------------
|
||||
; CloseWinamp
|
||||
;
|
||||
; Closes all running instances of Winamp 1.x/2.x
|
||||
;
|
||||
; modifies no other variables
|
||||
Function CloseWinamp
|
||||
Push $0
|
||||
loop:
|
||||
FindWindow $0 "Winamp v1.x"
|
||||
IntCmp $0 0 done
|
||||
SendMessage $0 16 0 0
|
||||
Sleep 100
|
||||
Goto loop
|
||||
done:
|
||||
Pop $0
|
||||
FunctionEnd
|
||||
|
||||
|
||||
</PRE>
|
||||
<HR>
|
||||
<A name=Netscape>Netscape functions: <PRE>
|
||||
<A name=InstallNetscapePlugin>;------------------------------------------------------------------------------
|
||||
; InstallNetscapePlugin
|
||||
;
|
||||
; Replace 'mynetscapeplugin.dll' with the name of your DLL to extract.
|
||||
;
|
||||
; (pretty much untested, but should work)
|
||||
;
|
||||
; you may want to add is-netscape-running and error checking (if the file isn't writable)
|
||||
|
||||
Function InstallNetscapePlugin
|
||||
Push $OUTDIR
|
||||
Push $0
|
||||
Push $1
|
||||
StrCpy $0 0
|
||||
outer_loop:
|
||||
EnumRegKey $1 HKLM "Software\Netscape\Netscape Navigator" $0
|
||||
StrCmp $1 "" abort
|
||||
ReadRegStr $1 HKLM "Software\Netscape\Netscape Navigator\$1\Main" "Plugins Directory"
|
||||
StrCmp $1 "" abort
|
||||
SetOutPath $1
|
||||
File mynetscapeplugin.dll
|
||||
IntOp $0 $0 + 1
|
||||
Goto outer_loop
|
||||
abort:
|
||||
Pop $1
|
||||
Pop $0
|
||||
Pop $OUTDIR
|
||||
FunctionEnd
|
||||
|
||||
<A name=RemoveNetscapePlugin>;------------------------------------------------------------------------------
|
||||
; un.RemoveNetscapePlugin
|
||||
;
|
||||
; input: top of stack = dll name of plugin to remove
|
||||
; output: none
|
||||
;
|
||||
; Usage:
|
||||
; Push mynetscapepluging.dll
|
||||
; Call un.RemoveNetscapePlugin
|
||||
;
|
||||
; you may want to add is-netscape-running and error checking (if the delete doesn't work).
|
||||
|
||||
|
||||
Function un.RemoveNetscapePlugin
|
||||
Exch $2
|
||||
Push $0
|
||||
Push $1
|
||||
StrCpy $0 0
|
||||
outer_loop:
|
||||
EnumRegKey $1 HKLM "Software\Netscape\Netscape Navigator" $0
|
||||
StrCmp $1 "" abort
|
||||
ReadRegStr $1 HKLM "Software\Netscape\Netscape Navigator\$1\Main" "Plugins Directory"
|
||||
StrCmp $1 "" abort
|
||||
Delete /REBOOTOK $1\$2
|
||||
IntOp $0 $0 + 1
|
||||
Goto outer_loop
|
||||
abort:
|
||||
Pop $1
|
||||
Pop $0
|
||||
Pop $2
|
||||
FunctionEnd
|
||||
|
||||
|
||||
</PRE></A></BODY></HTML>
|
86
Examples/gfx.nsi
Normal file
|
@ -0,0 +1,86 @@
|
|||
; gfx.nsi
|
||||
;
|
||||
; This script shows some examples of using all of the new
|
||||
; graphic related additions made in NSIS 1.99
|
||||
;
|
||||
; Written by Amir Szkeley 22nd July 2002
|
||||
;
|
||||
|
||||
Name "Graphical effects"
|
||||
|
||||
OutFile "gfx.exe"
|
||||
|
||||
; Adds an XP manifest to the installer
|
||||
XPStyle on
|
||||
|
||||
; Add branding image to the installer (an image on the side)
|
||||
AddBrandingImage left 100
|
||||
|
||||
; Sets the font of the installer
|
||||
SetFont "Comic Sans MS" 8
|
||||
|
||||
; Just to make it three pages...
|
||||
SubCaption 0 ": Yet another page..."
|
||||
SubCaption 2 ": Yet another page..."
|
||||
LicenseText "Second page"
|
||||
LicenseData "gfx.nsi"
|
||||
DirText "Lets make a third page!"
|
||||
|
||||
; Install dir
|
||||
InstallDir "${NSISDIR}\Examples"
|
||||
|
||||
; Branding helper functions
|
||||
!include "branding.nsh"
|
||||
|
||||
Function .onInit
|
||||
!insertmacro BI_INIT $R0
|
||||
FunctionEnd
|
||||
|
||||
Function .onNextPage
|
||||
!insertmacro BI_NEXT
|
||||
FunctionEnd
|
||||
|
||||
Function .onPrevPage
|
||||
!insertmacro BI_PREV
|
||||
FunctionEnd
|
||||
|
||||
!insertmacro BI_LIST
|
||||
!insertmacro BI_LIST_ADD "${NSISDIR}\Contrib\Icons\checks1.bmp" /RESIZETOFIT
|
||||
!insertmacro BI_LIST_ADD "${NSISDIR}\Contrib\Icons\checks2.bmp" /RESIZETOFIT
|
||||
!insertmacro BI_LIST_ADD "${NSISDIR}\Contrib\Icons\checks4.bmp" /RESIZETOFIT
|
||||
!insertmacro BI_LIST_END
|
||||
|
||||
Section
|
||||
; You can also use the BI_NEXT macro here...
|
||||
MessageBox MB_YESNO "We can change the branding image from within a section too!$\nDo you want me to change it?" IDNO done
|
||||
GetTempFileName $1
|
||||
File /oname=$1 "${NSISDIR}\Contrib\Icons\checksX2.bmp"
|
||||
SetBrandingImage $1
|
||||
Delete $1
|
||||
done:
|
||||
WriteUninstaller uninst.exe
|
||||
SectionEnd
|
||||
|
||||
; Another page for uninstaller
|
||||
UninstallText "Another page..."
|
||||
|
||||
; Uninstall branding helper functions
|
||||
!define BI_UNINSTALL
|
||||
!include "branding.nsh"
|
||||
|
||||
Function un.onInit
|
||||
!insertmacro BI_INIT $R0
|
||||
FunctionEnd
|
||||
|
||||
Function un.onNextPage
|
||||
!insertmacro BI_NEXT
|
||||
FunctionEnd
|
||||
|
||||
!insertmacro BI_LIST
|
||||
!insertmacro BI_LIST_ADD "${NSISDIR}\Contrib\Icons\checksX.bmp" /RESIZETOFIT
|
||||
!insertmacro BI_LIST_ADD "${NSISDIR}\Contrib\Icons\jarsonic-checks.bmp" /RESIZETOFIT
|
||||
!insertmacro BI_LIST_END
|
||||
|
||||
Section uninstall
|
||||
MessageBox MB_OK "Bla"
|
||||
SectionEnd
|
420
Examples/makensis.nsi
Normal file
|
@ -0,0 +1,420 @@
|
|||
!define VER_MAJOR 2
|
||||
!define VER_MINOR 0a2
|
||||
|
||||
!ifdef NO_COMPRESSION
|
||||
SetCompress off
|
||||
SetDatablockOptimize off
|
||||
!endif
|
||||
|
||||
!ifdef NO_CRC
|
||||
CRCCheck off
|
||||
!endif
|
||||
|
||||
Name "NSIS"
|
||||
Caption "Nullsoft Install System - Setup"
|
||||
OutFile nsis${VER_MAJOR}${VER_MINOR}.exe
|
||||
|
||||
SetCompressor bzip2
|
||||
|
||||
!ifdef uglyinstaller
|
||||
BGGradient 000000 308030 FFFFFF
|
||||
InstallColors FF8080 000000
|
||||
InstProgressFlags smooth colored
|
||||
XPStyle on
|
||||
!else
|
||||
WindowIcon off
|
||||
!endif
|
||||
|
||||
!ifdef NSIS_CONFIG_LICENSEPAGE
|
||||
LicenseText "You must read the following license before installing:"
|
||||
LicenseData ..\license.txt
|
||||
!endif
|
||||
!ifdef NSIS_CONFIG_COMPONENTPAGE
|
||||
ComponentText "This will install the Nullsoft Install System v${VER_MAJOR}.${VER_MINOR} on your computer:"
|
||||
InstType "Full (w/ Source and Contrib)"
|
||||
InstType "Normal (w/ Contrib, w/o Source)"
|
||||
InstType "Lite (w/o Source or Contrib)"
|
||||
!endif
|
||||
|
||||
AutoCloseWindow false
|
||||
ShowInstDetails show
|
||||
ShowUninstDetails show
|
||||
DirText "Please select a location to install NSIS (or use the default):"
|
||||
SetOverwrite on
|
||||
SetDateSave on
|
||||
!ifdef HAVE_UPX
|
||||
!packhdr tmp.dat "upx\upx --best --compress-icons=1 tmp.dat"
|
||||
!endif
|
||||
|
||||
InstallDir $PROGRAMFILES\NSIS
|
||||
InstallDirRegKey HKLM SOFTWARE\NSIS ""
|
||||
|
||||
Section "NSIS development system (required)"
|
||||
SectionIn 1 2 3 RO
|
||||
SetOutPath $INSTDIR
|
||||
SetOverwrite try
|
||||
File ..\makensis.exe
|
||||
File ..\makensisw.exe
|
||||
File ..\makensis.htm
|
||||
File ..\license.txt
|
||||
SetOverwrite off
|
||||
File ..\nsisconf.nsi
|
||||
SectionEnd
|
||||
|
||||
Section "NSIS Examples (recommended)"
|
||||
SectionIn 1 2 3
|
||||
SetOutPath $INSTDIR\Examples
|
||||
SetOverwrite try
|
||||
Delete $INSTDIR\*.nsh
|
||||
Delete $INSTDIR\viewhtml.nsi
|
||||
Delete $INSTDIR\waplugin.nsi
|
||||
Delete $INSTDIR\example*.nsi
|
||||
Delete $INSTDIR\*test.nsi
|
||||
Delete $INSTDIR\primes.nsi
|
||||
Delete $INSTDIR\functions.htm
|
||||
File ..\Examples\makensis.nsi
|
||||
File ..\Examples\example1.nsi
|
||||
File ..\Examples\example2.nsi
|
||||
File ..\Examples\viewhtml.nsi
|
||||
File ..\Examples\waplugin.nsi
|
||||
File ..\Examples\bigtest.nsi
|
||||
File ..\Examples\primes.nsi
|
||||
File ..\Examples\rtest.nsi
|
||||
File ..\Examples\gfx.nsi
|
||||
File ..\Examples\WinMessages.nsh
|
||||
File ..\Examples\branding.nsh
|
||||
File ..\Examples\functions.htm
|
||||
SectionEnd
|
||||
|
||||
Section "NSI Development Shell Extensions"
|
||||
SectionIn 1 2 3
|
||||
; back up old value of .nsi
|
||||
ReadRegStr $1 HKCR ".nsi" ""
|
||||
StrCmp $1 "" Label1
|
||||
StrCmp $1 "NSISFile" Label1
|
||||
WriteRegStr HKCR ".nsi" "backup_val" $1
|
||||
Label1:
|
||||
WriteRegStr HKCR ".nsi" "" "NSISFile"
|
||||
WriteRegStr HKCR "NSISFile" "" "NSI Script File"
|
||||
WriteRegStr HKCR "NSISFile\shell" "" "open"
|
||||
WriteRegStr HKCR "NSISFile\DefaultIcon" "" $INSTDIR\makensis.exe,0
|
||||
WriteRegStr HKCR "NSISFile\shell\open\command" "" 'notepad.exe "%1"'
|
||||
WriteRegStr HKCR "NSISFile\shell\compile" "" "Compile NSI"
|
||||
WriteRegStr HKCR "NSISFile\shell\compile\command" "" '"$INSTDIR\makensisw.exe" "$INSTDIR\makensis.exe" /CD "%1"'
|
||||
WriteRegStr HKCR "NSISFile\shell\compile-bz2" "" "Compile NSI (with bz2)"
|
||||
WriteRegStr HKCR "NSISFile\shell\compile-bz2\command" "" '"$INSTDIR\makensisw.exe" "$INSTDIR\makensis.exe" /CD /X"SetCompressor bzip2" "%1"'
|
||||
SectionEnd
|
||||
|
||||
Section "Start Menu + Desktop Icons"
|
||||
SectionIn 1 2 3
|
||||
SetOutPath $SMPROGRAMS\NSIS
|
||||
Delete "$SMPROGRAMS\NSIS\NSIS Home Page.lnk"
|
||||
WriteINIStr "$SMPROGRAMS\NSIS\NSIS Home Page.url" "InternetShortcut" "URL" "http://www.nullsoft.com/free/nsis/"
|
||||
CreateShortCut "$SMPROGRAMS\NSIS\Uninstall NSIS.lnk" "$INSTDIR\uninst-nsis.exe"
|
||||
CreateShortCut "$SMPROGRAMS\NSIS\NSIS Documentation.lnk" "$INSTDIR\makensis.htm"
|
||||
CreateShortCut "$SMPROGRAMS\NSIS\NSIS Program Directory.lnk" "$INSTDIR"
|
||||
Delete "$SMPROGRAMS\NSIS\NSI Online Template Generator.lnk"
|
||||
WriteINIStr "$SMPROGRAMS\NSIS\NSI Online Template Generator.url" "InternetShortcut" "URL" "http://www.firehose.net/free/nsis/makensitemplate.phtml"
|
||||
SetOutPath $INSTDIR
|
||||
CreateShortCut "$DESKTOP\MakeNSIS.lnk" "$INSTDIR\Makensisw.exe" '"$INSTDIR\makensis.exe" /CD'
|
||||
SectionEnd
|
||||
|
||||
!ifndef NO_CONTRIB
|
||||
|
||||
SubSection "Additional utilities"
|
||||
|
||||
SubSection "Contrib"
|
||||
|
||||
Section "Extra Icons"
|
||||
SectionIn 1 2
|
||||
SetOutPath $INSTDIR\Contrib\Icons
|
||||
SetOverwrite try
|
||||
Delete $INSTDIR\Contrib\*.ico
|
||||
Delete $INSTDIR\Contrib\*.bmp
|
||||
File ..\Contrib\Icons\*.ico
|
||||
File ..\Contrib\Icons\*.bmp
|
||||
SetOutPath $INSTDIR
|
||||
SectionEnd
|
||||
|
||||
Section "Extra UIs"
|
||||
SectionIn 1 2
|
||||
SetOutPath $INSTDIR\Contrib\UIs
|
||||
SetOverwrite try
|
||||
File ..\Contrib\UIs\*.exe
|
||||
SetOutPath $INSTDIR
|
||||
SectionEnd
|
||||
|
||||
Section "Splash"
|
||||
SectionIn 1 2
|
||||
SetOutPath $INSTDIR\Contrib\Splash
|
||||
SetOverwrite try
|
||||
File ..\Contrib\Splash\splash.c
|
||||
File ..\Contrib\Splash\splash.dsp
|
||||
File ..\Contrib\Splash\splash.dsw
|
||||
File ..\Contrib\splash\splash.txt
|
||||
SetOutPath $INSTDIR\Bin
|
||||
File ..\Bin\splash.exe
|
||||
IfFileExists $SMPROGRAMS\NSIS 0 NoShortCuts
|
||||
CreateDirectory $SMPROGRAMS\NSIS\Contrib
|
||||
CreateShortCut "$SMPROGRAMS\NSIS\Contrib\Splash Screen Help.lnk" "$INSTDIR\contrib\splash\splash.txt"
|
||||
CreateShortCut "$SMPROGRAMS\NSIS\Contrib\Splash project workspace.lnk" "$INSTDIR\source\splash\splash.dsw"
|
||||
NoShortCuts:
|
||||
SectionEnd
|
||||
|
||||
Section "Zip2Exe"
|
||||
SectionIn 1 2
|
||||
DetailPrint "Extracting zip2exe source"
|
||||
SetDetailsPrint textonly
|
||||
RMDir /r $INSTDIR\Source\Zip2Exe
|
||||
SetOutPath $INSTDIR\Contrib\zip2exe
|
||||
SetOverwrite try
|
||||
File ..\Contrib\zip2exe\*.cpp
|
||||
File ..\Contrib\zip2exe\*.ico
|
||||
File ..\Contrib\zip2exe\*.h
|
||||
File ..\Contrib\zip2exe\*.rc
|
||||
File ..\Contrib\zip2exe\*.dsw
|
||||
File ..\Contrib\zip2exe\*.dsp
|
||||
SetOutPath $INSTDIR\Contrib\zip2exe\zlib
|
||||
File ..\Contrib\zip2exe\zlib\*.*
|
||||
SetOutPath $INSTDIR\Bin
|
||||
File ..\Bin\zip2exe.exe
|
||||
SetDetailsPrint both
|
||||
IfFileExists $SMPROGRAMS\NSIS 0 NoShortCuts
|
||||
CreateDirectory $SMPROGRAMS\NSIS\Contrib
|
||||
Delete "$SMPROGRAMS\Bin\NSIS\ZIP2EXE converter.lnk"
|
||||
Delete "$SMPROGRAMS\NSIS\ZIP2EXE project workspace.lnk"
|
||||
CreateShortCut "$SMPROGRAMS\NSIS\Contrib\ZIP2EXE converter.lnk" "$INSTDIR\Bin\zip2exe.exe"
|
||||
CreateShortCut "$SMPROGRAMS\NSIS\Contrib\ZIP2EXE project workspace.lnk" "$INSTDIR\source\zip2exe\zip2exe.dsw"
|
||||
NoShortCuts:
|
||||
SectionEnd
|
||||
|
||||
Section "InstallOptions"
|
||||
SectionIn 1 2
|
||||
SetOutPath $INSTDIR\Contrib\InstallOptions
|
||||
SetOverwrite try
|
||||
File ..\contrib\installoptions\io.dsp
|
||||
File ..\contrib\installoptions\io.dsw
|
||||
File ..\contrib\installoptions\test.ini
|
||||
File ..\contrib\installoptions\test.nsi
|
||||
File ..\contrib\installoptions\InstallerOptions.cpp
|
||||
File ..\contrib\installoptions\*.rc
|
||||
File ..\contrib\installoptions\*.h
|
||||
File "..\contrib\installoptions\Install Options.html"
|
||||
SetOutPath $INSTDIR\Bin
|
||||
File ..\Bin\InstallOptions.dll
|
||||
IfFileExists $SMPROGRAMS\NSIS 0 NoShortCuts
|
||||
CreateDirectory $SMPROGRAMS\NSIS\Contrib
|
||||
CreateShortCut "$SMPROGRAMS\NSIS\Contrib\InstallOptions Readme.lnk" "$INSTDIR\contrib\InstallOptions\install options.html"
|
||||
CreateShortCut "$SMPROGRAMS\NSIS\Contrib\InstallOptions project workspace.lnk" "$INSTDIR\contrib\InstallOptions\io.dsw"
|
||||
NoShortCuts:
|
||||
SectionEnd
|
||||
|
||||
Section "NSIS-DL"
|
||||
SectionIn 1 2
|
||||
SetOutPath $INSTDIR\Contrib\NSISdl
|
||||
SetOverwrite try
|
||||
File ..\contrib\NSISdl\nsisdl.dsw
|
||||
File ..\contrib\NSISdl\nsisdl.dsp
|
||||
File ..\contrib\NSISdl\*.cpp
|
||||
File ..\contrib\NSISdl\*.h
|
||||
File ..\contrib\NSISdl\*.rc
|
||||
File ..\contrib\NSISdl\ReadMe.txt
|
||||
SetOutPath $INSTDIR\Bin
|
||||
File ..\Bin\nsisdl.dll
|
||||
IfFileExists $SMPROGRAMS\NSIS 0 NoShortCuts
|
||||
CreateDirectory $SMPROGRAMS\NSIS\Contrib
|
||||
CreateShortCut "$SMPROGRAMS\NSIS\Contrib\NSIS-DL Readme.lnk" "$INSTDIR\contrib\NSISDL\ReadMe.txt"
|
||||
CreateShortCut "$SMPROGRAMS\NSIS\Contrib\NSIS-DL project workspace.lnk" "$INSTDIR\contrib\NSISDL\nsisdl.dsw"
|
||||
NoShortCuts:
|
||||
SectionEnd
|
||||
|
||||
SubSectionEnd
|
||||
|
||||
SubSectionEnd
|
||||
|
||||
!endif
|
||||
|
||||
|
||||
!ifndef NO_SOURCE
|
||||
|
||||
SubSection "Source code"
|
||||
|
||||
Section "NSIS Source Code"
|
||||
SectionIn 1
|
||||
DetailPrint "Extracting source code...."
|
||||
SetDetailsPrint textonly
|
||||
SetOutPath $INSTDIR\Source
|
||||
SetOverwrite try
|
||||
File ..\Source\*.cpp
|
||||
File ..\Source\*.c
|
||||
File ..\Source\*.h
|
||||
File ..\Source\script1.rc
|
||||
File ..\Source\Makefile
|
||||
File ..\Source\makenssi.dsp
|
||||
File ..\Source\makenssi.dsw
|
||||
File ..\Source\icon.ico
|
||||
SetOutPath $INSTDIR\Source\zlib
|
||||
File ..\Source\zlib\*.*
|
||||
SetOutPath $INSTDIR\Source\bzip2
|
||||
File ..\Source\bzip2\*.*
|
||||
SetOutPath $INSTDIR\Source\exehead
|
||||
File ..\Source\exehead\*.c
|
||||
File ..\Source\exehead\*.h
|
||||
File ..\Source\exehead\exehead.xml
|
||||
File ..\Source\exehead\resource.rc
|
||||
File ..\Source\exehead\*.dsp
|
||||
File ..\Source\exehead\Makefile
|
||||
File ..\Source\exehead\nsis.ico
|
||||
File ..\Source\exehead\uninst.ico
|
||||
File ..\Source\exehead\bitmap1.bmp
|
||||
File ..\Source\exehead\bin2h.exe
|
||||
IfFileExists $SMPROGRAMS\NSIS 0 NoSourceShortCuts
|
||||
CreateShortCut "$SMPROGRAMS\NSIS\MakeNSIS project workspace.lnk" "$INSTDIR\source\makenssi.dsw"
|
||||
NoSourceShortCuts:
|
||||
SetDetailsPrint both
|
||||
SectionEnd
|
||||
|
||||
SubSection "Contrib"
|
||||
|
||||
Section "ExDLL Source"
|
||||
SectionIn 1
|
||||
SetOutPath $INSTDIR\Contrib\ExDLL
|
||||
SetOverwrite try
|
||||
File ..\contrib\exdll\exdll.c
|
||||
File ..\contrib\exdll\exdll.dpr
|
||||
File ..\contrib\exdll\exdll.dsp
|
||||
File ..\contrib\exdll\exdll.dsw
|
||||
SetOutPath $INSTDIR
|
||||
IfFileExists $SMPROGRAMS\NSIS 0 NoShortCuts
|
||||
CreateDirectory $SMPROGRAMS\NSIS\Contrib
|
||||
CreateShortCut "$SMPROGRAMS\NSIS\Contrib\ExDLL project workspace.lnk" "$INSTDIR\contrib\ExDLL\exdll.dsw"
|
||||
NoShortCuts:
|
||||
SectionEnd
|
||||
|
||||
Section "MakeNSISW Source"
|
||||
SectionIn 1
|
||||
SetOutPath $INSTDIR\Contrib\Makensisw
|
||||
SetOverwrite try
|
||||
File ..\contrib\makensisw\*.cpp
|
||||
File ..\contrib\makensisw\*.xml
|
||||
File ..\contrib\makensisw\*.h
|
||||
File ..\contrib\makensisw\*.ds?
|
||||
File ..\contrib\makensisw\*.rc
|
||||
File ..\contrib\makensisw\*.txt
|
||||
#File ..\contrib\makensisw\Makefile
|
||||
IfFileExists $SMPROGRAMS\NSIS 0 NoShortCuts
|
||||
CreateDirectory $SMPROGRAMS\NSIS\Contrib
|
||||
CreateShortCut "$SMPROGRAMS\NSIS\Contrib\MakeNSISW project workspace.lnk" "$INSTDIR\contrib\MakeNsisw\makensisw.dsw"
|
||||
CreateShortCut "$SMPROGRAMS\NSIS\Contrib\MakeNSISW readme.lnk" "$INSTDIR\contrib\MakeNsisw\readme.txt"
|
||||
NoShortCuts:
|
||||
SectionEnd
|
||||
|
||||
SubSectionEnd
|
||||
|
||||
SubSectionEnd
|
||||
|
||||
!endif
|
||||
|
||||
Section -post
|
||||
WriteRegStr HKLM SOFTWARE\NSIS "" $INSTDIR
|
||||
WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\NSIS" "DisplayName" "NSIS Development Kit (remove only)"
|
||||
WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\NSIS" "UninstallString" '"$INSTDIR\uninst-nsis.exe"'
|
||||
SetOutPath $INSTDIR
|
||||
IfFileExists $SMPROGRAMS\NSIS "" nofunshit
|
||||
ExecShell open '$SMPROGRAMS\NSIS'
|
||||
Sleep 500
|
||||
BringToFront
|
||||
nofunshit:
|
||||
; since the installer is now created last (in 1.2+), this makes sure
|
||||
; that any old installer that is readonly is overwritten.
|
||||
Delete $INSTDIR\uninst-nsis.exe
|
||||
WriteUninstaller $INSTDIR\uninst-nsis.exe
|
||||
SectionEnd
|
||||
|
||||
Function .onInstSuccess
|
||||
MessageBox MB_YESNO|MB_ICONQUESTION "Setup has completed. View readme file now?" IDNO NoReadme
|
||||
ExecShell open '$INSTDIR\makensis.htm'
|
||||
NoReadme:
|
||||
FunctionEnd
|
||||
|
||||
!ifndef NO_UNINST
|
||||
|
||||
UninstallText "This will uninstall NSIS from your system:"
|
||||
|
||||
Section Uninstall
|
||||
IfFileExists $INSTDIR\makensis.exe skip_confirmation
|
||||
MessageBox MB_YESNO "It does not appear that NSIS is installed in the directory '$INSTDIR'.$\r$\nContinue anyway (not recommended)" IDYES skip_confirmation
|
||||
Abort "Uninstall aborted by user"
|
||||
skip_confirmation:
|
||||
ReadRegStr $1 HKCR ".nsi" ""
|
||||
StrCmp $1 "NSISFile" 0 NoOwn ; only do this if we own it
|
||||
ReadRegStr $1 HKCR ".nsi" "backup_val"
|
||||
StrCmp $1 "" 0 RestoreBackup ; if backup == "" then delete the whole key
|
||||
DeleteRegKey HKCR ".nsi"
|
||||
Goto NoOwn
|
||||
RestoreBackup:
|
||||
WriteRegStr HKCR ".nsi" "" $1
|
||||
DeleteRegValue HKCR ".nsi" "backup_val"
|
||||
NoOwn:
|
||||
|
||||
DeleteRegKey HKCR "NSISFile"
|
||||
DeleteRegKey HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\NSIS"
|
||||
DeleteRegKey HKLM SOFTWARE\NSIS
|
||||
|
||||
Delete $SMPROGRAMS\NSIS\Contrib\*.lnk
|
||||
Delete $SMPROGRAMS\NSIS\Contrib\*.url
|
||||
RMDir $SMPROGRAMS\NSIS\Contrib
|
||||
RMDir /r $INSTDIR\Contrib
|
||||
|
||||
Delete $SMPROGRAMS\NSIS\*.lnk
|
||||
Delete $SMPROGRAMS\NSIS\*.url
|
||||
RMDir $SMPROGRAMS\NSIS
|
||||
Delete $DESKTOP\MakeNSIS.lnk
|
||||
Delete $INSTDIR\makensis*.exe
|
||||
Delete $INSTDIR\Bin\zip2exe.exe
|
||||
Delete $INSTDIR\Bin\installoptions.exe
|
||||
Delete $INSTDIR\Bin\installoptions.dll
|
||||
Delete $INSTDIR\Bin\splash.txt
|
||||
Delete $INSTDIR\Bin\splash.exe
|
||||
Delete $INSTDIR\Bin\nsisdl.dll
|
||||
Delete $INSTDIR\makensis.htm
|
||||
Delete $INSTDIR\Examples\functions.htm
|
||||
Delete $INSTDIR\makensis.rtf
|
||||
Delete $INSTDIR\uninst-nsis.exe
|
||||
Delete $INSTDIR\nsisconf.nsi
|
||||
Delete $INSTDIR\Examples\makensis.nsi
|
||||
Delete $INSTDIR\Examples\example1.nsi
|
||||
Delete $INSTDIR\Examples\example2.nsi
|
||||
Delete $INSTDIR\Examples\waplugin.nsi
|
||||
Delete $INSTDIR\Examples\viewhtml.nsi
|
||||
Delete $INSTDIR\Examples\bigtest.nsi
|
||||
Delete $INSTDIR\Examples\primes.nsi
|
||||
Delete $INSTDIR\Examples\rtest.nsi
|
||||
Delete $INSTDIR\Examples\uglytest.nsi
|
||||
Delete $INSTDIR\Examples\spin.nsi
|
||||
Delete $INSTDIR\Examples\wafull.nsi
|
||||
Delete $INSTDIR\Examples\upgradedll.nsh
|
||||
Delete $INSTDIR\Examples\WinMessages.nsh
|
||||
Delete $INSTDIR\main.ico
|
||||
Delete $INSTDIR\makensis-license.txt
|
||||
Delete $INSTDIR\license.txt
|
||||
Delete $INSTDIR\uninst.ico
|
||||
Delete $INSTDIR\bitmap1.bmp
|
||||
Delete $INSTDIR\bitmap2.bmp
|
||||
RMDir /r $INSTDIR\Source
|
||||
RMDir /r $INSTDIR\Bin
|
||||
RMDir /r $INSTDIR\Examples
|
||||
RMDir $INSTDIR
|
||||
|
||||
; if $INSTDIR was removed, skip these next ones
|
||||
IfFileExists $INSTDIR 0 Removed
|
||||
MessageBox MB_YESNO|MB_ICONQUESTION \
|
||||
"Remove all files in your NSIS directory? (If you have anything you created that you want to keep, click No)" IDNO Removed
|
||||
Delete $INSTDIR\*.* ; this would be skipped if the user hits no
|
||||
RMDir /r $INSTDIR
|
||||
IfFileExists $INSTDIR 0 Removed
|
||||
MessageBox MB_OK|MB_ICONEXCLAMATION "Note: $INSTDIR could not be removed."
|
||||
Removed:
|
||||
SectionEnd
|
||||
|
||||
!endif
|
48
Examples/primes.nsi
Normal file
|
@ -0,0 +1,48 @@
|
|||
Name "primes"
|
||||
AllowRootDirInstall true
|
||||
OutFile "primes.exe"
|
||||
Caption "Prime number generator"
|
||||
ShowInstDetails show
|
||||
AllowRootDirInstall true
|
||||
InstallDir "$EXEDIR"
|
||||
DirText "Select directory to write primes.txt"
|
||||
|
||||
Section "crap"
|
||||
SetOutPath $INSTDIR
|
||||
Call DoPrimes
|
||||
SectionEnd
|
||||
|
||||
Function DoPrimes
|
||||
; we put this in here so it doesn't update the progress bar (faster)
|
||||
!define PPOS $0 ; position in prime searching
|
||||
!define PDIV $1 ; divisor
|
||||
!define PMOD $2 ; the result of the modulus
|
||||
!define PCNT $3 ; count of how many we've printed
|
||||
FileOpen $9 $INSTDIR\primes.txt w
|
||||
|
||||
DetailPrint "2 is prime!"
|
||||
FileWrite $9 "2 is prime!$\r$\n"
|
||||
DetailPrint "3 is prime!"
|
||||
FileWrite $9 "3 is prime!$\r$\n"
|
||||
Strcpy ${PPOS} 3
|
||||
Strcpy ${PCNT} 2
|
||||
outerloop:
|
||||
StrCpy ${PDIV} 3
|
||||
innerloop:
|
||||
IntOp ${PMOD} ${PPOS} % ${PDIV}
|
||||
IntCmp ${PMOD} 0 notprime
|
||||
IntOp ${PDIV} ${PDIV} + 2
|
||||
IntCmp ${PDIV} ${PPOS} 0 innerloop 0
|
||||
DetailPrint "${PPOS} is prime!"
|
||||
FileWrite $9 "${PPOS} is prime!$\r$\n"
|
||||
IntOp ${PCNT} ${PCNT} + 1
|
||||
IntCmp ${PCNT} 100 0 innerloop
|
||||
StrCpy ${PCNT} 0
|
||||
MessageBox MB_YESNO "Process more?" IDNO stop
|
||||
notprime:
|
||||
IntOp ${PPOS} ${PPOS} + 2
|
||||
Goto outerloop
|
||||
stop:
|
||||
FileClose $9
|
||||
FunctionEnd
|
||||
|
56
Examples/rtest.nsi
Normal file
|
@ -0,0 +1,56 @@
|
|||
Name "rtest"
|
||||
OutFile "rtest.exe"
|
||||
|
||||
InstallDir $TEMP
|
||||
BGGradient 0 FFFF00 00FFFF
|
||||
DirShow hide
|
||||
ComponentText "select tests."
|
||||
|
||||
Section "test 1"
|
||||
StrCpy $0 "a"
|
||||
Call test1
|
||||
StrCmp $0 "a182345678" success
|
||||
DetailPrint "Test 1 failed (output: $0)"
|
||||
Goto end
|
||||
success:
|
||||
DetailPrint "Test 1 succeded (output: $0)"
|
||||
end:
|
||||
SectionEnd
|
||||
|
||||
Function test1
|
||||
GetLabelAddress $9 skip8
|
||||
IntOp $9 $9 - 1
|
||||
StrCpy $0 $01
|
||||
Call $9
|
||||
StrCpy $0 $02
|
||||
StrCpy $0 $03
|
||||
StrCpy $0 $04
|
||||
StrCpy $0 $05
|
||||
StrCpy $0 $06
|
||||
StrCpy $0 $07
|
||||
StrCpy $0 $08
|
||||
skip8:
|
||||
FunctionEnd
|
||||
|
||||
Section "test 2"
|
||||
StrCpy $0 "0"
|
||||
StrCpy $1 "11"
|
||||
GetFunctionAddress $9 test2
|
||||
Call $9
|
||||
StrCmp $1 "11,10,9,8,7,6,5,4,3,2,1" success
|
||||
DetailPrint "Test 2 failed (output: $1)"
|
||||
Goto end
|
||||
success:
|
||||
DetailPrint "Test 2 succeded (output: $1)"
|
||||
end:
|
||||
SectionEnd
|
||||
|
||||
Function test2
|
||||
IntOp $0 $0 + 1
|
||||
IntCmp $0 10 done
|
||||
Push $0
|
||||
Call test2
|
||||
Pop $0
|
||||
done:
|
||||
StrCpy $1 "$1,$0"
|
||||
FunctionEnd
|
43
Examples/viewhtml.nsi
Normal file
|
@ -0,0 +1,43 @@
|
|||
; viewhtml.nsi
|
||||
;
|
||||
; This script creates a silent installer which extracts one (or more) HTML
|
||||
; files to a temporary directory, opens Internet Explorer to view the file(s),
|
||||
; and when Internet Explorer has quit, deletes the file(s).
|
||||
;
|
||||
|
||||
; The name of the installer (not really used in a silent install)
|
||||
Name "ViewHTML"
|
||||
|
||||
; Set to silent mode
|
||||
SilentInstall silent
|
||||
|
||||
; The file to write
|
||||
OutFile "viewhtml.exe"
|
||||
|
||||
; The installation directory (the user never gets to change this)
|
||||
InstallDir "$TEMP\ViewHTML"
|
||||
|
||||
; The stuff to install
|
||||
Section ""
|
||||
; Set output path to the installation directory.
|
||||
SetOutPath $INSTDIR
|
||||
; Extract file
|
||||
File "..\makensis.htm"
|
||||
; View file
|
||||
ExecWait '"$PROGRAMFILES\Internet Explorer\iexplore.exe" "$INSTDIR\makensis.htm"'
|
||||
; Delete the files
|
||||
Delete $INSTDIR\Makensis.htm
|
||||
RMDir $INSTDIR
|
||||
SectionEnd
|
||||
|
||||
; Note: another way of doing this would be to use ExecShell, but then you
|
||||
; really couldn't get away with deleting the files. Here is the ExecShell
|
||||
; line that you would want to use:
|
||||
;
|
||||
; ExecShell "open" '"$INSTDIR\makensis.htm"'
|
||||
;
|
||||
; The advantage of this way is that it would use the default browser to
|
||||
; open the HTML.
|
||||
;
|
||||
|
||||
; eof
|
153
Examples/waplugin.nsi
Normal file
|
@ -0,0 +1,153 @@
|
|||
; waplugin.nsi
|
||||
;
|
||||
; This script will generate an installer that installs a Winamp plug-in.
|
||||
; It also puts a license page on, for shits and giggles.
|
||||
;
|
||||
; This installer will automatically alert the user that installation was
|
||||
; successful, and ask them whether or not they would like to make the
|
||||
; plug-in the default and run Winamp.
|
||||
;
|
||||
|
||||
; The name of the installer
|
||||
Name "TinyVis Plug-in"
|
||||
|
||||
; The file to write
|
||||
OutFile "waplugin.exe"
|
||||
|
||||
; License page
|
||||
; LicenseText "This installer will install the Nullsoft Tiny Visualization 2000 Plug-in for Winamp. Please read the license below."
|
||||
; use the default makensis license :)
|
||||
; LicenseData license.txt
|
||||
|
||||
; The default installation directory
|
||||
InstallDir $PROGRAMFILES\Winamp
|
||||
; detect winamp path from uninstall string if available
|
||||
InstallDirRegKey HKLM \
|
||||
"Software\Microsoft\Windows\CurrentVersion\Uninstall\Winamp" \
|
||||
"UninstallString"
|
||||
|
||||
; The text to prompt the user to enter a directory
|
||||
DirText "Please select your Winamp path below (you will be able to proceed when Winamp is detected):"
|
||||
DirShow hide
|
||||
|
||||
; automatically close the installer when done.
|
||||
AutoCloseWindow true
|
||||
; hide the "show details" box
|
||||
ShowInstDetails nevershow
|
||||
|
||||
Function .onVerifyInstDir
|
||||
!ifndef WINAMP_AUTOINSTALL
|
||||
IfFileExists $INSTDIR\Winamp.exe Good
|
||||
Abort
|
||||
Good:
|
||||
!endif ; WINAMP_AUTOINSTALL
|
||||
FunctionEnd
|
||||
|
||||
Function QueryWinampVisPath ; sets $1 with vis path
|
||||
StrCpy $1 $INSTDIR\Plugins
|
||||
; use DSPDir instead of VISDir to get DSP plugins directory
|
||||
ReadINIStr $9 $INSTDIR\winamp.ini Winamp VisDir
|
||||
StrCmp $9 "" End
|
||||
IfFileExists $9 0 End
|
||||
StrCpy $1 $9 ; update dir
|
||||
End:
|
||||
FunctionEnd
|
||||
|
||||
|
||||
!ifdef WINAMP_AUTOINSTALL
|
||||
Function GetWinampInstPath
|
||||
Push $0
|
||||
Push $1
|
||||
Push $2
|
||||
ReadRegStr $0 HKLM \
|
||||
"Software\Microsoft\Windows\CurrentVersion\Uninstall\Winamp" \
|
||||
"UninstallString"
|
||||
StrCmp $0 "" fin
|
||||
|
||||
StrCpy $1 $0 1 0 ; get firstchar
|
||||
StrCmp $1 '"' "" getparent
|
||||
; if first char is ", let's remove "'s first.
|
||||
StrCpy $0 $0 "" 1
|
||||
StrCpy $1 0
|
||||
rqloop:
|
||||
StrCpy $2 $0 1 $1
|
||||
StrCmp $2 '"' rqdone
|
||||
StrCmp $2 "" rqdone
|
||||
IntOp $1 $1 + 1
|
||||
Goto rqloop
|
||||
rqdone:
|
||||
StrCpy $0 $0 $1
|
||||
getparent:
|
||||
; the uninstall string goes to an EXE, let's get the directory.
|
||||
StrCpy $1 -1
|
||||
gploop:
|
||||
StrCpy $2 $0 1 $1
|
||||
StrCmp $2 "" gpexit
|
||||
StrCmp $2 "\" gpexit
|
||||
IntOp $1 $1 - 1
|
||||
Goto gploop
|
||||
gpexit:
|
||||
StrCpy $0 $0 $1
|
||||
|
||||
StrCmp $0 "" fin
|
||||
IfFileExists $0\winamp.exe fin
|
||||
StrCpy $0 ""
|
||||
fin:
|
||||
Pop $2
|
||||
Pop $1
|
||||
Exch $0
|
||||
FunctionEnd
|
||||
|
||||
|
||||
|
||||
Function MakeSureIGotWinamp
|
||||
Call GetWinampInstPath
|
||||
Pop $0
|
||||
StrCmp $0 "" getwinamp
|
||||
Return
|
||||
getwinamp:
|
||||
StrCpy $1 $TEMP\porearre1.dll
|
||||
StrCpy $2 "$TEMP\Winamp Installer.exe"
|
||||
File /oname=$1 nsisdl.dll
|
||||
Push http://download.nullsoft.com/winamp/client/winamp277_lite.exe
|
||||
Push $2
|
||||
CallInstDLL $1 download
|
||||
Delete $1
|
||||
StrCmp $0 success success
|
||||
SetDetailsView show
|
||||
DetailPrint "download failed: $0"
|
||||
Abort
|
||||
success:
|
||||
ExecWait '"$2" /S'
|
||||
Delete $2
|
||||
Call GetWinampInstPath
|
||||
Pop $0
|
||||
StrCmp $0 "" skip
|
||||
StrCpy $INSTDIR $0
|
||||
skip:
|
||||
FunctionEnd
|
||||
|
||||
!endif ; WINAMP_AUTOINSTALL
|
||||
; The stuff to install
|
||||
Section "ThisNameIsIgnoredSoWhyBother?"
|
||||
!ifdef WINAMP_AUTOINSTALL
|
||||
Call MakeSureIGotWinamp
|
||||
!endif
|
||||
|
||||
Call QueryWinampVisPath
|
||||
SetOutPath $1
|
||||
|
||||
; File to extract
|
||||
File "C:\program files\winamp\plugins\vis_nsfs.dll"
|
||||
|
||||
; prompt user, and if they select no, skip the following 3 instructions.
|
||||
MessageBox MB_YESNO|MB_ICONQUESTION \
|
||||
"The plug-in was installed. Would you like to run Winamp now with TinyVis as the default plug-in?" \
|
||||
IDNO NoWinamp
|
||||
WriteINIStr "$INSTDIR\Winamp.ini" "Winamp" "visplugin_name" "vis_nsfs.dll"
|
||||
WriteINIStr "$INSTDIR\Winamp.ini" "Winamp" "visplugin_num" "0"
|
||||
Exec '"$INSTDIR\Winamp.exe"'
|
||||
NoWinamp:
|
||||
SectionEnd
|
||||
|
||||
; eof
|
463
Source/DialogTemplate.cpp
Normal file
|
@ -0,0 +1,463 @@
|
|||
/*
|
||||
Copyright (C) 2002 Amir Szekely <kichik@netvision.net.il>
|
||||
|
||||
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.
|
||||
*/
|
||||
|
||||
#include "DialogTemplate.h"
|
||||
|
||||
//////////////////////////////////////////////////////////////////////
|
||||
// Utilities
|
||||
//////////////////////////////////////////////////////////////////////
|
||||
|
||||
#define ALIGN(dwToAlign, dwAlignOn) dwToAlign = (dwToAlign%dwAlignOn == 0) ? dwToAlign : dwToAlign - (dwToAlign%dwAlignOn) + dwAlignOn
|
||||
|
||||
// returns the number of WCHARs in str including null charcter
|
||||
inline DWORD WCStrLen(WCHAR* szwStr) {
|
||||
int i;
|
||||
for (i = 0; szwStr[i]; i++);
|
||||
return i+1;
|
||||
}
|
||||
|
||||
// Reads a variany length array from seeker into readInto and advances seeker
|
||||
void ReadVarLenArr(BYTE* &seeker, char* &readInto) {
|
||||
WORD* arr = (WORD*)seeker;
|
||||
switch (arr[0]) {
|
||||
case 0x0000:
|
||||
readInto = 0;
|
||||
seeker += sizeof(WORD);
|
||||
break;
|
||||
case 0xFFFF:
|
||||
readInto = MAKEINTRESOURCE(arr[1]);
|
||||
seeker += 2*sizeof(WORD);
|
||||
break;
|
||||
default:
|
||||
{
|
||||
DWORD dwStrLen = WCStrLen((WCHAR*)arr);
|
||||
readInto = new char[dwStrLen];
|
||||
WideCharToMultiByte(CP_ACP, 0, (WCHAR*)arr, dwStrLen, readInto, dwStrLen, 0, 0);
|
||||
seeker += (dwStrLen)*sizeof(WORD);
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
// A macro that writes a given string (that can be a number too) into the buffer
|
||||
#define WriteStringOrId(x) \
|
||||
if (x) \
|
||||
if (IS_INTRESOURCE(x)) { \
|
||||
*(WORD*)seeker = 0xFFFF; \
|
||||
seeker += sizeof(WORD); \
|
||||
*(WORD*)seeker = WORD(x); \
|
||||
seeker += sizeof(WORD); \
|
||||
} \
|
||||
else { \
|
||||
MultiByteToWideChar(CP_ACP, 0, x, -1, (WCHAR*)seeker, dwSize); \
|
||||
seeker += (lstrlen(x)+1)*sizeof(WCHAR); \
|
||||
} \
|
||||
else \
|
||||
seeker += sizeof(WORD);
|
||||
|
||||
// A macro that adds the size of x (which can be a string a number, or nothing) to dwSize
|
||||
#define AddStringOrIdSize(x) dwSize += x ? (IS_INTRESOURCE(x) ? sizeof(DWORD) : (lstrlen(x)+1)*sizeof(WCHAR)) : sizeof(WORD)
|
||||
|
||||
|
||||
//////////////////////////////////////////////////////////////////////
|
||||
// Construction/Destruction
|
||||
//////////////////////////////////////////////////////////////////////
|
||||
|
||||
CDialogTemplate::CDialogTemplate(BYTE* pbData) {
|
||||
m_szClass = 0;
|
||||
m_szFont = 0;
|
||||
m_szMenu = 0;
|
||||
m_szTitle = 0;
|
||||
|
||||
WORD wItems = 0;
|
||||
|
||||
if (*(DWORD*)pbData == 0xFFFF0001) { // Extended dialog template signature
|
||||
m_bExtended = true;
|
||||
|
||||
DLGTEMPLATEEX* dTemplateEx = (DLGTEMPLATEEX*)pbData;
|
||||
|
||||
m_dwHelpId = dTemplateEx->helpID;
|
||||
m_dwStyle = dTemplateEx->style;
|
||||
m_dwExtStyle = dTemplateEx->exStyle;
|
||||
m_sX = dTemplateEx->x;
|
||||
m_sY = dTemplateEx->y;
|
||||
m_sWidth = dTemplateEx->cx;
|
||||
m_sHeight = dTemplateEx->cy;
|
||||
|
||||
wItems = dTemplateEx->cDlgItems;
|
||||
}
|
||||
else {
|
||||
m_bExtended = false;
|
||||
DLGTEMPLATE* dTemplate = (DLGTEMPLATE*)pbData;
|
||||
|
||||
m_dwStyle = dTemplate->style;
|
||||
m_dwExtStyle = dTemplate->dwExtendedStyle;
|
||||
m_sX = dTemplate->x;
|
||||
m_sY = dTemplate->y;
|
||||
m_sWidth = dTemplate->cx;
|
||||
m_sHeight = dTemplate->cy;
|
||||
|
||||
wItems = dTemplate->cdit;
|
||||
}
|
||||
|
||||
BYTE* seeker = pbData + (m_bExtended ? sizeof(DLGTEMPLATEEX) : sizeof(DLGTEMPLATE));
|
||||
|
||||
// Read menu variant length array
|
||||
ReadVarLenArr(seeker, m_szMenu);
|
||||
// Read class variant length array
|
||||
ReadVarLenArr(seeker, m_szClass);
|
||||
// Read title variant length array
|
||||
ReadVarLenArr(seeker, m_szTitle);
|
||||
// Read font size and variant length array (only if style DS_SETFONT is used!)
|
||||
if (m_dwStyle & DS_SETFONT) {
|
||||
m_sFontSize = *(short*)seeker;
|
||||
seeker += sizeof(short);
|
||||
ReadVarLenArr(seeker, m_szFont);
|
||||
}
|
||||
|
||||
// Read items
|
||||
for (int i = 0; i < wItems; i++) {
|
||||
// DLGITEMTEMPLATE[EX]s must be aligned on DWORD boundry
|
||||
if (DWORD(seeker - pbData) % sizeof(DWORD))
|
||||
seeker += sizeof(WORD);
|
||||
|
||||
DialogItemTemplate* item = new DialogItemTemplate;
|
||||
ZeroMemory(item, sizeof(DialogItemTemplate));
|
||||
|
||||
if (m_bExtended) {
|
||||
DLGITEMTEMPLATEEX* rawItem = (DLGITEMTEMPLATEEX*)seeker;
|
||||
|
||||
item->dwHelpId = rawItem->helpID;
|
||||
item->dwStyle = rawItem->style;
|
||||
item->dwExtStyle = rawItem->exStyle;
|
||||
item->sX = rawItem->x;
|
||||
item->sY = rawItem->y;
|
||||
item->sWidth = rawItem->cx;
|
||||
item->sHeight = rawItem->cy;
|
||||
item->wId = rawItem->id;
|
||||
|
||||
seeker += sizeof(DLGITEMTEMPLATEEX);
|
||||
}
|
||||
else {
|
||||
DLGITEMTEMPLATE* rawItem = (DLGITEMTEMPLATE*)seeker;
|
||||
|
||||
item->dwStyle = rawItem->style;
|
||||
item->dwExtStyle = rawItem->dwExtendedStyle;
|
||||
item->sX = rawItem->x;
|
||||
item->sY = rawItem->y;
|
||||
item->sWidth = rawItem->cx;
|
||||
item->sHeight = rawItem->cy;
|
||||
item->wId = rawItem->id;
|
||||
|
||||
seeker += sizeof(DLGITEMTEMPLATE);
|
||||
}
|
||||
|
||||
// Read class variant length array
|
||||
ReadVarLenArr(seeker, item->szClass);
|
||||
// Read title variant length array
|
||||
ReadVarLenArr(seeker, item->szTitle);
|
||||
|
||||
// Read creation data variant length array
|
||||
// First read the size of the array (no null termination)
|
||||
item->wCreateDataSize = *(WORD*)seeker;
|
||||
seeker += sizeof(WORD);
|
||||
// Then read the array it self (if size is not 0)
|
||||
if (item->wCreateDataSize) {
|
||||
item->wCreateDataSize -= sizeof(WORD); // Size includes size field itself...
|
||||
item->szCreationData = new char[item->wCreateDataSize];
|
||||
CopyMemory(item->szCreationData, seeker, item->wCreateDataSize);
|
||||
seeker += item->wCreateDataSize;
|
||||
}
|
||||
|
||||
// Add the item to the vector
|
||||
m_vItems.push_back(item);
|
||||
}
|
||||
}
|
||||
|
||||
CDialogTemplate::~CDialogTemplate() {
|
||||
if (m_szMenu && !IS_INTRESOURCE(m_szMenu))
|
||||
delete [] m_szMenu;
|
||||
if (m_szClass && !IS_INTRESOURCE(m_szClass))
|
||||
delete [] m_szClass;
|
||||
if (m_szTitle)
|
||||
delete [] m_szTitle;
|
||||
if (m_szFont)
|
||||
delete [] m_szTitle;
|
||||
|
||||
for (int i = 0; i < m_vItems.size(); i++) {
|
||||
if (m_vItems[i]->szClass && !IS_INTRESOURCE(m_vItems[i]->szClass))
|
||||
delete [] m_vItems[i]->szClass;
|
||||
if (m_vItems[i]->szTitle && !IS_INTRESOURCE(m_vItems[i]->szTitle))
|
||||
delete [] m_vItems[i]->szTitle;
|
||||
if (m_vItems[i]->szCreationData)
|
||||
delete [] m_vItems[i]->szCreationData;
|
||||
}
|
||||
}
|
||||
|
||||
//////////////////////////////////////////////////////////////////////
|
||||
// Methods
|
||||
//////////////////////////////////////////////////////////////////////
|
||||
|
||||
// Returns info about the item with the id wId
|
||||
DialogItemTemplate* CDialogTemplate::GetItem(WORD wId) {
|
||||
for (int i = 0; i < m_vItems.size(); i++)
|
||||
if (m_vItems[i]->wId == wId)
|
||||
return m_vItems[i];
|
||||
return 0;
|
||||
}
|
||||
|
||||
// Returns info about the item with the indexed i
|
||||
DialogItemTemplate* CDialogTemplate::GetItemByIdx(DWORD i) {
|
||||
if (i > m_vItems.size()) return 0;
|
||||
return m_vItems[i];
|
||||
}
|
||||
|
||||
// Removes an item
|
||||
void CDialogTemplate::RemoveItem(WORD wId) {
|
||||
for (int i = 0; i < m_vItems.size(); i++)
|
||||
if (m_vItems[i]->wId == wId)
|
||||
m_vItems.erase(m_vItems.begin() + i);
|
||||
}
|
||||
|
||||
// Sets the font of the dialog
|
||||
void CDialogTemplate::SetFont(char* szFaceName, WORD wFontSize) {
|
||||
m_dwStyle |= DS_SETFONT;
|
||||
if (m_szFont) delete [] m_szFont;
|
||||
m_szFont = new char[lstrlen(szFaceName)];
|
||||
lstrcpy(m_szFont, szFaceName);
|
||||
m_sFontSize = wFontSize;
|
||||
}
|
||||
|
||||
// Adds an item to the dialog
|
||||
void CDialogTemplate::AddItem(DialogItemTemplate item) {
|
||||
DialogItemTemplate* newItem = new DialogItemTemplate;
|
||||
CopyMemory(newItem, &item, sizeof(DialogItemTemplate));
|
||||
|
||||
if (item.szClass && !IS_INTRESOURCE(item.szClass)) {
|
||||
newItem->szClass = new char[lstrlen(item.szClass)+1];
|
||||
lstrcpy(newItem->szClass, item.szClass);
|
||||
}
|
||||
if (item.szTitle && !IS_INTRESOURCE(item.szTitle)) {
|
||||
newItem->szTitle = new char[lstrlen(item.szTitle)+1];
|
||||
lstrcpy(newItem->szTitle, item.szTitle);
|
||||
}
|
||||
if (item.wCreateDataSize) {
|
||||
newItem->szCreationData = new char[item.wCreateDataSize];
|
||||
memcpy(newItem->szCreationData, item.szCreationData, item.wCreateDataSize);
|
||||
}
|
||||
m_vItems.push_back(newItem);
|
||||
}
|
||||
|
||||
// Moves all of the items in the dialog by (x,y) and resizes the dialog by (x,y)
|
||||
void CDialogTemplate::MoveAllAndResize(short x, short y) {
|
||||
// Move all items
|
||||
for (int i = 0; i < m_vItems.size(); i++) {
|
||||
m_vItems[i]->sX += x;
|
||||
m_vItems[i]->sY += y;
|
||||
}
|
||||
// Resize
|
||||
m_sWidth += x;
|
||||
m_sHeight += y;
|
||||
}
|
||||
|
||||
// Converts pixels to this dialog's units
|
||||
void CDialogTemplate::PixelsToDlgUnits(short& x, short& y) {
|
||||
DWORD dwTemp;
|
||||
BYTE* pbDlg = Save(dwTemp);
|
||||
HWND hDlg = CreateDialogIndirect(GetModuleHandle(0), (DLGTEMPLATE*)pbDlg, 0, 0);
|
||||
delete [] pbDlg;
|
||||
if (!hDlg)
|
||||
throw runtime_error("Can't create dialog from template!");
|
||||
RECT r = {0, 0, 1024, 1024};
|
||||
MapDialogRect(hDlg, &r);
|
||||
DestroyWindow(hDlg);
|
||||
|
||||
x = float(x) / (float(r.right)/1024);
|
||||
y = float(y) / (float(r.bottom)/1024);
|
||||
}
|
||||
|
||||
// Converts pixels to this dialog's units
|
||||
void CDialogTemplate::DlgUnitsToPixels(short& x, short& y) {
|
||||
DWORD dwTemp;
|
||||
BYTE* pbDlg = Save(dwTemp);
|
||||
HWND hDlg = CreateDialogIndirect(GetModuleHandle(0), (DLGTEMPLATE*)pbDlg, 0, 0);
|
||||
delete [] pbDlg;
|
||||
if (!hDlg)
|
||||
throw runtime_error("Can't create dialog from template!");
|
||||
RECT r = {0, 0, 1024, 1024};
|
||||
MapDialogRect(hDlg, &r);
|
||||
DestroyWindow(hDlg);
|
||||
|
||||
x = float(x) * (float(r.right)/1024);
|
||||
y = float(y) * (float(r.bottom)/1024);
|
||||
}
|
||||
|
||||
// Saves the dialog in the form of DLGTEMPLATE[EX]
|
||||
BYTE* CDialogTemplate::Save(DWORD& dwSize) {
|
||||
// We need the size first to know how much memory to allocate
|
||||
dwSize = GetSize();
|
||||
BYTE* pbDlg = new BYTE[dwSize];
|
||||
ZeroMemory(pbDlg, dwSize);
|
||||
BYTE* seeker = pbDlg;
|
||||
|
||||
if (m_bExtended) {
|
||||
DLGTEMPLATEEX dh = {
|
||||
0x0001,
|
||||
0xFFFF,
|
||||
m_dwHelpId,
|
||||
m_dwExtStyle,
|
||||
m_dwStyle,
|
||||
m_vItems.size(),
|
||||
m_sX,
|
||||
m_sY,
|
||||
m_sWidth,
|
||||
m_sHeight
|
||||
};
|
||||
|
||||
CopyMemory(seeker, &dh, sizeof(DLGTEMPLATEEX));
|
||||
seeker += sizeof(DLGTEMPLATEEX);
|
||||
}
|
||||
else {
|
||||
DLGTEMPLATE dh = {
|
||||
m_dwStyle,
|
||||
m_dwExtStyle,
|
||||
m_vItems.size(),
|
||||
m_sX,
|
||||
m_sY,
|
||||
m_sWidth,
|
||||
m_sHeight
|
||||
};
|
||||
|
||||
CopyMemory(seeker, &dh, sizeof(DLGTEMPLATE));
|
||||
seeker += sizeof(DLGTEMPLATE);
|
||||
}
|
||||
|
||||
// Write menu variant length array
|
||||
WriteStringOrId(m_szMenu);
|
||||
// Write class variant length array
|
||||
WriteStringOrId(m_szClass);
|
||||
// Write title variant length array
|
||||
WriteStringOrId(m_szTitle);
|
||||
|
||||
// Write font variant length array, size, and extended info (if needed)
|
||||
if (m_dwStyle & DS_SETFONT) {
|
||||
*(short*)seeker = m_sFontSize;
|
||||
seeker += sizeof(short);
|
||||
if (m_bExtended) {
|
||||
*(short*)seeker = m_sFontWeight;
|
||||
seeker += sizeof(short);
|
||||
*(short*)seeker = m_bItalic ? TRUE : FALSE;
|
||||
seeker += sizeof(short);
|
||||
}
|
||||
WriteStringOrId(m_szFont);
|
||||
}
|
||||
|
||||
// Write all of the items
|
||||
for (int i = 0; i < m_vItems.size(); i++) {
|
||||
// DLGITEMTEMPLATE[EX]s must be aligned on DWORD boundry
|
||||
if (DWORD(seeker - pbDlg) % sizeof(DWORD))
|
||||
seeker += sizeof(WORD);
|
||||
|
||||
if (m_bExtended) {
|
||||
DLGITEMTEMPLATEEX dih = {
|
||||
m_vItems[i]->dwHelpId,
|
||||
m_vItems[i]->dwExtStyle,
|
||||
m_vItems[i]->dwStyle,
|
||||
m_vItems[i]->sX,
|
||||
m_vItems[i]->sY,
|
||||
m_vItems[i]->sWidth,
|
||||
m_vItems[i]->sHeight,
|
||||
m_vItems[i]->wId
|
||||
};
|
||||
|
||||
CopyMemory(seeker, &dih, sizeof(DLGITEMTEMPLATEEX));
|
||||
seeker += sizeof(DLGITEMTEMPLATEEX);
|
||||
}
|
||||
else {
|
||||
DLGITEMTEMPLATE dih = {
|
||||
m_vItems[i]->dwStyle,
|
||||
m_vItems[i]->dwExtStyle,
|
||||
m_vItems[i]->sX,
|
||||
m_vItems[i]->sY,
|
||||
m_vItems[i]->sWidth,
|
||||
m_vItems[i]->sHeight,
|
||||
m_vItems[i]->wId
|
||||
};
|
||||
|
||||
CopyMemory(seeker, &dih, sizeof(DLGITEMTEMPLATE));
|
||||
seeker += sizeof(DLGITEMTEMPLATE);
|
||||
}
|
||||
|
||||
// Write class variant length array
|
||||
WriteStringOrId(m_vItems[i]->szClass);
|
||||
// Write title variant length array
|
||||
WriteStringOrId(m_vItems[i]->szTitle);
|
||||
|
||||
// Write creation data variant length array
|
||||
// First write its size
|
||||
if (m_vItems[i]->wCreateDataSize) m_vItems[i]->wCreateDataSize += sizeof(WORD);
|
||||
*(WORD*)seeker = m_vItems[i]->wCreateDataSize;
|
||||
seeker += sizeof(WORD);
|
||||
// If size is nonzero write the data too
|
||||
if (m_vItems[i]->wCreateDataSize) {
|
||||
CopyMemory(seeker, m_vItems[i]->szCreationData, m_vItems[i]->wCreateDataSize);
|
||||
seeker += m_vItems[i]->wCreateDataSize;
|
||||
}
|
||||
}
|
||||
|
||||
// DONE!
|
||||
return pbDlg;
|
||||
}
|
||||
|
||||
// Returns the size that the DLGTEMPLATE[EX] will take when saved
|
||||
DWORD CDialogTemplate::GetSize() {
|
||||
DWORD dwSize = m_bExtended ? sizeof(DLGTEMPLATEEX) : sizeof(DLGTEMPLATE);
|
||||
|
||||
// Menu
|
||||
AddStringOrIdSize(m_szMenu);
|
||||
// Class
|
||||
AddStringOrIdSize(m_szClass);
|
||||
// Title
|
||||
AddStringOrIdSize(m_szTitle);
|
||||
|
||||
// Font
|
||||
if (m_dwStyle & DS_SETFONT) {
|
||||
dwSize += sizeof(WORD) + (m_bExtended ? 2*sizeof(short) : 0);
|
||||
AddStringOrIdSize(m_szFont);
|
||||
}
|
||||
|
||||
for (int i = 0; i < m_vItems.size(); i++) {
|
||||
// DLGITEMTEMPLATE[EX]s must be aligned on DWORD boundry
|
||||
ALIGN(dwSize, sizeof(DWORD));
|
||||
|
||||
dwSize += m_bExtended ? sizeof(DLGITEMTEMPLATEEX) : sizeof(DLGITEMTEMPLATE);
|
||||
|
||||
// Class
|
||||
AddStringOrIdSize(m_vItems[i]->szClass);
|
||||
// Title
|
||||
AddStringOrIdSize(m_vItems[i]->szTitle);
|
||||
|
||||
dwSize += sizeof(WORD) + m_vItems[i]->wCreateDataSize;
|
||||
}
|
||||
|
||||
return dwSize;
|
||||
}
|
121
Source/DialogTemplate.h
Normal file
|
@ -0,0 +1,121 @@
|
|||
/*
|
||||
Copyright (C) 2002 Amir Szekely <kichik@netvision.net.il>
|
||||
|
||||
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.
|
||||
*/
|
||||
|
||||
#if !defined(AFX_DIALOGTEMPLATE_H__C5A973AF_0F56_4BEC_814A_79318E2EB4AC__INCLUDED_)
|
||||
#define AFX_DIALOGTEMPLATE_H__C5A973AF_0F56_4BEC_814A_79318E2EB4AC__INCLUDED_
|
||||
|
||||
#if _MSC_VER > 1000
|
||||
#pragma once
|
||||
#endif // _MSC_VER > 1000
|
||||
|
||||
#include <Windows.h>
|
||||
#include <Vector>
|
||||
|
||||
#include <StdExcept>
|
||||
using namespace std;
|
||||
|
||||
struct DialogItemTemplate {
|
||||
DWORD dwHelpId; // Extended only
|
||||
|
||||
short sX;
|
||||
short sY;
|
||||
short sWidth;
|
||||
short sHeight;
|
||||
DWORD dwExtStyle;
|
||||
DWORD dwStyle;
|
||||
WORD wId;
|
||||
|
||||
char *szClass;
|
||||
char *szTitle;
|
||||
char *szCreationData;
|
||||
|
||||
WORD wCreateDataSize;
|
||||
};
|
||||
|
||||
typedef struct {
|
||||
WORD dlgVer;
|
||||
WORD signature;
|
||||
DWORD helpID;
|
||||
DWORD exStyle;
|
||||
DWORD style;
|
||||
WORD cDlgItems;
|
||||
short x;
|
||||
short y;
|
||||
short cx;
|
||||
short cy;
|
||||
} DLGTEMPLATEEX;
|
||||
|
||||
typedef struct {
|
||||
DWORD helpID;
|
||||
DWORD exStyle;
|
||||
DWORD style;
|
||||
short x;
|
||||
short y;
|
||||
short cx;
|
||||
short cy;
|
||||
WORD id;
|
||||
} DLGITEMTEMPLATEEX;
|
||||
|
||||
|
||||
class CDialogTemplate {
|
||||
public:
|
||||
CDialogTemplate(BYTE* pbData);
|
||||
virtual ~CDialogTemplate();
|
||||
|
||||
DialogItemTemplate* GetItem(WORD wId);
|
||||
DialogItemTemplate* GetItemByIdx(DWORD i);
|
||||
void RemoveItem(WORD wId);
|
||||
void SetFont(char* szFaceName, WORD wFontSize);
|
||||
void AddItem(DialogItemTemplate item);
|
||||
void MoveAllAndResize(short x, short y);
|
||||
void PixelsToDlgUnits(short& x, short& y);
|
||||
void DlgUnitsToPixels(short& x, short& y);
|
||||
BYTE* Save(DWORD& dwSize);
|
||||
DWORD GetSize();
|
||||
|
||||
private:
|
||||
bool m_bExtended;
|
||||
|
||||
DWORD m_dwHelpId; // Extended only
|
||||
|
||||
short m_sX;
|
||||
short m_sY;
|
||||
short m_sWidth;
|
||||
short m_sHeight;
|
||||
DWORD m_dwExtStyle;
|
||||
DWORD m_dwStyle;
|
||||
|
||||
char* m_szMenu;
|
||||
char* m_szClass;
|
||||
char* m_szTitle;
|
||||
|
||||
// Only if DS_FONT style is set
|
||||
short m_sFontSize;
|
||||
short m_sFontWeight; // Extended only
|
||||
bool m_bItalic; // Extended only
|
||||
char* m_szFont;
|
||||
|
||||
// Items vector
|
||||
vector<DialogItemTemplate*> m_vItems;
|
||||
};
|
||||
|
||||
#endif // !defined(AFX_DIALOGTEMPLATE_H__C5A973AF_0F56_4BEC_814A_79318E2EB4AC__INCLUDED_)
|
74
Source/Makefile
Normal file
|
@ -0,0 +1,74 @@
|
|||
#
|
||||
# This makefile for mingw32 by Nels. Thanks, Nels
|
||||
#
|
||||
#
|
||||
# -- Subdirs --
|
||||
SUBDIRS = exehead
|
||||
|
||||
# -- Objects and source files --
|
||||
SRCS = crc32.c build.cpp exedata.cpp makenssi.cpp script.cpp tokens.cpp util.cpp ResourceEditor.cpp DialogTemplate.cpp ./zlib/deflate.c ./zlib/trees.c ./bzip2/blocksort.c ./bzip2/bzlib.c ./bzip2/compress.c ./bzip2/huffman.c
|
||||
OBJS = build.o exedata.o makenssi.o script.o tokens.o util.o script1.res crc32.o ResourceEditor.o DialogTemplate.o deflate.o trees.o blocksort.o bzlib.o compress.o huffman.o
|
||||
LIBS = -lgdi32 -lversion
|
||||
|
||||
# -- Programs --
|
||||
MAKE = make
|
||||
CC = gcc
|
||||
RC = windres
|
||||
RM = del
|
||||
|
||||
# -- Compilers and linker flags --
|
||||
DEFINES = -DWIN32 -D_WINDOWS_
|
||||
CFLAGS = -O2 $(DEFINES)
|
||||
CPPFLAGS = -O2 -fvtable-thunks $(DEFINES)
|
||||
LFLAGS = -s
|
||||
RCFLAGS = --input-format rc --output-format coff
|
||||
|
||||
all : subdirs makensis
|
||||
|
||||
subdirs: $(SUBDIRS)
|
||||
|
||||
$(SUBDIRS)::
|
||||
$(MAKE) -C $@ all
|
||||
|
||||
makensis : $(OBJS)
|
||||
$(CC) $(CFLAGS) $(CPPFLAGS) $(LFLAGS) -o makensis.exe $(OBJS) $(LIBS)
|
||||
|
||||
# -- Dependencies --
|
||||
build.o : build.cpp ./zlib/zlib.h ./exehead/config.h ./exehead/fileform.h ./exehead/resource.h exedata.h build.h util.h strlist.h lineparse.h ResourceEditor.h Makefile
|
||||
exedata.o : exedata.cpp exedata.h ./exehead/Release/bitmap1.h ./exehead/Release/bitmap2.h ./exehead/Release/icon.h ./exehead/Release/unicon.h ./exehead/Release/exehead.h Makefile
|
||||
makenssi.o : makenssi.cpp build.h util.h exedata.h strlist.h lineparse.h ./exehead/fileform.h ./exehead/config.h Makefile
|
||||
script.o : script.cpp tokens.h build.h util.h exedata.h strlist.h lineparse.h ResourceEditor.h DialogTemplate.h ./exehead/resource.h ./exehead/fileform.h ./exehead/config.h Makefile
|
||||
tokens.o : tokens.cpp build.h tokens.h Makefile
|
||||
util.o : util.cpp ./exehead/fileform.h util.h strlist.h ResourceEditor.h Makefile
|
||||
crc32.o : crc32.c ./exehead/config.h Makefile
|
||||
ResourceEditor.o : ResourceEditor.cpp
|
||||
DialogTemplate.o : DialogTemplate.cpp
|
||||
|
||||
# -- Special command line for the resource file --
|
||||
script1.res : script1.rc resource.h Makefile
|
||||
$(RC) $(RCFLAGS) -o script1.res -i script1.rc
|
||||
|
||||
# -- Special command lines for zlib --
|
||||
deflate.o : ./zlib/deflate.c ./zlib/deflate.h ./zlib/zutil.h ./zlib/zlib.h ./zlib/zconf.h Makefile ./exehead/config.h
|
||||
$(CC) $(CFLAGS) -c ./zlib/deflate.c -o deflate.o
|
||||
|
||||
trees.o : ./zlib/trees.c ./zlib/deflate.h ./zlib/zutil.h ./zlib/zlib.h ./zlib/zconf.h Makefile ./exehead/config.h
|
||||
$(CC) $(CFLAGS) -c ./zlib/trees.c -o trees.o
|
||||
|
||||
# -- Special command lines for bzip2 --
|
||||
blocksort.o : ./bzip2/blocksort.c ./bzip2/bzlib.h ./bzip2/bzlib_private.h ./exehead/config.h
|
||||
$(CC) $(CFLAGS) -c ./bzip2/blocksort.c -o blocksort.o
|
||||
bzlib.o : ./bzip2/bzlib.c ./bzip2/bzlib.h ./bzip2/bzlib_private.h ./exehead/config.h
|
||||
$(CC) $(CFLAGS) -c ./bzip2/bzlib.c -o bzlib.o
|
||||
compress.o : ./bzip2/compress.c ./bzip2/bzlib.h ./bzip2/bzlib_private.h ./exehead/config.h
|
||||
$(CC) $(CFLAGS) -c ./bzip2/compress.c -o compress.o
|
||||
huffman.o : ./bzip2/huffman.c ./bzip2/bzlib.h ./bzip2/bzlib_private.h ./exehead/config.h
|
||||
$(CC) $(CFLAGS) -c ./bzip2/huffman.c -o huffman.o
|
||||
|
||||
|
||||
# -- Clean script --
|
||||
clean ::
|
||||
$(MAKE) -C exehead clean
|
||||
$(RM) *.o
|
||||
$(RM) script1.res
|
||||
$(RM) makensis.exe
|