Mercurial > emacs
changeset 112003:2a665aeb6cbc
* dnd.el (dnd-get-local-file-name): Unhex of file name shall
always be performed (Bug#7680).
author | Jan D. <jan.h.d@swipnet.se> |
---|---|
date | Mon, 20 Dec 2010 21:11:01 +0100 |
parents | dc2134428db3 |
children | 7a4b15c4bbed |
files | lisp/ChangeLog lisp/dnd.el |
diffstat | 2 files changed, 20 insertions(+), 15 deletions(-) [+] |
line wrap: on
line diff
--- a/lisp/ChangeLog Mon Dec 20 22:44:28 2010 +0800 +++ b/lisp/ChangeLog Mon Dec 20 21:11:01 2010 +0100 @@ -1,3 +1,8 @@ +2010-12-20 Leo <sdl.web@gmail.com> + + * dnd.el (dnd-get-local-file-name): Unhex of file name shall + always be performed (Bug#7680). + 2010-12-20 Chong Yidong <cyd@stupidchicken.com> * menu-bar.el (menu-bar-kill-ring-save): Make obsolete.
--- a/lisp/dnd.el Mon Dec 20 22:44:28 2010 +0800 +++ b/lisp/dnd.el Mon Dec 20 21:11:01 2010 +0100 @@ -135,6 +135,16 @@ (string-equal system-name-no-dot hostname))) (concat "file://" (substring uri (+ 7 (length hostname))))))) +(defsubst dnd-unescape-uri (uri) + (replace-regexp-in-string + "%[A-Fa-f0-9][A-Fa-f0-9]" + (lambda (arg) + (let ((str (make-string 1 0))) + (aset str 0 (string-to-number (substring arg 1) 16)) + str)) + uri t t)) + +;; http://lists.gnu.org/archive/html/emacs-devel/2006-05/msg01060.html (defun dnd-get-local-file-name (uri &optional must-exist) "Return file name converted from file:/// or file: syntax. URI is the uri for the file. If MUST-EXIST is given and non-nil, @@ -144,21 +154,11 @@ (substring uri (1- (match-end 0)))) ((string-match "^file:" uri) ; Old KDE, Motif, Sun (substring uri (match-end 0)))))) - (when (and f must-exist) - (setq f (replace-regexp-in-string - "%[A-Fa-f0-9][A-Fa-f0-9]" - (lambda (arg) - (let ((str (make-string 1 0))) - (aset str 0 (string-to-number (substring arg 1) 16)) - str)) - f t t)) - (let* ((decoded-f (decode-coding-string - f - (or file-name-coding-system - default-file-name-coding-system)))) - (setq f (cond ((file-readable-p decoded-f) decoded-f) - ((file-readable-p f) f) - (t nil))))) + (and f (setq f (decode-coding-string (dnd-unescape-uri f) + (or file-name-coding-system + default-file-name-coding-system)))) + (when (and f must-exist (not (file-readable-p f))) + (setq f nil)) f)) (defun dnd-open-local-file (uri action)