gtk+ r19931 - in trunk: . gdk/win32



Author: tml
Date: Mon Mar 24 17:35:02 2008
New Revision: 19931
URL: http://svn.gnome.org/viewvc/gtk+?rev=19931&view=rev

Log:
2008-03-24  Tor Lillqvist  <tml novell com>

	Bug 524151 - Dragging of 0-byte files results in an empty filename
	on Windows XP and above

	* gdk/win32/gdkdnd-win32.c (resolve_link): Check for the file
	being empty first. For some reason ISHellLink and IPersistFile
	succeeds in interpreting empty files as shortcuts, claiming the
	target of the shortcut is an empty path.

	Change the function to take the wide character file name that the
	caller already has anyway, to avoid a superfluous conversion from
	UTF-8 to UTF-16.



Modified:
   trunk/ChangeLog
   trunk/gdk/win32/gdkdnd-win32.c

Modified: trunk/gdk/win32/gdkdnd-win32.c
==============================================================================
--- trunk/gdk/win32/gdkdnd-win32.c	(original)
+++ trunk/gdk/win32/gdkdnd-win32.c	Mon Mar 24 17:35:02 2008
@@ -851,15 +851,24 @@
 
 /* From MS Knowledge Base article Q130698 */
 
-static HRESULT 
+static gboolean
 resolve_link (HWND     hWnd,
-	      guchar  *lpszLinkName,
+	      wchar_t *link,
 	      guchar **lpszPath)
 {
+  WIN32_FILE_ATTRIBUTE_DATA wfad;
   HRESULT hres;
   IShellLinkW *pslW = NULL;
   IPersistFile *ppf = NULL;
 
+  /* Check if the file is empty first because IShellLink::Resolve for
+   * some reason succeeds with an empty file and returns an empty
+   * "link target". (#524151)
+   */
+    if (!GetFileAttributesExW (link, GetFileExInfoStandard, &wfad) ||
+	(wfad.nFileSizeHigh == 0 && wfad.nFileSizeLow == 0))
+      return FALSE;
+
   /* Assume failure to start with: */
   *lpszPath = 0;
 
@@ -887,12 +896,8 @@
 
   if (SUCCEEDED (hres))
     {
-      /* Convert the given link name string to wide character string. */
-      wchar_t *wsz = g_utf8_to_utf16 (lpszLinkName, -1, NULL, NULL, NULL);
-
       /* Load the file. */
-      hres = ppf->lpVtbl->Load (ppf, wsz, STGM_READ);
-      g_free (wsz);
+      hres = ppf->lpVtbl->Load (ppf, link, STGM_READ);
     }
   
   if (SUCCEEDED (hres))
@@ -977,7 +982,7 @@
 	  fileName = g_utf16_to_utf8 (wfn, -1, NULL, NULL, NULL);
 
 	  /* Resolve shortcuts */
-	  if (resolve_link (msg->hwnd, fileName, &linkedFile))
+	  if (resolve_link (msg->hwnd, wfn, &linkedFile))
 	    {
 	      uri = g_filename_to_uri (linkedFile, NULL, NULL);
 	      g_free (linkedFile);



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]