X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/5a3912f2aba8f5232315f7ca2206c50295ec21ea..73fe67bd60b57f95dc63809f7843ed2a15928436:/src/common/filename.cpp diff --git a/src/common/filename.cpp b/src/common/filename.cpp index 062ddc41fb..0659a8b565 100644 --- a/src/common/filename.cpp +++ b/src/common/filename.cpp @@ -585,7 +585,7 @@ wxFileName::CreateTempFileName(const wxString& prefix, wxFile *fileTemp) } #elif defined(__WINDOWS__) && !defined(__WXMICROWIN__) -#ifdef __WIN32__ + if ( dir.empty() ) { if ( !::GetTempPath(MAX_PATH, wxStringBuffer(dir, MAX_PATH + 1)) ) @@ -612,12 +612,6 @@ wxFileName::CreateTempFileName(const wxString& prefix, wxFile *fileTemp) path.clear(); } -#else // Win16 - if ( !::GetTempFileName(NULL, prefix, 0, wxStringBuffer(path, 1025)) ) - { - path.clear(); - } -#endif // Win32/16 #else // !Windows if ( dir.empty() ) @@ -945,6 +939,23 @@ bool wxFileName::Normalize(int flags, m_dirs.Add(dir); } + +#if defined(__WIN32__) && !defined(__WXWINCE__) && wxUSE_OLE + 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) ) { @@ -969,6 +980,81 @@ 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__) && wxUSE_OLE +// The following lines are necessary under WinCE +// #include "wx/msw/private.h" +// #include +#include +#if defined(__WXWINCE__) +#include +#endif + +bool wxFileName::GetShortcutTarget(const wxString& shortcutPath, wxString& targetFilename, wxString* arguments) +{ + 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 + + // ---------------------------------------------------------------------------- // absolute/relative paths // ---------------------------------------------------------------------------- @@ -1270,7 +1356,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; } @@ -1891,25 +1977,25 @@ WX_DEFINE_EXPORTED_OBJARRAY(MacDefaultExtensionArray) ; MacDefaultExtensionArray gMacDefaultExtensions ; -static void MacEnsureDefaultExtensionsLoaded() +// load the default extensions +MacDefaultExtensionRecord gDefaults[] = { - if ( !gMacDefaultExtensionsInited ) - { + MacDefaultExtensionRecord( wxT("txt") , 'TEXT' , 'ttxt' ) , + MacDefaultExtensionRecord( wxT("tif") , 'TIFF' , '****' ) , + MacDefaultExtensionRecord( wxT("jpg") , 'JPEG' , '****' ) , +} ; - // load the default extensions - MacDefaultExtensionRecord defaults[1] = - { - MacDefaultExtensionRecord( wxT("txt") , 'TEXT' , 'ttxt' ) , - - } ; - // we could load the pc exchange prefs here too - - for ( size_t i = 0 ; i < WXSIZEOF( defaults ) ; ++i ) +static void MacEnsureDefaultExtensionsLoaded() +{ + if ( !gMacDefaultExtensionsInited ) { - gMacDefaultExtensions.Add( defaults[i] ) ; + // we could load the pc exchange prefs here too + for ( size_t i = 0 ; i < WXSIZEOF( gDefaults ) ; ++i ) + { + gMacDefaultExtensions.Add( gDefaults[i] ) ; + } + gMacDefaultExtensionsInited = true ; } - gMacDefaultExtensionsInited = true ; - } } bool wxFileName::MacSetTypeAndCreator( wxUint32 type , wxUint32 creator ) {