diff options
Diffstat (limited to 'indra/llvfs')
| -rwxr-xr-x | indra/llvfs/CMakeLists.txt | 6 | ||||
| -rw-r--r-- | indra/llvfs/lldir.h | 4 | ||||
| -rw-r--r-- | indra/llvfs/lldir_linux.cpp | 2 | ||||
| -rw-r--r-- | indra/llvfs/lldir_linux.h | 2 | ||||
| -rw-r--r-- | indra/llvfs/lldir_mac.cpp | 237 | ||||
| -rw-r--r-- | indra/llvfs/lldir_mac.h | 8 | ||||
| -rw-r--r-- | indra/llvfs/lldir_solaris.cpp | 2 | ||||
| -rw-r--r-- | indra/llvfs/lldir_solaris.h | 2 | ||||
| -rw-r--r-- | indra/llvfs/lldir_win32.cpp | 2 | ||||
| -rw-r--r-- | indra/llvfs/lldir_win32.h | 2 | ||||
| -rw-r--r-- | indra/llvfs/llvfs_objc.h | 43 | ||||
| -rw-r--r-- | indra/llvfs/llvfs_objc.mm | 108 | ||||
| -rw-r--r-- | indra/llvfs/tests/lldir_test.cpp | 2 | 
13 files changed, 235 insertions, 185 deletions
| diff --git a/indra/llvfs/CMakeLists.txt b/indra/llvfs/CMakeLists.txt index ba4e9a8d88..67dce8c073 100755 --- a/indra/llvfs/CMakeLists.txt +++ b/indra/llvfs/CMakeLists.txt @@ -37,6 +37,8 @@ set(llvfs_HEADER_FILES  if (DARWIN)    LIST(APPEND llvfs_SOURCE_FILES lldir_mac.cpp)    LIST(APPEND llvfs_HEADER_FILES lldir_mac.h) +  LIST(APPEND llvfs_SOURCE_FILES llvfs_objc.mm) +  LIST(APPEND llvfs_HEADER_FILES llvfs_objc.h)  endif (DARWIN)  if (LINUX) @@ -75,8 +77,8 @@ target_link_libraries(llvfs  if (DARWIN)    include(CMakeFindFrameworks) -  find_library(CARBON_LIBRARY Carbon) -  target_link_libraries(llvfs ${CARBON_LIBRARY}) +  find_library(COCOA_LIBRARY Cocoa) +  target_link_libraries(llvfs ${COCOA_LIBRARY})  endif (DARWIN) diff --git a/indra/llvfs/lldir.h b/indra/llvfs/lldir.h index c60d3ef3a2..300ff1eef6 100644 --- a/indra/llvfs/lldir.h +++ b/indra/llvfs/lldir.h @@ -73,10 +73,8 @@ class LLDir  	virtual S32 deleteFilesInDir(const std::string &dirname, const std::string &mask);  // pure virtual functions -	virtual U32 countFilesInDir(const std::string &dirname, const std::string &mask) = 0; -  	virtual std::string getCurPath() = 0; -	virtual BOOL fileExists(const std::string &filename) const = 0; +	virtual bool fileExists(const std::string &filename) const = 0;  	const std::string findFile(const std::string& filename, const std::vector<std::string> filenames) const;   	const std::string findFile(const std::string& filename, const std::string& searchPath1 = "", const std::string& searchPath2 = "", const std::string& searchPath3 = "") const; diff --git a/indra/llvfs/lldir_linux.cpp b/indra/llvfs/lldir_linux.cpp index 407f3b93fb..4edd078640 100644 --- a/indra/llvfs/lldir_linux.cpp +++ b/indra/llvfs/lldir_linux.cpp @@ -254,7 +254,7 @@ std::string LLDir_Linux::getCurPath()  } -BOOL LLDir_Linux::fileExists(const std::string &filename) const +bool LLDir_Linux::fileExists(const std::string &filename) const  {  	struct stat stat_data;  	// Check the age of the file diff --git a/indra/llvfs/lldir_linux.h b/indra/llvfs/lldir_linux.h index 7603239867..e83a020ba4 100644 --- a/indra/llvfs/lldir_linux.h +++ b/indra/llvfs/lldir_linux.h @@ -47,7 +47,7 @@ public:  	virtual std::string getCurPath();  	virtual U32 countFilesInDir(const std::string &dirname, const std::string &mask); -	/*virtual*/ BOOL fileExists(const std::string &filename) const; +	/*virtual*/ bool fileExists(const std::string &filename) const;  	/*virtual*/ std::string getLLPluginLauncher();  	/*virtual*/ std::string getLLPluginFilename(std::string base_name); diff --git a/indra/llvfs/lldir_mac.cpp b/indra/llvfs/lldir_mac.cpp index 9f60111275..c5041d434c 100644 --- a/indra/llvfs/lldir_mac.cpp +++ b/indra/llvfs/lldir_mac.cpp @@ -35,73 +35,27 @@  #include <sys/stat.h>  #include <unistd.h>  #include <glob.h> - -#include <Carbon/Carbon.h> - -// -------------------------------------------------------------------------------- - -static OSStatus CFCreateDirectory(FSRef	*parentRef, CFStringRef name, FSRef *newRef) -{ -	OSStatus		result = noErr; -	HFSUniStr255	uniStr; -	 -	uniStr.length = CFStringGetLength(name); -	CFStringGetCharacters(name, CFRangeMake(0, uniStr.length), uniStr.unicode); -	result = FSMakeFSRefUnicode(parentRef, uniStr.length, uniStr.unicode, kTextEncodingMacRoman, newRef); -	if (result != noErr) -	{ -		result = FSCreateDirectoryUnicode(parentRef, uniStr.length, uniStr.unicode, 0, NULL, newRef, NULL, NULL); -	} - -	return result; -} +#include <boost/filesystem.hpp> +#include "llvfs_objc.h"  // -------------------------------------------------------------------------------- -static void CFStringRefToLLString(CFStringRef stringRef, std::string &llString, bool releaseWhenDone) +static bool CreateDirectory(const std::string &parent,  +                            const std::string &child, +                            std::string *fullname)  { -	if (stringRef) -	{ -		long stringSize = CFStringGetLength(stringRef) + 1; -		long bufferSize = CFStringGetMaximumSizeForEncoding(stringSize,kCFStringEncodingUTF8); -		char* buffer = new char[bufferSize]; -		memset(buffer, 0, bufferSize); -		if (CFStringGetCString(stringRef, buffer, bufferSize, kCFStringEncodingUTF8)) -			llString = buffer; -		delete[] buffer; -		if (releaseWhenDone) -			CFRelease(stringRef); -	} -} - -// -------------------------------------------------------------------------------- - -static void CFURLRefToLLString(CFURLRef urlRef, std::string &llString, bool releaseWhenDone) -{ -	if (urlRef) -	{ -		CFURLRef	absoluteURLRef = CFURLCopyAbsoluteURL(urlRef); -		if (absoluteURLRef) -		{ -			CFStringRef	stringRef = CFURLCopyFileSystemPath(absoluteURLRef, kCFURLPOSIXPathStyle); -			CFStringRefToLLString(stringRef, llString, true); -			CFRelease(absoluteURLRef); -		} -		if (releaseWhenDone) -			CFRelease(urlRef); -	} -} - -// -------------------------------------------------------------------------------- - -static void FSRefToLLString(FSRef *fsRef, std::string &llString) -{ -	OSStatus	error = noErr; -	char		path[MAX_PATH]; -	 -	error = FSRefMakePath(fsRef, (UInt8*) path, sizeof(path)); -	if (error == noErr) -		llString = path; +     +    boost::filesystem::path p(parent); +    p /= child; +     +    if (fullname) +        *fullname = std::string(p.string()); +     +    if (! boost::filesystem::create_directory(p)) +    { +        return (boost::filesystem::is_directory(p)); +    } +    return true;  }  // -------------------------------------------------------------------------------- @@ -109,35 +63,28 @@ static void FSRefToLLString(FSRef *fsRef, std::string &llString)  LLDir_Mac::LLDir_Mac()  {  	mDirDelimiter = "/"; -	mCurrentDirIndex = -1; -	mCurrentDirCount = -1; -	 -	CFBundleRef		mainBundleRef = NULL; -	CFURLRef		executableURLRef = NULL; -	CFStringRef		stringRef = NULL; -	OSStatus		error = noErr; -	FSRef			fileRef; -	CFStringRef		secondLifeString = CFSTR("SecondLife"); -	 -	mainBundleRef = CFBundleGetMainBundle(); -		 -	executableURLRef = CFBundleCopyExecutableURL(mainBundleRef); -	 -	if (executableURLRef != NULL) + +    const std::string     secondLifeString = "SecondLife"; +     +    std::string *executablepathstr = getSystemExecutableFolder(); + +    //NOTE:  LLINFOS/LLERRS will not output to log here.  The streams are not initialized. +     +	if (executablepathstr)  	{  		// mExecutablePathAndName -		CFURLRefToLLString(executableURLRef, mExecutablePathAndName, false); -		 -		// mExecutableFilename -		stringRef = CFURLCopyLastPathComponent(executableURLRef); -		CFStringRefToLLString(stringRef, mExecutableFilename, true); -		 -		// mExecutableDir -		CFURLRef	executableParentURLRef = CFURLCreateCopyDeletingLastPathComponent(NULL, executableURLRef); -		CFURLRefToLLString(executableParentURLRef, mExecutableDir, true); +		mExecutablePathAndName = *executablepathstr; +         +        boost::filesystem::path executablepath(*executablepathstr); +         +# ifndef BOOST_SYSTEM_NO_DEPRECATED +#endif +        mExecutableFilename = executablepath.filename().string(); +        mExecutableDir = executablepath.parent_path().string();  		// mAppRODataDir - +        std::string *resourcepath = getSystemResourceFolder(); +        mAppRODataDir = *resourcepath;  		// *NOTE: When running in a dev tree, use the copy of  		// skins in indra/newview/ rather than in the application bundle.  This @@ -146,10 +93,7 @@ LLDir_Mac::LLDir_Mac()  		// MBW -- This keeps the mac application from finding other things.  		// If this is really for skins, it should JUST apply to skins. - -		CFURLRef resourcesURLRef = CFBundleCopyResourcesDirectoryURL(mainBundleRef); -		CFURLRefToLLString(resourcesURLRef, mAppRODataDir, true); -		 +          		U32 build_dir_pos = mExecutableDir.rfind("/build-darwin-");  		if (build_dir_pos != std::string::npos)  		{ @@ -166,55 +110,50 @@ LLDir_Mac::LLDir_Mac()  		}  		// mOSUserDir -		error = FSFindFolder(kUserDomain, kApplicationSupportFolderType, true, &fileRef); -		if (error == noErr) -		{ -			FSRef	newFileRef; -			 -			// Create the directory -			error = CFCreateDirectory(&fileRef, secondLifeString, &newFileRef); -			if (error == noErr) -			{ -				// Save the full path to the folder -				FSRefToLLString(&newFileRef, mOSUserDir); -				 -				// Create our sub-dirs -				(void) CFCreateDirectory(&newFileRef, CFSTR("data"), NULL); -				//(void) CFCreateDirectory(&newFileRef, CFSTR("cache"), NULL); -				(void) CFCreateDirectory(&newFileRef, CFSTR("logs"), NULL); -				(void) CFCreateDirectory(&newFileRef, CFSTR("user_settings"), NULL); -				(void) CFCreateDirectory(&newFileRef, CFSTR("browser_profile"), NULL); -			} -		} -		 +        std::string *appdir = getSystemApplicationSupportFolder(); +        std::string rootdir; + +        //Create root directory +        if (CreateDirectory(*appdir, secondLifeString, &rootdir)) +        { +             +            // Save the full path to the folder +            mOSUserDir = rootdir; +             +            // Create our sub-dirs +            CreateDirectory(rootdir, std::string("data"), NULL); +            CreateDirectory(rootdir, std::string("logs"), NULL); +            CreateDirectory(rootdir, std::string("user_settings"), NULL); +            CreateDirectory(rootdir, std::string("browser_profile"), NULL); +        } +      		//mOSCacheDir -		FSRef cacheDirRef; -		error = FSFindFolder(kUserDomain, kCachedDataFolderType, true, &cacheDirRef); -		if (error == noErr) +        std::string *cachedir =  getSystemCacheFolder(); + +        if (cachedir) +		  		{ -			FSRefToLLString(&cacheDirRef, mOSCacheDir); -			(void)CFCreateDirectory(&cacheDirRef, CFSTR("SecondLife"),NULL); +            mOSCacheDir = *cachedir; +            //SPATTERS TODO:  This changes from ~/Library/Cache/Secondlife to ~/Library/Cache/com.app.secondlife/Secondlife.  Last dir level could go away. +            CreateDirectory(mOSCacheDir, secondLifeString, NULL);  		}  		// mOSUserAppDir  		mOSUserAppDir = mOSUserDir;  		// mTempDir -		error = FSFindFolder(kOnAppropriateDisk, kTemporaryFolderType, true, &fileRef); -		if (error == noErr) -		{ -			FSRef	tempRef; -			error = CFCreateDirectory(&fileRef, secondLifeString, &tempRef); -			if (error == noErr) -				FSRefToLLString(&tempRef, mTempDir); -		} +        //Aura 120920 boost::filesystem::temp_directory_path() not yet implemented on mac. :( +        std::string *tmpdir = getSystemTempFolder(); +        if (tmpdir) +        { +             +            CreateDirectory(*tmpdir, secondLifeString, &mTempDir); +            if (tmpdir) delete tmpdir; +        }  		mWorkingDir = getCurPath();  		mLLPluginDir = mAppRODataDir + mDirDelimiter + "llplugin"; -				 -		CFRelease(executableURLRef); -		executableURLRef = NULL;  	}  } @@ -235,52 +174,18 @@ void LLDir_Mac::initAppDirs(const std::string &app_name,  		mSkinBaseDir = mAppRODataDir + mDirDelimiter + "skins";  	}  	mCAFile = getExpandedFilename(LL_PATH_APP_SETTINGS, "CA.pem"); - -	//dumpCurrentDirectories(); -} - -U32 LLDir_Mac::countFilesInDir(const std::string &dirname, const std::string &mask) -{ -	U32 file_count = 0; -	glob_t g; - -	std::string tmp_str; -	tmp_str = dirname; -	tmp_str += mask; -	 -	if(glob(tmp_str.c_str(), GLOB_NOSORT, NULL, &g) == 0) -	{ -		file_count = g.gl_pathc; - -		globfree(&g); -	} - -	return (file_count);  }  std::string LLDir_Mac::getCurPath()  { -	char tmp_str[LL_MAX_PATH];	/* Flawfinder: ignore */  -	getcwd(tmp_str, LL_MAX_PATH); -	return tmp_str; +	return boost::filesystem::path( boost::filesystem::current_path() ).string();  } -BOOL LLDir_Mac::fileExists(const std::string &filename) const +bool LLDir_Mac::fileExists(const std::string &filename) const  { -	struct stat stat_data; -	// Check the age of the file -	// Now, we see if the files we've gathered are recent... -	int res = stat(filename.c_str(), &stat_data); -	if (!res) -	{ -		return TRUE; -	} -	else -	{ -		return FALSE; -	} +    return boost::filesystem::exists(filename);  } diff --git a/indra/llvfs/lldir_mac.h b/indra/llvfs/lldir_mac.h index 64e9485757..558727ebbc 100644 --- a/indra/llvfs/lldir_mac.h +++ b/indra/llvfs/lldir_mac.h @@ -45,16 +45,10 @@ public:  		const std::string& app_read_only_data_dir);  	virtual std::string getCurPath(); -	virtual U32 countFilesInDir(const std::string &dirname, const std::string &mask); -	virtual BOOL fileExists(const std::string &filename) const; +	virtual bool fileExists(const std::string &filename) const;  	/*virtual*/ std::string getLLPluginLauncher();  	/*virtual*/ std::string getLLPluginFilename(std::string base_name); - -private: -	int mCurrentDirIndex; -	int mCurrentDirCount; -	std::string mCurrentDir;  };  #endif // LL_LLDIR_MAC_H diff --git a/indra/llvfs/lldir_solaris.cpp b/indra/llvfs/lldir_solaris.cpp index 21f8c3acdb..a97d72d539 100644 --- a/indra/llvfs/lldir_solaris.cpp +++ b/indra/llvfs/lldir_solaris.cpp @@ -272,7 +272,7 @@ std::string LLDir_Solaris::getCurPath()  } -BOOL LLDir_Solaris::fileExists(const std::string &filename) const +bool LLDir_Solaris::fileExists(const std::string &filename) const  {  	struct stat stat_data;  	// Check the age of the file diff --git a/indra/llvfs/lldir_solaris.h b/indra/llvfs/lldir_solaris.h index 0b58a45b15..c6dac57e14 100644 --- a/indra/llvfs/lldir_solaris.h +++ b/indra/llvfs/lldir_solaris.h @@ -47,7 +47,7 @@ public:  	virtual std::string getCurPath();  	virtual U32 countFilesInDir(const std::string &dirname, const std::string &mask); -	/*virtual*/ BOOL fileExists(const std::string &filename) const; +	/*virtual*/ bool fileExists(const std::string &filename) const;  private:  	DIR *mDirp; diff --git a/indra/llvfs/lldir_win32.cpp b/indra/llvfs/lldir_win32.cpp index 7709945123..462d1cce06 100644 --- a/indra/llvfs/lldir_win32.cpp +++ b/indra/llvfs/lldir_win32.cpp @@ -249,7 +249,7 @@ std::string LLDir_Win32::getCurPath()  } -BOOL LLDir_Win32::fileExists(const std::string &filename) const +bool LLDir_Win32::fileExists(const std::string &filename) const  {  	llstat stat_data;  	// Check the age of the file diff --git a/indra/llvfs/lldir_win32.h b/indra/llvfs/lldir_win32.h index 62fb4713ab..450efaf9da 100644 --- a/indra/llvfs/lldir_win32.h +++ b/indra/llvfs/lldir_win32.h @@ -44,7 +44,7 @@ public:  	/*virtual*/ std::string getCurPath();  	/*virtual*/ U32 countFilesInDir(const std::string &dirname, const std::string &mask); -	/*virtual*/ BOOL fileExists(const std::string &filename) const; +	/*virtual*/ bool fileExists(const std::string &filename) const;  	/*virtual*/ std::string getLLPluginLauncher();  	/*virtual*/ std::string getLLPluginFilename(std::string base_name); diff --git a/indra/llvfs/llvfs_objc.h b/indra/llvfs/llvfs_objc.h new file mode 100644 index 0000000000..90101eb2e9 --- /dev/null +++ b/indra/llvfs/llvfs_objc.h @@ -0,0 +1,43 @@ +/**  + * @file llvfs_objc.h + * @brief Definition of directory utilities class for Mac OS X + * + * $LicenseInfo:firstyear=2000&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2010, Linden Research, Inc. + *  + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; + * version 2.1 of the License only. + *  + * This library 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 for more details. + *  + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA + *  + * Linden Research, Inc., 945 Battery Street, San Francisco, CA  94111  USA + * $/LicenseInfo$ + */  + +#if !LL_DARWIN +#error This header must not be included when compiling for any target other than Mac OS. Consider including lldir.h instead. +#endif // !LL_DARWIN + +#ifndef LL_LLVFS_OBJC_H +#define LL_LLVFS_OBJC_H + +#include <iostream> + +std::string* getSystemTempFolder(); +std::string* getSystemCacheFolder(); +std::string* getSystemApplicationSupportFolder(); +std::string* getSystemResourceFolder(); +std::string* getSystemExecutableFolder(); + + +#endif LL_LLVFS_OBJC_H diff --git a/indra/llvfs/llvfs_objc.mm b/indra/llvfs/llvfs_objc.mm new file mode 100644 index 0000000000..4f9e2f81e9 --- /dev/null +++ b/indra/llvfs/llvfs_objc.mm @@ -0,0 +1,108 @@ +/**  + * @file llvfs_objc.cpp + * @brief Cocoa implementation of directory utilities for Mac OS X + * + * $LicenseInfo:firstyear=2002&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2010, Linden Research, Inc. + *  + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; + * version 2.1 of the License only. + *  + * This library 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 for more details. + *  + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA + *  + * Linden Research, Inc., 945 Battery Street, San Francisco, CA  94111  USA + * $/LicenseInfo$ + */  +#if LL_DARWIN + +//WARNING:  This file CANNOT use standard linden includes due to conflicts between definitions of BOOL + +#include "llvfs_objc.h" +#import <Cocoa/Cocoa.h> + +std::string* getSystemTempFolder() +{ +    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; +    NSString * tempDir = NSTemporaryDirectory(); +    if (tempDir == nil) +        tempDir = @"/tmp"; +    std::string *result = ( new std::string([tempDir UTF8String]) ); +    [pool release]; +     +    return result; +} + +//findSystemDirectory scoped exclusively to this file.  +std::string* findSystemDirectory(NSSearchPathDirectory searchPathDirectory, +                                   NSSearchPathDomainMask domainMask) +{ +    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; +     +    std::string *result; +    NSString *path = nil; +     +    // Search for the path +    NSArray* paths = NSSearchPathForDirectoriesInDomains(searchPathDirectory, +                                                         domainMask, +                                                         YES); +    if ([paths count]) +    { +        path = [paths objectAtIndex:0]; +        //SPATTERS HACK:  Always attempt to create directory, ignore errors. +        NSError *error = nil; + +        [[NSFileManager defaultManager] createDirectoryAtPath:path withIntermediateDirectories:YES attributes:nil error:&error]; + +         +        result = new std::string([path UTF8String]);         +    } +    [pool release]; +    return result; +} + +std::string* getSystemExecutableFolder() +{ +    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; + +    NSString *bundlePath = [[NSBundle mainBundle] executablePath]; +    std::string *result = (new std::string([bundlePath UTF8String]));   +    [pool release]; + +    return result; +} + +std::string* getSystemResourceFolder() +{ +    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; + +    NSString *bundlePath = [[NSBundle mainBundle] resourcePath]; +    std::string *result = (new std::string([bundlePath UTF8String])); +    [pool release]; +     +    return result; +} + +std::string* getSystemCacheFolder() +{ +    return findSystemDirectory (NSCachesDirectory, +                                NSUserDomainMask); +} + +std::string* getSystemApplicationSupportFolder() +{ +    return findSystemDirectory (NSApplicationSupportDirectory, +                                NSUserDomainMask); +     +} + +#endif // LL_DARWIN diff --git a/indra/llvfs/tests/lldir_test.cpp b/indra/llvfs/tests/lldir_test.cpp index 323f876c12..3cff622a4b 100644 --- a/indra/llvfs/tests/lldir_test.cpp +++ b/indra/llvfs/tests/lldir_test.cpp @@ -134,7 +134,7 @@ struct LLDir_Dummy: public LLDir          return 0;      } -    virtual BOOL fileExists(const std::string& pathname) const +    virtual bool fileExists(const std::string& pathname) const      {          // Record fileExists() calls so we can check whether caching is          // working right. Certain LLDir calls should be able to make decisions | 
