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.