ReactOS  0.4.13-dev-563-g0561610
events.c
Go to the documentation of this file.
1 /*
2  * Implementation of event-related interfaces for WebBrowser control:
3  *
4  * - IConnectionPointContainer
5  * - IConnectionPoint
6  *
7  * Copyright 2001 John R. Sheets (for CodeWeavers)
8  * Copyright 2006 Jacek Caban for CodeWeavers
9  *
10  * This library is free software; you can redistribute it and/or
11  * modify it under the terms of the GNU Lesser General Public
12  * License as published by the Free Software Foundation; either
13  * version 2.1 of the License, or (at your option) any later version.
14  *
15  * This library is distributed in the hope that it will be useful,
16  * but WITHOUT ANY WARRANTY; without even the implied warranty of
17  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
18  * Lesser General Public License for more details.
19  *
20  * You should have received a copy of the GNU Lesser General Public
21  * License along with this library; if not, write to the Free Software
22  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
23  */
24 
25 #include <string.h>
26 
27 #include "ieframe.h"
28 
29 #include "wine/debug.h"
30 
32 
35 
37 
40 
42 };
43 
44 /**********************************************************************
45  * Implement the IConnectionPointContainer interface
46  */
47 
49 {
50  return CONTAINING_RECORD(iface, ConnectionPointContainer, IConnectionPointContainer_iface);
51 }
52 
55 {
57  return IUnknown_QueryInterface(This->impl, riid, ppv);
58 }
59 
61 {
63  return IUnknown_AddRef(This->impl);
64 }
65 
67 {
69  return IUnknown_Release(This->impl);
70 }
71 
73  LPENUMCONNECTIONPOINTS *ppEnum)
74 {
76  FIXME("(%p)->(%p)\n", This, ppEnum);
77  return E_NOTIMPL;
78 }
79 
81  REFIID riid, LPCONNECTIONPOINT *ppCP)
82 {
84 
85  if(!ppCP) {
86  WARN("ppCP == NULL\n");
87  return E_POINTER;
88  }
89 
90  *ppCP = NULL;
91 
92  if(IsEqualGUID(&DIID_DWebBrowserEvents2, riid)) {
93  TRACE("(%p)->(DIID_DWebBrowserEvents2 %p)\n", This, ppCP);
94  *ppCP = &This->wbe2->IConnectionPoint_iface;
95  }else if(IsEqualGUID(&DIID_DWebBrowserEvents, riid)) {
96  TRACE("(%p)->(DIID_DWebBrowserEvents %p)\n", This, ppCP);
97  *ppCP = &This->wbe->IConnectionPoint_iface;
99  TRACE("(%p)->(IID_IPropertyNotifySink %p)\n", This, ppCP);
100  *ppCP = &This->pns->IConnectionPoint_iface;
101  }
102 
103  if(*ppCP) {
104  IConnectionPoint_AddRef(*ppCP);
105  return S_OK;
106  }
107 
108  WARN("Unsupported IID %s\n", debugstr_guid(riid));
109  return CONNECT_E_NOCONNECTION;
110 }
111 
112 static const IConnectionPointContainerVtbl ConnectionPointContainerVtbl =
113 {
119 };
120 
121 
122 /**********************************************************************
123  * Implement the IConnectionPoint interface
124  */
125 
127 {
128  return CONTAINING_RECORD(iface, ConnectionPoint, IConnectionPoint_iface);
129 }
130 
131 typedef struct {
133 
135 
139 
141 {
142  return CONTAINING_RECORD(iface, EnumConnections, IEnumConnections_iface);
143 }
144 
146 {
148 
149  if(IsEqualGUID(&IID_IUnknown, riid)) {
150  TRACE("(%p)->(IID_IUnknown %p)\n", This, ppv);
151  *ppv = &This->IEnumConnections_iface;
152  }else if(IsEqualGUID(&IID_IEnumConnections, riid)) {
153  TRACE("(%p)->(IID_IEnumConnections %p)\n", This, ppv);
154  *ppv = &This->IEnumConnections_iface;
155  }else {
156  WARN("Unsupported interface %s\n", debugstr_guid(riid));
157  *ppv = NULL;
158  return E_NOINTERFACE;
159  }
160 
161  IUnknown_AddRef((IUnknown*)*ppv);
162  return S_OK;
163 }
164 
166 {
169 
170  TRACE("(%p) ref=%d\n", This, ref);
171 
172  return ref;
173 }
174 
176 {
179 
180  TRACE("(%p) ref=%d\n", This, ref);
181 
182  if(!ref) {
183  IConnectionPoint_Release(&This->cp->IConnectionPoint_iface);
184  heap_free(This);
185  }
186 
187  return ref;
188 }
189 
190 static HRESULT WINAPI EnumConnections_Next(IEnumConnections *iface, ULONG cConnections, CONNECTDATA *pgcd, ULONG *pcFetched)
191 {
193  ULONG cnt = 0;
194 
195  TRACE("(%p)->(%u %p %p)\n", This, cConnections, pgcd, pcFetched);
196 
197  while(cConnections--) {
198  while(This->iter < This->cp->sinks_size && !This->cp->sinks[This->iter])
199  This->iter++;
200  if(This->iter == This->cp->sinks_size)
201  break;
202 
203  pgcd[cnt].pUnk = (IUnknown*)This->cp->sinks[This->iter];
204  pgcd[cnt].dwCookie = cnt+1;
205  This->iter++;
206  cnt++;
207  }
208 
209  if(pcFetched)
210  *pcFetched = cnt;
211  return cnt ? S_OK : S_FALSE;
212 }
213 
215 {
217  FIXME("(%p)->(%u)\n", This, cConnections);
218  return E_NOTIMPL;
219 }
220 
222 {
224  FIXME("(%p)\n", This);
225  return E_NOTIMPL;
226 }
227 
229 {
231  FIXME("(%p)->(%p)\n", This, ppEnum);
232  return E_NOTIMPL;
233 }
234 
235 static const IEnumConnectionsVtbl EnumConnectionsVtbl = {
243 };
244 
246  REFIID riid, LPVOID *ppv)
247 {
249 
250  *ppv = NULL;
251 
252  if(IsEqualGUID(&IID_IUnknown, riid)) {
253  TRACE("(%p)->(IID_IUnknown %p)\n", This, ppv);
254  *ppv = &This->IConnectionPoint_iface;
255  }else if(IsEqualGUID(&IID_IConnectionPoint, riid)) {
256  TRACE("(%p)->(IID_IConnectionPoint %p)\n", This, ppv);
257  *ppv = &This->IConnectionPoint_iface;
258  }
259 
260  if(*ppv) {
261  IConnectionPointContainer_AddRef(This->container);
262  return S_OK;
263  }
264 
265  WARN("Unsupported interface %s\n", debugstr_guid(riid));
266  return E_NOINTERFACE;
267 }
268 
270 {
272  return IConnectionPointContainer_AddRef(This->container);
273 }
274 
276 {
278  return IConnectionPointContainer_Release(This->container);
279 }
280 
282 {
284 
285  TRACE("(%p)->(%p)\n", This, pIID);
286 
287  *pIID = This->iid;
288  return S_OK;
289 }
290 
293 {
295 
296  TRACE("(%p)->(%p)\n", This, ppCPC);
297 
298  *ppCPC = This->container;
299  IConnectionPointContainer_AddRef(This->container);
300  return S_OK;
301 }
302 
304  DWORD *pdwCookie)
305 {
307  IDispatch *disp;
308  DWORD i;
309  HRESULT hres;
310 
311  TRACE("(%p)->(%p %p)\n", This, pUnkSink, pdwCookie);
312 
313  hres = IUnknown_QueryInterface(pUnkSink, &This->iid, (void**)&disp);
314  if(FAILED(hres)) {
315  hres = IUnknown_QueryInterface(pUnkSink, &IID_IDispatch, (void**)&disp);
316  if(FAILED(hres))
318  }
319 
320  if(This->sinks) {
321  for(i=0; i<This->sinks_size; i++) {
322  if(!This->sinks[i])
323  break;
324  }
325 
326  if(i == This->sinks_size)
327  This->sinks = heap_realloc(This->sinks,
328  (++This->sinks_size)*sizeof(*This->sinks));
329  }else {
330  This->sinks = heap_alloc(sizeof(*This->sinks));
331  This->sinks_size = 1;
332  i = 0;
333  }
334 
335  This->sinks[i] = disp;
336  *pdwCookie = i+1;
337 
338  return S_OK;
339 }
340 
342 {
344 
345  TRACE("(%p)->(%d)\n", This, dwCookie);
346 
347  if(!dwCookie || dwCookie > This->sinks_size || !This->sinks[dwCookie-1])
348  return CONNECT_E_NOCONNECTION;
349 
350  IDispatch_Release(This->sinks[dwCookie-1]);
351  This->sinks[dwCookie-1] = NULL;
352 
353  return S_OK;
354 }
355 
357  IEnumConnections **ppEnum)
358 {
361 
362  TRACE("(%p)->(%p)\n", This, ppEnum);
363 
364  ret = heap_alloc(sizeof(*ret));
365  if(!ret)
366  return E_OUTOFMEMORY;
367 
368  ret->IEnumConnections_iface.lpVtbl = &EnumConnectionsVtbl;
369  ret->ref = 1;
370  ret->iter = 0;
371 
372  IConnectionPoint_AddRef(&This->IConnectionPoint_iface);
373  ret->cp = This;
374 
375  *ppEnum = &ret->IEnumConnections_iface;
376  return S_OK;
377 }
378 
379 static const IConnectionPointVtbl ConnectionPointVtbl =
380 {
389 };
390 
391 void call_sink(ConnectionPoint *This, DISPID dispid, DISPPARAMS *dispparams)
392 {
393  DWORD i;
394 
395  for(i=0; i<This->sinks_size; i++) {
396  if(This->sinks[i])
397  IDispatch_Invoke(This->sinks[i], dispid, &IID_NULL, LOCALE_SYSTEM_DEFAULT,
398  DISPATCH_METHOD, dispparams, NULL, NULL, NULL);
399  }
400 }
401 
404 {
406 
407  ret->IConnectionPoint_iface.lpVtbl = &ConnectionPointVtbl;
408 
409  ret->sinks = NULL;
410  ret->sinks_size = 0;
411  ret->container = container;
412 
413  ret->iid = *riid;
414 
415  *cp = ret;
416 }
417 
419 {
420  DWORD i;
421 
422  for(i=0; i<This->sinks_size; i++) {
423  if(This->sinks[i])
424  IDispatch_Release(This->sinks[i]);
425  }
426 
427  heap_free(This->sinks);
428  heap_free(This);
429 }
430 
432 {
433  This->IConnectionPointContainer_iface.lpVtbl = &ConnectionPointContainerVtbl;
434 
435  ConnectionPoint_Create(&DIID_DWebBrowserEvents2, &This->wbe2, &This->IConnectionPointContainer_iface);
436  ConnectionPoint_Create(&DIID_DWebBrowserEvents, &This->wbe, &This->IConnectionPointContainer_iface);
437  ConnectionPoint_Create(&IID_IPropertyNotifySink, &This->pns, &This->IConnectionPointContainer_iface);
438 
439  This->impl = impl;
440 }
441 
443 {
447 }
disp
Definition: i386-dis.c:3181
IConnectionPointContainer * container
Definition: events.c:36
#define REFIID
Definition: guiddef.h:113
static const IConnectionPointVtbl ConnectionPointVtbl
Definition: events.c:379
#define E_NOINTERFACE
Definition: winerror.h:2364
static const IConnectionPointContainerVtbl ConnectionPointContainerVtbl
Definition: events.c:112
#define CONNECT_E_CANNOTCONNECT
Definition: olectl.h:253
static void ConnectionPoint_Create(REFIID riid, ConnectionPoint **cp, IConnectionPointContainer *container)
Definition: events.c:402
IConnectionPoint IConnectionPoint_iface
Definition: events.c:34
REFIID riid
Definition: precomp.h:44
#define WARN(fmt,...)
Definition: debug.h:111
#define CONNECT_E_NOCONNECTION
Definition: olectl.h:251
REFIID LPVOID * ppv
Definition: atlbase.h:39
static HRESULT WINAPI EnumConnections_Skip(IEnumConnections *iface, ULONG cConnections)
Definition: events.c:214
static HRESULT WINAPI ConnectionPoint_GetConnectionPointContainer(IConnectionPoint *iface, IConnectionPointContainer **ppCPC)
Definition: events.c:291
const GUID IID_IEnumConnections
Definition: send.c:47
static void * heap_realloc(void *mem, size_t len)
Definition: appwiz.h:70
static void * heap_alloc(size_t len)
Definition: appwiz.h:65
DWORD iter
Definition: events.c:137
#define DISPATCH_METHOD
Definition: oleauto.h:1006
struct container container
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
Definition: glfuncs.h:248
#define E_OUTOFMEMORY
Definition: ddrawi.h:100
long LONG
Definition: pedump.c:60
void call_sink(ConnectionPoint *This, DISPID dispid, DISPPARAMS *dispparams)
Definition: events.c:391
GLenum GLint ref
Definition: glext.h:6028
#define FIXME(fmt,...)
Definition: debug.h:110
#define S_FALSE
Definition: winerror.h:2357
IDispatch ** sinks
Definition: events.c:38
smooth NULL
Definition: ftsmooth.c:416
IEnumConnections IEnumConnections_iface
Definition: events.c:132
static HRESULT WINAPI EnumConnections_Next(IEnumConnections *iface, ULONG cConnections, CONNECTDATA *pgcd, ULONG *pcFetched)
Definition: events.c:190
static const IEnumConnectionsVtbl EnumConnectionsVtbl
Definition: events.c:235
static HRESULT WINAPI ConnectionPoint_Advise(IConnectionPoint *iface, IUnknown *pUnkSink, DWORD *pdwCookie)
Definition: events.c:303
#define debugstr_guid
Definition: kernel32.h:35
PFLT_MESSAGE_WAITER_QUEUE CONTAINING_RECORD(Csq, DEVICE_EXTENSION, IrpQueue)) -> WaiterQ.mLock) _IRQL_raises_(DISPATCH_LEVEL) VOID NTAPI FltpAcquireMessageWaiterLock(_In_ PIO_CSQ Csq, _Out_ PKIRQL Irql)
Definition: Messaging.c:560
static HRESULT WINAPI EnumConnections_Reset(IEnumConnections *iface)
Definition: events.c:221
void ConnectionPointContainer_Init(ConnectionPointContainer *This, IUnknown *impl)
Definition: events.c:431
static HRESULT WINAPI ConnectionPoint_EnumConnections(IConnectionPoint *iface, IEnumConnections **ppEnum)
Definition: events.c:356
static ULONG WINAPI ConnectionPoint_Release(IConnectionPoint *iface)
Definition: events.c:275
static HRESULT WINAPI EnumConnections_Clone(IEnumConnections *iface, IEnumConnections **ppEnum)
Definition: events.c:228
#define TRACE(s)
Definition: solgame.cpp:4
HRESULT hres
Definition: protocol.c:465
static ULONG WINAPI ConnectionPoint_AddRef(IConnectionPoint *iface)
Definition: events.c:269
DWORD sinks_size
Definition: events.c:39
LONG HRESULT
Definition: typedefs.h:77
const GUID IID_IUnknown
static ConnectionPointContainer * impl_from_IConnectionPointContainer(IConnectionPointContainer *iface)
Definition: events.c:48
#define WINAPI
Definition: msvc.h:8
#define LOCALE_SYSTEM_DEFAULT
unsigned long DWORD
Definition: ntddk_ex.h:95
static ULONG WINAPI EnumConnections_AddRef(IEnumConnections *iface)
Definition: events.c:165
const GUID IID_IDispatch
int ret
#define IID_NULL
Definition: guiddef.h:93
#define InterlockedDecrement
Definition: armddk.h:52
ConnectionPoint * cp
Definition: events.c:136
static ULONG WINAPI ConnectionPointContainer_AddRef(IConnectionPointContainer *iface)
Definition: events.c:60
WINE_DEFAULT_DEBUG_CHANNEL(ieframe)
const GUID IID_IConnectionPoint
static VARIANTARG static DISPID
Definition: ordinal.c:49
#define S_OK
Definition: intsafe.h:59
#define InterlockedIncrement
Definition: armddk.h:53
static IEnumConnections EnumConnections
Definition: htmldoc.c:4170
static void ConnectionPoint_Destroy(ConnectionPoint *This)
Definition: events.c:418
static HRESULT WINAPI EnumConnections_QueryInterface(IEnumConnections *iface, REFIID riid, void **ppv)
Definition: events.c:145
#define E_NOTIMPL
Definition: ddrawi.h:99
const GUID IID_IPropertyNotifySink
BOOL WINAPI IsEqualGUID(REFGUID rguid1, REFGUID rguid2)
Definition: compobj.c:4021
static HRESULT WINAPI ConnectionPoint_GetConnectionInterface(IConnectionPoint *iface, IID *pIID)
Definition: events.c:281
static HRESULT WINAPI ConnectionPointContainer_FindConnectionPoint(IConnectionPointContainer *iface, REFIID riid, LPCONNECTIONPOINT *ppCP)
Definition: events.c:80
static HRESULT WINAPI ConnectionPointContainer_QueryInterface(IConnectionPointContainer *iface, REFIID riid, LPVOID *ppv)
Definition: events.c:53
POINT cp
Definition: magnifier.c:59
static ULONG WINAPI EnumConnections_Release(IEnumConnections *iface)
Definition: events.c:175
struct stdole::DISPPARAMS DISPPARAMS
unsigned int ULONG
Definition: retypes.h:1
void ConnectionPointContainer_Destroy(ConnectionPointContainer *This)
Definition: events.c:442
static ULONG WINAPI ConnectionPointContainer_Release(IConnectionPointContainer *iface)
Definition: events.c:66
static HRESULT WINAPI ConnectionPointContainer_EnumConnectionPoints(IConnectionPointContainer *iface, LPENUMCONNECTIONPOINTS *ppEnum)
Definition: events.c:72
#define E_POINTER
Definition: winerror.h:2365
static HRESULT WINAPI ConnectionPoint_QueryInterface(IConnectionPoint *iface, REFIID riid, LPVOID *ppv)
Definition: events.c:245
static ConnectionPoint * impl_from_IConnectionPoint(IConnectionPoint *iface)
Definition: events.c:126
static EnumConnections * impl_from_IEnumConnections(IEnumConnections *iface)
Definition: events.c:140
static BOOL heap_free(void *mem)
Definition: appwiz.h:75
static HRESULT WINAPI ConnectionPoint_Unadvise(IConnectionPoint *iface, DWORD dwCookie)
Definition: events.c:341