summaryrefslogtreecommitdiff
path: root/connectivity/source/drivers/mozab/bootstrap/MNSProfile.cxx
diff options
context:
space:
mode:
Diffstat (limited to 'connectivity/source/drivers/mozab/bootstrap/MNSProfile.cxx')
-rw-r--r--connectivity/source/drivers/mozab/bootstrap/MNSProfile.cxx631
1 files changed, 631 insertions, 0 deletions
diff --git a/connectivity/source/drivers/mozab/bootstrap/MNSProfile.cxx b/connectivity/source/drivers/mozab/bootstrap/MNSProfile.cxx
new file mode 100644
index 000000000000..93e2905c519b
--- /dev/null
+++ b/connectivity/source/drivers/mozab/bootstrap/MNSProfile.cxx
@@ -0,0 +1,631 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org 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 version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+// MARKER(update_precomp.py): autogen include statement, do not remove
+#include "precompiled_connectivity.hxx"
+
+#include "MNSProfile.hxx"
+#include "MNSProfileDirServiceProvider.hxx"
+
+#include <com/sun/star/uno/Reference.hxx>
+#include <com/sun/star/uno/Sequence.hxx>
+#include <com/sun/star/lang/XMultiServiceFactory.hpp>
+#include <unotools/processfactory.hxx>
+#include <com/sun/star/mozilla/XMozillaBootstrap.hpp>
+
+using namespace com::sun::star::uno;
+using namespace com::sun::star::lang;
+using namespace com::sun::star::mozilla;
+using namespace rtl;
+
+// Interfaces Needed
+
+static Reference<XMozillaBootstrap> xMozillaBootstrap;
+
+
+static PRInt32 gInstanceCount = 0;
+
+// Profile database to remember which profile has been
+// created with UILocale and contentLocale on profileManager
+static nsProfileDirServiceProvider *gDirServiceProvider = nsnull;
+
+
+
+
+/*
+ * Constructor/Destructor
+ */
+nsProfile::nsProfile()
+{
+ mStartingUp = PR_FALSE;
+ mCurrentProfileAvailable = PR_FALSE;
+
+ mShutdownProfileToreDownNetwork = PR_FALSE;
+
+ mProfileChangeVetoed = PR_FALSE;
+ mProfileChangeFailed = PR_FALSE;
+ Reference<XMultiServiceFactory> xFactory = ::comphelper::getProcessServiceFactory();
+ OSL_ENSURE( xFactory.is(), "can't get service factory" );
+
+ Reference<XInterface> xInstance = xFactory->createInstance(::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM("com.sun.star.mozilla.MozillaBootstrap")) );
+ OSL_ENSURE( xInstance.is(), "failed to create instance" );
+ xMozillaBootstrap = Reference<XMozillaBootstrap>(xInstance,UNO_QUERY);
+
+
+}
+
+nsProfile::~nsProfile()
+{
+}
+
+
+nsresult
+nsProfile::Init()
+{
+ nsresult rv = NS_OK;
+ RegisterProfileManager(this);
+ if (gInstanceCount++ == 0) {
+ rv = NS_NewProfileDirServiceProvider( &gDirServiceProvider);
+ if (NS_SUCCEEDED(rv))
+ rv = gDirServiceProvider->Register();
+ }
+ return rv;
+}
+
+/*
+ * nsISupports Implementation
+ */
+NS_IMPL_THREADSAFE_ADDREF(nsProfile)
+NS_IMPL_THREADSAFE_RELEASE(nsProfile)
+
+NS_INTERFACE_MAP_BEGIN(nsProfile)
+ NS_INTERFACE_MAP_ENTRY_AMBIGUOUS(nsISupports, nsIProfile)
+ NS_INTERFACE_MAP_ENTRY(nsIProfile)
+ NS_INTERFACE_MAP_ENTRY(nsIProfileInternal)
+ NS_INTERFACE_MAP_ENTRY(nsIProfileChangeStatus)
+ NS_INTERFACE_MAP_ENTRY(nsIFactory)
+NS_INTERFACE_MAP_END
+
+/*
+ * nsIProfileChangeStatus Implementation
+ */
+
+NS_IMETHODIMP nsProfile::VetoChange()
+{
+ mProfileChangeVetoed = PR_TRUE;
+ return NS_OK;
+}
+
+NS_IMETHODIMP nsProfile::ChangeFailed()
+{
+ mProfileChangeFailed = PR_TRUE;
+ return NS_OK;
+}
+/*
+ * nsIProfile Implementation
+ */
+
+NS_IMETHODIMP nsProfile::GetProfileCount(PRInt32 *numProfiles)
+{
+ NS_ENSURE_ARG_POINTER(numProfiles);
+
+ *numProfiles = 0;
+
+ *numProfiles = xMozillaBootstrap->getProfileCount(xMozillaBootstrap->getCurrentProduct());
+ return NS_OK;
+}
+NS_IMETHODIMP nsProfile::GetProfileList(PRUint32 *length, PRUnichar ***profileNames)
+{
+ NS_ENSURE_ARG_POINTER(length);
+ NS_ENSURE_ARG_POINTER(profileNames);
+ *profileNames = nsnull;
+
+ ::com::sun::star::uno::Sequence< ::rtl::OUString > list;
+
+ *length = xMozillaBootstrap->getProfileList(xMozillaBootstrap->getCurrentProduct(),list);
+
+ const OUString * pArray = list.getConstArray();
+
+ nsresult rv = NS_OK;
+ PRInt32 count = list.getLength();
+ PRUnichar **outArray, **next;
+
+ next = outArray = (PRUnichar **)nsMemory::Alloc(count * sizeof(PRUnichar *));
+ if (!outArray)
+ return NS_ERROR_OUT_OF_MEMORY;
+
+ for (PRInt32 index=0; index < count; index++)
+ {
+ *next = (PRUnichar *)nsMemory::Clone(pArray[index].getStr(),(pArray[index].getLength()+1) * sizeof(PRUnichar ));
+ if (*next == nsnull)
+ {
+ rv = NS_ERROR_OUT_OF_MEMORY;
+ break;
+ }
+ next++;
+ }
+ *profileNames = outArray;
+ return rv;
+}
+NS_IMETHODIMP nsProfile::ProfileExists(const PRUnichar *profileName, PRBool *exists)
+{
+ NS_ENSURE_ARG_POINTER(profileName);
+ NS_ENSURE_ARG_POINTER(exists);
+
+ // PRUnichar != sal_Unicode in mingw
+ *exists = xMozillaBootstrap->getProfileExists(xMozillaBootstrap->getCurrentProduct(),reinterpret_cast_mingw_only<const sal_Unicode *>(profileName));
+ return NS_OK;
+}
+// Returns the name of the current profile i.e., the last used profile
+NS_IMETHODIMP
+nsProfile::GetCurrentProfile(PRUnichar **profileName)
+{
+ NS_ENSURE_ARG_POINTER(profileName);
+ *profileName = nsnull;
+
+ if (mCurrentProfileName.Length())
+ *profileName = (PRUnichar *)nsMemory::Clone(mCurrentProfileName.get(),(mCurrentProfileName.Length() + 1) * sizeof(PRUnichar ));
+ else
+ {
+ rtl::OUString profile = xMozillaBootstrap->getDefaultProfile(xMozillaBootstrap->getCurrentProduct());
+ *profileName = (PRUnichar *)nsMemory::Clone(profile.getStr(),( profile.getLength() + 1) * sizeof(PRUnichar ));
+ SetCurrentProfile(*profileName);
+ }
+
+ return (*profileName == nsnull) ? NS_ERROR_FAILURE : NS_OK;
+}
+
+NS_IMETHODIMP
+nsProfile::SetCurrentProfile(const PRUnichar * aCurrentProfile)
+{
+ NS_ENSURE_ARG(aCurrentProfile);
+
+ nsresult rv;
+ nsCOMPtr<nsIFile> profileDir;
+ PRBool exists;
+
+ // Ensure that the profile exists and its directory too.
+ rv = GetProfileDir(aCurrentProfile, getter_AddRefs(profileDir));
+ if (NS_FAILED(rv)) return rv;
+ rv = profileDir->Exists(&exists);
+ if (NS_FAILED(rv)) return rv;
+ if (!exists) return NS_ERROR_FILE_NOT_FOUND;
+
+ PRBool isSwitch = PRBool();
+
+ if (mCurrentProfileAvailable)
+ {
+ nsXPIDLString currProfileName;
+ rv = GetCurrentProfile(getter_Copies(currProfileName));
+ if (NS_FAILED(rv)) return rv;
+ if (nsCRT::strcmp(aCurrentProfile, currProfileName.get()) == 0)
+ return NS_OK;
+ else
+ isSwitch = PR_TRUE;
+ }
+ else
+ isSwitch = PR_FALSE;
+
+
+ nsCOMPtr<nsIObserverService> observerService =
+ do_GetService("@mozilla.org/observer-service;1", &rv);
+ NS_ENSURE_TRUE(observerService, NS_ERROR_FAILURE);
+
+ nsISupports *subject = (nsISupports *)((nsIProfile *)this);
+ NS_NAMED_LITERAL_STRING(switchString, "switch");
+ NS_NAMED_LITERAL_STRING(startupString, "startup");
+ const nsAFlatString& context = isSwitch ? switchString : startupString;
+
+ if (isSwitch)
+ {
+ rv = ShutDownCurrentProfile(nsIProfile::SHUTDOWN_PERSIST);
+ if (NS_FAILED(rv)) return NS_ERROR_ABORT;
+
+ // Phase 1: See if anybody objects to the profile being changed.
+ mProfileChangeVetoed = PR_FALSE;
+ observerService->NotifyObservers(subject, "profile-approve-change", context.get());
+ if (mProfileChangeVetoed)
+ return NS_OK;
+
+ // Phase 2a: Send the network teardown notification
+ observerService->NotifyObservers(subject, "profile-change-net-teardown", context.get());
+ mShutdownProfileToreDownNetwork = PR_TRUE;
+
+ // Phase 2b: Send the "teardown" notification
+ observerService->NotifyObservers(subject, "profile-change-teardown", context.get());
+ if (mProfileChangeVetoed)
+ {
+ // Notify we will not proceed with changing the profile
+ observerService->NotifyObservers(subject, "profile-change-teardown-veto", context.get());
+
+ // Bring network back online and return
+ observerService->NotifyObservers(subject, "profile-change-net-restore", context.get());
+ return NS_OK;
+ }
+
+ // Phase 3: Notify observers of a profile change
+ observerService->NotifyObservers(subject, "profile-before-change", context.get());
+ if (mProfileChangeFailed)
+ return NS_ERROR_ABORT;
+
+ }
+
+//
+// // Do the profile switch
+ gDirServiceProvider->SetProfileDir(profileDir);
+ mCurrentProfileName.Assign(aCurrentProfile);
+// gProfileDataAccess->SetCurrentProfile(aCurrentProfile);
+
+ if (NS_FAILED(rv)) return rv;
+ mCurrentProfileAvailable = PR_TRUE;
+
+ if (!isSwitch)
+ {
+ // Ensure that the prefs service exists so it can respond to
+ // the notifications we're about to send around. It needs to.
+ nsCOMPtr<nsIPrefService> prefs = do_GetService(NS_PREFSERVICE_CONTRACTID, &rv);
+ NS_ASSERTION(NS_SUCCEEDED(rv), "Could not get prefs service");
+ }
+
+ if (mShutdownProfileToreDownNetwork)
+ {
+ // Bring network back online
+ observerService->NotifyObservers(subject, "profile-change-net-restore", context.get());
+ mShutdownProfileToreDownNetwork = PR_FALSE;
+ if (mProfileChangeFailed)
+ return NS_ERROR_ABORT;
+ }
+
+ // Phase 4: Notify observers that the profile has changed - Here they respond to new profile
+ observerService->NotifyObservers(subject, "profile-do-change", context.get());
+ if (mProfileChangeFailed)
+ return NS_ERROR_ABORT;
+
+ // Phase 5: Now observers can respond to something another observer did in phase 4
+ observerService->NotifyObservers(subject, "profile-after-change", context.get());
+ if (mProfileChangeFailed)
+ return NS_ERROR_ABORT;
+
+ // Phase 6: One last notification after the new profile is established
+ observerService->NotifyObservers(subject, "profile-initial-state", context.get());
+ if (mProfileChangeFailed)
+ return NS_ERROR_ABORT;
+
+ return NS_OK;
+}
+/* void shutDownCurrentProfile (in unsigned long shutDownType); */
+NS_IMETHODIMP nsProfile::ShutDownCurrentProfile(PRUint32 shutDownType)
+{
+ nsresult rv;
+
+ // if shutDownType is not a well know value, skip the notifications
+ // see DoOnShutdown() in nsAppRunner.cpp for where we use this behaviour to our benefit
+ if (shutDownType == (PRUint32)SHUTDOWN_PERSIST || shutDownType == (PRUint32)SHUTDOWN_CLEANSE ) {
+ nsCOMPtr<nsIObserverService> observerService =
+ do_GetService("@mozilla.org/observer-service;1", &rv);
+ NS_ENSURE_TRUE(observerService, NS_ERROR_FAILURE);
+
+ nsISupports *subject = (nsISupports *)((nsIProfile *)this);
+
+ NS_NAMED_LITERAL_STRING(cleanseString, "shutdown-cleanse");
+ NS_NAMED_LITERAL_STRING(persistString, "shutdown-persist");
+ const nsAFlatString& context = (shutDownType == (PRUint32)SHUTDOWN_CLEANSE) ? cleanseString : persistString;
+
+ // Phase 1: See if anybody objects to the profile being changed.
+ mProfileChangeVetoed = PR_FALSE;
+ observerService->NotifyObservers(subject, "profile-approve-change", context.get());
+ if (mProfileChangeVetoed)
+ return NS_OK;
+
+ // Phase 2a: Send the network teardown notification
+ observerService->NotifyObservers(subject, "profile-change-net-teardown", context.get());
+ mShutdownProfileToreDownNetwork = PR_TRUE;
+
+ // Phase 2b: Send the "teardown" notification
+ observerService->NotifyObservers(subject, "profile-change-teardown", context.get());
+
+
+ // Phase 3: Notify observers of a profile change
+ observerService->NotifyObservers(subject, "profile-before-change", context.get());
+ }
+
+
+ gDirServiceProvider->SetProfileDir(nsnull);
+ mCurrentProfileAvailable = PR_FALSE;
+ mCurrentProfileName.Truncate(0);
+
+ return NS_OK;
+}
+/* void createNewProfile (in wstring profileName, in wstring nativeProfileDir, in wstring langcode, in boolean useExistingDir); */
+NS_IMETHODIMP nsProfile::CreateNewProfile(const PRUnichar* /*profileName*/, const PRUnichar* /*nativeProfileDir*/, const PRUnichar* /*langcode*/, PRBool /*useExistingDir*/)
+{
+ return NS_ERROR_NOT_IMPLEMENTED;
+}
+
+/* void renameProfile (in wstring oldName, in wstring newName); */
+NS_IMETHODIMP nsProfile::RenameProfile(const PRUnichar* /*oldName*/, const PRUnichar* /*newName*/)
+{
+ return NS_ERROR_NOT_IMPLEMENTED;
+}
+
+/* void deleteProfile (in wstring name, in boolean canDeleteFiles); */
+NS_IMETHODIMP nsProfile::DeleteProfile(const PRUnichar* /*name*/, PRBool /*canDeleteFiles*/)
+{
+ return NS_ERROR_NOT_IMPLEMENTED;
+}
+
+/* void cloneProfile (in wstring profileName); */
+NS_IMETHODIMP nsProfile::CloneProfile(const PRUnichar* /*profileName*/)
+{
+ return NS_ERROR_NOT_IMPLEMENTED;
+}
+//nsIProfileInternal Implementation
+
+/* [noscript] void startupWithArgs (in nsICmdLineService cmdLine, in boolean canInteract); */
+class nsICmdLineService;
+
+NS_IMETHODIMP nsProfile::StartupWithArgs(nsICmdLineService* /*cmdLineArgs*/, PRBool /*canInteract*/)
+{
+ Init();
+ return NS_OK;
+}
+
+/* [noscript] readonly attribute boolean isStartingUp; */
+NS_IMETHODIMP nsProfile::GetIsStartingUp(PRBool *aIsStartingUp)
+{
+ NS_ENSURE_ARG_POINTER(aIsStartingUp);
+ *aIsStartingUp = mStartingUp;
+ return NS_OK;
+}
+
+/* long get4xProfileCount (); */
+NS_IMETHODIMP nsProfile::Get4xProfileCount(PRInt32* /*_retval*/)
+{
+ return NS_ERROR_NOT_IMPLEMENTED;
+}
+
+/* void getProfileListX (in unsigned long which, out unsigned long length, [array, size_is (length), retval] out wstring profileNames); */
+NS_IMETHODIMP nsProfile::GetProfileListX(PRUint32 /*whichKind*/, PRUint32* /*length*/, PRUnichar*** /*profileNames*/)
+{
+ return NS_ERROR_NOT_IMPLEMENTED;
+}
+
+/* void migrateProfileInfo (); */
+NS_IMETHODIMP nsProfile::MigrateProfileInfo()
+{
+ return NS_ERROR_NOT_IMPLEMENTED;
+}
+
+/* void migrateAllProfiles (); */
+NS_IMETHODIMP nsProfile::MigrateAllProfiles()
+{
+ return NS_ERROR_NOT_IMPLEMENTED;
+}
+
+/* void migrateProfile (in wstring profileName); */
+NS_IMETHODIMP nsProfile::MigrateProfile(const PRUnichar* /*profileName*/)
+{
+ return NS_ERROR_NOT_IMPLEMENTED;
+}
+
+/* void remigrateProfile (in wstring profileName); */
+NS_IMETHODIMP nsProfile::RemigrateProfile(const PRUnichar* /*profileName*/)
+{
+ return NS_ERROR_NOT_IMPLEMENTED;
+}
+
+/* void forgetCurrentProfile (); */
+NS_IMETHODIMP nsProfile::ForgetCurrentProfile()
+{
+ return NS_ERROR_NOT_IMPLEMENTED;
+}
+
+/* void createDefaultProfile (); */
+NS_IMETHODIMP nsProfile::CreateDefaultProfile()
+{
+ return NS_ERROR_NOT_IMPLEMENTED;
+}
+
+/* nsIFile getProfileDir (in wstring profileName); */
+// Gets the profiles directory for a given profile
+// Sets the given profile to be a current profile
+NS_IMETHODIMP nsProfile::GetProfileDir(const PRUnichar *profileName, nsIFile **profileDir)
+{
+ NS_ENSURE_ARG(profileName);
+ NS_ENSURE_ARG_POINTER(profileDir);
+ *profileDir = nsnull;
+
+ nsresult rv = NS_OK;
+
+ // PRUnichar != sal_Unicode in mingw
+ rtl::OUString path = xMozillaBootstrap->getProfilePath(xMozillaBootstrap->getCurrentProduct(),reinterpret_cast_mingw_only<const sal_Unicode *>(profileName));
+
+ nsCOMPtr<nsILocalFile> localFile;
+ // PRUnichar != sal_Unicode in mingw
+ nsAutoString filePath(reinterpret_cast_mingw_only<const PRUnichar *>(path.getStr()));
+
+ rv = NS_NewLocalFile(filePath, PR_TRUE,
+ getter_AddRefs(localFile));
+ if (localFile && NS_SUCCEEDED(rv))
+ return localFile->QueryInterface(NS_GET_IID(nsIFile), (void**)profileDir);
+ return rv;
+}
+
+/* wstring getProfilePath (in wstring profileName); */
+NS_IMETHODIMP nsProfile::GetProfilePath(const PRUnichar* /*profileName*/, PRUnichar** /*_retval*/)
+{
+ return NS_ERROR_NOT_IMPLEMENTED;
+}
+
+/* nsILocalFile getOriginalProfileDir (in wstring profileName); */
+NS_IMETHODIMP nsProfile::GetOriginalProfileDir(const PRUnichar* /*profileName*/, nsILocalFile** /*originalDir*/)
+{
+ return NS_ERROR_NOT_IMPLEMENTED;
+}
+
+/* PRInt64 getProfileLastModTime (in wstring profileName); */
+NS_IMETHODIMP nsProfile::GetProfileLastModTime(const PRUnichar* /*profileName*/, PRInt64* /*_retval*/)
+{
+ return NS_ERROR_NOT_IMPLEMENTED;
+}
+
+/* attribute boolean automigrate; */
+NS_IMETHODIMP nsProfile::GetAutomigrate(PRBool* /*aAutomigrate*/)
+{
+ return NS_ERROR_NOT_IMPLEMENTED;
+}
+NS_IMETHODIMP nsProfile::SetAutomigrate(PRBool /*aAutomigrate*/)
+{
+ return NS_ERROR_NOT_IMPLEMENTED;
+}
+
+/* readonly attribute nsIFile defaultProfileParentDir; */
+NS_IMETHODIMP nsProfile::GetDefaultProfileParentDir(nsIFile** /*aDefaultProfileParentDir*/)
+{
+ return NS_ERROR_NOT_IMPLEMENTED;
+}
+
+/* readonly attribute wstring firstProfile; */
+NS_IMETHODIMP nsProfile::GetFirstProfile(PRUnichar **profileName)
+{
+ NS_ENSURE_ARG_POINTER(profileName);
+
+ return GetCurrentProfile(profileName);
+}
+
+/* attribute boolean startWithLastUsedProfile; */
+NS_IMETHODIMP nsProfile::GetStartWithLastUsedProfile(PRBool* /*aStartWithLastUsedProfile*/)
+{
+ return NS_ERROR_NOT_IMPLEMENTED;
+}
+NS_IMETHODIMP nsProfile::SetStartWithLastUsedProfile(PRBool /*aStartWithLastUsedProfile*/)
+{
+ return NS_ERROR_NOT_IMPLEMENTED;
+}
+
+/* [noscript] void updateRegistry (in nsIFile regName); */
+NS_IMETHODIMP nsProfile::UpdateRegistry(nsIFile* /*regName*/)
+{
+ return NS_ERROR_NOT_IMPLEMENTED;
+}
+
+/* [noscript] void getRegStrings (in wstring profileName, out wstring regString, out wstring regName, out wstring regEmail, out wstring regOption); */
+NS_IMETHODIMP nsProfile::GetRegStrings(const PRUnichar* /*profileName*/, PRUnichar** /*regString*/, PRUnichar** /*regName*/, PRUnichar** /*regEmail*/, PRUnichar** /*regOption*/)
+{
+ return NS_ERROR_NOT_IMPLEMENTED;
+}
+
+/* [noscript] void setRegStrings (in wstring profileName, in wstring regString, in wstring regName, in wstring regEmail, in wstring regOption); */
+NS_IMETHODIMP nsProfile::SetRegStrings(const PRUnichar* /*profileName*/, const PRUnichar* /*regString*/, const PRUnichar* /*regName*/, const PRUnichar* /*regEmail*/, const PRUnichar* /*regOption*/)
+{
+ return NS_ERROR_NOT_IMPLEMENTED;
+}
+
+/* [noscript] string isRegStringSet (in wstring profileName); */
+NS_IMETHODIMP nsProfile::IsRegStringSet(const PRUnichar* /*profileName*/, char** /*_retval*/)
+{
+ return NS_ERROR_NOT_IMPLEMENTED;
+}
+
+/* void createNewProfileWithLocales (in wstring profileName, in wstring nativeProfileDir, in wstring UILocale, in wstring contentLocale, in boolean useExistingDir); */
+NS_IMETHODIMP nsProfile::CreateNewProfileWithLocales(const PRUnichar* /*profileName*/, const PRUnichar* /*nativeProfileDir*/, const PRUnichar* /*UILocale*/, const PRUnichar* /*contentLocale*/, PRBool /*useExistingDir*/)
+{
+ return NS_ERROR_NOT_IMPLEMENTED;
+}
+
+/* boolean isCurrentProfileAvailable (); */
+NS_IMETHODIMP nsProfile::IsCurrentProfileAvailable(PRBool *available)
+{
+ NS_ENSURE_ARG_POINTER(available);
+
+ *available = mCurrentProfileAvailable;
+ return NS_OK;
+}
+
+/* [noscript] void getCurrentProfileDir (out nsIFile profileDir); */
+// Returns the name of the current profile directory
+NS_IMETHODIMP nsProfile::GetCurrentProfileDir(nsIFile **profileDir)
+{
+ NS_ENSURE_ARG_POINTER(profileDir);
+ nsresult rv;
+
+ nsXPIDLString profileName;
+ rv = GetCurrentProfile(getter_Copies(profileName));
+ if (NS_FAILED(rv)) return rv;
+
+ rv = GetProfileDir(profileName, profileDir);
+ if (NS_FAILED(rv)) return rv;
+
+ return NS_OK;
+}
+
+//Implementation nsIFactory
+NS_IMETHODIMP
+nsProfile::LockFactory(PRBool /*aVal*/)
+{
+ return NS_ERROR_NOT_IMPLEMENTED;
+}
+
+NS_IMETHODIMP
+nsProfile::CreateInstance(nsISupports* aOuter, const nsID& aIID,
+ void** aResult)
+{
+ if (aOuter)
+ return NS_ERROR_NO_AGGREGATION;
+ // return this object
+ return QueryInterface(aIID, aResult);
+}
+
+//Register profile manager
+#include "nsIComponentManager.h"
+#include "nsIComponentRegistrar.h"
+
+static const nsCID kProfileManagerCID = NS_PROFILE_CID;
+
+#define NS_PROFILE_CONTRACTID \
+ "@mozilla.org/profile/manager;1"
+
+nsresult
+nsProfile::RegisterProfileManager(nsIProfile* aProfileService)
+{
+ nsCOMPtr<nsIServiceManager> mgr;
+ NS_GetServiceManager(getter_AddRefs(mgr));
+
+ NS_ASSERTION(mgr, "Not initialized!");
+
+ nsCOMPtr<nsIFactory> factory = do_QueryInterface(aProfileService);
+ NS_ASSERTION(factory, "Supposed to be an nsIFactory!");
+
+ nsCOMPtr<nsIComponentRegistrar> reg (do_QueryInterface(mgr));
+ if (!reg)
+ return NS_ERROR_NO_INTERFACE;
+
+ return reg->RegisterFactory(kProfileManagerCID,
+ "Profile Manager",
+ NS_PROFILE_CONTRACTID,
+ factory);
+}