respect unicode _ILCreateFromFindData (resubmit)
Aric Stewart
aric at codeweavers.com
Tue Apr 10 01:16:09 CDT 2007
Generalize _ILCreateFromFindDataA and have _ILCreateFromFindDataW also
create a FileStructW type of pidl.
---
dlls/shell32/pidl.c | 114
++++++++++++++++++++++++++++++++++++++-------------
1 files changed, 85 insertions(+), 29 deletions(-)
-------------- next part --------------
diff --git a/dlls/shell32/pidl.c b/dlls/shell32/pidl.c
index bc8fdfc..923b05c 100644
--- a/dlls/shell32/pidl.c
+++ b/dlls/shell32/pidl.c
@@ -1484,23 +1484,92 @@ LPITEMIDLIST _ILCreateGuidFromStrW(LPCWS
return _ILCreateGuid(PT_GUID, &iid);
}
+static void _SetFileStructFromFindDataA(WIN32_FIND_DATAA * stffile, const char* name_buff, int name_len, FileStruct *fs)
+{
+ if (!stffile)
+ return;
+
+ if (fs)
+ {
+ FileTimeToDosDateTime( &(stffile->ftLastWriteTime),
+ &fs->uFileDate, &fs->uFileTime);
+ fs->dwFileSize = stffile->nFileSizeLow;
+ fs->uFileAttribs = (WORD)stffile->dwFileAttributes;
+
+ memcpy(fs->szNames, name_buff, name_len);
+ TRACE("-- Set Value: %s\n",debugstr_a(fs->szNames));
+ }
+}
+
+static void _SetFileStructWFromFindDataW(WIN32_FIND_DATAW * stffile, FileStructW *fs)
+{
+ if (!stffile)
+ return;
+
+ if (fs)
+ {
+ int wlen = lstrlenW(stffile->cFileName) + 1;
+ fs->cbLen = sizeof(FileStructW) + (wlen)*sizeof(WCHAR);
+ FileTimeToDosDateTime( &(stffile->ftCreationTime),
+ &fs->uCreationDate, &fs->uCreationTime);
+ FileTimeToDosDateTime( &(stffile->ftLastAccessTime),
+ &fs->uLastAccessDate, &fs->uLastAccessTime);
+
+ memcpy(fs->wszName, stffile->cFileName, wlen * sizeof(WCHAR));
+ TRACE("-- Set Value: %s\n",debugstr_w(fs->wszName));
+ }
+}
+
+
LPITEMIDLIST _ILCreateFromFindDataW( WIN32_FIND_DATAW *wfd )
{
- /* FIXME: should make unicode PIDLs */
- WIN32_FIND_DATAA fda;
+ char buff[MAX_PATH + 14 +1]; /* see WIN32_FIND_DATA */
+ char * pbuff = buff;
+ size_t len, len1, wlen, alen;
+ LPITEMIDLIST pidl;
+ PIDLTYPE type;
+
+ if (!wfd)
+ return NULL;
+
+ TRACE("(%s, %s)\n",debugstr_w(wfd->cAlternateFileName), debugstr_w(wfd->cFileName));
+
+ /* prepare buffer with both names */
+ len = WideCharToMultiByte(CP_ACP,0,wfd->cFileName,-1,pbuff,MAX_PATH,NULL,NULL) + 1;
+ pbuff += len;
+
+ len1 = WideCharToMultiByte(CP_ACP,0,wfd->cAlternateFileName,-1, pbuff, sizeof(buff)-len, NULL, NULL) +1;
+ alen = len + len1;
+
+ type = (wfd->dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) ? PT_FOLDER : PT_VALUE;
+
+ /*
+ * FileStruct already has one byte for the first name, so use len - 1 in
+ * size calculation
+ */
+ wlen = lstrlenW(wfd->cFileName);
+ pidl = _ILAlloc(type, sizeof(FileStruct) + (alen - 1) + (alen & 0x1) +
+ sizeof(FileStructW) + wlen * sizeof(WCHAR) + sizeof(WORD)) ;
+ if (pidl)
+ {
+ LPPIDLDATA pData;
+ WORD uOffsetW, *pOffsetW;
+ FileStructW *fsw;
+
+ pData = _ILGetDataPointer(pidl);
+ if (pData)
+ pData->type = type;
+
+ _SetFileStructFromFindDataA((WIN32_FIND_DATAA*)wfd, buff, alen, &pData->u.file);
+ fsw = (FileStructW*)(pData->u.file.szNames + alen + (alen & 0x1));
+ uOffsetW = (WORD)(((LPBYTE)fsw) - ((LPBYTE)pidl));
+ _SetFileStructWFromFindDataW(wfd,fsw);
+ pOffsetW = (WORD*)(((LPBYTE)pidl) + pidl->mkid.cb - sizeof(WORD));
+ *pOffsetW = uOffsetW;
+
+ }
+ return pidl;
- 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 )
@@ -1534,24 +1603,11 @@ LPITEMIDLIST _ILCreateFromFindDataA(WIN3
if (pidl)
{
LPPIDLDATA pData;
- LPSTR pszDest;
-
- /* set attributes */
pData = _ILGetDataPointer(pidl);
if (pData)
- {
pData->type = type;
- FileTimeToDosDateTime( &(stffile->ftLastWriteTime),
- &pData->u.file.uFileDate, &pData->u.file.uFileTime);
- pData->u.file.dwFileSize = stffile->nFileSizeLow;
- pData->u.file.uFileAttribs = (WORD)stffile->dwFileAttributes;
- }
- pszDest = _ILGetTextPointer(pidl);
- if (pszDest)
- {
- memcpy(pszDest, buff, len + len1);
- TRACE("-- create Value: %s\n",debugstr_a(pszDest));
- }
+
+ _SetFileStructFromFindDataA(stffile, buff, len + len1, &pData->u.file);
}
return pidl;
}
More information about the wine-patches
mailing list