- More path validation (drive id is an english letter, no chars under 32 in a path)

- Fixed bug #839214 - message box shown in silent mode if a file can't be opened for writing. Now it will skip the file if AllowSkipFiles is on and abort if it's not.
- Added /SD parameter for MessageBox. Allows to set default for silent installers (MessageBox MB_OKCANCEL "OK? Cancel?" /SD IDOK IDOK doOK IDCANCEL doCancel)


git-svn-id: https://svn.code.sf.net/p/nsis/code/NSIS/trunk@3208 212acab6-be3b-0410-9dea-997c60f758d6
This commit is contained in:
kichik 2003-11-25 17:07:40 +00:00
parent c062ecca53
commit ec5f289696
5 changed files with 62 additions and 27 deletions

View file

@ -3179,7 +3179,7 @@ again:
// error
if (add_label("Initialize_____Plugins_error")) return PS_ERROR;
// error message box
ret=add_entry_direct(EW_MESSAGEBOX, MB_OK|MB_ICONSTOP, add_string("Error! Can't initialize plug-ins directory. Please try again later."));
ret=add_entry_direct(EW_MESSAGEBOX, MB_OK|MB_ICONSTOP|(IDOK<<20), add_string("Error! Can't initialize plug-ins directory. Please try again later."));
if (ret != PS_OK) return ret;
// Quit
ret=add_entry_direct(EW_QUIT);

View file

