]> git.saurik.com Git - wxWidgets.git/blob - src/mac/corefoundation/stdpaths_cf.cpp
forward port from 2.8
[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
35 #if defined(__DARWIN__)
36 #include <CoreFoundation/CFBundle.h>
37 #include <CoreFoundation/CFURL.h>
38 #else
39 #include <CFBundle.h>
40 #include <CFURL.h>
41 #endif
42
43 #if defined(__WXCOCOA__) || defined(__WXMAC_OSX__)
44 #define kDefaultPathStyle kCFURLPOSIXPathStyle
45 #else
46 #define kDefaultPathStyle kCFURLHFSPathStyle
47 #endif
48
49 // ============================================================================
50 // implementation
51 // ============================================================================
52
53 // ----------------------------------------------------------------------------
54 // wxStandardPathsCF ctors/dtor
55 // ----------------------------------------------------------------------------
56
57 wxStandardPathsCF::wxStandardPathsCF()
58 : m_bundle(CFBundleGetMainBundle())
59 {
60 CFRetain(m_bundle);
61 }
62
63 wxStandardPathsCF::wxStandardPathsCF(wxCFBundleRef bundle)
64 : m_bundle(bundle)
65 {
66 CFRetain(m_bundle);
67 }
68
69 wxStandardPathsCF::~wxStandardPathsCF()
70 {
71 CFRelease(m_bundle);
72 }
73
74 // ----------------------------------------------------------------------------
75 // wxStandardPathsCF Mac-specific methods
76 // ----------------------------------------------------------------------------
77
78 void wxStandardPathsCF::SetBundle(wxCFBundleRef bundle)
79 {
80 CFRetain(bundle);
81 CFRelease(m_bundle);
82 m_bundle = bundle;
83 }
84
85 // ----------------------------------------------------------------------------
86 // generic functions in terms of which the other ones are implemented
87 // ----------------------------------------------------------------------------
88
89 static wxString BundleRelativeURLToPath(CFURLRef relativeURL)
90 {
91 CFURLRef absoluteURL = CFURLCopyAbsoluteURL(relativeURL);
92 wxCHECK_MSG(absoluteURL, wxEmptyString, wxT("Failed to resolve relative URL to absolute URL"));
93 CFStringRef cfStrPath = CFURLCopyFileSystemPath(absoluteURL,kDefaultPathStyle);
94 CFRelease(absoluteURL);
95 return wxMacCFStringHolder(cfStrPath).AsString(wxLocale::GetSystemEncoding());
96 }
97
98 wxString wxStandardPathsCF::GetFromFunc(wxCFURLRef (*func)(wxCFBundleRef)) const
99 {
100 wxCHECK_MSG(m_bundle, wxEmptyString,
101 wxT("wxStandardPaths for CoreFoundation only works with bundled apps"));
102 CFURLRef relativeURL = (*func)(m_bundle);
103 wxCHECK_MSG(relativeURL, wxEmptyString, wxT("Couldn't get URL"));
104 wxString ret(BundleRelativeURLToPath(relativeURL));
105 CFRelease(relativeURL);
106 return ret;
107 }
108
109 wxString wxStandardPathsCF::GetDocumentsDir() const
110 {
111 #ifdef __WXMAC__
112 return wxMacFindFolderNoSeparator
113 (
114 #if TARGET_API_MAC_OSX
115 kUserDomain,
116 #else
117 kOnSystemDisk,
118 #endif
119 kDocumentsFolderType,
120 kCreateFolder
121 );
122 #else
123 return wxFileName::GetHomeDir() + wxT("/Documents");
124 #endif
125 }
126
127 // ----------------------------------------------------------------------------
128 // wxStandardPathsCF public API
129 // ----------------------------------------------------------------------------
130
131 wxString wxStandardPathsCF::GetConfigDir() const
132 {
133 #ifdef __WXMAC__
134 return wxMacFindFolder((short)kLocalDomain, kPreferencesFolderType, kCreateFolder);
135 #else
136 return wxT("/Library/Preferences");
137 #endif
138 }
139
140 wxString wxStandardPathsCF::GetUserConfigDir() const
141 {
142 #ifdef __WXMAC__
143 return wxMacFindFolder((short)kUserDomain, kPreferencesFolderType, kCreateFolder);
144 #else
145 return wxFileName::GetHomeDir() + wxT("/Library/Preferences");
146 #endif
147 }
148
149 wxString wxStandardPathsCF::GetDataDir() const
150 {
151 return GetFromFunc(CFBundleCopySharedSupportURL);
152 }
153
154 // TODO: implement this using real CoreFoundation API instead of Carbon API
155 wxString wxStandardPathsCF::GetExecutablePath() const
156 {
157 #ifdef __WXMAC__
158 ProcessInfoRec processinfo;
159 ProcessSerialNumber procno ;
160 FSSpec fsSpec;
161
162 procno.highLongOfPSN = 0 ;
163 procno.lowLongOfPSN = kCurrentProcess ;
164 processinfo.processInfoLength = sizeof(ProcessInfoRec);
165 processinfo.processName = NULL;
166 processinfo.processAppSpec = &fsSpec;
167
168 GetProcessInformation( &procno , &processinfo ) ;
169 #ifdef __LP64__
170 return wxMacFSRefToPath(&fsRef);
171 #else
172 return wxMacFSSpec2MacFilename(&fsSpec);
173 #endif
174 #else
175 return wxStandardPathsBase::GetExecutablePath();
176 #endif
177 }
178
179 wxString wxStandardPathsCF::GetLocalDataDir() const
180 {
181 #ifdef __WXMAC__
182 return AppendAppName(wxMacFindFolder((short)kLocalDomain, kApplicationSupportFolderType, kCreateFolder));
183 #else
184 return AppendAppName(wxT("/Library/Application Support"));
185 #endif
186 }
187
188 wxString wxStandardPathsCF::GetUserDataDir() const
189 {
190 #ifdef __WXMAC__
191 return AppendAppName(wxMacFindFolder((short)kUserDomain, kApplicationSupportFolderType, kCreateFolder));
192 #else
193 return AppendAppName(wxFileName::GetHomeDir() + _T("/Library/Application Support"));
194 #endif
195 }
196
197 wxString wxStandardPathsCF::GetPluginsDir() const
198 {
199 return GetFromFunc(CFBundleCopyBuiltInPlugInsURL);
200 }
201
202 wxString wxStandardPathsCF::GetResourcesDir() const
203 {
204 return GetFromFunc(CFBundleCopyResourcesDirectoryURL);
205 }
206
207 wxString
208 wxStandardPathsCF::GetLocalizedResourcesDir(const wxString& lang,
209 ResourceCat category) const
210 {
211 return wxStandardPathsBase::
212 GetLocalizedResourcesDir(lang, category) + _T(".lproj");
213 }
214
215 #endif // wxUSE_STDPATHS