raster pushed a commit to branch master.

http://git.enlightenment.org/core/elementary.git/commit/?id=6de31e88b5b299dd1063419b2131402dc789d53e

commit 6de31e88b5b299dd1063419b2131402dc789d53e
Author: Wonguk Jeong <[email protected]>
Date:   Sat Nov 29 16:06:50 2014 +0900

    elm_cnp: decode escaped ASCII-encoded URI for dnd
    
    Summary:
    encoded URI is pasted in terminology on dnd with file which has blank in 
name
    ex. Test Blank.avi -> Test%20Blank.avi
    
    Therefore, decode it when we extract file uris from uri list by using 
efreet.
    by the way, copy and paste code likely needs refactoring..
    
    Reviewers: raster, cedric
    
    Subscribers: billiob, seoz
    
    Differential Revision: https://phab.enlightenment.org/D1384
---
 src/lib/elm_cnp.c | 62 +++++++++++++++++++++++++++++++++++++++++++------------
 1 file changed, 49 insertions(+), 13 deletions(-)

diff --git a/src/lib/elm_cnp.c b/src/lib/elm_cnp.c
index 0e98d8e..dcc484b 100644
--- a/src/lib/elm_cnp.c
+++ b/src/lib/elm_cnp.c
@@ -2,6 +2,7 @@
 # include "elementary_config.h"
 #endif
 #include <Elementary.h>
+#include <Efreet.h>
 #include "elm_priv.h"
 #ifdef HAVE_MMAN_H
 # include <sys/mman.h>
@@ -888,6 +889,7 @@ _x11_notify_handler_uri(X11_Cnp_Selection *sel, 
Ecore_X_Event_Selection_Notify *
    if (data->content == ECORE_X_SELECTION_CONTENT_FILES)
      {
         int i, len = 0;
+        Efreet_Uri **uri;
 
         cnp_debug("got a files list\n");
         files = notify->data;
@@ -900,11 +902,29 @@ _x11_notify_handler_uri(X11_Cnp_Selection *sel, 
Ecore_X_Event_Selection_Notify *
           }
         stripstr = p = strdup(files->files[0]);
          */
+
+        uri = calloc(1, sizeof(*uri) * files->num_files);
+        if (!uri) return 0;
+
         for (i = 0; i < files->num_files ; i++)
           {
-             p = files->files[i];
-             if ((strncmp(p, "file:/", 6)) && (p[0] != '/')) continue;
-             len += strlen(files->files[i]) + 1;
+             uri[i] = efreet_uri_decode(files->files[i]);
+             if (!uri[i])
+               {
+                  /* Is there any reason why we care of URI without scheme? */
+                  if (files->files[i][0] != '/') continue;
+                  len += strlen(files->files[i]) + 1;
+               }
+             else
+               {
+                  if (strcmp(uri[i]->protocol, "file"))
+                    {
+                       efreet_uri_free(uri[i]);
+                       uri[i] = NULL;
+                       continue;
+                    }
+                  len += strlen(uri[i]->path) + 1;
+               }
           }
         p = NULL;
         if (len > 0)
@@ -912,9 +932,11 @@ _x11_notify_handler_uri(X11_Cnp_Selection *sel, 
Ecore_X_Event_Selection_Notify *
              s = stripstr = malloc(len + 1);
              for (i = 0; i < files->num_files ; i++)
                {
-                  p = files->files[i];
-                  if (!strncmp(p, "file:/", 6)) p += 5;
-                  else if (p[0] != '/') continue;
+                  if (uri[i])
+                    p = (char *)uri[i]->path;
+                  else
+                    p = files->files[i];
+
                   len = strlen(p);
                   strcpy(s, p);
                   if (i < (files->num_files - 1))
@@ -928,26 +950,40 @@ _x11_notify_handler_uri(X11_Cnp_Selection *sel, 
Ecore_X_Event_Selection_Notify *
                        s[len] = 0;
                        s += len;
                     }
+
+                  if (uri[i])
+                    efreet_uri_free(uri[i]);
                }
           }
+        free(uri);
      }
    else
      {
+        Efreet_Uri *uri;
+        int len = 0;
+
         p = (char *)data->data;
-        if ((!strncmp(p, "file:/", 6)) || (p[0] == '/'))
+        uri = efreet_uri_decode(p);
+        if (!uri)
+          {
+             /* Is there any reason why we care of URI without scheme? */
+             if (p[0] == '/')
+               len = data->length;
+          }
+        else
+          {
+             p = (char *)uri->path;
+             len = strlen(p);
+          }
+        if (len > 0)
           {
-             int len = data->length;
-             if (!strncmp(p, "file:/", 6))
-               {
-                  p += 5;
-                  len -= 5;
-               }
              stripstr = malloc(len + 1);
              if (!stripstr) return 0;
              memcpy(stripstr, p, len);
              stripstr[len] = 0;
           }
      }
+
    if (!stripstr)
      {
         cnp_debug("Couldn't find a file\n");

-- 


Reply via email to