2 * Copyright 2005 Jacek Caban
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
19 #include "mshtml_private.h"
22 IOleUndoManager IOleUndoManager_iface
;
27 static inline UndoManager
*impl_from_IOleUndoManager(IOleUndoManager
*iface
)
29 return CONTAINING_RECORD(iface
, UndoManager
, IOleUndoManager_iface
);
32 static HRESULT WINAPI
OleUndoManager_QueryInterface(IOleUndoManager
*iface
, REFIID riid
, void **ppv
)
34 UndoManager
*This
= impl_from_IOleUndoManager(iface
);
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
;
44 FIXME("(%p)->(%s %p)\n", This
, debugstr_guid(riid
), ppv
);
48 IUnknown_AddRef((IUnknown
*)*ppv
);
52 static ULONG WINAPI
OleUndoManager_AddRef(IOleUndoManager
*iface
)
54 UndoManager
*This
= impl_from_IOleUndoManager(iface
);
55 LONG ref
= InterlockedIncrement(&This
->ref
);
57 TRACE("(%p) ref=%d\n", This
, ref
);
62 static ULONG WINAPI
OleUndoManager_Release(IOleUndoManager
*iface
)
64 UndoManager
*This
= impl_from_IOleUndoManager(iface
);
65 LONG ref
= InterlockedDecrement(&This
->ref
);
67 TRACE("(%p) ref=%d\n", This
, ref
);
75 static HRESULT WINAPI
OleUndoManager_Open(IOleUndoManager
*iface
, IOleParentUndoUnit
*pPUU
)
77 UndoManager
*This
= impl_from_IOleUndoManager(iface
);
78 FIXME("(%p)->(%p)\n", This
, pPUU
);
82 static HRESULT WINAPI
OleUndoManager_Close(IOleUndoManager
*iface
, IOleParentUndoUnit
*pPUU
,
85 UndoManager
*This
= impl_from_IOleUndoManager(iface
);
86 FIXME("(%p)->(%p %x)\n", This
, pPUU
, fCommit
);
90 static HRESULT WINAPI
OleUndoManager_Add(IOleUndoManager
*iface
, IOleUndoUnit
*pUU
)
92 UndoManager
*This
= impl_from_IOleUndoManager(iface
);
93 FIXME("(%p)->(%p)\n", This
, pUU
);
97 static HRESULT WINAPI
OleUndoManager_GetOpenParentState(IOleUndoManager
*iface
, DWORD
*pdwState
)
99 UndoManager
*This
= impl_from_IOleUndoManager(iface
);
100 FIXME("(%p)->(%p)\n", This
, pdwState
);
104 static HRESULT WINAPI
OleUndoManager_DiscardFrom(IOleUndoManager
*iface
, IOleUndoUnit
*pUU
)
106 UndoManager
*This
= impl_from_IOleUndoManager(iface
);
107 FIXME("(%p)->(%p)\n", This
, pUU
);
111 static HRESULT WINAPI
OleUndoManager_UndoTo(IOleUndoManager
*iface
, IOleUndoUnit
*pUU
)
113 UndoManager
*This
= impl_from_IOleUndoManager(iface
);
114 FIXME("(%p)->(%p)\n", This
, pUU
);
118 static HRESULT WINAPI
OleUndoManager_RedoTo(IOleUndoManager
*iface
, IOleUndoUnit
*pUU
)
120 UndoManager
*This
= impl_from_IOleUndoManager(iface
);
121 FIXME("(%p)->(%p)\n", This
, pUU
);
125 static HRESULT WINAPI
OleUndoManager_EnumUndoable(IOleUndoManager
*iface
,
126 IEnumOleUndoUnits
**ppEnum
)
128 UndoManager
*This
= impl_from_IOleUndoManager(iface
);
129 FIXME("(%p)->(%p)\n", This
, ppEnum
);
133 static HRESULT WINAPI
OleUndoManager_EnumRedoable(IOleUndoManager
*iface
,
134 IEnumOleUndoUnits
**ppEnum
)
136 UndoManager
*This
= impl_from_IOleUndoManager(iface
);
137 FIXME("(%p)->(%p)\n", This
, ppEnum
);
141 static HRESULT WINAPI
OleUndoManager_GetLastUndoDescription(IOleUndoManager
*iface
, BSTR
*pBstr
)
143 UndoManager
*This
= impl_from_IOleUndoManager(iface
);
144 FIXME("(%p)->(%p)\n", This
, pBstr
);
148 static HRESULT WINAPI
OleUndoManager_GetLastRedoDescription(IOleUndoManager
*iface
, BSTR
*pBstr
)
150 UndoManager
*This
= impl_from_IOleUndoManager(iface
);
151 FIXME("(%p)->(%p)\n", This
, pBstr
);
155 static HRESULT WINAPI
OleUndoManager_Enable(IOleUndoManager
*iface
, BOOL fEnable
)
157 UndoManager
*This
= impl_from_IOleUndoManager(iface
);
158 FIXME("(%p)->(%x)\n", This
, fEnable
);
162 static const IOleUndoManagerVtbl OleUndoManagerVtbl
= {
163 OleUndoManager_QueryInterface
,
164 OleUndoManager_AddRef
,
165 OleUndoManager_Release
,
167 OleUndoManager_Close
,
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
180 static IOleUndoManager
*create_undomgr(void)
182 UndoManager
*ret
= heap_alloc(sizeof(UndoManager
));
184 ret
->IOleUndoManager_iface
.lpVtbl
= &OleUndoManagerVtbl
;
187 return &ret
->IOleUndoManager_iface
;
190 /**********************************************************
191 * IServiceProvider implementation
194 static inline HTMLDocument
*impl_from_IServiceProvider(IServiceProvider
*iface
)
196 return CONTAINING_RECORD(iface
, HTMLDocument
, IServiceProvider_iface
);
199 static HRESULT WINAPI
ServiceProvider_QueryInterface(IServiceProvider
*iface
, REFIID riid
, void **ppv
)
201 HTMLDocument
*This
= impl_from_IServiceProvider(iface
);
202 return htmldoc_query_interface(This
, riid
, ppv
);
205 static ULONG WINAPI
ServiceProvider_AddRef(IServiceProvider
*iface
)
207 HTMLDocument
*This
= impl_from_IServiceProvider(iface
);
208 return htmldoc_addref(This
);
211 static ULONG WINAPI
ServiceProvider_Release(IServiceProvider
*iface
)
213 HTMLDocument
*This
= impl_from_IServiceProvider(iface
);
214 return htmldoc_release(This
);
217 static HRESULT WINAPI
ServiceProvider_QueryService(IServiceProvider
*iface
, REFGUID guidService
,
218 REFIID riid
, void **ppv
)
220 HTMLDocument
*This
= impl_from_IServiceProvider(iface
);
222 if(IsEqualGUID(&CLSID_CMarkup
, guidService
)) {
223 FIXME("(%p)->(CLSID_CMarkup %s %p)\n", This
, debugstr_guid(riid
), ppv
);
224 return E_NOINTERFACE
;
227 if(IsEqualGUID(&SID_SOleUndoManager
, guidService
)) {
228 TRACE("SID_SOleUndoManager\n");
230 if(!This
->doc_obj
->undomgr
)
231 This
->doc_obj
->undomgr
= create_undomgr();
233 return IOleUndoManager_QueryInterface(This
->doc_obj
->undomgr
, riid
, ppv
);
236 if(IsEqualGUID(&SID_SContainerDispatch
, guidService
)) {
237 TRACE("SID_SContainerDispatch\n");
238 return IHTMLDocument2_QueryInterface(&This
->IHTMLDocument2_iface
, riid
, ppv
);
241 if(IsEqualGUID(&IID_IWindowForBindingUI
, guidService
)) {
242 TRACE("IID_IWindowForBindingUI\n");
243 return IWindowForBindingUI_QueryInterface(&This
->doc_obj
->IWindowForBindingUI_iface
, riid
, ppv
);
246 TRACE("(%p)->(%s %s %p)\n", This
, debugstr_guid(guidService
), debugstr_guid(riid
), ppv
);
248 if(This
->doc_obj
->client
) {
251 hres
= do_query_service((IUnknown
*)This
->doc_obj
->client
, guidService
, riid
, ppv
);
256 FIXME("unknown service %s\n", debugstr_guid(guidService
));
257 return E_NOINTERFACE
;
260 static const IServiceProviderVtbl ServiceProviderVtbl
= {
261 ServiceProvider_QueryInterface
,
262 ServiceProvider_AddRef
,
263 ServiceProvider_Release
,
264 ServiceProvider_QueryService
267 void HTMLDocument_Service_Init(HTMLDocument
*This
)
269 This
->IServiceProvider_iface
.lpVtbl
= &ServiceProviderVtbl
;