]> git.saurik.com Git - wxWidgets.git/blobdiff - src/msw/stdpaths.cpp
Out by one correction
[wxWidgets.git] / src / msw / stdpaths.cpp
index dcce507ce3cd157026480ebf005b7cbc9a3e2845..1f21d6d5aefb944ac5c6a212a10cbc744a752bd5 100644 (file)
     #pragma hdrstop
 #endif
 
+#if wxUSE_STDPATHS
+
+#include "wx/stdpaths.h"
+
 #ifndef WX_PRECOMP
-    #include "wx/app.h"
+    #include "wx/utils.h"
 #endif //WX_PRECOMP
 
 #include "wx/dynlib.h"
 #include "wx/filename.h"
 
-#include "wx/stdpaths.h"
-
 #include "wx/msw/private.h"
 #include "wx/msw/wrapshl.h"
 
@@ -48,7 +50,11 @@ typedef HRESULT (WINAPI *SHGetSpecialFolderPath_t)(HWND, LPTSTR, int, BOOL);
 // ----------------------------------------------------------------------------
 
 // used in our wxLogTrace messages
-static const wxChar *TRACE_MASK = _T("stdpaths");
+#define TRACE_MASK _T("stdpaths")
+
+#ifndef CSIDL_APPDATA
+    #define CSIDL_APPDATA         0x001a
+#endif
 
 #ifndef CSIDL_LOCAL_APPDATA
     #define CSIDL_LOCAL_APPDATA   0x001c
@@ -62,6 +68,17 @@ static const wxChar *TRACE_MASK = _T("stdpaths");
     #define CSIDL_PROGRAM_FILES   0x0026
 #endif
 
+#ifndef CSIDL_PERSONAL
+    #define CSIDL_PERSONAL        0x0005
+#endif
+
+#ifndef SHGFP_TYPE_CURRENT
+    #define SHGFP_TYPE_CURRENT 0
+#endif
+
+#ifndef SHGFP_TYPE_DEFAULT
+    #define SHGFP_TYPE_DEFAULT 1
+#endif
 // ----------------------------------------------------------------------------
 // module globals
 // ----------------------------------------------------------------------------
@@ -92,35 +109,46 @@ static ShellFunctions gs_shellFuncs;
 
 static void ResolveShellFunctions()
 {
-    // don't give errors if the functions are unavailable, we're ready to deal
-    // with this
-    wxLogNull noLog;
+#if wxUSE_DYNLIB_CLASS
 
     // start with the newest functions, fall back to the oldest ones
-
+#ifdef __WXWINCE__
+    wxString shellDllName(_T("coredll"));
+#else
     // first check for SHGetFolderPath (shell32.dll 5.0)
-    wxDynamicLibrary dllShell32(_T("shell32"));
-    if ( !dllShell32.IsLoaded() )
+    wxString shellDllName(_T("shell32"));
+#endif
+
+    wxDynamicLibrary dllShellFunctions( shellDllName );
+    if ( !dllShellFunctions.IsLoaded() )
     {
-        wxLogTrace(TRACE_MASK, _T("Failed to load shell32.dll"));
+        wxLogTrace(TRACE_MASK, _T("Failed to load %s.dll"), shellDllName.c_str() );
     }
 
+    // don't give errors if the functions are unavailable, we're ready to deal
+    // with this
+    wxLogNull noLog;
+
 #if wxUSE_UNICODE
-    static const wchar_t UNICODE_SUFFIX = L'W';
+    #ifdef __WXWINCE__
+        static const wchar_t UNICODE_SUFFIX = L''; // WinCE SH functions don't seem to have 'W'
+    #else
+        static const wchar_t UNICODE_SUFFIX = L'W';
+    #endif
 #else // !Unicode
     static const char UNICODE_SUFFIX = 'A';
 #endif // Unicode/!Unicode
 
     wxString funcname(_T("SHGetFolderPath"));
     gs_shellFuncs.pSHGetFolderPath =
-        (SHGetFolderPath_t)dllShell32.GetSymbol(funcname + UNICODE_SUFFIX);
+        (SHGetFolderPath_t)dllShellFunctions.GetSymbol(funcname + UNICODE_SUFFIX);
 
     // then for SHGetSpecialFolderPath (shell32.dll 4.71)
     if ( !gs_shellFuncs.pSHGetFolderPath )
     {
         funcname = _T("SHGetSpecialFolderPath");
         gs_shellFuncs.pSHGetSpecialFolderPath = (SHGetSpecialFolderPath_t)
-            dllShell32.GetSymbol(funcname + UNICODE_SUFFIX);
+            dllShellFunctions.GetSymbol(funcname + UNICODE_SUFFIX);
     }
 
     // finally we fall back on SHGetSpecialFolderLocation (shell32.dll 4.0),
@@ -130,6 +158,7 @@ static void ResolveShellFunctions()
     // because we also link to it statically, so it's ok
 
     gs_shellFuncs.initialized = true;
+#endif
 }
 
 // ============================================================================
