* ChangeUI should warn when it cannot find a dialog.

* CDialogTemplate::Save needs to free the template with the correct function.


git-svn-id: https://svn.code.sf.net/p/nsis/code/NSIS/trunk@6535 212acab6-be3b-0410-9dea-997c60f758d6
This commit is contained in:
anders_k 2014-08-05 13:53:20 +00:00
parent b7630502dc
commit fd6400d44d
7 changed files with 21 additions and 30 deletions

View file

@ -281,17 +281,12 @@ int CDialogTemplate::RemoveItem(WORD wId) {
// Sets the font of the dialog // Sets the font of the dialog
void CDialogTemplate::SetFont(TCHAR* szFaceName, WORD wFontSize) { void CDialogTemplate::SetFont(TCHAR* szFaceName, WORD wFontSize) {
if (_tcscmp(szFaceName, _T("MS Shell Dlg"))) { m_dwStyle &= ~DS_SHELLFONT;
// not MS Shell Dlg if (!_tcscmp(szFaceName, _T("MS Shell Dlg"))) // TODO: "MS Shell Dlg 2"?
m_dwStyle &= ~DS_SHELLFONT;
}
else {
// MS Shell Dlg
m_dwStyle |= DS_SHELLFONT; m_dwStyle |= DS_SHELLFONT;
}
m_bCharset = DEFAULT_CHARSET;
m_dwStyle |= DS_SETFONT; m_dwStyle |= DS_SETFONT;
if (m_szFont) free(m_szFont); m_bCharset = DEFAULT_CHARSET;
free(m_szFont);
m_szFont = WinWStrDupFromTChar(szFaceName, m_uCodePage); m_szFont = WinWStrDupFromTChar(szFaceName, m_uCodePage);
m_sFontSize = wFontSize; m_sFontSize = wFontSize;
} }
@ -334,7 +329,7 @@ HWND CDialogTemplate::CreateDummyDialog() {
DWORD dwTemp; DWORD dwTemp;
BYTE* pbDlg = Save(dwTemp); BYTE* pbDlg = Save(dwTemp);
HWND hDlg = CreateDialogIndirect(GetModuleHandle(0), (DLGTEMPLATE*)pbDlg, 0, 0); HWND hDlg = CreateDialogIndirect(GetModuleHandle(0), (DLGTEMPLATE*)pbDlg, 0, 0);
delete [] pbDlg; FreeSavedTemplate(pbDlg);
if (!hDlg) if (!hDlg)
throw runtime_error("Can't create dialog from template!"); throw runtime_error("Can't create dialog from template!");

View file

@ -134,6 +134,7 @@ public:
#endif #endif
void ConvertToRTL(); void ConvertToRTL();
BYTE* Save(DWORD& dwSize); BYTE* Save(DWORD& dwSize);
static void FreeSavedTemplate(BYTE*pDT) { delete [] pDT; }
DWORD GetSize(); DWORD GetSize();
private: private:

View file

@ -271,9 +271,7 @@ BYTE* CResourceEditor::GetResourceW(const WINWCHAR* szType, WINWCHAR* szName, LA
i = nameDir->Find(szName); i = nameDir->Find(szName);
if (i > -1) { if (i > -1) {
langDir = nameDir->GetEntry(i)->GetSubDirectory(); langDir = nameDir->GetEntry(i)->GetSubDirectory();
i = 0; i = wLanguage ? langDir->Find(wLanguage) : 0;
if (wLanguage)
i = langDir->Find(wLanguage);
if (i > -1) { if (i > -1) {
data = langDir->GetEntry(i)->GetDataEntry(); data = langDir->GetEntry(i)->GetDataEntry();
} }
@ -313,9 +311,7 @@ int CResourceEditor::GetResourceSizeW(const WINWCHAR* szType, WINWCHAR* szName,
i = nameDir->Find(szName); i = nameDir->Find(szName);
if (i > -1) { if (i > -1) {
langDir = nameDir->GetEntry(i)->GetSubDirectory(); langDir = nameDir->GetEntry(i)->GetSubDirectory();
i = 0; i = wLanguage ? langDir->Find(wLanguage) : 0;
if (wLanguage)
i = langDir->Find(wLanguage);
if (i > -1) { if (i > -1) {
data = langDir->GetEntry(i)->GetDataEntry(); data = langDir->GetEntry(i)->GetDataEntry();
} }
@ -352,9 +348,7 @@ DWORD CResourceEditor::GetResourceOffsetW(const WINWCHAR* szType, WINWCHAR* szNa
i = nameDir->Find(szName); i = nameDir->Find(szName);
if (i > -1) { if (i > -1) {
langDir = nameDir->GetEntry(i)->GetSubDirectory(); langDir = nameDir->GetEntry(i)->GetSubDirectory();
i = 0; i = wLanguage ? langDir->Find(wLanguage) : 0;
if (wLanguage)
i = langDir->Find(wLanguage);
if (i > -1) { if (i > -1) {
data = langDir->GetEntry(i)->GetDataEntry(); data = langDir->GetEntry(i)->GetDataEntry();
} }
@ -565,7 +559,7 @@ bool CResourceEditor::SetPESectionVirtualSize(const char* pszSectionName, DWORD
// Private Methods // Private Methods
////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////
// This function scans a give resource directory and return a CResourceDirectory object // This function scans a given resource directory and returns a CResourceDirectory object
// rdRoot must point to the root directory of the resource section // rdRoot must point to the root directory of the resource section
CResourceDirectory* CResourceEditor::ScanDirectory(PRESOURCE_DIRECTORY rdRoot, PRESOURCE_DIRECTORY rdToScan) { CResourceDirectory* CResourceEditor::ScanDirectory(PRESOURCE_DIRECTORY rdRoot, PRESOURCE_DIRECTORY rdToScan) {
// Create CResourceDirectory from rdToScan // Create CResourceDirectory from rdToScan

View file

@ -40,7 +40,7 @@ public:
CPPUNIT_ASSERT_EQUAL( (DWORD) sizeof(original_dialog), dwSize ); CPPUNIT_ASSERT_EQUAL( (DWORD) sizeof(original_dialog), dwSize );
CPPUNIT_ASSERT_EQUAL( 0, memcmp(saved_dialog, original_dialog, dwSize) ); CPPUNIT_ASSERT_EQUAL( 0, memcmp(saved_dialog, original_dialog, dwSize) );
delete [] saved_dialog; dt.FreeSavedTemplate(saved_dialog);
} }
}; };

View file

@ -2199,7 +2199,7 @@ again:
DWORD dwSize; \ DWORD dwSize; \
dlg = dt.Save(dwSize); \ dlg = dt.Save(dwSize); \
res_editor->UpdateResource(RT_DIALOG, id, NSIS_DEFAULT_LANG, dlg, dwSize); \ res_editor->UpdateResource(RT_DIALOG, id, NSIS_DEFAULT_LANG, dlg, dwSize); \
delete [] dlg; \ dt.FreeSavedTemplate(dlg); \
} \ } \
} \ } \
} }

View file

@ -718,7 +718,7 @@ int CEXEBuild::GenerateLangTables() {
DWORD dwSize; \ DWORD dwSize; \
dlg = td.Save(dwSize); \ dlg = td.Save(dwSize); \
res_editor->UpdateResource(RT_DIALOG, id, NSIS_DEFAULT_LANG, dlg, dwSize); \ res_editor->UpdateResource(RT_DIALOG, id, NSIS_DEFAULT_LANG, dlg, dwSize); \
res_editor->FreeResource(dlg); \ td.FreeSavedTemplate(dlg); \
} \ } \
} }
@ -788,7 +788,7 @@ int CEXEBuild::GenerateLangTables() {
DWORD dwSize; \ DWORD dwSize; \
dlg = td.Save(dwSize); \ dlg = td.Save(dwSize); \
res_editor->UpdateResource(RT_DIALOG, id+cur_offset, NSIS_DEFAULT_LANG, dlg, dwSize); \ res_editor->UpdateResource(RT_DIALOG, id+cur_offset, NSIS_DEFAULT_LANG, dlg, dwSize); \
res_editor->FreeResource(dlg); \ td.FreeSavedTemplate(dlg); \
} \ } \
} }

