Forbid creation of wxStandardPaths object directly.

This happens to work under MSW and Unix where there is only one
wxStandardPaths class for both the console and the GUI applications but
doesn't return the correct result under OS X where the Core Foundation
version, returned by wxStandardPaths::Get(), has to be used for the GUI
programs. And historically this confused a lot of people, so just ensure that
they can't accidentally create an object of the wrong type any more.

Closes #13537.

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@74428 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Vadim Zeitlin
2013-07-06 23:14:21 +00:00
parent ccaf2891c9
commit 38aae140ac
9 changed files with 71 additions and 10 deletions

View File

@@ -408,6 +408,10 @@ Changes in behaviour which may result in compilation errors
any more. Use wxBookCtrlEvent in your code if you need to forward-declare any more. Use wxBookCtrlEvent in your code if you need to forward-declare
it or just include the appropriate header instead of forward declaration. it or just include the appropriate header instead of forward declaration.
- wxStandardPaths class can't be created now. This was never the right thing
to do, wxStandardPaths::Get() always had to be used to access the global
object of the correct type but now doing it results in a compilation error.
Deprecated methods and their replacements Deprecated methods and their replacements
----------------------------------------- -----------------------------------------

View File

@@ -19,10 +19,6 @@
class WXDLLIMPEXP_BASE wxStandardPaths : public wxStandardPathsBase class WXDLLIMPEXP_BASE wxStandardPaths : public wxStandardPathsBase
{ {
public: public:
// ctor calls IgnoreAppBuildSubDirs() and also sets up the object to use
// both vendor and application name by default
wxStandardPaths();
// implement base class pure virtuals // implement base class pure virtuals
virtual wxString GetExecutablePath() const; virtual wxString GetExecutablePath() const;
virtual wxString GetConfigDir() const; virtual wxString GetConfigDir() const;
@@ -67,6 +63,13 @@ public:
static wxString MSWGetShellDir(int csidl); static wxString MSWGetShellDir(int csidl);
protected: protected:
// Ctor is protected, use wxStandardPaths::Get() instead of instantiating
// objects of this class directly.
//
// It calls IgnoreAppBuildSubDirs() and also sets up the object to use
// both vendor and application name by default.
wxStandardPaths();
// get the path corresponding to the given standard CSIDL_XXX constant // get the path corresponding to the given standard CSIDL_XXX constant
static wxString DoGetDirectory(int csidl); static wxString DoGetDirectory(int csidl);

View File

@@ -40,6 +40,11 @@ public:
virtual wxString GetUserDataDir() const; virtual wxString GetUserDataDir() const;
virtual wxString GetPluginsDir() const; virtual wxString GetPluginsDir() const;
protected:
// Ctor is protected, use wxStandardPaths::Get() instead of instantiating
// objects of this class directly.
wxStandardPaths() { }
private: private:
static wxString m_prefix; static wxString m_prefix;
}; };

View File