@@ -217,28 +246,42 @@ wxString wxStandardPaths::DoGetDirectory(int csidl)
 }
 
 /* static */
-wxString wxStandardPaths::AppendAppName(const wxString& dir)
+wxString wxStandardPaths::GetAppDir()
 {
-    wxString subdir(dir);
+    wxFileName fn(wxGetFullModuleName());
 
-    // empty string indicates that an error has occured, don't touch it then
-    if ( !subdir.empty() )
+    // allow running the apps directly from build directory in debug builds
+#ifdef __WXDEBUG__
+    wxString lastdir;
+    if ( fn.GetDirCount() )
     {
-        const wxString appname = wxTheApp->GetAppName();
-        if ( !appname.empty() )
-            subdir << _T('\\') << appname;
+        lastdir = fn.GetDirs().Last();
+        lastdir.MakeLower();
+        if ( lastdir.Matches(_T("debug*")) || lastdir.Matches(_T("vc_msw*")) )
+            fn.RemoveLastDir();
     }
+#endif // __WXDEBUG__
+
+    return fn.GetPath();
+}
 
-    return subdir;
+wxString wxStandardPaths::GetDocumentsDir() const
+{
+    return DoGetDirectory(CSIDL_PERSONAL);
 }
 
 // ----------------------------------------------------------------------------
 // public functions
 // ----------------------------------------------------------------------------
 
+wxString wxStandardPaths::GetExecutablePath() const
+{
+    return wxGetFullModuleName();
+}
+
 wxString wxStandardPaths::GetConfigDir() const
 {
-    return AppendAppName(DoGetDirectory(CSIDL_COMMON_APPDATA));
+    return AppendAppInfo(DoGetDirectory(CSIDL_COMMON_APPDATA));
 }
 
 wxString wxStandardPaths::GetUserConfigDir() const
@@ -248,25 +291,28 @@ wxString wxStandardPaths::GetUserConfigDir() const
 
 wxString wxStandardPaths::GetDataDir() const
 {
-    return AppendAppName(DoGetDirectory(CSIDL_PROGRAM_FILES));
+    // under Windows each program is usually installed in its own directory and
+    // so its datafiles are in the same directory as its main executable
+    return GetAppDir();
 }
 
 wxString wxStandardPaths::GetUserDataDir() const
 {
-    return AppendAppName(GetUserConfigDir());
+    return AppendAppInfo(GetUserConfigDir());
 }
 
 wxString wxStandardPaths::GetUserLocalDataDir() const
 {
-    return AppendAppName(DoGetDirectory(CSIDL_LOCAL_APPDATA));
+    return AppendAppInfo(DoGetDirectory(CSIDL_LOCAL_APPDATA));
 }
 
 wxString wxStandardPaths::GetPluginsDir() const
 {
-    return wxFileName(wxGetFullModuleName()).GetPath();
+    // there is no standard location for plugins, suppose they're in the same
+    // directory as the .exe
+    return GetAppDir();
 }
 
-
 // ============================================================================
 // wxStandardPathsWin16 implementation
 // ============================================================================
@@ -276,10 +322,15 @@ wxString wxStandardPathsWin16::GetConfigDir() const
     // this is for compatibility with earlier wxFileConfig versions
     // which used the Windows directory for the global files
     wxString dir;
+#ifndef __WXWINCE__
     if ( !::GetWindowsDirectory(wxStringBuffer(dir, MAX_PATH), MAX_PATH) )
     {
         wxLogLastError(_T("GetWindowsDirectory"));
     }
+#else
+    // TODO: use CSIDL_WINDOWS (eVC4, possibly not eVC3)
+    dir = wxT("\\Windows");
+#endif
 
     return dir;
 }
@@ -290,3 +341,4 @@ wxString wxStandardPathsWin16::GetUserConfigDir() const
     return wxGetHomeDir();
 }
 
+#endif // wxUSE_STDPATHS