Obvious fixes to PropVariantClear and PropVariantCopy for vector
types.
diff --git a/dlls/ole32/ole2.c b/dlls/ole32/ole2.c
index ed569bb..339ccd2 100644
--- a/dlls/ole32/ole2.c
+++ b/dlls/ole32/ole2.c
@@ -5,6 +5,7 @@
* Copyright 1999 Francis Beaudet
* Copyright 1999 Noel Borthwick
* Copyright 1999, 2000 Marcus Meissner
+ * Copyright 2005 Juan Lang
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -2540,26 +2541,40 @@
}
break;
default:
- switch (pvar->vt & ~VT_VECTOR)
+ if (pvar->vt & VT_VECTOR)
{
- case VT_VARIANT:
- FreePropVariantArray(pvar->u.capropvar.cElems, pvar->u.capropvar.pElems);
- break;
- case VT_CF:
- OLE_FreeClipDataArray(pvar->u.caclipdata.cElems, pvar->u.caclipdata.pElems);
- break;
- case VT_BSTR:
- case VT_LPSTR:
- case VT_LPWSTR:
- case VT_CLSID:
- FIXME("Freeing of vector sub-type not supported yet\n");
+ ULONG i;
+
+ switch (pvar->vt & ~VT_VECTOR)
+ {
+ case VT_VARIANT:
+ FreePropVariantArray(pvar->u.capropvar.cElems, pvar->u.capropvar.pElems);
+ break;
+ case VT_CF:
+ OLE_FreeClipDataArray(pvar->u.caclipdata.cElems, pvar->u.caclipdata.pElems);
+ break;
+ case VT_BSTR:
+ for (i = 0; i < pvar->u.cabstr.cElems; i++)
+ PropSysFreeString(pvar->u.cabstr.pElems[i]);
+ break;
+ case VT_LPSTR:
+ for (i = 0; i < pvar->u.calpstr.cElems; i++)
+ CoTaskMemFree(pvar->u.calpstr.pElems[i]);
+ break;
+ case VT_LPWSTR:
+ for (i = 0; i < pvar->u.calpwstr.cElems; i++)
+ CoTaskMemFree(pvar->u.calpwstr.pElems[i]);
+ break;
+ }
+ if (pvar->vt & ~VT_VECTOR)
+ {
+ /* pick an arbitary VT_VECTOR structure - they all have the same
+ * memory layout */
+ CoTaskMemFree(pvar->u.capropvar.pElems);
+ }
}
- if (pvar->vt & ~VT_VECTOR)
- {
- /* pick an arbitary VT_VECTOR structure - they all have the same
- * memory layout */
- CoTaskMemFree(pvar->u.capropvar.pElems);
- }
+ else
+ WARN("Invalid/unsupported type %d\n", pvar->vt);
}
ZeroMemory(pvar, sizeof(*pvar));
@@ -2631,7 +2646,9 @@
if (pvarSrc->vt & VT_VECTOR)
{
int elemSize;
- switch(pvarSrc->vt & VT_VECTOR)
+ ULONG i;
+
+ switch(pvarSrc->vt & ~VT_VECTOR)
{
case VT_I1: elemSize = sizeof(pvarSrc->u.cVal); break;
case VT_UI1: elemSize = sizeof(pvarSrc->u.bVal); break;
@@ -2650,20 +2667,19 @@
case VT_FILETIME: elemSize = sizeof(pvarSrc->u.filetime); break;
case VT_CLSID: elemSize = sizeof(*pvarSrc->u.puuid); break;
case VT_CF: elemSize = sizeof(*pvarSrc->u.pclipdata); break;
+ case VT_BSTR: elemSize = sizeof(*pvarSrc->u.bstrVal); break;
+ case VT_LPSTR: elemSize = sizeof(*pvarSrc->u.pszVal); break;
+ case VT_LPWSTR: elemSize = sizeof(*pvarSrc->u.pwszVal); break;
- case VT_BSTR:
- case VT_LPSTR:
- case VT_LPWSTR:
case VT_VARIANT:
default:
- FIXME("Invalid element type: %ul\n", pvarSrc->vt & VT_VECTOR);
+ FIXME("Invalid element type: %ul\n", pvarSrc->vt & ~VT_VECTOR);
return E_INVALIDARG;
}
len = pvarSrc->u.capropvar.cElems;
pvarDest->u.capropvar.pElems = CoTaskMemAlloc(len * elemSize);
if (pvarSrc->vt == (VT_VECTOR | VT_VARIANT))
{
- ULONG i;
for (i = 0; i < len; i++)
PropVariantCopy(&pvarDest->u.capropvar.pElems[i], &pvarSrc->u.capropvar.pElems[i]);
}
@@ -2673,19 +2689,37 @@
}
else if (pvarSrc->vt == (VT_VECTOR | VT_BSTR))
{
- FIXME("Copy BSTRs\n");
+ for (i = 0; i < len; i++)
+ pvarDest->u.cabstr.pElems[i] = PropSysAllocString(pvarSrc->u.cabstr.pElems[i]);
}
else if (pvarSrc->vt == (VT_VECTOR | VT_LPSTR))
{
- FIXME("Copy LPSTRs\n");
+ size_t strLen;
+ for (i = 0; i < len; i++)
+ {
+ strLen = lstrlenA(pvarSrc->u.calpstr.pElems[i]) + 1;
+ pvarDest->u.calpstr.pElems[i] = CoTaskMemAlloc(strLen);
+ memcpy(pvarDest->u.calpstr.pElems[i],
+ pvarSrc->u.calpstr.pElems[i], strLen);
+ }
}
- else if (pvarSrc->vt == (VT_VECTOR | VT_LPSTR))
+ else if (pvarSrc->vt == (VT_VECTOR | VT_LPWSTR))
{
- FIXME("Copy LPWSTRs\n");
+ size_t strLen;
+ for (i = 0; i < len; i++)
+ {
+ strLen = (lstrlenW(pvarSrc->u.calpwstr.pElems[i]) + 1) *
+ sizeof(WCHAR);
+ pvarDest->u.calpstr.pElems[i] = CoTaskMemAlloc(strLen);
+ memcpy(pvarDest->u.calpstr.pElems[i],
+ pvarSrc->u.calpstr.pElems[i], strLen);
+ }
}
else
CopyMemory(pvarDest->u.capropvar.pElems, pvarSrc->u.capropvar.pElems, len * elemSize);
}
+ else
+ WARN("Invalid/unsupported type %d\n", pvarSrc->vt);
}
return S_OK;