From 824348ed3caa9a507ff7e31f46408b103b2bacb6 Mon Sep 17 00:00:00 2001
From: "ccarlen%netscape.com" <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<nsIFile> 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<nsIProfile> 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<nsIProfile> 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();