| /* | |
| * Copyright 2014 Piotr Caban for CodeWeavers | |
| * | |
| * This library is free software; you can redistribute it and/or | |
| * modify it under the terms of the GNU Lesser General Public | |
| * License as published by the Free Software Foundation; either | |
| * version 2.1 of the License, or (at your option) any later version. | |
| * | |
| * This library is distributed in the hope that it will be useful, | |
| * but WITHOUT ANY WARRANTY; without even the implied warranty of | |
| * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |
| * Lesser General Public License for more details. | |
| * | |
| * You should have received a copy of the GNU Lesser General Public | |
| * License along with this library; if not, write to the Free Software | |
| * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA | |
| */ | |
| #define COBJMACROS | |
| #include "oleacc_private.h" | |
| #include "wine/unicode.h" | |
| #include "wine/debug.h" | |
| WINE_DEFAULT_DEBUG_CHANNEL(oleacc); | |
| typedef struct { | |
| IAccessible IAccessible_iface; | |
| IOleWindow IOleWindow_iface; | |
| IEnumVARIANT IEnumVARIANT_iface; | |
| LONG ref; | |
| } Window; | |
| static inline Window* impl_from_Window(IAccessible *iface) | |
| { | |
| return CONTAINING_RECORD(iface, Window, IAccessible_iface); | |
| } | |
| static HRESULT WINAPI Window_QueryInterface(IAccessible *iface, REFIID riid, void **ppv) | |
| { | |
| Window *This = impl_from_Window(iface); | |
| TRACE("(%p)->(%s %p)\n", This, debugstr_guid(riid), ppv); | |
| if(IsEqualIID(riid, &IID_IAccessible) || | |
| IsEqualIID(riid, &IID_IDispatch) || | |
| IsEqualIID(riid, &IID_IUnknown)) { | |
| *ppv = iface; | |
| }else if(IsEqualIID(riid, &IID_IOleWindow)) { | |
| *ppv = &This->IOleWindow_iface; | |
| }else if(IsEqualIID(riid, &IID_IEnumVARIANT)) { | |
| *ppv = &This->IEnumVARIANT_iface; | |
| }else { | |
| WARN("no interface: %s\n", debugstr_guid(riid)); | |
| *ppv = NULL; | |
| return E_NOINTERFACE; | |
| } | |
| IAccessible_AddRef(iface); | |
| return S_OK; | |
| } | |
| static ULONG WINAPI Window_AddRef(IAccessible *iface) | |
| { | |
| Window *This = impl_from_Window(iface); | |
| ULONG ref = InterlockedIncrement(&This->ref); | |
| TRACE("(%p) ref = %u\n", This, ref); | |
| return ref; | |
| } | |
| static ULONG WINAPI Window_Release(IAccessible *iface) | |
| { | |
| Window *This = impl_from_Window(iface); | |
| ULONG ref = InterlockedDecrement(&This->ref); | |
| TRACE("(%p) ref = %u\n", This, ref); | |
| if(!ref) | |
| heap_free(This); | |
| return ref; | |
| } | |
| static HRESULT WINAPI Window_GetTypeInfoCount(IAccessible *iface, UINT *pctinfo) | |
| { | |
| Window *This = impl_from_Window(iface); | |
| FIXME("(%p)->(%p)\n", This, pctinfo); | |
| return E_NOTIMPL; | |
| } | |
| static HRESULT WINAPI Window_GetTypeInfo(IAccessible *iface, | |
| UINT iTInfo, LCID lcid, ITypeInfo **ppTInfo) | |
| { | |
| Window *This = impl_from_Window(iface); | |
| FIXME("(%p)->(%u %x %p)\n", This, iTInfo, lcid, ppTInfo); | |
| return E_NOTIMPL; | |
| } | |
| static HRESULT WINAPI Window_GetIDsOfNames(IAccessible *iface, REFIID riid, | |
| LPOLESTR *rgszNames, UINT cNames, LCID lcid, DISPID *rgDispId) | |
| { | |
| Window *This = impl_from_Window(iface); | |
| FIXME("(%p)->(%s %p %u %x %p)\n", This, debugstr_guid(riid), | |
| rgszNames, cNames, lcid, rgDispId); | |
| return E_NOTIMPL; | |
| } | |
| static HRESULT WINAPI Window_Invoke(IAccessible *iface, DISPID dispIdMember, | |
| REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS *pDispParams, | |
| VARIANT *pVarResult, EXCEPINFO *pExcepInfo, UINT *puArgErr) | |
| { | |
| Window *This = impl_from_Window(iface); | |
| FIXME("(%p)->(%x %s %x %x %p %p %p %p)\n", This, dispIdMember, debugstr_guid(riid), | |
| lcid, wFlags, pDispParams, pVarResult, pExcepInfo, puArgErr); | |
| return E_NOTIMPL; | |
| } | |
| static HRESULT WINAPI Window_get_accParent(IAccessible *iface, IDispatch **ppdispParent) | |
| { | |
| Window *This = impl_from_Window(iface); | |
| FIXME("(%p)->(%p)\n", This, ppdispParent); | |
| return E_NOTIMPL; | |
| } | |
| static HRESULT WINAPI Window_get_accChildCount(IAccessible *iface, LONG *pcountChildren) | |
| { | |
| Window *This = impl_from_Window(iface); | |
| FIXME("(%p)->(%p)\n", This, pcountChildren); | |
| return E_NOTIMPL; | |
| } | |
| static HRESULT WINAPI Window_get_accChild(IAccessible *iface, | |
| VARIANT varChildID, IDispatch **ppdispChild) | |
| { | |
| Window *This = impl_from_Window(iface); | |
| FIXME("(%p)->(%s %p)\n", This, debugstr_variant(&varChildID), ppdispChild); | |
| return E_NOTIMPL; | |
| } | |
| static HRESULT WINAPI Window_get_accName(IAccessible *iface, VARIANT varID, BSTR *pszName) | |
| { | |
| Window *This = impl_from_Window(iface); | |
| FIXME("(%p)->(%s %p)\n", This, debugstr_variant(&varID), pszName); | |
| return E_NOTIMPL; | |
| } | |
| static HRESULT WINAPI Window_get_accValue(IAccessible *iface, VARIANT varID, BSTR *pszValue) | |
| { | |
| Window *This = impl_from_Window(iface); | |
| FIXME("(%p)->(%s %p)\n", This, debugstr_variant(&varID), pszValue); | |
| return E_NOTIMPL; | |
| } | |
| static HRESULT WINAPI Window_get_accDescription(IAccessible *iface, | |
| VARIANT varID, BSTR *pszDescription) | |
| { | |
| Window *This = impl_from_Window(iface); | |
| FIXME("(%p)->(%s %p)\n", This, debugstr_variant(&varID), pszDescription); | |
| return E_NOTIMPL; | |
| } | |
| static HRESULT WINAPI Window_get_accRole(IAccessible *iface, VARIANT varID, VARIANT *pvarRole) | |
| { | |
| Window *This = impl_from_Window(iface); | |
| FIXME("(%p)->(%s %p)\n", This, debugstr_variant(&varID), pvarRole); | |
| return E_NOTIMPL; | |
| } | |
| static HRESULT WINAPI Window_get_accState(IAccessible *iface, VARIANT varID, VARIANT *pvarState) | |
| { | |
| Window *This = impl_from_Window(iface); | |
| FIXME("(%p)->(%s %p)\n", This, debugstr_variant(&varID), pvarState); | |
| return E_NOTIMPL; | |
| } | |
| static HRESULT WINAPI Window_get_accHelp(IAccessible *iface, VARIANT varID, BSTR *pszHelp) | |
| { | |
| Window *This = impl_from_Window(iface); | |
| FIXME("(%p)->(%s %p)\n", This, debugstr_variant(&varID), pszHelp); | |
| return E_NOTIMPL; | |
| } | |
| static HRESULT WINAPI Window_get_accHelpTopic(IAccessible *iface, | |
| BSTR *pszHelpFile, VARIANT varID, LONG *pidTopic) | |
| { | |
| Window *This = impl_from_Window(iface); | |
| FIXME("(%p)->(%p %s %p)\n", This, pszHelpFile, debugstr_variant(&varID), pidTopic); | |
| return E_NOTIMPL; | |
| } | |
| static HRESULT WINAPI Window_get_accKeyboardShortcut(IAccessible *iface, | |
| VARIANT varID, BSTR *pszKeyboardShortcut) | |
| { | |
| Window *This = impl_from_Window(iface); | |
| FIXME("(%p)->(%s %p)\n", This, debugstr_variant(&varID), pszKeyboardShortcut); | |
| return E_NOTIMPL; | |
| } | |
| static HRESULT WINAPI Window_get_accFocus(IAccessible *iface, VARIANT *pvarID) | |
| { | |
| Window *This = impl_from_Window(iface); | |
| FIXME("(%p)->(%p)\n", This, pvarID); | |
| return E_NOTIMPL; | |
| } | |
| static HRESULT WINAPI Window_get_accSelection(IAccessible *iface, VARIANT *pvarID) | |
| { | |
| Window *This = impl_from_Window(iface); | |
| FIXME("(%p)->(%p)\n", This, pvarID); | |
| return E_NOTIMPL; | |
| } | |
| static HRESULT WINAPI Window_get_accDefaultAction(IAccessible *iface, | |
| VARIANT varID, BSTR *pszDefaultAction) | |
| { | |
| Window *This = impl_from_Window(iface); | |
| FIXME("(%p)->(%s %p)\n", This, debugstr_variant(&varID), pszDefaultAction); | |
| return E_NOTIMPL; | |
| } | |
| static HRESULT WINAPI Window_accSelect(IAccessible *iface, LONG flagsSelect, VARIANT varID) | |
| { | |
| Window *This = impl_from_Window(iface); | |
| FIXME("(%p)->(%x %s)\n", This, flagsSelect, debugstr_variant(&varID)); | |
| return E_NOTIMPL; | |
| } | |
| static HRESULT WINAPI Window_accLocation(IAccessible *iface, LONG *pxLeft, | |
| LONG *pyTop, LONG *pcxWidth, LONG *pcyHeight, VARIANT varID) | |
| { | |
| Window *This = impl_from_Window(iface); | |
| FIXME("(%p)->(%p %p %p %p %s)\n", This, pxLeft, pyTop, | |
| pcxWidth, pcyHeight, debugstr_variant(&varID)); | |
| return E_NOTIMPL; | |
| } | |
| static HRESULT WINAPI Window_accNavigate(IAccessible *iface, | |
| LONG navDir, VARIANT varStart, VARIANT *pvarEnd) | |
| { | |
| Window *This = impl_from_Window(iface); | |
| FIXME("(%p)->(%d %s %p)\n", This, navDir, debugstr_variant(&varStart), pvarEnd); | |
| return E_NOTIMPL; | |
| } | |
| static HRESULT WINAPI Window_accHitTest(IAccessible *iface, | |
| LONG xLeft, LONG yTop, VARIANT *pvarID) | |
| { | |
| Window *This = impl_from_Window(iface); | |
| FIXME("(%p)->(%d %d %p)\n", This, xLeft, yTop, pvarID); | |
| return E_NOTIMPL; | |
| } | |
| static HRESULT WINAPI Window_accDoDefaultAction(IAccessible *iface, VARIANT varID) | |
| { | |
| Window *This = impl_from_Window(iface); | |
| FIXME("(%p)->(%s)\n", This, debugstr_variant(&varID)); | |
| return E_NOTIMPL; | |
| } | |
| static HRESULT WINAPI Window_put_accName(IAccessible *iface, VARIANT varID, BSTR pszName) | |
| { | |
| Window *This = impl_from_Window(iface); | |
| FIXME("(%p)->(%s %s)\n", This, debugstr_variant(&varID), debugstr_w(pszName)); | |
| return E_NOTIMPL; | |
| } | |
| static HRESULT WINAPI Window_put_accValue(IAccessible *iface, VARIANT varID, BSTR pszValue) | |
| { | |
| Window *This = impl_from_Window(iface); | |
| FIXME("(%p)->(%s %s)\n", This, debugstr_variant(&varID), debugstr_w(pszValue)); | |
| return E_NOTIMPL; | |
| } | |
| static const IAccessibleVtbl WindowVtbl = { | |
| Window_QueryInterface, | |
| Window_AddRef, | |
| Window_Release, | |
| Window_GetTypeInfoCount, | |
| Window_GetTypeInfo, | |
| Window_GetIDsOfNames, | |
| Window_Invoke, | |
| Window_get_accParent, | |
| Window_get_accChildCount, | |
| Window_get_accChild, | |
| Window_get_accName, | |
| Window_get_accValue, | |
| Window_get_accDescription, | |
| Window_get_accRole, | |
| Window_get_accState, | |
| Window_get_accHelp, | |
| Window_get_accHelpTopic, | |
| Window_get_accKeyboardShortcut, | |
| Window_get_accFocus, | |
| Window_get_accSelection, | |
| Window_get_accDefaultAction, | |
| Window_accSelect, | |
| Window_accLocation, | |
| Window_accNavigate, | |
| Window_accHitTest, | |
| Window_accDoDefaultAction, | |
| Window_put_accName, | |
| Window_put_accValue | |
| }; | |
| static inline Window* impl_from_Window_OleWindow(IOleWindow *iface) | |
| { | |
| return CONTAINING_RECORD(iface, Window, IOleWindow_iface); | |
| } | |
| static HRESULT WINAPI Window_OleWindow_QueryInterface(IOleWindow *iface, REFIID riid, void **ppv) | |
| { | |
| Window *This = impl_from_Window_OleWindow(iface); | |
| return IAccessible_QueryInterface(&This->IAccessible_iface, riid, ppv); | |
| } | |
| static ULONG WINAPI Window_OleWindow_AddRef(IOleWindow *iface) | |
| { | |
| Window *This = impl_from_Window_OleWindow(iface); | |
| return IAccessible_AddRef(&This->IAccessible_iface); | |
| } | |
| static ULONG WINAPI Window_OleWindow_Release(IOleWindow *iface) | |
| { | |
| Window *This = impl_from_Window_OleWindow(iface); | |
| return IAccessible_Release(&This->IAccessible_iface); | |
| } | |
| static HRESULT WINAPI Window_OleWindow_GetWindow(IOleWindow *iface, HWND *phwnd) | |
| { | |
| Window *This = impl_from_Window_OleWindow(iface); | |
| FIXME("(%p)->(%p)\n", This, phwnd); | |
| return E_NOTIMPL; | |
| } | |
| static HRESULT WINAPI Window_OleWindow_ContextSensitiveHelp(IOleWindow *iface, BOOL fEnterMode) | |
| { | |
| Window *This = impl_from_Window_OleWindow(iface); | |
| FIXME("(%p)->(%x)\n", This, fEnterMode); | |
| return E_NOTIMPL; | |
| } | |
| static const IOleWindowVtbl WindowOleWindowVtbl = { | |
| Window_OleWindow_QueryInterface, | |
| Window_OleWindow_AddRef, | |
| Window_OleWindow_Release, | |
| Window_OleWindow_GetWindow, | |
| Window_OleWindow_ContextSensitiveHelp | |
| }; | |
| static inline Window* impl_from_Window_EnumVARIANT(IEnumVARIANT *iface) | |
| { | |
| return CONTAINING_RECORD(iface, Window, IEnumVARIANT_iface); | |
| } | |
| static HRESULT WINAPI Window_EnumVARIANT_QueryInterface(IEnumVARIANT *iface, REFIID riid, void **ppv) | |
| { | |
| Window *This = impl_from_Window_EnumVARIANT(iface); | |
| return IAccessible_QueryInterface(&This->IAccessible_iface, riid, ppv); | |
| } | |
| static ULONG WINAPI Window_EnumVARIANT_AddRef(IEnumVARIANT *iface) | |
| { | |
| Window *This = impl_from_Window_EnumVARIANT(iface); | |
| return IAccessible_AddRef(&This->IAccessible_iface); | |
| } | |
| static ULONG WINAPI Window_EnumVARIANT_Release(IEnumVARIANT *iface) | |
| { | |
| Window *This = impl_from_Window_EnumVARIANT(iface); | |
| return IAccessible_Release(&This->IAccessible_iface); | |
| } | |
| static HRESULT WINAPI Window_EnumVARIANT_Next(IEnumVARIANT *iface, | |
| ULONG celt, VARIANT *rgVar, ULONG *pCeltFetched) | |
| { | |
| Window *This = impl_from_Window_EnumVARIANT(iface); | |
| FIXME("(%p)->(%u %p %p)\n", This, celt, rgVar, pCeltFetched); | |
| return E_NOTIMPL; | |
| } | |
| static HRESULT WINAPI Window_EnumVARIANT_Skip(IEnumVARIANT *iface, ULONG celt) | |
| { | |
| Window *This = impl_from_Window_EnumVARIANT(iface); | |
| FIXME("(%p)->(%u)\n", This, celt); | |
| return E_NOTIMPL; | |
| } | |
| static HRESULT WINAPI Window_EnumVARIANT_Reset(IEnumVARIANT *iface) | |
| { | |
| Window *This = impl_from_Window_EnumVARIANT(iface); | |
| FIXME("(%p)\n", This); | |
| return E_NOTIMPL; | |
| } | |
| static HRESULT WINAPI Window_EnumVARIANT_Clone(IEnumVARIANT *iface, IEnumVARIANT **ppEnum) | |
| { | |
| Window *This = impl_from_Window_EnumVARIANT(iface); | |
| FIXME("(%p)->(%p)\n", This, ppEnum); | |
| return E_NOTIMPL; | |
| } | |
| static const IEnumVARIANTVtbl WindowEnumVARIANTVtbl = { | |
| Window_EnumVARIANT_QueryInterface, | |
| Window_EnumVARIANT_AddRef, | |
| Window_EnumVARIANT_Release, | |
| Window_EnumVARIANT_Next, | |
| Window_EnumVARIANT_Skip, | |
| Window_EnumVARIANT_Reset, | |
| Window_EnumVARIANT_Clone | |
| }; | |
| HRESULT create_window_object(HWND hwnd, const IID *iid, void **obj) | |
| { | |
| Window *window; | |
| HRESULT hres; | |
| if(!IsWindow(hwnd)) | |
| return E_FAIL; | |
| window = heap_alloc_zero(sizeof(Window)); | |
| if(!window) | |
| return E_OUTOFMEMORY; | |
| window->IAccessible_iface.lpVtbl = &WindowVtbl; | |
| window->IOleWindow_iface.lpVtbl = &WindowOleWindowVtbl; | |
| window->IEnumVARIANT_iface.lpVtbl = &WindowEnumVARIANTVtbl; | |
| window->ref = 1; | |
| hres = IAccessible_QueryInterface(&window->IAccessible_iface, iid, obj); | |
| IAccessible_Release(&window->IAccessible_iface); | |
| return hres; | |
| } |