- Compressor type listed in summary

- SetOutPath now sets the current directory (RegDLL no longer does)
- File names are now validated for commands that need normal files, the directory selection dialog, and every variable that contains a file/dir name
- Fixed a distortion of the MUI's branding text with ClearType
- $INSTDIR is now right in the custom page after the directory selection dialog
- No more squares in the automatically appended directory name in the directory selection dialog
- Size optimizations


git-svn-id: https://svn.code.sf.net/p/nsis/code/NSIS/trunk@2121 212acab6-be3b-0410-9dea-997c60f758d6
This commit is contained in:
kichik 2003-02-07 23:04:25 +00:00
parent 91906c55e3
commit ae16cbfe3f
14 changed files with 248 additions and 199 deletions

View file

@ -515,8 +515,6 @@ int CEXEBuild::datablock_optimize(int start_offset)
int CEXEBuild::add_data(const char *data, int length, IGrowBuf *dblock) // returns offset
{
// Changed by Amir Szekely 31st July 2002
// Ability to change compression methods from within the script
build_compressor_set=true;
int done=0;
@ -1777,8 +1775,9 @@ int CEXEBuild::write_output(void)
INFO_MSG("Datablock optimizer saved %d bytes (~%d.%d%%).\n",db_opt_save,
pc/10,pc%10);
}
INFO_MSG("\nUsing %s%s compression.\n\n", compressor->GetName(), build_compress_whole?" (compress whole)":"");
INFO_MSG("\n");
int total_usize=exeheader_size;
INFO_MSG("EXE header size: %10d / %d bytes\n",exeheader_size_new,exeheader_size);
@ -1917,8 +1916,6 @@ int CEXEBuild::write_output(void)
#ifdef NSIS_CONFIG_COMPRESSION_SUPPORT
int CEXEBuild::deflateToFile(FILE *fp, char *buf, int len) // len==0 to flush
{
// Changed by Amir Szekely 31st July 2002
// Ability to change compression methods from within the script
build_compressor_set=true;
char obuf[32768];
@ -2073,7 +2070,7 @@ int CEXEBuild::uninstall_generate()
firstheader *_fh=(firstheader *)udata.get();
_fh->length_of_all_following_data=udata.getlen()+(build_crcchk?sizeof(int):0);
}
else
else
#endif//NSIS_CONFIG_COMPRESSION_SUPPORT
{
udata.add(&fh,sizeof(fh));

View file

@ -49,7 +49,7 @@ enum {
};
class CEXEBuild {
public:
public:
CEXEBuild();
~CEXEBuild();

View file

@ -44,6 +44,10 @@ class CBzip2 : public ICompressor {
return stream->avail_out;
}
char* GetName() {
return "bzip2";
}
private:
bz_stream *stream;
};

View file

@ -17,6 +17,8 @@ class ICompressor {
virtual unsigned int GetAvailIn() = 0;
virtual unsigned int GetAvailOut() = 0;
virtual char* GetName() = 0;
};
#endif

View file

@ -44,6 +44,10 @@ class CZlib : public ICompressor {
return stream->avail_out;
}
char* GetName() {
return "zlib";
}
private:
z_stream *stream;
};

View file