@@ -35,7 +35,6 @@ typedef __CFBundle * wxCFBundleRef;
class WXDLLIMPEXP_BASE wxStandardPathsCF : public wxStandardPathsCFBase class WXDLLIMPEXP_BASE wxStandardPathsCF : public wxStandardPathsCFBase
{ {
public: public:
wxStandardPathsCF();
virtual ~wxStandardPathsCF(); virtual ~wxStandardPathsCF();
// wxMac specific: allow user to specify a different bundle // wxMac specific: allow user to specify a different bundle
@@ -57,6 +56,10 @@ public:
virtual wxString GetDocumentsDir() const; virtual wxString GetDocumentsDir() const;
protected: protected:
// Ctor is protected, use wxStandardPaths::Get() instead of instantiating
// objects of this class directly.
wxStandardPathsCF();
// this function can be called with any of CFBundleCopyXXXURL function // this function can be called with any of CFBundleCopyXXXURL function
// pointer as parameter // pointer as parameter
wxString GetFromFunc(wxCFURLRef (*func)(wxCFBundleRef)) const; wxString GetFromFunc(wxCFURLRef (*func)(wxCFBundleRef)) const;

View File

@@ -142,9 +142,6 @@ public:
virtual wxString GetTempDir() const; virtual wxString GetTempDir() const;
// ctor for the base class
wxStandardPathsBase();
// virtual dtor for the base class // virtual dtor for the base class
virtual ~wxStandardPathsBase(); virtual ~wxStandardPathsBase();
@@ -158,6 +155,10 @@ public:
protected: protected:
// Ctor is protected as this is a base class which should never be created
// directly.
wxStandardPathsBase();
// append the path component, with a leading path separator if a // append the path component, with a leading path separator if a
// path separator or dot (.) is not already at the end of dir // path separator or dot (.) is not already at the end of dir
static wxString AppendPathComponent(const wxString& dir, const wxString& component); static wxString AppendPathComponent(const wxString& dir, const wxString& component);
@@ -210,6 +211,12 @@ public:
virtual wxString GetPluginsDir() const { return m_prefix; } virtual wxString GetPluginsDir() const { return m_prefix; }
virtual wxString GetDocumentsDir() const { return m_prefix; } virtual wxString GetDocumentsDir() const { return m_prefix; }
protected:
// Ctor is protected because wxStandardPaths::Get() should always be used
// to access the global wxStandardPaths object of the correct type instead
// of creating one of a possibly wrong type yourself.
wxStandardPaths() { }
private: private:
wxString m_prefix; wxString m_prefix;
}; };

View File

@@ -51,6 +51,11 @@ public:
virtual wxString GetDocumentsDir() const; virtual wxString GetDocumentsDir() const;
#endif #endif
protected:
// Ctor is protected, use wxStandardPaths::Get() instead of instantiating
// objects of this class directly.
wxStandardPaths() { }
private: private:
wxString m_prefix; wxString m_prefix;
}; };

View File

@@ -363,5 +363,15 @@ public:
@since 2.9.0 @since 2.9.0
*/ */
void UseAppInfo(int info); void UseAppInfo(int info);
protected:
/**
Protected default constructor.
This constructor is protected in order to prevent creation of objects
of this class as Get() should be used instead to access the unique
global wxStandardPaths object of the correct type.
*/
wxStandardPaths();
}; };

View File

@@ -36,7 +36,21 @@
// module globals // module globals
// ---------------------------------------------------------------------------- // ----------------------------------------------------------------------------
static wxStandardPaths gs_stdPaths; namespace
{
// Derive a class just to be able to create it: wxStandardPaths ctor is
// protected to prevent its misuse, but it also means we can't create an object
// of this class directly.
class wxStandardPathsDefault : public wxStandardPaths
{
public:
wxStandardPathsDefault() { }
};
static wxStandardPathsDefault gs_stdPaths;
} // anonymous namespace
// ============================================================================ // ============================================================================
// implementation // implementation

View File

@@ -156,9 +156,19 @@ wxEventLoopSourcesManagerBase* wxGUIAppTraits::GetEventLoopSourcesManager()
// NOTE: This doesn't really belong here but this was a handy file to // NOTE: This doesn't really belong here but this was a handy file to
// put it in because it's already compiled for wxCocoa and wxMac GUI lib. // put it in because it's already compiled for wxCocoa and wxMac GUI lib.
#if wxUSE_STDPATHS #if wxUSE_STDPATHS
static wxStandardPathsCF gs_stdPaths;
wxStandardPaths& wxGUIAppTraits::GetStandardPaths() wxStandardPaths& wxGUIAppTraits::GetStandardPaths()
{ {
// Derive a class just to be able to create it: wxStandardPaths ctor is
// protected to prevent its misuse, but it also means we can't create an
// object of this class directly.
class wxStandardPathsDefault : public wxStandardPathsCF
{
public:
wxStandardPathsDefault() { }
};
static wxStandardPathsDefault gs_stdPaths;
return gs_stdPaths; return gs_stdPaths;
} }
#endif #endif