]> git.saurik.com Git - wxWidgets.git/blame - src/mac/corefoundation/stdpaths_cf.cpp
fix assert when the control doesn't have a valid date initially (bug 1648192)
[wxWidgets.git] / src / mac / corefoundation / stdpaths_cf.cpp
CommitLineData
726b98e9
DE
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
3af9f2de
VZ
12// ============================================================================
13// declarations
14// ============================================================================
15
16// ----------------------------------------------------------------------------
17// headers
18// ----------------------------------------------------------------------------
19
726b98e9 20#include "wx/wxprec.h"
07158944
VZ
21
22#if wxUSE_STDPATHS
23
726b98e9
DE
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"
f5158fa6
SC
30#ifdef __WXMAC__
31#include "wx/mac/private.h"
32#endif
726b98e9
DE
33#include "wx/mac/corefoundation/cfstring.h"
34
072a99f4 35#if defined(__DARWIN__)
726b98e9
DE
36#include <CoreFoundation/CFBundle.h>
37#include <CoreFoundation/CFURL.h>
072a99f4
DE
38#else
39#include <CFBundle.h>
40#include <CFURL.h>
41#endif
726b98e9 42
726b98e9
DE
43#if defined(__WXCOCOA__) || defined(__WXMAC_OSX__)
44#define kDefaultPathStyle kCFURLPOSIXPathStyle
45#else
46#define kDefaultPathStyle kCFURLHFSPathStyle
47#endif
48
3af9f2de
VZ
49// ============================================================================
50// implementation
51// ============================================================================
52
53// ----------------------------------------------------------------------------
54// wxStandardPathsCF ctors/dtor
55// ----------------------------------------------------------------------------
726b98e9 56
fc480dc1 57wxStandardPathsCF::wxStandardPathsCF()
3af9f2de 58 : m_bundle(CFBundleGetMainBundle())
726b98e9
DE
59{
60 CFRetain(m_bundle);
61}
62
3af9f2de
VZ
63wxStandardPathsCF::wxStandardPathsCF(wxCFBundleRef bundle)
64 : m_bundle(bundle)
726b98e9
DE
65{
66 CFRetain(m_bundle);
67}
68
fc480dc1 69wxStandardPathsCF::~wxStandardPathsCF()
726b98e9
DE
70{
71 CFRelease(m_bundle);
72}
73
3af9f2de
VZ
74// ----------------------------------------------------------------------------
75// wxStandardPathsCF Mac-specific methods
76// ----------------------------------------------------------------------------
77
78void wxStandardPathsCF::SetBundle(wxCFBundleRef bundle)
726b98e9
DE
79{
80 CFRetain(bundle);
81 CFRelease(m_bundle);
82 m_bundle = bundle;
83}
84
3af9f2de
VZ
85// ----------------------------------------------------------------------------
86// generic functions in terms of which the other ones are implemented
87// ----------------------------------------------------------------------------
88
89static 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
98wxString 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
17af82fb
VZ
109wxString wxStandardPathsCF::GetDocumentsDir() const
110{
747592e7 111#ifdef __WXMAC__
17af82fb
VZ
112 return wxMacFindFolderNoSeparator
113 (
114#if TARGET_API_MAC_OSX
115 kUserDomain,
116#else
117 kOnSystemDisk,
118#endif
119 kDocumentsFolderType,
120 kCreateFolder
121 );
747592e7
SC
122#else
123 return wxFileName::GetHomeDir() + wxT("/Documents");
124#endif
17af82fb
VZ
125}
126
3af9f2de
VZ
127// ----------------------------------------------------------------------------
128// wxStandardPathsCF public API
129// ----------------------------------------------------------------------------
130
fc480dc1 131wxString wxStandardPathsCF::GetConfigDir() const
726b98e9 132{
f5158fa6
SC
133#ifdef __WXMAC__
134 return wxMacFindFolder((short)kLocalDomain, kPreferencesFolderType, kCreateFolder);
135#else
726b98e9 136 return wxT("/Library/Preferences");
f5158fa6 137#endif
726b98e9
DE
138}
139
fc480dc1 140wxString wxStandardPathsCF::GetUserConfigDir() const
726b98e9 141{
f5158fa6
SC
142#ifdef __WXMAC__
143 return wxMacFindFolder((short)kUserDomain, kPreferencesFolderType, kCreateFolder);
144#else
726b98e9 145 return wxFileName::GetHomeDir() + wxT("/Library/Preferences");
f5158fa6 146#endif
726b98e9
DE
147}
148
fc480dc1 149wxString wxStandardPathsCF::GetDataDir() const
726b98e9 150{
3af9f2de 151 return GetFromFunc(CFBundleCopySharedSupportURL);
726b98e9
DE
152}
153
ac371a87 154// TODO: implement this using real CoreFoundation API instead of Carbon API
ac7ad70d
RR
155wxString wxStandardPathsCF::GetExecutablePath() const
156{
ac371a87 157#ifdef __WXMAC__
ac7ad70d
RR
158 ProcessInfoRec processinfo;
159 ProcessSerialNumber procno ;
160 FSSpec fsSpec;
161
90412a12 162 procno.highLongOfPSN = 0 ;
ac7ad70d
RR
163 procno.lowLongOfPSN = kCurrentProcess ;
164 processinfo.processInfoLength = sizeof(ProcessInfoRec);
165 processinfo.processName = NULL;
166 processinfo.processAppSpec = &fsSpec;
167
168 GetProcessInformation( &procno , &processinfo ) ;
169 return wxMacFSSpec2MacFilename(&fsSpec);
ac371a87
VZ
170#else
171 return wxStandardPathsBase::GetExecutablePath();
172#endif
ac7ad70d
RR
173}
174
fc480dc1 175wxString wxStandardPathsCF::GetLocalDataDir() const
726b98e9 176{
f5158fa6
SC
177#ifdef __WXMAC__
178 return AppendAppName(wxMacFindFolder((short)kLocalDomain, kApplicationSupportFolderType, kCreateFolder));
179#else
726b98e9 180 return AppendAppName(wxT("/Library/Application Support"));
f5158fa6 181#endif
726b98e9
DE
182}
183
fc480dc1 184wxString wxStandardPathsCF::GetUserDataDir() const
726b98e9 185{
f5158fa6
SC
186#ifdef __WXMAC__
187 return AppendAppName(wxMacFindFolder((short)kUserDomain, kApplicationSupportFolderType, kCreateFolder));
188#else
726b98e9 189 return AppendAppName(wxFileName::GetHomeDir() + _T("/Library/Application Support"));
f5158fa6 190#endif
726b98e9
DE
191}
192
fc480dc1 193wxString wxStandardPathsCF::GetPluginsDir() const
726b98e9 194{
3af9f2de
VZ
195 return GetFromFunc(CFBundleCopyBuiltInPlugInsURL);
196}
197
198wxString wxStandardPathsCF::GetResourcesDir() const
199{
200 return GetFromFunc(CFBundleCopyResourcesDirectoryURL);
201}
202
203wxString
204wxStandardPathsCF::GetLocalizedResourcesDir(const wxChar *lang,
205 ResourceCat category) const
206{
207 return wxStandardPathsBase::
208 GetLocalizedResourcesDir(lang, category) + _T(".lproj");
726b98e9
DE
209}
210
07158944 211#endif // wxUSE_STDPATHS