@ -51,7 +51,7 @@ int g_quit_flag; // set when Quit has been called (meaning bail out ASAP)
#error invalid value for NSIS_MAX_INST_TYPES
#endif
int g_autoclose;
//int g_autoclose;
int progress_bar_pos, progress_bar_len;
int g_is_uninstaller;
@ -70,6 +70,9 @@ static int num_sections;
// sent to the outer window to tell it to go to the next inner window
#define WM_NOTIFY_OUTER_NEXT (WM_USER+0x8)
// sent to every child window to tell it it is closing soon
#define WM_NOTIFY_INIGO_MONTOYA (WM_USER+0xb)
// update message used by DirProc and SelProc for space display
#define WM_IN_UPDATEMSG (WM_USER+0xf)
@ -129,8 +132,9 @@ static BOOL NSISCALL _HandleStaticBkColor(UINT uMsg, WPARAM wParam, LPARAM lPara
if (uMsg == WM_CTLCOLORSTATIC) {
BOOL brush = (BOOL)GetWindowLong((HWND)lParam, GWL_USERDATA);
if (brush == -1) {
SetBkColor((HDC)wParam, GetSysColor(COLOR_BTNFACE));
SetTextColor((HDC)wParam, GetSysColor(COLOR_BTNFACE));
COLORREF dlgColor = GetSysColor(COLOR_BTNFACE);
SetBkColor((HDC)wParam, dlgColor);
SetTextColor((HDC)wParam, dlgColor);
return (BOOL)GetStockObject(NULL_BRUSH);
}
SetBkMode((HDC)wParam, TRANSPARENT);
@ -290,7 +294,7 @@ lang_again:
int NSISCALL ui_doinstall(void)
{
num_sections=g_inst_header->num_sections;
g_autoclose=g_inst_cmnheader->misc_flags&1;
g_flags.autoclose=g_inst_cmnheader->misc_flags&1;
#ifdef NSIS_CONFIG_UNINSTALL_SUPPORT
if (!g_is_uninstaller)
#endif
@ -549,6 +553,8 @@ nextPage:
process_string_fromtab(g_tmp+mystrlen(g_tmp),this_page->caption);
my_SetWindowText(hwndDlg,g_tmp);
SendMessage(m_curwnd, WM_NOTIFY_INIGO_MONTOYA, 0, 0);
#ifdef NSIS_SUPPORT_CODECALLBACKS
if (ExecuteCodeSegment(this_page->prefunc,NULL) || this_page->id<0)
goto nextPage;
@ -556,7 +562,7 @@ nextPage:
if (this_page->id!=NSIS_PAGE_COMPLETED) DestroyWindow(m_curwnd);
else {
if (g_autoclose) goto nextPage;
if (g_flags.autoclose) goto nextPage;
return 0;
}
@ -708,9 +714,6 @@ static BOOL CALLBACK LicenseProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM
#undef enlink
#undef msgfilter
}
if (uMsg == WM_CLOSE) {
SendMessage(g_hwnd,WM_CLOSE,0,0);
}
return HandleStaticBkColor();
}
#endif
@ -743,9 +746,10 @@ static char * NSISCALL inttosizestr(int kb, char *str)
static BOOL CALLBACK DirProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
if (uMsg == WM_DESTROY)
if (uMsg == WM_NOTIFY_INIGO_MONTOYA)
{
GetUIText(IDC_DIR,state_install_directory,NSIS_MAX_STRLEN);
validate_filename(state_install_directory);
#ifdef NSIS_CONFIG_LOG
build_g_logfile();
log_dolog = IsDlgButtonChecked(hwndDlg,IDC_CHECK1);
@ -808,7 +812,7 @@ static BOOL CALLBACK DirProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lPar
p=scanendslash(post_str);
if (p >= post_str && *++p)
{
post_str=process_string(ps_tmpbuf,p);
post_str=process_string(p);
p=name+mystrlen(name)-mystrlen(post_str);
if (p <= name || *CharPrev(name,p)!='\\' || lstrcmpi(p,post_str))
{
@ -1010,7 +1014,8 @@ static BOOL CALLBACK SelProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lPar
tv.hInsertAfter=TVI_LAST;
tv.item.mask=TVIF_PARAM|TVIF_TEXT|TVIF_STATE;
tv.item.lParam=x;
tv.item.pszText=process_string_fromtab(ps_tmpbuf,sec->name_ptr);
process_string_fromtab(0,sec->name_ptr);
tv.item.pszText=ps_tmpbuf;
tv.item.stateMask=TVIS_STATEIMAGEMASK|TVIS_EXPANDED;
{
@ -1072,7 +1077,8 @@ static BOOL CALLBACK SelProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lPar
TVITEM tv;
tv.hItem=hTreeItems[x];
tv.mask=TVIF_TEXT;
tv.pszText=process_string_fromtab(ps_tmpbuf,ns);
process_string_fromtab(0,ns);
tv.pszText=ps_tmpbuf;
TreeView_SetItem(hwndTree1,&tv);
}
uMsg = WM_USER+0x18;
@ -1184,7 +1190,7 @@ static BOOL CALLBACK SelProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lPar
}
}
}
if (uMsg == WM_DESTROY)
if (uMsg == WM_NOTIFY_INIGO_MONTOYA)
{
if (hImageList) ImageList_Destroy(hImageList);
if (hTreeItems) GlobalFree(hTreeItems);

View file

@ -24,10 +24,7 @@ typedef struct _stack_t {
static stack_t *g_st;
#endif
static int exec_errorflag;
#ifdef NSIS_SUPPORT_REBOOT
static int exec_rebootflag;
#endif
union flags g_flags;
#ifdef NSIS_CONFIG_PLUGIN_SUPPORT
char plugins_temp_dir[NSIS_MAX_STRLEN]="";
@ -76,8 +73,6 @@ static LONG NSISCALL myRegDeleteKeyEx(HKEY thiskey, LPCTSTR lpSubKey, int onlyif
}
#endif//NSIS_SUPPORT_REGISTRYFUNCTIONS
extern char g_all_user_var_flag;
static int NSISCALL ExecuteEntry(entry *entry_);
static int NSISCALL resolveaddr(int v)
@ -121,14 +116,18 @@ static int *parms;
static int NSISCALL process_string_fromparm_toint(int id_)
{
return myatoi(process_string(ps_tmpbuf,GetStringFromStringTab(parms[id_])));
return myatoi(process_string(GetStringFromStringTab(parms[id_])));
}
// NB - USE CAUTION when rearranging code to make use of the new return value of
// this function - be sure the parm being accessed is not modified before the call.
// Use a negative number to get the string validated as a file name
static char * NSISCALL process_string_fromparm_tobuf(int id_)
{
return process_string_fromtab(bufs[id_ >> 4], parms[id_ & 0xF]);
int id = id_ < 0 ? -id_ : id_;
char *result = process_string_fromtab(bufs[id_ >> 4], parms[id_ & 0xF]);
if (id_ < 0) validate_filename(result);
return result;
}
// returns EXEC_ERROR on error
@ -201,9 +200,6 @@ static int NSISCALL ExecuteEntry(entry *entry_)
Sleep(x);
}
return 0;
case EW_SETSFCONTEXT:
g_all_user_var_flag=parm0;
return 0;
case EW_HIDEWINDOW:
log_printf("HideWindow");
ShowWindow(g_hwnd,SW_HIDE);
@ -213,30 +209,31 @@ static int NSISCALL ExecuteEntry(entry *entry_)
ShowWindow(g_hwnd,SW_SHOW);
SetForegroundWindow(g_hwnd);
return 0;
case EW_SETWINDOWCLOSE:
g_autoclose=parm0;
case EW_SETFLAG:
g_flags.flags[parm0]=parm1;
return 0;
case EW_CHDETAILSVIEW:
if (insthwndbutton) ShowWindow(insthwndbutton,parm1);
if (insthwnd) ShowWindow(insthwnd,parm0);
return 0;
case EW_SETFILEATTRIBUTES: {
char *buf0=process_string_fromparm_tobuf(0x00);
log_printf3("SetFileAttributes: \"%s\":%08X",buf0,parm1);
if (!SetFileAttributes(buf0,parm1))
char *buf1=process_string_fromparm_tobuf(-0x10);
log_printf3("SetFileAttributes: \"%s\":%08X",buf1,parm1);
if (!SetFileAttributes(buf1,parm1))
{
exec_errorflag++;
g_flags.exec_error++;
log_printf("SetFileAttributes failed.");
}
}
return 0;
case EW_CREATEDIR: {
char *buf1=process_string_fromparm_tobuf(0x10);
char *buf1=process_string_fromparm_tobuf(-0x10);
log_printf3("CreateDirectory: \"%s\" (%d)",buf1,parm1);
if (parm1)
{
update_status_text_from_lang(LANG_OUTPUTDIR,buf1);
mystrcpy(state_output_directory,buf1);
SetCurrentDirectory(state_output_directory);
}
else update_status_text_from_lang(LANG_CREATEDIR,buf1);
{
@ -273,7 +270,8 @@ static int NSISCALL ExecuteEntry(entry *entry_)
}
}
return 0;
case EW_IFFILEEXISTS: {
case EW_IFFILEEXISTS:
{
char *buf0=process_string_fromparm_tobuf(0x00);
if (file_exists(buf0))
{
@ -284,47 +282,40 @@ static int NSISCALL ExecuteEntry(entry *entry_)
}
return parm2;
case EW_IFERRORS:
{
int f=exec_errorflag;
exec_errorflag=parm2;
if (f)
{
return parm0;
}
}
if (g_flags.exec_error) return parm0;
return parm1;
#ifdef NSIS_SUPPORT_RENAME
case EW_RENAME:
{
char *buf0=process_string_fromparm_tobuf(0x00);
char *buf1=process_string_fromparm_tobuf(0x11);
mystrcpy(buf3,buf0);
if (mystrlen(buf0)+mystrlen(buf1) < NSIS_MAX_STRLEN-3)
char *buf1=process_string_fromparm_tobuf(-0x10);
char *buf2=process_string_fromparm_tobuf(-0x21);
mystrcpy(buf3,buf1);
if (mystrlen(buf1)+mystrlen(buf2) < NSIS_MAX_STRLEN-3)
{
lstrcat(buf3,"->");
lstrcat(buf3,buf1);
lstrcat(buf3,buf2);
}
log_printf2("Rename: %s",buf3);
if (MoveFile(buf0,buf1))
if (MoveFile(buf1,buf2))
{
update_status_text_from_lang(LANG_RENAME,buf3);
}
else
{
#ifdef NSIS_SUPPORT_MOVEONREBOOT
if (parm2 && file_exists(buf0))
if (parm2 && file_exists(buf1))
{
#ifdef NSIS_SUPPORT_REBOOT
exec_rebootflag++;
g_flags.exec_reboot++;
#endif
MoveFileOnReboot(buf0,buf1);
MoveFileOnReboot(buf1,buf2);
update_status_text_from_lang(LANG_RENAMEONREBOOT,buf3);
log_printf2("Rename on reboot: %s",buf3);
}
else
#endif
{
exec_errorflag++;
g_flags.exec_error++;
log_printf2("Rename failed: %s",buf3);
}
}
@ -339,7 +330,7 @@ static int NSISCALL ExecuteEntry(entry *entry_)
char *buf0=process_string_fromparm_tobuf(0x01);
if (!GetFullPathName(buf0,NSIS_MAX_STRLEN,p,&fp))
{
exec_errorflag++;
g_flags.exec_error++;
*p=0;
}
else if (fp>buf0 && *fp)
@ -351,7 +342,7 @@ static int NSISCALL ExecuteEntry(entry *entry_)
}
else
{
exec_errorflag++;
g_flags.exec_error++;
*p=0;
}
}
@ -362,10 +353,10 @@ static int NSISCALL ExecuteEntry(entry *entry_)
{
char *fp;
char *p=var0;
char *buf0=process_string_fromparm_tobuf(0x01);
char *buf0=process_string_fromparm_tobuf(-0x01);
if (!SearchPath(NULL,buf0,NULL,NSIS_MAX_STRLEN,p,&fp))
{
exec_errorflag++;
g_flags.exec_error++;
p[0]=0;
}
}
@ -375,7 +366,7 @@ static int NSISCALL ExecuteEntry(entry *entry_)
char *textout=var0;
if (!GetTempFileName(temp_directory,"nst",0,textout))
{
exec_errorflag++;
g_flags.exec_error++;
*textout=0;
}
}
@ -395,6 +386,7 @@ static int NSISCALL ExecuteEntry(entry *entry_)
mystrcpy(buf0,buf3);
}
else lstrcat(addtrailingslash(mystrcpy(buf0,state_output_directory)),buf3);
validate_filename(buf0);
_tryagain:
if (!overwriteflag)
{
@ -417,7 +409,7 @@ static int NSISCALL ExecuteEntry(entry *entry_)
if (overwriteflag)
{
update_status_text_from_lang(LANG_SKIPPED,buf3);
if (overwriteflag==2) exec_errorflag++;
if (overwriteflag==2) g_flags.exec_error++;
log_printf3("File: skipped: \"%s\" (overwriteflag=%d)",buf0,overwriteflag);
return 0;
}
@ -435,7 +427,7 @@ static int NSISCALL ExecuteEntry(entry *entry_)
goto _tryagain;
case IDIGNORE:
log_printf("File: error, user cancel");
exec_errorflag++;
g_flags.exec_error++;
return 0;
default:
log_printf("File: error, user abort");
@ -503,7 +495,7 @@ static int NSISCALL ExecuteEntry(entry *entry_)
if (parm1)
{
#ifdef NSIS_SUPPORT_REBOOT
exec_rebootflag++;
g_flags.exec_reboot++;
#endif
log_printf2("Delete: DeleteFile on Reboot(\"%s\")",buf1);
update_status_text_from_lang(LANG_DELETEONREBOOT,buf1);
@ -512,7 +504,7 @@ static int NSISCALL ExecuteEntry(entry *entry_)
else
#endif
{
exec_errorflag++;
g_flags.exec_error++;
}
}
}
@ -540,7 +532,7 @@ static int NSISCALL ExecuteEntry(entry *entry_)
return parm4;
}
}
else exec_errorflag++;
else g_flags.exec_error++;
}
return 0;
#endif//NSIS_SUPPORT_MESSAGEBOX
@ -553,7 +545,7 @@ static int NSISCALL ExecuteEntry(entry *entry_)
if (lastchar(buf0)=='\\') trimslashtoend(buf0);
doRMDir(buf0,parm1);
if (file_exists(buf0)) exec_errorflag++;
if (file_exists(buf0)) g_flags.exec_error++;
}
return 0;
#endif//NSIS_SUPPORT_RMDIR
@ -606,7 +598,7 @@ static int NSISCALL ExecuteEntry(entry *entry_)
{
if (!GetEnvironmentVariable(buf0,p,NSIS_MAX_STRLEN))
{
exec_errorflag++;
g_flags.exec_error++;
*p=0;
}
}
@ -648,7 +640,7 @@ static int NSISCALL ExecuteEntry(entry *entry_)
case 0: v+=v2; break;
case 1: v-=v2; break;
case 2: v*=v2; break;
case 3: if (v2) v/=v2; else { v=0; exec_errorflag++; } break;
case 3: if (v2) v/=v2; else { v=0; g_flags.exec_error++; } break;
case 4: v|=v2; break;
case 5: v&=v2; break;
case 6: v^=v2; break;
@ -656,7 +648,7 @@ static int NSISCALL ExecuteEntry(entry *entry_)
case 8: v=!v; break;
case 9: v=v||v2; break;
case 10: v=v&&v2; break;
case 11: if (v2) v%=v2; else { v=0; exec_errorflag++; } break;
case 11: if (v2) v%=v2; else { v=0; g_flags.exec_error++; } break;
}
myitoa(p,v);
}
@ -691,7 +683,7 @@ static int NSISCALL ExecuteEntry(entry *entry_)
if (!s)
{
log_printf("Pop: stack empty");
exec_errorflag++;
g_flags.exec_error++;
return 0;
}
mystrcpy(var0,s->text);
@ -729,7 +721,7 @@ static int NSISCALL ExecuteEntry(entry *entry_)
b4=(int)process_string_fromparm_tobuf(0x14);
}
if (parm5>>2) exec_errorflag += !SendMessageTimeout(hwnd,msg,b3,b4,SMTO_NORMAL,parm5>>2,(LPDWORD)&v);
if (parm5>>2) g_flags.exec_error += !SendMessageTimeout(hwnd,msg,b3,b4,SMTO_NORMAL,parm5>>2,(LPDWORD)&v);
else v=SendMessage(hwnd,msg,b3,b4);
}
else
@ -818,7 +810,7 @@ static int NSISCALL ExecuteEntry(entry *entry_)
{
int x;
char *buf0=process_string_fromparm_tobuf(0x00);
char *buf1=process_string_fromparm_tobuf(0x11);
char *buf1=process_string_fromparm_tobuf(-0x11);
char *buf2=process_string_fromparm_tobuf(0x22);
wsprintf(buf3,"%s %s",buf0,buf1);
update_status_text_from_lang(LANG_EXECSHELL, buf3);
@ -826,7 +818,7 @@ static int NSISCALL ExecuteEntry(entry *entry_)
if (x < 33)
{
log_printf5("ExecShell: warning: error (\"%s\": file:\"%s\" params:\"%s\")=%d",buf0,buf1,buf2,x);
exec_errorflag++;
g_flags.exec_error++;
}
else
{
@ -860,13 +852,13 @@ static int NSISCALL ExecuteEntry(entry *entry_)
GetExitCodeProcess(hProc, &lExitCode);
if (parm2>=0) myitoa(var2,lExitCode);
else if (lExitCode) exec_errorflag++;
else if (lExitCode) g_flags.exec_error++;
}
CloseHandle( hProc );
}
else
{
exec_errorflag++;
g_flags.exec_error++;
log_printf2("Exec: failed createprocess (\"%s\")",buf0);
}
}
@ -892,7 +884,7 @@ static int NSISCALL ExecuteEntry(entry *entry_)
else
{
*lowout=*highout=0;
exec_errorflag++;
g_flags.exec_error++;
}
}
return 0;
@ -906,10 +898,10 @@ static int NSISCALL ExecuteEntry(entry *entry_)
DWORD t[4]; // our two members are the 3rd and 4th..
VS_FIXEDFILEINFO *pvsf1=(VS_FIXEDFILEINFO*)t;
DWORD d;
char *buf0=process_string_fromparm_tobuf(0x00);
s1=GetFileVersionInfoSize(buf0,&d);
char *buf1=process_string_fromparm_tobuf(-0x10);
s1=GetFileVersionInfoSize(buf1,&d);
*lowout=*highout=0;
exec_errorflag++;
g_flags.exec_error++;
if (s1)
{
void *b1;
@ -917,12 +909,12 @@ static int NSISCALL ExecuteEntry(entry *entry_)
if (b1)
{
UINT uLen;
if (GetFileVersionInfo(buf0,0,s1,b1) && VerQueryValue(b1,"\\",(void*)&pvsf1,&uLen))
if (GetFileVersionInfo(buf1,0,s1,b1) && VerQueryValue(b1,"\\",(void*)&pvsf1,&uLen))
{
myitoa(highout,pvsf1->dwFileVersionMS);
myitoa(lowout,pvsf1->dwFileVersionLS);
exec_errorflag--;
g_flags.exec_error--;
}
GlobalFree(b1);
}
@ -934,33 +926,25 @@ static int NSISCALL ExecuteEntry(entry *entry_)
case EW_REGISTERDLL:
{
HRESULT hres=OleInitialize(NULL);
exec_errorflag++;
g_flags.exec_error++;
if (hres == S_FALSE || hres == S_OK)
{
HANDLE h;
char *buf0=process_string_fromparm_tobuf(0x00);
char *buf1=process_string_fromparm_tobuf(0x11);
char *buf1=process_string_fromparm_tobuf(-0x10);
char *buf0=process_string_fromparm_tobuf(0x01);
h=LoadLibrary(buf0);
h=LoadLibrary(buf1);
if (h)
{
FARPROC funke = GetProcAddress(h,buf1);
FARPROC funke = GetProcAddress(h,buf0);
if (funke)
{
exec_errorflag--;
g_flags.exec_error--;
if (parm2)
{
char *buf2=process_string_fromparm_tobuf(0x22);
// suggested by Kevin Gadd (janusfury)
mystrcpy(buf3, buf0);
trimslashtoend(buf3);
SetCurrentDirectory(buf3);
update_status_text(buf2,buf0);
if (funke()) exec_errorflag++;
SetCurrentDirectory(state_exe_directory);
update_status_text(buf2,buf1);
if (funke()) g_flags.exec_error++;
}
else
{
@ -976,22 +960,22 @@ static int NSISCALL ExecuteEntry(entry *entry_)
}
else
{
update_status_text_from_lang(LANG_CANNOTFINDSYMBOL,buf1);
log_printf3("Error registering DLL: %s not found in %s",buf1,buf0);
update_status_text_from_lang(LANG_CANNOTFINDSYMBOL,buf0);
log_printf3("Error registering DLL: %s not found in %s",buf0,buf1);
}
if (!parm3) while (FreeLibrary(h));
// saves 2 bytes - FreeLibrary((HANDLE)((unsigned long)h&(unsigned long)parm3));
}
else
{
update_status_text_from_lang(LANG_COULDNOTLOAD,buf0);
log_printf2("Error registering DLL: Could not load %s",buf0);
update_status_text_from_lang(LANG_COULDNOTLOAD,buf1);
log_printf2("Error registering DLL: Could not load %s",buf1);
}
OleUninitialize();
}
else
{
update_status_text_from_lang(LANG_NOOLE,buf0);
update_status_text_from_lang(LANG_NOOLE,buf1);
log_printf("Error registering DLL: Could not initialize OLE");
}
}
@ -999,10 +983,10 @@ static int NSISCALL ExecuteEntry(entry *entry_)
#endif
#ifdef NSIS_SUPPORT_CREATESHORTCUT
case EW_CREATESHORTCUT: {
char *buf2=process_string_fromparm_tobuf(0x20);
char *buf1=process_string_fromparm_tobuf(0x11);
char *buf2=process_string_fromparm_tobuf(-0x20);
char *buf1=process_string_fromparm_tobuf(-0x11);
char *buf0=process_string_fromparm_tobuf(0x02);
char *buf3=process_string_fromparm_tobuf(0x33);
char *buf3=process_string_fromparm_tobuf(-0x33);
char *buf4=process_string_fromparm_tobuf(0x45);
HRESULT hres;
@ -1049,7 +1033,7 @@ static int NSISCALL ExecuteEntry(entry *entry_)
if (rv)
{
exec_errorflag++;
g_flags.exec_error++;
update_status_text_from_lang(LANG_ERRORCREATINGSHORTCUT,buf2);
}
else
@ -1083,14 +1067,14 @@ static int NSISCALL ExecuteEntry(entry *entry_)
if (res)
{ // some of these changes were from Edgewise (wiked_edge@yahoo.com)
update_status_text_from_lang(LANG_COPYFAILED,"");
exec_errorflag++;
g_flags.exec_error++;
}
}
return 0;
#endif//NSIS_SUPPORT_COPYFILES
#ifdef NSIS_SUPPORT_REBOOT
case EW_REBOOT:
exec_errorflag++;
g_flags.exec_error++;
{
HANDLE h=LoadLibrary("advapi32.dll");
if (h)
@ -1122,8 +1106,7 @@ static int NSISCALL ExecuteEntry(entry *entry_)
return 0;
}
break;
case EW_IFREBOOTFLAG: return parms[!exec_rebootflag];
case EW_SETREBOOTFLAG: exec_rebootflag=parm0; return 0;
case EW_IFREBOOTFLAG: return parms[!g_flags.exec_reboot];
#endif//NSIS_SUPPORT_REBOOT
#ifdef NSIS_SUPPORT_INIFILES
case EW_WRITEINI:
@ -1145,9 +1128,9 @@ static int NSISCALL ExecuteEntry(entry *entry_)
{
str=process_string_fromparm_tobuf(0x22);
}
buf3=process_string_fromparm_tobuf(0x33);
buf3=process_string_fromparm_tobuf(-0x33);
log_printf5("WriteINIStr: wrote [%s] %s=%s in %s",buf0,buf1,buf2,buf3);
if (!WritePrivateProfileString(sec,key,str,buf3)) exec_errorflag++;
if (!WritePrivateProfileString(sec,key,str,buf3)) g_flags.exec_error++;
}
return 0;
case EW_READINISTR:
@ -1156,11 +1139,11 @@ static int NSISCALL ExecuteEntry(entry *entry_)
char *p=var0;
char *buf0=process_string_fromparm_tobuf(0x01);
char *buf1=process_string_fromparm_tobuf(0x12);
char *buf2=process_string_fromparm_tobuf(0x23);
char *buf2=process_string_fromparm_tobuf(-0x23);
GetPrivateProfileString(buf0,buf1,errstr,p,NSIS_MAX_STRLEN-1,buf2);
if (*((int*)errstr) == *((int*)p))
{
exec_errorflag++;
g_flags.exec_error++;
p[0]=0;
}
}
@ -1171,7 +1154,7 @@ static int NSISCALL ExecuteEntry(entry *entry_)
{
int rootkey=parm0;
char *buf3=process_string_fromparm_tobuf(0x31);
exec_errorflag++;
g_flags.exec_error++;
if (!parm3)
{
HKEY hKey;
@ -1179,14 +1162,14 @@ static int NSISCALL ExecuteEntry(entry *entry_)
{
char *buf0=process_string_fromparm_tobuf(0x02);
log_printf4("DeleteRegValue: %d\\%s\\%s",rootkey,buf3,buf0);
if (RegDeleteValue(hKey,buf0) == ERROR_SUCCESS) exec_errorflag--;
if (RegDeleteValue(hKey,buf0) == ERROR_SUCCESS) g_flags.exec_error--;
RegCloseKey(hKey);
}
}
else
{
log_printf3("DeleteRegKey: %d\\%s",rootkey,buf3);
if (myRegDeleteKeyEx((HKEY)rootkey,buf3,parm3&2) == ERROR_SUCCESS) exec_errorflag--;
if (myRegDeleteKeyEx((HKEY)rootkey,buf3,parm3&2) == ERROR_SUCCESS) g_flags.exec_error--;
}
}
return 0;
@ -1197,20 +1180,20 @@ static int NSISCALL ExecuteEntry(entry *entry_)
int type=parm4;
char *buf1=process_string_fromparm_tobuf(0x12);
char *buf3=process_string_fromparm_tobuf(0x31);
exec_errorflag++;
g_flags.exec_error++;
if (RegCreateKey((HKEY)rootkey,buf3,&hKey) == ERROR_SUCCESS)
{
if (type <= 1)
{
char *buf2=process_string_fromparm_tobuf(0x23);
if (RegSetValueEx(hKey,buf1,0,type==1?REG_SZ:REG_EXPAND_SZ,buf2,mystrlen(buf2)+1) == ERROR_SUCCESS) exec_errorflag--;
if (RegSetValueEx(hKey,buf1,0,type==1?REG_SZ:REG_EXPAND_SZ,buf2,mystrlen(buf2)+1) == ERROR_SUCCESS) g_flags.exec_error--;
log_printf5("WriteRegStr: set %d\\%s\\%s to %s",rootkey,buf3,buf1,buf2);
}
else if (type == 2)
{
DWORD l;
l=process_string_fromparm_toint(3);
if (RegSetValueEx(hKey,buf1,0,REG_DWORD,(unsigned char*)&l,4) == ERROR_SUCCESS) exec_errorflag--;
if (RegSetValueEx(hKey,buf1,0,REG_DWORD,(unsigned char*)&l,4) == ERROR_SUCCESS) g_flags.exec_error--;
log_printf5("WriteRegDWORD: set %d\\%s\\%s to %d",rootkey,buf3,buf1,l);
}
else if (type == 3)
@ -1218,7 +1201,7 @@ static int NSISCALL ExecuteEntry(entry *entry_)
int len=GetCompressedDataFromDataBlockToMemory(parm3, buf2, NSIS_MAX_STRLEN);
if (len >= 0)
{
if (RegSetValueEx(hKey,buf1,0,REG_BINARY,buf2,len) == ERROR_SUCCESS) exec_errorflag--;
if (RegSetValueEx(hKey,buf1,0,REG_BINARY,buf2,len) == ERROR_SUCCESS) g_flags.exec_error--;
}
log_printf5("WriteRegBin: set %d\\%s\\%s with %d bytes",rootkey,buf3,buf1,len);
@ -1245,20 +1228,20 @@ static int NSISCALL ExecuteEntry(entry *entry_)
(t != REG_DWORD && t != REG_SZ && t != REG_EXPAND_SZ))
{
p[0]=0;
exec_errorflag++;
g_flags.exec_error++;
}
else
{
if (t==REG_DWORD)
{
if (!parm4) exec_errorflag++;
if (!parm4) g_flags.exec_error++;
myitoa(p,*((DWORD*)p));
}
else if (parm4) exec_errorflag++;
else if (parm4) g_flags.exec_error++;
}
RegCloseKey(hKey);
}
else exec_errorflag++;
else g_flags.exec_error++;
}
return 0;
case EW_REGENUM:
@ -1276,7 +1259,7 @@ static int NSISCALL ExecuteEntry(entry *entry_)
p[NSIS_MAX_STRLEN-1]=0;
RegCloseKey(key);
}
else exec_errorflag++;
else g_flags.exec_error++;
}
return 0;
@ -1292,12 +1275,12 @@ static int NSISCALL ExecuteEntry(entry *entry_)
{
HANDLE h;
char *handleout=var3;
char *buf0=process_string_fromparm_tobuf(0x00);
h=myOpenFile(buf0,parm1,parm2);
char *buf1=process_string_fromparm_tobuf(-0x10);
h=myOpenFile(buf1,parm1,parm2);
if (h == INVALID_HANDLE_VALUE)
{
*handleout=0;
exec_errorflag++;
g_flags.exec_error++;
}
else
{
@ -1321,7 +1304,7 @@ static int NSISCALL ExecuteEntry(entry *entry_)
}
if (!*t || !WriteFile((HANDLE)myatoi(t),buf1,l,&dw,NULL))
{
exec_errorflag++;
g_flags.exec_error++;
}
}
return 0;
@ -1360,7 +1343,7 @@ static int NSISCALL ExecuteEntry(entry *entry_)
}
}
textout[rpos]=0;
if (!rpos) exec_errorflag++;
if (!rpos) g_flags.exec_error++;
}
return 0;
case EW_FSEEK:
@ -1396,7 +1379,7 @@ static int NSISCALL ExecuteEntry(entry *entry_)
}
else
{
exec_errorflag++;
g_flags.exec_error++;
*textout=0;
}
@ -1414,7 +1397,7 @@ static int NSISCALL ExecuteEntry(entry *entry_)
{
*handleout=0;
*textout=0;
exec_errorflag++;
g_flags.exec_error++;
}
else
{
@ -1439,6 +1422,7 @@ static int NSISCALL ExecuteEntry(entry *entry_)
{
lstrcat(addtrailingslash(mystrcpy(buf1,state_install_directory)),buf0);
}
validate_filename(buf1);
hFile=myOpenFile(buf1,GENERIC_WRITE,CREATE_ALWAYS);
@ -1454,13 +1438,11 @@ static int NSISCALL ExecuteEntry(entry *entry_)
ReadSelfFile((char*)filebuf,g_filehdrsize);
if (g_inst_header->uninstdata_offset != -1)
{
// Changed by Amir Szekely 11th July 2002
unsigned char* seeker;
unsigned char* unicon_data = seeker = (unsigned char*)my_GlobalAlloc(g_inst_header->uninsticon_size);
if (unicon_data) {
GetCompressedDataFromDataBlockToMemory(g_inst_header->uninstdata_offset,
unicon_data,g_inst_header->uninsticon_size);
//for (i = 0; i < *(DWORD*)unicon_data; i++) {
while (*seeker) {
DWORD dwSize, dwOffset;
dwSize = *(DWORD*)seeker;
@ -1484,7 +1466,7 @@ static int NSISCALL ExecuteEntry(entry *entry_)
{
update_status_text_from_lang(LANG_ERRORCREATING,buf0);
DeleteFile(buf1);
exec_errorflag++;
g_flags.exec_error++;
}
else
update_status_text_from_lang(LANG_CREATEDUNINST,buf0);
@ -1507,6 +1489,13 @@ static int NSISCALL ExecuteEntry(entry *entry_)
}
return 0;
#endif//NSIS_CONFIG_LOG
#ifdef NSIS_CONFIG_PLUGIN_SUPPORT
// Added by Ximon Eighteen 5th August 2002
case EW_PLUGINCOMMANDPREP:
// $0 temp plug-ins dir
if (!*plugins_temp_dir) mystrcpy(plugins_temp_dir,g_usrvars[0]);
return 0;
#endif // NSIS_CONFIG_PLUGIN_SUPPORT
#ifdef NSIS_CONFIG_COMPONENTPAGE
case EW_SECTIONSET:
{
@ -1545,18 +1534,10 @@ static int NSISCALL ExecuteEntry(entry *entry_)
myitoa(var2,g_inst_section[x].flags);
}
}
else exec_errorflag++;
else g_flags.exec_error++;
}
return 0;
#endif//NSIS_CONFIG_COMPONENTPAGE
// Added by Ximon Eighteen 5th August 2002
#ifdef NSIS_CONFIG_PLUGIN_SUPPORT
case EW_PLUGINCOMMANDPREP:
// $0 temp plug-ins dir
if (!*plugins_temp_dir) mystrcpy(plugins_temp_dir,g_usrvars[0]);
return 0;
#endif // NSIS_CONFIG_PLUGIN_SUPPORT
}
my_MessageBox(LANG_STR(LANG_INSTCORRUPTED),MB_OK|MB_ICONSTOP);
return EXEC_ERROR;

