Commit 65b4d2dc authored by Martin Fuchs's avatar Martin Fuchs Committed by Alexandre Julliard

Fixed Ansi version of RenderFILENAME and implement a Unicode version.

Implemented CFSTR_FILENAME with Unicode filename.
parent a111466f
...@@ -43,6 +43,7 @@ ...@@ -43,6 +43,7 @@
#include "shell32_main.h" #include "shell32_main.h"
#include "shlwapi.h" #include "shlwapi.h"
#include "wine/unicode.h"
#include "wine/debug.h" #include "wine/debug.h"
WINE_DEFAULT_DEBUG_CHANNEL(shell); WINE_DEFAULT_DEBUG_CHANNEL(shell);
...@@ -202,7 +203,7 @@ HGLOBAL RenderFILEDESCRIPTOR (LPITEMIDLIST pidlRoot, LPITEMIDLIST * apidl, UINT ...@@ -202,7 +203,7 @@ HGLOBAL RenderFILEDESCRIPTOR (LPITEMIDLIST pidlRoot, LPITEMIDLIST * apidl, UINT
return 0; return 0;
} }
HGLOBAL RenderFILENAME (LPITEMIDLIST pidlRoot, LPITEMIDLIST * apidl, UINT cidl) HGLOBAL RenderFILENAMEA (LPITEMIDLIST pidlRoot, LPITEMIDLIST * apidl, UINT cidl)
{ {
int len, size = 0; int len, size = 0;
char szTemp[MAX_PATH], *szFileName; char szTemp[MAX_PATH], *szFileName;
...@@ -220,7 +221,32 @@ HGLOBAL RenderFILENAME (LPITEMIDLIST pidlRoot, LPITEMIDLIST * apidl, UINT cidl) ...@@ -220,7 +221,32 @@ HGLOBAL RenderFILENAME (LPITEMIDLIST pidlRoot, LPITEMIDLIST * apidl, UINT cidl)
/* fill the structure */ /* fill the structure */
hGlobal = GlobalAlloc(GHND|GMEM_SHARE, size); hGlobal = GlobalAlloc(GHND|GMEM_SHARE, size);
if(!hGlobal) return hGlobal; if(!hGlobal) return hGlobal;
szFileName = (char *)GlobalLock(hGlobal); szFileName = (char *)GlobalLock(hGlobal);
memcpy(szFileName, szTemp, size);
GlobalUnlock(hGlobal);
return hGlobal;
}
HGLOBAL RenderFILENAMEW (LPITEMIDLIST pidlRoot, LPITEMIDLIST * apidl, UINT cidl)
{
int len, size = 0;
WCHAR szTemp[MAX_PATH], *szFileName;
HGLOBAL hGlobal;
TRACE("(%p,%p,%u)\n", pidlRoot, apidl, cidl);
/* build name of first file */
SHGetPathFromIDListW(pidlRoot, szTemp);
PathAddBackslashW(szTemp);
len = strlenW(szTemp);
_ILSimpleGetTextW(apidl[0], szTemp+len, MAX_PATH - len);
size = sizeof(WCHAR) * (strlenW(szTemp)+1);
/* fill the structure */
hGlobal = GlobalAlloc(GHND|GMEM_SHARE, size);
if(!hGlobal) return hGlobal;
szFileName = (WCHAR *)GlobalLock(hGlobal);
memcpy(szFileName, szTemp, size);
GlobalUnlock(hGlobal); GlobalUnlock(hGlobal);
return hGlobal; return hGlobal;
} }
......
...@@ -201,7 +201,7 @@ static HRESULT WINAPI IEnumFORMATETC_fnClone(LPENUMFORMATETC iface, LPENUMFORMAT ...@@ -201,7 +201,7 @@ static HRESULT WINAPI IEnumFORMATETC_fnClone(LPENUMFORMATETC iface, LPENUMFORMAT
*/ */
/* number of supported formats */ /* number of supported formats */
#define MAX_FORMATS 3 #define MAX_FORMATS 4
typedef struct typedef struct
{ {
...@@ -216,7 +216,8 @@ typedef struct ...@@ -216,7 +216,8 @@ typedef struct
FORMATETC pFormatEtc[MAX_FORMATS]; FORMATETC pFormatEtc[MAX_FORMATS];
UINT cfShellIDList; UINT cfShellIDList;
UINT cfFileName; UINT cfFileNameA;
UINT cfFileNameW;
} IDataObjectImpl; } IDataObjectImpl;
...@@ -240,10 +241,12 @@ LPDATAOBJECT IDataObject_Constructor(HWND hwndOwner, LPITEMIDLIST pMyPidl, LPITE ...@@ -240,10 +241,12 @@ LPDATAOBJECT IDataObject_Constructor(HWND hwndOwner, LPITEMIDLIST pMyPidl, LPITE
dto->cidl = cidl; dto->cidl = cidl;
dto->cfShellIDList = RegisterClipboardFormatA(CFSTR_SHELLIDLIST); dto->cfShellIDList = RegisterClipboardFormatA(CFSTR_SHELLIDLIST);
dto->cfFileName = RegisterClipboardFormatA(CFSTR_FILENAMEA); dto->cfFileNameA = RegisterClipboardFormatA(CFSTR_FILENAMEA);
dto->cfFileNameW = RegisterClipboardFormatA(CFSTR_FILENAMEW);
InitFormatEtc(dto->pFormatEtc[0], dto->cfShellIDList, TYMED_HGLOBAL); InitFormatEtc(dto->pFormatEtc[0], dto->cfShellIDList, TYMED_HGLOBAL);
InitFormatEtc(dto->pFormatEtc[1], CF_HDROP, TYMED_HGLOBAL); InitFormatEtc(dto->pFormatEtc[1], CF_HDROP, TYMED_HGLOBAL);
InitFormatEtc(dto->pFormatEtc[2], dto->cfFileName, TYMED_HGLOBAL); InitFormatEtc(dto->pFormatEtc[2], dto->cfFileNameA, TYMED_HGLOBAL);
InitFormatEtc(dto->pFormatEtc[3], dto->cfFileNameW, TYMED_HGLOBAL);
} }
TRACE("(%p)->(apidl=%p cidl=%u)\n",dto, apidl, cidl); TRACE("(%p)->(apidl=%p cidl=%u)\n",dto, apidl, cidl);
...@@ -331,10 +334,15 @@ static HRESULT WINAPI IDataObject_fnGetData(LPDATAOBJECT iface, LPFORMATETC pfor ...@@ -331,10 +334,15 @@ static HRESULT WINAPI IDataObject_fnGetData(LPDATAOBJECT iface, LPFORMATETC pfor
if (This->cidl < 1) return(E_UNEXPECTED); if (This->cidl < 1) return(E_UNEXPECTED);
pmedium->u.hGlobal = RenderHDROP(This->pidl, This->apidl, This->cidl); pmedium->u.hGlobal = RenderHDROP(This->pidl, This->apidl, This->cidl);
} }
else if (pformatetcIn->cfFormat == This->cfFileName) else if (pformatetcIn->cfFormat == This->cfFileNameA)
{ {
if (This->cidl < 1) return(E_UNEXPECTED); if (This->cidl < 1) return(E_UNEXPECTED);
pmedium->u.hGlobal = RenderFILENAME(This->pidl, This->apidl, This->cidl); pmedium->u.hGlobal = RenderFILENAMEA(This->pidl, This->apidl, This->cidl);
}
else if (pformatetcIn->cfFormat == This->cfFileNameW)
{
if (This->cidl < 1) return(E_UNEXPECTED);
pmedium->u.hGlobal = RenderFILENAMEW(This->pidl, This->apidl, This->cidl);
} }
else else
{ {
......
...@@ -1558,6 +1558,29 @@ DWORD _ILSimpleGetText (LPCITEMIDLIST pidl, LPSTR szOut, UINT uOutSize) ...@@ -1558,6 +1558,29 @@ DWORD _ILSimpleGetText (LPCITEMIDLIST pidl, LPSTR szOut, UINT uOutSize)
return dwReturn; return dwReturn;
} }
/**************************************************************************
* _ILSimpleGetTextW
*
* gets the text for the first item in the pidl (eg. simple pidl)
*
* returns the length of the string
*/
DWORD _ILSimpleGetTextW (LPCITEMIDLIST pidl, LPWSTR szOut, UINT uOutSize)
{
DWORD dwReturn;
char szTemp[MAX_PATH];
TRACE("(%p %p %x)\n",pidl,szOut,uOutSize);
dwReturn = _ILSimpleGetText(pidl, szTemp, uOutSize);
if (!MultiByteToWideChar(CP_ACP, 0, szTemp, -1, szOut, MAX_PATH))
*szOut = 0;
TRACE("-- (%p=%s 0x%08lx)\n",szOut,debugstr_w(szOut),dwReturn);
return dwReturn;
}
/************************************************************************** /**************************************************************************
* *
* ### 4. getting pointers to parts of pidls ### * ### 4. getting pointers to parts of pidls ###
......
...@@ -141,6 +141,7 @@ typedef struct tagPIDLDATA ...@@ -141,6 +141,7 @@ typedef struct tagPIDLDATA
* getting special values from simple pidls * getting special values from simple pidls
*/ */
DWORD _ILSimpleGetText (LPCITEMIDLIST pidl, LPSTR pOut, UINT uOutSize); DWORD _ILSimpleGetText (LPCITEMIDLIST pidl, LPSTR pOut, UINT uOutSize);
DWORD _ILSimpleGetTextW (LPCITEMIDLIST pidl, LPWSTR pOut, UINT uOutSize);
BOOL _ILGetFileDate (LPCITEMIDLIST pidl, LPSTR pOut, UINT uOutSize); BOOL _ILGetFileDate (LPCITEMIDLIST pidl, LPSTR pOut, UINT uOutSize);
DWORD _ILGetFileSize (LPCITEMIDLIST pidl, LPSTR pOut, UINT uOutSize); DWORD _ILGetFileSize (LPCITEMIDLIST pidl, LPSTR pOut, UINT uOutSize);
BOOL _ILGetExtension (LPCITEMIDLIST pidl, LPSTR pOut, UINT uOutSize); BOOL _ILGetExtension (LPCITEMIDLIST pidl, LPSTR pOut, UINT uOutSize);
......
...@@ -151,7 +151,8 @@ HGLOBAL RenderSHELLIDLIST (LPITEMIDLIST pidlRoot, LPITEMIDLIST * apidl, UINT cid ...@@ -151,7 +151,8 @@ HGLOBAL RenderSHELLIDLIST (LPITEMIDLIST pidlRoot, LPITEMIDLIST * apidl, UINT cid
HGLOBAL RenderSHELLIDLISTOFFSET (LPITEMIDLIST pidlRoot, LPITEMIDLIST * apidl, UINT cidl); HGLOBAL RenderSHELLIDLISTOFFSET (LPITEMIDLIST pidlRoot, LPITEMIDLIST * apidl, UINT cidl);
HGLOBAL RenderFILECONTENTS (LPITEMIDLIST pidlRoot, LPITEMIDLIST * apidl, UINT cidl); HGLOBAL RenderFILECONTENTS (LPITEMIDLIST pidlRoot, LPITEMIDLIST * apidl, UINT cidl);
HGLOBAL RenderFILEDESCRIPTOR (LPITEMIDLIST pidlRoot, LPITEMIDLIST * apidl, UINT cidl); HGLOBAL RenderFILEDESCRIPTOR (LPITEMIDLIST pidlRoot, LPITEMIDLIST * apidl, UINT cidl);
HGLOBAL RenderFILENAME (LPITEMIDLIST pidlRoot, LPITEMIDLIST * apidl, UINT cidl); HGLOBAL RenderFILENAMEA (LPITEMIDLIST pidlRoot, LPITEMIDLIST * apidl, UINT cidl);
HGLOBAL RenderFILENAMEW (LPITEMIDLIST pidlRoot, LPITEMIDLIST * apidl, UINT cidl);
HGLOBAL RenderPREFEREDDROPEFFECT (DWORD dwFlags); HGLOBAL RenderPREFEREDDROPEFFECT (DWORD dwFlags);
/* Change Notification */ /* Change Notification */
......
...@@ -111,6 +111,8 @@ extern UINT cfFileContents; ...@@ -111,6 +111,8 @@ extern UINT cfFileContents;
#define CFSTR_PASTESUCCEEDED "Paste Succeeded" #define CFSTR_PASTESUCCEEDED "Paste Succeeded"
#define CFSTR_INDRAGLOOP "InShellDragLoop" #define CFSTR_INDRAGLOOP "InShellDragLoop"
#define CFSTR_FILENAME WINELIB_NAME_AW(CFSTR_FILENAME)
/************************************************************************ /************************************************************************
* IShellView interface * IShellView interface
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment