[PATCH 10/10] combase: Implement functions for HSTRING_BUFFER.

Martin Storsjo martin at martin.st
Sun Dec 7 16:13:35 CST 2014


---
 .../api-ms-win-core-winrt-string-l1-1-0.spec       |  6 +--
 dlls/combase/combase.spec                          |  6 +--
 dlls/combase/string.c                              | 46 ++++++++++++++++++++++
 dlls/combase/tests/string.c                        | 32 +++++++++++++++
 4 files changed, 84 insertions(+), 6 deletions(-)

diff --git a/dlls/api-ms-win-core-winrt-string-l1-1-0/api-ms-win-core-winrt-string-l1-1-0.spec b/dlls/api-ms-win-core-winrt-string-l1-1-0/api-ms-win-core-winrt-string-l1-1-0.spec
index cb6bb5e..2361a1d 100644
--- a/dlls/api-ms-win-core-winrt-string-l1-1-0/api-ms-win-core-winrt-string-l1-1-0.spec
+++ b/dlls/api-ms-win-core-winrt-string-l1-1-0/api-ms-win-core-winrt-string-l1-1-0.spec
@@ -11,14 +11,14 @@
 @ stdcall WindowsCreateString(ptr long ptr) combase.WindowsCreateString
 @ stdcall WindowsCreateStringReference(wstr long ptr ptr) combase.WindowsCreateStringReference
 @ stdcall WindowsDeleteString(ptr) combase.WindowsDeleteString
-@ stub WindowsDeleteStringBuffer
+@ stdcall WindowsDeleteStringBuffer(ptr) combase.WindowsDeleteStringBuffer
 @ stdcall WindowsDuplicateString(ptr ptr) combase.WindowsDuplicateString
 @ stdcall WindowsGetStringLen(ptr) combase.WindowsGetStringLen
 @ stdcall WindowsGetStringRawBuffer(ptr ptr) combase.WindowsGetStringRawBuffer
 @ stub WindowsInspectString
 @ stdcall WindowsIsStringEmpty(ptr) combase.WindowsIsStringEmpty
-@ stub WindowsPreallocateStringBuffer
-@ stub WindowsPromoteStringBuffer
+@ stdcall WindowsPreallocateStringBuffer(long ptr ptr) combase.WindowsPreallocateStringBuffer
+@ stdcall WindowsPromoteStringBuffer(ptr ptr) combase.WindowsPromoteStringBuffer
 @ stub WindowsReplaceString
 @ stdcall WindowsStringHasEmbeddedNull(ptr ptr) combase.WindowsStringHasEmbeddedNull
 @ stub WindowsSubstring
diff --git a/dlls/combase/combase.spec b/dlls/combase/combase.spec
index 2a7de40..3520733 100644
--- a/dlls/combase/combase.spec
+++ b/dlls/combase/combase.spec
@@ -343,14 +343,14 @@
 @ stdcall WindowsCreateString(ptr long ptr)
 @ stdcall WindowsCreateStringReference(wstr long ptr ptr)
 @ stdcall WindowsDeleteString(ptr)
-@ stub WindowsDeleteStringBuffer
+@ stdcall WindowsDeleteStringBuffer(ptr)
 @ stdcall WindowsDuplicateString(ptr ptr)
 @ stdcall WindowsGetStringLen(ptr)
 @ stdcall WindowsGetStringRawBuffer(ptr ptr)
 @ stub WindowsInspectString
 @ stdcall WindowsIsStringEmpty(ptr)
-@ stub WindowsPreallocateStringBuffer
-@ stub WindowsPromoteStringBuffer
+@ stdcall WindowsPreallocateStringBuffer(long ptr ptr)
+@ stdcall WindowsPromoteStringBuffer(ptr ptr)
 @ stub WindowsReplaceString
 @ stdcall WindowsStringHasEmbeddedNull(ptr ptr)
 @ stub WindowsSubstring
diff --git a/dlls/combase/string.c b/dlls/combase/string.c
index 5869c5f..962b7a9 100644
--- a/dlls/combase/string.c
+++ b/dlls/combase/string.c
@@ -44,6 +44,11 @@ static inline struct hstring_private *impl_from_HSTRING_HEADER(HSTRING_HEADER *h
    return (struct hstring_private *)header;
 }
 
+static inline struct hstring_private *impl_from_HSTRING_BUFFER(HSTRING_BUFFER *buffer)
+{
+   return (struct hstring_private *)buffer;
+}
+
 static BOOL alloc_string(UINT32 len, HSTRING *out)
 {
     struct hstring_private *priv;
@@ -138,6 +143,47 @@ HRESULT WINAPI WindowsDuplicateString(HSTRING str, HSTRING *out)
 }
 
 /***********************************************************************
+ *      WindowsPreallocateStringBuffer (api-ms-win-core-winrt-string-l1-1-0.@)
+ */
+HRESULT WINAPI WindowsPreallocateStringBuffer(UINT32 len, WCHAR **outptr,
+                                              HSTRING_BUFFER *out)
+{
+    struct hstring_private *priv;
+    HSTRING str;
+    if (outptr == NULL || out == NULL)
+        return E_POINTER;
+
+    if (!alloc_string(len, &str))
+        return E_OUTOFMEMORY;
+    priv = impl_from_HSTRING(str);
+    *outptr = priv->buffer;
+    *out = (HSTRING_BUFFER)str;
+    return S_OK;
+}
+
+/***********************************************************************
+ *      WindowsDeleteStringBuffer (api-ms-win-core-winrt-string-l1-1-0.@)
+ */
+HRESULT WINAPI WindowsDeleteStringBuffer(HSTRING_BUFFER buf)
+{
+    return WindowsDeleteString((HSTRING)buf);
+}
+
+/***********************************************************************
+ *      WindowsPromoteStringBuffer (api-ms-win-core-winrt-string-l1-1-0.@)
+ */
+HRESULT WINAPI WindowsPromoteStringBuffer(HSTRING_BUFFER buf, HSTRING *out)
+{
+    struct hstring_private *priv = impl_from_HSTRING_BUFFER(buf);
+    if (out == NULL)
+        return E_POINTER;
+    if (priv->buffer[priv->length] != 0 || priv->reference || priv->refcount != 1)
+        return E_INVALIDARG;
+    *out = (HSTRING)buf;
+    return S_OK;
+}
+
+/***********************************************************************
  *      WindowsGetStringLen (api-ms-win-core-winrt-string-l1-1-0.@)
  */
 UINT32 WINAPI WindowsGetStringLen(HSTRING str)