View file

@ -1,7 +1,18 @@
#ifndef _EXEC_H_
#define _EXEC_H_
extern union flags {
struct {
int autoclose;
int all_user_var;
int exec_error;
#ifdef NSIS_SUPPORT_REBOOT
int exec_reboot;
#endif
};
int flags[1];
} g_flags;
int NSISCALL ExecuteCodeSegment(int pos, HWND hwndProgress); // returns 0 on success
#endif//_EXEC_H_

View file

@ -39,15 +39,14 @@ enum
EW_CALL, // Call: 1 [new address+1]
EW_UPDATETEXT, // Update status text: 2 [update str, ui_st_updateflag=?ui_st_updateflag:this]
EW_SLEEP, // Sleep: 1 [sleep time in milliseconds]
EW_SETSFCONTEXT, // SetShellVarContext: 1: [isAll]
EW_HIDEWINDOW, // HideWindow: 0
EW_BRINGTOFRONT, // BringToFront: 0
EW_SETWINDOWCLOSE, // SetWindowClose: 1 [0: no window close at end, 1: window close at end]
EW_CHDETAILSVIEW, // SetDetailsView: 2 [listaction,buttonaction]
EW_SETFILEATTRIBUTES, // SetFileAttributes: 2 [filename, attributes]
EW_CREATEDIR, // Create directory: 2, [path, ?update$INSTDIR]
EW_IFFILEEXISTS, // IfFileExists: 3, [file name, jump amount if exists, jump amount if not exists]
EW_IFERRORS, //a IfErrors: 3 [jump if error, jump if not error, new_erflag]
EW_IFERRORS, // IfErrors: 2 [jump if error, jump if not error]
EW_SETFLAG, // Sets a flag: 2 [id, data]
#ifdef NSIS_SUPPORT_RENAME
EW_RENAME, // Rename: 3 [old, new, rebootok]
#endif
@ -132,7 +131,6 @@ enum
#ifdef NSIS_SUPPORT_REBOOT
EW_REBOOT, // Reboot: 0
EW_IFREBOOTFLAG, // IfRebootFlag: 2 [if reboot flag set, if not reboot flag]
EW_SETREBOOTFLAG, // SetRebootFlag: 1 [new value]
#endif
#ifdef NSIS_SUPPORT_INIFILES
@ -181,8 +179,14 @@ enum
EW_GETLABELADDR, // both of these get converted to EW_ASSIGNVAR
EW_GETFUNCTIONADDR,
EW_PLUGINCOMMANDPREP
// Saves 56 bytes, don't ask me how
EW_DUMMY,
EW_DUMMY2,
EW_DUMMY3,
EW_DUMMY4,
EW_DUMMY5,
EW_PLUGINCOMMANDPREP,
};
#define FH_FLAGS_MASK 15
@ -191,7 +195,6 @@ enum
#ifdef NSIS_CONFIG_SILENT_SUPPORT
#define FH_FLAGS_SILENT 4
#endif
// Added by Amir Szekely 23rd July 2002
#define FH_FLAGS_FORCE_CRC 8
#define FH_SIG 0xDEADBEEF

