--- ../../../2.0.2-pristine/build/OOO_2_0_2/scp2/source/ooo/file_library_ooo.scp 2006-06-02 13:06:38.003914500 +0000 +++ scp2/source/ooo/file_library_ooo.scp 2006-05-31 16:15:01.893875000 +0000 @@ -2414,3 +2425,13 @@ End +#ifdef WNT + +File gid_File_Lib_sellangmsi + TXT_FILE_BODY; + Styles = (PACKED, BINARYTABLE, BINARYTABLE_ONLY); + Dir = gid_Dir_Program; + Name = "sellangmsi.dll"; +End + +#endif --- ../../../2.0.2-pristine/build/OOO_2_0_2/scp2/source/ooo/windowscustomaction_ooo.scp 2006-02-16 14:16:57.000000000 +0000 +++ scp2/source/ooo/windowscustomaction_ooo.scp 2006-06-02 08:03:48.643875000 +0000 @@ -316,3 +316,13 @@ Assignment1 = ("InstallExecuteSequence", "Not REMOVE=\"ALL\" And Not PATCH", "CostInitialize"); Assignment2 = ("InstallUISequence", "Not REMOVE=\"ALL\" And Not PATCH", "CostInitialize"); End + +WindowsCustomAction gid_Customaction_SelectLanguage + Name = "SelectLanguage"; + Typ = "321"; + Source = "sellangmsi.dll"; + Target = "SelectLanguage"; + Inbinarytable = 1; + Assignment1 = ("InstallExecuteSequence", "Not REMOVE=\"ALL\" And Not PATCH", "behind_CostFinalize"); + Assignment2 = ("InstallUISequence", "Not REMOVE=\"ALL\" And Not PATCH", "behind_CostFinalize"); +End --- ../../../2.0.2-pristine/build/OOO_2_0_2/setup_native/prj/build.lst 2006-02-16 14:15:43.000000000 +0000 +++ setup_native/prj/build.lst 2006-05-31 12:16:31.550125000 +0000 @@ -5,6 +5,7 @@ pk setup_native\source\win32\customactions\regactivex nmake - w sn_regactivex NULL pk setup_native\source\win32\customactions\reg4msdoc nmake - w sn_reg4msdoc NULL pk setup_native\source\win32\customactions\regpython nmake - w sn_regpython NULL +pk setup_native\source\win32\customactions\sellang nmake - w sn_sellang NULL pk setup_native\source\win32\customactions\javafilter nmake - w sn_javafilter NULL pk setup_native\source\win32\customactions\quickstarter nmake - w sn_quickstarter NULL pk setup_native\source\win32\customactions\shellextensions nmake - w sn_shellextensions NULL --- /dev/null +++ setup_native/source/win32/customactions/sellang/exports.dxp 2006-05-31 12:15:54.268875000 +0000 @@ -0,0 +1 @@ +SelectLanguage --- /dev/null +++ setup_native/source/win32/customactions/sellang/makefile.mk 2006-05-31 12:13:28.331375000 +0000 @@ -0,0 +1,86 @@ +#************************************************************************* +# +# OpenOffice.org - a multi-platform office productivity suite +# +# $RCSfile: win32-multi-lang-installer.diff,v $ +# +# $Revision: 1.1 $ +# +# last change: $Author: tml $ $Date: 2006/06/02 20:29:58 $ +# +# The Contents of this file are made available subject to +# the terms of GNU Lesser General Public License Version 2.1. +# +# +# GNU Lesser General Public License Version 2.1 +# ============================================= +# Copyright 2005 by Sun Microsystems, Inc. +# 901 San Antonio Road, Palo Alto, CA 94303, USA +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License version 2.1, as published by the Free Software Foundation. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, +# MA 02111-1307 USA +# +#************************************************************************* + +PRJ=..$/..$/..$/.. +PRJNAME=setup_native +TARGET=sellangmsi + +.IF "$(GUI)"=="WNT" + +# --- Settings ----------------------------------------------------- + +ENABLE_EXCEPTIONS=TRUE +NO_DEFAULT_STL=TRUE +DYNAMIC_CRT= +USE_DEFFILE=TRUE + +.INCLUDE : settings.mk + +CFLAGS+=-D_STLP_USE_STATIC_LIB + +# --- Files -------------------------------------------------------- + +UWINAPILIB= + +SLOFILES = \ + $(SLO)$/sellang.obj + +SHL1STDLIBS= kernel32.lib\ + user32.lib\ + advapi32.lib\ + shell32.lib\ + msi.lib\ + $(LIBSTLPORTST) + +SHL1LIBS = $(SLB)$/$(TARGET).lib + +SHL1TARGET = $(TARGET) +SHL1IMPLIB = i$(TARGET) + +SHL1DEF = $(MISC)$/$(SHL1TARGET).def +SHL1DEPN = $(SLB)$/$(TARGET).lib +SHL1BASE = 0x1c000000 +DEF1NAME=$(SHL1TARGET) +DEF1EXPORTFILE=exports.dxp + +# --- Targets -------------------------------------------------------------- + +.INCLUDE : target.mk + +# ------------------------------------------------------------------------- + + +.ENDIF + --- /dev/null +++ setup_native/source/win32/customactions/sellang/sellang.cxx 2006-06-02 09:13:53.893875000 +0000 @@ -0,0 +1,255 @@ +/************************************************************************* + * + * OpenOffice.org - a multi-platform office productivity suite + * + * $RCSfile: win32-multi-lang-installer.diff,v $ + * + * $Revision: 1.1 $ + * + * last change: $Author: tml $ $Date: 2006/06/02 20:29:58 $ + * + * The Contents of this file are made available subject to + * the terms of GNU Lesser General Public License Version 2.1. + * + * + * GNU Lesser General Public License Version 2.1 + * ============================================= + * Copyright 2005 by Sun Microsystems, Inc. + * 901 San Antonio Road, Palo Alto, CA 94303, USA + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License version 2.1, as published by the Free Software Foundation. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, + * MA 02111-1307 USA + * + ************************************************************************/ + +#define WIN32_LEAN_AND_MEAN +#define _WIN32_WINNT 0x0500 +#define WINVER 0x0500 + +#include +#include +#include + +#ifdef UNICODE +#define _UNICODE +#define _tstring wstring +#else +#define _tstring string +#endif +#include +#include +#include + +#include + +extern "C" UINT __stdcall SelectLanguage( MSIHANDLE handle ) +{ + char tem[200], feature[100]; + MSIHANDLE database, view, record; + DWORD length; + int nlangs = 0; + /* Keeping this code simple and stupid... won't bother with any + * dynamic arrays or whatnot. 100 is more than enough for this purpose. + */ + char langs[100][6]; + + database = MsiGetActiveDatabase(handle); + + if (MsiDatabaseOpenViewA(database, "SELECT Feature from Feature", &view) != ERROR_SUCCESS) { + MsiCloseHandle(database); + return ERROR_SUCCESS; + } + + // MessageBoxA(NULL, "MsiDatabaseOpenViewA success!", "SelectLanguage", MB_OK); + + if (MsiViewExecute(view, NULL) != ERROR_SUCCESS) { + MsiCloseHandle(view); + MsiCloseHandle(database); + return ERROR_SUCCESS; + } + + // MessageBoxA(NULL, "MsiViewExecute success!", "SelectLanguage", MB_OK); + + while (MsiViewFetch(view, &record) == ERROR_SUCCESS) { + length = sizeof(feature); + if (MsiRecordGetStringA(record, 1, feature, &length) != ERROR_SUCCESS) { + MsiCloseHandle(record); + MsiCloseHandle(view); + MsiCloseHandle(database); + return ERROR_SUCCESS; + } + + /* Keep track of what languages are included in this installer, if + * it is a multilangiage one. + */ + if (strncmp (feature, "gm_Dynamic_Language_", strlen ("gm_Dynamic_Language_")) == 0 && + strcmp(feature, "gm_Dynamic_Language_TOP") != 0 && + strcmp(feature, "gm_Dynamic_Language_en-US") != 0 && + strlen(feature) <= strlen("gm_Dynamic_Language_xx-XX")) + strcpy(langs[nlangs++], feature + strlen("gm_Dynamic_Language_")); + + MsiCloseHandle(record); + } + + MsiCloseHandle(view); + + if (nlangs > 0) { + /* Deselect those languages that don't match the system + * default UI language. + */ + + int i; + LANGID default_language = GetSystemDefaultUILanguage(); + const char *s; + int have_default_lang = 0; + + /* Map from LANGID to string. Same order as in + * setup_native/source/win32/msi-encodinglist.txt. + */ + switch (default_language) { +#define CASE(primary, sub, name) \ + case MAKELANGID(LANG_##primary, SUBLANG_##sub): s = #name; break + + CASE(ENGLISH, DEFAULT, en-US); + case MAKELANGID(LANG_SERBIAN, 0x05): s = "bs"; break; + CASE(PORTUGUESE, PORTUGUESE, pt); + CASE(RUSSIAN, DEFAULT, ru); + CASE(GREEK, DEFAULT, el); + CASE(DUTCH, DEFAULT, nl); + CASE(FRENCH, DEFAULT, fr); + CASE(FRENCH, FRENCH_CANADIAN, fr-CA); + CASE(SPANISH, DEFAULT, es); + CASE(FINNISH, DEFAULT, fi); + CASE(HUNGARIAN, DEFAULT, hu); + CASE(CATALAN, DEFAULT, ca); + CASE(ITALIAN, DEFAULT, it); + CASE(CZECH, DEFAULT, cs); + CASE(SLOVAK, DEFAULT, sk); + CASE(ENGLISH, ENGLISH_UK, en-GB); + CASE(ENGLISH, ENGLISH_SOUTH_AFRICA, en-ZA); + CASE(DANISH, DEFAULT, da); + CASE(SWEDISH, DEFAULT, sv); + CASE(NORWEGIAN, NORWEGIAN_BOKMAL, nb); + CASE(NORWEGIAN, NORWEGIAN_NYNORSK, nn); + CASE(POLISH, DEFAULT, pl); + CASE(GERMAN, DEFAULT, de); + CASE(PORTUGUESE, PORTUGUESE_BRAZILIAN, pt-BR); + CASE(THAI, DEFAULT, th); + CASE(ESTONIAN, DEFAULT, et); + CASE(JAPANESE, DEFAULT, ja); + CASE(KOREAN, DEFAULT, ko); + // CASE(KHMER, DEFAULT, km); + // CASE(WELSH, DEFAULT, cy); + CASE(CHINESE, CHINESE_SIMPLIFIED, zh-CN); + CASE(CHINESE, CHINESE_TRADITIONAL, zh-TW); + CASE(TURKISH, DEFAULT, tr); + CASE(HINDI, DEFAULT, hi-IN); + CASE(PUNJABI, DEFAULT, pa-IN); + CASE(TAMIL, DEFAULT, ta-IN); + CASE(ARABIC, DEFAULT, ar); + CASE(HEBREW, DEFAULT, he); + CASE(AFRIKAANS, DEFAULT, af); + CASE(ALBANIAN, DEFAULT, sq); + CASE(ARMENIAN, DEFAULT, hy); + CASE(BASQUE, DEFAULT, eu); + CASE(BELARUSIAN, DEFAULT, be-BY); + case MAKELANGID(LANG_BENGALI, 0x02): s = "bn-BD"; break; + CASE(BENGALI, DEFAULT, bn-IN); + CASE(BULGARIAN, DEFAULT, bg); + CASE(ICELANDIC, DEFAULT, is); + CASE(INDONESIAN, DEFAULT, id); + // CASE(LAO, DEFAULT, lo); + CASE(LATVIAN, DEFAULT, lv); + CASE(LITHUANIAN, DEFAULT, lt); + // CASE(MALTESE, DEFAULT, mt); + CASE(MARATHI, DEFAULT, mr); + // CASE(ROMANSH, DEFAULT, rm); + CASE(ROMANIAN, DEFAULT, ro); + // CASE(KINYARWANDA, DEFAULT, rw); + CASE(SANSKRIT, DEFAULT, sa); + // CASE(SERBIAN, SERBIAN_CYRILLIC, sr-SP); + // CASE(SETSWANA, DEFAULT, tn); + CASE(SERBIAN, DEFAULT, hr); + CASE(FARSI, DEFAULT, fa); + CASE(FAEROESE, DEFAULT, fo); + CASE(SLOVENIAN, DEFAULT, sl); + // CASE(SORBIAN, DEFAULT, sb); + // CASE(SUTU, DEFAULT, st); + CASE(SWAHILI, DEFAULT, sw-TZ); // MSFT says Kenya, but OOo has Tanzania + CASE(TATAR, DEFAULT, tt); + // CASE(TSONGA, DEFAULT, ts); + CASE(UKRAINIAN, DEFAULT, uk); + CASE(URDU, DEFAULT, ur); + CASE(VIETNAMESE, DEFAULT, vi); + // CASE(XHOSA, DEFAULT, xh); + // CASE(SOTHO, DEFAULT, ns); + // CASE(YIDDISH, DEFAULT, yi); + // CASE(ZULU, DEFAULT, zu); + CASE(GUJARATI, DEFAULT, gu-IN); + // CASE(BRETON, DEFAULT, br); + CASE(ORIYA, DEFAULT, or); + CASE(NEPALI, DEFAULT, ne); + CASE(SERBIAN, SERBIAN_LATIN, sh-YU); + CASE(SERBIAN, SERBIAN_CYRILLIC, sr-CS); + // CASE(NDEBELE, DEFAULT, nr); + // CASE(SWAZI, DEFAULT, ss); + // CASE(SOTHO, SOTHO_SOUTHERN, st); + // CASE(VENDA, DEFAULT, ve); + // CASE(IRISH, DEFAULT, ga); + CASE(MACEDONIAN, DEFAULT, mk); + CASE(GALICIAN, DEFAULT, gl); + CASE(KANNADA, DEFAULT, kn); + CASE(MALAY, DEFAULT, ms); +#undef CASE + default: s = ""; + } + + // sprintf(tem, "GetSystemDefaultUILanguage(): %#x = %s", default_language, s); + // MessageBoxA(NULL, tem, "SelectLanguage", MB_OK); + + /* If one of the alternative languages in a multi-language installer + * is the system default UI language, deselect the other languages. + */ + if (s[0]) { + for (i = 0; i < nlangs; i++) { + if (strcmp (s, langs[i]) == 0) { + // sprintf(tem, "We have the default language %s in the installer", s); + // MessageBoxA(NULL, tem, "SelectLanguage", MB_OK); + have_default_lang = 1; + } + } + } + + if (have_default_lang) { + for (i = 0; i < nlangs; i++) { + if (strcmp(s, langs[i]) != 0) { + UINT rc; + sprintf(feature, "gm_Dynamic_Language_%s", langs[i]); + rc = MsiSetFeatureStateA(handle, feature, INSTALLSTATE_ABSENT); + if (rc != ERROR_SUCCESS) { + // sprintf(tem, "MsiSetFeatureStateA %s failed: %d", feature, rc); + // MessageBoxA(NULL, tem, "SelectLanguage", MB_OK); + } else { + // sprintf(tem, "MsiSetFeatureStateA %s OK!", feature); + // MessageBoxA(NULL, tem, "SelectLanguage", MB_OK); + } + } + } + } + } + + MsiCloseHandle(database); + + return ERROR_SUCCESS; +}