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
This commit is contained in:
kichik 2007-01-23 21:21:30 +00:00
parent e62f8b50aa
commit db0d67633b
4 changed files with 63 additions and 36 deletions

View file

@ -1602,14 +1602,15 @@ int CEXEBuild::AddVersionInfo()
{ {
LANGID lang_id = rVersionInfo.GetLangID(i); LANGID lang_id = rVersionInfo.GetLangID(i);
int code_page = rVersionInfo.GetCodePage(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") ) 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") ) 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") ) 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); rVersionInfo.ExportToStream(VerInfoStream, i);
res_editor->UpdateResource(RT_VERSION, 1, lang_id, (BYTE*)VerInfoStream.get(), VerInfoStream.getlen()); res_editor->UpdateResource(RT_VERSION, 1, lang_id, (BYTE*)VerInfoStream.get(), VerInfoStream.getlen());

View file

@ -247,7 +247,8 @@ class CEXEBuild {
// lang.cpp functions and variables // lang.cpp functions and variables
void InitLangTables(); 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 DefineLangString(char *name, int process=-1);
int DefineInnerLangString(int id, int process=-1); int DefineInnerLangString(int id, int process=-1);
int SetLangString(char *name, LANGID lang, char *string); int SetLangString(char *name, LANGID lang, char *string);

View file

@ -328,13 +328,12 @@ void CEXEBuild::InitLangTables() {
keep_ref = true; keep_ref = true;
} }
LanguageTable* CEXEBuild::GetLangTable(LANGID &lang) { LanguageTable* CEXEBuild::GetLangTable(LANGID &lang, bool create/*=true*/) {
int nlt = lang_tables.getlen() / sizeof(LanguageTable); int nlt = lang_tables.getlen() / sizeof(LanguageTable);
LanguageTable *nla = (LanguageTable*)lang_tables.get(); LanguageTable *nla = (LanguageTable*)lang_tables.get();
lang = lang ? lang : last_used_lang; lang = lang ? lang : last_used_lang;
last_used_lang = lang; LanguageTable *table = NULL;
LanguageTable *table = 0;
for (int i = 0; i < nlt; i++) { for (int i = 0; i < nlt; i++) {
if (lang == nla[i].lang_id) { if (lang == nla[i].lang_id) {
@ -342,7 +341,7 @@ LanguageTable* CEXEBuild::GetLangTable(LANGID &lang) {
break; break;
} }
} }
if (!table) { if (!table && create) {
LanguageTable newtable; LanguageTable newtable;
newtable.lang_id = lang; newtable.lang_id = lang;
@ -355,9 +354,32 @@ LanguageTable* CEXEBuild::GetLangTable(LANGID &lang) {
table = (LanguageTable*)lang_tables.get() + nlt; table = (LanguageTable*)lang_tables.get() + nlt;
} }
if (table) // update last used language if a table was loaded
last_used_lang = lang;
return table; 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 CEXEBuild::DefineLangString(char *name, int process/*=-1*/) {
int index, uindex, pos, ret, sn; int index, uindex, pos, ret, sn;
pos = build_langstrings.get(name, &sn, &index, &uindex); pos = build_langstrings.get(name, &sn, &index, &uindex);

View file

@ -5611,39 +5611,42 @@ int CEXEBuild::doCommand(int which_token, LineParser &line)
#ifdef NSIS_SUPPORT_VERSION_INFO #ifdef NSIS_SUPPORT_VERSION_INFO
case TOK_VI_ADDKEY: case TOK_VI_ADDKEY:
{ {
LANGID LangID=0; LANGID LangID=0;
int a = 1; int a = 1;
if (!strnicmp(line.gettoken_str(a),"/LANG=",6)) if (!strnicmp(line.gettoken_str(a),"/LANG=",6))
LangID=atoi(line.gettoken_str(a++)+6); LangID=atoi(line.gettoken_str(a++)+6);
if (line.getnumtokens()!=a+2) PRINTHELP(); if (line.getnumtokens()!=a+2) PRINTHELP();
char *pKey = line.gettoken_str(a); char *pKey = line.gettoken_str(a);
char *pValue = line.gettoken_str(a+1); char *pValue = line.gettoken_str(a+1);
if ( !(*pKey) ) if ( !(*pKey) )
{ {
ERROR_MSG("Error: empty name for version info key!\n"); ERROR_MSG("Error: empty name for version info key!\n");
return PS_ERROR; return PS_ERROR;
} }
else else
{ {
SCRIPT_MSG("%s: \"%s\" \"%s\"\n", line.gettoken_str(0), line.gettoken_str(a), line.gettoken_str(a+1)); SCRIPT_MSG("%s: \"%s\" \"%s\"\n", line.gettoken_str(0), line.gettoken_str(a), line.gettoken_str(a+1));
LANGID lReaded = LangID; LANGID lReaded = LangID;
LanguageTable *table = GetLangTable(LangID); if ( a > 1 && lReaded == 0 )
if ( a > 1 && lReaded == 0 ) warning_fl("%s: %s language not loaded, using default \"1033-English\"", line.gettoken_str(0), line.gettoken_str(1));
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;
}
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: case TOK_VI_SETPRODUCTVERSION:
if ( version_product_v[0] ) if ( version_product_v[0] )
{ {
ERROR_MSG("Error: %s already defined!\n", line.gettoken_str(0)); ERROR_MSG("Error: %s already defined!\n", line.gettoken_str(0));
return PS_ERROR; return PS_ERROR;
} }
strcpy(version_product_v, line.gettoken_str(1)); strcpy(version_product_v, line.gettoken_str(1));
return PS_OK; return PS_OK;