[4/5] ole32: Add support for reading BSTR properties.

Vincent Povirk madewokherd at gmail.com
Mon Aug 27 17:38:59 CDT 2012


-------------- next part --------------
From 8ecc2d6c61a903d39d569166c7f0d2093b2b2fdc Mon Sep 17 00:00:00 2001
From: Vincent Povirk <vincent at codeweavers.com>
Date: Mon, 27 Aug 2012 17:28:23 -0500
Subject: [PATCH 4/5] 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 a163aa4..71fd4a1 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 2c9b2f5..ca436fb 100644
--- a/dlls/ole32/tests/propvariant.c
+++ b/dlls/ole32/tests/propvariant.c
@@ -388,18 +388,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);
 
     VirtualFree(wrapperCodeMem, 0, MEM_RELEASE);
-- 
1.7.9.5


More information about the wine-patches mailing list