]> git.saurik.com Git - wxWidgets.git/blob - src/mac/corefoundation/stdpaths_cf.cpp
fixed crash when no status bar is present, conditionals around optional parts
[wxWidgets.git] / src / mac / corefoundation / stdpaths_cf.cpp
1 ///////////////////////////////////////////////////////////////////////////////
2 // Name: mac/corefoundation/stdpaths.cpp
3 // Purpose: wxStandardPaths implementation for CoreFoundation systems
4 // Author: David Elliott
5 // Modified by:
6 // Created: 2004-10-27
7 // RCS-ID: $Id$
8 // Copyright: (c) 2004 David Elliott <dfe@cox.net>
9 // Licence: wxWindows licence
10 ///////////////////////////////////////////////////////////////////////////////
11
12 // ============================================================================
13 // declarations
14 // ============================================================================
15
16 // ----------------------------------------------------------------------------
17 // headers
18 // ----------------------------------------------------------------------------
19
20 #include "wx/wxprec.h"
21
22 #if wxUSE_STDPATHS
23
24 #ifndef WX_PRECOMP
25 #include "wx/intl.h"
26 #endif //ndef WX_PRECOMP
27
28 #include "wx/stdpaths.h"
29 #include "wx/filename.h"
30 #ifdef __WXMAC__
31 #include "wx/mac/private.h"
32 #endif
33 #include "wx/mac/corefoundation/cfstring.h"
34 #include "wx/mac/private.h"
35
36 #if defined(__DARWIN__)
37 #include <CoreFoundation/CFBundle.h>
38 #include <CoreFoundation/CFURL.h>
39 #else
40 #include <CFBundle.h>
41 #include <CFURL.h>
42 #endif
43
44 #if defined(__WXCOCOA__) || defined(__WXMAC_OSX__)
45 #define kDefaultPathStyle kCFURLPOSIXPathStyle
46 #else
47 #define kDefaultPathStyle kCFURLHFSPathStyle
48 #endif
49
50 // ============================================================================
51 // implementation
52 // ============================================================================
53
54 // ----------------------------------------------------------------------------
55 // wxStandardPathsCF ctors/dtor
56 // ----------------------------------------------------------------------------
57
58 wxStandardPathsCF::wxStandardPathsCF()
59 : m_bundle(CFBundleGetMainBundle())
60 {
61 CFRetain(m_bundle);
62 }
63
64 wxStandardPathsCF::wxStandardPathsCF(wxCFBundleRef bundle)
65 : m_bundle(bundle)
66 {
67 CFRetain(m_bundle);
68 }
69
70 wxStandardPathsCF::~wxStandardPathsCF()
71 {
72 CFRelease(m_bundle);
73 }
74
75 // ----------------------------------------------------------------------------
76 // wxStandardPathsCF Mac-specific methods
77 // ----------------------------------------------------------------------------
78
79 void wxStandardPathsCF::SetBundle(wxCFBundleRef bundle)
80 {
81 CFRetain(bundle);
82 CFRelease(m_bundle);
83 m_bundle = bundle;
84 }
85
86 // ----------------------------------------------------------------------------
87 // generic functions in terms of which the other ones are implemented
88 // ----------------------------------------------------------------------------
89
90 static wxString BundleRelativeURLToPath(CFURLRef relativeURL)
91 {
92 CFURLRef absoluteURL = CFURLCopyAbsoluteURL(relativeURL);
93 wxCHECK_MSG(absoluteURL, wxEmptyString, wxT("Failed to resolve relative URL to absolute URL"));
94 CFStringRef cfStrPath = CFURLCopyFileSystemPath(absoluteURL,kDefaultPathStyle);
95 CFRelease(absoluteURL);
96 return wxMacCFStringHolder(cfStrPath).AsString(wxLocale::GetSystemEncoding());
97 }
98
99 wxString wxStandardPathsCF::GetFromFunc(wxCFURLRef (*func)(wxCFBundleRef)) const
100 {
101 wxCHECK_MSG(m_bundle, wxEmptyString,
102 wxT("wxStandardPaths for CoreFoundation only works with bundled apps"));
103 CFURLRef relativeURL = (*func)(m_bundle);
104 wxCHECK_MSG(relativeURL, wxEmptyString, wxT("Couldn't get URL"));
105 wxString ret(BundleRelativeURLToPath(relativeURL));
106 CFRelease(relativeURL);
107 return ret;
108 }
109
110 wxString wxStandardPathsCF::GetDocumentsDir() const
111 {
112 #ifdef __WXMAC__
113 return wxMacFindFolderNoSeparator
114 (
115 #if TARGET_API_MAC_OSX
116 kUserDomain,
117 #else
118 kOnSystemDisk,
119 #endif
120 kDocumentsFolderType,
121 kCreateFolder
122 );
123 #else
124 return wxFileName::GetHomeDir() + wxT("/Documents");
125 #endif
126 }
127
128 // ----------------------------------------------------------------------------
129 // wxStandardPathsCF public API
130 // ----------------------------------------------------------------------------
131
132 wxString wxStandardPathsCF::GetConfigDir() const
133 {
134 #ifdef __WXMAC__
135 return wxMacFindFolder((short)kLocalDomain, kPreferencesFolderType, kCreateFolder);
136 #else
137 return wxT("/Library/Preferences");
138 #endif
139 }
140
141 wxString wxStandardPathsCF::GetUserConfigDir() const
142 {
143 #ifdef __WXMAC__
144 return wxMacFindFolder((short)kUserDomain, kPreferencesFolderType, kCreateFolder);
145 #else
146 return wxFileName::GetHomeDir() + wxT("/Library/Preferences");
147 #endif
148 }
149
150 wxString wxStandardPathsCF::GetDataDir() const
151 {
152 return GetFromFunc(CFBundleCopySharedSupportURL);
153 }
154
155 wxString wxStandardPathsCF::GetLocalDataDir() const
156 {
157 #ifdef __WXMAC__
158 return AppendAppName(wxMacFindFolder((short)kLocalDomain, kApplicationSupportFolderType, kCreateFolder));
159 #else
160 return AppendAppName(wxT("/Library/Application Support"));
161 #endif
162 }
163
164 wxString wxStandardPathsCF::GetUserDataDir() const
165 {
166 #ifdef __WXMAC__
167 return AppendAppName(wxMacFindFolder((short)kUserDomain, kApplicationSupportFolderType, kCreateFolder));
168 #else
169 return AppendAppName(wxFileName::GetHomeDir() + _T("/Library/Application Support"));
170 #endif
171 }
172
173 wxString wxStandardPathsCF::GetPluginsDir() const
174 {
175 return GetFromFunc(CFBundleCopyBuiltInPlugInsURL);
176 }
177
178 wxString wxStandardPathsCF::GetResourcesDir() const
179 {
180 return GetFromFunc(CFBundleCopyResourcesDirectoryURL);
181 }
182
183 wxString
184 wxStandardPathsCF::GetLocalizedResourcesDir(const wxChar *lang,
185 ResourceCat category) const
186 {
187 return wxStandardPathsBase::
188 GetLocalizedResourcesDir(lang, category) + _T(".lproj");
189 }
190
191 #endif // wxUSE_STDPATHS