mmdevapi: Override product strings for DualSense Edge.
[wine.git] / dlls / wmp / oleobj.c
blobe227f91f8ba6a84567be3509bad5a5b7bb77b507
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 static WNDCLASSEXW wndclass = {
98 sizeof(wndclass), CS_DBLCLKS, wmp_wnd_proc, 0, 0,
99 NULL, NULL, NULL, NULL, NULL,
100 /* It seems that native uses ATL for this. We use a fake name to make tests happy. */
101 L"ATL:WMP", NULL
104 wndclass.hInstance = wmp_instance;
105 wmp_class = RegisterClassExW(&wndclass);
106 return TRUE;
109 void unregister_wmp_class(void)
111 if(wmp_class)
112 UnregisterClassW(MAKEINTRESOURCEW(wmp_class), wmp_instance);
115 static HWND create_wmp_window(WindowsMediaPlayer *wmp, const RECT *posrect)
117 static INIT_ONCE class_init_once = INIT_ONCE_STATIC_INIT;
119 InitOnceExecuteOnce(&class_init_once, register_wmp_class, NULL, NULL);
120 if(!wmp_class)
121 return NULL;
123 return CreateWindowExW(0, MAKEINTRESOURCEW(wmp_class), NULL, WS_CLIPCHILDREN|WS_CLIPSIBLINGS|WS_VISIBLE|WS_CHILD,
124 posrect->left, posrect->top, posrect->right-posrect->left, posrect->bottom-posrect->top,
125 get_container_hwnd(wmp), NULL, wmp_instance, NULL);
128 static HRESULT activate_inplace(WindowsMediaPlayer *This)
130 IOleInPlaceSiteWindowless *ipsite_windowless;
131 IOleInPlaceSiteEx *ipsiteex = NULL;
132 IOleInPlaceSite *ipsite;
133 IOleInPlaceUIWindow *ip_window = NULL;
134 IOleInPlaceFrame *ip_frame = NULL;
135 RECT posrect = {0}, cliprect = {0};
136 OLEINPLACEFRAMEINFO frameinfo = { sizeof(frameinfo) };
137 HRESULT hres;
139 if(This->hwnd) {
140 FIXME("Already activated\n");
141 return E_UNEXPECTED;
144 hres = IOleClientSite_QueryInterface(This->client_site, &IID_IOleInPlaceSiteWindowless, (void**)&ipsite_windowless);
145 if(SUCCEEDED(hres)) {
146 hres = IOleInPlaceSiteWindowless_CanWindowlessActivate(ipsite_windowless);
147 IOleInPlaceSiteWindowless_Release(ipsite_windowless);
148 if(hres == S_OK)
149 FIXME("Windowless activation not supported\n");
150 ipsiteex = (IOleInPlaceSiteEx*)ipsite_windowless;
151 }else {
152 IOleClientSite_QueryInterface(This->client_site, &IID_IOleInPlaceSiteEx, (void**)&ipsiteex);
155 if(ipsiteex) {
156 BOOL redraw = FALSE; /* Not really used. */
157 IOleInPlaceSiteEx_OnInPlaceActivateEx(ipsiteex, &redraw, 0);
158 ipsite = (IOleInPlaceSite*)ipsiteex;
159 }else {
160 IOleClientSite_QueryInterface(This->client_site, &IID_IOleInPlaceSite, (void**)&ipsite);
161 if(FAILED(hres)) {
162 FIXME("No IOleInPlaceSite instance\n");
163 return hres;
166 IOleInPlaceSite_OnInPlaceActivate(ipsite);
169 hres = IOleInPlaceSite_GetWindowContext(ipsite, &ip_frame, &ip_window, &posrect, &cliprect, &frameinfo);
170 IOleInPlaceSite_Release(ipsite);
171 if(FAILED(hres)) {
172 FIXME("GetWindowContext failed: %08lx\n", hres);
173 return hres;
176 This->hwnd = create_wmp_window(This, &posrect);
177 if(!This->hwnd)
178 return E_FAIL;
180 IOleClientSite_ShowObject(This->client_site);
181 return S_OK;
184 static void deactivate_window(WindowsMediaPlayer *This)
186 IOleInPlaceSite *ip_site;
187 HRESULT hres;
189 hres = IOleClientSite_QueryInterface(This->client_site, &IID_IOleInPlaceSite, (void**)&ip_site);
190 if(SUCCEEDED(hres)) {
191 IOleInPlaceSite_OnInPlaceDeactivate(ip_site);
192 IOleInPlaceSite_Release(ip_site);
195 DestroyWindow(This->hwnd);
196 This->hwnd = NULL;
199 static void release_client_site(WindowsMediaPlayer *This)
201 if(!This->client_site)
202 return;
204 if(This->hwnd)
205 deactivate_window(This);
207 IOleClientSite_Release(This->client_site);
208 This->client_site = NULL;
211 static inline WindowsMediaPlayer *impl_from_IOleObject(IOleObject *iface)
213 return CONTAINING_RECORD(iface, WindowsMediaPlayer, IOleObject_iface);
216 static HRESULT WINAPI OleObject_QueryInterface(IOleObject *iface, REFIID riid, void **ppv)
218 WindowsMediaPlayer *This = impl_from_IOleObject(iface);
220 *ppv = NULL;
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_IWMPPlayer)) {
265 TRACE("(%p)->(IID_IWMPPlayer %p)\n", This, ppv);
266 *ppv = &This->IWMPPlayer_iface;
267 }else if(IsEqualGUID(riid, &IID_IWMPSettings)) {
268 TRACE("(%p)->(IID_IWMPSettings %p)\n", This, ppv);
269 *ppv = &This->IWMPSettings_iface;
270 }else if(IsEqualGUID(riid, &IID_IOleControl)) {
271 TRACE("(%p)->(IID_IOleControl %p)\n", This, ppv);
272 *ppv = &This->IOleControl_iface;
273 }else if(IsEqualGUID(riid, &IID_IMarshal)) {
274 TRACE("(%p)->(IID_IMarshal %p)\n", This, ppv);
275 return E_NOINTERFACE;
276 }else if(IsEqualGUID(riid, &IID_IQuickActivate)) {
277 TRACE("(%p)->(IID_IQuickActivate %p)\n", This, ppv);
278 return E_NOINTERFACE;
279 }else {
280 FIXME("(%p)->(%s %p)\n", This, debugstr_guid(riid), ppv);
281 return E_NOINTERFACE;
284 IUnknown_AddRef((IUnknown*)*ppv);
285 return S_OK;
288 static ULONG WINAPI OleObject_AddRef(IOleObject *iface)
290 WindowsMediaPlayer *This = impl_from_IOleObject(iface);
291 LONG ref = InterlockedIncrement(&This->ref);
293 TRACE("(%p) ref=%ld\n", This, ref);
295 return ref;
298 static ULONG WINAPI OleObject_Release(IOleObject *iface)
300 WindowsMediaPlayer *This = impl_from_IOleObject(iface);
301 LONG ref = InterlockedDecrement(&This->ref);
303 TRACE("(%p) ref=%ld\n", This, ref);
305 if(!ref) {
306 release_client_site(This);
307 destroy_player(This);
308 ConnectionPointContainer_Destroy(This);
309 free(This);
312 return ref;
315 static HRESULT WINAPI OleObject_SetClientSite(IOleObject *iface, IOleClientSite *pClientSite)
317 WindowsMediaPlayer *This = impl_from_IOleObject(iface);
318 IOleControlSite *control_site;
319 HRESULT hres;
321 TRACE("(%p)->(%p)\n", This, pClientSite);
323 release_client_site(This);
324 if(!pClientSite)
325 return S_OK;
327 IOleClientSite_AddRef(pClientSite);
328 This->client_site = pClientSite;
330 hres = IOleClientSite_QueryInterface(pClientSite, &IID_IOleControlSite, (void**)&control_site);
331 if(SUCCEEDED(hres)) {
332 IDispatch *disp;
334 hres = IOleControlSite_GetExtendedControl(control_site, &disp);
335 if(SUCCEEDED(hres) && disp) {
336 FIXME("Use extended control\n");
337 IDispatch_Release(disp);
340 IOleControlSite_Release(control_site);
343 return S_OK;
346 static HRESULT WINAPI OleObject_GetClientSite(IOleObject *iface, IOleClientSite **ppClientSite)
348 WindowsMediaPlayer *This = impl_from_IOleObject(iface);
350 TRACE("(%p)->(%p)\n", This, ppClientSite);
352 *ppClientSite = This->client_site;
353 return This->client_site ? S_OK : E_FAIL;
356 static HRESULT WINAPI OleObject_SetHostNames(IOleObject *iface, LPCOLESTR szContainerApp, LPCOLESTR szContainerObj)
358 WindowsMediaPlayer *This = impl_from_IOleObject(iface);
359 FIXME("(%p)->(%s %s)\n", This, debugstr_w(szContainerApp), debugstr_w(szContainerObj));
360 return E_NOTIMPL;
363 static HRESULT WINAPI OleObject_Close(IOleObject *iface, DWORD dwSaveOption)
365 WindowsMediaPlayer *This = impl_from_IOleObject(iface);
367 TRACE("(%p)->(%08lx)\n", This, dwSaveOption);
369 if(dwSaveOption)
370 FIXME("Unsupported option %ld\n", dwSaveOption);
372 if(This->hwnd) /* FIXME: Possibly hide window */
373 deactivate_window(This);
374 return S_OK;
377 static HRESULT WINAPI OleObject_SetMoniker(IOleObject *iface, DWORD dwWhichMoniker, IMoniker *pmk)
379 WindowsMediaPlayer *This = impl_from_IOleObject(iface);
380 FIXME("(%p %ld %p)->()\n", This, dwWhichMoniker, pmk);
381 return E_NOTIMPL;
384 static HRESULT WINAPI OleObject_GetMoniker(IOleObject *iface, DWORD dwAssign, DWORD dwWhichMoniker, IMoniker **ppmk)
386 WindowsMediaPlayer *This = impl_from_IOleObject(iface);
387 FIXME("(%p)->(%ld %ld %p)\n", This, dwAssign, dwWhichMoniker, ppmk);
388 return E_NOTIMPL;
391 static HRESULT WINAPI OleObject_InitFromData(IOleObject *iface, IDataObject *pDataObject, BOOL fCreation,
392 DWORD dwReserved)
394 WindowsMediaPlayer *This = impl_from_IOleObject(iface);
395 FIXME("(%p)->(%p %x %ld)\n", This, pDataObject, fCreation, dwReserved);
396 return E_NOTIMPL;
399 static HRESULT WINAPI OleObject_GetClipboardData(IOleObject *iface, DWORD dwReserved, IDataObject **ppDataObject)
401 WindowsMediaPlayer *This = impl_from_IOleObject(iface);
402 FIXME("(%p)->(%ld %p)\n", This, dwReserved, ppDataObject);
403 return E_NOTIMPL;
406 static HRESULT WINAPI OleObject_DoVerb(IOleObject *iface, LONG iVerb, LPMSG lpmsg, IOleClientSite *pActiveSite,
407 LONG lindex, HWND hwndParent, LPCRECT lprcPosRect)
409 WindowsMediaPlayer *This = impl_from_IOleObject(iface);
411 switch(iVerb) {
412 case OLEIVERB_INPLACEACTIVATE:
413 TRACE("(%p)->(OLEIVERB_INPLACEACTIVATE)\n", This);
414 return activate_inplace(This);
416 case OLEIVERB_HIDE:
417 if(!This->hwnd) {
418 FIXME("No window to hide\n");
419 return E_UNEXPECTED;
422 ShowWindow(This->hwnd, SW_HIDE);
423 return S_OK;
425 default:
426 FIXME("Unsupported iVerb %ld\n", iVerb);
429 return E_NOTIMPL;
432 static HRESULT WINAPI OleObject_EnumVerbs(IOleObject *iface, IEnumOLEVERB **ppEnumOleVerb)
434 WindowsMediaPlayer *This = impl_from_IOleObject(iface);
435 FIXME("(%p)->(%p)\n", This, ppEnumOleVerb);
436 return E_NOTIMPL;
439 static HRESULT WINAPI OleObject_Update(IOleObject *iface)
441 WindowsMediaPlayer *This = impl_from_IOleObject(iface);
442 FIXME("(%p)\n", This);
443 return E_NOTIMPL;
446 static HRESULT WINAPI OleObject_IsUpToDate(IOleObject *iface)
448 WindowsMediaPlayer *This = impl_from_IOleObject(iface);
449 FIXME("(%p)\n", This);
450 return E_NOTIMPL;
453 static HRESULT WINAPI OleObject_GetUserClassID(IOleObject *iface, CLSID *pClsid)
455 WindowsMediaPlayer *This = impl_from_IOleObject(iface);
456 FIXME("(%p)->(%p)\n", This, pClsid);
457 return E_NOTIMPL;
460 static HRESULT WINAPI OleObject_GetUserType(IOleObject *iface, DWORD dwFormOfType, LPOLESTR *pszUserType)
462 WindowsMediaPlayer *This = impl_from_IOleObject(iface);
463 FIXME("(%p)->(%ld %p)\n", This, dwFormOfType, pszUserType);
464 return E_NOTIMPL;
467 static HRESULT WINAPI OleObject_SetExtent(IOleObject *iface, DWORD dwDrawAspect, SIZEL *psizel)
469 WindowsMediaPlayer *This = impl_from_IOleObject(iface);
471 TRACE("(%p)->(%ld %p)\n", This, dwDrawAspect, psizel);
473 if(dwDrawAspect != DVASPECT_CONTENT)
474 return DV_E_DVASPECT;
476 This->extent = *psizel;
477 return S_OK;
480 static HRESULT WINAPI OleObject_GetExtent(IOleObject *iface, DWORD dwDrawAspect, SIZEL *psizel)
482 WindowsMediaPlayer *This = impl_from_IOleObject(iface);
484 TRACE("(%p)->(%ld %p)\n", This, dwDrawAspect, psizel);
486 if(dwDrawAspect != DVASPECT_CONTENT)
487 return E_FAIL;
489 *psizel = This->extent;
490 return S_OK;
493 static HRESULT WINAPI OleObject_Advise(IOleObject *iface, IAdviseSink *pAdvSink, DWORD *pdwConnection)
495 WindowsMediaPlayer *This = impl_from_IOleObject(iface);
496 FIXME("(%p)->(%p %p)\n", This, pAdvSink, pdwConnection);
497 return E_NOTIMPL;
500 static HRESULT WINAPI OleObject_Unadvise(IOleObject *iface, DWORD dwConnection)
502 WindowsMediaPlayer *This = impl_from_IOleObject(iface);
503 FIXME("(%p)->(%ld)\n", This, dwConnection);
504 return E_NOTIMPL;
507 static HRESULT WINAPI OleObject_EnumAdvise(IOleObject *iface, IEnumSTATDATA **ppenumAdvise)
509 WindowsMediaPlayer *This = impl_from_IOleObject(iface);
510 FIXME("(%p)->(%p)\n", This, ppenumAdvise);
511 return E_NOTIMPL;
514 static HRESULT WINAPI OleObject_GetMiscStatus(IOleObject *iface, DWORD dwAspect, DWORD *pdwStatus)
516 WindowsMediaPlayer *This = impl_from_IOleObject(iface);
518 TRACE("(%p)->(%ld %p)\n", This, dwAspect, pdwStatus);
520 switch(dwAspect) {
521 case DVASPECT_CONTENT:
522 *pdwStatus = OLEMISC_SETCLIENTSITEFIRST|OLEMISC_ACTIVATEWHENVISIBLE|OLEMISC_INSIDEOUT
523 |OLEMISC_CANTLINKINSIDE|OLEMISC_RECOMPOSEONRESIZE;
524 break;
525 default:
526 FIXME("Unhandled aspect %ld\n", dwAspect);
527 return E_NOTIMPL;
530 return S_OK;
533 static HRESULT WINAPI OleObject_SetColorScheme(IOleObject *iface, LOGPALETTE *pLogpal)
535 WindowsMediaPlayer *This = impl_from_IOleObject(iface);
536 FIXME("(%p)->(%p)\n", This, pLogpal);
537 return E_NOTIMPL;
540 static const IOleObjectVtbl OleObjectVtbl = {
541 OleObject_QueryInterface,
542 OleObject_AddRef,
543 OleObject_Release,
544 OleObject_SetClientSite,
545 OleObject_GetClientSite,
546 OleObject_SetHostNames,
547 OleObject_Close,
548 OleObject_SetMoniker,
549 OleObject_GetMoniker,
550 OleObject_InitFromData,
551 OleObject_GetClipboardData,
552 OleObject_DoVerb,
553 OleObject_EnumVerbs,
554 OleObject_Update,
555 OleObject_IsUpToDate,
556 OleObject_GetUserClassID,
557 OleObject_GetUserType,
558 OleObject_SetExtent,
559 OleObject_GetExtent,
560 OleObject_Advise,
561 OleObject_Unadvise,
562 OleObject_EnumAdvise,
563 OleObject_GetMiscStatus,
564 OleObject_SetColorScheme
567 static inline WindowsMediaPlayer *impl_from_IOleInPlaceObjectWindowless(IOleInPlaceObjectWindowless *iface)
569 return CONTAINING_RECORD(iface, WindowsMediaPlayer, IOleInPlaceObjectWindowless_iface);
572 static HRESULT WINAPI OleInPlaceObjectWindowless_QueryInterface(IOleInPlaceObjectWindowless *iface,
573 REFIID riid, void **ppv)
575 WindowsMediaPlayer *This = impl_from_IOleInPlaceObjectWindowless(iface);
576 return IOleObject_QueryInterface(&This->IOleObject_iface, riid, ppv);
579 static ULONG WINAPI OleInPlaceObjectWindowless_AddRef(IOleInPlaceObjectWindowless *iface)
581 WindowsMediaPlayer *This = impl_from_IOleInPlaceObjectWindowless(iface);
582 return IOleObject_AddRef(&This->IOleObject_iface);
585 static ULONG WINAPI OleInPlaceObjectWindowless_Release(IOleInPlaceObjectWindowless *iface)
587 WindowsMediaPlayer *This = impl_from_IOleInPlaceObjectWindowless(iface);
588 return IOleObject_Release(&This->IOleObject_iface);
591 static HRESULT WINAPI OleInPlaceObjectWindowless_GetWindow(IOleInPlaceObjectWindowless *iface, HWND *phwnd)
593 WindowsMediaPlayer *This = impl_from_IOleInPlaceObjectWindowless(iface);
595 TRACE("(%p)->(%p)\n", This, phwnd);
597 *phwnd = This->hwnd;
598 return This->hwnd ? S_OK : E_UNEXPECTED;
601 static HRESULT WINAPI OleInPlaceObjectWindowless_ContextSensitiveHelp(IOleInPlaceObjectWindowless *iface,
602 BOOL fEnterMode)
604 WindowsMediaPlayer *This = impl_from_IOleInPlaceObjectWindowless(iface);
605 FIXME("(%p)->(%x)\n", This, fEnterMode);
606 return E_NOTIMPL;
609 static HRESULT WINAPI OleInPlaceObjectWindowless_InPlaceDeactivate(IOleInPlaceObjectWindowless *iface)
611 WindowsMediaPlayer *This = impl_from_IOleInPlaceObjectWindowless(iface);
612 FIXME("(%p)\n", This);
613 return E_NOTIMPL;
616 static HRESULT WINAPI OleInPlaceObjectWindowless_UIDeactivate(IOleInPlaceObjectWindowless *iface)
618 WindowsMediaPlayer *This = impl_from_IOleInPlaceObjectWindowless(iface);
619 FIXME("(%p)\n", This);
620 return E_NOTIMPL;
623 static HRESULT WINAPI OleInPlaceObjectWindowless_SetObjectRects(IOleInPlaceObjectWindowless *iface,
624 LPCRECT lprcPosRect, LPCRECT lprcClipRect)
626 WindowsMediaPlayer *This = impl_from_IOleInPlaceObjectWindowless(iface);
628 TRACE("(%p)->(%s %s)\n", This, wine_dbgstr_rect(lprcPosRect), wine_dbgstr_rect(lprcClipRect));
630 if(This->hwnd) {
631 SetWindowPos(This->hwnd, NULL, lprcPosRect->left, lprcPosRect->top,
632 lprcPosRect->right-lprcPosRect->left, lprcPosRect->bottom-lprcPosRect->top,
633 SWP_NOZORDER | SWP_NOACTIVATE);
636 return S_OK;
639 static HRESULT WINAPI OleInPlaceObjectWindowless_ReactivateAndUndo(IOleInPlaceObjectWindowless *iface)
641 WindowsMediaPlayer *This = impl_from_IOleInPlaceObjectWindowless(iface);
642 FIXME("(%p)\n", This);
643 return E_NOTIMPL;
646 static HRESULT WINAPI OleInPlaceObjectWindowless_OnWindowMessage(IOleInPlaceObjectWindowless *iface,
647 UINT msg, WPARAM wParam, LPARAM lParam, LRESULT *lpResult)
649 WindowsMediaPlayer *This = impl_from_IOleInPlaceObjectWindowless(iface);
650 FIXME("(%p)->(%u %Iu %Iu %p)\n", This, msg, wParam, lParam, lpResult);
651 return E_NOTIMPL;
654 static HRESULT WINAPI OleInPlaceObjectWindowless_GetDropTarget(IOleInPlaceObjectWindowless *iface,
655 IDropTarget **ppDropTarget)
657 WindowsMediaPlayer *This = impl_from_IOleInPlaceObjectWindowless(iface);
658 FIXME("(%p)->(%p)\n", This, ppDropTarget);
659 return E_NOTIMPL;
662 static const IOleInPlaceObjectWindowlessVtbl OleInPlaceObjectWindowlessVtbl = {
663 OleInPlaceObjectWindowless_QueryInterface,
664 OleInPlaceObjectWindowless_AddRef,
665 OleInPlaceObjectWindowless_Release,
666 OleInPlaceObjectWindowless_GetWindow,
667 OleInPlaceObjectWindowless_ContextSensitiveHelp,
668 OleInPlaceObjectWindowless_InPlaceDeactivate,
669 OleInPlaceObjectWindowless_UIDeactivate,
670 OleInPlaceObjectWindowless_SetObjectRects,
671 OleInPlaceObjectWindowless_ReactivateAndUndo,
672 OleInPlaceObjectWindowless_OnWindowMessage,
673 OleInPlaceObjectWindowless_GetDropTarget
676 static inline WindowsMediaPlayer *impl_from_IOleControl(IOleControl *iface)
678 return CONTAINING_RECORD(iface, WindowsMediaPlayer, IOleControl_iface);
681 static HRESULT WINAPI OleControl_QueryInterface(IOleControl *iface, REFIID riid, void **ppv)
683 WindowsMediaPlayer *This = impl_from_IOleControl(iface);
684 return IOleObject_QueryInterface(&This->IOleObject_iface, riid, ppv);
687 static ULONG WINAPI OleControl_AddRef(IOleControl *iface)
689 WindowsMediaPlayer *This = impl_from_IOleControl(iface);
690 return IOleObject_AddRef(&This->IOleObject_iface);
693 static ULONG WINAPI OleControl_Release(IOleControl *iface)
695 WindowsMediaPlayer *This = impl_from_IOleControl(iface);
696 return IOleObject_Release(&This->IOleObject_iface);
699 static HRESULT WINAPI OleControl_GetControlInfo(IOleControl *iface, CONTROLINFO *pCI)
701 WindowsMediaPlayer *This = impl_from_IOleControl(iface);
702 FIXME("(%p)->(%p)\n", This, pCI);
703 return E_NOTIMPL;
706 static HRESULT WINAPI OleControl_OnMnemonic(IOleControl *iface, MSG *msg)
708 WindowsMediaPlayer *This = impl_from_IOleControl(iface);
709 FIXME("(%p)->(%p)\n", This, msg);
710 return E_NOTIMPL;
713 static HRESULT WINAPI OleControl_OnAmbientPropertyChange(IOleControl *iface, DISPID dispID)
715 WindowsMediaPlayer *This = impl_from_IOleControl(iface);
716 FIXME("(%p)->(%ld)\n", This, dispID);
717 return E_NOTIMPL;
720 static HRESULT WINAPI OleControl_FreezeEvents(IOleControl *iface, BOOL freeze)
722 WindowsMediaPlayer *This = impl_from_IOleControl(iface);
723 FIXME("(%p)->(%x)\n", This, freeze);
724 return E_NOTIMPL;
727 static const IOleControlVtbl OleControlVtbl = {
728 OleControl_QueryInterface,
729 OleControl_AddRef,
730 OleControl_Release,
731 OleControl_GetControlInfo,
732 OleControl_OnMnemonic,
733 OleControl_OnAmbientPropertyChange,
734 OleControl_FreezeEvents
737 static inline WindowsMediaPlayer *impl_from_IProvideClassInfo2(IProvideClassInfo2 *iface)
739 return CONTAINING_RECORD(iface, WindowsMediaPlayer, IProvideClassInfo2_iface);
742 static HRESULT WINAPI ProvideClassInfo2_QueryInterface(IProvideClassInfo2 *iface, REFIID riid, void **ppv)
744 WindowsMediaPlayer *This = impl_from_IProvideClassInfo2(iface);
745 return IOleObject_QueryInterface(&This->IOleObject_iface, riid, ppv);
748 static ULONG WINAPI ProvideClassInfo2_AddRef(IProvideClassInfo2 *iface)
750 WindowsMediaPlayer *This = impl_from_IProvideClassInfo2(iface);
751 return IOleObject_AddRef(&This->IOleObject_iface);
754 static ULONG WINAPI ProvideClassInfo2_Release(IProvideClassInfo2 *iface)
756 WindowsMediaPlayer *This = impl_from_IProvideClassInfo2(iface);
757 return IOleObject_Release(&This->IOleObject_iface);
760 static HRESULT WINAPI ProvideClassInfo2_GetClassInfo(IProvideClassInfo2 *iface, ITypeInfo **ti)
762 WindowsMediaPlayer *This = impl_from_IProvideClassInfo2(iface);
764 TRACE("(%p)->(%p)\n", This, ti);
766 if (!ti)
767 return E_POINTER;
769 return get_typeinfo(WindowsMediaPlayer_tid, ti);
772 static HRESULT WINAPI ProvideClassInfo2_GetGUID(IProvideClassInfo2 *iface, DWORD dwGuidKind, GUID *pGUID)
774 WindowsMediaPlayer *This = impl_from_IProvideClassInfo2(iface);
776 TRACE("(%p)->(%ld %p)\n", This, dwGuidKind, pGUID);
778 if(dwGuidKind != GUIDKIND_DEFAULT_SOURCE_DISP_IID) {
779 FIXME("Unexpected dwGuidKind %ld\n", dwGuidKind);
780 return E_INVALIDARG;
783 *pGUID = IID__WMPOCXEvents;
784 return S_OK;
787 static const IProvideClassInfo2Vtbl ProvideClassInfo2Vtbl = {
788 ProvideClassInfo2_QueryInterface,
789 ProvideClassInfo2_AddRef,
790 ProvideClassInfo2_Release,
791 ProvideClassInfo2_GetClassInfo,
792 ProvideClassInfo2_GetGUID
795 static inline WindowsMediaPlayer *impl_from_IPersistStreamInit(IPersistStreamInit *iface)
797 return CONTAINING_RECORD(iface, WindowsMediaPlayer, IPersistStreamInit_iface);
800 static HRESULT WINAPI PersistStreamInit_QueryInterface(IPersistStreamInit *iface,
801 REFIID riid, void **ppv)
803 WindowsMediaPlayer *This = impl_from_IPersistStreamInit(iface);
804 return IOleObject_QueryInterface(&This->IOleObject_iface, riid, ppv);
807 static ULONG WINAPI PersistStreamInit_AddRef(IPersistStreamInit *iface)
809 WindowsMediaPlayer *This = impl_from_IPersistStreamInit(iface);
810 return IOleObject_AddRef(&This->IOleObject_iface);
813 static ULONG WINAPI PersistStreamInit_Release(IPersistStreamInit *iface)
815 WindowsMediaPlayer *This = impl_from_IPersistStreamInit(iface);
816 return IOleObject_Release(&This->IOleObject_iface);
819 static HRESULT WINAPI PersistStreamInit_GetClassID(IPersistStreamInit *iface, CLSID *pClassID)
821 WindowsMediaPlayer *This = impl_from_IPersistStreamInit(iface);
822 FIXME("(%p)->(%p)\n", This, pClassID);
823 return E_NOTIMPL;
826 static HRESULT WINAPI PersistStreamInit_IsDirty(IPersistStreamInit *iface)
828 WindowsMediaPlayer *This = impl_from_IPersistStreamInit(iface);
829 FIXME("(%p)\n", This);
830 return E_NOTIMPL;
833 static HRESULT WINAPI PersistStreamInit_Load(IPersistStreamInit *iface, LPSTREAM pStm)
835 WindowsMediaPlayer *This = impl_from_IPersistStreamInit(iface);
836 FIXME("(%p)->(%p)\n", This, pStm);
837 return E_NOTIMPL;
840 static HRESULT WINAPI PersistStreamInit_Save(IPersistStreamInit *iface, LPSTREAM pStm,
841 BOOL fClearDirty)
843 WindowsMediaPlayer *This = impl_from_IPersistStreamInit(iface);
844 FIXME("(%p)->(%p %x)\n", This, pStm, fClearDirty);
845 return E_NOTIMPL;
848 static HRESULT WINAPI PersistStreamInit_GetSizeMax(IPersistStreamInit *iface,
849 ULARGE_INTEGER *pcbSize)
851 WindowsMediaPlayer *This = impl_from_IPersistStreamInit(iface);
852 FIXME("(%p)->(%p)\n", This, pcbSize);
853 return E_NOTIMPL;
856 static HRESULT WINAPI PersistStreamInit_InitNew(IPersistStreamInit *iface)
858 WindowsMediaPlayer *This = impl_from_IPersistStreamInit(iface);
860 TRACE("(%p)\n", This);
862 if(!This->client_site)
863 return E_FAIL;
865 /* Nothing to do, yet. */
866 get_container_hwnd(This);
867 return S_OK;
870 static const IPersistStreamInitVtbl PersistStreamInitVtbl = {
871 PersistStreamInit_QueryInterface,
872 PersistStreamInit_AddRef,
873 PersistStreamInit_Release,
874 PersistStreamInit_GetClassID,
875 PersistStreamInit_IsDirty,
876 PersistStreamInit_Load,
877 PersistStreamInit_Save,
878 PersistStreamInit_GetSizeMax,
879 PersistStreamInit_InitNew
882 HRESULT WINAPI WMPFactory_CreateInstance(IClassFactory *iface, IUnknown *outer,
883 REFIID riid, void **ppv)
885 WindowsMediaPlayer *wmp;
886 DWORD dpi_x, dpi_y;
887 HDC hdc;
888 HRESULT hres;
890 TRACE("(%p %s %p)\n", outer, debugstr_guid(riid), ppv);
892 wmp = calloc(1, sizeof(*wmp));
893 if(!wmp)
894 return E_OUTOFMEMORY;
896 wmp->IOleObject_iface.lpVtbl = &OleObjectVtbl;
897 wmp->IProvideClassInfo2_iface.lpVtbl = &ProvideClassInfo2Vtbl;
898 wmp->IPersistStreamInit_iface.lpVtbl = &PersistStreamInitVtbl;
899 wmp->IOleInPlaceObjectWindowless_iface.lpVtbl = &OleInPlaceObjectWindowlessVtbl;
900 wmp->IOleControl_iface.lpVtbl = &OleControlVtbl;
902 wmp->ref = 1;
904 if (init_player(wmp)) {
905 ConnectionPointContainer_Init(wmp);
906 hdc = GetDC(0);
907 dpi_x = GetDeviceCaps(hdc, LOGPIXELSX);
908 dpi_y = GetDeviceCaps(hdc, LOGPIXELSY);
909 ReleaseDC(0, hdc);
911 wmp->extent.cx = MulDiv(192, 2540, dpi_x);
912 wmp->extent.cy = MulDiv(192, 2540, dpi_y);
914 hres = IOleObject_QueryInterface(&wmp->IOleObject_iface, riid, ppv);
915 } else {
916 hres = E_FAIL;
918 IOleObject_Release(&wmp->IOleObject_iface);
919 return hres;