respect unicode _ILCreateFromFindData

Aric Stewart aric at codeweavers.com
Mon Apr 9 22:42:43 CDT 2007


Generalize _ILCreateFromFindDataA and have _ILCreateFromFindDataW also 
create a FileStructW type of pidl.
---
  dlls/shell32/pidl.c |  116 
++++++++++++++++++++++++++++++++++++++-------------
  1 files changed, 87 insertions(+), 29 deletions(-)
-------------- next part --------------
diff --git a/dlls/shell32/pidl.c b/dlls/shell32/pidl.c
index bc8fdfc..0abf086 100644
--- a/dlls/shell32/pidl.c
+++ b/dlls/shell32/pidl.c
@@ -1484,23 +1484,94 @@ 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,NULL,0,NULL,NULL) + 1;
+    WideCharToMultiByte(CP_ACP,0,wfd->cFileName,-1, pbuff, len, NULL, NULL);
+    pbuff += len;
+
+    len1 = WideCharToMultiByte(CP_ACP,0,wfd->cAlternateFileName,-1, NULL, 0, NULL, NULL) +1;
+    WideCharToMultiByte(CP_ACP,0,wfd->cAlternateFileName,-1, pbuff, len1, NULL, NULL);
+    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 +1605,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