X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/82e7574281fba8f66cb856dec02b8f997562c5a2..9acbdb4313d9d421911dc27cc3c5a815786c7aef:/src/mac/core/stdpaths_cf.cpp diff --git a/src/mac/core/stdpaths_cf.cpp b/src/mac/core/stdpaths_cf.cpp new file mode 100644 index 0000000000..69e524f1fc --- /dev/null +++ b/src/mac/core/stdpaths_cf.cpp @@ -0,0 +1,217 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: mac/corefoundation/stdpaths.cpp +// Purpose: wxStandardPaths implementation for CoreFoundation systems +// Author: David Elliott +// Modified by: +// Created: 2004-10-27 +// RCS-ID: $Id$ +// Copyright: (c) 2004 David Elliott +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +// ============================================================================ +// declarations +// ============================================================================ + +// ---------------------------------------------------------------------------- +// headers +// ---------------------------------------------------------------------------- + +#include "wx/wxprec.h" + +#if wxUSE_STDPATHS + +#ifndef WX_PRECOMP + #include "wx/intl.h" +#endif //ndef WX_PRECOMP + +#include "wx/stdpaths.h" +#include "wx/filename.h" +#ifdef __WXMAC__ +#include "wx/mac/private.h" +#endif +#include "wx/mac/corefoundation/cfstring.h" + +#include +#include + +#define kDefaultPathStyle kCFURLPOSIXPathStyle + +// ============================================================================ +// implementation +// ============================================================================ + +// ---------------------------------------------------------------------------- +// wxStandardPathsCF ctors/dtor +// ---------------------------------------------------------------------------- + +wxStandardPathsCF::wxStandardPathsCF() + : m_bundle(CFBundleGetMainBundle()) +{ + CFRetain(m_bundle); + UseAppInfo(AppInfo_AppName | AppInfo_VendorName); +} + +wxStandardPathsCF::wxStandardPathsCF(wxCFBundleRef bundle) + : m_bundle(bundle) +{ + CFRetain(m_bundle); + UseAppInfo(AppInfo_AppName | AppInfo_VendorName); +} + +wxStandardPathsCF::~wxStandardPathsCF() +{ + CFRelease(m_bundle); +} + +// ---------------------------------------------------------------------------- +// wxStandardPathsCF Mac-specific methods +// ---------------------------------------------------------------------------- + +void wxStandardPathsCF::SetBundle(wxCFBundleRef bundle) +{ + CFRetain(bundle); + CFRelease(m_bundle); + m_bundle = bundle; +} + +// ---------------------------------------------------------------------------- +// generic functions in terms of which the other ones are implemented +// ---------------------------------------------------------------------------- + +static wxString BundleRelativeURLToPath(CFURLRef relativeURL) +{ + CFURLRef absoluteURL = CFURLCopyAbsoluteURL(relativeURL); + wxCHECK_MSG(absoluteURL, wxEmptyString, wxT("Failed to resolve relative URL to absolute URL")); + CFStringRef cfStrPath = CFURLCopyFileSystemPath(absoluteURL,kDefaultPathStyle); + CFRelease(absoluteURL); + return wxCFStringRef(cfStrPath).AsString(wxLocale::GetSystemEncoding()); +} + +wxString wxStandardPathsCF::GetFromFunc(wxCFURLRef (*func)(wxCFBundleRef)) const +{ + wxCHECK_MSG(m_bundle, wxEmptyString, + wxT("wxStandardPaths for CoreFoundation only works with bundled apps")); + CFURLRef relativeURL = (*func)(m_bundle); + wxCHECK_MSG(relativeURL, wxEmptyString, wxT("Couldn't get URL")); + wxString ret(BundleRelativeURLToPath(relativeURL)); + CFRelease(relativeURL); + return ret; +} + +wxString wxStandardPathsCF::GetDocumentsDir() const +{ +#if defined( __WXMAC__ ) && !defined(__WXOSX_IPHONE__) + return wxMacFindFolderNoSeparator + ( + kUserDomain, + kDocumentsFolderType, + kCreateFolder + ); +#else + return wxFileName::GetHomeDir() + wxT("/Documents"); +#endif +} + +// ---------------------------------------------------------------------------- +// wxStandardPathsCF public API +// ---------------------------------------------------------------------------- + +wxString wxStandardPathsCF::GetConfigDir() const +{ +#if defined( __WXMAC__ ) && !defined(__WXOSX_IPHONE__) + return wxMacFindFolder((short)kLocalDomain, kPreferencesFolderType, kCreateFolder); +#else + return wxT("/Library/Preferences"); +#endif +} + +wxString wxStandardPathsCF::GetUserConfigDir() const +{ +#if defined( __WXMAC__ ) && !defined(__WXOSX_IPHONE__) + return wxMacFindFolder((short)kUserDomain, kPreferencesFolderType, kCreateFolder); +#else + return wxFileName::GetHomeDir() + wxT("/Library/Preferences"); +#endif +} + +wxString wxStandardPathsCF::GetDataDir() const +{ + return GetFromFunc(CFBundleCopySharedSupportURL); +} + +wxString wxStandardPathsCF::GetExecutablePath() const +{ +#ifdef __WXMAC__ +#if 1 + return GetFromFunc(CFBundleCopyBundleURL); +#else + // TODO remove if cf implementation ok + ProcessInfoRec processinfo; + ProcessSerialNumber procno ; +#ifdef __LP64__ + FSRef fsRef; +#else + FSSpec fsSpec; +#endif + + procno.highLongOfPSN = 0 ; + procno.lowLongOfPSN = kCurrentProcess ; + processinfo.processInfoLength = sizeof(ProcessInfoRec); + processinfo.processName = NULL; +#ifdef __LP64__ + processinfo.processAppRef = &fsRef; +#else + processinfo.processAppSpec = &fsSpec; +#endif + + GetProcessInformation( &procno , &processinfo ) ; +#ifdef __LP64__ + return wxMacFSRefToPath(&fsRef); +#else + return wxMacFSSpec2MacFilename(&fsSpec); +#endif +#endif + +#else + return wxStandardPathsBase::GetExecutablePath(); +#endif +} + +wxString wxStandardPathsCF::GetLocalDataDir() const +{ +#if defined( __WXMAC__ ) && !defined(__WXOSX_IPHONE__) + return AppendAppInfo(wxMacFindFolder((short)kLocalDomain, kApplicationSupportFolderType, kCreateFolder)); +#else + return AppendAppInfo(wxT("/Library/Application Support")); +#endif +} + +wxString wxStandardPathsCF::GetUserDataDir() const +{ +#if defined( __WXMAC__ ) && !defined(__WXOSX_IPHONE__) + return AppendAppInfo(wxMacFindFolder((short)kUserDomain, kApplicationSupportFolderType, kCreateFolder)); +#else + return AppendAppInfo(wxFileName::GetHomeDir() + _T("/Library/Application Support")); +#endif +} + +wxString wxStandardPathsCF::GetPluginsDir() const +{ + return GetFromFunc(CFBundleCopyBuiltInPlugInsURL); +} + +wxString wxStandardPathsCF::GetResourcesDir() const +{ + return GetFromFunc(CFBundleCopyResourcesDirectoryURL); +} + +wxString +wxStandardPathsCF::GetLocalizedResourcesDir(const wxString& lang, + ResourceCat category) const +{ + return wxStandardPathsBase:: + GetLocalizedResourcesDir(lang, category) + _T(".lproj"); +} + +#endif // wxUSE_STDPATHS