}
#endif // Win32/16
-#elif defined(__WXPM__)
- // for now just create a file
- //
- // future enhancements can be to set some extended attributes for file
- // systems OS/2 supports that have them (HPFS, FAT32) and security
- // (HPFS386)
- static const wxChar *szMktempSuffix = wxT("XXX");
- path << dir << _T('/') << name << szMktempSuffix;
-
- // Temporarily remove - MN
- #ifndef __WATCOMC__
- ::DosCreateDir(wxStringBuffer(path, MAX_PATH), NULL);
- #endif
-
-#else // !Windows, !OS/2
+#else // !Windows
if ( dir.empty() )
{
#if defined(__WXMAC__) && !defined(__DARWIN__)
if ( dir.empty() )
{
// default
- #ifdef __DOS__
+ #if defined(__DOS__) || defined(__OS2__)
dir = _T(".");
#else
dir = _T("/tmp");
for ( size_t n = 0; n < numTries; n++ )
{
// 3 hex digits is enough for numTries == 1000 < 4096
- pathTry = path + wxString::Format(_T("%.03x"), n);
+ pathTry = path + wxString::Format(_T("%.03x"), (unsigned int) n);
if ( !wxFile::Exists(pathTry) )
{
break;
m_dirs.Add(dir);
}
+
+#ifdef __WIN32__
+ if ( (flags & wxPATH_NORM_SHORTCUT) )
+ {
+ wxString filename;
+ if (GetShortcutTarget(GetFullPath(format), filename))
+ {
+ // Repeat this since we may now have a new path
+ if ( (flags & wxPATH_NORM_CASE) && !IsCaseSensitive(format) )
+ {
+ filename.MakeLower();
+ }
+ m_relative = false;
+ Assign(filename);
+ }
+ }
+#endif
if ( (flags & wxPATH_NORM_CASE) && !IsCaseSensitive(format) )
{
return true;
}
+// ----------------------------------------------------------------------------
+// get the shortcut target
+// ----------------------------------------------------------------------------
+
+// WinCE (3) doesn't have CLSID_ShellLink, IID_IShellLink definitions.
+// The .lnk file is a plain text file so it should be easy to
+// make it work. Hint from Google Groups:
+// "If you open up a lnk file, you'll see a
+// number, followed by a pound sign (#), followed by more text. The
+// number is the number of characters that follows the pound sign. The
+// characters after the pound sign are the command line (which _can_
+// include arguments) to be executed. Any path (e.g. \windows\program
+// files\myapp.exe) that includes spaces needs to be enclosed in
+// quotation marks."
+
+#if defined(__WIN32__) && !defined(__WXWINCE__)
+// The following lines are necessary under WinCE
+// #include "wx/msw/private.h"
+// #include <ole2.h>
+#include <shlobj.h>
+#if defined(__WXWINCE__)
+#include <shlguid.h>
+#endif
+#endif
+
+#ifdef __WIN32__
+bool wxFileName::GetShortcutTarget(const wxString& shortcutPath, wxString& targetFilename, wxString* arguments)
+{
+#ifdef __WXWINCE__
+ // Doesn't compile on WinCE yet
+ return FALSE;
+#else
+ wxString path, file, ext;
+ wxSplitPath(shortcutPath, & path, & file, & ext);
+
+ HRESULT hres;
+ IShellLink* psl;
+ bool success = FALSE;
+
+ // Assume it's not a shortcut if it doesn't end with lnk
+ if (ext.Lower() != wxT("lnk"))
+ return FALSE;
+
+ // create a ShellLink object
+ hres = CoCreateInstance(CLSID_ShellLink, NULL, CLSCTX_INPROC_SERVER,
+ IID_IShellLink, (LPVOID*) &psl);
+
+ if (SUCCEEDED(hres))
+ {
+ IPersistFile* ppf;
+ hres = psl->QueryInterface( IID_IPersistFile, (LPVOID *) &ppf);
+ if (SUCCEEDED(hres))
+ {
+ WCHAR wsz[MAX_PATH];
+
+ MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED, shortcutPath.mb_str(), -1, wsz,
+ MAX_PATH);
+
+ hres = ppf->Load(wsz, 0);
+ if (SUCCEEDED(hres))
+ {
+ wxChar buf[2048];
+ psl->GetPath(buf, 2048, NULL, SLGP_UNCPRIORITY);
+ targetFilename = wxString(buf);
+ success = (shortcutPath != targetFilename);
+
+ psl->GetArguments(buf, 2048);
+ wxString args(buf);
+ if (!args.IsEmpty() && arguments)
+ {
+ *arguments = args;
+ }
+ }
+ }
+ }
+ psl->Release();
+ return success;
+#endif
+}
+#endif
+
+
// ----------------------------------------------------------------------------
// absolute/relative paths
// ----------------------------------------------------------------------------
// normally the absolute file names start with a slash
// with one exception: the ones like "~/foo.bar" don't
// have it
- if ( m_dirs[0u] != _T('~') )
+ if ( m_dirs.IsEmpty() || m_dirs[0u] != _T('~') )
{
fullpath += wxFILE_SEP_PATH_UNIX;
}
{
if (format == wxPATH_NATIVE)
{
-#if defined(__WXMSW__) || defined(__WXPM__) || defined(__DOS__)
+#if defined(__WXMSW__) || defined(__OS2__) || defined(__DOS__)
format = wxPATH_DOS;
#elif defined(__WXMAC__) && !defined(__DARWIN__)
format = wxPATH_MAC;