mirror of
https://github.com/reactos/reactos.git
synced 2024-07-06 20:55:16 +00:00
[SHELL32]
* Partial sync of clipboard.c with Wine 1.7.27. CORE-8540 svn path=/branches/shell-experiments/; revision=65293
This commit is contained in:
parent
4a6b43ac42
commit
98ab989c82
|
@ -1,7 +1,7 @@
|
|||
/*
|
||||
* clipboard helper functions
|
||||
* clipboard helper functions
|
||||
*
|
||||
* Copyright 2000 Juergen Schmied <juergen.schmied@debitel.de>
|
||||
* Copyright 2000 Juergen Schmied <juergen.schmied@debitel.de>
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public
|
||||
|
@ -25,13 +25,13 @@
|
|||
*
|
||||
* - a right mousebutton-copy sets the following formats:
|
||||
* classic:
|
||||
* Shell IDList Array
|
||||
* Preferred Drop Effect
|
||||
* Shell Object Offsets
|
||||
* HDROP
|
||||
* FileName
|
||||
* Shell IDList Array
|
||||
* Preferred Drop Effect
|
||||
* Shell Object Offsets
|
||||
* HDROP
|
||||
* FileName
|
||||
* ole:
|
||||
* OlePrivateData (ClipboardDataObjectInterface)
|
||||
* OlePrivateData (ClipboardDataObjectInterface)
|
||||
*
|
||||
*/
|
||||
|
||||
|
@ -42,6 +42,7 @@
|
|||
#include <winbase.h>
|
||||
#include <shlobj.h>
|
||||
#include <wine/debug.h>
|
||||
#include <wine/unicode.h>
|
||||
|
||||
WINE_DEFAULT_DEBUG_CHANNEL(shell);
|
||||
|
||||
|
@ -52,100 +53,101 @@ WINE_DEFAULT_DEBUG_CHANNEL(shell);
|
|||
*/
|
||||
HGLOBAL RenderHDROP(LPITEMIDLIST pidlRoot, LPITEMIDLIST * apidl, UINT cidl)
|
||||
{
|
||||
UINT i;
|
||||
UINT i;
|
||||
int size = 0;
|
||||
WCHAR wszFileName[MAX_PATH];
|
||||
WCHAR wszFileName[MAX_PATH];
|
||||
HGLOBAL hGlobal = NULL;
|
||||
DROPFILES *pDropFiles;
|
||||
int offset;
|
||||
DROPFILES *pDropFiles;
|
||||
int offset;
|
||||
LPITEMIDLIST *pidls;
|
||||
|
||||
TRACE("(%p,%p,%u)\n", pidlRoot, apidl, cidl);
|
||||
TRACE("(%p,%p,%u)\n", pidlRoot, apidl, cidl);
|
||||
|
||||
pidls = (LPITEMIDLIST *)HeapAlloc(GetProcessHeap(), 0, cidl * sizeof(*pidls));
|
||||
if (!pidls)
|
||||
goto cleanup;
|
||||
|
||||
/* get the size needed */
|
||||
size = sizeof(DROPFILES);
|
||||
/* get the size needed */
|
||||
size = sizeof(DROPFILES);
|
||||
|
||||
for (i=0; i<cidl;i++)
|
||||
{
|
||||
for (i=0; i<cidl;i++)
|
||||
{
|
||||
pidls[i] = ILCombine(pidlRoot, apidl[i]);
|
||||
SHGetPathFromIDListW(pidls[i], wszFileName);
|
||||
size += (wcslen(wszFileName) + 1) * sizeof(WCHAR);
|
||||
}
|
||||
}
|
||||
|
||||
size += sizeof(WCHAR);
|
||||
size += sizeof(WCHAR);
|
||||
|
||||
/* Fill the structure */
|
||||
hGlobal = GlobalAlloc(GHND|GMEM_SHARE, size);
|
||||
/* Fill the structure */
|
||||
hGlobal = GlobalAlloc(GHND|GMEM_SHARE, size);
|
||||
if(!hGlobal)
|
||||
goto cleanup;
|
||||
|
||||
pDropFiles = (DROPFILES *)GlobalLock(hGlobal);
|
||||
offset = (sizeof(DROPFILES) + sizeof(WCHAR) - 1) / sizeof(WCHAR);
|
||||
offset = (sizeof(DROPFILES) + sizeof(WCHAR) - 1) / sizeof(WCHAR);
|
||||
pDropFiles->pFiles = offset * sizeof(WCHAR);
|
||||
pDropFiles->fWide = TRUE;
|
||||
|
||||
for (i=0; i<cidl;i++)
|
||||
{
|
||||
for (i=0; i<cidl;i++)
|
||||
{
|
||||
|
||||
SHGetPathFromIDListW(pidls[i], wszFileName);
|
||||
wcscpy(((WCHAR*)pDropFiles)+offset, wszFileName);
|
||||
offset += wcslen(wszFileName) + 1;
|
||||
ILFree(pidls[i]);
|
||||
}
|
||||
}
|
||||
|
||||
((WCHAR*)pDropFiles)[offset] = 0;
|
||||
GlobalUnlock(hGlobal);
|
||||
((WCHAR*)pDropFiles)[offset] = 0;
|
||||
GlobalUnlock(hGlobal);
|
||||
|
||||
cleanup:
|
||||
if(pidls)
|
||||
HeapFree(GetProcessHeap(), 0, pidls);
|
||||
|
||||
return hGlobal;
|
||||
return hGlobal;
|
||||
}
|
||||
|
||||
HGLOBAL RenderSHELLIDLIST (LPITEMIDLIST pidlRoot, LPITEMIDLIST * apidl, UINT cidl)
|
||||
{
|
||||
UINT i;
|
||||
int offset = 0, sizePidl, size;
|
||||
HGLOBAL hGlobal;
|
||||
LPIDA pcida;
|
||||
UINT i;
|
||||
int offset = 0, sizePidl, size;
|
||||
HGLOBAL hGlobal;
|
||||
LPIDA pcida;
|
||||
|
||||
TRACE("(%p,%p,%u)\n", pidlRoot, apidl, cidl);
|
||||
TRACE("(%p,%p,%u)\n", pidlRoot, apidl, cidl);
|
||||
|
||||
/* get the size needed */
|
||||
size = sizeof(CIDA) + sizeof (UINT)*(cidl); /* header */
|
||||
size += ILGetSize (pidlRoot); /* root pidl */
|
||||
for(i=0; i<cidl; i++)
|
||||
{
|
||||
size += ILGetSize(apidl[i]); /* child pidls */
|
||||
}
|
||||
/* get the size needed */
|
||||
size = sizeof(CIDA) + sizeof (UINT)*(cidl); /* header */
|
||||
size += ILGetSize (pidlRoot); /* root pidl */
|
||||
for(i=0; i<cidl; i++)
|
||||
{
|
||||
size += ILGetSize(apidl[i]); /* child pidls */
|
||||
}
|
||||
|
||||
/* fill the structure */
|
||||
hGlobal = GlobalAlloc(GHND|GMEM_SHARE, size);
|
||||
if(!hGlobal) return hGlobal;
|
||||
pcida = (LPIDA)GlobalLock (hGlobal);
|
||||
pcida->cidl = cidl;
|
||||
/* fill the structure */
|
||||
hGlobal = GlobalAlloc(GHND|GMEM_SHARE, size);
|
||||
if(!hGlobal) return hGlobal;
|
||||
pcida = GlobalLock (hGlobal);
|
||||
pcida->cidl = cidl;
|
||||
|
||||
/* root pidl */
|
||||
offset = sizeof(CIDA) + sizeof (UINT)*(cidl);
|
||||
pcida->aoffset[0] = offset; /* first element */
|
||||
sizePidl = ILGetSize (pidlRoot);
|
||||
memcpy(((LPBYTE)pcida)+offset, pidlRoot, sizePidl);
|
||||
offset += sizePidl;
|
||||
/* root pidl */
|
||||
offset = sizeof(CIDA) + sizeof (UINT)*(cidl);
|
||||
pcida->aoffset[0] = offset; /* first element */
|
||||
sizePidl = ILGetSize (pidlRoot);
|
||||
memcpy(((LPBYTE)pcida)+offset, pidlRoot, sizePidl);
|
||||
offset += sizePidl;
|
||||
|
||||
for(i=0; i<cidl; i++) /* child pidls */
|
||||
{
|
||||
pcida->aoffset[i+1] = offset;
|
||||
sizePidl = ILGetSize(apidl[i]);
|
||||
memcpy(((LPBYTE)pcida)+offset, apidl[i], sizePidl);
|
||||
offset += sizePidl;
|
||||
}
|
||||
for(i=0; i<cidl; i++) /* child pidls */
|
||||
{
|
||||
pcida->aoffset[i+1] = offset;
|
||||
sizePidl = ILGetSize(apidl[i]);
|
||||
memcpy(((LPBYTE)pcida)+offset, apidl[i], sizePidl);
|
||||
offset += sizePidl;
|
||||
}
|
||||
|
||||
GlobalUnlock(hGlobal);
|
||||
return hGlobal;
|
||||
GlobalUnlock(hGlobal);
|
||||
return hGlobal;
|
||||
}
|
||||
|
||||
HGLOBAL RenderSHELLIDLISTOFFSET (LPITEMIDLIST pidlRoot, LPITEMIDLIST * apidl, UINT cidl)
|
||||
|
@ -168,66 +170,66 @@ HGLOBAL RenderFILEDESCRIPTOR (LPITEMIDLIST pidlRoot, LPITEMIDLIST * apidl, UINT
|
|||
|
||||
HGLOBAL RenderFILENAMEA (LPITEMIDLIST pidlRoot, LPITEMIDLIST * apidl, UINT cidl)
|
||||
{
|
||||
int size = 0;
|
||||
char szTemp[MAX_PATH], *szFileName;
|
||||
LPITEMIDLIST pidl;
|
||||
HGLOBAL hGlobal;
|
||||
BOOL bSuccess;
|
||||
int size = 0;
|
||||
char szTemp[MAX_PATH], *szFileName;
|
||||
LPITEMIDLIST pidl;
|
||||
HGLOBAL hGlobal;
|
||||
BOOL bSuccess;
|
||||
|
||||
TRACE("(%p,%p,%u)\n", pidlRoot, apidl, cidl);
|
||||
TRACE("(%p,%p,%u)\n", pidlRoot, apidl, cidl);
|
||||
|
||||
/* get path of combined pidl */
|
||||
pidl = ILCombine(pidlRoot, apidl[0]);
|
||||
if (!pidl)
|
||||
return 0;
|
||||
/* get path of combined pidl */
|
||||
pidl = ILCombine(pidlRoot, apidl[0]);
|
||||
if (!pidl)
|
||||
return 0;
|
||||
|
||||
bSuccess = SHGetPathFromIDListA(pidl, szTemp);
|
||||
SHFree(pidl);
|
||||
if (!bSuccess)
|
||||
return 0;
|
||||
bSuccess = SHGetPathFromIDListA(pidl, szTemp);
|
||||
SHFree(pidl);
|
||||
if (!bSuccess)
|
||||
return 0;
|
||||
|
||||
size = strlen(szTemp) + 1;
|
||||
size = strlen(szTemp) + 1;
|
||||
|
||||
/* fill the structure */
|
||||
hGlobal = GlobalAlloc(GHND|GMEM_SHARE, size);
|
||||
if(!hGlobal) return hGlobal;
|
||||
szFileName = (char *)GlobalLock(hGlobal);
|
||||
memcpy(szFileName, szTemp, size);
|
||||
GlobalUnlock(hGlobal);
|
||||
/* fill the structure */
|
||||
hGlobal = GlobalAlloc(GHND|GMEM_SHARE, size);
|
||||
if(!hGlobal) return hGlobal;
|
||||
szFileName = GlobalLock(hGlobal);
|
||||
memcpy(szFileName, szTemp, size);
|
||||
GlobalUnlock(hGlobal);
|
||||
|
||||
return hGlobal;
|
||||
return hGlobal;
|
||||
}
|
||||
|
||||
HGLOBAL RenderFILENAMEW (LPITEMIDLIST pidlRoot, LPITEMIDLIST * apidl, UINT cidl)
|
||||
{
|
||||
int size = 0;
|
||||
WCHAR szTemp[MAX_PATH], *szFileName;
|
||||
LPITEMIDLIST pidl;
|
||||
HGLOBAL hGlobal;
|
||||
BOOL bSuccess;
|
||||
int size = 0;
|
||||
WCHAR szTemp[MAX_PATH], *szFileName;
|
||||
LPITEMIDLIST pidl;
|
||||
HGLOBAL hGlobal;
|
||||
BOOL bSuccess;
|
||||
|
||||
TRACE("(%p,%p,%u)\n", pidlRoot, apidl, cidl);
|
||||
TRACE("(%p,%p,%u)\n", pidlRoot, apidl, cidl);
|
||||
|
||||
/* get path of combined pidl */
|
||||
pidl = ILCombine(pidlRoot, apidl[0]);
|
||||
if (!pidl)
|
||||
return 0;
|
||||
/* get path of combined pidl */
|
||||
pidl = ILCombine(pidlRoot, apidl[0]);
|
||||
if (!pidl)
|
||||
return 0;
|
||||
|
||||
bSuccess = SHGetPathFromIDListW(pidl, szTemp);
|
||||
SHFree(pidl);
|
||||
if (!bSuccess)
|
||||
return 0;
|
||||
bSuccess = SHGetPathFromIDListW(pidl, szTemp);
|
||||
SHFree(pidl);
|
||||
if (!bSuccess)
|
||||
return 0;
|
||||
|
||||
size = (wcslen(szTemp)+1) * sizeof(WCHAR);
|
||||
size = (strlenW(szTemp)+1) * sizeof(WCHAR);
|
||||
|
||||
/* fill the structure */
|
||||
hGlobal = GlobalAlloc(GHND|GMEM_SHARE, size);
|
||||
if(!hGlobal) return hGlobal;
|
||||
szFileName = (WCHAR *)GlobalLock(hGlobal);
|
||||
memcpy(szFileName, szTemp, size);
|
||||
GlobalUnlock(hGlobal);
|
||||
/* fill the structure */
|
||||
hGlobal = GlobalAlloc(GHND|GMEM_SHARE, size);
|
||||
if(!hGlobal) return hGlobal;
|
||||
szFileName = GlobalLock(hGlobal);
|
||||
memcpy(szFileName, szTemp, size);
|
||||
GlobalUnlock(hGlobal);
|
||||
|
||||
return hGlobal;
|
||||
return hGlobal;
|
||||
}
|
||||
|
||||
HGLOBAL RenderPREFEREDDROPEFFECT (DWORD dwFlags)
|
||||
|
|
Loading…
Reference in a new issue