diff --git a/mozilla/xpcom/io/nsAppFileLocationProvider.cpp b/mozilla/xpcom/io/nsAppFileLocationProvider.cpp index 8fab4ecbfc2..663b2002425 100755 --- a/mozilla/xpcom/io/nsAppFileLocationProvider.cpp +++ b/mozilla/xpcom/io/nsAppFileLocationProvider.cpp @@ -80,7 +80,13 @@ #define NS_ENV_PLUGINS_DIR "EnvPlugins" // env var MOZ_PLUGIN_PATH #define NS_USER_PLUGINS_DIR "UserPlugins" -#if XP_MAC +#if defined(XP_MAC) +#define NS_MACOSX_USER_PLUGIN_DIR "OSXUserPlugins" +#define NS_MACOSX_LOCAL_PLUGIN_DIR "OSXLocalPlugins" +#define NS_MAC_CLASSIC_PLUGIN_DIR "MacSysPlugins" +#endif + +#if defined(XP_MAC) #define DEFAULTS_DIR_NAME NS_LITERAL_CSTRING("Defaults") #define DEFAULTS_PREF_DIR_NAME NS_LITERAL_CSTRING("Pref") #define DEFAULTS_PROFILE_DIR_NAME NS_LITERAL_CSTRING("Profile") @@ -130,6 +136,13 @@ nsAppFileLocationProvider::GetFile(const char *prop, PRBool *persistant, nsIFile NS_ENSURE_ARG(prop); *_retval = nsnull; *persistant = PR_TRUE; + +#if defined (XP_MAC) + short foundVRefNum; + long foundDirID; + FSSpec fileSpec; + nsCOMPtr macFile; +#endif if (nsCRT::strcmp(prop, NS_APP_APPLICATION_REGISTRY_DIR) == 0) { @@ -188,6 +201,41 @@ nsAppFileLocationProvider::GetFile(const char *prop, PRBool *persistant, nsIFile if (NS_SUCCEEDED(rv)) rv = localFile->AppendRelativeNativePath(PLUGINS_DIR_NAME); } +#if defined(XP_MAC) + else if (nsCRT::strcmp(prop, NS_MACOSX_USER_PLUGIN_DIR) == 0) + { + if (!(::FindFolder(kUserDomain, + kInternetPlugInFolderType, + kDontCreateFolder, &foundVRefNum, &foundDirID)) && + !(::FSMakeFSSpec(foundVRefNum, foundDirID, "\p", &fileSpec))) { + rv = NS_NewLocalFileWithFSSpec(&fileSpec, PR_TRUE, getter_AddRefs(macFile)); + if (NS_SUCCEEDED(rv)) + localFile = macFile; + } + } + else if (nsCRT::strcmp(prop, NS_MACOSX_LOCAL_PLUGIN_DIR) == 0) + { + if (!(::FindFolder(kLocalDomain, + kInternetPlugInFolderType, + kDontCreateFolder, &foundVRefNum, &foundDirID)) && + !(::FSMakeFSSpec(foundVRefNum, foundDirID, "\p", &fileSpec))) { + rv = NS_NewLocalFileWithFSSpec(&fileSpec, PR_TRUE, getter_AddRefs(macFile)); + if (NS_SUCCEEDED(rv)) + localFile = macFile; + } + } + else if (nsCRT::strcmp(prop, NS_MAC_CLASSIC_PLUGIN_DIR) == 0) + { + if (!(::FindFolder(kOnAppropriateDisk, + kInternetPlugInFolderType, + kDontCreateFolder, &foundVRefNum, &foundDirID)) && + !(::FSMakeFSSpec(foundVRefNum, foundDirID, "\p", &fileSpec))) { + rv = NS_NewLocalFileWithFSSpec(&fileSpec, PR_TRUE, getter_AddRefs(macFile)); + if (NS_SUCCEEDED(rv)) + localFile = macFile; + } + } +#else else if (nsCRT::strcmp(prop, NS_ENV_PLUGINS_DIR) == 0) { const char *pathVar = PR_GetEnv("MOZ_PLUGIN_PATH"); @@ -200,6 +248,7 @@ nsAppFileLocationProvider::GetFile(const char *prop, PRBool *persistant, nsIFile if (NS_SUCCEEDED(rv)) rv = localFile->AppendRelativeNativePath(PLUGINS_DIR_NAME); } +#endif else if (nsCRT::strcmp(prop, NS_APP_SEARCH_DIR) == 0) { rv = CloneMozBinDirectory(getter_AddRefs(localFile)); @@ -385,25 +434,23 @@ class nsAppDirectoryEnumerator : public nsISimpleEnumerator NS_DECL_ISUPPORTS /** - * aKeyList is a list of properties which are provided by aProvider + * aKeyList is a null-terminated list of properties which are provided by aProvider * They do not need to be publicly defined keys. */ nsAppDirectoryEnumerator(nsIDirectoryServiceProvider *aProvider, - const char* aKeyList[], - PRInt32 aNumKeys) : + const char* aKeyList[]) : mProvider(aProvider), - mKeyList(aKeyList), - mCurrentIndex(0), mMaxIndex(aNumKeys) + mCurrentKey(aKeyList) { NS_INIT_REFCNT(); } NS_IMETHOD HasMoreElements(PRBool *result) { - while (!mNext && (mCurrentIndex < mMaxIndex)) + while (!mNext && *mCurrentKey) { PRBool dontCare; - (void)mProvider->GetFile(mKeyList[mCurrentIndex++], &dontCare, getter_AddRefs(mNext)); + (void)mProvider->GetFile(*mCurrentKey++, &dontCare, getter_AddRefs(mNext)); } *result = mNext != nsnull; return NS_OK; @@ -432,8 +479,7 @@ class nsAppDirectoryEnumerator : public nsISimpleEnumerator protected: nsIDirectoryServiceProvider *mProvider; - const char** mKeyList; - PRInt32 mCurrentIndex, mMaxIndex; + const char** mCurrentKey; nsCOMPtr mNext; }; @@ -449,12 +495,21 @@ nsAppFileLocationProvider::GetFiles(const char *prop, nsISimpleEnumerator **_ret if (!nsCRT::strcmp(prop, NS_APP_PLUGINS_DIR_LIST)) { #ifdef XP_MAC - static const char* keys[] = { NS_APP_PLUGINS_DIR }; + static const char* osXKeys[] = { NS_APP_PLUGINS_DIR, NS_MACOSX_USER_PLUGIN_DIR, NS_MACOSX_LOCAL_PLUGIN_DIR, nsnull }; + static const char* os9Keys[] = { NS_APP_PLUGINS_DIR, NS_MAC_CLASSIC_PLUGIN_DIR, nsnull }; + static const char** keys; + + if (!keys) { + OSErr err; + long response; + err = ::Gestalt(gestaltSystemVersion, &response); + keys = (!err && response >= 0x00001000) ? osXKeys : os9Keys; + } #else - static const char* keys[] = { NS_ENV_PLUGINS_DIR, NS_USER_PLUGINS_DIR, NS_APP_PLUGINS_DIR }; + static const char* keys[] = { NS_ENV_PLUGINS_DIR, NS_USER_PLUGINS_DIR, NS_APP_PLUGINS_DIR, nsnull }; #endif - *_retval = new nsAppDirectoryEnumerator(this, keys, sizeof(keys) / sizeof(keys[0])); + *_retval = new nsAppDirectoryEnumerator(this, keys); NS_IF_ADDREF(*_retval); rv = *_retval ? NS_OK : NS_ERROR_OUT_OF_MEMORY; } diff --git a/mozilla/xpcom/io/nsDirectoryService.cpp b/mozilla/xpcom/io/nsDirectoryService.cpp index 850fce4101a..f6aec843301 100644 --- a/mozilla/xpcom/io/nsDirectoryService.cpp +++ b/mozilla/xpcom/io/nsDirectoryService.cpp @@ -1132,121 +1132,11 @@ nsDirectoryService::GetFile(const char *prop, PRBool *persistent, nsIFile **_ret return rv; } -#if defined (XP_MAC) - -struct FindFolderParms -{ - short vRefNumOrDomain; - OSType folderType; -}; - -class nsSystemDirEnumeratorMac : public nsISimpleEnumerator -{ - public: - NS_DECL_ISUPPORTS - - nsSystemDirEnumeratorMac(const FindFolderParms aFolderList[], - PRInt32 aListCount) : - mFolderList(aFolderList), - mCurrentIndex(0), mMaxIndex(aListCount) - { - NS_INIT_REFCNT(); - } - - NS_IMETHOD HasMoreElements(PRBool *result) - { - *result = ((mCurrentIndex < mMaxIndex) && mFolderList); - return NS_OK; - } - - NS_IMETHOD GetNext(nsISupports **result) - { - NS_ENSURE_ARG_POINTER(result); - *result = nsnull; - - PRBool hasMore; - HasMoreElements(&hasMore); - if (!hasMore) - return NS_ERROR_FAILURE; - - OSErr err; - short foundVRefNum; - long foundDirID; - FSSpec fileSpec; - - const FindFolderParms *currentFolder = mFolderList + mCurrentIndex++; - err = ::FindFolder(currentFolder->vRefNumOrDomain, - currentFolder->folderType, - kDontCreateFolder, &foundVRefNum, &foundDirID); - if (err == noErr) - err = ::FSMakeFSSpec(foundVRefNum, foundDirID, "\p", &fileSpec); - if (err != noErr) - return NS_ERROR_FAILURE; - - nsCOMPtr newFile; - nsresult rv = NS_NewLocalFileWithFSSpec(&fileSpec, PR_TRUE, getter_AddRefs(newFile)); - if (NS_FAILED(rv)) - return rv; - - *result = newFile; - NS_ADDREF(*result); - - return NS_OK; - } - - ~nsSystemDirEnumeratorMac() // I don't expect to be subclassed - { - } - - protected: - const FindFolderParms *mFolderList; - PRInt32 mCurrentIndex, mMaxIndex; -}; - -NS_IMPL_ISUPPORTS1(nsSystemDirEnumeratorMac, nsISimpleEnumerator) -#endif // XP_MAC - NS_IMETHODIMP nsDirectoryService::GetFiles(const char *prop, nsISimpleEnumerator **_retval) { NS_ENSURE_ARG_POINTER(_retval); *_retval = nsnull; - nsresult rv = NS_ERROR_FAILURE; - if (!nsCRT::strcmp(prop, NS_OS_PLUGINS_DIR_LIST)) - { -#if defined(XP_MAC) - static const FindFolderParms sClassicPluginsList[] = { - { kOnAppropriateDisk, kInternetPlugInFolderType} - }; - - const FindFolderParms *parmList; - PRInt32 parmListSize; - -#if TARGET_CARBON - static const FindFolderParms sOSXPluginsList[] = { - { kUserDomain, kInternetPlugInFolderType }, - { kLocalDomain, kInternetPlugInFolderType } - }; - - OSErr err; - long response; - err = ::Gestalt(gestaltSystemVersion, &response); - if (!err && response >= 0x00001000) - { - parmList = sOSXPluginsList; - parmListSize = sizeof(sOSXPluginsList) / sizeof(sOSXPluginsList[0]); - } - else -#endif - { - parmList = sClassicPluginsList; - parmListSize = sizeof(sClassicPluginsList) / sizeof(sClassicPluginsList[0]); - } - *_retval = new nsSystemDirEnumeratorMac(parmList, parmListSize); - NS_IF_ADDREF(*_retval); - rv = *_retval ? NS_OK : NS_ERROR_OUT_OF_MEMORY; -#endif // XP_MAC - } - return rv; + return NS_ERROR_FAILURE; }