RFE: need -region option to switch Region at start up
r=ccarlen, nhotta, sr=blizzard
This commit is contained in:
katakai%japan.sun.com 2001-06-27 07:38:53 +00:00
Родитель a672a450a0
Коммит 2b503479d5
5 изменённых файлов: 227 добавлений и 98 удалений

Просмотреть файл

@ -79,12 +79,18 @@ interface nsIProfileInternal : nsIProfile {
in wstring regOption);
[noscript] string isRegStringSet(in wstring profileName);
void createNewProfileWithLocales(in wstring profileName,
in wstring nativeProfileDir,
in wstring UILocale,
in wstring contentLocale,
in boolean useExistingDir);
/**
* The remaining methods are deprecated. DO NOT USE THEM.
*/
boolean isCurrentProfileAvailable();
[noscript] void getCurrentProfileDir(out nsIFile profileDir);
};
#endif /* nsIProfileInternal_h__ */

Просмотреть файл

@ -80,25 +80,6 @@ function onCancel()
}
}
function selectLocale(langcode)
{
try {
var chromeRegistry = Components.classes["@mozilla.org/chrome/chrome-registry;1"].getService();
if ( chromeRegistry ) {
chromeRegistry = chromeRegistry.QueryInterface( Components.interfaces.nsIChromeRegistry );
}
//var old_lang = chromeRegistry.getSelectedLocale("navigator");
//dump("\n --> createPrifleWizard.j sold_lang=" + old_lang + "--\n");
chromeRegistry.selectLocale(langcode, true);
dump("\n --> createPrifleWizard.js langcode=" + langcode + "--\n");
}
catch(e) {
dump("\n--> createPrifleWizard.js: selectLocale() failed!\n");
return false;
}
return true;
}
function onFinish()
{
@ -118,12 +99,6 @@ function onFinish()
proceed = processCreateProfileData(profName, profDir, profLang, profRegion);
if( proceed ) {
//select locale region
if (profRegion) {
selectLocale(profRegion);
}
if( window.opener ) {
window.opener.CreateProfile(profName, profDir);
}
@ -191,7 +166,7 @@ function processCreateProfileData( aProfName, aProfDir, langcode, regioncode)
useExistingDir = true;
dump("*** going to create a new profile called " + aProfName + " in folder: " + aProfDir + "\n");
profile.createNewProfile(aProfName, aProfDir, langcode, useExistingDir);
profile.createNewProfileWithLocales(aProfName, aProfDir, langcode, regioncode, useExistingDir);
return true;
}

Просмотреть файл

@ -102,7 +102,8 @@
#define INSTALLER_CMD_LINE_ARG "-installer"
#define CREATE_PROFILE_CMD_LINE_ARG "-CreateProfile"
#define PROFILE_CMD_LINE_ARG "-P"
#define LANG_CMD_LINE_ARG "-lang"
#define UILOCALE_CMD_LINE_ARG "-UILocale"
#define CONTENTLOCALE_CMD_LINE_ARG "-contentLocale"
#define PREF_CONFIRM_AUTOMIGRATION "profile.confirm_automigration"
#define SHRIMP_PREF "shrimp.startup.enable"
@ -127,6 +128,7 @@ const char* kDefaultOpenWindowParams = "centerscreen,chrome,modal,titlebar";
#define DEBUG_profile_verbose 1
#endif
// ProfileAccess varaible (gProfileDataAccess) to access registry operations
// gDataAccessInstCount is used to keep track of instance count to activate
// destructor at the right time (count == 0)
@ -134,8 +136,8 @@ static nsProfileAccess* gProfileDataAccess = nsnull;
static PRInt32 gInstanceCount = 0;
// Profile database to remember which profile has been
// created with UI lang on profileManager
static nsHashtable *gLangProfiles = nsnull;
// created with UILocale and contentLocale on profileManager
static nsHashtable *gLocaleProfiles = nsnull;
// Atoms for file locations
static nsIAtom* sApp_PrefsDirectory50 = nsnull;
@ -248,13 +250,14 @@ nsProfile::nsProfile()
mDiskSpaceErrorQuitCalled = PR_FALSE;
mCurrentProfileAvailable = PR_FALSE;
mIsLangSpecified = PR_FALSE;
mIsUILocaleSpecified = PR_FALSE;
mIsContentLocaleSpecified = PR_FALSE;
if (gInstanceCount++ == 0) {
gProfileDataAccess = new nsProfileAccess();
gLangProfiles = new nsHashtable();
gLocaleProfiles = new nsHashtable();
// Make our directory atoms
@ -303,7 +306,7 @@ nsProfile::~nsProfile()
delete gProfileDataAccess;
delete gLangProfiles;
delete gLocaleProfiles;
NS_IF_RELEASE(sApp_PrefsDirectory50);
NS_IF_RELEASE(sApp_PreferencesFile50);
@ -383,11 +386,13 @@ nsProfile::StartupWithArgs(nsICmdLineService *cmdLineArgs, PRBool canInteract)
if (NS_FAILED(rv)) return rv;
}
// check UI language is specified on profileManager, otherwise,
// when -lang option is specified, install the ui language
// check UILocale is specified on profileManager, otherwise,
// when -UILocale option is specified, install the UILocale
// -lang is not specified
if (mIsLangSpecified == PR_FALSE) return NS_OK;
// -UILocale or -contentLocale is not specified
if (mIsUILocaleSpecified == PR_FALSE && mIsContentLocaleSpecified == PR_FALSE) {
return NS_OK;
}
nsCOMPtr<nsIFile> profileDir;
@ -398,29 +403,52 @@ nsProfile::StartupWithArgs(nsICmdLineService *cmdLineArgs, PRBool canInteract)
rv = profileDir->GetPath(getter_Copies(pathBuf));
if (NS_FAILED(rv)) return rv;
// -lang has been specified, but
// user has selected UI language and region for this profile
// -UILocale or -contentLocale has been specified, but
// user has selected UILocale and contentLocale for this profile
// on profileManager
// We should use the language
// We should not set here
nsCStringKey key((const char *)pathBuf);
if ((int)gLangProfiles->Get(&key) == PR_TRUE) {
if ((int)gLocaleProfiles->Get(&key) == PR_TRUE) {
#ifdef DEBUG_profile_verbose
printf(" already set UILocale and contentLocale: %s\n", NS_STATIC_CAST(const char*, pathBuf));
printf(" will not install locale\n");
#endif
return NS_OK;
}
gLangProfiles->Remove(&key);
gLocaleProfiles->Remove(&key);
// Install UI language to the profile
const PRUnichar* langcode = mLangName.GetUnicode() ;
if (langcode && nsCRT::strlen(langcode) != 0) {
nsCOMPtr<nsIChromeRegistry> chromeRegistry = do_GetService(kChromeRegistryCID,
&rv);
if (NS_SUCCEEDED(rv)) {
nsFileSpec fileSpec((const char *)pathBuf);
nsFileURL fileURL(fileSpec);
const char* fileStr = fileURL.GetURLString();
rv = chromeRegistry->SelectLocaleForProfile(langcode,
NS_ConvertUTF8toUCS2(fileStr).get());
if (NS_FAILED(rv)) return rv;
}
nsCOMPtr<nsIChromeRegistry> chromeRegistry = do_GetService(kChromeRegistryCID, &rv);
if (NS_FAILED(rv)) return rv;
// Install to the profile
nsFileSpec fileSpec((const char *)pathBuf);
nsFileURL fileURL(fileSpec);
const char* fileStr = fileURL.GetURLString();
// NEED TO FIX: when current UILocale and contentLocale are same with specified locales,
// we shouldn't install them again here. But chromeRegistry->GetSelectedLocale() doesn't
// work here properly. It always returns global and global-region of default not current
// profile
const PRUnichar* uilocale = mUILocaleName.GetUnicode() ;
if (uilocale && uilocale[0]) {
#ifdef DEBUG_profile_verbose
nsCAutoString temp1; temp1.AssignWithConversion(uilocale);
printf(" install new UILocaleName: %s\n", NS_STATIC_CAST(const char*, temp1));
#endif
rv = chromeRegistry->SelectLocaleForProfile(uilocale,
NS_ConvertUTF8toUCS2(fileStr).get());
if (NS_FAILED(rv)) return rv;
}
const PRUnichar* contentlocale = mContentLocaleName.GetUnicode() ;
if (contentlocale && contentlocale[0]) {
#ifdef DEBUG_profile_verbose
nsCAutoString temp2; temp2.AssignWithConversion(contentlocale);
printf(" install new mContentLocaleName: %s\n", NS_STATIC_CAST(const char*, temp2));
#endif
rv = chromeRegistry->SelectLocaleForProfile(contentlocale,
NS_ConvertUTF8toUCS2(fileStr).get());
if (NS_FAILED(rv)) return rv;
}
#ifdef DEBUG_profile_verbose
@ -620,23 +648,23 @@ nsProfile::ProcessArgs(nsICmdLineService *cmdLineArgs,
#endif
// check for command line arguments for profile manager
// -lang command
rv = cmdLineArgs->GetCmdLineValue(LANG_CMD_LINE_ARG, getter_Copies(cmdResult));
// -UILocale command
rv = cmdLineArgs->GetCmdLineValue(UILOCALE_CMD_LINE_ARG, getter_Copies(cmdResult));
if (NS_SUCCEEDED(rv))
{
if (cmdResult) {
mIsLangSpecified = PR_TRUE;
mLangName.AssignWithConversion(cmdResult);
mIsUILocaleSpecified = PR_TRUE;
mUILocaleName.AssignWithConversion(cmdResult);
}
}
// update global locale if possible
// (in case when user-*.rdf can be updated)
// profilemanager will be invoked in the UI language
nsresult rv = NS_OK;
nsCOMPtr<nsIChromeRegistry> chromeRegistry =
do_GetService(kChromeRegistryCID, &rv);
if (NS_SUCCEEDED(rv)) {
rv = chromeRegistry->SelectLocale(mLangName.GetUnicode(), PR_FALSE);
}
// -contentLocale command
rv = cmdLineArgs->GetCmdLineValue(CONTENTLOCALE_CMD_LINE_ARG, getter_Copies(cmdResult));
if (NS_SUCCEEDED(rv))
{
if (cmdResult) {
mIsContentLocaleSpecified = PR_TRUE;
mContentLocaleName.AssignWithConversion(cmdResult);
}
}
@ -1278,12 +1306,12 @@ nsresult nsProfile::SetProfileDir(const PRUnichar *profileName, nsIFile *profile
return rv;
}
// Creates a new profile
// Creates a new profile with UILocale and contentLocale
NS_IMETHODIMP
nsProfile::CreateNewProfile(const PRUnichar* profileName,
nsProfile::CreateNewProfileWithLocales(const PRUnichar* profileName,
const PRUnichar* nativeProfileDir,
const PRUnichar* langcode,
const PRUnichar* aUILocale,
const PRUnichar* aContentLocale,
PRBool useExistingDir)
{
NS_ENSURE_ARG_POINTER(profileName);
@ -1292,7 +1320,7 @@ nsProfile::CreateNewProfile(const PRUnichar* profileName,
#if defined(DEBUG_profile)
{
printf("ProfileManager : CreateNewProfile\n");
printf("ProfileManager : CreateNewProfileWithLocales\n");
nsCAutoString temp1; temp1.AssignWithConversion(profileName);
printf("Profile Name: %s\n", NS_STATIC_CAST(const char*, temp1));
@ -1370,34 +1398,97 @@ nsProfile::CreateNewProfile(const PRUnichar* profileName,
rv = NS_GetSpecialDirectory(NS_APP_PROFILE_DEFAULTS_NLOC_50_DIR, getter_AddRefs(profDefaultsDir));
if (NS_FAILED(rv)) return rv;
if (langcode && nsCRT::strlen(langcode) != 0) {
// caller prefers locale subdir
nsCOMPtr<nsIFile> locProfDefaultsDir;
rv = profDefaultsDir->Clone(getter_AddRefs(locProfDefaultsDir));
if (NS_FAILED(rv)) return rv;
locProfDefaultsDir->AppendUnicode(langcode);
rv = locProfDefaultsDir->Exists(&exists);
if (NS_SUCCEEDED(rv) && exists) {
profDefaultsDir = locProfDefaultsDir; // transfers ownership
nsCOMPtr<nsIChromeRegistry> chromeRegistry = do_GetService(kChromeRegistryCID, &rv);
if (NS_SUCCEEDED(rv)) {
const PRUnichar* uiLocale = aUILocale;
const PRUnichar* contentLocale = aContentLocale;
nsXPIDLString currentUILocaleName;
nsXPIDLString currentContentLocaleName;
// When aUILocale == null or aContentLocale == null, set those from default values
// which are from default or from command line options
// This fallback is for CreateNewProfile() of CreateDefaultProfile() and ProcessArgs()
// Those functions call CreateNewProfile(locale=null). We should consider default values
// or specified values of locales for CreateDefaultProfile() and ProcessArgs().
// We can get preferred UILocale and contentLocale (specified -UILocale and -contentLocale)
// by GetSelectedLocale() which is done in nsAppRunner.cpp::InstallGlobalLocale()
if (!aUILocale || !aUILocale[0]) {
rv = chromeRegistry->GetSelectedLocale(NS_LITERAL_STRING("global").get(),
getter_Copies(currentUILocaleName));
if (NS_SUCCEEDED(rv)) {
uiLocale = currentUILocaleName.get();
}
}
nsCOMPtr<nsIChromeRegistry> chromeRegistry = do_GetService(kChromeRegistryCID, &rv);
if (NS_SUCCEEDED(rv)) {
nsXPIDLCString pathBuf;
rv = profileDir->GetPath(getter_Copies(pathBuf));
NS_ENSURE_SUCCESS(rv, rv);
nsFileSpec fileSpec((const char *)pathBuf);
nsFileURL fileURL(fileSpec);
const char* fileStr = fileURL.GetURLString();
rv = chromeRegistry->SelectLocaleForProfile(langcode,
if (!aContentLocale || !aContentLocale[0]) {
rv = chromeRegistry->GetSelectedLocale(NS_LITERAL_STRING("global-region").get(),
getter_Copies(currentContentLocaleName));
if (NS_SUCCEEDED(rv)) {
contentLocale = currentContentLocaleName.get();
}
}
#if defined(DEBUG_profile_verbose)
nsCAutoString temp1; temp1.AssignWithConversion(uiLocale);
printf(" uiLocale=%s\n", NS_STATIC_CAST(const char*, temp1));
nsCAutoString temp2; temp2.AssignWithConversion(contentLocale);
printf(" contentLocale=%s\n", NS_STATIC_CAST(const char*, temp2));
#endif
nsXPIDLCString pathBuf;
rv = profileDir->GetPath(getter_Copies(pathBuf));
NS_ENSURE_SUCCESS(rv, rv);
nsFileSpec fileSpec((const char *)pathBuf);
nsFileURL fileURL(fileSpec);
const char* fileStr = fileURL.GetURLString();
if (uiLocale && uiLocale[0]) {
rv = chromeRegistry->SelectLocaleForProfile(uiLocale,
NS_ConvertUTF8toUCS2(fileStr).get());
// Remeber which profile has been created with UI language
// Remember which profile has been created with the UILocale
// didn't use gProfileDataAccess because just needed one time
nsCStringKey key((const char *)pathBuf);
gLangProfiles->Put(&key, (void*)PR_TRUE);
if (NS_SUCCEEDED(rv)) {
nsCStringKey key((const char *)pathBuf);
gLocaleProfiles->Put(&key, (void*)PR_TRUE);
}
}
if (contentLocale && contentLocale[0]) {
// caller prefers locale subdir
nsCOMPtr<nsIFile> locProfDefaultsDir;
rv = profDefaultsDir->Clone(getter_AddRefs(locProfDefaultsDir));
if (NS_FAILED(rv)) return rv;
locProfDefaultsDir->AppendUnicode(contentLocale);
rv = locProfDefaultsDir->Exists(&exists);
if (NS_SUCCEEDED(rv) && exists) {
profDefaultsDir = locProfDefaultsDir; // transfers ownership
#if defined(DEBUG_profile_verbose)
nsXPIDLString profilePath;
rv = profDefaultsDir->GetUnicodePath(getter_Copies(profilePath));
if (NS_SUCCEEDED(rv)) {
nsCAutoString temp5; temp5.AssignWithConversion(profilePath);
printf(" profDefaultsDir is set to: %s\n", NS_STATIC_CAST(const char*, temp5));
}
#endif
}
rv = chromeRegistry->SelectLocaleForProfile(contentLocale,
NS_ConvertUTF8toUCS2(fileStr).get());
// Remember which profile has been created with the UILocale
// didn't use gProfileDataAccess because just needed one time
if (NS_SUCCEEDED(rv)) {
nsCStringKey key((const char *)pathBuf);
gLocaleProfiles->Put(&key, (void*)PR_TRUE);
}
}
}
// Copy contents from defaults folder.
rv = profDefaultsDir->Exists(&exists);
if (NS_SUCCEEDED(rv) && exists && (!useExistingDir))
@ -1412,6 +1503,20 @@ nsProfile::CreateNewProfile(const PRUnichar* profileName,
}
// Rename a old profile to new profile.
// Copies all the keys from old profile to new profile.
// Creates a new profile
NS_IMETHODIMP
nsProfile::CreateNewProfile(const PRUnichar* profileName,
const PRUnichar* nativeProfileDir,
const PRUnichar* langcode,
PRBool useExistingDir)
{
return CreateNewProfileWithLocales(profileName,nativeProfileDir,langcode,nsnull,useExistingDir);
}
// Rename a old profile to new profile.
// Copies all the keys from old profile to new profile.
// Deletes the old profile from the registry

Просмотреть файл

@ -75,8 +75,11 @@ private:
PRBool mCurrentProfileAvailable;
PRBool mIsLangSpecified;
nsAutoString mLangName;
PRBool mIsUILocaleSpecified;
nsAutoString mUILocaleName;
PRBool mIsContentLocaleSpecified;
nsAutoString mContentLocaleName;
public:
nsProfile();

Просмотреть файл

@ -92,6 +92,10 @@
static NS_DEFINE_CID(kWindowMediatorCID, NS_WINDOWMEDIATOR_CID);
static NS_DEFINE_CID(kIProcessCID, NS_PROCESS_CID);
static NS_DEFINE_CID(kChromeRegistryCID, NS_CHROMEREGISTRY_CID);
#define UILOCALE_CMD_LINE_ARG "-UILocale"
#define CONTENTLOCALE_CMD_LINE_ARG "-contentLocale"
extern "C" void ShowOSAlert(char* aMessage);
@ -132,6 +136,9 @@ static struct MacInitializer { MacInitializer() { InitializeMacToolbox(); } } gI
// Initialize profile services for both standalone and regular profiles
static nsresult InitializeProfileService(nsICmdLineService *cmdLineArgs);
// Install global locale if possible
static nsresult InstallGlobalLocale(nsICmdLineService *cmdLineArgs);
class stTSMCloser
{
public:
@ -769,6 +776,35 @@ static nsresult Ensure1Window( nsICmdLineService* cmdLineArgs)
return rv;
}
// update global locale if possible (in case when user-*.rdf can be updated)
// so that any apps after this can be invoked in the UILocale and contentLocale
static nsresult InstallGlobalLocale(nsICmdLineService *cmdLineArgs)
{
nsresult rv = NS_OK;
nsCOMPtr<nsIChromeRegistry> chromeRegistry = do_GetService(kChromeRegistryCID, &rv);
if (NS_SUCCEEDED(rv)) {
nsXPIDLCString cmdUI;
rv = cmdLineArgs->GetCmdLineValue(UILOCALE_CMD_LINE_ARG, getter_Copies(cmdUI));
if (NS_SUCCEEDED(rv)){
if (cmdUI) {
nsAutoString UILocaleName;
UILocaleName.AssignWithConversion(cmdUI);
rv = chromeRegistry->SelectLocale(UILocaleName.GetUnicode(), PR_FALSE);
}
}
nsXPIDLCString cmdContent;
rv = cmdLineArgs->GetCmdLineValue(CONTENTLOCALE_CMD_LINE_ARG, getter_Copies(cmdContent));
if (NS_SUCCEEDED(rv)){
if (cmdContent) {
nsAutoString ContentLocaleName;
ContentLocaleName.AssignWithConversion(cmdContent);
rv = chromeRegistry->SelectLocale(ContentLocaleName.GetUnicode(), PR_FALSE);
}
}
}
return NS_OK;
}
// Do the righe thing to provide locations depending on whether an
// application is standalone or not
static nsresult InitializeProfileService(nsICmdLineService *cmdLineArgs)
@ -1000,7 +1036,6 @@ static nsresult main1(int argc, char* argv[], nsISupports *nativeApp )
// _CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF | _CRTDBG_CHECK_ALWAYS_DF);
#endif
#ifndef XP_MAC
// Unbuffer debug output (necessary for automated QA performance scripts).
setbuf( stdout, 0 );
@ -1078,6 +1113,10 @@ static nsresult main1(int argc, char* argv[], nsISupports *nativeApp )
return rv;
}
rv = InstallGlobalLocale(cmdLineArgs);
if(NS_FAILED(rv))
return rv;
nsCOMPtr<nsIAppShellService> appShell(do_GetService(kAppShellServiceCID, &rv));
NS_ASSERTION(NS_SUCCEEDED(rv), "failed to get the appshell service");
@ -1220,7 +1259,8 @@ static void DumpHelp(char *appname)
printf("%s-ProfileWizard%sStart with profile wizard.\n",HELP_SPACER_1,HELP_SPACER_2);
printf("%s-ProfileManager%sStart with profile manager.\n",HELP_SPACER_1,HELP_SPACER_2);
printf("%s-SelectProfile%sStart with profile selection dialog.\n",HELP_SPACER_1,HELP_SPACER_2);
printf("%s-lang <lang-region>%sStart with <lang-region> resources.\n",HELP_SPACER_1,HELP_SPACER_2);
printf("%s-UILocale <locale>%sStart with <locale> resources as UI Locale.\n",HELP_SPACER_1,HELP_SPACER_2);
printf("%s-contentLocale <locale>%sStart with <locale> resources as content Locale.\n",HELP_SPACER_1,HELP_SPACER_2);
#ifdef XP_WIN32
printf("%s-console%sStart Mozilla with a debugging console.\n",HELP_SPACER_1,HELP_SPACER_2);
#endif