From 824348ed3caa9a507ff7e31f46408b103b2bacb6 Mon Sep 17 00:00:00 2001 From: "ccarlen%netscape.com" Date: Fri, 22 Sep 2000 05:05:48 +0000 Subject: [PATCH] Bug #48981 Make use of mpfilelocprovider for Shrimp r=bhuvan,mscott --- xpfe/bootstrap/nsAppRunner.cpp | 78 +++++++++++++++++++++++++++------- 1 file changed, 62 insertions(+), 16 deletions(-) diff --git a/xpfe/bootstrap/nsAppRunner.cpp b/xpfe/bootstrap/nsAppRunner.cpp index 814d61b20d93..fa22d0908b6c 100644 --- a/xpfe/bootstrap/nsAppRunner.cpp +++ b/xpfe/bootstrap/nsAppRunner.cpp @@ -58,6 +58,8 @@ #include "nsIBrowserInstance.h" #include "nsIEventQueueService.h" #include "nsAppFileLocationProvider.h" +#include "nsMPFileLocProvider.h" +#include "nsDirectoryServiceDefs.h" // Interfaces Needed #include "nsIXULWindow.h" @@ -71,6 +73,9 @@ #define DEBUG_CMD_LINE #endif +// Standalone App defines +#define STANDALONE_APP_PREF "profile.standalone_app.enable" +#define STANDALONE_APP_DIR_PREF "profile.standalone_app.directory" static NS_DEFINE_CID(kSoftUpdateCID, NS_SoftwareUpdate_CID); static NS_DEFINE_CID(kWindowMediatorCID, NS_WINDOWMEDIATOR_CID); @@ -108,6 +113,8 @@ static nsresult CheckForNewChrome(void); // to make it as unlikely as possible that somebody calls printf() before we get initialized. static struct MacInitializer { MacInitializer() { InitializeMacToolbox(); } } gInitializer; +// Initialize profile services for both standalone and regular profiles +static nsresult InitializeProfileService(nsICmdLineService *cmdLineArgs); class stTSMCloser { @@ -745,6 +752,59 @@ static nsresult CreateAndRegisterDirectoryService() return rv; } +// Do the righe thing to provide locations depending on whether an +// application is standalone or not +static nsresult InitializeProfileService(nsICmdLineService *cmdLineArgs) +{ + nsresult rv; + + PRBool standaloneApp = PR_FALSE; + NS_WITH_SERVICE(nsIPref, prefs, kPrefCID, &rv); + if (NS_FAILED(rv)) return rv; + rv = prefs->GetBoolPref(STANDALONE_APP_PREF, &standaloneApp); + if (NS_SUCCEEDED(rv) && standaloneApp) + { + nsMPFileLocProvider *fileLocProvider = new nsMPFileLocProvider; + NS_ENSURE_TRUE(fileLocProvider, NS_ERROR_OUT_OF_MEMORY); + // Specify the dir that standalone app will use for its "profile" dir + nsCOMPtr parentDir; + rv = NS_GetSpecialDirectory(NS_OS_CURRENT_PROCESS_DIR, getter_AddRefs(parentDir)); + if (NS_FAILED(rv)) return rv; + + // Get standalone app dir name from prefs and initialize mpfilelocprovider + nsXPIDLCString appDir; + rv = prefs->CopyCharPref(STANDALONE_APP_DIR_PREF, getter_Copies(appDir)); + if (NS_FAILED(rv) || (nsCRT::strlen(appDir) == 0)) + return NS_ERROR_FAILURE; + rv = fileLocProvider->Initialize(parentDir, appDir); + if (NS_FAILED(rv)) return rv; + + rv = prefs->ResetPrefs(); + if (NS_FAILED(rv)) return rv; + rv = prefs->ReadUserPrefs(); + if (NS_FAILED(rv)) return rv; + } + else + { + nsCOMPtr profileMgr = do_GetService(kProfileCID, &rv); + NS_ASSERTION(NS_SUCCEEDED(rv), "failed to get profile manager"); + if (NS_FAILED(rv)) return rv; + + rv = profileMgr->StartupWithArgs(cmdLineArgs); + if (NS_FAILED(rv)) return rv; + + // if we get here, and we don't have a current profile, return a failure so we will exit + // this can happen, if the user hits Cancel or Exit in the profile manager dialogs + nsXPIDLString currentProfileStr; + rv = profileMgr->GetCurrentProfile(getter_Copies(currentProfileStr)); + if (NS_FAILED(rv) || !((const PRUnichar *)currentProfileStr) || + (nsCRT::strlen((const PRUnichar *)currentProfileStr) == 0)) { + return NS_ERROR_FAILURE; + } + } + return rv; +} + #ifdef DEBUG_warren #ifdef XP_PC #define _CRTDBG_MAP_ALLOC @@ -900,24 +960,10 @@ static nsresult main1(int argc, char* argv[], nsISupports *nativeApp ) NS_ASSERTION(NS_SUCCEEDED(rv), "failed to initialize appshell"); if (NS_FAILED(rv)) return rv; - - /* -- PROFILE stuff -- */ - nsCOMPtr profileMgr = do_GetService(kProfileCID, &rv); - NS_ASSERTION(NS_SUCCEEDED(rv), "failed to get profile manager"); + // Initialize Profile Service here. + rv = InitializeProfileService(cmdLineArgs); if (NS_FAILED(rv)) return rv; - rv = profileMgr->StartupWithArgs(cmdLineArgs); - if (NS_FAILED(rv)) return rv; - - // if we get here, and we don't have a current profile, return a failure so we will exit - // this can happen, if the user hits Cancel or Exit in the profile manager dialogs - nsXPIDLString currentProfileStr; - rv = profileMgr->GetCurrentProfile(getter_Copies(currentProfileStr)); - if (NS_FAILED(rv) || !((const PRUnichar *)currentProfileStr) || - (nsCRT::strlen((const PRUnichar *)currentProfileStr) == 0)) { - return NS_ERROR_FAILURE; - } - // rjc: now must explicitly call appshell's CreateHiddenWindow() function AFTER profile manager. // if the profile manager ever switches to using nsIDOMWindowInternal stuff, this might have to change appShell->CreateHiddenWindow();