
git-svn-id: https://svn.code.sf.net/p/nsis/code/NSIS/trunk@6047 212acab6-be3b-0410-9dea-997c60f758d6
816 lines
23 KiB
C++
816 lines
23 KiB
C++
#include <windows.h>
|
|
#include <tchar.h>
|
|
#include <stdio.h>
|
|
#include <ctype.h>
|
|
#include <commctrl.h>
|
|
|
|
#ifdef _countof
|
|
#define COUNTOF _countof
|
|
#else
|
|
#define COUNTOF(a) (sizeof(a)/sizeof(a[0]))
|
|
#endif
|
|
|
|
/*
|
|
version 0.36
|
|
* Unicode support by Jim Park -- 08/27/2007
|
|
* This support allow Unicode *ZIP file* names but does NOT allow the archive
|
|
* to store Unicode files inside it. That's a ZLIB limitation that I can't
|
|
* do much about.
|
|
|
|
version 0.35
|
|
* drag & drop support
|
|
|
|
version 0.34
|
|
* preserve zip timestamps
|
|
|
|
version 0.33
|
|
* Added solid compression checkbox
|
|
|
|
version 0.32
|
|
* Fixed codepage problems
|
|
|
|
version 0.31 (by Joost Verburg)
|
|
* LZMA compression support
|
|
* Fixed compression setting
|
|
|
|
version 0.31 (by Joost Verburg)
|
|
* Based on header files
|
|
* Improved interface
|
|
* Modern UI support
|
|
* New script code
|
|
* Immproved folder detection
|
|
|
|
portions Copyright © 1999-2001 Miguel Garrido (mgarrido01@hotmail.com)
|
|
|
|
*/
|
|
|
|
extern "C"
|
|
{
|
|
#include "zlib/unzip.h"
|
|
};
|
|
#include "resource.h"
|
|
|
|
const TCHAR *g_errcaption=_T("Zip2Exe Error");
|
|
|
|
HINSTANCE g_hInstance;
|
|
HWND g_hwnd;
|
|
HANDLE g_hThread;
|
|
TCHAR g_cmdline[1024];
|
|
int g_extracting;
|
|
int g_compressor;
|
|
int g_compressor_solid;
|
|
int g_mui;
|
|
int g_zipfile_size;
|
|
|
|
TCHAR *g_options=_T("");//_T("/V3");
|
|
|
|
static BOOL CALLBACK DlgProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam);
|
|
|
|
int WINAPI _tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInst,
|
|
LPTSTR lpszCmdParam, int nCmdShow)
|
|
{
|
|
g_hInstance=hInstance;
|
|
|
|
InitCommonControls();
|
|
return DialogBox(hInstance,MAKEINTRESOURCE(IDD_DIALOG1),GetDesktopWindow(),DlgProc);
|
|
}
|
|
TCHAR tempzip_path[1024];
|
|
|
|
|
|
int made;
|
|
|
|
static void doRMDir(TCHAR *buf)
|
|
{
|
|
HANDLE h;
|
|
WIN32_FIND_DATA fd;
|
|
TCHAR *p=buf;
|
|
while (*p) p++;
|
|
lstrcpy(p,_T("\\*.*"));
|
|
h = FindFirstFile(buf,&fd);
|
|
if (h != INVALID_HANDLE_VALUE)
|
|
{
|
|
do
|
|
{
|
|
if (fd.cFileName[0] != _T('.') ||
|
|
(fd.cFileName[1] != _T('.') && 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(TCHAR *directory)
|
|
{
|
|
TCHAR *p, *p2;
|
|
TCHAR buf[MAX_PATH];
|
|
if (!*directory) return;
|
|
lstrcpy(buf,directory);
|
|
p=buf; while (*p) p++;
|
|
while (p >= buf && *p != _T('\\')) p--;
|
|
p2 = buf;
|
|
if (p2[1] == _T(':')) p2+=4;
|
|
else if (p2[0] == _T('\\') && p2[1] == _T('\\'))
|
|
{
|
|
p2+=2;
|
|
while (*p2 && *p2 != _T('\\')) p2++;
|
|
if (*p2) p2++;
|
|
while (*p2 && *p2 != _T('\\')) 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,_T(""));
|
|
SetDlgItemText(hwndDlg,IDC_ZIPFILE,_T(""));
|
|
SetDlgItemText(hwndDlg,IDC_OUTFILE,_T(""));
|
|
}
|
|
}
|
|
|
|
int tempzip_make(HWND hwndDlg, TCHAR *fn)
|
|
{
|
|
TCHAR buf[MAX_PATH];
|
|
GetTempPath(MAX_PATH,buf);
|
|
GetTempFileName(buf,_T("z2e"),GetTickCount(),tempzip_path);
|
|
if (!CreateDirectory(tempzip_path,NULL))
|
|
{
|
|
GetTempPath(MAX_PATH,tempzip_path);
|
|
_tcscat(tempzip_path,_T("\\nsi"));
|
|
if (!CreateDirectory(tempzip_path,NULL))
|
|
{
|
|
tempzip_path[0]=0;
|
|
MessageBox(hwndDlg,_T("Error creating temporary directory"),g_errcaption,MB_OK|MB_ICONSTOP);
|
|
return 1;
|
|
}
|
|
}
|
|
FILE *fp=_tfopen(fn,_T("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,_T("Error opening ZIP file"),g_errcaption,MB_OK|MB_ICONSTOP);
|
|
return 1;
|
|
}
|
|
|
|
int nf=0, nkb=0;
|
|
g_extracting=1;
|
|
do {
|
|
char filenameA[MAX_PATH];
|
|
unz_file_info info;
|
|
|
|
// ZREAD uses byte size, not TCHAR length.
|
|
unzGetCurrentFileInfo(f,&info,filenameA,sizeof(filenameA),NULL,0,NULL,0);
|
|
|
|
// was zip created on MS-DOS/Windows?
|
|
if ((info.version & 0xFF00) == 0)
|
|
{
|
|
OemToCharBuffA(filenameA, filenameA, strlen(filenameA));
|
|
}
|
|
|
|
#ifdef _UNICODE
|
|
TCHAR filename[MAX_PATH];
|
|
if (MultiByteToWideChar(CP_ACP, 0, filenameA, -1, filename, MAX_PATH) == 0)
|
|
{
|
|
if (f) unzClose(f);
|
|
MessageBox(hwndDlg,_T("Error converting filename to Unicode"), g_errcaption, MB_OK|MB_ICONSTOP);
|
|
return 1;
|
|
}
|
|
#else
|
|
char* filename = filenameA;
|
|
#endif
|
|
|
|
if (filename[0] &&
|
|
filename[_tcsclen(filename)-1] != _T('\\') &&
|
|
filename[_tcsclen(filename)-1] != _T('/'))
|
|
{
|
|
TCHAR *pfn=filename;
|
|
while (*pfn)
|
|
{
|
|
if (*pfn == _T('/')) *pfn=_T('\\');
|
|
pfn++;
|
|
}
|
|
pfn=filename;
|
|
if (pfn[1] == _T(':') && pfn[2] == _T('\\')) pfn+=3;
|
|
while (*pfn == _T('\\')) pfn++;
|
|
|
|
TCHAR out_filename[1024];
|
|
lstrcpy(out_filename,tempzip_path);
|
|
lstrcat(out_filename,_T("\\"));
|
|
lstrcat(out_filename,pfn);
|
|
if (_tcsstr(pfn,_T("\\")))
|
|
{
|
|
TCHAR buf[1024];
|
|
lstrcpy(buf,out_filename);
|
|
TCHAR *p=buf+_tcsclen(buf);
|
|
while (p > buf && *p != _T('\\')) 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 = _tfopen(out_filename,_T("wb"));
|
|
if (fp)
|
|
{
|
|
do
|
|
{
|
|
// Jim Park: Local buf, no need to TCHAR
|
|
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,_T("Error writing output file(s)"),g_errcaption,MB_OK|MB_ICONSTOP);
|
|
g_extracting=0;
|
|
return 1;
|
|
}
|
|
nkb++;
|
|
}
|
|
} while (l > 0);
|
|
|
|
fclose(fp);
|
|
|
|
{
|
|
// set file time
|
|
HANDLE hf = CreateFile(out_filename, GENERIC_WRITE, 0, 0, OPEN_ALWAYS, 0, 0);
|
|
if (hf != INVALID_HANDLE_VALUE)
|
|
{
|
|
FILETIME ft, lft;
|
|
DosDateTimeToFileTime(HIWORD(info.dosDate), LOWORD(info.dosDate), &ft);
|
|
LocalFileTimeToFileTime(&ft, &lft);
|
|
SetFileTime(hf, 0, 0, &lft);
|
|
CloseHandle(hf);
|
|
}
|
|
}
|
|
}
|
|
else
|
|
{
|
|
unzClose(f);
|
|
MessageBox(hwndDlg,_T("Error opening output file(s)"),g_errcaption,MB_OK|MB_ICONSTOP);
|
|
g_extracting=0;
|
|
return 1;
|
|
}
|
|
nf++;
|
|
wsprintf(buf,_T("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,_T("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,_T("Extracted: %d files, %dKB"),nf,nkb);
|
|
SetDlgItemText(hwndDlg,IDC_ZIPINFO_SUMMARY,buf);
|
|
unzClose(f);
|
|
return 0;
|
|
}
|
|
|
|
TCHAR *gp_winamp = _T("(WINAMP DIRECTORY)");
|
|
TCHAR *gp_winamp_plugins = _T("(WINAMP PLUG-INS DIRECTORY)");
|
|
TCHAR *gp_winamp_vis = _T("(WINAMP VIS PLUG-INS DIRECTORY)");
|
|
TCHAR *gp_winamp_dsp = _T("(WINAMP DSP PLUG-INS DIRECTORY)");
|
|
TCHAR *gp_winamp_skins = _T("(WINAMP SKINS DIRECTORY)");
|
|
TCHAR *gp_poi = _T("(PATH OF INSTALLER)");
|
|
|
|
|
|
void wnd_printf(const TCHAR *str)
|
|
{
|
|
if (!*str) return;
|
|
TCHAR existing_text[32000];
|
|
existing_text[0]=0;
|
|
UINT l=GetDlgItemText(g_hwnd, IDC_OUTPUTTEXT, existing_text, 32000);
|
|
l+=_tcsclen(str);
|
|
|
|
TCHAR *p=existing_text;
|
|
existing_text[31000]=0;
|
|
while (l > 31000 && *p)
|
|
{
|
|
while (*p != _T('\r') && *p != _T('\n') && *p)
|
|
{
|
|
p++;
|
|
l--;
|
|
}
|
|
while (*p == _T('\r') || *p == _T('\n'))
|
|
{
|
|
p++;
|
|
l--;
|
|
}
|
|
}
|
|
|
|
TCHAR 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(TCHAR *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(_T(": "));
|
|
wnd_printf((TCHAR*)msg);
|
|
LocalFree(msg);
|
|
}
|
|
|
|
DWORD WINAPI ThreadProc(LPVOID p) // thread that will start & monitor makensis
|
|
{
|
|
TCHAR 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(_T("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(_T("CreateProcess"));
|
|
wnd_printf(_T("\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;
|
|
}
|
|
|
|
DWORD exit=0; //process exit code
|
|
DWORD bread; //bytes read
|
|
DWORD avail; //bytes available
|
|
|
|
// Number of bytes available in the buffer.
|
|
const int bufBytesAvail = sizeof(buf)-sizeof(TCHAR);
|
|
|
|
memset(buf,0,sizeof(buf));
|
|
while (1) //main program loop
|
|
{
|
|
PeekNamedPipe(read_stdout,buf,bufBytesAvail,&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 > bufBytesAvail)
|
|
{
|
|
while (bread >= bufBytesAvail)
|
|
{
|
|
ReadFile(read_stdout,buf,bufBytesAvail,&bread,NULL); //read the stdout pipe
|
|
wnd_printf(buf);
|
|
memset(buf,0,sizeof(buf));
|
|
}
|
|
}
|
|
else
|
|
{
|
|
ReadFile(read_stdout,buf,bufBytesAvail,&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,_T("(source ZIP size was %d bytes)\r\n"),g_zipfile_size);
|
|
wnd_printf(buf);
|
|
|
|
PostMessage(g_hwnd,WM_USER+1203,0,0);
|
|
return 0;
|
|
}
|
|
|
|
|
|
TCHAR nsifilename[MAX_PATH];
|
|
|
|
|
|
|
|
void makeEXE(HWND hwndDlg)
|
|
{
|
|
TCHAR buf[2048];
|
|
GetTempPath(MAX_PATH,buf);
|
|
GetTempFileName(buf,_T("zne"),0,nsifilename);
|
|
#ifdef _UNICODE
|
|
FILE *fp=_tfopen(nsifilename,_T("w, ccs=UNICODE")); // generate a Unicode .NSI file
|
|
#else
|
|
FILE *fp=_tfopen(nsifilename,_T("w"));
|
|
#endif
|
|
if (!fp)
|
|
{
|
|
MessageBox(hwndDlg,_T("Error writing .NSI file"),g_errcaption,MB_OK|MB_ICONSTOP);
|
|
PostMessage(g_hwnd,WM_USER+1203,0,0);
|
|
return;
|
|
}
|
|
GetDlgItemText(hwndDlg,IDC_INSTNAME,buf,sizeof(buf));
|
|
_ftprintf(fp,_T("!define ZIP2EXE_NAME `%s`\n"),buf);
|
|
GetDlgItemText(hwndDlg,IDC_OUTFILE,buf,sizeof(buf));
|
|
_ftprintf(fp,_T("!define ZIP2EXE_OUTFILE `%s`\n"),buf);
|
|
if (g_compressor == 1)
|
|
_ftprintf(fp,_T("!define ZIP2EXE_COMPRESSOR_ZLIB\n"));
|
|
if (g_compressor == 2)
|
|
_ftprintf(fp,_T("!define ZIP2EXE_COMPRESSOR_BZIP2\n"));
|
|
if (g_compressor == 3)
|
|
_ftprintf(fp,_T("!define ZIP2EXE_COMPRESSOR_LZMA\n"));
|
|
if (g_compressor_solid == 1)
|
|
_ftprintf(fp,_T("!define ZIP2EXE_COMPRESSOR_SOLID\n"));
|
|
GetDlgItemText(hwndDlg,IDC_INSTPATH,buf,sizeof(buf));
|
|
int iswinamp=0;
|
|
TCHAR *iswinampmode=NULL;
|
|
if (!_tcscmp(buf,gp_poi)) lstrcpy(buf,_T("$EXEDIR"));
|
|
|
|
if (!_tcscmp(buf,gp_winamp))
|
|
{
|
|
iswinamp=1;
|
|
}
|
|
if (!_tcscmp(buf,gp_winamp_plugins))
|
|
{
|
|
iswinamp=1;
|
|
_ftprintf(fp,_T("!define ZIP2EXE_INSTALLDIR_PLUGINS\n"));
|
|
}
|
|
if (!_tcscmp(buf,gp_winamp_vis))
|
|
{
|
|
iswinamp=1;
|
|
iswinampmode=_T("VisDir");
|
|
}
|
|
if (!_tcscmp(buf,gp_winamp_dsp))
|
|
{
|
|
iswinamp=1;
|
|
iswinampmode=_T("DSPDir");
|
|
}
|
|
if (!_tcscmp(buf,gp_winamp_skins))
|
|
{
|
|
iswinamp=1;
|
|
iswinampmode=_T("SkinDir");
|
|
_ftprintf(fp,_T("!define ZIP2EXE_INSTALLDIR_SKINS\n"));
|
|
}
|
|
|
|
if (iswinamp)
|
|
{
|
|
_ftprintf(fp,_T("!define ZIP2EXE_INSTALLDIR_WINAMP\n"));
|
|
|
|
if (iswinampmode)
|
|
{
|
|
_ftprintf(fp,_T("!define ZIP2EXE_INSTALLDIR_WINAMPMODE `%s`\n"),iswinampmode);
|
|
}
|
|
}
|
|
else // set out path to $INSTDIR
|
|
{
|
|
_ftprintf(fp,_T("!define ZIP2EXE_INSTALLDIR `%s`\n"),buf);
|
|
}
|
|
|
|
_ftprintf(fp,_T("!include `${NSISDIR}\\Contrib\\zip2exe\\Base.nsh`\n"));
|
|
_ftprintf(fp,_T("!include `${NSISDIR}\\Contrib\\zip2exe\\%s.nsh`\n"),g_mui?_T("Modern"):_T("Classic"));
|
|
|
|
_ftprintf(fp,_T("!insertmacro SECTION_BEGIN\n"));
|
|
_ftprintf(fp,_T("File /r `%s\\*.*`\n"),tempzip_path);
|
|
_ftprintf(fp,_T("!insertmacro SECTION_END\n"));
|
|
|
|
fclose(fp);
|
|
|
|
TCHAR g_makensis_path[MAX_PATH];
|
|
TCHAR *p=g_makensis_path;
|
|
GetModuleFileName(g_hInstance,g_makensis_path,sizeof(g_makensis_path));
|
|
while (*p) p++;
|
|
while (p >= g_makensis_path && *p != _T('\\')) p--;
|
|
_tcscpy(p+1,_T("makensis.exe"));
|
|
|
|
WIN32_FIND_DATA fd;
|
|
HANDLE h=FindFirstFile(g_makensis_path,&fd);
|
|
if (h==INVALID_HANDLE_VALUE)
|
|
{
|
|
if ((p-g_makensis_path>4)&&(_totlower(*(p-1))==_T('n'))&&(_totlower(*(p-2))==_T('i'))&&(_totlower(*(p-3))==_T('b'))&&(*(p-4)==_T('\\')))
|
|
{
|
|
p -= 4;
|
|
_tcscpy(p+1,_T("makensis.exe"));
|
|
h=FindFirstFile(g_makensis_path,&fd);
|
|
if (h==INVALID_HANDLE_VALUE)
|
|
{
|
|
MessageBox(hwndDlg,_T("Error finding makensis.exe."),g_errcaption,MB_OK|MB_ICONSTOP);
|
|
PostMessage(g_hwnd,WM_USER+1203,0,0);
|
|
return;
|
|
}
|
|
}
|
|
}
|
|
if (h!=INVALID_HANDLE_VALUE) FindClose(h);
|
|
|
|
|
|
|
|
wsprintf(g_cmdline,_T("\"%s\" %s \"%s\""),g_makensis_path,g_options,nsifilename);
|
|
DWORD id;
|
|
g_hThread=CreateThread(NULL,0,ThreadProc,0,0,&id);
|
|
|
|
}
|
|
|
|
void SetZip(HWND hwndDlg, TCHAR *path)
|
|
{
|
|
TCHAR buf2[1024];
|
|
lstrcpy(buf2,path);
|
|
tempzip_cleanup(hwndDlg,1);
|
|
SetDlgItemText(hwndDlg,IDC_ZIPFILE,path);
|
|
TCHAR *t=path+lstrlen(path);
|
|
while (t > path && *t != _T('\\') && *t != _T('.')) t--;
|
|
{
|
|
TCHAR *p=t;
|
|
while (p >= path && *p != _T('\\')) p--;
|
|
p++;
|
|
*t=0;
|
|
SetDlgItemText(hwndDlg,IDC_INSTNAME,p[0]?p:_T("Stuff"));
|
|
}
|
|
_tcscpy(t,_T(".exe"));
|
|
SetDlgItemText(hwndDlg,IDC_OUTFILE,path);
|
|
if (tempzip_make(hwndDlg,buf2)) tempzip_cleanup(hwndDlg,1);
|
|
else
|
|
{
|
|
EnableWindow(GetDlgItem(hwndDlg,IDOK),1);
|
|
}
|
|
}
|
|
|
|
BOOL CALLBACK DlgProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
|
|
{
|
|
static int ids[]={IDC_INFO,IDC_NSISICON,IDC_SZIPFRAME,IDC_BROWSE,IDC_ZIPFILE,IDC_ZIPINFO_SUMMARY,IDC_ZIPINFO_FILES,IDC_OFRAME,IDC_INAMEST,
|
|
IDC_INSTNAME,IDC_INSTPATH,IDC_OEFST,IDC_OUTFILE,IDC_BROWSE2,IDC_COMPRESSOR,IDC_ZLIB,IDC_BZIP2,IDC_LZMA,IDC_SOLID,IDC_INTERFACE,IDC_MODERNUI,IDC_CLASSICUI};
|
|
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;
|
|
CheckDlgButton(hwndDlg,IDC_LZMA,BST_CHECKED);
|
|
CheckDlgButton(hwndDlg,IDC_MODERNUI,BST_CHECKED);
|
|
SendDlgItemMessage(hwndDlg,IDC_INSTPATH,CB_ADDSTRING,0,(LPARAM)gp_poi);
|
|
SendDlgItemMessage(hwndDlg,IDC_INSTPATH,CB_ADDSTRING,0,(LPARAM)_T("$TEMP"));
|
|
SendDlgItemMessage(hwndDlg,IDC_INSTPATH,CB_ADDSTRING,0,(LPARAM)_T("$SYSDIR"));
|
|
SendDlgItemMessage(hwndDlg,IDC_INSTPATH,CB_ADDSTRING,0,(LPARAM)_T("$WINDIR"));
|
|
SendDlgItemMessage(hwndDlg,IDC_INSTPATH,CB_ADDSTRING,0,(LPARAM)_T("$DESKTOP"));
|
|
SendDlgItemMessage(hwndDlg,IDC_INSTPATH,CB_ADDSTRING,0,(LPARAM)_T("$DESKTOP\\YourNameHere"));
|
|
SendDlgItemMessage(hwndDlg,IDC_INSTPATH,CB_ADDSTRING,0,(LPARAM)_T("$PROGRAMFILES\\YourNameHere"));
|
|
SendDlgItemMessage(hwndDlg,IDC_INSTPATH,CB_ADDSTRING,0,(LPARAM)_T("$STARTMENU"));
|
|
SendDlgItemMessage(hwndDlg,IDC_INSTPATH,CB_ADDSTRING,0,(LPARAM)_T("$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);
|
|
|
|
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,_T("Courier New"));
|
|
SendDlgItemMessage(hwndDlg,IDC_OUTPUTTEXT,WM_SETFONT,(WPARAM)hFont,0);
|
|
|
|
DragAcceptFiles(hwndDlg,TRUE);
|
|
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);
|
|
CloseHandle(g_hThread);
|
|
g_hThread=0;
|
|
}
|
|
made=1;
|
|
ShowWindow(GetDlgItem(hwndDlg,IDC_BACK),SW_SHOWNA);
|
|
EnableWindow(GetDlgItem(hwndDlg,IDOK),1);
|
|
if (nsifilename[0]) DeleteFile(nsifilename);
|
|
nsifilename[0]=0;
|
|
break;
|
|
case WM_DROPFILES:
|
|
{
|
|
TCHAR dropped_file[MAX_PATH]=_T("");
|
|
if (DragQueryFile((HDROP)wParam,(UINT)-1,NULL,0)==1)
|
|
{
|
|
DragQueryFile((HDROP)wParam,0,dropped_file,MAX_PATH);
|
|
if (lstrlen(dropped_file)>0)
|
|
{
|
|
SetZip(hwndDlg,dropped_file);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
MessageBox(hwndDlg,_T("Dropping more than one zip file at a time is not supported"),g_errcaption,MB_OK|MB_ICONSTOP);
|
|
}
|
|
DragFinish((HDROP)wParam);
|
|
return TRUE;
|
|
}
|
|
case WM_COMMAND:
|
|
switch (LOWORD(wParam))
|
|
{
|
|
case IDC_BROWSE:
|
|
if (!g_extracting) {
|
|
OPENFILENAME l={sizeof(l),};
|
|
TCHAR buf[1024];
|
|
l.hwndOwner = hwndDlg;
|
|
l.lpstrFilter = _T("ZIP Files\0*.zip\0All Files\0*.*\0");
|
|
l.lpstrFile = buf;
|
|
l.nMaxFile = 1023;
|
|
l.lpstrTitle = _T("Open ZIP File");
|
|
l.lpstrDefExt = _T("zip");
|
|
l.lpstrInitialDir = NULL;
|
|
l.Flags = OFN_HIDEREADONLY|OFN_EXPLORER|OFN_PATHMUSTEXIST;
|
|
buf[0]=0;
|
|
if (GetOpenFileName(&l))
|
|
{
|
|
SetZip(hwndDlg,buf);
|
|
}
|
|
}
|
|
break;
|
|
case IDC_BROWSE2:
|
|
{
|
|
OPENFILENAME l={sizeof(l),};
|
|
TCHAR buf[1024];
|
|
l.hwndOwner = hwndDlg;
|
|
l.lpstrFilter = _T("Executables\0*.exe\0All Files\0*.*\0");
|
|
l.lpstrFile = buf;
|
|
l.nMaxFile = 1023;
|
|
l.lpstrTitle = _T("Select Output EXE File");
|
|
l.lpstrDefExt = _T("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_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);
|
|
{
|
|
for (size_t x = 0; x < COUNTOF(ids); x ++)
|
|
ShowWindow(GetDlgItem(hwndDlg,ids[x]),SW_SHOWNA);
|
|
SetDlgItemText(hwndDlg,IDOK,_T("&Generate"));
|
|
EnableWindow(GetDlgItem(hwndDlg,IDOK),1);
|
|
}
|
|
}
|
|
break;
|
|
case IDC_TEST:
|
|
if (!g_hThread) {
|
|
TCHAR buf[1024];
|
|
GetDlgItemText(hwndDlg,IDC_OUTFILE,buf,COUNTOF(buf));
|
|
ShellExecute(hwndDlg,_T("open"),buf,_T(""),_T(""),SW_SHOW);
|
|
}
|
|
break;
|
|
case IDOK:
|
|
if (!g_hThread)
|
|
{
|
|
if (!made)
|
|
{
|
|
if (IsDlgButtonChecked(hwndDlg,IDC_ZLIB))
|
|
g_compressor = 1;
|
|
if (IsDlgButtonChecked(hwndDlg,IDC_BZIP2))
|
|
g_compressor = 2;
|
|
if (IsDlgButtonChecked(hwndDlg,IDC_LZMA))
|
|
g_compressor = 3;
|
|
if (IsDlgButtonChecked(hwndDlg,IDC_SOLID))
|
|
g_compressor_solid = 1;
|
|
else
|
|
g_compressor_solid = 0;
|
|
g_mui=!IsDlgButtonChecked(hwndDlg,IDC_CLASSICUI);
|
|
SetDlgItemText(g_hwnd, IDC_OUTPUTTEXT, _T(""));
|
|
for (size_t x = 0; x < COUNTOF(ids); x ++)
|
|
ShowWindow(GetDlgItem(hwndDlg,ids[x]),SW_HIDE);
|
|
ShowWindow(GetDlgItem(hwndDlg,IDC_OUTPUTTEXT),SW_SHOWNA);
|
|
SetDlgItemText(hwndDlg,IDOK,_T("&Close"));
|
|
EnableWindow(GetDlgItem(hwndDlg,IDOK),0);
|
|
|
|
makeEXE(hwndDlg);
|
|
}
|
|
else
|
|
{
|
|
tempzip_cleanup(hwndDlg,0);
|
|
EndDialog(hwndDlg,0);
|
|
}
|
|
}
|
|
break;
|
|
}
|
|
break;
|
|
}
|
|
return 0;
|
|
}
|