X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/034742fcd653ebc1d5ddd7ee08e74834dc5a84e0..a6c7a0f826d5e156c177b4755365c3eb33e9b933:/src/common/filename.cpp?ds=inline diff --git a/src/common/filename.cpp b/src/common/filename.cpp index 4b0278f2c3..088123b720 100644 --- a/src/common/filename.cpp +++ b/src/common/filename.cpp @@ -619,21 +619,7 @@ wxFileName::CreateTempFileName(const wxString& prefix, wxFile *fileTemp) } #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__) @@ -648,7 +634,7 @@ wxFileName::CreateTempFileName(const wxString& prefix, wxFile *fileTemp) if ( dir.empty() ) { // default - #ifdef __DOS__ + #if defined(__DOS__) || defined(__OS2__) dir = _T("."); #else dir = _T("/tmp"); @@ -723,7 +709,7 @@ wxFileName::CreateTempFileName(const wxString& prefix, wxFile *fileTemp) 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; @@ -959,6 +945,23 @@ bool wxFileName::Normalize(int flags, 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) ) { @@ -983,6 +986,88 @@ bool wxFileName::Normalize(int flags, 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 +#include +#if defined(__WXWINCE__) +#include +#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 // ---------------------------------------------------------------------------- @@ -1284,7 +1369,7 @@ wxString wxFileName::GetPath( int flags, wxPathFormat format ) const // 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; } @@ -1526,7 +1611,7 @@ wxPathFormat wxFileName::GetFormat( wxPathFormat format ) { 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;