mirror of
git://source.winehq.org/git/wine.git
synced 2024-09-15 08:50:27 +00:00
shell32: Have _ILCreateFromFindDataW also create a FileStructW type of pidl.
Based on a patch by Aric Stewart. Also get rid of _ILCreateFromFindDataA and _ILCreateFromPatA.
This commit is contained in:
parent
c0db9e573e
commit
a1b764e65f
|
@ -1484,95 +1484,52 @@ LPITEMIDLIST _ILCreateGuidFromStrW(LPCWSTR szGUID)
|
||||||
return _ILCreateGuid(PT_GUID, &iid);
|
return _ILCreateGuid(PT_GUID, &iid);
|
||||||
}
|
}
|
||||||
|
|
||||||
LPITEMIDLIST _ILCreateFromFindDataW( WIN32_FIND_DATAW *wfd )
|
LPITEMIDLIST _ILCreateFromFindDataW( const WIN32_FIND_DATAW *wfd )
|
||||||
{
|
|
||||||
/* FIXME: should make unicode PIDLs */
|
|
||||||
WIN32_FIND_DATAA fda;
|
|
||||||
|
|
||||||
memset( &fda, 0, sizeof fda );
|
|
||||||
fda.dwFileAttributes = wfd->dwFileAttributes;
|
|
||||||
fda.ftCreationTime = wfd->ftCreationTime;
|
|
||||||
fda.ftLastAccessTime = wfd->ftLastAccessTime;
|
|
||||||
fda.ftLastWriteTime = wfd->ftLastWriteTime;
|
|
||||||
fda.nFileSizeHigh = wfd->nFileSizeHigh;
|
|
||||||
fda.nFileSizeLow = wfd->nFileSizeLow;
|
|
||||||
fda.dwReserved0 = wfd->dwReserved0;
|
|
||||||
fda.dwReserved1 = wfd->dwReserved1;
|
|
||||||
WideCharToMultiByte( CP_ACP, 0, wfd->cFileName, -1,
|
|
||||||
fda.cFileName, MAX_PATH, NULL, NULL );
|
|
||||||
return _ILCreateFromFindDataA( &fda );
|
|
||||||
}
|
|
||||||
|
|
||||||
LPITEMIDLIST _ILCreateFromFindDataA(WIN32_FIND_DATAA * stffile )
|
|
||||||
{
|
{
|
||||||
char buff[MAX_PATH + 14 +1]; /* see WIN32_FIND_DATA */
|
char buff[MAX_PATH + 14 +1]; /* see WIN32_FIND_DATA */
|
||||||
char * pbuff = buff;
|
DWORD len, len1, wlen, alen;
|
||||||
size_t len, len1;
|
|
||||||
LPITEMIDLIST pidl;
|
LPITEMIDLIST pidl;
|
||||||
PIDLTYPE type;
|
PIDLTYPE type;
|
||||||
|
|
||||||
if (!stffile)
|
if (!wfd)
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
TRACE("(%s, %s)\n",stffile->cAlternateFileName, stffile->cFileName);
|
TRACE("(%s, %s)\n",debugstr_w(wfd->cAlternateFileName), debugstr_w(wfd->cFileName));
|
||||||
|
|
||||||
/* prepare buffer with both names */
|
/* prepare buffer with both names */
|
||||||
len = strlen (stffile->cFileName) + 1;
|
len = WideCharToMultiByte(CP_ACP,0,wfd->cFileName,-1,buff,MAX_PATH,NULL,NULL);
|
||||||
memcpy (pbuff, stffile->cFileName, len);
|
len1 = WideCharToMultiByte(CP_ACP,0,wfd->cAlternateFileName,-1, buff+len, sizeof(buff)-len, NULL, NULL);
|
||||||
pbuff += len;
|
alen = len + len1;
|
||||||
|
|
||||||
len1 = strlen (stffile->cAlternateFileName)+1;
|
type = (wfd->dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) ? PT_FOLDER : PT_VALUE;
|
||||||
memcpy (pbuff, stffile->cAlternateFileName, len1);
|
|
||||||
|
|
||||||
type = (stffile->dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) ? PT_FOLDER : PT_VALUE;
|
wlen = lstrlenW(wfd->cFileName) + 1;
|
||||||
|
pidl = _ILAlloc(type, FIELD_OFFSET(FileStruct, szNames[alen + (alen & 1)]) +
|
||||||
/*
|
FIELD_OFFSET(FileStructW, wszName[wlen]) + sizeof(WORD));
|
||||||
* FileStruct already has one byte for the first name, so use len - 1 in
|
|
||||||
* size calculation
|
|
||||||
*/
|
|
||||||
pidl = _ILAlloc(type, sizeof(FileStruct) + (len - 1) + len1);
|
|
||||||
if (pidl)
|
if (pidl)
|
||||||
{
|
{
|
||||||
LPPIDLDATA pData;
|
LPPIDLDATA pData = _ILGetDataPointer(pidl);
|
||||||
LPSTR pszDest;
|
FileStruct *fs = &pData->u.file;
|
||||||
|
FileStructW *fsw;
|
||||||
|
WORD *pOffsetW;
|
||||||
|
|
||||||
/* set attributes */
|
FileTimeToDosDateTime( &wfd->ftLastWriteTime, &fs->uFileDate, &fs->uFileTime);
|
||||||
pData = _ILGetDataPointer(pidl);
|
fs->dwFileSize = wfd->nFileSizeLow;
|
||||||
if (pData)
|
fs->uFileAttribs = wfd->dwFileAttributes;
|
||||||
{
|
memcpy(fs->szNames, buff, alen);
|
||||||
pData->type = type;
|
|
||||||
FileTimeToDosDateTime( &(stffile->ftLastWriteTime),
|
fsw = (FileStructW*)(pData->u.file.szNames + alen + (alen & 0x1));
|
||||||
&pData->u.file.uFileDate, &pData->u.file.uFileTime);
|
fsw->cbLen = FIELD_OFFSET(FileStructW, wszName[wlen]) + sizeof(WORD);
|
||||||
pData->u.file.dwFileSize = stffile->nFileSizeLow;
|
FileTimeToDosDateTime( &wfd->ftCreationTime, &fsw->uCreationDate, &fsw->uCreationTime);
|
||||||
pData->u.file.uFileAttribs = (WORD)stffile->dwFileAttributes;
|
FileTimeToDosDateTime( &wfd->ftLastAccessTime, &fsw->uLastAccessDate, &fsw->uLastAccessTime);
|
||||||
}
|
memcpy(fsw->wszName, wfd->cFileName, wlen * sizeof(WCHAR));
|
||||||
pszDest = _ILGetTextPointer(pidl);
|
|
||||||
if (pszDest)
|
pOffsetW = (WORD*)((LPBYTE)pidl + pidl->mkid.cb - sizeof(WORD));
|
||||||
{
|
*pOffsetW = (LPBYTE)fsw - (LPBYTE)pidl;
|
||||||
memcpy(pszDest, buff, len + len1);
|
TRACE("-- Set Value: %s\n",debugstr_w(fsw->wszName));
|
||||||
TRACE("-- create Value: %s\n",debugstr_a(pszDest));
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
return pidl;
|
return pidl;
|
||||||
}
|
|
||||||
|
|
||||||
HRESULT _ILCreateFromPathA(LPCSTR szPath, LPITEMIDLIST* ppidl)
|
|
||||||
{
|
|
||||||
HANDLE hFile;
|
|
||||||
WIN32_FIND_DATAA stffile;
|
|
||||||
|
|
||||||
if (!ppidl)
|
|
||||||
return E_INVALIDARG;
|
|
||||||
|
|
||||||
hFile = FindFirstFileA(szPath, &stffile);
|
|
||||||
if (hFile == INVALID_HANDLE_VALUE)
|
|
||||||
return HRESULT_FROM_WIN32(ERROR_FILE_NOT_FOUND);
|
|
||||||
|
|
||||||
FindClose(hFile);
|
|
||||||
|
|
||||||
*ppidl = _ILCreateFromFindDataA(&stffile);
|
|
||||||
|
|
||||||
return *ppidl ? S_OK : E_OUTOFMEMORY;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
HRESULT _ILCreateFromPathW(LPCWSTR szPath, LPITEMIDLIST* ppidl)
|
HRESULT _ILCreateFromPathW(LPCWSTR szPath, LPITEMIDLIST* ppidl)
|
||||||
|
|
|
@ -242,9 +242,7 @@ LPITEMIDLIST _ILCreateGuidFromStrW(LPCWSTR szGUID);
|
||||||
|
|
||||||
/* Commonly used PIDLs representing file system objects. */
|
/* Commonly used PIDLs representing file system objects. */
|
||||||
LPITEMIDLIST _ILCreateDesktop (void);
|
LPITEMIDLIST _ILCreateDesktop (void);
|
||||||
LPITEMIDLIST _ILCreateFromFindDataA(WIN32_FIND_DATAA *stffile);
|
LPITEMIDLIST _ILCreateFromFindDataW(const WIN32_FIND_DATAW *stffile);
|
||||||
LPITEMIDLIST _ILCreateFromFindDataW(WIN32_FIND_DATAW *stffile);
|
|
||||||
HRESULT _ILCreateFromPathA (LPCSTR szPath, LPITEMIDLIST* ppidl);
|
|
||||||
HRESULT _ILCreateFromPathW (LPCWSTR szPath, LPITEMIDLIST* ppidl);
|
HRESULT _ILCreateFromPathW (LPCWSTR szPath, LPITEMIDLIST* ppidl);
|
||||||
|
|
||||||
/* Other helpers */
|
/* Other helpers */
|
||||||
|
|
Loading…
Reference in a new issue