Damjan Jovanovic damjan.jov@gmail.com writes:
/**************************************************************************
X11DRV_CLIPBOARD_ExportHDROP
- Export CF_HDROP format to text/uri-list.
 - */
 +static HANDLE X11DRV_CLIPBOARD_ExportHDROP(Display *display, Window requestor, Atom aTarget,
- Atom rprop, LPWINE_CLIPDATA lpdata, LPDWORD lpBytes)
 +{
- HDROP hDrop;
 - UINT i;
 - UINT numFiles;
 - UINT totalSize = 0;
 - HGLOBAL hClipData = NULL;
 - char *text_uri_list = NULL;
 - char *next;
 - BOOLEAN succeeded = FALSE;
 - *lpBytes = 0;
 - if (!X11DRV_CLIPBOARD_RenderFormat(display, lpdata))
 - {
 ERR("Failed to export %04x format\n", lpdata->wFormatID);return 0;- }
 - hDrop = (HDROP) lpdata->hData;
 - numFiles = DragQueryFileW(hDrop, 0xFFFFFFFF, NULL, 0);
 - for (i = 0; i < numFiles; i++)
 - {
 UINT dosFilenameSize;WCHAR *dosFilename;succeeded = FALSE;dosFilenameSize = 1 + DragQueryFileW(hDrop, i, NULL, 0);dosFilename = HeapAlloc(GetProcessHeap(), 0, dosFilenameSize*sizeof(WCHAR));if (dosFilename){char *unixFilename;DragQueryFileW(hDrop, i, dosFilename, dosFilenameSize);unixFilename = wine_get_unix_file_name(dosFilename);if (unixFilename){totalSize += 8 + /* file:/// */3*(lstrlenA(unixFilename) - 1); /* "%xy" per char except first '/' */succeeded = TRUE;HeapFree(GetProcessHeap(), 0, unixFilename);}HeapFree(GetProcessHeap(), 0, dosFilename);}if (!succeeded){ERR("out of memory\n");goto end;}- }
 - totalSize += 2 * numFiles; /* "\r\n" */
 - hClipData = GlobalAlloc(GMEM_MOVEABLE | GMEM_DDESHARE, totalSize);
 - if (hClipData == NULL)
 - {
 ERR("out of memory\n");succeeded = FALSE;goto end;- }
 - text_uri_list = (char*) GlobalLock(hClipData);
 - next = text_uri_list;
 - for (i = 0; i < numFiles; i++)
 - {
 UINT dosFilenameSize;WCHAR *dosFilename;succeeded = FALSE;dosFilenameSize = 1 + DragQueryFileW(hDrop, i, NULL, 0);dosFilename = HeapAlloc(GetProcessHeap(), 0, dosFilenameSize*sizeof(WCHAR));if (dosFilename){char *unixFilename;DragQueryFileW(hDrop, i, dosFilename, dosFilenameSize);unixFilename = wine_get_unix_file_name(dosFilename);if (unixFilename){static const char *hex_table = "0123456789abcdef";UINT u;*next++ = 'f';*next++ = 'i';*next++ = 'l';*next++ = 'e';*next++ = ':';*next++ = '/';*next++ = '/';*next++ = '/';/* URL encode everything - unnecessary, but easier/lighter than linking in shlwapi, and can't hurt */for (u = 1; unixFilename[u]; u++) {*next++ = '%';*next++ = hex_table[unixFilename[u] >> 4];*next++ = hex_table[unixFilename[u] & 0xf];}*next++ = '\r';*next++ = '\n';succeeded = TRUE;HeapFree(GetProcessHeap(), 0, unixFilename);}HeapFree(GetProcessHeap(), 0, dosFilename);}if (!succeeded){ERR("out of memory\n");goto end;}- }
 +end:
- if (succeeded)
 - {
 GlobalUnlock(hClipData);*lpBytes = GlobalSize(hClipData);return hClipData;- }
 - else
 - {
 if (text_uri_list)GlobalUnlock(hClipData);GlobalFree(hClipData);*lpBytes = 0;return 0;- }
 +}
That's unnecessarily complicated and inefficient. You don't need to retrieve the file name 4 times, or to convert every filename to Unix twice.