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