1 /*
2 * Copyright 2005 Jacek Caban
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 #include "mshtml_private.h"
20
21 typedef struct {
22 IOleUndoManager IOleUndoManager_iface;
23
24 LONG ref;
25 } UndoManager;
26
impl_from_IOleUndoManager(IOleUndoManager * iface)27 static inline UndoManager *impl_from_IOleUndoManager(IOleUndoManager *iface)
28 {
29 return CONTAINING_RECORD(iface, UndoManager, IOleUndoManager_iface);
30 }
31
OleUndoManager_QueryInterface(IOleUndoManager * iface,REFIID riid,void ** ppv)32 static HRESULT WINAPI OleUndoManager_QueryInterface(IOleUndoManager *iface, REFIID riid, void **ppv)
33 {
34 UndoManager *This = impl_from_IOleUndoManager(iface);
35
36 if(IsEqualGUID(riid, &IID_IUnknown)) {
37 TRACE("(%p)->(IID_IUnknown %p)\n", This, ppv);
38 *ppv = &This->IOleUndoManager_iface;
39 }else if(IsEqualGUID(riid, &IID_IOleUndoManager)) {
40 TRACE("(%p)->(IID_IOleUndoManager %p)\n", This, ppv);
41 *ppv = &This->IOleUndoManager_iface;
42 }else {
43 *ppv = NULL;
44 FIXME("(%p)->(%s %p)\n", This, debugstr_guid(riid), ppv);
45 return E_NOINTERFACE;
46 }
47
48 IUnknown_AddRef((IUnknown*)*ppv);
49 return S_OK;
50 }
51
OleUndoManager_AddRef(IOleUndoManager * iface)52 static ULONG WINAPI OleUndoManager_AddRef(IOleUndoManager *iface)
53 {
54 UndoManager *This = impl_from_IOleUndoManager(iface);
55 LONG ref = InterlockedIncrement(&This->ref);
56
57 TRACE("(%p) ref=%d\n", This, ref);
58
59 return ref;
60 }
61
OleUndoManager_Release(IOleUndoManager * iface)62 static ULONG WINAPI OleUndoManager_Release(IOleUndoManager *iface)
63 {
64 UndoManager *This = impl_from_IOleUndoManager(iface);
65 LONG ref = InterlockedDecrement(&This->ref);
66
67 TRACE("(%p) ref=%d\n", This, ref);
68
69 if(!ref)
70 heap_free(This);
71
72 return ref;
73 }
74
OleUndoManager_Open(IOleUndoManager * iface,IOleParentUndoUnit * pPUU)75 static HRESULT WINAPI OleUndoManager_Open(IOleUndoManager *iface, IOleParentUndoUnit *pPUU)
76 {
77 UndoManager *This = impl_from_IOleUndoManager(iface);
78 FIXME("(%p)->(%p)\n", This, pPUU);
79 return E_NOTIMPL;
80 }
81
OleUndoManager_Close(IOleUndoManager * iface,IOleParentUndoUnit * pPUU,BOOL fCommit)82 static HRESULT WINAPI OleUndoManager_Close(IOleUndoManager *iface, IOleParentUndoUnit *pPUU,
83 BOOL fCommit)
84 {
85 UndoManager *This = impl_from_IOleUndoManager(iface);
86 FIXME("(%p)->(%p %x)\n", This, pPUU, fCommit);
87 return E_NOTIMPL;
88 }
89
OleUndoManager_Add(IOleUndoManager * iface,IOleUndoUnit * pUU)90 static HRESULT WINAPI OleUndoManager_Add(IOleUndoManager *iface, IOleUndoUnit *pUU)
91 {
92 UndoManager *This = impl_from_IOleUndoManager(iface);
93 FIXME("(%p)->(%p)\n", This, pUU);
94 return E_NOTIMPL;
95 }
96
OleUndoManager_GetOpenParentState(IOleUndoManager * iface,DWORD * pdwState)97 static HRESULT WINAPI OleUndoManager_GetOpenParentState(IOleUndoManager *iface, DWORD *pdwState)
98 {
99 UndoManager *This = impl_from_IOleUndoManager(iface);
100 FIXME("(%p)->(%p)\n", This, pdwState);
101 return E_NOTIMPL;
102 }
103
OleUndoManager_DiscardFrom(IOleUndoManager * iface,IOleUndoUnit * pUU)104 static HRESULT WINAPI OleUndoManager_DiscardFrom(IOleUndoManager *iface, IOleUndoUnit *pUU)
105 {
106 UndoManager *This = impl_from_IOleUndoManager(iface);
107 FIXME("(%p)->(%p)\n", This, pUU);
108 return S_OK;
109 }
110
OleUndoManager_UndoTo(IOleUndoManager * iface,IOleUndoUnit * pUU)111 static HRESULT WINAPI OleUndoManager_UndoTo(IOleUndoManager *iface, IOleUndoUnit *pUU)
112 {
113 UndoManager *This = impl_from_IOleUndoManager(iface);
114 FIXME("(%p)->(%p)\n", This, pUU);
115 return E_NOTIMPL;
116 }
117
OleUndoManager_RedoTo(IOleUndoManager * iface,IOleUndoUnit * pUU)118 static HRESULT WINAPI OleUndoManager_RedoTo(IOleUndoManager *iface, IOleUndoUnit *pUU)
119 {
120 UndoManager *This = impl_from_IOleUndoManager(iface);
121 FIXME("(%p)->(%p)\n", This, pUU);
122 return E_NOTIMPL;
123 }
124
OleUndoManager_EnumUndoable(IOleUndoManager * iface,IEnumOleUndoUnits ** ppEnum)125 static HRESULT WINAPI OleUndoManager_EnumUndoable(IOleUndoManager *iface,
126 IEnumOleUndoUnits **ppEnum)
127 {
128 UndoManager *This = impl_from_IOleUndoManager(iface);
129 FIXME("(%p)->(%p)\n", This, ppEnum);
130 return E_NOTIMPL;
131 }
132
OleUndoManager_EnumRedoable(IOleUndoManager * iface,IEnumOleUndoUnits ** ppEnum)133 static HRESULT WINAPI OleUndoManager_EnumRedoable(IOleUndoManager *iface,
134 IEnumOleUndoUnits **ppEnum)
135 {
136 UndoManager *This = impl_from_IOleUndoManager(iface);
137 FIXME("(%p)->(%p)\n", This, ppEnum);
138 return E_NOTIMPL;
139 }
140
OleUndoManager_GetLastUndoDescription(IOleUndoManager * iface,BSTR * pBstr)141 static HRESULT WINAPI OleUndoManager_GetLastUndoDescription(IOleUndoManager *iface, BSTR *pBstr)
142 {
143 UndoManager *This = impl_from_IOleUndoManager(iface);
144 FIXME("(%p)->(%p)\n", This, pBstr);
145 return E_NOTIMPL;
146 }
147
OleUndoManager_GetLastRedoDescription(IOleUndoManager * iface,BSTR * pBstr)148 static HRESULT WINAPI OleUndoManager_GetLastRedoDescription(IOleUndoManager *iface, BSTR *pBstr)
149 {
150 UndoManager *This = impl_from_IOleUndoManager(iface);
151 FIXME("(%p)->(%p)\n", This, pBstr);
152 return E_NOTIMPL;
153 }
154
OleUndoManager_Enable(IOleUndoManager * iface,BOOL fEnable)155 static HRESULT WINAPI OleUndoManager_Enable(IOleUndoManager *iface, BOOL fEnable)
156 {
157 UndoManager *This = impl_from_IOleUndoManager(iface);
158 FIXME("(%p)->(%x)\n", This, fEnable);
159 return E_NOTIMPL;
160 }
161
162 static const IOleUndoManagerVtbl OleUndoManagerVtbl = {
163 OleUndoManager_QueryInterface,
164 OleUndoManager_AddRef,
165 OleUndoManager_Release,
166 OleUndoManager_Open,
167 OleUndoManager_Close,
168 OleUndoManager_Add,
169 OleUndoManager_GetOpenParentState,
170 OleUndoManager_DiscardFrom,
171 OleUndoManager_UndoTo,
172 OleUndoManager_RedoTo,
173 OleUndoManager_EnumUndoable,
174 OleUndoManager_EnumRedoable,
175 OleUndoManager_GetLastUndoDescription,
176 OleUndoManager_GetLastRedoDescription,
177 OleUndoManager_Enable
178 };
179
create_undomgr(void)180 static IOleUndoManager *create_undomgr(void)
181 {
182 UndoManager *ret = heap_alloc(sizeof(UndoManager));
183
184 if (!ret) return NULL;
185
186 ret->IOleUndoManager_iface.lpVtbl = &OleUndoManagerVtbl;
187 ret->ref = 1;
188
189 return &ret->IOleUndoManager_iface;
190 }
191
192 typedef struct {
193 IHTMLEditServices IHTMLEditServices_iface;
194 LONG ref;
195 } editsvcs;
196
impl_from_IHTMLEditServices(IHTMLEditServices * iface)197 static inline editsvcs *impl_from_IHTMLEditServices(IHTMLEditServices *iface)
198 {
199 return CONTAINING_RECORD(iface, editsvcs, IHTMLEditServices_iface);
200 }
201
editsvcs_QueryInterface(IHTMLEditServices * iface,REFIID riid,void ** ppv)202 static HRESULT WINAPI editsvcs_QueryInterface(IHTMLEditServices *iface, REFIID riid, void **ppv)
203 {
204 editsvcs *This = impl_from_IHTMLEditServices(iface);
205
206 TRACE("(%p)->(%s %p)\n", This, debugstr_mshtml_guid(riid), ppv);
207
208 if(IsEqualGUID(riid, &IID_IUnknown)) {
209 *ppv = &This->IHTMLEditServices_iface;
210 } else if(IsEqualGUID(riid, &IID_IHTMLEditServices)) {
211 *ppv = &This->IHTMLEditServices_iface;
212 } else {
213 *ppv = NULL;
214 FIXME("(%p)->(%s %p)\n", This, debugstr_guid(riid), ppv);
215 return E_NOINTERFACE;
216 }
217
218 IUnknown_AddRef((IUnknown*)*ppv);
219 return S_OK;
220 }
221
editsvcs_AddRef(IHTMLEditServices * iface)222 static ULONG WINAPI editsvcs_AddRef(IHTMLEditServices *iface)
223 {
224 editsvcs *This = impl_from_IHTMLEditServices(iface);
225 LONG ref = InterlockedIncrement(&This->ref);
226
227 TRACE("(%p) ref=%d\n", This, ref);
228 return ref;
229 }
230
editsvcs_Release(IHTMLEditServices * iface)231 static ULONG WINAPI editsvcs_Release(IHTMLEditServices *iface)
232 {
233 editsvcs *This = impl_from_IHTMLEditServices(iface);
234 LONG ref = InterlockedDecrement(&This->ref);
235
236 TRACE("(%p) ref=%d\n", This, ref);
237
238 if(!ref)
239 heap_free(This);
240
241 return ref;
242 }
243
editsvcs_AddDesigner(IHTMLEditServices * iface,IHTMLEditDesigner * pIDesigner)244 static HRESULT WINAPI editsvcs_AddDesigner(IHTMLEditServices *iface,
245 IHTMLEditDesigner *pIDesigner)
246 {
247 editsvcs *This = impl_from_IHTMLEditServices(iface);
248 FIXME("(%p)->(%p)\n", This, pIDesigner);
249 return E_NOTIMPL;
250 }
251
editsvcs_RemoveDesigner(IHTMLEditServices * iface,IHTMLEditDesigner * pIDesigner)252 static HRESULT WINAPI editsvcs_RemoveDesigner(IHTMLEditServices *iface,
253 IHTMLEditDesigner *pIDesigner)
254 {
255 editsvcs *This = impl_from_IHTMLEditServices(iface);
256 FIXME("(%p)->(%p)\n", This, pIDesigner);
257 return E_NOTIMPL;
258 }
259
editsvcs_GetSelectionServices(IHTMLEditServices * iface,IMarkupContainer * pIContainer,ISelectionServices ** ppSelSvc)260 static HRESULT WINAPI editsvcs_GetSelectionServices(IHTMLEditServices *iface,
261 IMarkupContainer *pIContainer, ISelectionServices **ppSelSvc)
262 {
263 editsvcs *This = impl_from_IHTMLEditServices(iface);
264 FIXME("(%p)->(%p,%p)\n", This, pIContainer, ppSelSvc);
265 return E_NOTIMPL;
266 }
267
editsvcs_MoveToSelectionAnchor(IHTMLEditServices * iface,IMarkupPointer * pIStartAnchor)268 static HRESULT WINAPI editsvcs_MoveToSelectionAnchor(IHTMLEditServices *iface,
269 IMarkupPointer *pIStartAnchor)
270 {
271 editsvcs *This = impl_from_IHTMLEditServices(iface);
272 FIXME("(%p)->(%p)\n", This, pIStartAnchor);
273 return E_NOTIMPL;
274 }
275
editsvcs_MoveToSelectionEnd(IHTMLEditServices * iface,IMarkupPointer * pIEndAnchor)276 static HRESULT WINAPI editsvcs_MoveToSelectionEnd(IHTMLEditServices *iface,
277 IMarkupPointer *pIEndAnchor)
278 {
279 editsvcs *This = impl_from_IHTMLEditServices(iface);
280 FIXME("(%p)->(%p)\n", This, pIEndAnchor);
281 return E_NOTIMPL;
282 }
283
editsvcs_SelectRange(IHTMLEditServices * iface,IMarkupPointer * pStart,IMarkupPointer * pEnd,SELECTION_TYPE eType)284 static HRESULT WINAPI editsvcs_SelectRange(IHTMLEditServices *iface,
285 IMarkupPointer *pStart, IMarkupPointer *pEnd, SELECTION_TYPE eType)
286 {
287 editsvcs *This = impl_from_IHTMLEditServices(iface);
288 FIXME("(%p)->(%p,%p,%#x)\n", This, pStart, pEnd, eType);
289 return E_NOTIMPL;
290 }
291
292 static const IHTMLEditServicesVtbl editsvcsVtbl = {
293 editsvcs_QueryInterface,
294 editsvcs_AddRef,
295 editsvcs_Release,
296 editsvcs_AddDesigner,
297 editsvcs_RemoveDesigner,
298 editsvcs_GetSelectionServices,
299 editsvcs_MoveToSelectionAnchor,
300 editsvcs_MoveToSelectionEnd,
301 editsvcs_SelectRange,
302 };
303
create_editsvcs(void)304 static IHTMLEditServices *create_editsvcs(void)
305 {
306 editsvcs *ret = heap_alloc(sizeof(*ret));
307
308 if (ret) {
309 ret->IHTMLEditServices_iface.lpVtbl = &editsvcsVtbl;
310 ret->ref = 1;
311 return &ret->IHTMLEditServices_iface;
312 }
313
314 return NULL;
315 }
316
317 /**********************************************************
318 * IServiceProvider implementation
319 */
320
impl_from_IServiceProvider(IServiceProvider * iface)321 static inline HTMLDocument *impl_from_IServiceProvider(IServiceProvider *iface)
322 {
323 return CONTAINING_RECORD(iface, HTMLDocument, IServiceProvider_iface);
324 }
325
ServiceProvider_QueryInterface(IServiceProvider * iface,REFIID riid,void ** ppv)326 static HRESULT WINAPI ServiceProvider_QueryInterface(IServiceProvider *iface, REFIID riid, void **ppv)
327 {
328 HTMLDocument *This = impl_from_IServiceProvider(iface);
329 return htmldoc_query_interface(This, riid, ppv);
330 }
331
ServiceProvider_AddRef(IServiceProvider * iface)332 static ULONG WINAPI ServiceProvider_AddRef(IServiceProvider *iface)
333 {
334 HTMLDocument *This = impl_from_IServiceProvider(iface);
335 return htmldoc_addref(This);
336 }
337
ServiceProvider_Release(IServiceProvider * iface)338 static ULONG WINAPI ServiceProvider_Release(IServiceProvider *iface)
339 {
340 HTMLDocument *This = impl_from_IServiceProvider(iface);
341 return htmldoc_release(This);
342 }
343
ServiceProvider_QueryService(IServiceProvider * iface,REFGUID guidService,REFIID riid,void ** ppv)344 static HRESULT WINAPI ServiceProvider_QueryService(IServiceProvider *iface, REFGUID guidService,
345 REFIID riid, void **ppv)
346 {
347 HTMLDocument *This = impl_from_IServiceProvider(iface);
348
349 if(IsEqualGUID(&CLSID_CMarkup, guidService)) {
350 FIXME("(%p)->(CLSID_CMarkup %s %p)\n", This, debugstr_guid(riid), ppv);
351 return E_NOINTERFACE;
352 }
353
354 if(IsEqualGUID(&SID_SOleUndoManager, guidService)) {
355 TRACE("SID_SOleUndoManager\n");
356
357 if(!This->doc_obj->undomgr)
358 This->doc_obj->undomgr = create_undomgr();
359
360 if (!This->doc_obj->undomgr)
361 return E_OUTOFMEMORY;
362
363 return IOleUndoManager_QueryInterface(This->doc_obj->undomgr, riid, ppv);
364 }
365
366 if(IsEqualGUID(&SID_SContainerDispatch, guidService)) {
367 TRACE("SID_SContainerDispatch\n");
368 return IHTMLDocument2_QueryInterface(&This->IHTMLDocument2_iface, riid, ppv);
369 }
370
371 if(IsEqualGUID(&IID_IWindowForBindingUI, guidService)) {
372 TRACE("IID_IWindowForBindingUI\n");
373 return IWindowForBindingUI_QueryInterface(&This->doc_obj->IWindowForBindingUI_iface, riid, ppv);
374 }
375
376 if(IsEqualGUID(&SID_SHTMLEditServices, guidService)) {
377 TRACE("SID_SHTMLEditServices\n");
378
379 if(!This->doc_obj->editsvcs)
380 This->doc_obj->editsvcs = create_editsvcs();
381
382 if (!This->doc_obj->editsvcs)
383 return E_OUTOFMEMORY;
384
385 return IHTMLEditServices_QueryInterface(This->doc_obj->editsvcs, riid, ppv);
386 }
387
388 TRACE("(%p)->(%s %s %p)\n", This, debugstr_guid(guidService), debugstr_guid(riid), ppv);
389
390 if(This->doc_obj->client) {
391 HRESULT hres;
392
393 hres = do_query_service((IUnknown*)This->doc_obj->client, guidService, riid, ppv);
394 if(SUCCEEDED(hres))
395 return hres;
396 }
397
398 FIXME("unknown service %s\n", debugstr_guid(guidService));
399 return E_NOINTERFACE;
400 }
401
402 static const IServiceProviderVtbl ServiceProviderVtbl = {
403 ServiceProvider_QueryInterface,
404 ServiceProvider_AddRef,
405 ServiceProvider_Release,
406 ServiceProvider_QueryService
407 };
408
HTMLDocument_Service_Init(HTMLDocument * This)409 void HTMLDocument_Service_Init(HTMLDocument *This)
410 {
411 This->IServiceProvider_iface.lpVtbl = &ServiceProviderVtbl;
412 }
413