@ -539,19 +539,18 @@ static int NSISCALL ExecuteEntry(entry *entry_)
#ifdef NSIS_SUPPORT_RMDIR
case EW_RMDIR:
{
char *buf0=GetStringFromParm(0x00);
log_printf2("RMDir: \"%s\"",buf0);
char *buf1=GetStringFromParm(-0x10);
log_printf2("RMDir: \"%s\"",buf1);
if (lastchar(buf0)=='\\') trimslashtoend(buf0);
doRMDir(buf0,parm1);
if (file_exists(buf0) && parm1!=2) exec_error++;
else update_status_text(LANG_REMOVEDIR, buf0);
doRMDir(buf1,parm1);
if (file_exists(buf1) && parm1!=2) exec_error++;
else update_status_text(LANG_REMOVEDIR, buf1);
}
break;
#endif//NSIS_SUPPORT_RMDIR
#ifdef NSIS_SUPPORT_STROPTS
case EW_STRLEN: {
case EW_STRLEN:
{
char *buf0=GetStringFromParm(0x01);
myitoa(var0,mystrlen(buf0));
}

View file

@ -81,7 +81,11 @@ int NSISCALL my_GetDialogItemText(HWND dlg, UINT idx, char *val, int size)
}*/
int NSISCALL my_MessageBox(const char *text, UINT type) {
return MessageBox(g_hwnd, text, g_caption, type);
// default for silent installers
if (g_exec_flags.silent && type >> 20)
return type >> 20;
// no silent or no default, just show
return MessageBox(g_hwnd, text, g_caption, type & 0x000FFFFF);
}
void * NSISCALL my_GlobalAlloc(DWORD dwBytes) {
@ -135,7 +139,7 @@ char *NSISCALL addtrailingslash(char *str)
void NSISCALL trimslashtoend(char *buf)
{
char *p = CharPrev(buf, buf + mystrlen(buf));
char *p = buf + mystrlen(buf);
do
{
if (*p == '\\')
@ -148,7 +152,8 @@ void NSISCALL trimslashtoend(char *buf)
int NSISCALL validpathspec(char *ubuf)
{
return ((*(WORD*)ubuf==CHAR2_TO_WORD('\\','\\')) || (ubuf[0] && *CharNext(ubuf)==':'));
char dl = ubuf[0] | 0x20; // convert drive letter to lower case
return ((*(WORD*)ubuf==CHAR2_TO_WORD('\\','\\')) || (dl >= 'a' && dl <= 'z' && *CharNext(ubuf)==':'));
}
char * NSISCALL skip_root(char *path)
@ -710,7 +715,7 @@ char * NSISCALL validate_filename(char *in) {
}
out = out_save = in;
while (*(char*)&cur_char = *in) {
if (!mystrstr(nono, (char*)&cur_char)) {
if (cur_char > 31 && !mystrstr(nono, (char*)&cur_char)) {
mini_memcpy(out, in, CharNext(in) - in);
out = CharNext(out);
}

View file

@ -3314,22 +3314,40 @@ int CEXEBuild::doCommand(int which_token, LineParser &line)
0,IDABORT,IDCANCEL,IDIGNORE,IDNO,IDOK,IDRETRY,IDYES
};
const char *retstr="0\0IDABORT\0IDCANCEL\0IDIGNORE\0IDNO\0IDOK\0IDRETRY\0IDYES\0";
int a=3;
if (line.getnumtokens() > 3)
{
ent.offsets[2]=line.gettoken_enum(3,retstr);
if (ent.offsets[2] < 0) PRINTHELP()
ent.offsets[2] = rettab[ent.offsets[2]];
if (process_jump(line,4,&ent.offsets[3])) PRINTHELP()
if (line.getnumtokens() > 5)
if (!strcmpi(line.gettoken_str(3),"/SD"))
{
int v=line.gettoken_enum(5,retstr);
if (v < 0) PRINTHELP()
ent.offsets[4] = rettab[v];
if (process_jump(line,6,&ent.offsets[5])) PRINTHELP()
int k=line.gettoken_enum(4,retstr);
if (k <= 0) PRINTHELP();
ent.offsets[0]|=rettab[k]<<20;
a=5;
}
else if (line.getnumtokens() > 7)
PRINTHELP();
if (line.getnumtokens() > a)
{
ent.offsets[2]=line.gettoken_enum(a,retstr);
if (ent.offsets[2] < 0)
PRINTHELP();
ent.offsets[2] = rettab[ent.offsets[2]];
if (process_jump(line,a+1,&ent.offsets[3]))
PRINTHELP();
if (line.getnumtokens() > a+2)
{
int v=line.gettoken_enum(a+2,retstr);
if (v < 0)
PRINTHELP();
ent.offsets[4] = rettab[v];
if (process_jump(line,a+3,&ent.offsets[5]))
PRINTHELP();
}
}
}
SCRIPT_MSG("MessageBox: %d: \"%s\"",r,line.gettoken_str(2));
if (line.getnumtokens()>4) SCRIPT_MSG(" (on %s goto %s)",line.gettoken_str(3),line.gettoken_str(4));
if (line.getnumtokens()>a+1) SCRIPT_MSG(" (on %s goto %s)",line.gettoken_str(a),line.gettoken_str(a+1));
SCRIPT_MSG("\n");
}
return add_entry(&ent);
@ -5057,12 +5075,11 @@ int CEXEBuild::doCommand(int which_token, LineParser &line)
DefineInnerLangString(NLF_CANT_WRITE);
ent.offsets[0]=1; // overwrite off
ent.offsets[0]|=(MB_ABORTRETRYIGNORE|MB_ICONSTOP)<<3;
ent.offsets[0]|=(MB_RETRYCANCEL|MB_ICONSTOP|(IDCANCEL<<20))<<3;
ent.offsets[1]=add_string(tempDLL);
ent.offsets[2]=data_handle;
ent.offsets[3]=0xffffffff;
ent.offsets[4]=0xffffffff;
ent.offsets[5]=MB_ABORTRETRYIGNORE | MB_ICONSTOP;
ent.offsets[5]=DefineInnerLangString(NLF_FILE_ERROR);
ret=add_entry(&ent);
if (ret != PS_OK) {
@ -5321,7 +5338,21 @@ int CEXEBuild::do_add_file(const char *lgss, int attrib, int recurse, int linecn
}
// overwrite flag can be 0, 1, 2 or 3. in all cases, 2 bits
ent.offsets[0] |= ((build_allowskipfiles ? MB_ABORTRETRYIGNORE : MB_RETRYCANCEL) | MB_ICONSTOP) << 3;
int mb = 0;
if (build_allowskipfiles)
{
mb = MB_ABORTRETRYIGNORE | MB_ICONSTOP;
// default for silent installers
mb |= IDIGNORE << 20;
}
else
{
mb = MB_RETRYCANCEL | MB_ICONSTOP;
// default for silent installers
mb |= IDCANCEL << 20;
}
ent.offsets[0] |= mb << 3;
ent.offsets[5] = DefineInnerLangString(build_allowskipfiles ? NLF_FILE_ERROR : NLF_FILE_ERROR_NOIGNORE);
}

View file

@ -110,7 +110,7 @@ static tokenType tokenlist[TOK__LAST] =
{TOK_LOADNLF,"LoadLanguageFile",1,0,"language.nlf"},
{TOK_LOGSET,"LogSet",1,0,"on|off"},
{TOK_LOGTEXT,"LogText",1,0,"text"},
{TOK_MESSAGEBOX,"MessageBox",2,4,"mode messagebox_text [return_check label_to_goto_if_equal [return_check2 label2]]\n mode=modeflag[|modeflag[|modeflag[...]]]\n "
{TOK_MESSAGEBOX,"MessageBox",2,6,"mode messagebox_text [/SD return] [return_check label_to_goto_if_equal [return_check2 label2]]\n mode=modeflag[|modeflag[|modeflag[...]]]\n "
"modeflag=(MB_ABORTRETRYIGNORE|MB_OK|MB_OKCANCEL|MB_RETRYCANCEL|MB_YESNO|MB_YESNOCANCEL|MB_ICONEXCLAMATION|MB_ICONINFORMATION|MB_ICONQUESTION|MB_ICONSTOP|MB_TOPMOST|MB_SETFOREGROUND|MB_RIGHT"},
{TOK_NOP,"Nop",0,0,""},
{TOK_NAME,"Name",1,0,"installer_name"},