diff --git a/simgear/misc/CMakeLists.txt b/simgear/misc/CMakeLists.txt index 89a2f6ad..16e74bbd 100644 --- a/simgear/misc/CMakeLists.txt +++ b/simgear/misc/CMakeLists.txt @@ -33,6 +33,10 @@ set(SOURCES gzcontainerfile.cxx ) +if (APPLE) + list(APPEND SOURCES CocoaHelpers.mm) +endif() + simgear_component(misc misc "${SOURCES}" "${HEADERS}") if(ENABLE_TESTS) diff --git a/simgear/misc/CocoaHelpers.mm b/simgear/misc/CocoaHelpers.mm new file mode 100644 index 00000000..028ccfb7 --- /dev/null +++ b/simgear/misc/CocoaHelpers.mm @@ -0,0 +1,41 @@ +#include +#include + +#include + +namespace { + +class CocoaAutoreleasePool +{ +public: + CocoaAutoreleasePool() + { + pool = [[NSAutoreleasePool alloc] init]; + } + + ~CocoaAutoreleasePool() + { + [pool release]; + } + +private: + NSAutoreleasePool* pool; +}; + +} // of anonyous namespace + +SGPath appleSpecialFolder(int dirType, int domainMask, const SGPath& def) +{ + CocoaAutoreleasePool ap; + NSFileManager* fm = [NSFileManager defaultManager]; + NSURL* pathUrl = [fm URLForDirectory:dirType + inDomain:domainMask + appropriateForURL:Nil + create:YES + error:nil]; + if (!pathUrl) { + return def;; + } + + return SGPath([[pathUrl path] UTF8String], def.getPermissionChecker()); +} \ No newline at end of file diff --git a/simgear/misc/sg_path.cxx b/simgear/misc/sg_path.cxx index befb41a2..3c6e5b6b 100644 --- a/simgear/misc/sg_path.cxx +++ b/simgear/misc/sg_path.cxx @@ -81,22 +81,10 @@ static SGPath pathForCSIDL(int csidl, const SGPath& def) return def; } #elif __APPLE__ -#include -//------------------------------------------------------------------------------ -static SGPath appleSpecialFolder(OSType type, const SGPath& def) -{ - FSRef ref; - OSErr err = FSFindFolder(kUserDomain, kDesktopFolderType, false, &ref); - if( err ) - return def; +// defined in CocoaHelpers.mm +SGPath appleSpecialFolder(int dirType, int domainMask, const SGPath& def); - unsigned char path[1024]; - if( FSRefMakePath(&ref, path, 1024) != noErr ) - return def; - - return SGPath((const char*) path, def.getPermissionChecker()); -} #else static SGPath getXDGDir( const std::string& name, const SGPath& def, @@ -728,16 +716,16 @@ SGPath SGPath::standardLocation(StandardLocation type, const SGPath& def) case PICTURES: return pathForCSIDL(CSIDL_MYPICTURES, def); #elif __APPLE__ + // since this is C++, we can't include NSPathUtilities.h to access the enum + // values, so hard-coding them here (they are stable, don't worry) case DOWNLOADS: - if( !def.isNull() ) - return def; - // There is no special downloads folder -> just use the desktop + return appleSpecialFolder(15, 1, def); case DESKTOP: - return appleSpecialFolder(kDesktopFolderType, def); + return appleSpecialFolder(12, 1, def); case DOCUMENTS: - return appleSpecialFolder(kDocumentsFolderType, def); + return appleSpecialFolder(9, 1, def); case PICTURES: - return appleSpecialFolder(kPictureDocumentsFolderType, def); + return appleSpecialFolder(19, 1, def); #else case DESKTOP: return getXDGDir("DESKTOP", def, "Desktop");