Added API for compiler host to choose a different output path on output error

git-svn-id: https://svn.code.sf.net/p/nsis/code/NSIS/trunk@7169 212acab6-be3b-0410-9dea-997c60f758d6
This commit is contained in:
anders_k 2020-04-20 17:21:04 +00:00
parent 13121dacfe
commit 322c7ac6d2
6 changed files with 131 additions and 15 deletions

View file

@ -497,9 +497,10 @@ INT_PTR CALLBACK DialogProc(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam
case MakensisAPI::QUERYHOST: {
if (MakensisAPI::QH_OUTPUTCHARSET == wParam) {
const UINT reqcp = 1200; // We want UTF-16LE
SetWindowLongPtr(hwndDlg, DWLP_MSGRESULT, (LONG_PTR)(1+reqcp));
return TRUE;
return DlgRet(hwndDlg, (LONG_PTR)(1+reqcp));
}
else if (MakensisAPI::QH_SUPPORTEDVERSION == wParam)
return DlgRet(hwndDlg, 0x03006000);
return FALSE;
}
case WM_NOTIFY:
@ -546,7 +547,8 @@ INT_PTR CALLBACK DialogProc(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam
return TRUE;
case WM_COPYDATA:
{
PCOPYDATASTRUCT cds = PCOPYDATASTRUCT(lParam);
using namespace MakensisAPI;
COPYDATASTRUCT *cds = (COPYDATASTRUCT*) lParam, cdsret;
switch (cds->dwData) {
case MakensisAPI::NOTIFY_SCRIPT:
MemSafeFree(g_sdata.input_script);
@ -564,6 +566,24 @@ INT_PTR CALLBACK DialogProc(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam
g_sdata.output_exe = (TCHAR*) MemAlloc(cds->cbData * sizeof(TCHAR));
lstrcpy(g_sdata.output_exe, (TCHAR *)cds->lpData);
break;
case MakensisAPI::PROMPT_FILEPATH:
if ((((PROMPT_FILEPATH_DATA*)cds->lpData)->Platform & 7) == sizeof(TCHAR))
{
TCHAR buf[MAX_PATH];
lstrcpyn(buf, FSPath::FindLastComponent(((PROMPT_FILEPATH_DATA*)cds->lpData)->Path), COUNTOF(buf));
OPENFILENAME of = { sizeof(of) };
of.hwndOwner = hwndDlg;
of.lpstrFilter = _T("*.exe\0*.exe\0*\0*.*\0");
of.lpstrFile = buf, of.nMaxFile = COUNTOF(buf);
of.Flags = OFN_EXPLORER|OFN_ENABLESIZING|OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT|OFN_PATHMUSTEXIST|OFN_NOCHANGEDIR;
if (GetSaveFileName(&of))
{
cdsret.dwData = cds->dwData, cdsret.cbData = (lstrlen(buf) + 1) * sizeof(TCHAR), cdsret.lpData = buf;
SendMessage((HWND) wParam, WM_COPYDATA, (SIZE_T) hwndDlg, (SIZE_T) &cdsret);
}
return TRUE;
}
return FALSE;
}
return TRUE;
}

View file

@ -94,18 +94,26 @@ namespace MakensisAPI {
extern const TCHAR* SigintEventNameFmt;
extern const TCHAR* SigintEventNameLegacy;
enum notify_e {
enum datatransfer_e {
NOTIFY_SCRIPT,
NOTIFY_WARNING,
NOTIFY_ERROR,
NOTIFY_OUTPUT
NOTIFY_OUTPUT,
PROMPT_FILEPATH
};
enum sndmsg_e {
QUERYHOST = WM_APP
};
enum QUERYHOST_e {
QH_OUTPUTCHARSET = 1
QH_OUTPUTCHARSET = 1,
QH_ENABLESTDERR,
QH_SUPPORTEDVERSION
};
typedef struct {
unsigned char Platform;
unsigned char Reserved;
TCHAR Path[1];
} PROMPT_FILEPATH_DATA;
}
typedef enum {

View file

@ -64,6 +64,7 @@ void LogMessage(HWND hwnd,const TCHAR *str);
void ErrorMessage(HWND hwnd,const TCHAR *str);
void CenterOnParent(HWND hwnd);
void SetDialogFocus(HWND hDlg, HWND hCtl); // Use this and not SetFocus()!
#define DlgRet(hDlg, val) ( SetWindowLongPtr((hDlg), DWLP_MSGRESULT, (val)) | TRUE )
HWND GetComboEdit(HWND hCB);
#define DisableItems(hwnd) EnableDisableItems(hwnd, 0)
#define EnableItems(hwnd) EnableDisableItems(hwnd, 1)
@ -90,6 +91,18 @@ void BuildMRUMenus();
void LoadMRUFile(int position);
void ClearMRUList();
struct FSPath {
template<class T> static inline bool IsAgnosticSeparator(const T c) { return '\\' == c || '/' == c; }
template<class T> static T* FindLastComponent(T*p) // Note: Returns "" for "dir\"
{
for (T *sep = 0, *start = p;; ++p)
if (!*p)
return sep ? ++sep : start;
else if (IsAgnosticSeparator(*p))
sep = p;
}
};
bool FileExists(const TCHAR *fname);
bool OpenUrlInDefaultBrowser(HWND hwnd, LPCSTR Url);