]> git.saurik.com Git - wxWidgets.git/blobdiff - src/common/filename.cpp
add an overview
[wxWidgets.git] / src / common / filename.cpp
index e18d20c657201b86241e0d0979e6ed777452bc32..088123b720022271b70dba9cc6f41787c54fe800 100644 (file)
@@ -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");
@@ -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 <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
 // ----------------------------------------------------------------------------
@@ -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;