Apple directory helpers
- drop use of deprecated FSFindFolder (use NSFileManager) - support Downloads and Pictures directories
This commit is contained in:
parent
c54b1e037a
commit
0f5cbc35a2
@ -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)
|
||||||
|
41
simgear/misc/CocoaHelpers.mm
Normal file
41
simgear/misc/CocoaHelpers.mm
Normal 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());
|
||||||
|
}
|
@ -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");
|
||||||
|
Loading…
Reference in New Issue
Block a user