Module: wine Branch: master Commit: a5f78530ddf45b7773a11af92117993abfb9c8f1 URL: http://source.winehq.org/git/wine.git/?a=commit;h=a5f78530ddf45b7773a11af921...
Author: Piotr Caban piotr@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) {