[SHELL32] CDrivesFolder: Implement the eject and disconnect menu items. CORE-13841
[reactos.git] / dll / win32 / mshtml / ipwindow.c
1 /*
2 * Copyright 2010 Jacek 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 #include "mshtml_private.h"
20
21 typedef struct {
22 IOleInPlaceFrame IOleInPlaceFrame_iface;
23 LONG ref;
24 } InPlaceFrame;
25
26 static inline InPlaceFrame *impl_from_IOleInPlaceFrame(IOleInPlaceFrame *iface)
27 {
28 return CONTAINING_RECORD(iface, InPlaceFrame, IOleInPlaceFrame_iface);
29 }
30
31 static HRESULT WINAPI InPlaceFrame_QueryInterface(IOleInPlaceFrame *iface,
32 REFIID riid, void **ppv)
33 {
34 InPlaceFrame *This = impl_from_IOleInPlaceFrame(iface);
35
36 TRACE("(%p)->(%s %p)\n", This, debugstr_mshtml_guid(riid), ppv);
37
38 if(IsEqualGUID(&IID_IUnknown, riid)) {
39 *ppv = &This->IOleInPlaceFrame_iface;
40 }else if(IsEqualGUID(&IID_IOleWindow, riid)) {
41 *ppv = &This->IOleInPlaceFrame_iface;
42 }else if(IsEqualGUID(&IID_IOleInPlaceUIWindow, riid)) {
43 *ppv = &This->IOleInPlaceFrame_iface;
44 }else if(IsEqualGUID(&IID_IOleInPlaceFrame, riid)) {
45 *ppv = &This->IOleInPlaceFrame_iface;
46 }else {
47 WARN("Unsopported interface %s\n", debugstr_mshtml_guid(riid));
48 *ppv = NULL;
49 return E_NOINTERFACE;
50 }
51
52 IUnknown_AddRef((IUnknown*)*ppv);
53 return S_OK;
54 }
55
56 static ULONG WINAPI InPlaceFrame_AddRef(IOleInPlaceFrame *iface)
57 {
58 InPlaceFrame *This = impl_from_IOleInPlaceFrame(iface);
59 LONG ref = InterlockedIncrement(&This->ref);
60
61 TRACE("(%p) ref=%d\n", This, ref);
62
63 return ref;
64 }
65
66 static ULONG WINAPI InPlaceFrame_Release(IOleInPlaceFrame *iface)
67 {
68 InPlaceFrame *This = impl_from_IOleInPlaceFrame(iface);
69 LONG ref = InterlockedDecrement(&This->ref);
70
71 TRACE("(%p) ref=%d\n", This, ref);
72
73 if(!ref)
74 heap_free(This);
75
76 return ref;
77 }
78
79 static HRESULT WINAPI InPlaceFrame_GetWindow(IOleInPlaceFrame *iface, HWND *phwnd)
80 {
81 InPlaceFrame *This = impl_from_IOleInPlaceFrame(iface);
82 FIXME("(%p)->(%p)\n", This, phwnd);
83 return E_NOTIMPL;
84 }
85
86 static HRESULT WINAPI InPlaceFrame_ContextSensitiveHelp(IOleInPlaceFrame *iface,
87 BOOL fEnterMode)
88 {
89 InPlaceFrame *This = impl_from_IOleInPlaceFrame(iface);
90 FIXME("(%p)->(%x)\n", This, fEnterMode);
91 return E_NOTIMPL;
92 }
93
94 static HRESULT WINAPI InPlaceFrame_GetBorder(IOleInPlaceFrame *iface, LPRECT lprectBorder)
95 {
96 InPlaceFrame *This = impl_from_IOleInPlaceFrame(iface);
97 FIXME("(%p)->(%p)\n", This, lprectBorder);
98 return E_NOTIMPL;
99 }
100
101 static HRESULT WINAPI InPlaceFrame_RequestBorderSpace(IOleInPlaceFrame *iface,
102 LPCBORDERWIDTHS pborderwidths)
103 {
104 InPlaceFrame *This = impl_from_IOleInPlaceFrame(iface);
105 FIXME("(%p)->(%p)\n", This, pborderwidths);
106 return E_NOTIMPL;
107 }
108
109 static HRESULT WINAPI InPlaceFrame_SetBorderSpace(IOleInPlaceFrame *iface,
110 LPCBORDERWIDTHS pborderwidths)
111 {
112 InPlaceFrame *This = impl_from_IOleInPlaceFrame(iface);
113 FIXME("(%p)->(%p)\n", This, pborderwidths);
114 return E_NOTIMPL;
115 }
116
117 static HRESULT WINAPI InPlaceFrame_SetActiveObject(IOleInPlaceFrame *iface,
118 IOleInPlaceActiveObject *pActiveObject, LPCOLESTR pszObjName)
119 {
120 InPlaceFrame *This = impl_from_IOleInPlaceFrame(iface);
121 FIXME("(%p)->(%p %s)\n", This, pActiveObject, debugstr_w(pszObjName));
122 return E_NOTIMPL;
123 }
124
125 static HRESULT WINAPI InPlaceFrame_InsertMenus(IOleInPlaceFrame *iface, HMENU hmenuShared,
126 LPOLEMENUGROUPWIDTHS lpMenuWidths)
127 {
128 InPlaceFrame *This = impl_from_IOleInPlaceFrame(iface);
129 FIXME("(%p)->(%p %p)\n", This, hmenuShared, lpMenuWidths);
130 return E_NOTIMPL;
131 }
132
133 static HRESULT WINAPI InPlaceFrame_SetMenu(IOleInPlaceFrame *iface, HMENU hmenuShared,
134 HOLEMENU holemenu, HWND hwndActiveObject)
135 {
136 InPlaceFrame *This = impl_from_IOleInPlaceFrame(iface);
137 FIXME("(%p)->(%p %p %p)\n", This, hmenuShared, holemenu, hwndActiveObject);
138 return E_NOTIMPL;
139 }
140
141 static HRESULT WINAPI InPlaceFrame_RemoveMenus(IOleInPlaceFrame *iface, HMENU hmenuShared)
142 {
143 InPlaceFrame *This = impl_from_IOleInPlaceFrame(iface);
144 FIXME("(%p)->(%p)\n", This, hmenuShared);
145 return E_NOTIMPL;
146 }
147
148 static HRESULT WINAPI InPlaceFrame_SetStatusText(IOleInPlaceFrame *iface,
149 LPCOLESTR pszStatusText)
150 {
151 InPlaceFrame *This = impl_from_IOleInPlaceFrame(iface);
152 FIXME("(%p)->(%s)\n", This, debugstr_w(pszStatusText));
153 return E_NOTIMPL;
154 }
155
156 static HRESULT WINAPI InPlaceFrame_EnableModeless(IOleInPlaceFrame *iface, BOOL fEnable)
157 {
158 InPlaceFrame *This = impl_from_IOleInPlaceFrame(iface);
159 FIXME("(%p)->(%x)\n", This, fEnable);
160 return E_NOTIMPL;
161 }
162
163 static HRESULT WINAPI InPlaceFrame_TranslateAccelerator(IOleInPlaceFrame *iface, LPMSG lpmsg,
164 WORD wID)
165 {
166 InPlaceFrame *This = impl_from_IOleInPlaceFrame(iface);
167 FIXME("(%p)->(%p %d)\n", This, lpmsg, wID);
168 return E_NOTIMPL;
169 }
170
171 static const IOleInPlaceFrameVtbl OleInPlaceFrameVtbl = {
172 InPlaceFrame_QueryInterface,
173 InPlaceFrame_AddRef,
174 InPlaceFrame_Release,
175 InPlaceFrame_GetWindow,
176 InPlaceFrame_ContextSensitiveHelp,
177 InPlaceFrame_GetBorder,
178 InPlaceFrame_RequestBorderSpace,
179 InPlaceFrame_SetBorderSpace,
180 InPlaceFrame_SetActiveObject,
181 InPlaceFrame_InsertMenus,
182 InPlaceFrame_SetMenu,
183 InPlaceFrame_RemoveMenus,
184 InPlaceFrame_SetStatusText,
185 InPlaceFrame_EnableModeless,
186 InPlaceFrame_TranslateAccelerator
187 };
188
189 HRESULT create_ip_frame(IOleInPlaceFrame **ret)
190 {
191 InPlaceFrame *frame;
192
193 frame = heap_alloc_zero(sizeof(*frame));
194 if(!frame)
195 return E_OUTOFMEMORY;
196
197 frame->IOleInPlaceFrame_iface.lpVtbl = &OleInPlaceFrameVtbl;
198 frame->ref = 1;
199
200 *ret = &frame->IOleInPlaceFrame_iface;
201 return S_OK;
202 }
203
204 typedef struct {
205 IOleInPlaceUIWindow IOleInPlaceUIWindow_iface;
206 LONG ref;
207 } InPlaceUIWindow;
208
209 static inline InPlaceUIWindow *impl_from_IOleInPlaceUIWindow(IOleInPlaceUIWindow *iface)
210 {
211 return CONTAINING_RECORD(iface, InPlaceUIWindow, IOleInPlaceUIWindow_iface);
212 }
213
214 static HRESULT WINAPI InPlaceUIWindow_QueryInterface(IOleInPlaceUIWindow *iface, REFIID riid, void **ppv)
215 {
216 InPlaceUIWindow *This = impl_from_IOleInPlaceUIWindow(iface);
217
218 TRACE("(%p)->(%s %p)\n", This, debugstr_mshtml_guid(riid), ppv);
219
220 if(IsEqualGUID(&IID_IUnknown, riid)) {
221 *ppv = &This->IOleInPlaceUIWindow_iface;
222 }else if(IsEqualGUID(&IID_IOleWindow, riid)) {
223 *ppv = &This->IOleInPlaceUIWindow_iface;
224 }else if(IsEqualGUID(&IID_IOleInPlaceUIWindow, riid)) {
225 *ppv = &This->IOleInPlaceUIWindow_iface;
226 }else {
227 WARN("Unsopported interface %s\n", debugstr_mshtml_guid(riid));
228 *ppv = NULL;
229 return E_NOINTERFACE;
230 }
231
232 IUnknown_AddRef((IUnknown*)*ppv);
233 return S_OK;
234 }
235
236 static ULONG WINAPI InPlaceUIWindow_AddRef(IOleInPlaceUIWindow *iface)
237 {
238 InPlaceUIWindow *This = impl_from_IOleInPlaceUIWindow(iface);
239 LONG ref = InterlockedIncrement(&This->ref);
240
241 TRACE("(%p) ref=%d\n", This, ref);
242
243 return ref;
244 }
245
246 static ULONG WINAPI InPlaceUIWindow_Release(IOleInPlaceUIWindow *iface)
247 {
248 InPlaceUIWindow *This = impl_from_IOleInPlaceUIWindow(iface);
249 LONG ref = InterlockedDecrement(&This->ref);
250
251 TRACE("(%p) ref=%d\n", This, ref);
252
253 if(!ref)
254 heap_free(This);
255
256 return ref;
257 }
258
259 static HRESULT WINAPI InPlaceUIWindow_GetWindow(IOleInPlaceUIWindow *iface, HWND *phwnd)
260 {
261 InPlaceUIWindow *This = impl_from_IOleInPlaceUIWindow(iface);
262 FIXME("(%p)->(%p)\n", This, phwnd);
263 return E_NOTIMPL;
264 }
265
266 static HRESULT WINAPI InPlaceUIWindow_ContextSensitiveHelp(IOleInPlaceUIWindow *iface,
267 BOOL fEnterMode)
268 {
269 InPlaceUIWindow *This = impl_from_IOleInPlaceUIWindow(iface);
270 FIXME("(%p)->(%x)\n", This, fEnterMode);
271 return E_NOTIMPL;
272 }
273
274 static HRESULT WINAPI InPlaceUIWindow_GetBorder(IOleInPlaceUIWindow *iface, LPRECT lprectBorder)
275 {
276 InPlaceUIWindow *This = impl_from_IOleInPlaceUIWindow(iface);
277 FIXME("(%p)->(%p)\n", This, lprectBorder);
278 return E_NOTIMPL;
279 }
280
281 static HRESULT WINAPI InPlaceUIWindow_RequestBorderSpace(IOleInPlaceUIWindow *iface,
282 LPCBORDERWIDTHS pborderwidths)
283 {
284 InPlaceUIWindow *This = impl_from_IOleInPlaceUIWindow(iface);
285 FIXME("(%p)->(%p)\n", This, pborderwidths);
286 return E_NOTIMPL;
287 }
288
289 static HRESULT WINAPI InPlaceUIWindow_SetBorderSpace(IOleInPlaceUIWindow *iface,
290 LPCBORDERWIDTHS pborderwidths)
291 {
292 InPlaceUIWindow *This = impl_from_IOleInPlaceUIWindow(iface);
293 FIXME("(%p)->(%p)\n", This, pborderwidths);
294 return E_NOTIMPL;
295 }
296
297 static HRESULT WINAPI InPlaceUIWindow_SetActiveObject(IOleInPlaceUIWindow *iface,
298 IOleInPlaceActiveObject *pActiveObject, LPCOLESTR pszObjName)
299 {
300 InPlaceUIWindow *This = impl_from_IOleInPlaceUIWindow(iface);
301 FIXME("(%p)->(%p %s)\n", This, pActiveObject, debugstr_w(pszObjName));
302 return E_NOTIMPL;
303 }
304
305 static const IOleInPlaceUIWindowVtbl OleInPlaceUIWindowVtbl = {
306 InPlaceUIWindow_QueryInterface,
307 InPlaceUIWindow_AddRef,
308 InPlaceUIWindow_Release,
309 InPlaceUIWindow_GetWindow,
310 InPlaceUIWindow_ContextSensitiveHelp,
311 InPlaceUIWindow_GetBorder,
312 InPlaceUIWindow_RequestBorderSpace,
313 InPlaceUIWindow_SetBorderSpace,
314 InPlaceUIWindow_SetActiveObject,
315 };
316
317 HRESULT create_ip_window(IOleInPlaceUIWindow **ret)
318 {
319 InPlaceUIWindow *uiwindow;
320
321 uiwindow = heap_alloc_zero(sizeof(*uiwindow));
322 if(!uiwindow)
323 return E_OUTOFMEMORY;
324
325 uiwindow->IOleInPlaceUIWindow_iface.lpVtbl = &OleInPlaceUIWindowVtbl;
326 uiwindow->ref = 1;
327
328 *ret = &uiwindow->IOleInPlaceUIWindow_iface;
329 return S_OK;
330 }