]> git.saurik.com Git - wxWidgets.git/blobdiff - src/common/filename.cpp
cleanup in toplevel activation, and switching to native carbon event notification...
[wxWidgets.git] / src / common / filename.cpp
index 062ddc41fb7c7134d514b22f1cf3b61ece76201d..0659a8b565749e16a65c9cdee72522d8ef9c941e 100644 (file)
@@ -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 <ole2.h>
+#include <shlobj.h>
+#if defined(__WXWINCE__)
+#include <shlguid.h>
+#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 )
 {