[SHLWAPI] Sync with Wine Staging 2.9. CORE-13362
[reactos.git] / reactos / dll / win32 / shlwapi / string.c
index 1cd886e..64a7571 100644 (file)
@@ -1488,7 +1488,7 @@ HRESULT WINAPI StrRetToBufA (LPSTRRET src, const ITEMIDLIST *pidl, LPSTR dest, U
 
          default:
            FIXME("unknown type!\n");
-           return FALSE;
+           return E_NOTIMPL;
        }
        return S_OK;
 }
@@ -1500,47 +1500,58 @@ HRESULT WINAPI StrRetToBufA (LPSTRRET src, const ITEMIDLIST *pidl, LPSTR dest, U
  */
 HRESULT WINAPI StrRetToBufW (LPSTRRET src, const ITEMIDLIST *pidl, LPWSTR dest, UINT len)
 {
-        TRACE("dest=%p len=0x%x strret=%p pidl=%p\n", dest, len, src, pidl);
+    TRACE("dest=%p len=0x%x strret=%p pidl=%p\n", dest, len, src, pidl);
 
-       if (!src)
-       {
-         WARN("Invalid lpStrRet would crash under Win32!\n");
-         if (dest)
-           *dest = '\0';
-         return E_FAIL;
-       }
+    if (!dest || !len)
+        return E_FAIL;
 
-       if (!dest || !len)
-         return E_FAIL;
+    if (!src)
+    {
+        WARN("Invalid lpStrRet would crash under Win32!\n");
+        if (dest)
+            *dest = '\0';
+        return E_FAIL;
+    }
 
-       *dest = '\0';
+    *dest = '\0';
+
+    switch (src->uType) {
+    case STRRET_WSTR: {
+        size_t dst_len;
+        if (!src->u.pOleStr)
+            return E_FAIL;
+        dst_len = strlenW(src->u.pOleStr);
+        memcpy(dest, src->u.pOleStr, min(dst_len, len-1) * sizeof(WCHAR));
+        dest[min(dst_len, len-1)] = 0;
+        CoTaskMemFree(src->u.pOleStr);
+        if (len <= dst_len)
+        {
+            dest[0] = 0;
+            return E_NOT_SUFFICIENT_BUFFER;
+        }
+        break;
+    }
 
-       switch (src->uType)
-       {
-         case STRRET_WSTR:
-            lstrcpynW(dest, src->u.pOleStr, len);
-           CoTaskMemFree(src->u.pOleStr);
-           break;
+    case STRRET_CSTR:
+        if (!MultiByteToWideChar( CP_ACP, 0, src->u.cStr, -1, dest, len ))
+            dest[len-1] = 0;
+        break;
 
-         case STRRET_CSTR:
-              if (!MultiByteToWideChar( CP_ACP, 0, src->u.cStr, -1, dest, len ))
-                  dest[len-1] = 0;
-           break;
+    case STRRET_OFFSET:
+        if (pidl)
+       {
+            if (!MultiByteToWideChar( CP_ACP, 0, ((LPCSTR)&pidl->mkid)+src->u.uOffset, -1,
+                                      dest, len ))
+                dest[len-1] = 0;
+        }
+        break;
 
-         case STRRET_OFFSET:
-           if (pidl)
-           {
-              if (!MultiByteToWideChar( CP_ACP, 0, ((LPCSTR)&pidl->mkid)+src->u.uOffset, -1,
-                                        dest, len ))
-                  dest[len-1] = 0;
-           }
-           break;
+    default:
+        FIXME("unknown type!\n");
+        return E_NOTIMPL;
+    }
 
-         default:
-           FIXME("unknown type!\n");
-           return FALSE;
-       }
-       return S_OK;
+    return S_OK;
 }
 
 /*************************************************************************
@@ -2684,8 +2695,7 @@ DWORD WINAPI SHUnicodeToAnsiCP(UINT CodePage, LPCWSTR lpSrcStr, LPSTR lpDstStr,
       mem = HeapAlloc(GetProcessHeap(), 0, reqLen);
       if (mem)
       {
-        reqLen = WideCharToMultiByte(CodePage, 0, lpSrcStr, len, mem,
-                                     reqLen, NULL, NULL);
+        WideCharToMultiByte(CodePage, 0, lpSrcStr, len, mem, reqLen, NULL, NULL);
 
         reqLen = SHTruncateString(mem, dstlen -1);
         reqLen++;