]> git.saurik.com Git - wxWidgets.git/blobdiff - src/mac/corefoundation/stdpaths_cf.cpp
added wxWindow::GetPrev/NextSibling()
[wxWidgets.git] / src / mac / corefoundation / stdpaths_cf.cpp
index f38c5a72109b8d82590d787b4b0eb738a6bf7a43..eeaa7453e522496f095ffbce38827a150b6eabd2 100644 (file)
@@ -9,28 +9,75 @@
 // 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 <CoreFoundation/CFBundle.h>
 #include <CoreFoundation/CFURL.h>
 
-// See comment in include/wx/mac/corefoundation/stdpaths.h
-#ifndef wxStandardPaths
-#warning "wxStandardPaths should be defined to wxStandardPathsCF when compiling this file."
-#endif
-
-#if defined(__WXCOCOA__) || defined(__WXMAC_OSX__)
 #define kDefaultPathStyle kCFURLPOSIXPathStyle
-#else
-#define kDefaultPathStyle kCFURLHFSPathStyle
-#endif
+
+// ============================================================================
+// 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)
 {
@@ -41,76 +88,121 @@ static wxString BundleRelativeURLToPath(CFURLRef relativeURL)
     return wxMacCFStringHolder(cfStrPath).AsString(wxLocale::GetSystemEncoding());
 }
 
-
-static wxStandardPaths gs_stdPaths;
-/* static */ wxStandardPaths& wxStandardPaths::Get()
+wxString wxStandardPathsCF::GetFromFunc(wxCFURLRef (*func)(wxCFBundleRef)) const
 {
-    return gs_stdPaths;
+    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;
 }
 
-wxStandardPaths::wxStandardPaths()
-:   m_bundle(CFBundleGetMainBundle())
+wxString wxStandardPathsCF::GetDocumentsDir() const
 {
-    CFRetain(m_bundle);
+#ifdef __WXMAC__
+    return wxMacFindFolderNoSeparator
+        (
+#if TARGET_API_MAC_OSX
+        kUserDomain,
+#else
+        kOnSystemDisk,
+#endif
+        kDocumentsFolderType,
+        kCreateFolder
+        );
+#else
+    return wxFileName::GetHomeDir() + wxT("/Documents");
+#endif
 }
 
-wxStandardPaths::wxStandardPaths(struct __CFBundle *bundle)
-:   m_bundle(bundle)
+// ----------------------------------------------------------------------------
+// wxStandardPathsCF public API
+// ----------------------------------------------------------------------------
+
+wxString wxStandardPathsCF::GetConfigDir() const
 {
-    CFRetain(m_bundle);
+#ifdef __WXMAC__
+    return wxMacFindFolder((short)kLocalDomain, kPreferencesFolderType, kCreateFolder);
+#else
+    return wxT("/Library/Preferences");
+#endif
 }
 
-wxStandardPaths::~wxStandardPaths()
+wxString wxStandardPathsCF::GetUserConfigDir() const
 {
-    CFRelease(m_bundle);
+#ifdef __WXMAC__
+    return wxMacFindFolder((short)kUserDomain, kPreferencesFolderType, kCreateFolder);
+#else
+    return wxFileName::GetHomeDir() + wxT("/Library/Preferences");
+#endif
 }
 
-void wxStandardPaths::SetBundle(struct __CFBundle *bundle)
+wxString wxStandardPathsCF::GetDataDir() const
 {
-    CFRetain(bundle);
-    CFRelease(m_bundle);
-    m_bundle = bundle;
+    return GetFromFunc(CFBundleCopySharedSupportURL);
 }
 
-wxString wxStandardPaths::GetConfigDir() const
+// TODO: implement this using real CoreFoundation API instead of Carbon API
+wxString wxStandardPathsCF::GetExecutablePath() const
 {
-    // TODO: What do we do for pure Carbon?
-    return wxT("/Library/Preferences");
+#ifdef __WXMAC__
+    ProcessInfoRec processinfo;
+    ProcessSerialNumber procno ;
+    FSSpec fsSpec;
+
+    procno.highLongOfPSN = 0 ;
+    procno.lowLongOfPSN = kCurrentProcess ;
+    processinfo.processInfoLength = sizeof(ProcessInfoRec);
+    processinfo.processName = NULL;
+    processinfo.processAppSpec = &fsSpec;
+
+    GetProcessInformation( &procno , &processinfo ) ;
+#ifdef __LP64__
+    return wxMacFSRefToPath(&fsRef);
+#else
+    return wxMacFSSpec2MacFilename(&fsSpec);
+#endif
+#else
+    return wxStandardPathsBase::GetExecutablePath();
+#endif
 }
 
-wxString wxStandardPaths::GetUserConfigDir() const
+wxString wxStandardPathsCF::GetLocalDataDir() const
 {
-    // TODO: What do we do for pure Carbon?
-    return wxFileName::GetHomeDir() + wxT("/Library/Preferences");
+#ifdef __WXMAC__
+    return AppendAppInfo(wxMacFindFolder((short)kLocalDomain, kApplicationSupportFolderType, kCreateFolder));
+#else
+    return AppendAppInfo(wxT("/Library/Application Support"));
+#endif
 }
 
-wxString wxStandardPaths::GetDataDir() const
+wxString wxStandardPathsCF::GetUserDataDir() const
 {
-    wxCHECK_MSG(m_bundle, wxEmptyString, wxT("wxStandardPaths for CoreFoundation only works with bundled apps"));
-    CFURLRef relativeURL = CFBundleCopySharedSupportURL(m_bundle);
-    wxCHECK_MSG(relativeURL, wxEmptyString, wxT("Couldn't get SharedSupport URL"));
-    wxString ret(BundleRelativeURLToPath(relativeURL));
-    CFRelease(relativeURL);
-    return ret;
+#ifdef __WXMAC__
+    return AppendAppInfo(wxMacFindFolder((short)kUserDomain, kApplicationSupportFolderType, kCreateFolder));
+#else
+    return AppendAppInfo(wxFileName::GetHomeDir() + _T("/Library/Application Support"));
+#endif
 }
 
-wxString wxStandardPaths::GetLocalDataDir() const
+wxString wxStandardPathsCF::GetPluginsDir() const
 {
-    return AppendAppName(wxT("/Library/Application Support"));
+    return GetFromFunc(CFBundleCopyBuiltInPlugInsURL);
 }
 
-wxString wxStandardPaths::GetUserDataDir() const
+wxString wxStandardPathsCF::GetResourcesDir() const
 {
-    return AppendAppName(wxFileName::GetHomeDir() + _T("/Library/Application Support"));
+    return GetFromFunc(CFBundleCopyResourcesDirectoryURL);
 }
 
-wxString wxStandardPaths::GetPluginsDir() const
+wxString
+wxStandardPathsCF::GetLocalizedResourcesDir(const wxString& lang,
+                                            ResourceCat category) const
 {
-    wxCHECK_MSG(m_bundle, wxEmptyString, wxT("wxStandardPaths for CoreFoundation only works with bundled apps"));
-    CFURLRef relativeURL = CFBundleCopyBuiltInPlugInsURL(m_bundle);
-    wxCHECK_MSG(relativeURL, wxEmptyString, wxT("Couldn't get BuiltInPlugIns URL"));
-    wxString ret(BundleRelativeURLToPath(relativeURL));
-    CFRelease(relativeURL);
-    return ret;
+    return wxStandardPathsBase::
+            GetLocalizedResourcesDir(lang, category) + _T(".lproj");
 }
 
+#endif // wxUSE_STDPATHS