regedit: Read registry value information before exporting.
[wine.git] / dlls / wmp / oleobj.c
blob8dcdfbdce21b3853a45f87797d70bc457c9217da
1 /*
2 * Copyright 2014 Jacek Caban for CodeWeavers
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 "wmp_private.h"
20 #include "olectl.h"
22 #include "wine/debug.h"
24 WINE_DEFAULT_DEBUG_CHANNEL(wmp);
26 static HWND get_container_hwnd(WindowsMediaPlayer *This)
28 IOleWindow *ole_window;
29 HWND hwnd = NULL;
30 HRESULT hres;
32 /* IOleInPlaceSite (which inherits from IOleWindow) is preferred. */
33 hres = IOleClientSite_QueryInterface(This->client_site, &IID_IOleInPlaceSite, (void**)&ole_window);
34 if(FAILED(hres)) {
35 hres = IOleClientSite_QueryInterface(This->client_site, &IID_IOleWindow, (void**)&ole_window);
36 if(FAILED(hres)) {
37 IOleContainer *container = NULL;
39 hres = IOleClientSite_GetContainer(This->client_site, &container);
40 if(SUCCEEDED(hres)) {
41 hres = IOleContainer_QueryInterface(container, &IID_IOleWindow, (void**)&ole_window);
42 IOleContainer_Release(container);
47 if(FAILED(hres))
48 return NULL;
50 hres = IOleWindow_GetWindow(ole_window, &hwnd);
51 IOleWindow_Release(ole_window);
52 if(FAILED(hres))
53 return NULL;
55 TRACE("Got window %p\n", hwnd);
56 return hwnd;
59 static LRESULT WINAPI wmp_wnd_proc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
61 switch(msg) {
62 case WM_PAINT: {
63 PAINTSTRUCT ps;
64 HFONT font;
65 RECT rect;
66 HDC hdc;
68 TRACE("WM_PAINT\n");
70 GetClientRect(hwnd, &rect);
71 hdc = BeginPaint(hwnd, &ps);
73 SelectObject(hdc, GetStockObject(DC_BRUSH));
74 SetDCBrushColor(hdc, RGB(255,0,0));
75 SetBkColor(hdc, RGB(255,0,0));
77 font = CreateFontA(25,0,0,0,400,0,0,0,ANSI_CHARSET,0,0,DEFAULT_QUALITY,DEFAULT_PITCH,NULL);
78 SelectObject(hdc, font);
80 Rectangle(hdc, rect.left, rect.top, rect.right, rect.bottom);
81 DrawTextA(hdc, "FIXME: WMP", -1, &rect, DT_CENTER | DT_SINGLELINE | DT_VCENTER);
83 DeleteObject(font);
84 EndPaint(hwnd, &ps);
85 break;
89 return DefWindowProcW(hwnd, msg, wParam, lParam);
93 static ATOM wmp_class;
95 static BOOL WINAPI register_wmp_class(INIT_ONCE *once, void *param, void **context)
97 /* It seems that native uses ATL for this. We use a fake name to make tests happy. */
98 static const WCHAR atl_wmpW[] = {'A','T','L',':','W','M','P',0};
100 static WNDCLASSEXW wndclass = {
101 sizeof(wndclass), CS_DBLCLKS, wmp_wnd_proc, 0, 0,
102 NULL, NULL, NULL, NULL, NULL,
103 atl_wmpW, NULL
106 wndclass.hInstance = wmp_instance;
107 wmp_class = RegisterClassExW(&wndclass);
108 return TRUE;
111 void unregister_wmp_class(void)
113 if(wmp_class)
114 UnregisterClassW(MAKEINTRESOURCEW(wmp_class), wmp_instance);
117 static HWND create_wmp_window(WindowsMediaPlayer *wmp, const RECT *posrect)
119 static INIT_ONCE class_init_once = INIT_ONCE_STATIC_INIT;
121 InitOnceExecuteOnce(&class_init_once, register_wmp_class, NULL, NULL);
122 if(!wmp_class)
123 return NULL;
125 return CreateWindowExW(0, MAKEINTRESOURCEW(wmp_class), NULL, WS_CLIPCHILDREN|WS_CLIPSIBLINGS|WS_VISIBLE|WS_CHILD,
126 posrect->left, posrect->top, posrect->right-posrect->left, posrect->bottom-posrect->top,
127 get_container_hwnd(wmp), NULL, wmp_instance, NULL);
130 static HRESULT activate_inplace(WindowsMediaPlayer *This)
132 IOleInPlaceSiteWindowless *ipsite_windowless;
133 IOleInPlaceSiteEx *ipsiteex = NULL;
134 IOleInPlaceSite *ipsite;
135 IOleInPlaceUIWindow *ip_window = NULL;
136 IOleInPlaceFrame *ip_frame = NULL;
137 RECT posrect = {0}, cliprect = {0};
138 OLEINPLACEFRAMEINFO frameinfo = { sizeof(frameinfo) };
139 HRESULT hres;
141 if(This->hwnd) {
142 FIXME("Already activated\n");
143 return E_UNEXPECTED;
146 hres = IOleClientSite_QueryInterface(This->client_site, &IID_IOleInPlaceSiteWindowless, (void**)&ipsite_windowless);
147 if(SUCCEEDED(hres)) {
148 hres = IOleInPlaceSiteWindowless_CanWindowlessActivate(ipsite_windowless);
149 IOleInPlaceSiteWindowless_Release(ipsite_windowless);
150 if(hres == S_OK)
151 FIXME("Windowless activation not supported\n");
152 ipsiteex = (IOleInPlaceSiteEx*)ipsite_windowless;
153 }else {
154 IOleClientSite_QueryInterface(This->client_site, &IID_IOleInPlaceSiteEx, (void**)&ipsiteex);
157 if(ipsiteex) {
158 BOOL redraw = FALSE; /* Not really used. */
159 IOleInPlaceSiteEx_OnInPlaceActivateEx(ipsiteex, &redraw, 0);
160 ipsite = (IOleInPlaceSite*)ipsiteex;
161 }else {
162 IOleClientSite_QueryInterface(This->client_site, &IID_IOleInPlaceSite, (void**)&ipsite);
163 if(FAILED(hres)) {
164 FIXME("No IOleInPlaceSite instance\n");
165 return hres;
168 IOleInPlaceSite_OnInPlaceActivate(ipsite);
171 hres = IOleInPlaceSite_GetWindowContext(ipsite, &ip_frame, &ip_window, &posrect, &cliprect, &frameinfo);
172 IOleInPlaceSite_Release(ipsite);
173 if(FAILED(hres)) {
174 FIXME("GetWindowContext failed: %08x\n", hres);
175 return hres;
178 This->hwnd = create_wmp_window(This, &posrect);
179 if(!This->hwnd)
180 return E_FAIL;
182 IOleClientSite_ShowObject(This->client_site);
183 return S_OK;
186 static void deactivate_window(WindowsMediaPlayer *This)
188 IOleInPlaceSite *ip_site;
189 HRESULT hres;
191 hres = IOleClientSite_QueryInterface(This->client_site, &IID_IOleInPlaceSite, (void**)&ip_site);
192 if(SUCCEEDED(hres)) {
193 IOleInPlaceSite_OnInPlaceDeactivate(ip_site);
194 IOleInPlaceSite_Release(ip_site);
197 DestroyWindow(This->hwnd);
198 This->hwnd = NULL;
201 static void release_client_site(WindowsMediaPlayer *This)
203 if(!This->client_site)
204 return;
206 if(This->hwnd)
207 deactivate_window(This);
209 IOleClientSite_Release(This->client_site);
210 This->client_site = NULL;
213 static inline WindowsMediaPlayer *impl_from_IOleObject(IOleObject *iface)
215 return CONTAINING_RECORD(iface, WindowsMediaPlayer, IOleObject_iface);
218 static HRESULT WINAPI OleObject_QueryInterface(IOleObject *iface, REFIID riid, void **ppv)
220 WindowsMediaPlayer *This = impl_from_IOleObject(iface);
222 if(IsEqualGUID(riid, &IID_IUnknown)) {
223 TRACE("(%p)->(IID_IUnknown %p)\n", This, ppv);
224 *ppv = &This->IOleObject_iface;
225 }else if(IsEqualGUID(riid, &IID_IOleObject)) {
226 TRACE("(%p)->(IID_IOleObject %p)\n", This, ppv);
227 *ppv = &This->IOleObject_iface;
228 }else if(IsEqualGUID(riid, &IID_IProvideClassInfo)) {
229 TRACE("(%p)->(IID_IProvideClassInfo %p)\n", This, ppv);
230 *ppv = &This->IProvideClassInfo2_iface;
231 }else if(IsEqualGUID(riid, &IID_IProvideClassInfo2)) {
232 TRACE("(%p)->(IID_IProvideClassInfo2 %p)\n", This, ppv);
233 *ppv = &This->IProvideClassInfo2_iface;
234 }else if(IsEqualGUID(riid, &IID_IPersist)) {
235 TRACE("(%p)->(IID_IPersist %p)\n", This, ppv);
236 *ppv = &This->IPersistStreamInit_iface;
237 }else if(IsEqualGUID(riid, &IID_IPersistStreamInit)) {
238 TRACE("(%p)->(IID_IPersistStreamInit %p)\n", This, ppv);
239 *ppv = &This->IPersistStreamInit_iface;
240 }else if(IsEqualGUID(riid, &IID_IOleWindow)) {
241 TRACE("(%p)->(IID_IOleWindow %p)\n", This, ppv);
242 *ppv = &This->IOleInPlaceObjectWindowless_iface;
243 }else if(IsEqualGUID(riid, &IID_IOleInPlaceObject)) {
244 TRACE("(%p)->(IID_IOleInPlaceObject %p)\n", This, ppv);
245 *ppv = &This->IOleInPlaceObjectWindowless_iface;
246 }else if(IsEqualGUID(riid, &IID_IOleInPlaceObjectWindowless)) {
247 TRACE("(%p)->(IID_IOleInPlaceObjectWindowless %p)\n", This, ppv);
248 *ppv = &This->IOleInPlaceObjectWindowless_iface;
249 }else if(IsEqualGUID(riid, &IID_IConnectionPointContainer)) {
250 TRACE("(%p)->(IID_IConnectionPointContainer %p)\n", This, ppv);
251 *ppv = &This->IConnectionPointContainer_iface;
252 }else if(IsEqualGUID(riid, &IID_IWMPCore)) {
253 TRACE("(%p)->(IID_IWMPCore %p)\n", This, ppv);
254 *ppv = &This->IWMPPlayer4_iface;
255 }else if(IsEqualGUID(riid, &IID_IWMPCore2)) {
256 TRACE("(%p)->(IID_IWMPCore2 %p)\n", This, ppv);
257 *ppv = &This->IWMPPlayer4_iface;
258 }else if(IsEqualGUID(riid, &IID_IWMPCore3)) {
259 TRACE("(%p)->(IID_IWMPCore3 %p)\n", This, ppv);
260 *ppv = &This->IWMPPlayer4_iface;
261 }else if(IsEqualGUID(riid, &IID_IWMPPlayer4)) {
262 TRACE("(%p)->(IID_IWMPPlayer4 %p)\n", This, ppv);
263 *ppv = &This->IWMPPlayer4_iface;
264 }else if(IsEqualGUID(riid, &IID_IWMPSettings)) {
265 TRACE("(%p)->(IID_IWMPSettings %p)\n", This, ppv);
266 *ppv = &This->IWMPSettings_iface;
267 }else if(IsEqualGUID(riid, &IID_IOleControl)) {
268 TRACE("(%p)->(IID_IOleControl %p)\n", This, ppv);
269 *ppv = &This->IOleControl_iface;
270 }else {
271 FIXME("(%p)->(%s %p)\n", This, debugstr_guid(riid), ppv);
272 *ppv = NULL;
273 return E_NOINTERFACE;
276 IUnknown_AddRef((IUnknown*)*ppv);
277 return S_OK;
280 static ULONG WINAPI OleObject_AddRef(IOleObject *iface)
282 WindowsMediaPlayer *This = impl_from_IOleObject(iface);
283 LONG ref = InterlockedIncrement(&This->ref);
285 TRACE("(%p) ref=%d\n", This, ref);
287 return ref;
290 static ULONG WINAPI OleObject_Release(IOleObject *iface)
292 WindowsMediaPlayer *This = impl_from_IOleObject(iface);
293 LONG ref = InterlockedDecrement(&This->ref);
295 TRACE("(%p) ref=%d\n", This, ref);
297 if(!ref) {
298 release_client_site(This);
299 heap_free(This);
302 return ref;
305 static HRESULT WINAPI OleObject_SetClientSite(IOleObject *iface, IOleClientSite *pClientSite)
307 WindowsMediaPlayer *This = impl_from_IOleObject(iface);
308 IOleControlSite *control_site;
309 HRESULT hres;
311 TRACE("(%p)->(%p)\n", This, pClientSite);
313 release_client_site(This);
314 if(!pClientSite)
315 return S_OK;
317 IOleClientSite_AddRef(pClientSite);
318 This->client_site = pClientSite;
320 hres = IOleClientSite_QueryInterface(pClientSite, &IID_IOleControlSite, (void**)&control_site);
321 if(SUCCEEDED(hres)) {
322 IDispatch *disp;
324 hres = IOleControlSite_GetExtendedControl(control_site, &disp);
325 if(SUCCEEDED(hres) && disp) {
326 FIXME("Use extended control\n");
327 IDispatch_Release(disp);
330 IOleControlSite_Release(control_site);
333 return S_OK;
336 static HRESULT WINAPI OleObject_GetClientSite(IOleObject *iface, IOleClientSite **ppClientSite)
338 WindowsMediaPlayer *This = impl_from_IOleObject(iface);
340 TRACE("(%p)->(%p)\n", This, ppClientSite);
342 *ppClientSite = This->client_site;
343 return This->client_site ? S_OK : E_FAIL;
346 static HRESULT WINAPI OleObject_SetHostNames(IOleObject *iface, LPCOLESTR szContainerApp, LPCOLESTR szContainerObj)
348 WindowsMediaPlayer *This = impl_from_IOleObject(iface);
349 FIXME("(%p)->(%s %s)\n", This, debugstr_w(szContainerApp), debugstr_w(szContainerObj));
350 return E_NOTIMPL;
353 static HRESULT WINAPI OleObject_Close(IOleObject *iface, DWORD dwSaveOption)
355 WindowsMediaPlayer *This = impl_from_IOleObject(iface);
357 TRACE("(%p)->(%08x)\n", This, dwSaveOption);
359 if(dwSaveOption)
360 FIXME("Unsupported option %d\n", dwSaveOption);
362 if(This->hwnd) /* FIXME: Possibly hide window */
363 deactivate_window(This);
364 return S_OK;
367 static HRESULT WINAPI OleObject_SetMoniker(IOleObject *iface, DWORD dwWhichMoniker, IMoniker *pmk)
369 WindowsMediaPlayer *This = impl_from_IOleObject(iface);
370 FIXME("(%p %d %p)->()\n", This, dwWhichMoniker, pmk);
371 return E_NOTIMPL;
374 static HRESULT WINAPI OleObject_GetMoniker(IOleObject *iface, DWORD dwAssign, DWORD dwWhichMoniker, IMoniker **ppmk)
376 WindowsMediaPlayer *This = impl_from_IOleObject(iface);
377 FIXME("(%p)->(%d %d %p)\n", This, dwAssign, dwWhichMoniker, ppmk);
378 return E_NOTIMPL;
381 static HRESULT WINAPI OleObject_InitFromData(IOleObject *iface, IDataObject *pDataObject, BOOL fCreation,
382 DWORD dwReserved)
384 WindowsMediaPlayer *This = impl_from_IOleObject(iface);
385 FIXME("(%p)->(%p %x %d)\n", This, pDataObject, fCreation, dwReserved);
386 return E_NOTIMPL;
389 static HRESULT WINAPI OleObject_GetClipboardData(IOleObject *iface, DWORD dwReserved, IDataObject **ppDataObject)
391 WindowsMediaPlayer *This = impl_from_IOleObject(iface);
392 FIXME("(%p)->(%d %p)\n", This, dwReserved, ppDataObject);
393 return E_NOTIMPL;
396 static HRESULT WINAPI OleObject_DoVerb(IOleObject *iface, LONG iVerb, LPMSG lpmsg, IOleClientSite *pActiveSite,
397 LONG lindex, HWND hwndParent, LPCRECT lprcPosRect)
399 WindowsMediaPlayer *This = impl_from_IOleObject(iface);
401 switch(iVerb) {
402 case OLEIVERB_INPLACEACTIVATE:
403 TRACE("(%p)->(OLEIVERB_INPLACEACTIVATE)\n", This);
404 return activate_inplace(This);
406 case OLEIVERB_HIDE:
407 if(!This->hwnd) {
408 FIXME("No window to hide\n");
409 return E_UNEXPECTED;
412 ShowWindow(This->hwnd, SW_HIDE);
413 return S_OK;
415 default:
416 FIXME("Unsupported iVerb %d\n", iVerb);
419 return E_NOTIMPL;
422 static HRESULT WINAPI OleObject_EnumVerbs(IOleObject *iface, IEnumOLEVERB **ppEnumOleVerb)
424 WindowsMediaPlayer *This = impl_from_IOleObject(iface);
425 FIXME("(%p)->(%p)\n", This, ppEnumOleVerb);
426 return E_NOTIMPL;
429 static HRESULT WINAPI OleObject_Update(IOleObject *iface)
431 WindowsMediaPlayer *This = impl_from_IOleObject(iface);
432 FIXME("(%p)\n", This);
433 return E_NOTIMPL;
436 static HRESULT WINAPI OleObject_IsUpToDate(IOleObject *iface)
438 WindowsMediaPlayer *This = impl_from_IOleObject(iface);
439 FIXME("(%p)\n", This);
440 return E_NOTIMPL;
443 static HRESULT WINAPI OleObject_GetUserClassID(IOleObject *iface, CLSID *pClsid)
445 WindowsMediaPlayer *This = impl_from_IOleObject(iface);
446 FIXME("(%p)->(%p)\n", This, pClsid);
447 return E_NOTIMPL;
450 static HRESULT WINAPI OleObject_GetUserType(IOleObject *iface, DWORD dwFormOfType, LPOLESTR *pszUserType)
452 WindowsMediaPlayer *This = impl_from_IOleObject(iface);
453 FIXME("(%p)->(%d %p)\n", This, dwFormOfType, pszUserType);
454 return E_NOTIMPL;
457 static HRESULT WINAPI OleObject_SetExtent(IOleObject *iface, DWORD dwDrawAspect, SIZEL *psizel)
459 WindowsMediaPlayer *This = impl_from_IOleObject(iface);
461 TRACE("(%p)->(%d %p)\n", This, dwDrawAspect, psizel);
463 if(dwDrawAspect != DVASPECT_CONTENT)
464 return DV_E_DVASPECT;
466 This->extent = *psizel;
467 return S_OK;
470 static HRESULT WINAPI OleObject_GetExtent(IOleObject *iface, DWORD dwDrawAspect, SIZEL *psizel)
472 WindowsMediaPlayer *This = impl_from_IOleObject(iface);
474 TRACE("(%p)->(%d %p)\n", This, dwDrawAspect, psizel);
476 if(dwDrawAspect != DVASPECT_CONTENT)
477 return E_FAIL;
479 *psizel = This->extent;
480 return S_OK;
483 static HRESULT WINAPI OleObject_Advise(IOleObject *iface, IAdviseSink *pAdvSink, DWORD *pdwConnection)
485 WindowsMediaPlayer *This = impl_from_IOleObject(iface);
486 FIXME("(%p)->(%p %p)\n", This, pAdvSink, pdwConnection);
487 return E_NOTIMPL;
490 static HRESULT WINAPI OleObject_Unadvise(IOleObject *iface, DWORD dwConnection)
492 WindowsMediaPlayer *This = impl_from_IOleObject(iface);
493 FIXME("(%p)->(%d)\n", This, dwConnection);
494 return E_NOTIMPL;
497 static HRESULT WINAPI OleObject_EnumAdvise(IOleObject *iface, IEnumSTATDATA **ppenumAdvise)
499 WindowsMediaPlayer *This = impl_from_IOleObject(iface);
500 FIXME("(%p)->(%p)\n", This, ppenumAdvise);
501 return E_NOTIMPL;
504 static HRESULT WINAPI OleObject_GetMiscStatus(IOleObject *iface, DWORD dwAspect, DWORD *pdwStatus)
506 WindowsMediaPlayer *This = impl_from_IOleObject(iface);
508 TRACE("(%p)->(%d %p)\n", This, dwAspect, pdwStatus);
510 switch(dwAspect) {
511 case DVASPECT_CONTENT:
512 *pdwStatus = OLEMISC_SETCLIENTSITEFIRST|OLEMISC_ACTIVATEWHENVISIBLE|OLEMISC_INSIDEOUT
513 |OLEMISC_CANTLINKINSIDE|OLEMISC_RECOMPOSEONRESIZE;
514 break;
515 default:
516 FIXME("Unhandled aspect %d\n", dwAspect);
517 return E_NOTIMPL;
520 return S_OK;
523 static HRESULT WINAPI OleObject_SetColorScheme(IOleObject *iface, LOGPALETTE *pLogpal)
525 WindowsMediaPlayer *This = impl_from_IOleObject(iface);
526 FIXME("(%p)->(%p)\n", This, pLogpal);
527 return E_NOTIMPL;
530 static const IOleObjectVtbl OleObjectVtbl = {
531 OleObject_QueryInterface,
532 OleObject_AddRef,
533 OleObject_Release,
534 OleObject_SetClientSite,
535 OleObject_GetClientSite,
536 OleObject_SetHostNames,
537 OleObject_Close,
538 OleObject_SetMoniker,
539 OleObject_GetMoniker,
540 OleObject_InitFromData,
541 OleObject_GetClipboardData,
542 OleObject_DoVerb,
543 OleObject_EnumVerbs,
544 OleObject_Update,
545 OleObject_IsUpToDate,
546 OleObject_GetUserClassID,
547 OleObject_GetUserType,
548 OleObject_SetExtent,
549 OleObject_GetExtent,
550 OleObject_Advise,
551 OleObject_Unadvise,
552 OleObject_EnumAdvise,
553 OleObject_GetMiscStatus,
554 OleObject_SetColorScheme
557 static inline WindowsMediaPlayer *impl_from_IOleInPlaceObjectWindowless(IOleInPlaceObjectWindowless *iface)
559 return CONTAINING_RECORD(iface, WindowsMediaPlayer, IOleInPlaceObjectWindowless_iface);
562 static HRESULT WINAPI OleInPlaceObjectWindowless_QueryInterface(IOleInPlaceObjectWindowless *iface,
563 REFIID riid, void **ppv)
565 WindowsMediaPlayer *This = impl_from_IOleInPlaceObjectWindowless(iface);
566 return IOleObject_QueryInterface(&This->IOleObject_iface, riid, ppv);
569 static ULONG WINAPI OleInPlaceObjectWindowless_AddRef(IOleInPlaceObjectWindowless *iface)
571 WindowsMediaPlayer *This = impl_from_IOleInPlaceObjectWindowless(iface);
572 return IOleObject_AddRef(&This->IOleObject_iface);
575 static ULONG WINAPI OleInPlaceObjectWindowless_Release(IOleInPlaceObjectWindowless *iface)
577 WindowsMediaPlayer *This = impl_from_IOleInPlaceObjectWindowless(iface);
578 return IOleObject_Release(&This->IOleObject_iface);
581 static HRESULT WINAPI OleInPlaceObjectWindowless_GetWindow(IOleInPlaceObjectWindowless *iface, HWND *phwnd)
583 WindowsMediaPlayer *This = impl_from_IOleInPlaceObjectWindowless(iface);
585 TRACE("(%p)->(%p)\n", This, phwnd);
587 *phwnd = This->hwnd;
588 return This->hwnd ? S_OK : E_UNEXPECTED;
591 static HRESULT WINAPI OleInPlaceObjectWindowless_ContextSensitiveHelp(IOleInPlaceObjectWindowless *iface,
592 BOOL fEnterMode)
594 WindowsMediaPlayer *This = impl_from_IOleInPlaceObjectWindowless(iface);
595 FIXME("(%p)->(%x)\n", This, fEnterMode);
596 return E_NOTIMPL;
599 static HRESULT WINAPI OleInPlaceObjectWindowless_InPlaceDeactivate(IOleInPlaceObjectWindowless *iface)
601 WindowsMediaPlayer *This = impl_from_IOleInPlaceObjectWindowless(iface);
602 FIXME("(%p)\n", This);
603 return E_NOTIMPL;
606 static HRESULT WINAPI OleInPlaceObjectWindowless_UIDeactivate(IOleInPlaceObjectWindowless *iface)
608 WindowsMediaPlayer *This = impl_from_IOleInPlaceObjectWindowless(iface);
609 FIXME("(%p)\n", This);
610 return E_NOTIMPL;
613 static HRESULT WINAPI OleInPlaceObjectWindowless_SetObjectRects(IOleInPlaceObjectWindowless *iface,
614 LPCRECT lprcPosRect, LPCRECT lprcClipRect)
616 WindowsMediaPlayer *This = impl_from_IOleInPlaceObjectWindowless(iface);
618 TRACE("(%p)->(%s %s)\n", This, wine_dbgstr_rect(lprcPosRect), wine_dbgstr_rect(lprcClipRect));
620 if(This->hwnd) {
621 SetWindowPos(This->hwnd, NULL, lprcPosRect->left, lprcPosRect->top,
622 lprcPosRect->right-lprcPosRect->left, lprcPosRect->bottom-lprcPosRect->top,
623 SWP_NOZORDER | SWP_NOACTIVATE);
626 return S_OK;
629 static HRESULT WINAPI OleInPlaceObjectWindowless_ReactivateAndUndo(IOleInPlaceObjectWindowless *iface)
631 WindowsMediaPlayer *This = impl_from_IOleInPlaceObjectWindowless(iface);
632 FIXME("(%p)\n", This);
633 return E_NOTIMPL;
636 static HRESULT WINAPI OleInPlaceObjectWindowless_OnWindowMessage(IOleInPlaceObjectWindowless *iface,
637 UINT msg, WPARAM wParam, LPARAM lParam, LRESULT *lpResult)
639 WindowsMediaPlayer *This = impl_from_IOleInPlaceObjectWindowless(iface);
640 FIXME("(%p)->(%u %lu %lu %p)\n", This, msg, wParam, lParam, lpResult);
641 return E_NOTIMPL;
644 static HRESULT WINAPI OleInPlaceObjectWindowless_GetDropTarget(IOleInPlaceObjectWindowless *iface,
645 IDropTarget **ppDropTarget)
647 WindowsMediaPlayer *This = impl_from_IOleInPlaceObjectWindowless(iface);
648 FIXME("(%p)->(%p)\n", This, ppDropTarget);
649 return E_NOTIMPL;
652 static const IOleInPlaceObjectWindowlessVtbl OleInPlaceObjectWindowlessVtbl = {
653 OleInPlaceObjectWindowless_QueryInterface,
654 OleInPlaceObjectWindowless_AddRef,
655 OleInPlaceObjectWindowless_Release,
656 OleInPlaceObjectWindowless_GetWindow,
657 OleInPlaceObjectWindowless_ContextSensitiveHelp,
658 OleInPlaceObjectWindowless_InPlaceDeactivate,
659 OleInPlaceObjectWindowless_UIDeactivate,
660 OleInPlaceObjectWindowless_SetObjectRects,
661 OleInPlaceObjectWindowless_ReactivateAndUndo,
662 OleInPlaceObjectWindowless_OnWindowMessage,
663 OleInPlaceObjectWindowless_GetDropTarget
666 static inline WindowsMediaPlayer *impl_from_IOleControl(IOleControl *iface)
668 return CONTAINING_RECORD(iface, WindowsMediaPlayer, IOleControl_iface);
671 static HRESULT WINAPI OleControl_QueryInterface(IOleControl *iface, REFIID riid, void **ppv)
673 WindowsMediaPlayer *This = impl_from_IOleControl(iface);
674 return IOleObject_QueryInterface(&This->IOleObject_iface, riid, ppv);
677 static ULONG WINAPI OleControl_AddRef(IOleControl *iface)
679 WindowsMediaPlayer *This = impl_from_IOleControl(iface);
680 return IOleObject_AddRef(&This->IOleObject_iface);
683 static ULONG WINAPI OleControl_Release(IOleControl *iface)
685 WindowsMediaPlayer *This = impl_from_IOleControl(iface);
686 return IOleObject_Release(&This->IOleObject_iface);
689 static HRESULT WINAPI OleControl_GetControlInfo(IOleControl *iface, CONTROLINFO *pCI)
691 WindowsMediaPlayer *This = impl_from_IOleControl(iface);
692 FIXME("(%p)->(%p)\n", This, pCI);
693 return E_NOTIMPL;
696 static HRESULT WINAPI OleControl_OnMnemonic(IOleControl *iface, MSG *msg)
698 WindowsMediaPlayer *This = impl_from_IOleControl(iface);
699 FIXME("(%p)->(%p)\n", This, msg);
700 return E_NOTIMPL;
703 static HRESULT WINAPI OleControl_OnAmbientPropertyChange(IOleControl *iface, DISPID dispID)
705 WindowsMediaPlayer *This = impl_from_IOleControl(iface);
706 FIXME("(%p)->(%d)\n", This, dispID);
707 return E_NOTIMPL;
710 static HRESULT WINAPI OleControl_FreezeEvents(IOleControl *iface, BOOL freeze)
712 WindowsMediaPlayer *This = impl_from_IOleControl(iface);
713 FIXME("(%p)->(%x)\n", This, freeze);
714 return E_NOTIMPL;
717 static const IOleControlVtbl OleControlVtbl = {
718 OleControl_QueryInterface,
719 OleControl_AddRef,
720 OleControl_Release,
721 OleControl_GetControlInfo,
722 OleControl_OnMnemonic,
723 OleControl_OnAmbientPropertyChange,
724 OleControl_FreezeEvents
727 static inline WindowsMediaPlayer *impl_from_IProvideClassInfo2(IProvideClassInfo2 *iface)
729 return CONTAINING_RECORD(iface, WindowsMediaPlayer, IProvideClassInfo2_iface);
732 static HRESULT WINAPI ProvideClassInfo2_QueryInterface(IProvideClassInfo2 *iface, REFIID riid, void **ppv)
734 WindowsMediaPlayer *This = impl_from_IProvideClassInfo2(iface);
735 return IOleObject_QueryInterface(&This->IOleObject_iface, riid, ppv);
738 static ULONG WINAPI ProvideClassInfo2_AddRef(IProvideClassInfo2 *iface)
740 WindowsMediaPlayer *This = impl_from_IProvideClassInfo2(iface);
741 return IOleObject_AddRef(&This->IOleObject_iface);
744 static ULONG WINAPI ProvideClassInfo2_Release(IProvideClassInfo2 *iface)
746 WindowsMediaPlayer *This = impl_from_IProvideClassInfo2(iface);
747 return IOleObject_Release(&This->IOleObject_iface);
750 static HRESULT WINAPI ProvideClassInfo2_GetClassInfo(IProvideClassInfo2 *iface, ITypeInfo **ppTI)
752 WindowsMediaPlayer *This = impl_from_IProvideClassInfo2(iface);
753 FIXME("(%p)->(%p)\n", This, ppTI);
754 return E_NOTIMPL;
757 static HRESULT WINAPI ProvideClassInfo2_GetGUID(IProvideClassInfo2 *iface, DWORD dwGuidKind, GUID *pGUID)
759 WindowsMediaPlayer *This = impl_from_IProvideClassInfo2(iface);
761 TRACE("(%p)->(%d %p)\n", This, dwGuidKind, pGUID);
763 if(dwGuidKind != GUIDKIND_DEFAULT_SOURCE_DISP_IID) {
764 FIXME("Unexpected dwGuidKind %d\n", dwGuidKind);
765 return E_INVALIDARG;
768 *pGUID = IID__WMPOCXEvents;
769 return S_OK;
772 static const IProvideClassInfo2Vtbl ProvideClassInfo2Vtbl = {
773 ProvideClassInfo2_QueryInterface,
774 ProvideClassInfo2_AddRef,
775 ProvideClassInfo2_Release,
776 ProvideClassInfo2_GetClassInfo,
777 ProvideClassInfo2_GetGUID
780 static inline WindowsMediaPlayer *impl_from_IPersistStreamInit(IPersistStreamInit *iface)
782 return CONTAINING_RECORD(iface, WindowsMediaPlayer, IPersistStreamInit_iface);
785 static HRESULT WINAPI PersistStreamInit_QueryInterface(IPersistStreamInit *iface,
786 REFIID riid, void **ppv)
788 WindowsMediaPlayer *This = impl_from_IPersistStreamInit(iface);
789 return IOleObject_QueryInterface(&This->IOleObject_iface, riid, ppv);
792 static ULONG WINAPI PersistStreamInit_AddRef(IPersistStreamInit *iface)
794 WindowsMediaPlayer *This = impl_from_IPersistStreamInit(iface);
795 return IOleObject_AddRef(&This->IOleObject_iface);
798 static ULONG WINAPI PersistStreamInit_Release(IPersistStreamInit *iface)
800 WindowsMediaPlayer *This = impl_from_IPersistStreamInit(iface);
801 return IOleObject_Release(&This->IOleObject_iface);
804 static HRESULT WINAPI PersistStreamInit_GetClassID(IPersistStreamInit *iface, CLSID *pClassID)
806 WindowsMediaPlayer *This = impl_from_IPersistStreamInit(iface);
807 FIXME("(%p)->(%p)\n", This, pClassID);
808 return E_NOTIMPL;
811 static HRESULT WINAPI PersistStreamInit_IsDirty(IPersistStreamInit *iface)
813 WindowsMediaPlayer *This = impl_from_IPersistStreamInit(iface);
814 FIXME("(%p)\n", This);
815 return E_NOTIMPL;
818 static HRESULT WINAPI PersistStreamInit_Load(IPersistStreamInit *iface, LPSTREAM pStm)
820 WindowsMediaPlayer *This = impl_from_IPersistStreamInit(iface);
821 FIXME("(%p)->(%p)\n", This, pStm);
822 return E_NOTIMPL;
825 static HRESULT WINAPI PersistStreamInit_Save(IPersistStreamInit *iface, LPSTREAM pStm,
826 BOOL fClearDirty)
828 WindowsMediaPlayer *This = impl_from_IPersistStreamInit(iface);
829 FIXME("(%p)->(%p %x)\n", This, pStm, fClearDirty);
830 return E_NOTIMPL;
833 static HRESULT WINAPI PersistStreamInit_GetSizeMax(IPersistStreamInit *iface,
834 ULARGE_INTEGER *pcbSize)
836 WindowsMediaPlayer *This = impl_from_IPersistStreamInit(iface);
837 FIXME("(%p)->(%p)\n", This, pcbSize);
838 return E_NOTIMPL;
841 static HRESULT WINAPI PersistStreamInit_InitNew(IPersistStreamInit *iface)
843 WindowsMediaPlayer *This = impl_from_IPersistStreamInit(iface);
845 TRACE("(%p)\n", This);
847 if(!This->client_site)
848 return E_FAIL;
850 /* Nothing to do, yet. */
851 get_container_hwnd(This);
852 return S_OK;
855 static const IPersistStreamInitVtbl PersistStreamInitVtbl = {
856 PersistStreamInit_QueryInterface,
857 PersistStreamInit_AddRef,
858 PersistStreamInit_Release,
859 PersistStreamInit_GetClassID,
860 PersistStreamInit_IsDirty,
861 PersistStreamInit_Load,
862 PersistStreamInit_Save,
863 PersistStreamInit_GetSizeMax,
864 PersistStreamInit_InitNew
867 static inline WindowsMediaPlayer *impl_from_IConnectionPointContainer(IConnectionPointContainer *iface)
869 return CONTAINING_RECORD(iface, WindowsMediaPlayer, IConnectionPointContainer_iface);
872 static HRESULT WINAPI ConnectionPointContainer_QueryInterface(IConnectionPointContainer *iface,
873 REFIID riid, LPVOID *ppv)
875 WindowsMediaPlayer *This = impl_from_IConnectionPointContainer(iface);
876 return IOleObject_QueryInterface(&This->IOleObject_iface, riid, ppv);
879 static ULONG WINAPI ConnectionPointContainer_AddRef(IConnectionPointContainer *iface)
881 WindowsMediaPlayer *This = impl_from_IConnectionPointContainer(iface);
882 return IOleObject_AddRef(&This->IOleObject_iface);
885 static ULONG WINAPI ConnectionPointContainer_Release(IConnectionPointContainer *iface)
887 WindowsMediaPlayer *This = impl_from_IConnectionPointContainer(iface);
888 return IOleObject_Release(&This->IOleObject_iface);
891 static HRESULT WINAPI ConnectionPointContainer_EnumConnectionPoints(IConnectionPointContainer *iface,
892 IEnumConnectionPoints **ppEnum)
894 WindowsMediaPlayer *This = impl_from_IConnectionPointContainer(iface);
895 FIXME("(%p)->(%p)\n", This, ppEnum);
896 return E_NOTIMPL;
899 static HRESULT WINAPI ConnectionPointContainer_FindConnectionPoint(IConnectionPointContainer *iface,
900 REFIID riid, IConnectionPoint **ppCP)
902 WindowsMediaPlayer *This = impl_from_IConnectionPointContainer(iface);
903 FIXME("(%p)->(%s %p)\n", This, debugstr_guid(riid), ppCP);
904 return CONNECT_E_NOCONNECTION;
907 static const IConnectionPointContainerVtbl ConnectionPointContainerVtbl =
909 ConnectionPointContainer_QueryInterface,
910 ConnectionPointContainer_AddRef,
911 ConnectionPointContainer_Release,
912 ConnectionPointContainer_EnumConnectionPoints,
913 ConnectionPointContainer_FindConnectionPoint
916 HRESULT WINAPI WMPFactory_CreateInstance(IClassFactory *iface, IUnknown *outer,
917 REFIID riid, void **ppv)
919 WindowsMediaPlayer *wmp;
920 DWORD dpi_x, dpi_y;
921 HDC hdc;
922 HRESULT hres;
924 TRACE("(%p %s %p)\n", outer, debugstr_guid(riid), ppv);
926 wmp = heap_alloc_zero(sizeof(*wmp));
927 if(!wmp)
928 return E_OUTOFMEMORY;
930 wmp->IOleObject_iface.lpVtbl = &OleObjectVtbl;
931 wmp->IProvideClassInfo2_iface.lpVtbl = &ProvideClassInfo2Vtbl;
932 wmp->IPersistStreamInit_iface.lpVtbl = &PersistStreamInitVtbl;
933 wmp->IOleInPlaceObjectWindowless_iface.lpVtbl = &OleInPlaceObjectWindowlessVtbl;
934 wmp->IConnectionPointContainer_iface.lpVtbl = &ConnectionPointContainerVtbl;
935 wmp->IOleControl_iface.lpVtbl = &OleControlVtbl;
937 wmp->ref = 1;
939 init_player_ifaces(wmp);
941 hdc = GetDC(0);
942 dpi_x = GetDeviceCaps(hdc, LOGPIXELSX);
943 dpi_y = GetDeviceCaps(hdc, LOGPIXELSY);
944 ReleaseDC(0, hdc);
946 wmp->extent.cx = MulDiv(192, 2540, dpi_x);
947 wmp->extent.cy = MulDiv(192, 2540, dpi_y);
949 hres = IOleObject_QueryInterface(&wmp->IOleObject_iface, riid, ppv);
950 IOleObject_Release(&wmp->IOleObject_iface);
951 return hres;