///////////////////////////////////////////////////////////////////////////////
-// Name: common/stdpbase.cpp
+// Name: src/common/stdpbase.cpp
// Purpose: wxStandardPathsBase methods common to all ports
// Author: Vadim Zeitlin
// Modified by:
// Created: 2004-10-19
-// RCS-ID: $Id$
// Copyright: (c) 2004 Vadim Zeitlin <vadim@wxwindows.org>
-// License: wxWindows license
+// Licence: wxWindows licence
///////////////////////////////////////////////////////////////////////////////
// ============================================================================
#ifndef WX_PRECOMP
#include "wx/app.h"
#endif //WX_PRECOMP
+#include "wx/apptrait.h"
#include "wx/filename.h"
#include "wx/stdpaths.h"
// 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
/* static */
wxStandardPaths& wxStandardPathsBase::Get()
+{
+ wxAppTraits * const traits = wxTheApp ? wxTheApp->GetTraits() : NULL;
+ wxCHECK_MSG( traits, gs_stdPaths, wxT("create wxApp before calling this") );
+
+ return traits->GetStandardPaths();
+}
+
+wxString wxStandardPathsBase::GetExecutablePath() const
+{
+ if ( !wxTheApp || !wxTheApp->argv )
+ return wxEmptyString;
+
+ wxString argv0 = wxTheApp->argv[0];
+ if (wxIsAbsolutePath(argv0))
+ return argv0;
+
+ // Search PATH.environment variable...
+ wxPathList pathlist;
+ pathlist.AddEnvList(wxT("PATH"));
+ wxString path = pathlist.FindAbsoluteValidPath(argv0);
+ if ( path.empty() )
+ return argv0; // better than nothing
+
+ wxFileName filename(path);
+ filename.Normalize();
+ return filename.GetFullPath();
+}
+
+wxStandardPaths& wxAppTraitsBase::GetStandardPaths()
{
return gs_stdPaths;
}
+wxStandardPathsBase::wxStandardPathsBase()
+{
+ // Set the default information that is used when
+ // forming some paths (by AppendAppInfo).
+ // Derived classes can call this in their constructors
+ // to set the platform-specific settings
+ UseAppInfo(AppInfo_AppName);
+}
+
wxStandardPathsBase::~wxStandardPathsBase()
{
// nothing to do here
return GetUserDataDir();
}
+wxString wxStandardPathsBase::GetDocumentsDir() const
+{
+ return wxFileName::GetHomeDir();
+}
+
+wxString wxStandardPathsBase::GetAppDocumentsDir() const
+{
+ const wxString docsDir = GetDocumentsDir();
+ wxString appDocsDir = AppendAppInfo(docsDir);
+
+ return wxDirExists(appDocsDir) ? appDocsDir : docsDir;
+}
+
+// return the temporary directory for the current user
+wxString wxStandardPathsBase::GetTempDir() const
+{
+ return wxFileName::GetTempDir();
+}
+
/* static */
-wxString wxStandardPathsBase::AppendAppName(const wxString& dir)
+wxString
+wxStandardPathsBase::AppendPathComponent(const wxString& dir,
+ const wxString& component)
{
wxString subdir(dir);
- // empty string indicates that an error has occured, don't touch it then
+ // empty string indicates that an error has occurred, don't touch it then
if ( !subdir.empty() )
{
- const wxString appname = wxTheApp->GetAppName();
- if ( !appname.empty() )
+ if ( !component.empty() )
{
const wxChar ch = *(subdir.end() - 1);
- if ( !wxFileName::IsPathSeparator(ch) && ch != _T('.') )
+ if ( !wxFileName::IsPathSeparator(ch) && ch != wxT('.') )
subdir += wxFileName::GetPathSeparator();
- subdir += appname;
+ subdir += component;
}
}
return subdir;
}
+
+wxString wxStandardPathsBase::AppendAppInfo(const wxString& dir) const
+{
+ wxString subdir(dir);
+
+ if ( UsesAppInfo(AppInfo_VendorName) )
+ {
+ subdir = AppendPathComponent(subdir, wxTheApp->GetVendorName());
+ }
+
+ if ( UsesAppInfo(AppInfo_AppName) )
+ {
+ subdir = AppendPathComponent(subdir, wxTheApp->GetAppName());
+ }
+
+ return subdir;
+}
+