diff --git a/dlls/combase/tests/string.c b/dlls/combase/tests/string.c
index 1c0bec4..e8aab7b 100644
--- a/dlls/combase/tests/string.c
+++ b/dlls/combase/tests/string.c
@@ -30,10 +30,13 @@
 static HRESULT (WINAPI *pWindowsCreateString)(LPCWSTR, UINT32, HSTRING *);
 static HRESULT (WINAPI *pWindowsCreateStringReference)(LPCWSTR, UINT32, HSTRING_HEADER *, HSTRING *);
 static HRESULT (WINAPI *pWindowsDeleteString)(HSTRING);
+static HRESULT (WINAPI *pWindowsDeleteStringBuffer)(HSTRING_BUFFER);
 static HRESULT (WINAPI *pWindowsDuplicateString)(HSTRING, HSTRING *);
 static UINT32  (WINAPI *pWindowsGetStringLen)(HSTRING);
 static LPCWSTR (WINAPI *pWindowsGetStringRawBuffer)(HSTRING, UINT32 *);
 static BOOL    (WINAPI *pWindowsIsStringEmpty)(HSTRING);
+static HRESULT (WINAPI *pWindowsPreallocateStringBuffer)(UINT32, WCHAR **, HSTRING_BUFFER *);
+static HRESULT (WINAPI *pWindowsPromoteStringBuffer)(HSTRING_BUFFER, HSTRING *);
 static HRESULT (WINAPI *pWindowsStringHasEmbeddedNull)(HSTRING, BOOL *);
 
 #define SET(x) p##x = (void*)GetProcAddress(hmod, #x)
@@ -49,10 +52,13 @@ static BOOL init_functions(void)
     SET(WindowsCreateString);
     SET(WindowsCreateStringReference);
     SET(WindowsDeleteString);
+    SET(WindowsDeleteStringBuffer);
     SET(WindowsDuplicateString);
     SET(WindowsGetStringLen);
     SET(WindowsGetStringRawBuffer);
     SET(WindowsIsStringEmpty);
+    SET(WindowsPreallocateStringBuffer);
+    SET(WindowsPromoteStringBuffer);
     SET(WindowsStringHasEmbeddedNull);
     return TRUE;
 }
@@ -162,6 +168,31 @@ static void test_access(void)
     ok(pWindowsDeleteString(str) == S_OK, "Failed to delete string ref\n");
 }
 
+static void test_string_buffer(void)
+{
+    HSTRING_BUFFER buf;
+    WCHAR *ptr;
+    HSTRING str;
+    ok(pWindowsPreallocateStringBuffer(6, &ptr, &buf) == S_OK, "Failed to preallocate string buffer\n");
+    ok(pWindowsDeleteStringBuffer(buf) == S_OK, "Failed to delete string buffer\n");
+
+    ok(pWindowsPreallocateStringBuffer(6, &ptr, &buf) == S_OK, "Failed to preallocate string buffer\n");
+    ok(ptr[6] == '\0', "Preallocated string buffer didn't have null termination\n");
+    memcpy(ptr, input_string, 6 * sizeof(*input_string));
+    ok(pWindowsPromoteStringBuffer(buf, NULL) == E_POINTER, "Incorrect error handling\n");
+    ok(pWindowsPromoteStringBuffer(buf, &str) == S_OK, "Failed to promote string buffer\n");
+    check_string(str, 6, FALSE);
+    ok(pWindowsDeleteString(str) == S_OK, "Failed to delete string\n");
+
+    ok(pWindowsPreallocateStringBuffer(6, NULL, &buf) == E_POINTER, "Incorrect error handling\n");
+    ok(pWindowsPreallocateStringBuffer(6, &ptr, NULL) == E_POINTER, "Incorrect error handling\n");
+
+    ok(pWindowsPreallocateStringBuffer(6, &ptr, &buf) == S_OK, "Failed to preallocate string buffer\n");
+    ptr[6] = 'a'; /* Overwrite the buffer's null termination, promotion should fail */
+    ok(pWindowsPromoteStringBuffer(buf, &str) == E_INVALIDARG, "Incorrect error handling\n");
+    ok(pWindowsDeleteStringBuffer(buf) == S_OK, "Failed to delete string buffer\n");
+}
+
 START_TEST(string)
 {
     if (!init_functions())
@@ -169,4 +200,5 @@ START_TEST(string)
     test_create_delete();
     test_duplicate();
     test_access();
+    test_string_buffer();
 }
-- 
1.8.1.2




More information about the wine-patches mailing list