raster pushed a commit to branch master.

http://git.enlightenment.org/apps/rage.git/commit/?id=fd30f5936527d39687ed1c048c0e29b54df0796b

commit fd30f5936527d39687ed1c048c0e29b54df0796b
Author: Carsten Haitzler (Rasterman) <[email protected]>
Date:   Sun Feb 16 22:01:13 2014 +0900

    dnd - handle %20 etc. escapes in uri's
---
 src/bin/dnd.c | 68 +++++++++++++++++++++++++++++++++++++++++++++++++++++------
 1 file changed, 61 insertions(+), 7 deletions(-)

diff --git a/src/bin/dnd.c b/src/bin/dnd.c
index 1678b30..fe2baef 100644
--- a/src/bin/dnd.c
+++ b/src/bin/dnd.c
@@ -23,6 +23,45 @@ _cb_drag_pos(void *data EINA_UNUSED, Evas_Object *o 
EINA_UNUSED, Evas_Coord x, E
    printf("dnd at %i %i act:%i\n", x, y, action);
 }
 
+static int
+_xtov(char x)
+{
+   if ((x >= '0') && (x <= '9')) return x - '0';
+   if ((x >= 'a') && (x <= 'f')) return 10 + (x - 'a');
+   if ((x >= 'A') && (x <= 'F')) return 10 + (x - 'A');
+   return 0;
+}
+
+static char *
+_escape_parse(const char *str)
+{
+   char *dest = malloc(strlen(str) + 1);
+   char *d;
+   const char *s;
+
+   printf("conv '%s'\n", str);
+   for (d = dest, s = str; *s; d++)
+     {
+        if (s[0] == '%')
+          {
+             if (s[1] && s[2])
+               {
+                  *d = (_xtov(s[1]) << 4) | (_xtov(s[2]));
+                  s += 3;
+               }
+             else s++;
+          }
+        else
+          {
+             *d = s[0];
+             s++;
+          }
+     }
+   *d = 0;
+   printf("'%s'\n", dest);
+   return dest;
+}
+
 Eina_Bool
 _cb_drop(void *data, Evas_Object *o EINA_UNUSED, Elm_Selection_Data *ev)
 {
@@ -32,7 +71,7 @@ _cb_drop(void *data, Evas_Object *o EINA_UNUSED, 
Elm_Selection_Data *ev)
    if (!ev->data) return EINA_TRUE;
    if (strchr(ev->data, '\n'))
      {
-        char *p, *p2, *p3, *tb;
+        char *p, *p2, *p3, *tb, *tt;
         
         tb = malloc(strlen(ev->data) + 1);
         if (tb)
@@ -54,8 +93,13 @@ _cb_drop(void *data, Evas_Object *o EINA_UNUSED, 
Elm_Selection_Data *ev)
                        while ((*p) && (isspace(*p))) p++;
                        if (strlen(tb) > 0)
                          {
-                            win_video_insert(win, tb);
-                            inserted = EINA_TRUE;
+                            tt = _escape_parse(tb);
+                            if (tt)
+                              {
+                                 win_video_insert(win, tt);
+                                 inserted = EINA_TRUE;
+                                 free(tt);
+                              }
                          }
                     }
                   else
@@ -63,8 +107,13 @@ _cb_drop(void *data, Evas_Object *o EINA_UNUSED, 
Elm_Selection_Data *ev)
                        strcpy(tb, p);
                        if (strlen(tb) > 0)
                          {
-                            win_video_insert(win, tb);
-                            inserted = EINA_TRUE;
+                            tt = _escape_parse(tb);
+                            if (tt)
+                              {
+                                 win_video_insert(win, tt);
+                                 inserted = EINA_TRUE;
+                                 free(tt);
+                              }
                          }
                        break;
                     }
@@ -74,8 +123,13 @@ _cb_drop(void *data, Evas_Object *o EINA_UNUSED, 
Elm_Selection_Data *ev)
      }
    else
      {
-        win_video_insert(win, ev->data);
-        inserted = EINA_TRUE;
+        char *tt = _escape_parse(ev->data);
+        if (tt)
+          {
+             win_video_insert(win, tt);
+             inserted = EINA_TRUE;
+             free(tt);
+          }
      }
    if (inserted)
      {

-- 


Reply via email to