From db0d67633b04a52ce3757d8438d8f517dddb6dad Mon Sep 17 00:00:00 2001 From: kichik Date: Tue, 23 Jan 2007 21:21:30 +0000 Subject: [PATCH] fixed bug #1626504 - VIAddVersionKey causes problems with localized installers git-svn-id: https://svn.code.sf.net/p/nsis/code/NSIS/trunk@4869 212acab6-be3b-0410-9dea-997c60f758d6 --- Source/build.cpp | 9 ++++---- Source/build.h | 3 ++- Source/lang.cpp | 30 +++++++++++++++++++++---- Source/script.cpp | 57 +++++++++++++++++++++++++---------------------- 4 files changed, 63 insertions(+), 36 deletions(-) diff --git a/Source/build.cpp b/Source/build.cpp index cb150966..6a4e8645 100644 --- a/Source/build.cpp +++ b/Source/build.cpp @@ -1602,14 +1602,15 @@ int CEXEBuild::AddVersionInfo() { LANGID lang_id = rVersionInfo.GetLangID(i); int code_page = rVersionInfo.GetCodePage(i); - LanguageTable *Table = GetLangTable(lang_id); + + char *lang_name = GetLangNameAndCP(lang_id); if ( !rVersionInfo.FindKey(lang_id, code_page, "FileVersion") ) - warning("Generating version information for language \"%04d-%s\" without standard key \"FileVersion\"", lang_id, Table->nlf.m_bLoaded ? Table->nlf.m_szName : lang_id == 1033 ? "English" : "???"); + warning("Generating version information for language \"%04d-%s\" without standard key \"FileVersion\"", lang_id, lang_name); if ( !rVersionInfo.FindKey(lang_id, code_page, "FileDescription") ) - warning("Generating version information for language \"%04d-%s\" without standard key \"FileDescription\"", lang_id, Table->nlf.m_bLoaded ? Table->nlf.m_szName : lang_id == 1033 ? "English" : "???"); + warning("Generating version information for language \"%04d-%s\" without standard key \"FileDescription\"", lang_id, lang_name); if ( !rVersionInfo.FindKey(lang_id, code_page, "LegalCopyright") ) - warning("Generating version information for language \"%04d-%s\" without standard key \"LegalCopyright\"", lang_id, Table->nlf.m_bLoaded ? Table->nlf.m_szName : lang_id == 1033 ? "English" : "???"); + warning("Generating version information for language \"%04d-%s\" without standard key \"LegalCopyright\"", lang_id, lang_name); rVersionInfo.ExportToStream(VerInfoStream, i); res_editor->UpdateResource(RT_VERSION, 1, lang_id, (BYTE*)VerInfoStream.get(), VerInfoStream.getlen()); diff --git a/Source/build.h b/Source/build.h index 6e429f92..a1c8f1a6 100644 --- a/Source/build.h +++ b/Source/build.h @@ -247,7 +247,8 @@ class CEXEBuild { // lang.cpp functions and variables void InitLangTables(); - LanguageTable *GetLangTable(LANGID &lang); + LanguageTable *GetLangTable(LANGID &lang, bool create = true); + char *GetLangNameAndCP(LANGID lang, unsigned int *codepage = NULL); int DefineLangString(char *name, int process=-1); int DefineInnerLangString(int id, int process=-1); int SetLangString(char *name, LANGID lang, char *string); diff --git a/Source/lang.cpp b/Source/lang.cpp index 63261c11..9a0b9f1e 100644 --- a/Source/lang.cpp +++ b/Source/lang.cpp @@ -328,13 +328,12 @@ void CEXEBuild::InitLangTables() { keep_ref = true; } -LanguageTable* CEXEBuild::GetLangTable(LANGID &lang) { +LanguageTable* CEXEBuild::GetLangTable(LANGID &lang, bool create/*=true*/) { int nlt = lang_tables.getlen() / sizeof(LanguageTable); LanguageTable *nla = (LanguageTable*)lang_tables.get(); lang = lang ? lang : last_used_lang; - last_used_lang = lang; - LanguageTable *table = 0; + LanguageTable *table = NULL; for (int i = 0; i < nlt; i++) { if (lang == nla[i].lang_id) { @@ -342,7 +341,7 @@ LanguageTable* CEXEBuild::GetLangTable(LANGID &lang) { break; } } - if (!table) { + if (!table && create) { LanguageTable newtable; newtable.lang_id = lang; @@ -355,9 +354,32 @@ LanguageTable* CEXEBuild::GetLangTable(LANGID &lang) { table = (LanguageTable*)lang_tables.get() + nlt; } + if (table) // update last used language if a table was loaded + last_used_lang = lang; + return table; } +char *CEXEBuild::GetLangNameAndCP(LANGID lang, unsigned int *codepage/*=NULL*/) { + LanguageTable *table = GetLangTable(lang, false); + + if (table && table->nlf.m_bLoaded) { + if (codepage) + *codepage = table->nlf.m_uCodePage; + + return table->nlf.m_szName; + } + else { + if (codepage) + *codepage = 1252; // English US + + if (lang == 1033) + return "English"; + else + return "???"; + } +} + int CEXEBuild::DefineLangString(char *name, int process/*=-1*/) { int index, uindex, pos, ret, sn; pos = build_langstrings.get(name, &sn, &index, &uindex); diff --git a/Source/script.cpp b/Source/script.cpp index b9ff199b..000a64cc 100644 --- a/Source/script.cpp +++ b/Source/script.cpp @@ -5611,39 +5611,42 @@ int CEXEBuild::doCommand(int which_token, LineParser &line) #ifdef NSIS_SUPPORT_VERSION_INFO case TOK_VI_ADDKEY: { - LANGID LangID=0; - int a = 1; - if (!strnicmp(line.gettoken_str(a),"/LANG=",6)) - LangID=atoi(line.gettoken_str(a++)+6); - if (line.getnumtokens()!=a+2) PRINTHELP(); - char *pKey = line.gettoken_str(a); - char *pValue = line.gettoken_str(a+1); - if ( !(*pKey) ) - { - ERROR_MSG("Error: empty name for version info key!\n"); - return PS_ERROR; - } - else - { - SCRIPT_MSG("%s: \"%s\" \"%s\"\n", line.gettoken_str(0), line.gettoken_str(a), line.gettoken_str(a+1)); - LANGID lReaded = LangID; - LanguageTable *table = GetLangTable(LangID); - if ( a > 1 && lReaded == 0 ) - warning_fl("%s: %s language not loaded, using default \"1033-English\"", line.gettoken_str(0), line.gettoken_str(1)); - if ( rVersionInfo.SetKeyValue(LangID, table->nlf.m_bLoaded ? table->nlf.m_uCodePage : 1252 /*English US*/, pKey, pValue) ) - { - ERROR_MSG("%s: \"%s\" \"%04d-%s\" already defined!\n",line.gettoken_str(0), line.gettoken_str(2), LangID, table->nlf.m_bLoaded ? table->nlf.m_szName : LangID == 1033 ? "English" : "???"); - return PS_ERROR; - } + LANGID LangID=0; + int a = 1; + if (!strnicmp(line.gettoken_str(a),"/LANG=",6)) + LangID=atoi(line.gettoken_str(a++)+6); + if (line.getnumtokens()!=a+2) PRINTHELP(); + char *pKey = line.gettoken_str(a); + char *pValue = line.gettoken_str(a+1); + if ( !(*pKey) ) + { + ERROR_MSG("Error: empty name for version info key!\n"); + return PS_ERROR; + } + else + { + SCRIPT_MSG("%s: \"%s\" \"%s\"\n", line.gettoken_str(0), line.gettoken_str(a), line.gettoken_str(a+1)); + LANGID lReaded = LangID; + if ( a > 1 && lReaded == 0 ) + warning_fl("%s: %s language not loaded, using default \"1033-English\"", line.gettoken_str(0), line.gettoken_str(1)); - return PS_OK; + unsigned int codepage; + char *lang_name = GetLangNameAndCP(LangID, &codepage); + + if ( rVersionInfo.SetKeyValue(LangID, codepage, pKey, pValue) ) + { + ERROR_MSG("%s: \"%s\" \"%04d-%s\" already defined!\n",line.gettoken_str(0), line.gettoken_str(2), LangID, lang_name); + return PS_ERROR; } + + return PS_OK; + } } case TOK_VI_SETPRODUCTVERSION: if ( version_product_v[0] ) { - ERROR_MSG("Error: %s already defined!\n", line.gettoken_str(0)); - return PS_ERROR; + ERROR_MSG("Error: %s already defined!\n", line.gettoken_str(0)); + return PS_ERROR; } strcpy(version_product_v, line.gettoken_str(1)); return PS_OK;