Nikolay Sivov : dwrite: Implement GetString().

Alexandre Julliard julliard at winehq.org
Mon Oct 8 13:39:56 CDT 2012


Module: wine
Branch: master
Commit: 9b0f49264e423ecb49fa4fc45959556b021a2e4c
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=9b0f49264e423ecb49fa4fc45959556b021a2e4c

Author: Nikolay Sivov <nsivov at codeweavers.com>
Date:   Sun Oct  7 18:43:15 2012 -0400

dwrite: Implement GetString().

---

 dlls/dwrite/main.c       |   17 +++++++++++++++--
 dlls/dwrite/tests/font.c |   37 ++++++++++++++++++++++++++++++++++---
 include/winerror.h       |    2 ++
 3 files changed, 51 insertions(+), 5 deletions(-)

diff --git a/dlls/dwrite/main.c b/dlls/dwrite/main.c
index 4ddc74b..67ba83c 100644
--- a/dlls/dwrite/main.c
+++ b/dlls/dwrite/main.c
@@ -286,8 +286,21 @@ static HRESULT WINAPI localizedstrings_GetStringLength(IDWriteLocalizedStrings *
 static HRESULT WINAPI localizedstrings_GetString(IDWriteLocalizedStrings *iface, UINT32 index, WCHAR *buffer, UINT32 size)
 {
     struct localizedstrings *This = impl_from_IDWriteLocalizedStrings(iface);
-    FIXME("(%p)->(%u %p %u): stub\n", This, index, buffer, size);
-    return E_NOTIMPL;
+
+    TRACE("(%p)->(%u %p %u)\n", This, index, buffer, size);
+
+    if (index >= This->count) {
+        if (buffer) *buffer = 0;
+        return E_FAIL;
+    }
+
+    if (size < strlenW(This->data[index].string)+1) {
+        if (buffer) *buffer = 0;
+        return E_NOT_SUFFICIENT_BUFFER;
+    }
+
+    strcpyW(buffer, This->data[index].string);
+    return S_OK;
 }
 
 static const IDWriteLocalizedStringsVtbl localizedstringsvtbl = {
diff --git a/dlls/dwrite/tests/font.c b/dlls/dwrite/tests/font.c
index b22453c..81e17fd 100644
--- a/dlls/dwrite/tests/font.c
+++ b/dlls/dwrite/tests/font.c
@@ -320,6 +320,7 @@ static void test_GetFamilyNames(void)
     IDWriteGdiInterop *interop;
     IDWriteFont *font;
     LOGFONTW logfont;
+    WCHAR buffer[100];
     HRESULT hr;
     UINT32 len;
 
@@ -357,15 +358,45 @@ if (0) /* crashes on native */
 if (0) /* crashes on native */
     hr = IDWriteLocalizedStrings_GetStringLength(names, 0, NULL);
 
+    len = 100;
+    hr = IDWriteLocalizedStrings_GetStringLength(names, 10, &len);
+    ok(hr == E_FAIL, "got 0x%08x\n", hr);
+    ok(len == (UINT32)-1, "got %u\n", len);
+
     len = 0;
     hr = IDWriteLocalizedStrings_GetStringLength(names, 0, &len);
     ok(hr == S_OK, "got 0x%08x\n", hr);
     ok(len > 0, "got %u\n", len);
 
-    len = 100;
-    hr = IDWriteLocalizedStrings_GetStringLength(names, 10, &len);
+    /* GetString */
+    hr = IDWriteLocalizedStrings_GetString(names, 0, NULL, 0);
+    ok(hr == E_NOT_SUFFICIENT_BUFFER, "got 0x%08x\n", hr);
+
+    hr = IDWriteLocalizedStrings_GetString(names, 10, NULL, 0);
     ok(hr == E_FAIL, "got 0x%08x\n", hr);
-    ok(len == (UINT32)-1, "got %u\n", len);
+
+if (0)
+    hr = IDWriteLocalizedStrings_GetString(names, 0, NULL, 100);
+
+    buffer[0] = 1;
+    hr = IDWriteLocalizedStrings_GetString(names, 10, buffer, 100);
+    ok(hr == E_FAIL, "got 0x%08x\n", hr);
+    ok(buffer[0] == 0, "got %x\n", buffer[0]);
+
+    buffer[0] = 1;
+    hr = IDWriteLocalizedStrings_GetString(names, 0, buffer, len-1);
+    ok(hr == E_NOT_SUFFICIENT_BUFFER, "got 0x%08x\n", hr);
+    ok(buffer[0] == 0, "got %x\n", buffer[0]);
+
+    buffer[0] = 1;
+    hr = IDWriteLocalizedStrings_GetString(names, 0, buffer, len);
+    ok(hr == E_NOT_SUFFICIENT_BUFFER, "got 0x%08x\n", hr);
+    ok(buffer[0] == 0, "got %x\n", buffer[0]);
+
+    buffer[0] = 0;
+    hr = IDWriteLocalizedStrings_GetString(names, 0, buffer, len+1);
+    ok(hr == S_OK, "got 0x%08x\n", hr);
+    ok(buffer[0] != 0, "got %x\n", buffer[0]);
 
     IDWriteLocalizedStrings_Release(names);
 
diff --git a/include/winerror.h b/include/winerror.h
index 0b9a59e..b6281f8 100644
--- a/include/winerror.h
+++ b/include/winerror.h
@@ -1939,6 +1939,8 @@ static inline HRESULT HRESULT_FROM_WIN32(unsigned int x)
 /* the codes 4000-40ff are reserved for OLE */
 #undef NOERROR  /* arpa/nameser_compat.h defines this */
 
+#define E_NOT_SUFFICIENT_BUFFER                            HRESULT_FROM_WIN32(ERROR_INSUFFICIENT_BUFFER)
+
 #ifdef RC_INVOKED
 #define _HRESULT_TYPEDEF_(x) (x)
 #else




More information about the wine-cvs mailing list