dnd - handle %20 etc. escapes in uri's

This commit is contained in:
Carsten Haitzler 2014-02-16 22:01:13 +09:00
parent 50909ee575
commit fd30f59365
1 changed files with 61 additions and 7 deletions

View File

@ -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)
{