1 /*
2 * Copyright 2014 Piotr Caban for CodeWeavers
3 *
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.
8 *
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.
13 *
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
17 */
18
19 #define COBJMACROS
20
21 #include "oleacc_private.h"
22
23 #include "wine/debug.h"
24 #include "wine/heap.h"
25
26 WINE_DEFAULT_DEBUG_CHANNEL(oleacc);
27
28 typedef struct {
29 IAccessible IAccessible_iface;
30 IOleWindow IOleWindow_iface;
31 IEnumVARIANT IEnumVARIANT_iface;
32
33 LONG ref;
34 } Window;
35
impl_from_Window(IAccessible * iface)36 static inline Window* impl_from_Window(IAccessible *iface)
37 {
38 return CONTAINING_RECORD(iface, Window, IAccessible_iface);
39 }
40
Window_QueryInterface(IAccessible * iface,REFIID riid,void ** ppv)41 static HRESULT WINAPI Window_QueryInterface(IAccessible *iface, REFIID riid, void **ppv)
42 {
43 Window *This = impl_from_Window(iface);
44
45 TRACE("(%p)->(%s %p)\n", This, debugstr_guid(riid), ppv);
46
47 if(IsEqualIID(riid, &IID_IAccessible) ||
48 IsEqualIID(riid, &IID_IDispatch) ||
49 IsEqualIID(riid, &IID_IUnknown)) {
50 *ppv = iface;
51 }else if(IsEqualIID(riid, &IID_IOleWindow)) {
52 *ppv = &This->IOleWindow_iface;
53 }else if(IsEqualIID(riid, &IID_IEnumVARIANT)) {
54 *ppv = &This->IEnumVARIANT_iface;
55 }else {
56 WARN("no interface: %s\n", debugstr_guid(riid));
57 *ppv = NULL;
58 return E_NOINTERFACE;
59 }
60
61 IAccessible_AddRef(iface);
62 return S_OK;
63 }
64
Window_AddRef(IAccessible * iface)65 static ULONG WINAPI Window_AddRef(IAccessible *iface)
66 {
67 Window *This = impl_from_Window(iface);
68 ULONG ref = InterlockedIncrement(&This->ref);
69
70 TRACE("(%p) ref = %u\n", This, ref);
71 return ref;
72 }
73
Window_Release(IAccessible * iface)74 static ULONG WINAPI Window_Release(IAccessible *iface)
75 {
76 Window *This = impl_from_Window(iface);
77 ULONG ref = InterlockedDecrement(&This->ref);
78
79 TRACE("(%p) ref = %u\n", This, ref);
80
81 if(!ref)
82 heap_free(This);
83 return ref;
84 }
85
Window_GetTypeInfoCount(IAccessible * iface,UINT * pctinfo)86 static HRESULT WINAPI Window_GetTypeInfoCount(IAccessible *iface, UINT *pctinfo)
87 {
88 Window *This = impl_from_Window(iface);
89 FIXME("(%p)->(%p)\n", This, pctinfo);
90 return E_NOTIMPL;
91 }
92
Window_GetTypeInfo(IAccessible * iface,UINT iTInfo,LCID lcid,ITypeInfo ** ppTInfo)93 static HRESULT WINAPI Window_GetTypeInfo(IAccessible *iface,
94 UINT iTInfo, LCID lcid, ITypeInfo **ppTInfo)
95 {
96 Window *This = impl_from_Window(iface);
97 FIXME("(%p)->(%u %x %p)\n", This, iTInfo, lcid, ppTInfo);
98 return E_NOTIMPL;
99 }
100
Window_GetIDsOfNames(IAccessible * iface,REFIID riid,LPOLESTR * rgszNames,UINT cNames,LCID lcid,DISPID * rgDispId)101 static HRESULT WINAPI Window_GetIDsOfNames(IAccessible *iface, REFIID riid,
102 LPOLESTR *rgszNames, UINT cNames, LCID lcid, DISPID *rgDispId)
103 {
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);
107 return E_NOTIMPL;
108 }
109
Window_Invoke(IAccessible * iface,DISPID dispIdMember,REFIID riid,LCID lcid,WORD wFlags,DISPPARAMS * pDispParams,VARIANT * pVarResult,EXCEPINFO * pExcepInfo,UINT * puArgErr)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)
113 {
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);
117 return E_NOTIMPL;
118 }
119
Window_get_accParent(IAccessible * iface,IDispatch ** ppdispParent)120 static HRESULT WINAPI Window_get_accParent(IAccessible *iface, IDispatch **ppdispParent)
121 {
122 Window *This = impl_from_Window(iface);
123 FIXME("(%p)->(%p)\n", This, ppdispParent);
124 return E_NOTIMPL;
125 }
126
Window_get_accChildCount(IAccessible * iface,LONG * pcountChildren)127 static HRESULT WINAPI Window_get_accChildCount(IAccessible *iface, LONG *pcountChildren)
128 {
129 Window *This = impl_from_Window(iface);
130 FIXME("(%p)->(%p)\n", This, pcountChildren);
131 return E_NOTIMPL;
132 }
133
Window_get_accChild(IAccessible * iface,VARIANT varChildID,IDispatch ** ppdispChild)134 static HRESULT WINAPI Window_get_accChild(IAccessible *iface,
135 VARIANT varChildID, IDispatch **ppdispChild)
136 {
137 Window *This = impl_from_Window(iface);
138 FIXME("(%p)->(%s %p)\n", This, debugstr_variant(&varChildID), ppdispChild);
139 return E_NOTIMPL;
140 }
141
Window_get_accName(IAccessible * iface,VARIANT varID,BSTR * pszName)142 static HRESULT WINAPI Window_get_accName(IAccessible *iface, VARIANT varID, BSTR *pszName)
143 {
144 Window *This = impl_from_Window(iface);
145 FIXME("(%p)->(%s %p)\n", This, debugstr_variant(&varID), pszName);
146 return E_NOTIMPL;
147 }
148
Window_get_accValue(IAccessible * iface,VARIANT varID,BSTR * pszValue)149 static HRESULT WINAPI Window_get_accValue(IAccessible *iface, VARIANT varID, BSTR *pszValue)
150 {
151 Window *This = impl_from_Window(iface);
152 FIXME("(%p)->(%s %p)\n", This, debugstr_variant(&varID), pszValue);
153 return E_NOTIMPL;
154 }
155
Window_get_accDescription(IAccessible * iface,VARIANT varID,BSTR * pszDescription)156 static HRESULT WINAPI Window_get_accDescription(IAccessible *iface,
157 VARIANT varID, BSTR *pszDescription)
158 {
159 Window *This = impl_from_Window(iface);
160 FIXME("(%p)->(%s %p)\n", This, debugstr_variant(&varID), pszDescription);
161 return E_NOTIMPL;
162 }
163
Window_get_accRole(IAccessible * iface,VARIANT varID,VARIANT * pvarRole)164 static HRESULT WINAPI Window_get_accRole(IAccessible *iface, VARIANT varID, VARIANT *pvarRole)
165 {
166 Window *This = impl_from_Window(iface);
167 FIXME("(%p)->(%s %p)\n", This, debugstr_variant(&varID), pvarRole);
168 return E_NOTIMPL;
169 }
170
Window_get_accState(IAccessible * iface,VARIANT varID,VARIANT * pvarState)171 static HRESULT WINAPI Window_get_accState(IAccessible *iface, VARIANT varID, VARIANT *pvarState)
172 {
173 Window *This = impl_from_Window(iface);
174 FIXME("(%p)->(%s %p)\n", This, debugstr_variant(&varID), pvarState);
175 return E_NOTIMPL;
176 }
177
Window_get_accHelp(IAccessible * iface,VARIANT varID,BSTR * pszHelp)178 static HRESULT WINAPI Window_get_accHelp(IAccessible *iface, VARIANT varID, BSTR *pszHelp)
179 {
180 Window *This = impl_from_Window(iface);
181 FIXME("(%p)->(%s %p)\n", This, debugstr_variant(&varID), pszHelp);
182 return E_NOTIMPL;
183 }
184
Window_get_accHelpTopic(IAccessible * iface,BSTR * pszHelpFile,VARIANT varID,LONG * pidTopic)185 static HRESULT WINAPI Window_get_accHelpTopic(IAccessible *iface,
186 BSTR *pszHelpFile, VARIANT varID, LONG *pidTopic)
187 {
188 Window *This = impl_from_Window(iface);
189 FIXME("(%p)->(%p %s %p)\n", This, pszHelpFile, debugstr_variant(&varID), pidTopic);
190 return E_NOTIMPL;
191 }
192
Window_get_accKeyboardShortcut(IAccessible * iface,VARIANT varID,BSTR * pszKeyboardShortcut)193 static HRESULT WINAPI Window_get_accKeyboardShortcut(IAccessible *iface,
194 VARIANT varID, BSTR *pszKeyboardShortcut)
195 {
196 Window *This = impl_from_Window(iface);
197 FIXME("(%p)->(%s %p)\n", This, debugstr_variant(&varID), pszKeyboardShortcut);
198 return E_NOTIMPL;
199 }
200
Window_get_accFocus(IAccessible * iface,VARIANT * pvarID)201 static HRESULT WINAPI Window_get_accFocus(IAccessible *iface, VARIANT *pvarID)
202 {
203 Window *This = impl_from_Window(iface);
204 FIXME("(%p)->(%p)\n", This, pvarID);
205 return E_NOTIMPL;
206 }
207
Window_get_accSelection(IAccessible * iface,VARIANT * pvarID)208 static HRESULT WINAPI Window_get_accSelection(IAccessible *iface, VARIANT *pvarID)
209 {
210 Window *This = impl_from_Window(iface);
211 FIXME("(%p)->(%p)\n", This, pvarID);
212 return E_NOTIMPL;
213 }
214
Window_get_accDefaultAction(IAccessible * iface,VARIANT varID,BSTR * pszDefaultAction)215 static HRESULT WINAPI Window_get_accDefaultAction(IAccessible *iface,
216 VARIANT varID, BSTR *pszDefaultAction)
217 {
218 Window *This = impl_from_Window(iface);
219 FIXME("(%p)->(%s %p)\n", This, debugstr_variant(&varID), pszDefaultAction);
220 return E_NOTIMPL;
221 }
222
Window_accSelect(IAccessible * iface,LONG flagsSelect,VARIANT varID)223 static HRESULT WINAPI Window_accSelect(IAccessible *iface, LONG flagsSelect, VARIANT varID)
224 {
225 Window *This = impl_from_Window(iface);
226 FIXME("(%p)->(%x %s)\n", This, flagsSelect, debugstr_variant(&varID));
227 return E_NOTIMPL;
228 }
229
Window_accLocation(IAccessible * iface,LONG * pxLeft,LONG * pyTop,LONG * pcxWidth,LONG * pcyHeight,VARIANT varID)230 static HRESULT WINAPI Window_accLocation(IAccessible *iface, LONG *pxLeft,
231 LONG *pyTop, LONG *pcxWidth, LONG *pcyHeight, VARIANT varID)
232 {
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));
236 return E_NOTIMPL;
237 }
238
Window_accNavigate(IAccessible * iface,LONG navDir,VARIANT varStart,VARIANT * pvarEnd)239 static HRESULT WINAPI Window_accNavigate(IAccessible *iface,
240 LONG navDir, VARIANT varStart, VARIANT *pvarEnd)
241 {
242 Window *This = impl_from_Window(iface);
243 FIXME("(%p)->(%d %s %p)\n", This, navDir, debugstr_variant(&varStart), pvarEnd);
244 return E_NOTIMPL;
245 }
246
Window_accHitTest(IAccessible * iface,LONG xLeft,LONG yTop,VARIANT * pvarID)247 static HRESULT WINAPI Window_accHitTest(IAccessible *iface,
248 LONG xLeft, LONG yTop, VARIANT *pvarID)
249 {
250 Window *This = impl_from_Window(iface);
251 FIXME("(%p)->(%d %d %p)\n", This, xLeft, yTop, pvarID);
252 return E_NOTIMPL;
253 }
254
Window_accDoDefaultAction(IAccessible * iface,VARIANT varID)255 static HRESULT WINAPI Window_accDoDefaultAction(IAccessible *iface, VARIANT varID)
256 {
257 Window *This = impl_from_Window(iface);
258 FIXME("(%p)->(%s)\n", This, debugstr_variant(&varID));
259 return E_NOTIMPL;
260 }
261
Window_put_accName(IAccessible * iface,VARIANT varID,BSTR pszName)262 static HRESULT WINAPI Window_put_accName(IAccessible *iface, VARIANT varID, BSTR pszName)
263 {
264 Window *This = impl_from_Window(iface);
265 FIXME("(%p)->(%s %s)\n", This, debugstr_variant(&varID), debugstr_w(pszName));
266 return E_NOTIMPL;
267 }
268
Window_put_accValue(IAccessible * iface,VARIANT varID,BSTR pszValue)269 static HRESULT WINAPI Window_put_accValue(IAccessible *iface, VARIANT varID, BSTR pszValue)
270 {
271 Window *This = impl_from_Window(iface);
272 FIXME("(%p)->(%s %s)\n", This, debugstr_variant(&varID), debugstr_w(pszValue));
273 return E_NOTIMPL;
274 }
275
276 static const IAccessibleVtbl WindowVtbl = {
277 Window_QueryInterface,
278 Window_AddRef,
279 Window_Release,
280 Window_GetTypeInfoCount,
281 Window_GetTypeInfo,
282 Window_GetIDsOfNames,
283 Window_Invoke,
284 Window_get_accParent,
285 Window_get_accChildCount,
286 Window_get_accChild,
287 Window_get_accName,
288 Window_get_accValue,
289 Window_get_accDescription,
290 Window_get_accRole,
291 Window_get_accState,
292 Window_get_accHelp,
293 Window_get_accHelpTopic,
294 Window_get_accKeyboardShortcut,
295 Window_get_accFocus,
296 Window_get_accSelection,
297 Window_get_accDefaultAction,
298 Window_accSelect,
299 Window_accLocation,
300 Window_accNavigate,
301 Window_accHitTest,
302 Window_accDoDefaultAction,
303 Window_put_accName,
304 Window_put_accValue
305 };
306
impl_from_Window_OleWindow(IOleWindow * iface)307 static inline Window* impl_from_Window_OleWindow(IOleWindow *iface)
308 {
309 return CONTAINING_RECORD(iface, Window, IOleWindow_iface);
310 }
311
Window_OleWindow_QueryInterface(IOleWindow * iface,REFIID riid,void ** ppv)312 static HRESULT WINAPI Window_OleWindow_QueryInterface(IOleWindow *iface, REFIID riid, void **ppv)
313 {
314 Window *This = impl_from_Window_OleWindow(iface);
315 return IAccessible_QueryInterface(&This->IAccessible_iface, riid, ppv);
316 }
317
Window_OleWindow_AddRef(IOleWindow * iface)318 static ULONG WINAPI Window_OleWindow_AddRef(IOleWindow *iface)
319 {
320 Window *This = impl_from_Window_OleWindow(iface);
321 return IAccessible_AddRef(&This->IAccessible_iface);
322 }
323
Window_OleWindow_Release(IOleWindow * iface)324 static ULONG WINAPI Window_OleWindow_Release(IOleWindow *iface)
325 {
326 Window *This = impl_from_Window_OleWindow(iface);
327 return IAccessible_Release(&This->IAccessible_iface);
328 }
329
Window_OleWindow_GetWindow(IOleWindow * iface,HWND * phwnd)330 static HRESULT WINAPI Window_OleWindow_GetWindow(IOleWindow *iface, HWND *phwnd)
331 {
332 Window *This = impl_from_Window_OleWindow(iface);
333 FIXME("(%p)->(%p)\n", This, phwnd);
334 return E_NOTIMPL;
335 }
336
Window_OleWindow_ContextSensitiveHelp(IOleWindow * iface,BOOL fEnterMode)337 static HRESULT WINAPI Window_OleWindow_ContextSensitiveHelp(IOleWindow *iface, BOOL fEnterMode)
338 {
339 Window *This = impl_from_Window_OleWindow(iface);
340 FIXME("(%p)->(%x)\n", This, fEnterMode);
341 return E_NOTIMPL;
342 }
343
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
350 };
351
impl_from_Window_EnumVARIANT(IEnumVARIANT * iface)352 static inline Window* impl_from_Window_EnumVARIANT(IEnumVARIANT *iface)
353 {
354 return CONTAINING_RECORD(iface, Window, IEnumVARIANT_iface);
355 }
356
Window_EnumVARIANT_QueryInterface(IEnumVARIANT * iface,REFIID riid,void ** ppv)357 static HRESULT WINAPI Window_EnumVARIANT_QueryInterface(IEnumVARIANT *iface, REFIID riid, void **ppv)
358 {
359 Window *This = impl_from_Window_EnumVARIANT(iface);
360 return IAccessible_QueryInterface(&This->IAccessible_iface, riid, ppv);
361 }
362
Window_EnumVARIANT_AddRef(IEnumVARIANT * iface)363 static ULONG WINAPI Window_EnumVARIANT_AddRef(IEnumVARIANT *iface)
364 {
365 Window *This = impl_from_Window_EnumVARIANT(iface);
366 return IAccessible_AddRef(&This->IAccessible_iface);
367 }
368
Window_EnumVARIANT_Release(IEnumVARIANT * iface)369 static ULONG WINAPI Window_EnumVARIANT_Release(IEnumVARIANT *iface)
370 {
371 Window *This = impl_from_Window_EnumVARIANT(iface);
372 return IAccessible_Release(&This->IAccessible_iface);
373 }
374
Window_EnumVARIANT_Next(IEnumVARIANT * iface,ULONG celt,VARIANT * rgVar,ULONG * pCeltFetched)375 static HRESULT WINAPI Window_EnumVARIANT_Next(IEnumVARIANT *iface,
376 ULONG celt, VARIANT *rgVar, ULONG *pCeltFetched)
377 {
378 Window *This = impl_from_Window_EnumVARIANT(iface);
379 FIXME("(%p)->(%u %p %p)\n", This, celt, rgVar, pCeltFetched);
380 return E_NOTIMPL;
381 }
382
Window_EnumVARIANT_Skip(IEnumVARIANT * iface,ULONG celt)383 static HRESULT WINAPI Window_EnumVARIANT_Skip(IEnumVARIANT *iface, ULONG celt)
384 {
385 Window *This = impl_from_Window_EnumVARIANT(iface);
386 FIXME("(%p)->(%u)\n", This, celt);
387 return E_NOTIMPL;
388 }
389
Window_EnumVARIANT_Reset(IEnumVARIANT * iface)390 static HRESULT WINAPI Window_EnumVARIANT_Reset(IEnumVARIANT *iface)
391 {
392 Window *This = impl_from_Window_EnumVARIANT(iface);
393 FIXME("(%p)\n", This);
394 return E_NOTIMPL;
395 }
396
Window_EnumVARIANT_Clone(IEnumVARIANT * iface,IEnumVARIANT ** ppEnum)397 static HRESULT WINAPI Window_EnumVARIANT_Clone(IEnumVARIANT *iface, IEnumVARIANT **ppEnum)
398 {
399 Window *This = impl_from_Window_EnumVARIANT(iface);
400 FIXME("(%p)->(%p)\n", This, ppEnum);
401 return E_NOTIMPL;
402 }
403
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
412 };
413
create_window_object(HWND hwnd,const IID * iid,void ** obj)414 HRESULT create_window_object(HWND hwnd, const IID *iid, void **obj)
415 {
416 Window *window;
417 HRESULT hres;
418
419 if(!IsWindow(hwnd))
420 return E_FAIL;
421
422 window = heap_alloc_zero(sizeof(Window));
423 if(!window)
424 return E_OUTOFMEMORY;
425
426 window->IAccessible_iface.lpVtbl = &WindowVtbl;
427 window->IOleWindow_iface.lpVtbl = &WindowOleWindowVtbl;
428 window->IEnumVARIANT_iface.lpVtbl = &WindowEnumVARIANTVtbl;
429 window->ref = 1;
430
431 hres = IAccessible_QueryInterface(&window->IAccessible_iface, iid, obj);
432 IAccessible_Release(&window->IAccessible_iface);
433 return hres;
434 }
435