Commits

obscurestar committed 3f23e65

Ported slplugin and some other missing components for cocoa.

Comments (0)

Files changed (16)

indra/llplugin/slplugin/CMakeLists.txt

 
 if (DARWIN)
     include(CMakeFindFrameworks)
-    find_library(CARBON_LIBRARY Carbon)
     find_library(COCOA_LIBRARY Cocoa)
 endif (DARWIN)
 
 
 if (DARWIN)
   # Mac version needs to link against Carbon
-  target_link_libraries(SLPlugin ${CARBON_LIBRARY} ${COCOA_LIBRARY})
+  target_link_libraries(SLPlugin ${COCOA_LIBRARY})
   # Make sure the app bundle has a Resources directory (it will get populated by viewer-manifest.py later)
   add_custom_command(
     TARGET SLPlugin POST_BUILD

indra/llplugin/slplugin/slplugin-objc.h

  * @endcond
  */
 
+//Protos for ObjectiveC classes (cannot import cocoa here due to BOOL conflict)
+class NSWindow;
 
 /* Defined in slplugin-objc.mm: */
-void setupCocoa();
-void createAutoReleasePool();
-void deleteAutoReleasePool();
+
+class LLCocoaPlugin
+{
+public:  
+    LLCocoaPlugin();
+    void setupCocoa();
+    void createAutoReleasePool();
+    void deleteAutoReleasePool();
+    void setupGroup();
+    void updateWindows();
+    void processEvents();
+public:
+    //EventTargetRef mEventTarget;
+    NSWindow* mFrontWindow;
+    NSWindow* mPluginWindow;
+    int mHackState;
+};

indra/llplugin/slplugin/slplugin-objc.mm

 
 
 #include <AppKit/AppKit.h>
+#import <Cocoa/Cocoa.h>
 
 #include "slplugin-objc.h"
 
+//Note: NSApp is a global defined by cocoa which is an id to the application.
 
-void setupCocoa()
+void LLCocoaPlugin::setupCocoa()
 {
 	static bool inited = false;
 	
 		//	Must first call [[[NSWindow alloc] init] release] to get the NSWindow machinery set up so that NSCursor can use a window to cache the cursor image
 		[[[NSWindow alloc] init] release];
 		
+        mPluginWindow = [NSApp mainWindow];
+        
 		deleteAutoReleasePool();
 		
 		inited = true;
 
 static NSAutoreleasePool *sPool = NULL;
 
-void createAutoReleasePool()
+void LLCocoaPlugin::createAutoReleasePool()
 {
 	if(!sPool)
 	{
 	}
 }
 
-void deleteAutoReleasePool()
+void LLCocoaPlugin::deleteAutoReleasePool()
 {
 	if(sPool)
 	{
 		sPool = NULL;
 	}
 }
+
+LLCocoaPlugin::LLCocoaPlugin():mHackState(0)
+{
+    NSArray* window_list = [NSApp orderedWindows];
+    mFrontWindow = [window_list objectAtIndex:0];
+}
+
+void LLCocoaPlugin::processEvents()
+{
+     // Some plugins (webkit at least) will want an event loop.  This qualifies.
+    NSEvent * event;
+    event = [NSApp nextEventMatchingMask:NSAnyEventMask untilDate:[NSDate distantPast] inMode:NSDefaultRunLoopMode dequeue:YES];
+    [NSApp sendEvent: event];
+}
+
+
+//Turns out the window ordering stuff never gets hit with any of the current plugins.
+//Leaving the following code here 'just in case' for the time being.
+
+void LLCocoaPlugin::setupGroup()
+{
+    //    CreateWindowGroup(kWindowGroupAttrFixedLevel, &layer_group);
+    //    if(layer_group)
+    //    {
+    //        // Start out with a window layer that's way out in front (fixes the problem with the menubar not getting hidden on first switch to fullscreen youtube)
+    //        SetWindowGroupName(layer_group, CFSTR("SLPlugin Layer"));
+    //        SetWindowGroupLevel(layer_group, kCGOverlayWindowLevel);		
+    //    }
+    
+}
+
+void LLCocoaPlugin::updateWindows()  //SPATTERS give this a better name.
+{
+//    NSArray* window_list = [NSApp orderedWindows];
+//    NSWindow* current_window = [window_list objectAtIndex:0];
+//    NSWindow* parent_window = [ current_window parentWindow ];
+//    bool this_is_front_process = false;
+//    bool parent_is_front_process = false;
+//
+//    
+//    // Check for a change in this process's frontmost window.
+//    if ( current_window != mFrontWindow )
+//    {
+//        // and figure out whether this process or its parent are currently frontmost
+//        if ( current_window == parent_window ) parent_is_front_process = true;
+//        if ( current_window == mPluginWindow ) this_is_front_process = true;
+//    
+//        if (current_window != NULL && mFrontWindow == NULL)
+//        {
+//            // Opening the first window
+//            
+//            if(mHackState == 0)
+//            {
+//                // Next time through the event loop, lower the window group layer
+//                mHackState = 1;
+//            }
+//            
+//            if(parent_is_front_process)
+//            {
+//                // Bring this process's windows to the front.
+//                [mPluginWindow makeKeyAndOrderFront:NSApp];
+//                [mPluginWindow setOrderedIndex:0];
+//            }
+//            
+//            [NSApp activateIgnoringOtherApps:YES];
+//        }
+//        
+//        else if (( current_window == NULL) && (mFrontWindow != NULL))
+//        {
+//            // Closing the last window
+//            
+//            if(this_is_front_process)
+//            {
+//                // Try to bring this process's parent to the front
+//                [parent_window makeKeyAndOrderFront:NSApp];
+//                [parent_window setOrderedIndex:0];
+//            }
+//        }
+//        else if(mHackState == 1)
+//        {
+////            if(layer_group)
+////            {
+////                // Set the window group level back to something less extreme
+////                SetWindowGroupLevel(layer_group, kCGNormalWindowLevel);
+////            }
+//            mHackState = 2;
+//        }
+//        
+//        mFrontWindow = [window_list objectAtIndex:0];
+//    }
+ }

indra/llplugin/slplugin/slplugin.cpp

 #include "llapr.h"
 #include "llstring.h"
 
+#include <iostream>
+#include <fstream>
+using namespace std;
+
+
 #if LL_DARWIN
-	#include <Carbon/Carbon.h>
 	#include "slplugin-objc.h"
 #endif
 
 int main(int argc, char **argv)
 #endif
 {
+
 	ll_init_apr();
 
 	// Set up llerror logging
 
 	// Catch signals that most kinds of crashes will generate, and exit cleanly so the system crash dialog isn't shown.
 	signal(SIGILL, &crash_handler);		// illegal instruction
-# if LL_DARWIN
-	signal(SIGEMT, &crash_handler);		// emulate instruction executed
-# endif // LL_DARWIN
 	signal(SIGFPE, &crash_handler);		// floating-point exception
 	signal(SIGBUS, &crash_handler);		// bus error
 	signal(SIGSEGV, &crash_handler);	// segmentation violation
 	signal(SIGSYS, &crash_handler);		// non-existent system call invoked
 #endif
+# if LL_DARWIN
+	signal(SIGEMT, &crash_handler);		// emulate instruction executed
 
-#if LL_DARWIN
-	setupCocoa();
-	createAutoReleasePool();
-#endif
+    LLCocoaPlugin cocoa_interface;
+	cocoa_interface.setupCocoa();
+	cocoa_interface.createAutoReleasePool();
+#endif //LL_DARWIN
 
 	LLPluginProcessChild *plugin = new LLPluginProcessChild();
 
 	plugin->init(port);
 
 #if LL_DARWIN
-		deleteAutoReleasePool();
+    cocoa_interface.deleteAutoReleasePool();
 #endif
 
 	LLTimer timer;
 #endif
 
 #if LL_DARWIN
+    
 	// If the plugin opens a new window (such as the Flash plugin's fullscreen player), we may need to bring this plugin process to the foreground.
 	// Use this to track the current frontmost window and bring this process to the front if it changes.
-	WindowRef front_window = NULL;
-	WindowGroupRef layer_group = NULL;
-	int window_hack_state = 0;
-	CreateWindowGroup(kWindowGroupAttrFixedLevel, &layer_group);
-	if(layer_group)
-	{
-		// Start out with a window layer that's way out in front (fixes the problem with the menubar not getting hidden on first switch to fullscreen youtube)
-		SetWindowGroupName(layer_group, CFSTR("SLPlugin Layer"));
-		SetWindowGroupLevel(layer_group, kCGOverlayWindowLevel);		
-	}
-#endif
-
-#if LL_DARWIN
-	EventTargetRef event_target = GetEventDispatcherTarget();
+ //   cocoa_interface.mEventTarget = GetEventDispatcherTarget();
 #endif
 	while(!plugin->isDone())
 	{
 #if LL_DARWIN
-		createAutoReleasePool();
+		cocoa_interface.createAutoReleasePool();
 #endif
 		timer.reset();
 		plugin->idle();
 #if LL_DARWIN
 		{
-			// Some plugins (webkit at least) will want an event loop.  This qualifies.
-			EventRef event;
-			if(ReceiveNextEvent(0, 0, kEventDurationNoWait, true, &event) == noErr)
-			{
-				SendEventToEventTarget (event, event_target);
-				ReleaseEvent(event);
-			}
-			
-			// Check for a change in this process's frontmost window.
-			if(GetFrontWindowOfClass(kAllWindowClasses, true) != front_window)
-			{
-				ProcessSerialNumber self = { 0, kCurrentProcess };
-				ProcessSerialNumber parent = { 0, kNoProcess };
-				ProcessSerialNumber front = { 0, kNoProcess };
-				Boolean this_is_front_process = false;
-				Boolean parent_is_front_process = false;
-				{
-					// Get this process's parent
-					ProcessInfoRec info;
-					info.processInfoLength = sizeof(ProcessInfoRec);
-					info.processName = NULL;
-					info.processAppSpec = NULL;
-					if(GetProcessInformation( &self, &info ) == noErr)
-					{
-						parent = info.processLauncher;
-					}
-					
-					// and figure out whether this process or its parent are currently frontmost
-					if(GetFrontProcess(&front) == noErr)
-					{
-						(void) SameProcess(&self, &front, &this_is_front_process);
-						(void) SameProcess(&parent, &front, &parent_is_front_process);
-					}
-				}
-								
-				if((GetFrontWindowOfClass(kAllWindowClasses, true) != NULL) && (front_window == NULL))
-				{
-					// Opening the first window
-					
-					if(window_hack_state == 0)
-					{
-						// Next time through the event loop, lower the window group layer
-						window_hack_state = 1;
-					}
-
-					if(layer_group)
-					{
-						SetWindowGroup(GetFrontWindowOfClass(kAllWindowClasses, true), layer_group);
-					}
-					
-					if(parent_is_front_process)
-					{
-						// Bring this process's windows to the front.
-						(void) SetFrontProcess( &self );
-					}
-
-					ActivateWindow(GetFrontWindowOfClass(kAllWindowClasses, true), true);
-				}
-				else if((GetFrontWindowOfClass(kAllWindowClasses, true) == NULL) && (front_window != NULL))
-				{
-					// Closing the last window
-					
-					if(this_is_front_process)
-					{
-						// Try to bring this process's parent to the front
-						(void) SetFrontProcess(&parent);
-					}
-				}
-				else if(window_hack_state == 1)
-				{
-					if(layer_group)
-					{
-						// Set the window group level back to something less extreme
-						SetWindowGroupLevel(layer_group, kCGNormalWindowLevel);
-					}
-					window_hack_state = 2;
-				}
-
-				front_window = GetFrontWindowOfClass(kAllWindowClasses, true);
-
-			}
-		}
+			cocoa_interface.processEvents();
+        }
 #endif
 		F64 elapsed = timer.getElapsedTimeF64();
 		F64 remaining = plugin->getSleepTime() - elapsed;
 
 //			LL_INFOS("slplugin") << "slept for "<< timer.getElapsedTimeF64() * 1000.0f << " ms" <<  LL_ENDL;
 		}
-
+        
+        
 #if LL_WINDOWS
 	// More agressive checking of interfering exception handlers.
 	// Doesn't appear to be required so far - even for plugins
 #endif
 
 #if LL_DARWIN
-		deleteAutoReleasePool();
+		cocoa_interface.deleteAutoReleasePool();
 #endif
 	}
-
 	delete plugin;
 
 	ll_cleanup_apr();
 
+
 	return 0;
 }
 

