misc/libphysfs/platform_macosx.c
author nemo
Sat, 27 Apr 2013 16:56:50 -0400
changeset 8939 b26aaf28c920
parent 8928 10a79d89ca31
child 9183 4cd7c7aafea7
permissions -rw-r--r--
So. First pass. Add secondary explosions to RateExplosion and RateShotgun. Not yet added to shoves. This is of limited utility at present since the dX has to be small since we can't bother tracing all hog motion. But, should be more useful once shove is added, and tracking of explosives and mines.
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
7768
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
     1
/*
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
     2
 * Mac OS X support routines for PhysicsFS.
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
     3
 *
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
     4
 * Please see the file LICENSE.txt in the source's root directory.
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
     5
 *
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
     6
 *  This file written by Ryan C. Gordon.
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
     7
 */
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
     8
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
     9
#define __PHYSICSFS_INTERNAL__
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
    10
#include "physfs_platforms.h"
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
    11
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
    12
#ifdef PHYSFS_PLATFORM_MACOSX
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
    13
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
    14
#include <CoreFoundation/CoreFoundation.h>
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
    15
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
    16
#if !defined(PHYSFS_NO_CDROM_SUPPORT)
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
    17
#include <Carbon/Carbon.h>  /* !!! FIXME */
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
    18
#include <IOKit/storage/IOMedia.h>
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
    19
#include <IOKit/storage/IOCDMedia.h>
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
    20
#include <IOKit/storage/IODVDMedia.h>
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
    21
#include <sys/mount.h>
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
    22
#endif
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
    23
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
    24
/* Seems to get defined in some system header... */
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
    25
#ifdef Free
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
    26
#undef Free
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
    27
#endif
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
    28
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
    29
#include "physfs_internal.h"
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
    30
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
    31
8928
10a79d89ca31 expose a hidden function that prevented linking on osx 10.4 when compiling physfs statically
koda
parents: 8524
diff changeset
    32
#if defined(__APPLE__)
10a79d89ca31 expose a hidden function that prevented linking on osx 10.4 when compiling physfs statically
koda
parents: 8524
diff changeset
    33
#if defined(TARGET_OS_MAC) && MAC_OS_X_VERSION_MAX_ALLOWED <= MAC_OS_X_VERSION_10_4
10a79d89ca31 expose a hidden function that prevented linking on osx 10.4 when compiling physfs statically
koda
parents: 8524
diff changeset
    34
/* __eprintf shouldn't have been made visible from libstdc++, or anywhere, but
10a79d89ca31 expose a hidden function that prevented linking on osx 10.4 when compiling physfs statically
koda
parents: 8524
diff changeset
    35
   on Mac OS X 10.4 it was defined in libstdc++.6.0.3.dylib; so on that platform
10a79d89ca31 expose a hidden function that prevented linking on osx 10.4 when compiling physfs statically
koda
parents: 8524
diff changeset
    36
   we have to keep defining it to keep binary compatibility.
10a79d89ca31 expose a hidden function that prevented linking on osx 10.4 when compiling physfs statically
koda
parents: 8524
diff changeset
    37
   We can't just put the libgcc version in the export list, because that
10a79d89ca31 expose a hidden function that prevented linking on osx 10.4 when compiling physfs statically
koda
parents: 8524
diff changeset
    38
   doesn't work; once a symbol is marked as hidden, it stays that way.  */
10a79d89ca31 expose a hidden function that prevented linking on osx 10.4 when compiling physfs statically
koda
parents: 8524
diff changeset
    39
10a79d89ca31 expose a hidden function that prevented linking on osx 10.4 when compiling physfs statically
koda
parents: 8524
diff changeset
    40
void __eprintf (const char *string, const char *expression,
10a79d89ca31 expose a hidden function that prevented linking on osx 10.4 when compiling physfs statically
koda
parents: 8524
diff changeset
    41
	        unsigned int line, const char *filename)
10a79d89ca31 expose a hidden function that prevented linking on osx 10.4 when compiling physfs statically
koda
parents: 8524
diff changeset
    42
{
10a79d89ca31 expose a hidden function that prevented linking on osx 10.4 when compiling physfs statically
koda
parents: 8524
diff changeset
    43
    fprintf(stderr, string, expression, line, filename);
10a79d89ca31 expose a hidden function that prevented linking on osx 10.4 when compiling physfs statically
koda
parents: 8524
diff changeset
    44
    fflush(stderr);
10a79d89ca31 expose a hidden function that prevented linking on osx 10.4 when compiling physfs statically
koda
parents: 8524
diff changeset
    45
    abort();
10a79d89ca31 expose a hidden function that prevented linking on osx 10.4 when compiling physfs statically
koda
parents: 8524
diff changeset
    46
}
10a79d89ca31 expose a hidden function that prevented linking on osx 10.4 when compiling physfs statically
koda
parents: 8524
diff changeset
    47
