Piotr Caban : oleacc: Add Client_get_accName implementation.

Alexandre Julliard julliard at winehq.org
Thu May 1 14:40:00 CDT 2014


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

Author: Piotr Caban <piotr at codeweavers.com>
Date:   Thu May  1 16:14:24 2014 +0200

oleacc: Add Client_get_accName implementation.

---

 dlls/oleacc/Makefile.in      |    2 +-
 dlls/oleacc/client.c         |   25 +++++++++++++++++++++++--
 dlls/oleacc/main.c           |   11 +++++++++++
 dlls/oleacc/oleacc_private.h |    1 +
 4 files changed, 36 insertions(+), 3 deletions(-)

diff --git a/dlls/oleacc/Makefile.in b/dlls/oleacc/Makefile.in
index d33f867..778791e 100644
--- a/dlls/oleacc/Makefile.in
+++ b/dlls/oleacc/Makefile.in
@@ -1,6 +1,6 @@
 MODULE    = oleacc.dll
 IMPORTLIB = oleacc
-IMPORTS   = ole32 user32 uuid
+IMPORTS   = uuid oleaut32 ole32 user32
 
 C_SRCS = \
 	client.c \
diff --git a/dlls/oleacc/client.c b/dlls/oleacc/client.c
index 5e5ee6f..30673d3 100644
--- a/dlls/oleacc/client.c
+++ b/dlls/oleacc/client.c
@@ -142,8 +142,29 @@ static HRESULT WINAPI Client_get_accChild(IAccessible *iface,
 static HRESULT WINAPI Client_get_accName(IAccessible *iface, VARIANT varID, BSTR *pszName)
 {
     Client *This = impl_from_Client(iface);
-    FIXME("(%p)->(%s %p)\n", This, debugstr_variant(&varID), pszName);
-    return E_NOTIMPL;
+    WCHAR name[1024];
+    UINT i, len;
+
+    TRACE("(%p)->(%s %p)\n", This, debugstr_variant(&varID), pszName);
+
+    *pszName = NULL;
+    if(convert_child_id(&varID) != CHILDID_SELF || !IsWindow(This->hwnd))
+        return E_INVALIDARG;
+
+    len = SendMessageW(This->hwnd, WM_GETTEXT, sizeof(name)/sizeof(WCHAR), (LPARAM)name);
+    if(!len)
+        return S_FALSE;
+
+    for(i=0; i<len; i++) {
+        if(name[i] == '&') {
+            len--;
+            memmove(name+i, name+i+1, (len-i)*sizeof(WCHAR));
+            break;
+        }
+    }
+
+    *pszName = SysAllocStringLen(name, len);
+    return *pszName ? S_OK : E_OUTOFMEMORY;
 }
 
 static HRESULT WINAPI Client_get_accValue(IAccessible *iface, VARIANT varID, BSTR *pszValue)
diff --git a/dlls/oleacc/main.c b/dlls/oleacc/main.c
index 63dfe99..2777a38 100644
--- a/dlls/oleacc/main.c
+++ b/dlls/oleacc/main.c
@@ -70,6 +70,17 @@ const char *debugstr_variant(const VARIANT *v)
     }
 }
 
+int convert_child_id(VARIANT *v)
+{
+    switch(V_VT(v)) {
+    case VT_I4:
+        return V_I4(v);
+    default:
+        FIXME("unhandled child ID variant type: %d\n", V_VT(v));
+        return -1;
+    }
+}
+
 HRESULT WINAPI CreateStdAccessibleObject( HWND hwnd, LONG idObject,
         REFIID riidInterface, void** ppvObject )
 {
diff --git a/dlls/oleacc/oleacc_private.h b/dlls/oleacc/oleacc_private.h
index dbb0f8c..ebbab4c 100644
--- a/dlls/oleacc/oleacc_private.h
+++ b/dlls/oleacc/oleacc_private.h
@@ -21,6 +21,7 @@
 HRESULT create_client_object(HWND, const IID*, void**) DECLSPEC_HIDDEN;
 
 const char *debugstr_variant(const VARIANT*) DECLSPEC_HIDDEN;
+int convert_child_id(VARIANT *v) DECLSPEC_HIDDEN;
 
 static inline void * __WINE_ALLOC_SIZE(1) heap_alloc_zero(size_t len)
 {




More information about the wine-cvs mailing list