indra/llvfs/CMakeLists.txt

 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)
 
 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)
 
 

indra/llvfs/lldir.h

-/** 
+/**  
  * @file lldir.h
  * @brief Definition of directory utilities class
  *
 	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;

indra/llvfs/lldir_linux.cpp

 }
 
 
-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

indra/llvfs/lldir_linux.h

 
 	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);

indra/llvfs/lldir_mac.cpp

  * 
  * Linden Research, Inc., 945 Battery Street, San Francisco, CA  94111  USA
  * $/LicenseInfo$
- */
+ */ 
 
 #if LL_DARWIN
 
 #include <sys/stat.h>
 #include <unistd.h>
 #include <glob.h>
-
-#include <Carbon/Carbon.h>
+#include <boost/filesystem.hpp>
+#include "llvfs_objc.h"
 
 // --------------------------------------------------------------------------------
 
-static OSStatus CFCreateDirectory(FSRef	*parentRef, CFStringRef name, FSRef *newRef)
+static bool CreateDirectory(const std::string &parent, 
+                            const std::string &child,
+                            std::string *fullname)
 {
-	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;
-}
-
-// --------------------------------------------------------------------------------
-
-static void CFStringRefToLLString(CFStringRef stringRef, std::string &llString, bool releaseWhenDone)
-{
-	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;
 }
 
 // --------------------------------------------------------------------------------
 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);
