From 54e34d467240c2929274db67d10cb9a095a292d7 Mon Sep 17 00:00:00 2001 From: David Rose Date: Tue, 20 Oct 2009 23:08:28 +0000 Subject: [PATCH] use ~/Library/Caches/Panda3D on Mac, ~/Panda3D on Linux --- direct/src/plugin/Sources.pp | 2 + direct/src/plugin/find_root_dir.cxx | 11 ++- direct/src/plugin/find_root_dir.h | 4 + direct/src/plugin/find_root_dir_assist.mm | 92 +++++++++++++++++++++++ 4 files changed, 107 insertions(+), 2 deletions(-) create mode 100644 direct/src/plugin/find_root_dir_assist.mm diff --git a/direct/src/plugin/Sources.pp b/direct/src/plugin/Sources.pp index eebdfc78b4..8c0ac73ece 100644 --- a/direct/src/plugin/Sources.pp +++ b/direct/src/plugin/Sources.pp @@ -33,6 +33,7 @@ #define SOURCES \ fileSpec.cxx fileSpec.h fileSpec.I \ find_root_dir.cxx find_root_dir.h \ + $[if $[IS_OSX],find_root_dir_assist.mm] \ get_tinyxml.h \ binaryXml.cxx binaryXml.h \ fhandle.h \ @@ -149,6 +150,7 @@ load_plugin.cxx load_plugin.h \ fileSpec.cxx fileSpec.h fileSpec.I \ find_root_dir.cxx find_root_dir.h \ + $[if $[IS_OSX],find_root_dir_assist.mm] \ is_pathsep.h is_pathsep.I \ mkdir_complete.cxx mkdir_complete.h diff --git a/direct/src/plugin/find_root_dir.cxx b/direct/src/plugin/find_root_dir.cxx index a542841726..ce5dfea97a 100755 --- a/direct/src/plugin/find_root_dir.cxx +++ b/direct/src/plugin/find_root_dir.cxx @@ -241,8 +241,15 @@ find_root_dir() { } } +#elif defined(__APPLE__) + // e.g., /Users//Library/Caches/Panda3D + string root = find_osx_root_dir(); + if (!root.empty()) { + return root; + } + #else // _WIN32 - // e.g., /home//.panda3d + // e.g., /home//Panda3D string root; const char *uname = getlogin(); @@ -255,7 +262,7 @@ find_root_dir() { root = pwdata->pw_dir; } - root += "/.panda3d"; + root += "/Panda3D"; if (mkdir(root.c_str(), 0700) == 0 || errno == EEXIST) { return root; } diff --git a/direct/src/plugin/find_root_dir.h b/direct/src/plugin/find_root_dir.h index 7e39e13bb6..55d9381621 100755 --- a/direct/src/plugin/find_root_dir.h +++ b/direct/src/plugin/find_root_dir.h @@ -21,4 +21,8 @@ using namespace std; string find_root_dir(); +#ifdef __APPLE__ +string find_osx_root_dir(); +#endif // __APPLE__ + #endif diff --git a/direct/src/plugin/find_root_dir_assist.mm b/direct/src/plugin/find_root_dir_assist.mm new file mode 100644 index 0000000000..ef1b3abc20 --- /dev/null +++ b/direct/src/plugin/find_root_dir_assist.mm @@ -0,0 +1,92 @@ +// Filename: filename_assist.mm +// Created by: drose (13Apr09) +// +//////////////////////////////////////////////////////////////////// +// +// PANDA 3D SOFTWARE +// Copyright (c) Carnegie Mellon University. All rights reserved. +// +// All use of this software is subject to the terms of the revised BSD +// license. You should have received a copy of this license along +// with this source code in a file named "LICENSE." +// +//////////////////////////////////////////////////////////////////// + +#include "find_root_dir.h" + +#ifdef __APPLE__ + +#include +#include + +//////////////////////////////////////////////////////////////////// +// Function: NSString_to_cpp_string +// Description: Copy the Objective-C string to a C++ string. +//////////////////////////////////////////////////////////////////// +static string +NSString_to_cpp_string(NSString *str) { + size_t length = [str length]; + string result; + for (size_t i = 0; i < length; ++i) { + result += (char)[str characterAtIndex: i]; + } + + return result; +} + +//////////////////////////////////////////////////////////////////// +// Function: call_NSSearchPathForDirectories +// Description: +//////////////////////////////////////////////////////////////////// +static string +call_NSSearchPathForDirectories(NSSearchPathDirectory dirkey, NSSearchPathDomainMask domain) { + // Ensure that Carbon has been initialized, and that we have an + // auto-release pool. + NSApplicationLoad(); + NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; + + NSArray *paths = NSSearchPathForDirectoriesInDomains(dirkey, domain, YES); + string result; + if ([paths count] != 0) { + result = NSString_to_cpp_string([paths objectAtIndex:0]); + } + [pool release]; + + return result; +} + +//////////////////////////////////////////////////////////////////// +// Function: get_osx_home_directory +// Description: +//////////////////////////////////////////////////////////////////// +static string +get_osx_home_directory() { + NSApplicationLoad(); + NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; + + NSString *dir = NSHomeDirectory(); + string result = NSString_to_cpp_string(dir); + [pool release]; + + return result; +} + +//////////////////////////////////////////////////////////////////// +// Function: find_osx_root_dir +// Description: +//////////////////////////////////////////////////////////////////// +string +find_osx_root_dir() { + string result = call_NSSearchPathForDirectories(NSCachesDirectory, NSUserDomainMask); + if (!result.empty()) { + return result + "/Panda3D"; + } + result = get_osx_home_directory(); + if (!result.empty()) { + return result + "/Panda3D"; + } + + return string(); +} + +#endif // __APPLE__