View file

@ -2320,7 +2320,7 @@ int CEXEBuild::doCommand(int which_token, LineParser &line)
DWORD dwSize; DWORD dwSize;
dlg = dt.Save(dwSize); dlg = dt.Save(dwSize);
res_editor->UpdateResource(RT_DIALOG, IDD_INSTFILES, NSIS_DEFAULT_LANG, dlg, dwSize); res_editor->UpdateResource(RT_DIALOG, IDD_INSTFILES, NSIS_DEFAULT_LANG, dlg, dwSize);
delete [] dlg; dt.FreeSavedTemplate(dlg);
} }
catch (exception& err) { catch (exception& err) {
ERROR_MSG(_T("Error setting smooth progress bar: %") NPRIs _T("\n"), CtoTStrParam(err.what())); ERROR_MSG(_T("Error setting smooth progress bar: %") NPRIs _T("\n"), CtoTStrParam(err.what()));
@ -2589,9 +2589,10 @@ int CEXEBuild::doCommand(int which_token, LineParser &line)
init_res_editor(); init_res_editor();
// Search for required items // Search for required items
#define GET(x) dlg = uire->GetResource(RT_DIALOG, x, 0); if (!dlg) return PS_ERROR; CDialogTemplate UIDlg(dlg, build_unicode, uDefCodePage); #define CUISEARCHERR(n,v) ERROR_MSG(_T("Error: Can't find %") NPRIs _T(" (%u) in the custom UI!\n"), n, v);
#define SEARCH(x) if (!UIDlg.GetItem(x)) {ERROR_MSG(_T("Error: Can't find %") NPRIs _T(" (%u) in the custom UI!\n"), _T(#x), x);uire->FreeResource(dlg);delete uire;return PS_ERROR;} #define GET(x) if (!(dlg = uire->GetResource(RT_DIALOG, x, 0))) { CUISEARCHERR(_T(#x), x); return PS_ERROR; } CDialogTemplate UIDlg(dlg, build_unicode, uDefCodePage);
#define SAVE(x) uire->FreeResource(dlg); dlg = UIDlg.Save(dwSize); res_editor->UpdateResource(RT_DIALOG, x, NSIS_DEFAULT_LANG, dlg, dwSize); uire->FreeResource(dlg); #define SEARCH(x) if (!UIDlg.GetItem(x)) { CUISEARCHERR(_T(#x), x); uire->FreeResource(dlg); delete uire; return PS_ERROR; }
#define SAVE(x) uire->FreeResource(dlg); dlg = UIDlg.Save(dwSize); res_editor->UpdateResource(RT_DIALOG, x, NSIS_DEFAULT_LANG, dlg, dwSize); UIDlg.FreeSavedTemplate(dlg);
LPBYTE dlg = NULL; LPBYTE dlg = NULL;
@ -2749,7 +2750,7 @@ int CEXEBuild::doCommand(int which_token, LineParser &line)
DWORD dwDlgSize; DWORD dwDlgSize;
dlg = dt.Save(dwDlgSize); dlg = dt.Save(dwDlgSize);
res_editor->UpdateResource(RT_DIALOG, IDD_INST, NSIS_DEFAULT_LANG, dlg, dwDlgSize); res_editor->UpdateResource(RT_DIALOG, IDD_INST, NSIS_DEFAULT_LANG, dlg, dwDlgSize);
res_editor->FreeResource(dlg); dt.FreeSavedTemplate(dlg);
dt.DlgUnitsToPixels(brandingCtl.sWidth, brandingCtl.sHeight); dt.DlgUnitsToPixels(brandingCtl.sWidth, brandingCtl.sHeight);
SCRIPT_MSG(_T("AddBrandingImage: %") NPRIs _T(" %ux%u\n"), line.gettoken_str(1), brandingCtl.sWidth, brandingCtl.sHeight); SCRIPT_MSG(_T("AddBrandingImage: %") NPRIs _T(" %ux%u\n"), line.gettoken_str(1), brandingCtl.sWidth, brandingCtl.sHeight);
@ -3825,7 +3826,7 @@ int CEXEBuild::doCommand(int which_token, LineParser &line)
DWORD dwSize; DWORD dwSize;
dlg = td.Save(dwSize); dlg = td.Save(dwSize);
res_editor->UpdateResource(RT_DIALOG, IDD_INST, NSIS_DEFAULT_LANG, dlg, dwSize); res_editor->UpdateResource(RT_DIALOG, IDD_INST, NSIS_DEFAULT_LANG, dlg, dwSize);
res_editor->FreeResource(dlg); td.FreeSavedTemplate(dlg);
} }
catch (exception& err) { catch (exception& err) {
ERROR_MSG(_T("Error while triming branding text control: %") NPRIs _T("\n"), CtoTStrParam(err.what())); ERROR_MSG(_T("Error while triming branding text control: %") NPRIs _T("\n"), CtoTStrParam(err.what()));