+        
+        mExecutableFilename = executablepath.filename();
+        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
 		
 		// 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)
 		{
 		}
 		
 		// mOSUserDir
-		error = FSFindFolder(kUserDomain, kApplicationSupportFolderType, true, &fileRef);
-		if (error == noErr)
+        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
+        std::string *cachedir =  getSystemCacheFolder();
+
+        if (cachedir)
+		
 		{
-			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);
-			}
-		}
-		
-		//mOSCacheDir
-		FSRef cacheDirRef;
-		error = FSFindFolder(kUserDomain, kCachedDataFolderType, true, &cacheDirRef);
-		if (error == noErr)
-		{
-			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;
 	}
 }
 
 		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);
 }
 
 

indra/llvfs/lldir_mac.h

  * 
  * 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.
 		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

indra/llvfs/lldir_solaris.cpp

 }
 
 
-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

indra/llvfs/lldir_solaris.h

 
 	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;

indra/llvfs/lldir_win32.cpp

 }
 
 
-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

indra/llvfs/lldir_win32.h

 
 	/*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);

indra/newview/tests/lldir_stub.cpp

 	/*virtual*/ U32 countFilesInDir(const std::string &dirname, const std::string &mask) { return 42; }
 	/*virtual*/ BOOL getNextFileInDir(const std::string &dirname, const std::string &mask, std::string &fname, BOOL wrap) { fname = fname + "_NEXT"; return false; }
 	/*virtual*/ void getRandomFileInDir(const std::string &dirname, const std::string &mask, std::string &fname) { fname = "RANDOM_FILE"; }
-	/*virtual*/ BOOL fileExists(const std::string &filename) const { return false; }
+	/*virtual*/ bool fileExists(const std::string &filename) const { return false; }
 };
 
 LLDir_stub gDirUtil;

indra/viewer_components/updater/tests/llupdaterservice_test.cpp

 							const std::string &mask, 
 							std::string &fname) {}
 	std::string getCurPath() { return ""; }
-	BOOL fileExists(const std::string &filename) const { return false; }
+	bool fileExists(const std::string &filename) const { return false; }
 	std::string getLLPluginLauncher() { return ""; }
 	std::string getLLPluginFilename(std::string base_name) { return ""; }