2 * Copyright 2014 Piotr Caban for CodeWeavers
4 * This library is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU Lesser General Public
6 * License as published by the Free Software Foundation; either
7 * version 2.1 of the License, or (at your option) any later version.
9 * This library is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 * Lesser General Public License for more details.
14 * You should have received a copy of the GNU Lesser General Public
15 * License along with this library; if not, write to the Free Software
16 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
21 #include "oleacc_private.h"
23 #include "wine/debug.h"
24 #include "wine/heap.h"
26 WINE_DEFAULT_DEBUG_CHANNEL(oleacc
);
29 IAccessible IAccessible_iface
;
30 IOleWindow IOleWindow_iface
;
31 IEnumVARIANT IEnumVARIANT_iface
;
36 static inline Window
* impl_from_Window(IAccessible
*iface
)
38 return CONTAINING_RECORD(iface
, Window
, IAccessible_iface
);
41 static HRESULT WINAPI
Window_QueryInterface(IAccessible
*iface
, REFIID riid
, void **ppv
)
43 Window
*This
= impl_from_Window(iface
);
45 TRACE("(%p)->(%s %p)\n", This
, debugstr_guid(riid
), ppv
);
47 if(IsEqualIID(riid
, &IID_IAccessible
) ||
48 IsEqualIID(riid
, &IID_IDispatch
) ||
49 IsEqualIID(riid
, &IID_IUnknown
)) {
51 }else if(IsEqualIID(riid
, &IID_IOleWindow
)) {
52 *ppv
= &This
->IOleWindow_iface
;
53 }else if(IsEqualIID(riid
, &IID_IEnumVARIANT
)) {
54 *ppv
= &This
->IEnumVARIANT_iface
;
56 WARN("no interface: %s\n", debugstr_guid(riid
));
61 IAccessible_AddRef(iface
);
65 static ULONG WINAPI
Window_AddRef(IAccessible
*iface
)
67 Window
*This
= impl_from_Window(iface
);
68 ULONG ref
= InterlockedIncrement(&This
->ref
);
70 TRACE("(%p) ref = %u\n", This
, ref
);
74 static ULONG WINAPI
Window_Release(IAccessible
*iface
)
76 Window
*This
= impl_from_Window(iface
);
77 ULONG ref
= InterlockedDecrement(&This
->ref
);
79 TRACE("(%p) ref = %u\n", This
, ref
);
86 static HRESULT WINAPI
Window_GetTypeInfoCount(IAccessible
*iface
, UINT
*pctinfo
)
88 Window
*This
= impl_from_Window(iface
);
89 FIXME("(%p)->(%p)\n", This
, pctinfo
);
93 static HRESULT WINAPI
Window_GetTypeInfo(IAccessible
*iface
,
94 UINT iTInfo
, LCID lcid
, ITypeInfo
**ppTInfo
)
96 Window
*This
= impl_from_Window(iface
);
97 FIXME("(%p)->(%u %x %p)\n", This
, iTInfo
, lcid
, ppTInfo
);
101 static HRESULT WINAPI
Window_GetIDsOfNames(IAccessible
*iface
, REFIID riid
,
102 LPOLESTR
*rgszNames
, UINT cNames
, LCID lcid
, DISPID
*rgDispId
)
104 Window
*This
= impl_from_Window(iface
);
105 FIXME("(%p)->(%s %p %u %x %p)\n", This
, debugstr_guid(riid
),
106 rgszNames
, cNames
, lcid
, rgDispId
);
110 static HRESULT WINAPI
Window_Invoke(IAccessible
*iface
, DISPID dispIdMember
,
111 REFIID riid
, LCID lcid
, WORD wFlags
, DISPPARAMS
*pDispParams
,
112 VARIANT
*pVarResult
, EXCEPINFO
*pExcepInfo
, UINT
*puArgErr
)
114 Window
*This
= impl_from_Window(iface
);
115 FIXME("(%p)->(%x %s %x %x %p %p %p %p)\n", This
, dispIdMember
, debugstr_guid(riid
),
116 lcid
, wFlags
, pDispParams
, pVarResult
, pExcepInfo
, puArgErr
);
120 static HRESULT WINAPI
Window_get_accParent(IAccessible
*iface
, IDispatch
**ppdispParent
)
122 Window
*This
= impl_from_Window(iface
);
123 FIXME("(%p)->(%p)\n", This
, ppdispParent
);
127 static HRESULT WINAPI
Window_get_accChildCount(IAccessible
*iface
, LONG
*pcountChildren
)
129 Window
*This
= impl_from_Window(iface
);
130 FIXME("(%p)->(%p)\n", This
, pcountChildren
);
134 static HRESULT WINAPI
Window_get_accChild(IAccessible
*iface
,
135 VARIANT varChildID
, IDispatch
**ppdispChild
)
137 Window
*This
= impl_from_Window(iface
);
138 FIXME("(%p)->(%s %p)\n", This
, debugstr_variant(&varChildID
), ppdispChild
);
142 static HRESULT WINAPI
Window_get_accName(IAccessible
*iface
, VARIANT varID
, BSTR
*pszName
)
144 Window
*This
= impl_from_Window(iface
);
145 FIXME("(%p)->(%s %p)\n", This
, debugstr_variant(&varID
), pszName
);
149 static HRESULT WINAPI
Window_get_accValue(IAccessible
*iface
, VARIANT varID
, BSTR
*pszValue
)
151 Window
*This
= impl_from_Window(iface
);
152 FIXME("(%p)->(%s %p)\n", This
, debugstr_variant(&varID
), pszValue
);
156 static HRESULT WINAPI
Window_get_accDescription(IAccessible
*iface
,
157 VARIANT varID
, BSTR
*pszDescription
)
159 Window
*This
= impl_from_Window(iface
);
160 FIXME("(%p)->(%s %p)\n", This
, debugstr_variant(&varID
), pszDescription
);
164 static HRESULT WINAPI
Window_get_accRole(IAccessible
*iface
, VARIANT varID
, VARIANT
*pvarRole
)
166 Window
*This
= impl_from_Window(iface
);
167 FIXME("(%p)->(%s %p)\n", This
, debugstr_variant(&varID
), pvarRole
);
171 static HRESULT WINAPI
Window_get_accState(IAccessible
*iface
, VARIANT varID
, VARIANT
*pvarState
)
173 Window
*This
= impl_from_Window(iface
);
174 FIXME("(%p)->(%s %p)\n", This
, debugstr_variant(&varID
), pvarState
);
178 static HRESULT WINAPI
Window_get_accHelp(IAccessible
*iface
, VARIANT varID
, BSTR
*pszHelp
)
180 Window
*This
= impl_from_Window(iface
);
181 FIXME("(%p)->(%s %p)\n", This
, debugstr_variant(&varID
), pszHelp
);
185 static HRESULT WINAPI
Window_get_accHelpTopic(IAccessible
*iface
,
186 BSTR
*pszHelpFile
, VARIANT varID
, LONG
*pidTopic
)
188 Window
*This
= impl_from_Window(iface
);
189 FIXME("(%p)->(%p %s %p)\n", This
, pszHelpFile
, debugstr_variant(&varID
), pidTopic
);
193 static HRESULT WINAPI
Window_get_accKeyboardShortcut(IAccessible
*iface
,
194 VARIANT varID
, BSTR
*pszKeyboardShortcut
)
196 Window
*This
= impl_from_Window(iface
);
197 FIXME("(%p)->(%s %p)\n", This
, debugstr_variant(&varID
), pszKeyboardShortcut
);
201 static HRESULT WINAPI
Window_get_accFocus(IAccessible
*iface
, VARIANT
*pvarID
)
203 Window
*This
= impl_from_Window(iface
);
204 FIXME("(%p)->(%p)\n", This
, pvarID
);
208 static HRESULT WINAPI
Window_get_accSelection(IAccessible
*iface
, VARIANT
*pvarID
)
210 Window
*This
= impl_from_Window(iface
);
211 FIXME("(%p)->(%p)\n", This
, pvarID
);
215 static HRESULT WINAPI
Window_get_accDefaultAction(IAccessible
*iface
,
216 VARIANT varID
, BSTR
*pszDefaultAction
)
218 Window
*This
= impl_from_Window(iface
);
219 FIXME("(%p)->(%s %p)\n", This
, debugstr_variant(&varID
), pszDefaultAction
);
223 static HRESULT WINAPI
Window_accSelect(IAccessible
*iface
, LONG flagsSelect
, VARIANT varID
)
225 Window
*This
= impl_from_Window(iface
);
226 FIXME("(%p)->(%x %s)\n", This
, flagsSelect
, debugstr_variant(&varID
));
230 static HRESULT WINAPI
Window_accLocation(IAccessible
*iface
, LONG
*pxLeft
,
231 LONG
*pyTop
, LONG
*pcxWidth
, LONG
*pcyHeight
, VARIANT varID
)
233 Window
*This
= impl_from_Window(iface
);
234 FIXME("(%p)->(%p %p %p %p %s)\n", This
, pxLeft
, pyTop
,
235 pcxWidth
, pcyHeight
, debugstr_variant(&varID
));
239 static HRESULT WINAPI
Window_accNavigate(IAccessible
*iface
,
240 LONG navDir
, VARIANT varStart
, VARIANT
*pvarEnd
)
242 Window
*This
= impl_from_Window(iface
);
243 FIXME("(%p)->(%d %s %p)\n", This
, navDir
, debugstr_variant(&varStart
), pvarEnd
);
247 static HRESULT WINAPI
Window_accHitTest(IAccessible
*iface
,
248 LONG xLeft
, LONG yTop
, VARIANT
*pvarID
)
250 Window
*This
= impl_from_Window(iface
);
251 FIXME("(%p)->(%d %d %p)\n", This
, xLeft
, yTop
, pvarID
);
255 static HRESULT WINAPI
Window_accDoDefaultAction(IAccessible
*iface
, VARIANT varID
)
257 Window
*This
= impl_from_Window(iface
);
258 FIXME("(%p)->(%s)\n", This
, debugstr_variant(&varID
));
262 static HRESULT WINAPI
Window_put_accName(IAccessible
*iface
, VARIANT varID
, BSTR pszName
)
264 Window
*This
= impl_from_Window(iface
);
265 FIXME("(%p)->(%s %s)\n", This
, debugstr_variant(&varID
), debugstr_w(pszName
));
269 static HRESULT WINAPI
Window_put_accValue(IAccessible
*iface
, VARIANT varID
, BSTR pszValue
)
271 Window
*This
= impl_from_Window(iface
);
272 FIXME("(%p)->(%s %s)\n", This
, debugstr_variant(&varID
), debugstr_w(pszValue
));
276 static const IAccessibleVtbl WindowVtbl
= {
277 Window_QueryInterface
,
280 Window_GetTypeInfoCount
,
282 Window_GetIDsOfNames
,
284 Window_get_accParent
,
285 Window_get_accChildCount
,
289 Window_get_accDescription
,
293 Window_get_accHelpTopic
,
294 Window_get_accKeyboardShortcut
,
296 Window_get_accSelection
,
297 Window_get_accDefaultAction
,
302 Window_accDoDefaultAction
,
307 static inline Window
* impl_from_Window_OleWindow(IOleWindow
*iface
)
309 return CONTAINING_RECORD(iface
, Window
, IOleWindow_iface
);
312 static HRESULT WINAPI
Window_OleWindow_QueryInterface(IOleWindow
*iface
, REFIID riid
, void **ppv
)
314 Window
*This
= impl_from_Window_OleWindow(iface
);
315 return IAccessible_QueryInterface(&This
->IAccessible_iface
, riid
, ppv
);
318 static ULONG WINAPI
Window_OleWindow_AddRef(IOleWindow
*iface
)
320 Window
*This
= impl_from_Window_OleWindow(iface
);
321 return IAccessible_AddRef(&This
->IAccessible_iface
);
324 static ULONG WINAPI
Window_OleWindow_Release(IOleWindow
*iface
)
326 Window
*This
= impl_from_Window_OleWindow(iface
);
327 return IAccessible_Release(&This
->IAccessible_iface
);
330 static HRESULT WINAPI
Window_OleWindow_GetWindow(IOleWindow
*iface
, HWND
*phwnd
)
332 Window
*This
= impl_from_Window_OleWindow(iface
);
333 FIXME("(%p)->(%p)\n", This
, phwnd
);
337 static HRESULT WINAPI
Window_OleWindow_ContextSensitiveHelp(IOleWindow
*iface
, BOOL fEnterMode
)
339 Window
*This
= impl_from_Window_OleWindow(iface
);
340 FIXME("(%p)->(%x)\n", This
, fEnterMode
);
344 static const IOleWindowVtbl WindowOleWindowVtbl
= {
345 Window_OleWindow_QueryInterface
,
346 Window_OleWindow_AddRef
,
347 Window_OleWindow_Release
,
348 Window_OleWindow_GetWindow
,
349 Window_OleWindow_ContextSensitiveHelp
352 static inline Window
* impl_from_Window_EnumVARIANT(IEnumVARIANT
*iface
)
354 return CONTAINING_RECORD(iface
, Window
, IEnumVARIANT_iface
);
357 static HRESULT WINAPI
Window_EnumVARIANT_QueryInterface(IEnumVARIANT
*iface
, REFIID riid
, void **ppv
)
359 Window
*This
= impl_from_Window_EnumVARIANT(iface
);
360 return IAccessible_QueryInterface(&This
->IAccessible_iface
, riid
, ppv
);
363 static ULONG WINAPI
Window_EnumVARIANT_AddRef(IEnumVARIANT
*iface
)
365 Window
*This
= impl_from_Window_EnumVARIANT(iface
);
366 return IAccessible_AddRef(&This
->IAccessible_iface
);
369 static ULONG WINAPI
Window_EnumVARIANT_Release(IEnumVARIANT
*iface
)
371 Window
*This
= impl_from_Window_EnumVARIANT(iface
);
372 return IAccessible_Release(&This
->IAccessible_iface
);
375 static HRESULT WINAPI
Window_EnumVARIANT_Next(IEnumVARIANT
*iface
,
376 ULONG celt
, VARIANT
*rgVar
, ULONG
*pCeltFetched
)
378 Window
*This
= impl_from_Window_EnumVARIANT(iface
);
379 FIXME("(%p)->(%u %p %p)\n", This
, celt
, rgVar
, pCeltFetched
);
383 static HRESULT WINAPI
Window_EnumVARIANT_Skip(IEnumVARIANT
*iface
, ULONG celt
)
385 Window
*This
= impl_from_Window_EnumVARIANT(iface
);
386 FIXME("(%p)->(%u)\n", This
, celt
);
390 static HRESULT WINAPI
Window_EnumVARIANT_Reset(IEnumVARIANT
*iface
)
392 Window
*This
= impl_from_Window_EnumVARIANT(iface
);
393 FIXME("(%p)\n", This
);
397 static HRESULT WINAPI
Window_EnumVARIANT_Clone(IEnumVARIANT
*iface
, IEnumVARIANT
**ppEnum
)
399 Window
*This
= impl_from_Window_EnumVARIANT(iface
);
400 FIXME("(%p)->(%p)\n", This
, ppEnum
);
404 static const IEnumVARIANTVtbl WindowEnumVARIANTVtbl
= {
405 Window_EnumVARIANT_QueryInterface
,
406 Window_EnumVARIANT_AddRef
,
407 Window_EnumVARIANT_Release
,
408 Window_EnumVARIANT_Next
,
409 Window_EnumVARIANT_Skip
,
410 Window_EnumVARIANT_Reset
,
411 Window_EnumVARIANT_Clone
414 HRESULT
create_window_object(HWND hwnd
, const IID
*iid
, void **obj
)
422 window
= heap_alloc_zero(sizeof(Window
));
424 return E_OUTOFMEMORY
;
426 window
->IAccessible_iface
.lpVtbl
= &WindowVtbl
;
427 window
->IOleWindow_iface
.lpVtbl
= &WindowOleWindowVtbl
;
428 window
->IEnumVARIANT_iface
.lpVtbl
= &WindowEnumVARIANTVtbl
;
431 hres
= IAccessible_QueryInterface(&window
->IAccessible_iface
, iid
, obj
);
432 IAccessible_Release(&window
->IAccessible_iface
);