[gtk+] Awful hack for problem in dnd of images from Firefox on Windows



commit 7fda8e6378d90bc8cf670ffe9dea682911e5e241
Author: Tor Lillqvist <tml iki fi>
Date:   Sun Nov 15 00:32:14 2009 +0200

    Awful hack for problem in dnd of images from Firefox on Windows
    
    Bypassed with #if 0 because it is an awful hack and not really
    acceptable from a privacy point of view for instance. It prevents
    Firefox from deleting temporary files containing images being dragged,
    so they stay on disk. Bug #561973.

 gdk/win32/gdkdnd-win32.c |   78 +++++++++++++++++++++++++++++++++++++++++++++-
 1 files changed, 77 insertions(+), 1 deletions(-)
---
diff --git a/gdk/win32/gdkdnd-win32.c b/gdk/win32/gdkdnd-win32.c
index 5b6e0f6..674643d 100644
--- a/gdk/win32/gdkdnd-win32.c
+++ b/gdk/win32/gdkdnd-win32.c
@@ -28,6 +28,9 @@
 #include "config.h"
 #include <string.h>
 
+#include <io.h>
+#include <fcntl.h>
+
 /* #define OLE2_DND */
 
 #define INITGUID
@@ -47,6 +50,7 @@
 #include <shlguid.h>
 
 #include <gdk/gdk.h>
+#include <glib/gstdio.h>
 
 typedef struct _GdkDragContextPrivateWin32 GdkDragContextPrivateWin32;
 
@@ -941,6 +945,45 @@ resolve_link (HWND     hWnd,
   return SUCCEEDED (hres);
 }
 
+#if 0
+
+/* Check for filenames like C:\Users\tml\AppData\Local\Temp\d5qtkvvs.bmp */
+static gboolean
+filename_looks_tempish (const char *filename)
+{
+  char *dirname;
+  char *p;
+  const char *q;
+  gboolean retval = FALSE;
+
+  dirname = g_path_get_dirname (filename);
+
+  p = dirname;
+  q = g_get_tmp_dir ();
+
+  while (*p && *q &&
+	 ((G_IS_DIR_SEPARATOR (*p) && G_IS_DIR_SEPARATOR (*q)) ||
+	  g_ascii_tolower (*p) == g_ascii_tolower (*q)))
+    p++, q++;
+
+  if (!*p && !*q)
+    retval = TRUE;
+
+  g_free (dirname);
+
+  return retval;
+}
+
+static gboolean
+close_it (gpointer data)
+{
+  close (GPOINTER_TO_INT (data));
+
+  return FALSE;
+}
+
+#endif
+
 static GdkFilterReturn
 gdk_dropfiles_filter (GdkXEvent *xev,
 		      GdkEvent  *event,
@@ -1000,7 +1043,6 @@ gdk_dropfiles_filter (GdkXEvent *xev,
 	  if (resolve_link (msg->hwnd, wfn, &linkedFile))
 	    {
 	      uri = g_filename_to_uri (linkedFile, NULL, NULL);
-	      g_free (linkedFile);
 	      if (uri != NULL)
 		{
 		  g_string_append (result, uri);
@@ -1008,6 +1050,8 @@ gdk_dropfiles_filter (GdkXEvent *xev,
 					  fileName, linkedFile, uri));
 		  g_free (uri);
 		}
+	      g_free (fileName);
+	      fileName = linkedFile;
 	    }
 	  else
 	    {
@@ -1019,6 +1063,38 @@ gdk_dropfiles_filter (GdkXEvent *xev,
 		  g_free (uri);
 		}
 	    }
+
+#if 0
+	  /* Awful hack to recognize temp files corresponding to
+	   * images dragged from Firefox... Open the file right here
+	   * so that it is less likely that Firefox manages to delete
+	   * it before the GTK+-using app (typically GIMP) has opened
+	   * it.
+	   *
+	   * Not compiled in for now, because it means images dragged
+	   * from Firefox would stay around in the temp folder which
+	   * is not what Firefox intended. I don't feel comfortable
+	   * with that, both from a geenral sanity point of view, and
+	   * from a privacy point of view. It's better to wait for
+	   * Firefox to fix the problem, for instance by deleting the
+	   * temp file after a longer delay, or to wait until we
+	   * implement the OLE2_DND...
+	   */
+	  if (filename_looks_tempish (fileName))
+	    {
+	      int fd = g_open (fileName, _O_RDONLY|_O_BINARY, 0);
+	      if (fd == -1)
+		{
+		  GDK_NOTE (DND, g_print ("Could not open %s, maybe an image dragged from Firefox that it already deleted\n", fileName));
+		}
+	      else
+		{
+		  GDK_NOTE (DND, g_print ("Opened %s as %d so that Firefox won't delete it\n", fileName, fd));
+		  g_timeout_add_seconds (1, close_it, GINT_TO_POINTER (fd));
+		}
+	    }
+#endif
+
 	  g_free (fileName);
 	  g_string_append (result, "\015\012");
 	}



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