View file

@ -10,7 +10,7 @@ void NSISCALL update_status_text_from_lang(int id, const char *text2);
void NSISCALL update_status_text(const char *text1, const char *text2);
extern int ui_st_updateflag;
extern int g_autoclose;
//extern int g_autoclose;
extern void *g_inst_combinedheader;
extern page *g_inst_page;
extern section *g_inst_section;

View file

@ -5,6 +5,7 @@
#include "state.h"
#include "config.h"
#include "lang.h"
#include "exec.h"
#include "fileform.h"
#include "ui.h"
@ -42,17 +43,18 @@ HANDLE NSISCALL myCreateProcess(char *cmd, char *dir)
return ProcInfo.hProcess;
}
BOOL NSISCALL my_SetWindowText(HWND hWnd, const char *val)
/*BOOL NSISCALL my_SetWindowText(HWND hWnd, const char *val)
{
return SendMessage(hWnd,WM_SETTEXT,0,(LPARAM)val);
}
}*/
BOOL NSISCALL my_SetDialogItemText(HWND dlg, UINT idx, const char *val)
{
return my_SetWindowText(GetDlgItem(dlg,idx),val);
return SetDlgItemText(dlg,idx,val);
//return my_SetWindowText(GetDlgItem(dlg,idx),val);
}
int NSISCALL my_GetWindowText(HWND hWnd, char *val, int size)
/*int NSISCALL my_GetWindowText(HWND hWnd, char *val, int size)
{
return SendMessage(hWnd,WM_GETTEXT,size,(LPARAM)val);
}
@ -60,7 +62,7 @@ int NSISCALL my_GetWindowText(HWND hWnd, char *val, int size)
int NSISCALL my_GetDialogItemText(HWND dlg, UINT idx, char *val, int size)
{
return my_GetWindowText(GetDlgItem(dlg,idx),val,size);
}
}*/
int NSISCALL my_MessageBox(const char *text, UINT type) {
return MessageBox(g_hwnd, text, g_caption, type);
@ -163,10 +165,9 @@ int NSISCALL is_valid_instpath(char *s)
return ivp;
}
static char * NSISCALL findinmem(char *a, char *b, int len_of_a)
char * NSISCALL mystrstr(char *a, char *b)
{
if (len_of_a<0) len_of_a=mystrlen(a);
len_of_a -= mystrlen(b);
int len_of_a = mystrlen(a) - mystrlen(b);
while (*a && len_of_a >= 0)
{
char *t=a,*u=b;
@ -255,7 +256,7 @@ BOOL NSISCALL MoveFileOnReboot(LPCTSTR pszExisting, LPCTSTR pszNew)
if (pszWinInit != NULL)
{
LPSTR pszRenameSecInFile = findinmem(pszWinInit, szRenameSec,-1);
LPSTR pszRenameSecInFile = mystrstr(pszWinInit, szRenameSec);
if (pszRenameSecInFile == NULL)
{
mystrcpy(pszWinInit+dwFileSize, szRenameSec);
@ -265,7 +266,7 @@ BOOL NSISCALL MoveFileOnReboot(LPCTSTR pszExisting, LPCTSTR pszNew)
else
{
char *pszFirstRenameLine = pszRenameSecInFile+10;
char *pszNextSec = findinmem(pszFirstRenameLine,"\n[",-1);
char *pszNextSec = mystrstr(pszFirstRenameLine,"\n[");
if (pszNextSec)
{
int l=dwFileSize - (pszNextSec - pszWinInit);
@ -314,14 +315,14 @@ void NSISCALL myRegGetStr(HKEY root, const char *sub, const char *name, char *ou
static char smwcvesf[]="Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\Shell Folders";
char g_all_user_var_flag;
//int g_all_user_var_flag;
static void NSISCALL queryShellFolders(const char *name_, char *out)
{
static char name[20] = "Common ";
mystrcpy(name + 7, name_);
{
char f=g_all_user_var_flag;
char f=g_flags.all_user_var;
again:
@ -345,7 +346,7 @@ char ps_tmpbuf[NSIS_MAX_STRLEN*2];
char * NSISCALL process_string_fromtab(char *out, int offs)
{
return lstrcpyn(out,process_string(ps_tmpbuf,GetStringFromStringTab(offs)),NSIS_MAX_STRLEN);
return lstrcpyn(out,process_string(GetStringFromStringTab(offs)),NSIS_MAX_STRLEN);
}
void NSISCALL myitoa(char *s, int d) { wsprintf(s,"%d",d); }
@ -405,10 +406,10 @@ int NSISCALL mystrlen(const char *in)
}
// Dave Laundon's simplified process_string
char * NSISCALL process_string(char *out, const char *in)
char * NSISCALL process_string(const char *in)
{
char *outsave = out;
while (*in && out - outsave < NSIS_MAX_STRLEN)
char *out = ps_tmpbuf;
while (*in && out - ps_tmpbuf < NSIS_MAX_STRLEN)
{
int nVarIdx = (unsigned char)*in++;
if (nVarIdx < VAR_CODES_START)
@ -426,7 +427,7 @@ char * NSISCALL process_string(char *out, const char *in)
{
case VAR_CODES_START + 0: // HWNDPARENT
myitoa(out, (unsigned int)g_hwnd);
break;
break;
case VAR_CODES_START + 1: // 0
case VAR_CODES_START + 2: // 1
case VAR_CODES_START + 3: // 2
@ -511,18 +512,40 @@ char * NSISCALL process_string(char *out, const char *in)
#endif
#endif //NSIS_CONFIG_PLUGIN_SUPPORT
} // switch
// remove trailing slash
while (*out && *CharNext(out)) out++;
if (nVarIdx > 21+VAR_CODES_START && nVarIdx != VAR_CODES_START+25 && *out == '\\') // only if not $0 to $R9, $CMDLINE, $LANGUAGE, or $HWNDPARENT
*out = 0;
out=CharNext(out);
// validate the directory name
if (nVarIdx > 21+VAR_CODES_START) { // only if not $0 to $R9, $CMDLINE, or $HWNDPARENT
// ($LANGUAGE can't have trailing backslash anyway...)
validate_filename(out);
}
out+=mystrlen(out);
} // >= VAR_CODES_START
} // while
*out = 0;
return outsave;
return ps_tmpbuf;
;
}
#ifdef NSIS_CONFIG_LOG
char * NSISCALL validate_filename(char *in) {
char *nono = "*?|<>/\":";
char *cur_char = " ";
char *out = in;
char *out_save = out;
int i = 0;
while (*cur_char = *in++) {
if (!mystrstr(nono, cur_char) ||
(i == 1 && *(WORD*)out == CHAR2_TO_WORD(':','\\')) ||
(i == 2 && *cur_char == '?' && *(DWORD*)in == CHAR4_TO_DWORD('\\','\\','?','\\'))
)
*out++ = *cur_char;
i++;
}
do {
*out = 0;
} while (i && (*(--out) == ' ' || *out == '\\'));
return out_save;
}
#ifdef NSIS_CONFIG_LOG
char log_text[4096];
int log_dolog;
void NSISCALL log_write(int close)
@ -554,6 +577,4 @@ void NSISCALL log_write(int close)
}
}
}
#endif

View file

@ -1,17 +1,22 @@
#include "config.h"
extern char ps_tmpbuf[NSIS_MAX_STRLEN*2];
char * NSISCALL process_string(char *out, const char *in);
char * NSISCALL process_string(const char *in);
char * NSISCALL process_string_fromtab(char *out, int offs);
void NSISCALL myRegGetStr(HKEY root, const char *sub, const char *name, char *out);
int NSISCALL myatoi(char *s);
void NSISCALL myitoa(char *s, int d);
char * NSISCALL mystrcpy(char *out, const char *in);
int NSISCALL mystrlen(const char *in);
BOOL NSISCALL my_SetWindowText(HWND hWnd, const char *val);
char * NSISCALL mystrstr(char *a, char *b);
//BOOL NSISCALL my_SetWindowText(HWND hWnd, const char *val);
#define my_SetWindowText SetWindowText
BOOL NSISCALL my_SetDialogItemText(HWND dlg, UINT idx, const char *val);
int NSISCALL my_GetWindowText(HWND hWnd, char *val, int size);
int NSISCALL my_GetDialogItemText(HWND dlg, UINT idx, char *val, int size);
//int NSISCALL my_GetWindowText(HWND hWnd, char *val, int size);
#define my_GetWindowText GetWindowText
//int NSISCALL my_GetDialogItemText(HWND dlg, UINT idx, char *val, int size);
#define my_GetDialogItemText GetDlgItemText
#ifdef NSIS_CONFIG_LOG
extern char log_text[NSIS_MAX_STRLEN*4];
@ -48,6 +53,7 @@ char NSISCALL lastchar(const char *str);
void NSISCALL trimslashtoend(char *buf);
char * NSISCALL scanendslash(const char *str);
int NSISCALL is_valid_instpath(char *s);
char * NSISCALL validate_filename(char *fn);
BOOL NSISCALL MoveFileOnReboot(LPCTSTR pszExisting, LPCTSTR pszNew);
void * NSISCALL mini_memcpy(void *out, const void *in, int len);

View file

@ -784,7 +784,7 @@ int CEXEBuild::doCommand(int which_token, LineParser &line, FILE *fp, const char
SCRIPT_MSG(" (%s:%s)", k?"pre":"creator", line.gettoken_str(2));
if (p.showfunc>=0 && k)
SCRIPT_MSG(" (show:%s)", line.gettoken_str(3));
if (p.showfunc>=0 && k)
if (p.leavefunc>=0 && k)
SCRIPT_MSG(" (leave:%s)", line.gettoken_str(4));
else if (p.caption && !k)
SCRIPT_MSG(" (caption:%s)", line.gettoken_str(3));
@ -2241,9 +2241,10 @@ int CEXEBuild::doCommand(int which_token, LineParser &line, FILE *fp, const char
SCRIPT_MSG("Goto: %s\n",line.gettoken_str(1));
return add_entry(&ent);
case TOK_SETSHELLVARCONTEXT:
ent.which=EW_SETSFCONTEXT;
ent.offsets[0]=line.gettoken_enum(1,"current\0all\0");
if (ent.offsets[0]<0) PRINTHELP()
ent.which=EW_SETFLAG;
ent.offsets[0]=1;
ent.offsets[1]=line.gettoken_enum(1,"current\0all\0");
if (ent.offsets[1]<0) PRINTHELP()
SCRIPT_MSG("SetShellVarContext: %s\n",line.gettoken_str(1));
return add_entry(&ent);
case TOK_RET:
@ -2989,9 +2990,10 @@ int CEXEBuild::doCommand(int which_token, LineParser &line, FILE *fp, const char
SCRIPT_MSG("SetDetailsPrint: %s\n",line.gettoken_str(1));
return add_entry(&ent);
case TOK_SETAUTOCLOSE:
ent.which=EW_SETWINDOWCLOSE;
ent.offsets[0] = line.gettoken_enum(1,"false\0true\0");
if (ent.offsets[0] < 0) PRINTHELP()
ent.which=EW_SETFLAG;
ent.offsets[0]=0;
ent.offsets[1]=line.gettoken_enum(1,"false\0true\0");
if (ent.offsets[1] < 0) PRINTHELP()
SCRIPT_MSG("SetAutoClose: %s\n",line.gettoken_str(1));
return add_entry(&ent);
case TOK_IFERRORS:
@ -3001,12 +3003,15 @@ int CEXEBuild::doCommand(int which_token, LineParser &line, FILE *fp, const char
SCRIPT_MSG("IfErrors ?%s:%s\n",line.gettoken_str(1),line.gettoken_str(2));
return add_entry(&ent);
case TOK_CLEARERRORS:
ent.which=EW_IFERRORS;
ent.which=EW_SETFLAG;
ent.offsets[0]=2;
ent.offsets[1]=0;
SCRIPT_MSG("ClearErrors\n");
return add_entry(&ent);
case TOK_SETERRORS:
ent.which=EW_IFERRORS;
ent.offsets[2]=1;
ent.which=EW_SETFLAG;
ent.offsets[0]=2;
ent.offsets[1]=1;
SCRIPT_MSG("SetErrors\n");
return add_entry(&ent);
#ifdef NSIS_SUPPORT_STROPTS
@ -3726,9 +3731,10 @@ int CEXEBuild::doCommand(int which_token, LineParser &line, FILE *fp, const char
SCRIPT_MSG("IfRebootFlag ?%s:%s\n",line.gettoken_str(1),line.gettoken_str(2));
return add_entry(&ent);
case TOK_SETREBOOTFLAG:
ent.which=EW_SETREBOOTFLAG;
ent.offsets[0]=line.gettoken_enum(1,"false\0true\0");
if (ent.offsets[0] < 0) PRINTHELP()
ent.which=EW_SETFLAG;
ent.offsets[0]=3;
ent.offsets[1]=line.gettoken_enum(1,"false\0true\0");
if (ent.offsets[1] < 0) PRINTHELP()
return add_entry(&ent);
#else//!NSIS_SUPPORT_REBOOT
case TOK_REBOOT:

View file

@ -4,12 +4,18 @@ TODO
NSIS
* check for invalid chars/spaces in folder input
* fix $QUICKLAUNCH with all context
* avaiable size not showing when directory doesn't exist
-- NSIS 2 Beta 2 --
NSIS
* move more ui changes to compile time.
make progress bar flags be written directly in the UI (PBS_SMOOTH)
inst details could be changed in compile time too
* component page for uninstaller, multiple sections
* more default texts in NLF language files
@ -18,6 +24,8 @@ NSIS
* different color for the drive space when there is not enough space
* all installer strings should be language strings
DOCUMENTATION
* user_vars should link to the user_vars section as in the old docs callbacks and