diff -r 1853628ae285 -r a65e9bcf0a03 misc/libphysfs/src/platform_macosx.c --- a/misc/libphysfs/src/platform_macosx.c Fri Feb 22 05:15:48 2013 +0100 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,326 +0,0 @@ -/* - * Mac OS X support routines for PhysicsFS. - * - * Please see the file LICENSE.txt in the source's root directory. - * - * This file written by Ryan C. Gordon. - */ - -#define __PHYSICSFS_INTERNAL__ -#include "physfs_platforms.h" - -#ifdef PHYSFS_PLATFORM_MACOSX - -#include - -#if !defined(PHYSFS_NO_CDROM_SUPPORT) -#include /* !!! FIXME */ -#include -#include -#include -#include -#endif - -/* Seems to get defined in some system header... */ -#ifdef Free -#undef Free -#endif - -#include "physfs_internal.h" - - -/* Wrap PHYSFS_Allocator in a CFAllocator... */ -static CFAllocatorRef cfallocator = NULL; - -static CFStringRef cfallocDesc(const void *info) -{ - return CFStringCreateWithCString(cfallocator, "PhysicsFS", - kCFStringEncodingASCII); -} /* cfallocDesc */ - - -static void *cfallocMalloc(CFIndex allocSize, CFOptionFlags hint, void *info) -{ - return allocator.Malloc(allocSize); -} /* cfallocMalloc */ - - -static void cfallocFree(void *ptr, void *info) -{ - allocator.Free(ptr); -} /* cfallocFree */ - - -static void *cfallocRealloc(void *ptr, CFIndex newsize, - CFOptionFlags hint, void *info) -{ - if ((ptr == NULL) || (newsize <= 0)) - return NULL; /* ADC docs say you should always return NULL here. */ - return allocator.Realloc(ptr, newsize); -} /* cfallocRealloc */ - - -int __PHYSFS_platformInit(void) -{ - /* set up a CFAllocator, so Carbon can use the physfs allocator, too. */ - CFAllocatorContext ctx; - memset(&ctx, '\0', sizeof (ctx)); - ctx.copyDescription = cfallocDesc; - ctx.allocate = cfallocMalloc; - ctx.reallocate = cfallocRealloc; - ctx.deallocate = cfallocFree; - cfallocator = CFAllocatorCreate(kCFAllocatorUseContext, &ctx); - BAIL_IF_MACRO(!cfallocator, PHYSFS_ERR_OUT_OF_MEMORY, 0); - return 1; /* success. */ -} /* __PHYSFS_platformInit */ - - -int __PHYSFS_platformDeinit(void) -{ - CFRelease(cfallocator); - cfallocator = NULL; - return 1; /* always succeed. */ -} /* __PHYSFS_platformDeinit */ - - - -/* CD-ROM detection code... */ - -/* - * Code based on sample from Apple Developer Connection: - * http://developer.apple.com/samplecode/Sample_Code/Devices_and_Hardware/Disks/VolumeToBSDNode/VolumeToBSDNode.c.htm - */ - -#if !defined(PHYSFS_NO_CDROM_SUPPORT) - -static int darwinIsWholeMedia(io_service_t service) -{ - int retval = 0; - CFTypeRef wholeMedia; - - if (!IOObjectConformsTo(service, kIOMediaClass)) - return 0; - - wholeMedia = IORegistryEntryCreateCFProperty(service, - CFSTR(kIOMediaWholeKey), - cfallocator, 0); - if (wholeMedia == NULL) - return 0; - - retval = CFBooleanGetValue(wholeMedia); - CFRelease(wholeMedia); - - return retval; -} /* darwinIsWholeMedia */ - - -static int darwinIsMountedDisc(char *bsdName, mach_port_t masterPort) -{ - int retval = 0; - CFMutableDictionaryRef matchingDict; - kern_return_t rc; - io_iterator_t iter; - io_service_t service; - - if ((matchingDict = IOBSDNameMatching(masterPort, 0, bsdName)) == NULL) - return 0; - - rc = IOServiceGetMatchingServices(masterPort, matchingDict, &iter); - if ((rc != KERN_SUCCESS) || (!iter)) - return 0; - - service = IOIteratorNext(iter); - IOObjectRelease(iter); - if (!service) - return 0; - - rc = IORegistryEntryCreateIterator(service, kIOServicePlane, - kIORegistryIterateRecursively | kIORegistryIterateParents, &iter); - - if (!iter) - return 0; - - if (rc != KERN_SUCCESS) - { - IOObjectRelease(iter); - return 0; - } /* if */ - - IOObjectRetain(service); /* add an extra object reference... */ - - do - { - if (darwinIsWholeMedia(service)) - { - if ( (IOObjectConformsTo(service, kIOCDMediaClass)) || - (IOObjectConformsTo(service, kIODVDMediaClass)) ) - { - retval = 1; - } /* if */ - } /* if */ - IOObjectRelease(service); - } while ((service = IOIteratorNext(iter)) && (!retval)); - - IOObjectRelease(iter); - IOObjectRelease(service); - - return retval; -} /* darwinIsMountedDisc */ - -#endif /* !defined(PHYSFS_NO_CDROM_SUPPORT) */ - - -void __PHYSFS_platformDetectAvailableCDs(PHYSFS_StringCallback cb, void *data) -{ -#if !defined(PHYSFS_NO_CDROM_SUPPORT) - const char *devPrefix = "/dev/"; - const int prefixLen = strlen(devPrefix); - mach_port_t masterPort = 0; - struct statfs *mntbufp; - int i, mounts; - - if (IOMasterPort(MACH_PORT_NULL, &masterPort) != KERN_SUCCESS) - BAIL_MACRO(PHYSFS_ERR_OS_ERROR, ) /*return void*/; - - mounts = getmntinfo(&mntbufp, MNT_WAIT); /* NOT THREAD SAFE! */ - for (i = 0; i < mounts; i++) - { - char *dev = mntbufp[i].f_mntfromname; - char *mnt = mntbufp[i].f_mntonname; - if (strncmp(dev, devPrefix, prefixLen) != 0) /* a virtual device? */ - continue; - - dev += prefixLen; - if (darwinIsMountedDisc(dev, masterPort)) - cb(data, mnt); - } /* for */ -#endif /* !defined(PHYSFS_NO_CDROM_SUPPORT) */ -} /* __PHYSFS_platformDetectAvailableCDs */ - - -static char *convertCFString(CFStringRef cfstr) -{ - CFIndex len = CFStringGetMaximumSizeForEncoding(CFStringGetLength(cfstr), - kCFStringEncodingUTF8) + 1; - char *retval = (char *) allocator.Malloc(len); - BAIL_IF_MACRO(!retval, PHYSFS_ERR_OUT_OF_MEMORY, NULL); - - if (CFStringGetCString(cfstr, retval, len, kCFStringEncodingUTF8)) - { - /* shrink overallocated buffer if possible... */ - CFIndex newlen = strlen(retval) + 1; - if (newlen < len) - { - void *ptr = allocator.Realloc(retval, newlen); - if (ptr != NULL) - retval = (char *) ptr; - } /* if */ - } /* if */ - - else /* probably shouldn't fail, but just in case... */ - { - allocator.Free(retval); - BAIL_MACRO(PHYSFS_ERR_OUT_OF_MEMORY, NULL); - } /* else */ - - return retval; -} /* convertCFString */ - - -char *__PHYSFS_platformCalcBaseDir(const char *argv0) -{ - CFURLRef cfurl = NULL; - CFStringRef cfstr = NULL; - CFMutableStringRef cfmutstr = NULL; - char *retval = NULL; - - cfurl = CFBundleCopyBundleURL(CFBundleGetMainBundle()); - BAIL_IF_MACRO(cfurl == NULL, PHYSFS_ERR_OS_ERROR, NULL); - cfstr = CFURLCopyFileSystemPath(cfurl, kCFURLPOSIXPathStyle); - CFRelease(cfurl); - BAIL_IF_MACRO(!cfstr, PHYSFS_ERR_OUT_OF_MEMORY, NULL); - cfmutstr = CFStringCreateMutableCopy(cfallocator, 0, cfstr); - CFRelease(cfstr); - BAIL_IF_MACRO(!cfmutstr, PHYSFS_ERR_OUT_OF_MEMORY, NULL); - CFStringAppendCString(cfmutstr, "/", kCFStringEncodingUTF8); - retval = convertCFString(cfmutstr); - CFRelease(cfmutstr); - - return retval; /* whew. */ -} /* __PHYSFS_platformCalcBaseDir */ - - -char *__PHYSFS_platformCalcPrefDir(const char *org, const char *app) -{ - /* !!! FIXME: there's a real API to determine this */ - const char *userdir = __PHYSFS_getUserDir(); - const char *append = "Library/Application Support/"; - const size_t len = strlen(userdir) + strlen(append) + strlen(app) + 2; - char *retval = allocator.Malloc(len); - BAIL_IF_MACRO(!retval, PHYSFS_ERR_OUT_OF_MEMORY, NULL); - snprintf(retval, len, "%s%s%s/", userdir, append, app); - return retval; -} /* __PHYSFS_platformCalcPrefDir */ - - -/* Platform allocator uses default CFAllocator at PHYSFS_init() time. */ - -static CFAllocatorRef cfallocdef = NULL; - -static int macosxAllocatorInit(void) -{ - int retval = 0; - cfallocdef = CFAllocatorGetDefault(); - retval = (cfallocdef != NULL); - if (retval) - CFRetain(cfallocdef); - return retval; -} /* macosxAllocatorInit */ - - -static void macosxAllocatorDeinit(void) -{ - if (cfallocdef != NULL) - { - CFRelease(cfallocdef); - cfallocdef = NULL; - } /* if */ -} /* macosxAllocatorDeinit */ - - -static void *macosxAllocatorMalloc(PHYSFS_uint64 s) -{ - if (!__PHYSFS_ui64FitsAddressSpace(s)) - BAIL_MACRO(PHYSFS_ERR_OUT_OF_MEMORY, NULL); - return CFAllocatorAllocate(cfallocdef, (CFIndex) s, 0); -} /* macosxAllocatorMalloc */ - - -static void *macosxAllocatorRealloc(void *ptr, PHYSFS_uint64 s) -{ - if (!__PHYSFS_ui64FitsAddressSpace(s)) - BAIL_MACRO(PHYSFS_ERR_OUT_OF_MEMORY, NULL); - return CFAllocatorReallocate(cfallocdef, ptr, (CFIndex) s, 0); -} /* macosxAllocatorRealloc */ - - -static void macosxAllocatorFree(void *ptr) -{ - CFAllocatorDeallocate(cfallocdef, ptr); -} /* macosxAllocatorFree */ - - -int __PHYSFS_platformSetDefaultAllocator(PHYSFS_Allocator *a) -{ - allocator.Init = macosxAllocatorInit; - allocator.Deinit = macosxAllocatorDeinit; - allocator.Malloc = macosxAllocatorMalloc; - allocator.Realloc = macosxAllocatorRealloc; - allocator.Free = macosxAllocatorFree; - return 1; /* return non-zero: we're supplying custom allocator. */ -} /* __PHYSFS_platformSetDefaultAllocator */ - -#endif /* PHYSFS_PLATFORM_MACOSX */ - -/* end of macosx.c ... */ -