Added DirVerify (works in PageEx directory) and GetInstDirError. If `DirVerify leave' is used, the next button will not be disabled if the installation directory is not valid or there is not enough space and a flag will be set instead. You can read that flag using GetInstDirError in the leave function of the directory page. A value of 0 means no error, 1 means invalid installation directory and 2 means not enough space. This allows you to handle those errors on your own.
git-svn-id: https://svn.code.sf.net/p/nsis/code/NSIS/trunk@3196 212acab6-be3b-0410-9dea-997c60f758d6
This commit is contained in:
parent
80eac750fc
commit
b77f339455
6 changed files with 81 additions and 29 deletions
|
@ -751,8 +751,9 @@ static int NSISCALL getreqsize()
|
||||||
|
|
||||||
static BOOL CALLBACK DirProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
|
static BOOL CALLBACK DirProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
|
||||||
{
|
{
|
||||||
char *dir = g_usrvars[g_this_page->parms[4]];
|
page *thispage = g_this_page;
|
||||||
int browse_text = g_this_page->parms[3];
|
char *dir = g_usrvars[thispage->parms[4]];
|
||||||
|
int browse_text = thispage->parms[3];
|
||||||
if (uMsg == WM_NOTIFY_INIGO_MONTOYA)
|
if (uMsg == WM_NOTIFY_INIGO_MONTOYA)
|
||||||
{
|
{
|
||||||
GetUIText(IDC_DIR,dir,NSIS_MAX_STRLEN);
|
GetUIText(IDC_DIR,dir,NSIS_MAX_STRLEN);
|
||||||
|
@ -831,12 +832,13 @@ static BOOL CALLBACK DirProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lPar
|
||||||
{
|
{
|
||||||
static char s[NSIS_MAX_STRLEN];
|
static char s[NSIS_MAX_STRLEN];
|
||||||
char *p;
|
char *p;
|
||||||
int is_valid_path;
|
int error = 0;
|
||||||
int total, available=-1;
|
int total, available=-1;
|
||||||
DWORD spc,bps,fc,tc;
|
DWORD spc,bps,fc,tc;
|
||||||
|
|
||||||
GetUIText(IDC_DIR,dir,NSIS_MAX_STRLEN);
|
GetUIText(IDC_DIR,dir,NSIS_MAX_STRLEN);
|
||||||
is_valid_path=is_valid_instpath(dir);
|
if (!is_valid_instpath(dir))
|
||||||
|
error = NSIS_INSTDIR_INVALID;
|
||||||
|
|
||||||
mystrcpy(s,dir);
|
mystrcpy(s,dir);
|
||||||
p=skip_root(s);
|
p=skip_root(s);
|
||||||
|
@ -852,6 +854,9 @@ static BOOL CALLBACK DirProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lPar
|
||||||
|
|
||||||
total = getreqsize();
|
total = getreqsize();
|
||||||
|
|
||||||
|
if ((unsigned int)available < (unsigned int)total)
|
||||||
|
error = NSIS_INSTDIR_NOT_ENOUGH_SPACE;
|
||||||
|
|
||||||
if (LANG_STR_TAB(LANG_SPACE_REQ)) {
|
if (LANG_STR_TAB(LANG_SPACE_REQ)) {
|
||||||
SetUITextNT(IDC_SPACEREQUIRED,inttosizestr(total,GetNSISString(s,LANG_SPACE_REQ)));
|
SetUITextNT(IDC_SPACEREQUIRED,inttosizestr(total,GetNSISString(s,LANG_SPACE_REQ)));
|
||||||
if (available != -1)
|
if (available != -1)
|
||||||
|
@ -860,12 +865,17 @@ static BOOL CALLBACK DirProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lPar
|
||||||
SetUITextNT(IDC_SPACEAVAILABLE,"");
|
SetUITextNT(IDC_SPACEAVAILABLE,"");
|
||||||
}
|
}
|
||||||
|
|
||||||
EnableWindow(m_hwndOK,
|
g_exec_flags.instdir_error = error;
|
||||||
is_valid_path && ((unsigned int)available >= (unsigned int)total)
|
|
||||||
#ifdef NSIS_SUPPORT_CODECALLBACKS
|
#ifdef NSIS_SUPPORT_CODECALLBACKS
|
||||||
&& !ExecuteCodeSegment(g_header->code_onVerifyInstDir,NULL)
|
if (!error)
|
||||||
|
error = ExecuteCodeSegment(g_header->code_onVerifyInstDir,NULL);
|
||||||
#endif
|
#endif
|
||||||
);
|
|
||||||
|
if (thispage->flags & PF_DIR_NO_BTN_DISABLE)
|
||||||
|
error = 0;
|
||||||
|
|
||||||
|
EnableWindow(m_hwndOK, !error);
|
||||||
}
|
}
|
||||||
return HandleStaticBkColor();
|
return HandleStaticBkColor();
|
||||||
}
|
}
|
||||||
|
|
|
@ -122,31 +122,43 @@ static int NSISCALL ExecuteEntry(entry *entry_)
|
||||||
char *buf3 = bufs[3];
|
char *buf3 = bufs[3];
|
||||||
char *buf4 = bufs[4];
|
char *buf4 = bufs[4];
|
||||||
|
|
||||||
int parm0 = entry_->offsets[0];
|
char *var0;
|
||||||
char *var0 = g_usrvars[parm0];
|
char *var1;
|
||||||
int parm1 = entry_->offsets[1];
|
char *var2;
|
||||||
char *var1 = g_usrvars[parm1];
|
char *var3;
|
||||||
int parm2 = entry_->offsets[2];
|
//char *var4;
|
||||||
char *var2 = g_usrvars[parm2];
|
//char *var5;
|
||||||
int parm3 = entry_->offsets[3];
|
|
||||||
char *var3 = g_usrvars[parm3];
|
|
||||||
int parm4 = entry_->offsets[4];
|
|
||||||
//char *var4 = g_usrvars[parm4]; // not used yet
|
|
||||||
int parm5 = entry_->offsets[5];
|
|
||||||
//char *var5 = g_usrvars[parm5]; // not used yet
|
|
||||||
int which = entry_->which;
|
|
||||||
|
|
||||||
// Saves 8 bytes
|
|
||||||
// HWND mainHwnd = g_hwnd;
|
|
||||||
// #define g_hwnd mainHwnd
|
|
||||||
|
|
||||||
#ifdef NSIS_CONFIG_COMPONENTPAGE
|
#ifdef NSIS_CONFIG_COMPONENTPAGE
|
||||||
HWND hwSectionHack = g_SectionHack;
|
HWND hwSectionHack = g_SectionHack;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
// Saves 8 bytes
|
||||||
|
HWND mainHwnd = g_hwnd;
|
||||||
|
#define g_hwnd mainHwnd
|
||||||
|
|
||||||
int exec_error = 0;
|
int exec_error = 0;
|
||||||
|
|
||||||
parms = entry_->offsets;
|
entry lent;
|
||||||
|
mini_memcpy(&lent, entry_, sizeof(entry));
|
||||||
|
|
||||||
|
#define which (lent.which)
|
||||||
|
#define parm0 (lent.offsets[0])
|
||||||
|
#define parm1 (lent.offsets[1])
|
||||||
|
#define parm2 (lent.offsets[2])
|
||||||
|
#define parm3 (lent.offsets[3])
|
||||||
|
#define parm4 (lent.offsets[4])
|
||||||
|
#define parm5 (lent.offsets[5])
|
||||||
|
|
||||||
|
var0 = g_usrvars[parm0];
|
||||||
|
var1 = g_usrvars[parm1];
|
||||||
|
var2 = g_usrvars[parm2];
|
||||||
|
var3 = g_usrvars[parm3];
|
||||||
|
// not used yet
|
||||||
|
//var4 = g_usrvars[parm4];
|
||||||
|
//var5 = g_usrvars[parm5];
|
||||||
|
|
||||||
|
parms = lent.offsets;
|
||||||
|
|
||||||
switch (which)
|
switch (which)
|
||||||
{
|
{
|
||||||
|
@ -202,7 +214,7 @@ static int NSISCALL ExecuteEntry(entry *entry_)
|
||||||
break;
|
break;
|
||||||
case EW_IFFLAG:
|
case EW_IFFLAG:
|
||||||
{
|
{
|
||||||
int f=entry_->offsets[!g_exec_flags.flags[parm2]];
|
int f=lent.offsets[!g_exec_flags.flags[parm2]];
|
||||||
g_exec_flags.flags[parm2]&=parm3;
|
g_exec_flags.flags[parm2]&=parm3;
|
||||||
return f;
|
return f;
|
||||||
}
|
}
|
||||||
|
@ -377,7 +389,7 @@ static int NSISCALL ExecuteEntry(entry *entry_)
|
||||||
int cmp=0;
|
int cmp=0;
|
||||||
if (ffd)
|
if (ffd)
|
||||||
{
|
{
|
||||||
cmp=CompareFileTime(&ffd->ftLastWriteTime, (FILETIME*)(entry_->offsets + 3));
|
cmp=CompareFileTime(&ffd->ftLastWriteTime, (FILETIME*)(lent.offsets + 3));
|
||||||
}
|
}
|
||||||
overwriteflag=!(cmp & (0x80000000 | (overwriteflag - 3)));
|
overwriteflag=!(cmp & (0x80000000 | (overwriteflag - 3)));
|
||||||
}
|
}
|
||||||
|
@ -431,7 +443,7 @@ static int NSISCALL ExecuteEntry(entry *entry_)
|
||||||
log_printf3("File: wrote %d to \"%s\"",ret,buf0);
|
log_printf3("File: wrote %d to \"%s\"",ret,buf0);
|
||||||
|
|
||||||
if (parm3 != 0xffffffff || parm4 != 0xffffffff)
|
if (parm3 != 0xffffffff || parm4 != 0xffffffff)
|
||||||
SetFileTime(hOut,(FILETIME*)(entry_->offsets+3),NULL,(FILETIME*)(entry_->offsets+3));
|
SetFileTime(hOut,(FILETIME*)(lent.offsets+3),NULL,(FILETIME*)(lent.offsets+3));
|
||||||
|
|
||||||
CloseHandle(hOut);
|
CloseHandle(hOut);
|
||||||
|
|
||||||
|
|
|
@ -360,6 +360,7 @@ enum
|
||||||
#define PF_LICENSE_SELECTED 1 // must be 1
|
#define PF_LICENSE_SELECTED 1 // must be 1
|
||||||
#define PF_NO_NEXT_FOCUS 128
|
#define PF_NO_NEXT_FOCUS 128
|
||||||
#define PF_PAGE_EX 512
|
#define PF_PAGE_EX 512
|
||||||
|
#define PF_DIR_NO_BTN_DISABLE 1024
|
||||||
|
|
||||||
typedef struct
|
typedef struct
|
||||||
{
|
{
|
||||||
|
@ -448,6 +449,9 @@ DWORD NSISCALL SetSelfFilePointer(LONG lDistanceToMove);
|
||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#define NSIS_INSTDIR_INVALID 1
|
||||||
|
#define NSIS_INSTDIR_NOT_ENOUGH_SPACE 2
|
||||||
|
|
||||||
union exec_flags {
|
union exec_flags {
|
||||||
struct {
|
struct {
|
||||||
int autoclose;
|
int autoclose;
|
||||||
|
@ -462,6 +466,7 @@ union exec_flags {
|
||||||
#ifdef NSIS_CONFIG_SILENT_SUPPORT
|
#ifdef NSIS_CONFIG_SILENT_SUPPORT
|
||||||
int silent;
|
int silent;
|
||||||
#endif
|
#endif
|
||||||
|
int instdir_error;
|
||||||
};
|
};
|
||||||
int flags[1];
|
int flags[1];
|
||||||
};
|
};
|
||||||
|
|
|
@ -1350,6 +1350,26 @@ int CEXEBuild::doCommand(int which_token, LineParser &line)
|
||||||
SCRIPT_MSG("DirVar: %s\n", line.gettoken_str(1));
|
SCRIPT_MSG("DirVar: %s\n", line.gettoken_str(1));
|
||||||
}
|
}
|
||||||
return make_sure_not_in_secorfunc(line.gettoken_str(0), 1);
|
return make_sure_not_in_secorfunc(line.gettoken_str(0), 1);
|
||||||
|
case TOK_DIRVERIFY:
|
||||||
|
{
|
||||||
|
if (!cur_page || cur_page_type != PAGE_DIRECTORY) {
|
||||||
|
ERROR_MSG("Error: can't use DirVerify outside of PageEx directory.\n");
|
||||||
|
return PS_ERROR;
|
||||||
|
}
|
||||||
|
cur_page->flags &= ~PF_DIR_NO_BTN_DISABLE;
|
||||||
|
int k = line.gettoken_enum(1,"auto\0leave\0");
|
||||||
|
if (k == -1)
|
||||||
|
PRINTHELP();
|
||||||
|
if (k)
|
||||||
|
cur_page->flags |= PF_DIR_NO_BTN_DISABLE;
|
||||||
|
SCRIPT_MSG("DirVerify: %s\n", line.gettoken_str(1));
|
||||||
|
}
|
||||||
|
return make_sure_not_in_secorfunc(line.gettoken_str(0), 1);
|
||||||
|
case TOK_GETINSTDIRERROR:
|
||||||
|
ent.which = EW_GETFLAG;
|
||||||
|
ent.offsets[0] = GetUserVarIndex(line, 1);
|
||||||
|
ent.offsets[1] = FLAG_OFFSET(instdir_error);
|
||||||
|
return add_entry(&ent);
|
||||||
#ifdef NSIS_CONFIG_COMPONENTPAGE
|
#ifdef NSIS_CONFIG_COMPONENTPAGE
|
||||||
case TOK_COMPTEXT:
|
case TOK_COMPTEXT:
|
||||||
{
|
{
|
||||||
|
|
|
@ -49,6 +49,8 @@ static tokenType tokenlist[TOK__LAST] =
|
||||||
{TOK_DIRTEXT,"DirText",0,4,"[directory_page_description] [directory_page_subtext] [browse_button_text] [browse_dlg_text]"},
|
{TOK_DIRTEXT,"DirText",0,4,"[directory_page_description] [directory_page_subtext] [browse_button_text] [browse_dlg_text]"},
|
||||||
{TOK_DIRSHOW,"DirShow",1,0,"(show|hide)"},
|
{TOK_DIRSHOW,"DirShow",1,0,"(show|hide)"},
|
||||||
{TOK_DIRVAR,"DirVar",1,0,"$(user_var: dir in/out))"},
|
{TOK_DIRVAR,"DirVar",1,0,"$(user_var: dir in/out))"},
|
||||||
|
{TOK_DIRVERIFY,"DirVerify",1,0,"auto|leave"},
|
||||||
|
{TOK_GETINSTDIRERROR,"GetInstDirError",1,0,"$(user_var: error output)"},
|
||||||
{TOK_ROOTDIRINST,"AllowRootDirInstall",1,0,"(true|false)"},
|
{TOK_ROOTDIRINST,"AllowRootDirInstall",1,0,"(true|false)"},
|
||||||
{TOK_CHECKBITMAP,"CheckBitmap",1,0,"local_bitmap.bmp"},
|
{TOK_CHECKBITMAP,"CheckBitmap",1,0,"local_bitmap.bmp"},
|
||||||
{TOK_ENABLEWINDOW,"EnableWindow",2,0,"hwnd (1|0)"},
|
{TOK_ENABLEWINDOW,"EnableWindow",2,0,"hwnd (1|0)"},
|
||||||
|
|
|
@ -109,8 +109,11 @@ enum
|
||||||
TOK_PAGEEX,
|
TOK_PAGEEX,
|
||||||
TOK_PAGEEXEND,
|
TOK_PAGEEXEND,
|
||||||
TOK_DIRVAR,
|
TOK_DIRVAR,
|
||||||
|
TOK_DIRVERIFY,
|
||||||
TOK_PAGECALLBACKS,
|
TOK_PAGECALLBACKS,
|
||||||
|
|
||||||
|
TOK_GETINSTDIRERROR,
|
||||||
|
|
||||||
// flag setters
|
// flag setters
|
||||||
TOK_SETDATESAVE,
|
TOK_SETDATESAVE,
|
||||||
TOK_SETOVERWRITE,
|
TOK_SETOVERWRITE,
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue