Bladeren bron

apple: Start using some Cocoa APIs, clean up a few related things.

Ryan C. Gordon 8 jaren geleden
bovenliggende
commit
982411ec8a
4 gewijzigde bestanden met toevoegingen van 55 en 82 verwijderingen
  1. 1 1
      CMakeLists.txt
  2. 3 2
      docs/INSTALL.txt
  3. 49 77
      src/physfs_platform_apple.m
  4. 2 2
      src/physfs_platforms.h

+ 1 - 1
CMakeLists.txt

@@ -25,7 +25,7 @@ endif()
 include_directories(./src)
 include_directories(./src)
 
 
 if(APPLE)
 if(APPLE)
-    set(OTHER_LDFLAGS ${OTHER_LDFLAGS} "-framework CoreFoundation -framework IOKit")
+    set(OTHER_LDFLAGS ${OTHER_LDFLAGS} "-framework IOKit -framework Foundation")
     set(PHYSFS_M_SRCS src/physfs_platform_apple.m)
     set(PHYSFS_M_SRCS src/physfs_platform_apple.m)
 endif()
 endif()
 
 

+ 3 - 2
docs/INSTALL.txt

@@ -29,7 +29,9 @@ ANSI C compiler, should build cleanly even with excessive compiler warnings
 enabled, needs no extra configuration, and allows static linking.
 enabled, needs no extra configuration, and allows static linking.
 WinRT and Haiku need C++ compilers for their system APIs, but if you aren't on
 WinRT and Haiku need C++ compilers for their system APIs, but if you aren't on
 these platforms and don't have a C++ compiler, don't build the .cpp files.
 these platforms and don't have a C++ compiler, don't build the .cpp files.
-Everything you need is in the .c sources.
+Likewise: Apple platforms (macOS, iOS, etc) need an Objective-C compiler, but
+if you aren't on these platforms and don't have a Objective-C compiler, don't
+build the .m file. Everything you need is in the .c sources.
 
 
 If this all worked for your specific project, you can stop reading now.
 If this all worked for your specific project, you can stop reading now.
 
 
@@ -101,7 +103,6 @@ options, and set the system name to "WindowsPhone" or "WindowsStore" and the
 correct OS version (8.0 or later).
 correct OS version (8.0 or later).
 
 
 
 
-
 PocketPC/WindowsCE:
 PocketPC/WindowsCE:
 
 
 Support for PocketPC was removed in PhysicsFS 2.1.0. This was known to work
 Support for PocketPC was removed in PhysicsFS 2.1.0. This was known to work

+ 49 - 77
src/physfs_platform_apple.m

@@ -1,5 +1,5 @@
 /*
 /*
- * macOS (iOS, etc) support routines for PhysicsFS.
+ * Apple platform (macOS, iOS, watchOS, etc) support routines for PhysicsFS.
  *
  *
  * Please see the file LICENSE.txt in the source's root directory.
  * Please see the file LICENSE.txt in the source's root directory.
  *
  *
@@ -9,17 +9,13 @@
 #define __PHYSICSFS_INTERNAL__
 #define __PHYSICSFS_INTERNAL__
 #include "physfs_internal.h"
 #include "physfs_internal.h"
 
 
-#ifdef PHYSFS_PLATFORM_MACOS
+#ifdef PHYSFS_PLATFORM_APPLE
 
 
-#include <CoreFoundation/CoreFoundation.h>
+/* Foundation.h steps on these. :( */
+#undef malloc
+#undef free
 
 
-#if !defined(PHYSFS_NO_CDROM_SUPPORT)
-#include <IOKit/IOKitLib.h>
-#include <IOKit/storage/IOMedia.h>
-#include <IOKit/storage/IOCDMedia.h>
-#include <IOKit/storage/IODVDMedia.h>
-#include <sys/mount.h>
-#endif
+#include <Foundation/Foundation.h>
 
 
 int __PHYSFS_platformInit(void)
 int __PHYSFS_platformInit(void)
 {
 {
@@ -33,6 +29,41 @@ void __PHYSFS_platformDeinit(void)
 } /* __PHYSFS_platformDeinit */
 } /* __PHYSFS_platformDeinit */
 
 
 
 
+char *__PHYSFS_platformCalcBaseDir(const char *argv0)
+{
+    @autoreleasepool
+    {
+        NSString *path = [[NSBundle mainBundle] bundlePath];
+        BAIL_IF(!path, PHYSFS_ERR_OS_ERROR, NULL);
+        size_t len = [path lengthOfBytesUsingEncoding:NSUTF8StringEncoding];
+        char *retval = (char *) allocator.Malloc(len + 2);
+        BAIL_IF(!retval, PHYSFS_ERR_OUT_OF_MEMORY, NULL);
+        [path getCString:retval maxLength:len+1 encoding:NSUTF8StringEncoding];
+        retval[len] = '/';
+        retval[len+1] = '\0';
+        return retval;  /* whew. */
+    } /* @autoreleasepool */
+} /* __PHYSFS_platformCalcBaseDir */
+
+
+char *__PHYSFS_platformCalcPrefDir(const char *org, const char *app)
+{
+    @autoreleasepool
+    {
+        NSArray<NSString *> *paths = NSSearchPathForDirectoriesInDomains(NSApplicationSupportDirectory, NSUserDomainMask, TRUE);
+        BAIL_IF(!paths, PHYSFS_ERR_OS_ERROR, NULL);
+        NSString *path = paths[0];
+        BAIL_IF(!path, PHYSFS_ERR_OS_ERROR, NULL);
+        size_t len = [path lengthOfBytesUsingEncoding:NSUTF8StringEncoding];
+        const size_t applen = strlen(app);
+        char *retval = (char *) allocator.Malloc(len + applen + 3);
+        BAIL_IF(!retval, PHYSFS_ERR_OUT_OF_MEMORY, NULL);
+        [path getCString:retval maxLength:len+1 encoding:NSUTF8StringEncoding];
+        snprintf(retval + len, applen + 3, "/%s/", app);
+        return retval;  /* whew. */
+    } /* @autoreleasepool */
+} /* __PHYSFS_platformCalcPrefDir */
+
 
 
 /* CD-ROM detection code... */
 /* CD-ROM detection code... */
 
 
@@ -43,6 +74,12 @@ void __PHYSFS_platformDeinit(void)
 
 
 #if !defined(PHYSFS_NO_CDROM_SUPPORT)
 #if !defined(PHYSFS_NO_CDROM_SUPPORT)
 
 
+#include <IOKit/IOKitLib.h>
+#include <IOKit/storage/IOMedia.h>
+#include <IOKit/storage/IOCDMedia.h>
+#include <IOKit/storage/IODVDMedia.h>
+#include <sys/mount.h>
+
 static int darwinIsWholeMedia(io_service_t service)
 static int darwinIsWholeMedia(io_service_t service)
 {
 {
     int retval = 0;
     int retval = 0;
@@ -147,72 +184,7 @@ void __PHYSFS_platformDetectAvailableCDs(PHYSFS_StringCallback cb, void *data)
 #endif /* !defined(PHYSFS_NO_CDROM_SUPPORT) */
 #endif /* !defined(PHYSFS_NO_CDROM_SUPPORT) */
 } /* __PHYSFS_platformDetectAvailableCDs */
 } /* __PHYSFS_platformDetectAvailableCDs */
 
 
+#endif /* PHYSFS_PLATFORM_APPLE */
 
 
-static char *convertCFString(CFStringRef cfstr)
-{
-    CFIndex len = CFStringGetMaximumSizeForEncoding(CFStringGetLength(cfstr),
-                                                    kCFStringEncodingUTF8) + 1;
-    char *retval = (char *) allocator.Malloc(len);
-    BAIL_IF(!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(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(cfurl == NULL, PHYSFS_ERR_OS_ERROR, NULL);
-    cfstr = CFURLCopyFileSystemPath(cfurl, kCFURLPOSIXPathStyle);
-    CFRelease(cfurl);
-    BAIL_IF(!cfstr, PHYSFS_ERR_OUT_OF_MEMORY, NULL);
-    cfmutstr = CFStringCreateMutableCopy(NULL, 0, cfstr);
-    CFRelease(cfstr);
-    BAIL_IF(!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-3.0: 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(!retval, PHYSFS_ERR_OUT_OF_MEMORY, NULL);
-    snprintf(retval, len, "%s%s%s/", userdir, append, app);
-    return retval;
-} /* __PHYSFS_platformCalcPrefDir */
-
-#endif /* PHYSFS_PLATFORM_MACOS */
-
-/* end of physfs_platform_macos.c ... */
+/* end of physfs_platform_apple.m ... */
 
 

+ 2 - 2
src/physfs_platforms.h

@@ -33,12 +33,12 @@
 #elif defined(__OS2__) || defined(OS2)
 #elif defined(__OS2__) || defined(OS2)
 #  define PHYSFS_PLATFORM_OS2 1
 #  define PHYSFS_PLATFORM_OS2 1
 #elif ((defined __MACH__) && (defined __APPLE__))
 #elif ((defined __MACH__) && (defined __APPLE__))
-/* To check if iphone or not, we need to include this file */
+/* To check if iOS or not, we need to include this file */
 #  include <TargetConditionals.h>
 #  include <TargetConditionals.h>
 #  if ((TARGET_IPHONE_SIMULATOR) || (TARGET_OS_IPHONE))
 #  if ((TARGET_IPHONE_SIMULATOR) || (TARGET_OS_IPHONE))
 #     define PHYSFS_NO_CDROM_SUPPORT 1
 #     define PHYSFS_NO_CDROM_SUPPORT 1
 #  endif
 #  endif
-#  define PHYSFS_PLATFORM_MACOS 1
+#  define PHYSFS_PLATFORM_APPLE 1
 #  define PHYSFS_PLATFORM_POSIX 1
 #  define PHYSFS_PLATFORM_POSIX 1
 #elif defined(macintosh)
 #elif defined(macintosh)
 #  error Classic Mac OS support was dropped from PhysicsFS 2.0. Move to OS X.
 #  error Classic Mac OS support was dropped from PhysicsFS 2.0. Move to OS X.