#endif
10a79d89ca31 expose a hidden function that prevented linking on osx 10.4 when compiling physfs statically
koda
parents: 8524
diff changeset
    48
#endif /* __APPLE__ */
10a79d89ca31 expose a hidden function that prevented linking on osx 10.4 when compiling physfs statically
koda
parents: 8524
diff changeset
    49
10a79d89ca31 expose a hidden function that prevented linking on osx 10.4 when compiling physfs statically
koda
parents: 8524
diff changeset
    50
7768
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
    51
/* Wrap PHYSFS_Allocator in a CFAllocator... */
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
    52
static CFAllocatorRef cfallocator = NULL;
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
    53
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
    54
static CFStringRef cfallocDesc(const void *info)
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
    55
{
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
    56
    return CFStringCreateWithCString(cfallocator, "PhysicsFS",
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
    57
                                     kCFStringEncodingASCII);
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
    58
} /* cfallocDesc */
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
    59
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
    60
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
    61
static void *cfallocMalloc(CFIndex allocSize, CFOptionFlags hint, void *info)
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
    62
{
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
    63
    return allocator.Malloc(allocSize);
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
    64
} /* cfallocMalloc */
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
    65
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
    66
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
    67
static void cfallocFree(void *ptr, void *info)
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
    68
{
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
    69
    allocator.Free(ptr);
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
    70
} /* cfallocFree */
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
    71
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
    72
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
    73
static void *cfallocRealloc(void *ptr, CFIndex newsize,
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
    74
                            CFOptionFlags hint, void *info)
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
    75
{
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
    76
    if ((ptr == NULL) || (newsize <= 0))
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
    77
        return NULL;  /* ADC docs say you should always return NULL here. */
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
    78
    return allocator.Realloc(ptr, newsize);
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
    79
} /* cfallocRealloc */
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
    80
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
    81
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
    82
int __PHYSFS_platformInit(void)
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
    83
{
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
    84
    /* set up a CFAllocator, so Carbon can use the physfs allocator, too. */
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
    85
    CFAllocatorContext ctx;
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
    86
    memset(&ctx, '\0', sizeof (ctx));
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
    87
    ctx.copyDescription = cfallocDesc;
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
    88
    ctx.allocate = cfallocMalloc;
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
    89
    ctx.reallocate = cfallocRealloc;
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
    90
    ctx.deallocate = cfallocFree;
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
    91
    cfallocator = CFAllocatorCreate(kCFAllocatorUseContext, &ctx);
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
    92
    BAIL_IF_MACRO(!cfallocator, PHYSFS_ERR_OUT_OF_MEMORY, 0);
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
    93
    return 1;  /* success. */
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
    94
} /* __PHYSFS_platformInit */
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
    95
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
    96
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
    97
