Merge from amd64-branch:
[reactos.git] / reactos / dll / win32 / mshtml / service.c
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 "config.h"
20
21 #include <stdarg.h>
22 #include <stdio.h>
23
24 #define COBJMACROS
25
26 #include "windef.h"
27 #include "winbase.h"
28 #include "winuser.h"
29 #include "ole2.h"
30
31 #include "wine/debug.h"
32
33 #include "mshtml_private.h"
34
35 WINE_DEFAULT_DEBUG_CHANNEL(mshtml);
36
37 typedef struct {
38 const IOleUndoManagerVtbl *lpOleUndoManagerVtbl;
39
40 LONG ref;
41 } UndoManager;
42
43 #define UNDOMGR(x) ((IOleUndoManager*) &(x)->lpOleUndoManagerVtbl)
44
45 #define UNDOMGR_THIS(iface) DEFINE_THIS(UndoManager, OleUndoManager, iface)
46
47 static HRESULT WINAPI OleUndoManager_QueryInterface(IOleUndoManager *iface, REFIID riid, void **ppv)
48 {
49 UndoManager *This = UNDOMGR_THIS(iface);
50
51 *ppv = NULL;
52
53 if(IsEqualGUID(riid, &IID_IUnknown)) {
54 TRACE("(%p)->(IID_IUnknown %p)\n", This, ppv);
55 *ppv = UNDOMGR(This);
56 }else if(IsEqualGUID(riid, &IID_IOleUndoManager)) {
57 TRACE("(%p)->(IID_IOleUndoManager %p)\n", This, ppv);
58 *ppv = UNDOMGR(This);
59 }
60
61
62 FIXME("(%p)->(%s %p)\n", This, debugstr_guid(riid), ppv);
63 return E_NOINTERFACE;
64 }
65
66 static ULONG WINAPI OleUndoManager_AddRef(IOleUndoManager *iface)
67 {
68 UndoManager *This = UNDOMGR_THIS(iface);
69 LONG ref = InterlockedIncrement(&This->ref);
70
71 TRACE("(%p) ref=%d\n", This, ref);
72
73 return ref;
74 }
75
76 static ULONG WINAPI OleUndoManager_Release(IOleUndoManager *iface)
77 {
78 UndoManager *This = UNDOMGR_THIS(iface);
79 LONG ref = InterlockedDecrement(&This->ref);
80
81 TRACE("(%p) ref=%d\n", This, ref);
82
83 if(!ref)
84 heap_free(This);
85
86 return ref;
87 }
88
89 static HRESULT WINAPI OleUndoManager_Open(IOleUndoManager *iface, IOleParentUndoUnit *pPUU)
90 {
91 UndoManager *This = UNDOMGR_THIS(iface);
92 FIXME("(%p)->(%p)\n", This, pPUU);
93 return E_NOTIMPL;
94 }
95
96 static HRESULT WINAPI OleUndoManager_Close(IOleUndoManager *iface, IOleParentUndoUnit *pPUU,
97 BOOL fCommit)
98 {
99 UndoManager *This = UNDOMGR_THIS(iface);
100 FIXME("(%p)->(%p %x)\n", This, pPUU, fCommit);
101 return E_NOTIMPL;
102 }
103
104 static HRESULT WINAPI OleUndoManager_Add(IOleUndoManager *iface, IOleUndoUnit *pUU)
105 {
106 UndoManager *This = UNDOMGR_THIS(iface);
107 FIXME("(%p)->(%p)\n", This, pUU);
108 return E_NOTIMPL;
109 }
110
111 static HRESULT WINAPI OleUndoManager_GetOpenParentState(IOleUndoManager *iface, DWORD *pdwState)
112 {
113 UndoManager *This = UNDOMGR_THIS(iface);
114 FIXME("(%p)->(%p)\n", This, pdwState);
115 return E_NOTIMPL;
116 }
117
118 static HRESULT WINAPI OleUndoManager_DiscardFrom(IOleUndoManager *iface, IOleUndoUnit *pUU)
119 {
120 UndoManager *This = UNDOMGR_THIS(iface);
121 FIXME("(%p)->(%p)\n", This, pUU);
122 return S_OK;
123 }
124
125 static HRESULT WINAPI OleUndoManager_UndoTo(IOleUndoManager *iface, IOleUndoUnit *pUU)
126 {
127 UndoManager *This = UNDOMGR_THIS(iface);
128 FIXME("(%p)->(%p)\n", This, pUU);
129 return E_NOTIMPL;
130 }
131
132 static HRESULT WINAPI OleUndoManager_RedoTo(IOleUndoManager *iface, IOleUndoUnit *pUU)
133 {
134 UndoManager *This = UNDOMGR_THIS(iface);
135 FIXME("(%p)->(%p)\n", This, pUU);
136 return E_NOTIMPL;
137 }
138
139 static HRESULT WINAPI OleUndoManager_EnumUndoable(IOleUndoManager *iface,
140 IEnumOleUndoUnits **ppEnum)
141 {
142 UndoManager *This = UNDOMGR_THIS(iface);
143 FIXME("(%p)->(%p)\n", This, ppEnum);
144 return E_NOTIMPL;
145 }
146
147 static HRESULT WINAPI OleUndoManager_EnumRedoable(IOleUndoManager *iface,
148 IEnumOleUndoUnits **ppEnum)
149 {
150 UndoManager *This = UNDOMGR_THIS(iface);
151 FIXME("(%p)->(%p)\n", This, ppEnum);
152 return E_NOTIMPL;
153 }
154
155 static HRESULT WINAPI OleUndoManager_GetLastUndoDescription(IOleUndoManager *iface, BSTR *pBstr)
156 {
157 UndoManager *This = UNDOMGR_THIS(iface);
158 FIXME("(%p)->(%p)\n", This, pBstr);
159 return E_NOTIMPL;
160 }
161
162 static HRESULT WINAPI OleUndoManager_GetLastRedoDescription(IOleUndoManager *iface, BSTR *pBstr)
163 {
164 UndoManager *This = UNDOMGR_THIS(iface);
165 FIXME("(%p)->(%p)\n", This, pBstr);
166 return E_NOTIMPL;
167 }
168
169 static HRESULT WINAPI OleUndoManager_Enable(IOleUndoManager *iface, BOOL fEnable)
170 {
171 UndoManager *This = UNDOMGR_THIS(iface);
172 FIXME("(%p)->(%x)\n", This, fEnable);
173 return E_NOTIMPL;
174 }
175
176 #undef UNDOMGR_THIS
177
178 static const IOleUndoManagerVtbl OleUndoManagerVtbl = {
179 OleUndoManager_QueryInterface,
180 OleUndoManager_AddRef,
181 OleUndoManager_Release,
182 OleUndoManager_Open,
183 OleUndoManager_Close,
184 OleUndoManager_Add,
185 OleUndoManager_GetOpenParentState,
186 OleUndoManager_DiscardFrom,
187 OleUndoManager_UndoTo,
188 OleUndoManager_RedoTo,
189 OleUndoManager_EnumUndoable,
190 OleUndoManager_EnumRedoable,
191 OleUndoManager_GetLastUndoDescription,
192 OleUndoManager_GetLastRedoDescription,
193 OleUndoManager_Enable
194 };
195
196 static IOleUndoManager *create_undomgr(void)
197 {
198 UndoManager *ret = heap_alloc(sizeof(UndoManager));
199
200 ret->lpOleUndoManagerVtbl = &OleUndoManagerVtbl;
201 ret->ref = 1;
202
203 return UNDOMGR(ret);
204 }
205
206 /**********************************************************
207 * IServiceProvider implementation
208 */
209
210 #define SERVPROV_THIS(iface) DEFINE_THIS(HTMLDocument, ServiceProvider, iface)
211
212 static HRESULT WINAPI ServiceProvider_QueryInterface(IServiceProvider *iface, REFIID riid, void **ppv)
213 {
214 HTMLDocument *This = SERVPROV_THIS(iface);
215 return IHTMLDocument2_QueryInterface(HTMLDOC(This), riid, ppv);
216 }
217
218 static ULONG WINAPI ServiceProvider_AddRef(IServiceProvider *iface)
219 {
220 HTMLDocument *This = SERVPROV_THIS(iface);
221 return IHTMLDocument2_AddRef(HTMLDOC(This));
222 }
223
224 static ULONG WINAPI ServiceProvider_Release(IServiceProvider *iface)
225 {
226 HTMLDocument *This = SERVPROV_THIS(iface);
227 return IHTMLDocument_Release(HTMLDOC(This));
228 }
229
230 static HRESULT WINAPI ServiceProvider_QueryService(IServiceProvider *iface, REFGUID guidService,
231 REFIID riid, void **ppv)
232 {
233 HTMLDocument *This = SERVPROV_THIS(iface);
234
235 if(IsEqualGUID(&CLSID_CMarkup, guidService)) {
236 FIXME("(%p)->(CLSID_CMarkup %s %p)\n", This, debugstr_guid(riid), ppv);
237 return E_NOINTERFACE;
238 }
239
240 if(IsEqualGUID(&IID_IOleUndoManager, riid)) {
241 TRACE("(%p)->(IID_IOleUndoManager %p)\n", This, ppv);
242
243 if(!This->doc_obj->undomgr)
244 This->doc_obj->undomgr = create_undomgr();
245
246 IOleUndoManager_AddRef(This->doc_obj->undomgr);
247 *ppv = This->doc_obj->undomgr;
248 return S_OK;
249 }
250
251 if(This->doc_obj->client) {
252 IServiceProvider *sp;
253 HRESULT hres;
254
255 hres = IOleClientSite_QueryInterface(This->doc_obj->client,
256 &IID_IServiceProvider, (void**)&sp);
257 if(SUCCEEDED(hres)) {
258 hres = IServiceProvider_QueryService(sp, guidService, riid, ppv);
259 IServiceProvider_Release(sp);
260
261 if(SUCCEEDED(hres))
262 return hres;
263 }
264 }
265
266 FIXME("(%p)->(%s %s %p)\n", This, debugstr_guid(guidService), debugstr_guid(riid), ppv);
267
268 return E_NOINTERFACE;
269 }
270
271 static const IServiceProviderVtbl ServiceProviderVtbl = {
272 ServiceProvider_QueryInterface,
273 ServiceProvider_AddRef,
274 ServiceProvider_Release,
275 ServiceProvider_QueryService
276 };
277
278 void HTMLDocument_Service_Init(HTMLDocument *This)
279 {
280 This->lpServiceProviderVtbl = &ServiceProviderVtbl;
281 }