Apple directory helpers

- drop use of deprecated FSFindFolder (use NSFileManager)
- support Downloads and Pictures directories
This commit is contained in:
James Turner 2014-01-28 11:16:19 +00:00
parent c54b1e037a
commit 0f5cbc35a2
3 changed files with 53 additions and 20 deletions

View File

@ -33,6 +33,10 @@ set(SOURCES
gzcontainerfile.cxx gzcontainerfile.cxx
) )
if (APPLE)
list(APPEND SOURCES CocoaHelpers.mm)
endif()
simgear_component(misc misc "${SOURCES}" "${HEADERS}") simgear_component(misc misc "${SOURCES}" "${HEADERS}")
if(ENABLE_TESTS) if(ENABLE_TESTS)

View File

@ -0,0 +1,41 @@
#include <Cocoa/Cocoa.h>
#include <Foundation/NSAutoreleasePool.h>
#include <simgear/misc/sg_path.hxx>
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());
}

View File

@ -81,22 +81,10 @@ static SGPath pathForCSIDL(int csidl, const SGPath& def)
return def; return def;
} }
#elif __APPLE__ #elif __APPLE__
#include <CoreServices/CoreServices.h>
//------------------------------------------------------------------------------ // defined in CocoaHelpers.mm
static SGPath appleSpecialFolder(OSType type, const SGPath& def) SGPath appleSpecialFolder(int dirType, int domainMask, const SGPath& def);
{
FSRef ref;
OSErr err = FSFindFolder(kUserDomain, kDesktopFolderType, false, &ref);
if( err )
return def;
unsigned char path[1024];
if( FSRefMakePath(&ref, path, 1024) != noErr )
return def;
return SGPath((const char*) path, def.getPermissionChecker());
}
#else #else
static SGPath getXDGDir( const std::string& name, static SGPath getXDGDir( const std::string& name,
const SGPath& def, const SGPath& def,
@ -728,16 +716,16 @@ SGPath SGPath::standardLocation(StandardLocation type, const SGPath& def)
case PICTURES: case PICTURES:
return pathForCSIDL(CSIDL_MYPICTURES, def); return pathForCSIDL(CSIDL_MYPICTURES, def);
#elif __APPLE__ #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: case DOWNLOADS:
if( !def.isNull() ) return appleSpecialFolder(15, 1, def);
return def;
// There is no special downloads folder -> just use the desktop
case DESKTOP: case DESKTOP:
return appleSpecialFolder(kDesktopFolderType, def); return appleSpecialFolder(12, 1, def);
case DOCUMENTS: case DOCUMENTS:
return appleSpecialFolder(kDocumentsFolderType, def); return appleSpecialFolder(9, 1, def);
case PICTURES: case PICTURES:
return appleSpecialFolder(kPictureDocumentsFolderType, def); return appleSpecialFolder(19, 1, def);
#else #else
case DESKTOP: case DESKTOP:
return getXDGDir("DESKTOP", def, "Desktop"); return getXDGDir("DESKTOP", def, "Desktop");