int __PHYSFS_platformDeinit(void)
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
    98
{
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
    99
    CFRelease(cfallocator);
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   100
    cfallocator = NULL;
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   101
    return 1;  /* always succeed. */
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   102
} /* __PHYSFS_platformDeinit */
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   103
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   104
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   105
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   106
/* CD-ROM detection code... */
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   107
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   108
/*
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   109
 * Code based on sample from Apple Developer Connection:
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   110
 *  http://developer.apple.com/samplecode/Sample_Code/Devices_and_Hardware/Disks/VolumeToBSDNode/VolumeToBSDNode.c.htm
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   111
 */
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   112
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   113
#if !defined(PHYSFS_NO_CDROM_SUPPORT)
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   114
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   115
static int darwinIsWholeMedia(io_service_t service)
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   116
{
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   117
    int retval = 0;
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   118
    CFTypeRef wholeMedia;
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   119
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   120
    if (!IOObjectConformsTo(service, kIOMediaClass))
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   121
        return 0;
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   122
        
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   123
    wholeMedia = IORegistryEntryCreateCFProperty(service,
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   124
                                                 CFSTR(kIOMediaWholeKey),
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   125
                                                 cfallocator, 0);
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   126
    if (wholeMedia == NULL)
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   127
        return 0;
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   128
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   129
    retval = CFBooleanGetValue(wholeMedia);
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   130
    CFRelease(wholeMedia);
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   131
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   132
    return retval;
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   133
} /* darwinIsWholeMedia */
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   134
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   135
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   136
static int darwinIsMountedDisc(char *bsdName, mach_port_t masterPort)
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   137
{
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   138
    int retval = 0;
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   139
    CFMutableDictionaryRef matchingDict;
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   140
    kern_return_t rc;
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   141
    io_iterator_t iter;
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   142
    io_service_t service;
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   143
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   144
    if ((matchingDict = IOBSDNameMatching(masterPort, 0, bsdName)) == NULL)
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   145
        return 0;
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   146
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   147
    rc = IOServiceGetMatchingServices(masterPort, matchingDict, &iter);
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   148
    if ((rc != KERN_SUCCESS) || (!iter))
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   149
        return 0;
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   150
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   151
    service = IOIteratorNext(iter);
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   152
    IOObjectRelease(iter);
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   153
    if (!service)
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   154
        return 0;
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   155
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   156
    rc = IORegistryEntryCreateIterator(service, kIOServicePlane,
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   157
             kIORegistryIterateRecursively | kIORegistryIterateParents, &iter);
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   158
    
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   159
    if (!iter)
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   160
        return 0;
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   161
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   162
    if (rc != KERN_SUCCESS)
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   163
    {
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   164
        IOObjectRelease(iter);
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   165
        return 0;
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   166
    } /* if */
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   167
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   168
    IOObjectRetain(service);  /* add an extra object reference... */
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   169
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   170
    do
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   171
    {
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   172
        if (darwinIsWholeMedia(service))
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   173
        {
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   174
            if ( (IOObjectConformsTo(service, kIOCDMediaClass)) ||
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   175
                 (IOObjectConformsTo(service, kIODVDMediaClass)) )
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   176
            {
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   177
                retval = 1;
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   178
            } /* if */
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   179
        } /* if */
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   180
        IOObjectRelease(service);
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   181
    } while ((service = IOIteratorNext(iter)) && (!retval));
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   182
                
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   183
    IOObjectRelease(iter);
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   184
    IOObjectRelease(service);
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   185
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   186
    return retval;
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   187
} /* darwinIsMountedDisc */
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   188
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   189
#endif /* !defined(PHYSFS_NO_CDROM_SUPPORT) */
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   190
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   191
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   192
void __PHYSFS_platformDetectAvailableCDs(PHYSFS_StringCallback cb, void *data)
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   193
{
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   194
#if !defined(PHYSFS_NO_CDROM_SUPPORT)
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   195
    const char *devPrefix = "/dev/";
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   196
    const int prefixLen = strlen(devPrefix);
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   197
    mach_port_t masterPort = 0;
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   198
    struct statfs *mntbufp;
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   199
    int i, mounts;
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   200
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   201
    if (IOMasterPort(MACH_PORT_NULL, &masterPort) != KERN_SUCCESS)
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   202
        BAIL_MACRO(PHYSFS_ERR_OS_ERROR, ) /*return void*/;
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   203
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   204
    mounts = getmntinfo(&mntbufp, MNT_WAIT);  /* NOT THREAD SAFE! */
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   205
    for (i = 0; i < mounts; i++)
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   206
    {
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   207
        char *dev = mntbufp[i].f_mntfromname;
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   208
        char *mnt = mntbufp[i].f_mntonname;
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   209
        if (strncmp(dev, devPrefix, prefixLen) != 0)  /* a virtual device? */
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   210
            continue;
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   211
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   212
        dev += prefixLen;
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   213
        if (darwinIsMountedDisc(dev, masterPort))
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   214
            cb(data, mnt);
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   215
    } /* for */
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   216
#endif /* !defined(PHYSFS_NO_CDROM_SUPPORT) */
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   217
} /* __PHYSFS_platformDetectAvailableCDs */
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   218
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   219
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   220
static char *convertCFString(CFStringRef cfstr)
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   221
{
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   222
    CFIndex len = CFStringGetMaximumSizeForEncoding(CFStringGetLength(cfstr),
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   223
                                                    kCFStringEncodingUTF8) + 1;
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   224
    char *retval = (char *) allocator.Malloc(len);
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   225
    BAIL_IF_MACRO(!retval, PHYSFS_ERR_OUT_OF_MEMORY, NULL);
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   226
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   227
    if (CFStringGetCString(cfstr, retval, len, kCFStringEncodingUTF8))
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   228
    {
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   229
        /* shrink overallocated buffer if possible... */
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   230
        CFIndex newlen = strlen(retval) + 1;
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   231
        if (newlen < len)
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   232
        {
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   233
            void *ptr = allocator.Realloc(retval, newlen);
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   234
            if (ptr != NULL)
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   235
                retval = (char *) ptr;
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   236
        } /* if */
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   237
    } /* if */
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   238
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   239
    else  /* probably shouldn't fail, but just in case... */
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   240
    {
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   241
        allocator.Free(retval);
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   242
        BAIL_MACRO(PHYSFS_ERR_OUT_OF_MEMORY, NULL);
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   243
    } /* else */
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   244
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   245
    return retval;
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   246
} /* convertCFString */
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   247
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   248
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   249
char *__PHYSFS_platformCalcBaseDir(const char *argv0)
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   250
{
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   251
    CFURLRef cfurl = NULL;
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   252
    CFStringRef cfstr = NULL;
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   253
    CFMutableStringRef cfmutstr = NULL;
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   254
    char *retval = NULL;
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   255
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   256
    cfurl = CFBundleCopyBundleURL(CFBundleGetMainBundle());
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   257
    BAIL_IF_MACRO(cfurl == NULL, PHYSFS_ERR_OS_ERROR, NULL);
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   258
    cfstr = CFURLCopyFileSystemPath(cfurl, kCFURLPOSIXPathStyle);
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   259
    CFRelease(cfurl);
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   260
    BAIL_IF_MACRO(!cfstr, PHYSFS_ERR_OUT_OF_MEMORY, NULL);
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   261
    cfmutstr = CFStringCreateMutableCopy(cfallocator, 0, cfstr);
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   262
    CFRelease(cfstr);
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   263
    BAIL_IF_MACRO(!cfmutstr, PHYSFS_ERR_OUT_OF_MEMORY, NULL);
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   264
    CFStringAppendCString(cfmutstr, "/", kCFStringEncodingUTF8);
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   265
    retval = convertCFString(cfmutstr);
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   266
    CFRelease(cfmutstr);
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   267
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   268
    return retval;  /* whew. */
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   269
} /* __PHYSFS_platformCalcBaseDir */
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   270
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   271
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   272
char *__PHYSFS_platformCalcPrefDir(const char *org, const char *app)
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   273
{
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   274
    /* !!! FIXME: there's a real API to determine this */
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   275
    const char *userdir = __PHYSFS_getUserDir();
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   276
    const char *append = "Library/Application Support/";
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   277
    const size_t len = strlen(userdir) + strlen(append) + strlen(app) + 2;
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   278
    char *retval = allocator.Malloc(len);
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   279
    BAIL_IF_MACRO(!retval, PHYSFS_ERR_OUT_OF_MEMORY, NULL);
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   280
    snprintf(retval, len, "%s%s%s/", userdir, append, app);
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   281
    return retval;
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   282
} /* __PHYSFS_platformCalcPrefDir */
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   283
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   284
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   285
/* Platform allocator uses default CFAllocator at PHYSFS_init() time. */
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   286
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   287
static CFAllocatorRef cfallocdef = NULL;
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   288
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   289
static int macosxAllocatorInit(void)
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   290
{
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   291
    int retval = 0;
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   292
    cfallocdef = CFAllocatorGetDefault();
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   293
    retval = (cfallocdef != NULL);
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   294
    if (retval)
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   295
        CFRetain(cfallocdef);
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   296
    return retval;
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   297
} /* macosxAllocatorInit */
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   298
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   299
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   300
static void macosxAllocatorDeinit(void)
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   301
{
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   302
    if (cfallocdef != NULL)
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   303
    {
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   304
        CFRelease(cfallocdef);
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   305
        cfallocdef = NULL;
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   306
    } /* if */
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   307
} /* macosxAllocatorDeinit */
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   308
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   309
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   310
static void *macosxAllocatorMalloc(PHYSFS_uint64 s)
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   311
{
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   312
    if (!__PHYSFS_ui64FitsAddressSpace(s))
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   313
        BAIL_MACRO(PHYSFS_ERR_OUT_OF_MEMORY, NULL);
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   314
    return CFAllocatorAllocate(cfallocdef, (CFIndex) s, 0);
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   315
} /* macosxAllocatorMalloc */
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   316
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   317
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   318
static void *macosxAllocatorRealloc(void *ptr, PHYSFS_uint64 s)
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   319
{
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   320
    if (!__PHYSFS_ui64FitsAddressSpace(s))
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   321
        BAIL_MACRO(PHYSFS_ERR_OUT_OF_MEMORY, NULL);
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   322
    return CFAllocatorReallocate(cfallocdef, ptr, (CFIndex) s, 0);
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   323
} /* macosxAllocatorRealloc */
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   324
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   325
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   326
static void macosxAllocatorFree(void *ptr)
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   327
{
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   328
    CFAllocatorDeallocate(cfallocdef, ptr);
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   329
} /* macosxAllocatorFree */
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   330
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   331
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   332
int __PHYSFS_platformSetDefaultAllocator(PHYSFS_Allocator *a)
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   333
{
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   334
    allocator.Init = macosxAllocatorInit;
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   335
    allocator.Deinit = macosxAllocatorDeinit;
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   336
    allocator.Malloc = macosxAllocatorMalloc;
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   337
    allocator.Realloc = macosxAllocatorRealloc;
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   338
    allocator.Free = macosxAllocatorFree;
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   339
    return 1;  /* return non-zero: we're supplying custom allocator. */
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   340
} /* __PHYSFS_platformSetDefaultAllocator */
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   341
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   342
#endif /* PHYSFS_PLATFORM_MACOSX */
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   343
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   344
/* end of macosx.c ... */
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   345