Vincent Povirk : ole32: Add support for reading BSTR properties.
Alexandre Julliard
julliard at winehq.org
Tue Aug 28 14:44:39 CDT 2012
Module: wine
Branch: master
Commit: 0a5086ab64f2c35e2f462cf4e77118733a80f2a2
URL: http://source.winehq.org/git/wine.git/?a=commit;h=0a5086ab64f2c35e2f462cf4e77118733a80f2a2
Author: Vincent Povirk <vincent at codeweavers.com>
Date: Mon Aug 27 17:28:23 2012 -0500
ole32: Add support for reading BSTR properties.
---
dlls/ole32/stg_prop.c | 35 +++++++++++++++++++++++++++++++++++
dlls/ole32/tests/propvariant.c | 10 ++++------
2 files changed, 39 insertions(+), 6 deletions(-)
diff --git a/dlls/ole32/stg_prop.c b/dlls/ole32/stg_prop.c
index 103f145..d7d340f 100644
--- a/dlls/ole32/stg_prop.c
+++ b/dlls/ole32/stg_prop.c
@@ -58,6 +58,7 @@
#include "dictionary.h"
#include "storage32.h"
#include "enumx.h"
+#include "oleauto.h"
WINE_DEFAULT_DEBUG_CHANNEL(storage);
@@ -1125,6 +1126,40 @@ static HRESULT PropertyStorage_ReadProperty(PROPVARIANT *prop, const BYTE *data,
}
break;
}
+ case VT_BSTR:
+ {
+ DWORD count, wcount;
+
+ StorageUtl_ReadDWord(data, 0, &count);
+ if (codepage == CP_UNICODE && count % 2)
+ {
+ WARN("Unicode string has odd number of bytes\n");
+ hr = STG_E_INVALIDHEADER;
+ }
+ else
+ {
+ if (codepage == CP_UNICODE)
+ wcount = count / 2;
+ else
+ wcount = MultiByteToWideChar(codepage, 0, (LPCSTR)(data + sizeof(DWORD)), count, NULL, 0);
+
+ prop->u.bstrVal = SysAllocStringLen(NULL, wcount); /* FIXME: use allocator? */
+
+ if (prop->u.bstrVal)
+ {
+ if (codepage == CP_UNICODE)
+ memcpy(prop->u.bstrVal, data + sizeof(DWORD), count);
+ else
+ MultiByteToWideChar(codepage, 0, (LPCSTR)(data + sizeof(DWORD)), count, prop->u.bstrVal, wcount);
+
+ prop->u.bstrVal[wcount - 1] = '\0';
+ TRACE("Read string value %s\n", debugstr_w(prop->u.bstrVal));
+ }
+ else
+ hr = STG_E_INSUFFICIENTMEMORY;
+ }
+ break;
+ }
case VT_BLOB:
{
DWORD count;
diff --git a/dlls/ole32/tests/propvariant.c b/dlls/ole32/tests/propvariant.c
index ec1dfd7..5f7adba 100644
--- a/dlls/ole32/tests/propvariant.c
+++ b/dlls/ole32/tests/propvariant.c
@@ -395,18 +395,16 @@ static void test_propertytovariant(void)
CP_WINUNICODE, &propvar, &allocator);
ok(ret == 0, "StgConvertPropertyToVariant returned %i\n", ret);
- todo_wine ok(propvar.vt == VT_BSTR, "unexpected vt %x\n", propvar.vt);
- if (propvar.vt == VT_BSTR)
- ok(!lstrcmpW(U(propvar).bstrVal, test_string), "unexpected string value\n");
+ ok(propvar.vt == VT_BSTR, "unexpected vt %x\n", propvar.vt);
+ ok(!lstrcmpW(U(propvar).bstrVal, test_string), "unexpected string value\n");
PropVariantClear(&propvar);
ret = pStgConvertPropertyToVariant((SERIALIZEDPROPERTYVALUE*)serialized_bstr_mb,
CP_UTF8, &propvar, &allocator);
ok(ret == 0, "StgConvertPropertyToVariant returned %i\n", ret);
- todo_wine ok(propvar.vt == VT_BSTR, "unexpected vt %x\n", propvar.vt);
- if (propvar.vt == VT_BSTR)
- ok(!lstrcmpW(U(propvar).bstrVal, test_string), "unexpected string value\n");
+ ok(propvar.vt == VT_BSTR, "unexpected vt %x\n", propvar.vt);
+ ok(!lstrcmpW(U(propvar).bstrVal, test_string), "unexpected string value\n");
PropVariantClear(&propvar);
}
More information about the wine-cvs
mailing list