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"
22 #include "wine/debug.h"
24 WINE_DEFAULT_DEBUG_CHANNEL(wmp
);
26 static HWND
get_container_hwnd(WindowsMediaPlayer
*This
)
28 IOleWindow
*ole_window
;
32 /* IOleInPlaceSite (which inherits from IOleWindow) is preferred. */
33 hres
= IOleClientSite_QueryInterface(This
->client_site
, &IID_IOleInPlaceSite
, (void**)&ole_window
);
35 hres
= IOleClientSite_QueryInterface(This
->client_site
, &IID_IOleWindow
, (void**)&ole_window
);
37 IOleContainer
*container
= NULL
;
39 hres
= IOleClientSite_GetContainer(This
->client_site
, &container
);
41 hres
= IOleContainer_QueryInterface(container
, &IID_IOleWindow
, (void**)&ole_window
);
42 IOleContainer_Release(container
);
50 hres
= IOleWindow_GetWindow(ole_window
, &hwnd
);
51 IOleWindow_Release(ole_window
);
55 TRACE("Got window %p\n", hwnd
);
59 static LRESULT WINAPI
wmp_wnd_proc(HWND hwnd
, UINT msg
, WPARAM wParam
, LPARAM lParam
)
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
);
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
,
106 wndclass
.hInstance
= wmp_instance
;
107 wmp_class
= RegisterClassExW(&wndclass
);
111 void unregister_wmp_class(void)
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
);
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
) };
142 FIXME("Already activated\n");
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
);
151 FIXME("Windowless activation not supported\n");
152 ipsiteex
= (IOleInPlaceSiteEx
*)ipsite_windowless
;
154 IOleClientSite_QueryInterface(This
->client_site
, &IID_IOleInPlaceSiteEx
, (void**)&ipsiteex
);
158 BOOL redraw
= FALSE
; /* Not really used. */
159 IOleInPlaceSiteEx_OnInPlaceActivateEx(ipsiteex
, &redraw
, 0);
160 ipsite
= (IOleInPlaceSite
*)ipsiteex
;
162 IOleClientSite_QueryInterface(This
->client_site
, &IID_IOleInPlaceSite
, (void**)&ipsite
);
164 FIXME("No IOleInPlaceSite instance\n");
168 IOleInPlaceSite_OnInPlaceActivate(ipsite
);
171 hres
= IOleInPlaceSite_GetWindowContext(ipsite
, &ip_frame
, &ip_window
, &posrect
, &cliprect
, &frameinfo
);
172 IOleInPlaceSite_Release(ipsite
);
174 FIXME("GetWindowContext failed: %08x\n", hres
);
178 This
->hwnd
= create_wmp_window(This
, &posrect
);
182 IOleClientSite_ShowObject(This
->client_site
);
186 static void deactivate_window(WindowsMediaPlayer
*This
)
188 IOleInPlaceSite
*ip_site
;
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
);
201 static void release_client_site(WindowsMediaPlayer
*This
)
203 if(!This
->client_site
)
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
);
224 if(IsEqualGUID(riid
, &IID_IUnknown
)) {
225 TRACE("(%p)->(IID_IUnknown %p)\n", This
, ppv
);
226 *ppv
= &This
->IOleObject_iface
;
227 }else if(IsEqualGUID(riid
, &IID_IOleObject
)) {
228 TRACE("(%p)->(IID_IOleObject %p)\n", This
, ppv
);
229 *ppv
= &This
->IOleObject_iface
;
230 }else if(IsEqualGUID(riid
, &IID_IProvideClassInfo
)) {
231 TRACE("(%p)->(IID_IProvideClassInfo %p)\n", This
, ppv
);
232 *ppv
= &This
->IProvideClassInfo2_iface
;
233 }else if(IsEqualGUID(riid
, &IID_IProvideClassInfo2
)) {
234 TRACE("(%p)->(IID_IProvideClassInfo2 %p)\n", This
, ppv
);
235 *ppv
= &This
->IProvideClassInfo2_iface
;
236 }else if(IsEqualGUID(riid
, &IID_IPersist
)) {
237 TRACE("(%p)->(IID_IPersist %p)\n", This
, ppv
);
238 *ppv
= &This
->IPersistStreamInit_iface
;
239 }else if(IsEqualGUID(riid
, &IID_IPersistStreamInit
)) {
240 TRACE("(%p)->(IID_IPersistStreamInit %p)\n", This
, ppv
);
241 *ppv
= &This
->IPersistStreamInit_iface
;
242 }else if(IsEqualGUID(riid
, &IID_IOleWindow
)) {
243 TRACE("(%p)->(IID_IOleWindow %p)\n", This
, ppv
);
244 *ppv
= &This
->IOleInPlaceObjectWindowless_iface
;
245 }else if(IsEqualGUID(riid
, &IID_IOleInPlaceObject
)) {
246 TRACE("(%p)->(IID_IOleInPlaceObject %p)\n", This
, ppv
);
247 *ppv
= &This
->IOleInPlaceObjectWindowless_iface
;
248 }else if(IsEqualGUID(riid
, &IID_IOleInPlaceObjectWindowless
)) {
249 TRACE("(%p)->(IID_IOleInPlaceObjectWindowless %p)\n", This
, ppv
);
250 *ppv
= &This
->IOleInPlaceObjectWindowless_iface
;
251 }else if(IsEqualGUID(riid
, &IID_IConnectionPointContainer
)) {
252 TRACE("(%p)->(IID_IConnectionPointContainer %p)\n", This
, ppv
);
253 *ppv
= &This
->IConnectionPointContainer_iface
;
254 }else if(IsEqualGUID(riid
, &IID_IWMPCore
)) {
255 TRACE("(%p)->(IID_IWMPCore %p)\n", This
, ppv
);
256 *ppv
= &This
->IWMPPlayer4_iface
;
257 }else if(IsEqualGUID(riid
, &IID_IWMPCore2
)) {
258 TRACE("(%p)->(IID_IWMPCore2 %p)\n", This
, ppv
);
259 *ppv
= &This
->IWMPPlayer4_iface
;
260 }else if(IsEqualGUID(riid
, &IID_IWMPCore3
)) {
261 TRACE("(%p)->(IID_IWMPCore3 %p)\n", This
, ppv
);
262 *ppv
= &This
->IWMPPlayer4_iface
;
263 }else if(IsEqualGUID(riid
, &IID_IWMPPlayer4
)) {
264 TRACE("(%p)->(IID_IWMPPlayer4 %p)\n", This
, ppv
);
265 *ppv
= &This
->IWMPPlayer4_iface
;
266 }else if(IsEqualGUID(riid
, &IID_IWMPSettings
)) {
267 TRACE("(%p)->(IID_IWMPSettings %p)\n", This
, ppv
);
268 *ppv
= &This
->IWMPSettings_iface
;
269 }else if(IsEqualGUID(riid
, &IID_IOleControl
)) {
270 TRACE("(%p)->(IID_IOleControl %p)\n", This
, ppv
);
271 *ppv
= &This
->IOleControl_iface
;
272 }else if(IsEqualGUID(riid
, &IID_IMarshal
)) {
273 TRACE("(%p)->(IID_IMarshal %p)\n", This
, ppv
);
274 return E_NOINTERFACE
;
275 }else if(IsEqualGUID(riid
, &IID_IQuickActivate
)) {
276 TRACE("(%p)->(IID_IQuickActivate %p)\n", This
, ppv
);
277 return E_NOINTERFACE
;
279 FIXME("(%p)->(%s %p)\n", This
, debugstr_guid(riid
), ppv
);
280 return E_NOINTERFACE
;
283 IUnknown_AddRef((IUnknown
*)*ppv
);
287 static ULONG WINAPI
OleObject_AddRef(IOleObject
*iface
)
289 WindowsMediaPlayer
*This
= impl_from_IOleObject(iface
);
290 LONG ref
= InterlockedIncrement(&This
->ref
);
292 TRACE("(%p) ref=%d\n", This
, ref
);
297 static ULONG WINAPI
OleObject_Release(IOleObject
*iface
)
299 WindowsMediaPlayer
*This
= impl_from_IOleObject(iface
);
300 LONG ref
= InterlockedDecrement(&This
->ref
);
302 TRACE("(%p) ref=%d\n", This
, ref
);
305 release_client_site(This
);
312 static HRESULT WINAPI
OleObject_SetClientSite(IOleObject
*iface
, IOleClientSite
*pClientSite
)
314 WindowsMediaPlayer
*This
= impl_from_IOleObject(iface
);
315 IOleControlSite
*control_site
;
318 TRACE("(%p)->(%p)\n", This
, pClientSite
);
320 release_client_site(This
);
324 IOleClientSite_AddRef(pClientSite
);
325 This
->client_site
= pClientSite
;
327 hres
= IOleClientSite_QueryInterface(pClientSite
, &IID_IOleControlSite
, (void**)&control_site
);
328 if(SUCCEEDED(hres
)) {
331 hres
= IOleControlSite_GetExtendedControl(control_site
, &disp
);
332 if(SUCCEEDED(hres
) && disp
) {
333 FIXME("Use extended control\n");
334 IDispatch_Release(disp
);
337 IOleControlSite_Release(control_site
);
343 static HRESULT WINAPI
OleObject_GetClientSite(IOleObject
*iface
, IOleClientSite
**ppClientSite
)
345 WindowsMediaPlayer
*This
= impl_from_IOleObject(iface
);
347 TRACE("(%p)->(%p)\n", This
, ppClientSite
);
349 *ppClientSite
= This
->client_site
;
350 return This
->client_site
? S_OK
: E_FAIL
;
353 static HRESULT WINAPI
OleObject_SetHostNames(IOleObject
*iface
, LPCOLESTR szContainerApp
, LPCOLESTR szContainerObj
)
355 WindowsMediaPlayer
*This
= impl_from_IOleObject(iface
);
356 FIXME("(%p)->(%s %s)\n", This
, debugstr_w(szContainerApp
), debugstr_w(szContainerObj
));
360 static HRESULT WINAPI
OleObject_Close(IOleObject
*iface
, DWORD dwSaveOption
)
362 WindowsMediaPlayer
*This
= impl_from_IOleObject(iface
);
364 TRACE("(%p)->(%08x)\n", This
, dwSaveOption
);
367 FIXME("Unsupported option %d\n", dwSaveOption
);
369 if(This
->hwnd
) /* FIXME: Possibly hide window */
370 deactivate_window(This
);
374 static HRESULT WINAPI
OleObject_SetMoniker(IOleObject
*iface
, DWORD dwWhichMoniker
, IMoniker
*pmk
)
376 WindowsMediaPlayer
*This
= impl_from_IOleObject(iface
);
377 FIXME("(%p %d %p)->()\n", This
, dwWhichMoniker
, pmk
);
381 static HRESULT WINAPI
OleObject_GetMoniker(IOleObject
*iface
, DWORD dwAssign
, DWORD dwWhichMoniker
, IMoniker
**ppmk
)
383 WindowsMediaPlayer
*This
= impl_from_IOleObject(iface
);
384 FIXME("(%p)->(%d %d %p)\n", This
, dwAssign
, dwWhichMoniker
, ppmk
);
388 static HRESULT WINAPI
OleObject_InitFromData(IOleObject
*iface
, IDataObject
*pDataObject
, BOOL fCreation
,
391 WindowsMediaPlayer
*This
= impl_from_IOleObject(iface
);
392 FIXME("(%p)->(%p %x %d)\n", This
, pDataObject
, fCreation
, dwReserved
);
396 static HRESULT WINAPI
OleObject_GetClipboardData(IOleObject
*iface
, DWORD dwReserved
, IDataObject
**ppDataObject
)
398 WindowsMediaPlayer
*This
= impl_from_IOleObject(iface
);
399 FIXME("(%p)->(%d %p)\n", This
, dwReserved
, ppDataObject
);
403 static HRESULT WINAPI
OleObject_DoVerb(IOleObject
*iface
, LONG iVerb
, LPMSG lpmsg
, IOleClientSite
*pActiveSite
,
404 LONG lindex
, HWND hwndParent
, LPCRECT lprcPosRect
)
406 WindowsMediaPlayer
*This
= impl_from_IOleObject(iface
);
409 case OLEIVERB_INPLACEACTIVATE
:
410 TRACE("(%p)->(OLEIVERB_INPLACEACTIVATE)\n", This
);
411 return activate_inplace(This
);
415 FIXME("No window to hide\n");
419 ShowWindow(This
->hwnd
, SW_HIDE
);
423 FIXME("Unsupported iVerb %d\n", iVerb
);
429 static HRESULT WINAPI
OleObject_EnumVerbs(IOleObject
*iface
, IEnumOLEVERB
**ppEnumOleVerb
)
431 WindowsMediaPlayer
*This
= impl_from_IOleObject(iface
);
432 FIXME("(%p)->(%p)\n", This
, ppEnumOleVerb
);
436 static HRESULT WINAPI
OleObject_Update(IOleObject
*iface
)
438 WindowsMediaPlayer
*This
= impl_from_IOleObject(iface
);
439 FIXME("(%p)\n", This
);
443 static HRESULT WINAPI
OleObject_IsUpToDate(IOleObject
*iface
)
445 WindowsMediaPlayer
*This
= impl_from_IOleObject(iface
);
446 FIXME("(%p)\n", This
);
450 static HRESULT WINAPI
OleObject_GetUserClassID(IOleObject
*iface
, CLSID
*pClsid
)
452 WindowsMediaPlayer
*This
= impl_from_IOleObject(iface
);
453 FIXME("(%p)->(%p)\n", This
, pClsid
);
457 static HRESULT WINAPI
OleObject_GetUserType(IOleObject
*iface
, DWORD dwFormOfType
, LPOLESTR
*pszUserType
)
459 WindowsMediaPlayer
*This
= impl_from_IOleObject(iface
);
460 FIXME("(%p)->(%d %p)\n", This
, dwFormOfType
, pszUserType
);
464 static HRESULT WINAPI
OleObject_SetExtent(IOleObject
*iface
, DWORD dwDrawAspect
, SIZEL
*psizel
)
466 WindowsMediaPlayer
*This
= impl_from_IOleObject(iface
);
468 TRACE("(%p)->(%d %p)\n", This
, dwDrawAspect
, psizel
);
470 if(dwDrawAspect
!= DVASPECT_CONTENT
)
471 return DV_E_DVASPECT
;
473 This
->extent
= *psizel
;
477 static HRESULT WINAPI
OleObject_GetExtent(IOleObject
*iface
, DWORD dwDrawAspect
, SIZEL
*psizel
)
479 WindowsMediaPlayer
*This
= impl_from_IOleObject(iface
);
481 TRACE("(%p)->(%d %p)\n", This
, dwDrawAspect
, psizel
);
483 if(dwDrawAspect
!= DVASPECT_CONTENT
)
486 *psizel
= This
->extent
;
490 static HRESULT WINAPI
OleObject_Advise(IOleObject
*iface
, IAdviseSink
*pAdvSink
, DWORD
*pdwConnection
)
492 WindowsMediaPlayer
*This
= impl_from_IOleObject(iface
);
493 FIXME("(%p)->(%p %p)\n", This
, pAdvSink
, pdwConnection
);
497 static HRESULT WINAPI
OleObject_Unadvise(IOleObject
*iface
, DWORD dwConnection
)
499 WindowsMediaPlayer
*This
= impl_from_IOleObject(iface
);
500 FIXME("(%p)->(%d)\n", This
, dwConnection
);
504 static HRESULT WINAPI
OleObject_EnumAdvise(IOleObject
*iface
, IEnumSTATDATA
**ppenumAdvise
)
506 WindowsMediaPlayer
*This
= impl_from_IOleObject(iface
);
507 FIXME("(%p)->(%p)\n", This
, ppenumAdvise
);
511 static HRESULT WINAPI
OleObject_GetMiscStatus(IOleObject
*iface
, DWORD dwAspect
, DWORD
*pdwStatus
)
513 WindowsMediaPlayer
*This
= impl_from_IOleObject(iface
);
515 TRACE("(%p)->(%d %p)\n", This
, dwAspect
, pdwStatus
);
518 case DVASPECT_CONTENT
:
519 *pdwStatus
= OLEMISC_SETCLIENTSITEFIRST
|OLEMISC_ACTIVATEWHENVISIBLE
|OLEMISC_INSIDEOUT
520 |OLEMISC_CANTLINKINSIDE
|OLEMISC_RECOMPOSEONRESIZE
;
523 FIXME("Unhandled aspect %d\n", dwAspect
);
530 static HRESULT WINAPI
OleObject_SetColorScheme(IOleObject
*iface
, LOGPALETTE
*pLogpal
)
532 WindowsMediaPlayer
*This
= impl_from_IOleObject(iface
);
533 FIXME("(%p)->(%p)\n", This
, pLogpal
);
537 static const IOleObjectVtbl OleObjectVtbl
= {
538 OleObject_QueryInterface
,
541 OleObject_SetClientSite
,
542 OleObject_GetClientSite
,
543 OleObject_SetHostNames
,
545 OleObject_SetMoniker
,
546 OleObject_GetMoniker
,
547 OleObject_InitFromData
,
548 OleObject_GetClipboardData
,
552 OleObject_IsUpToDate
,
553 OleObject_GetUserClassID
,
554 OleObject_GetUserType
,
559 OleObject_EnumAdvise
,
560 OleObject_GetMiscStatus
,
561 OleObject_SetColorScheme
564 static inline WindowsMediaPlayer
*impl_from_IOleInPlaceObjectWindowless(IOleInPlaceObjectWindowless
*iface
)
566 return CONTAINING_RECORD(iface
, WindowsMediaPlayer
, IOleInPlaceObjectWindowless_iface
);
569 static HRESULT WINAPI
OleInPlaceObjectWindowless_QueryInterface(IOleInPlaceObjectWindowless
*iface
,
570 REFIID riid
, void **ppv
)
572 WindowsMediaPlayer
*This
= impl_from_IOleInPlaceObjectWindowless(iface
);
573 return IOleObject_QueryInterface(&This
->IOleObject_iface
, riid
, ppv
);
576 static ULONG WINAPI
OleInPlaceObjectWindowless_AddRef(IOleInPlaceObjectWindowless
*iface
)
578 WindowsMediaPlayer
*This
= impl_from_IOleInPlaceObjectWindowless(iface
);
579 return IOleObject_AddRef(&This
->IOleObject_iface
);
582 static ULONG WINAPI
OleInPlaceObjectWindowless_Release(IOleInPlaceObjectWindowless
*iface
)
584 WindowsMediaPlayer
*This
= impl_from_IOleInPlaceObjectWindowless(iface
);
585 return IOleObject_Release(&This
->IOleObject_iface
);
588 static HRESULT WINAPI
OleInPlaceObjectWindowless_GetWindow(IOleInPlaceObjectWindowless
*iface
, HWND
*phwnd
)
590 WindowsMediaPlayer
*This
= impl_from_IOleInPlaceObjectWindowless(iface
);
592 TRACE("(%p)->(%p)\n", This
, phwnd
);
595 return This
->hwnd
? S_OK
: E_UNEXPECTED
;
598 static HRESULT WINAPI
OleInPlaceObjectWindowless_ContextSensitiveHelp(IOleInPlaceObjectWindowless
*iface
,
601 WindowsMediaPlayer
*This
= impl_from_IOleInPlaceObjectWindowless(iface
);
602 FIXME("(%p)->(%x)\n", This
, fEnterMode
);
606 static HRESULT WINAPI
OleInPlaceObjectWindowless_InPlaceDeactivate(IOleInPlaceObjectWindowless
*iface
)
608 WindowsMediaPlayer
*This
= impl_from_IOleInPlaceObjectWindowless(iface
);
609 FIXME("(%p)\n", This
);
613 static HRESULT WINAPI
OleInPlaceObjectWindowless_UIDeactivate(IOleInPlaceObjectWindowless
*iface
)
615 WindowsMediaPlayer
*This
= impl_from_IOleInPlaceObjectWindowless(iface
);
616 FIXME("(%p)\n", This
);
620 static HRESULT WINAPI
OleInPlaceObjectWindowless_SetObjectRects(IOleInPlaceObjectWindowless
*iface
,
621 LPCRECT lprcPosRect
, LPCRECT lprcClipRect
)
623 WindowsMediaPlayer
*This
= impl_from_IOleInPlaceObjectWindowless(iface
);
625 TRACE("(%p)->(%s %s)\n", This
, wine_dbgstr_rect(lprcPosRect
), wine_dbgstr_rect(lprcClipRect
));
628 SetWindowPos(This
->hwnd
, NULL
, lprcPosRect
->left
, lprcPosRect
->top
,
629 lprcPosRect
->right
-lprcPosRect
->left
, lprcPosRect
->bottom
-lprcPosRect
->top
,
630 SWP_NOZORDER
| SWP_NOACTIVATE
);
636 static HRESULT WINAPI
OleInPlaceObjectWindowless_ReactivateAndUndo(IOleInPlaceObjectWindowless
*iface
)
638 WindowsMediaPlayer
*This
= impl_from_IOleInPlaceObjectWindowless(iface
);
639 FIXME("(%p)\n", This
);
643 static HRESULT WINAPI
OleInPlaceObjectWindowless_OnWindowMessage(IOleInPlaceObjectWindowless
*iface
,
644 UINT msg
, WPARAM wParam
, LPARAM lParam
, LRESULT
*lpResult
)
646 WindowsMediaPlayer
*This
= impl_from_IOleInPlaceObjectWindowless(iface
);
647 FIXME("(%p)->(%u %lu %lu %p)\n", This
, msg
, wParam
, lParam
, lpResult
);
651 static HRESULT WINAPI
OleInPlaceObjectWindowless_GetDropTarget(IOleInPlaceObjectWindowless
*iface
,
652 IDropTarget
**ppDropTarget
)
654 WindowsMediaPlayer
*This
= impl_from_IOleInPlaceObjectWindowless(iface
);
655 FIXME("(%p)->(%p)\n", This
, ppDropTarget
);
659 static const IOleInPlaceObjectWindowlessVtbl OleInPlaceObjectWindowlessVtbl
= {
660 OleInPlaceObjectWindowless_QueryInterface
,
661 OleInPlaceObjectWindowless_AddRef
,
662 OleInPlaceObjectWindowless_Release
,
663 OleInPlaceObjectWindowless_GetWindow
,
664 OleInPlaceObjectWindowless_ContextSensitiveHelp
,
665 OleInPlaceObjectWindowless_InPlaceDeactivate
,
666 OleInPlaceObjectWindowless_UIDeactivate
,
667 OleInPlaceObjectWindowless_SetObjectRects
,
668 OleInPlaceObjectWindowless_ReactivateAndUndo
,
669 OleInPlaceObjectWindowless_OnWindowMessage
,
670 OleInPlaceObjectWindowless_GetDropTarget
673 static inline WindowsMediaPlayer
*impl_from_IOleControl(IOleControl
*iface
)
675 return CONTAINING_RECORD(iface
, WindowsMediaPlayer
, IOleControl_iface
);
678 static HRESULT WINAPI
OleControl_QueryInterface(IOleControl
*iface
, REFIID riid
, void **ppv
)
680 WindowsMediaPlayer
*This
= impl_from_IOleControl(iface
);
681 return IOleObject_QueryInterface(&This
->IOleObject_iface
, riid
, ppv
);
684 static ULONG WINAPI
OleControl_AddRef(IOleControl
*iface
)
686 WindowsMediaPlayer
*This
= impl_from_IOleControl(iface
);
687 return IOleObject_AddRef(&This
->IOleObject_iface
);
690 static ULONG WINAPI
OleControl_Release(IOleControl
*iface
)
692 WindowsMediaPlayer
*This
= impl_from_IOleControl(iface
);
693 return IOleObject_Release(&This
->IOleObject_iface
);
696 static HRESULT WINAPI
OleControl_GetControlInfo(IOleControl
*iface
, CONTROLINFO
*pCI
)
698 WindowsMediaPlayer
*This
= impl_from_IOleControl(iface
);
699 FIXME("(%p)->(%p)\n", This
, pCI
);
703 static HRESULT WINAPI
OleControl_OnMnemonic(IOleControl
*iface
, MSG
*msg
)
705 WindowsMediaPlayer
*This
= impl_from_IOleControl(iface
);
706 FIXME("(%p)->(%p)\n", This
, msg
);
710 static HRESULT WINAPI
OleControl_OnAmbientPropertyChange(IOleControl
*iface
, DISPID dispID
)
712 WindowsMediaPlayer
*This
= impl_from_IOleControl(iface
);
713 FIXME("(%p)->(%d)\n", This
, dispID
);
717 static HRESULT WINAPI
OleControl_FreezeEvents(IOleControl
*iface
, BOOL freeze
)
719 WindowsMediaPlayer
*This
= impl_from_IOleControl(iface
);
720 FIXME("(%p)->(%x)\n", This
, freeze
);
724 static const IOleControlVtbl OleControlVtbl
= {
725 OleControl_QueryInterface
,
728 OleControl_GetControlInfo
,
729 OleControl_OnMnemonic
,
730 OleControl_OnAmbientPropertyChange
,
731 OleControl_FreezeEvents
734 static inline WindowsMediaPlayer
*impl_from_IProvideClassInfo2(IProvideClassInfo2
*iface
)
736 return CONTAINING_RECORD(iface
, WindowsMediaPlayer
, IProvideClassInfo2_iface
);
739 static HRESULT WINAPI
ProvideClassInfo2_QueryInterface(IProvideClassInfo2
*iface
, REFIID riid
, void **ppv
)
741 WindowsMediaPlayer
*This
= impl_from_IProvideClassInfo2(iface
);
742 return IOleObject_QueryInterface(&This
->IOleObject_iface
, riid
, ppv
);
745 static ULONG WINAPI
ProvideClassInfo2_AddRef(IProvideClassInfo2
*iface
)
747 WindowsMediaPlayer
*This
= impl_from_IProvideClassInfo2(iface
);
748 return IOleObject_AddRef(&This
->IOleObject_iface
);
751 static ULONG WINAPI
ProvideClassInfo2_Release(IProvideClassInfo2
*iface
)
753 WindowsMediaPlayer
*This
= impl_from_IProvideClassInfo2(iface
);
754 return IOleObject_Release(&This
->IOleObject_iface
);
757 static HRESULT WINAPI
ProvideClassInfo2_GetClassInfo(IProvideClassInfo2
*iface
, ITypeInfo
**ppTI
)
759 WindowsMediaPlayer
*This
= impl_from_IProvideClassInfo2(iface
);
760 FIXME("(%p)->(%p)\n", This
, ppTI
);
764 static HRESULT WINAPI
ProvideClassInfo2_GetGUID(IProvideClassInfo2
*iface
, DWORD dwGuidKind
, GUID
*pGUID
)
766 WindowsMediaPlayer
*This
= impl_from_IProvideClassInfo2(iface
);
768 TRACE("(%p)->(%d %p)\n", This
, dwGuidKind
, pGUID
);
770 if(dwGuidKind
!= GUIDKIND_DEFAULT_SOURCE_DISP_IID
) {
771 FIXME("Unexpected dwGuidKind %d\n", dwGuidKind
);
775 *pGUID
= IID__WMPOCXEvents
;
779 static const IProvideClassInfo2Vtbl ProvideClassInfo2Vtbl
= {
780 ProvideClassInfo2_QueryInterface
,
781 ProvideClassInfo2_AddRef
,
782 ProvideClassInfo2_Release
,
783 ProvideClassInfo2_GetClassInfo
,
784 ProvideClassInfo2_GetGUID
787 static inline WindowsMediaPlayer
*impl_from_IPersistStreamInit(IPersistStreamInit
*iface
)
789 return CONTAINING_RECORD(iface
, WindowsMediaPlayer
, IPersistStreamInit_iface
);
792 static HRESULT WINAPI
PersistStreamInit_QueryInterface(IPersistStreamInit
*iface
,
793 REFIID riid
, void **ppv
)
795 WindowsMediaPlayer
*This
= impl_from_IPersistStreamInit(iface
);
796 return IOleObject_QueryInterface(&This
->IOleObject_iface
, riid
, ppv
);
799 static ULONG WINAPI
PersistStreamInit_AddRef(IPersistStreamInit
*iface
)
801 WindowsMediaPlayer
*This
= impl_from_IPersistStreamInit(iface
);
802 return IOleObject_AddRef(&This
->IOleObject_iface
);
805 static ULONG WINAPI
PersistStreamInit_Release(IPersistStreamInit
*iface
)
807 WindowsMediaPlayer
*This
= impl_from_IPersistStreamInit(iface
);
808 return IOleObject_Release(&This
->IOleObject_iface
);
811 static HRESULT WINAPI
PersistStreamInit_GetClassID(IPersistStreamInit
*iface
, CLSID
*pClassID
)
813 WindowsMediaPlayer
*This
= impl_from_IPersistStreamInit(iface
);
814 FIXME("(%p)->(%p)\n", This
, pClassID
);
818 static HRESULT WINAPI
PersistStreamInit_IsDirty(IPersistStreamInit
*iface
)
820 WindowsMediaPlayer
*This
= impl_from_IPersistStreamInit(iface
);
821 FIXME("(%p)\n", This
);
825 static HRESULT WINAPI
PersistStreamInit_Load(IPersistStreamInit
*iface
, LPSTREAM pStm
)
827 WindowsMediaPlayer
*This
= impl_from_IPersistStreamInit(iface
);
828 FIXME("(%p)->(%p)\n", This
, pStm
);
832 static HRESULT WINAPI
PersistStreamInit_Save(IPersistStreamInit
*iface
, LPSTREAM pStm
,
835 WindowsMediaPlayer
*This
= impl_from_IPersistStreamInit(iface
);
836 FIXME("(%p)->(%p %x)\n", This
, pStm
, fClearDirty
);
840 static HRESULT WINAPI
PersistStreamInit_GetSizeMax(IPersistStreamInit
*iface
,
841 ULARGE_INTEGER
*pcbSize
)
843 WindowsMediaPlayer
*This
= impl_from_IPersistStreamInit(iface
);
844 FIXME("(%p)->(%p)\n", This
, pcbSize
);
848 static HRESULT WINAPI
PersistStreamInit_InitNew(IPersistStreamInit
*iface
)
850 WindowsMediaPlayer
*This
= impl_from_IPersistStreamInit(iface
);
852 TRACE("(%p)\n", This
);
854 if(!This
->client_site
)
857 /* Nothing to do, yet. */
858 get_container_hwnd(This
);
862 static const IPersistStreamInitVtbl PersistStreamInitVtbl
= {
863 PersistStreamInit_QueryInterface
,
864 PersistStreamInit_AddRef
,
865 PersistStreamInit_Release
,
866 PersistStreamInit_GetClassID
,
867 PersistStreamInit_IsDirty
,
868 PersistStreamInit_Load
,
869 PersistStreamInit_Save
,
870 PersistStreamInit_GetSizeMax
,
871 PersistStreamInit_InitNew
874 static inline WindowsMediaPlayer
*impl_from_IConnectionPointContainer(IConnectionPointContainer
*iface
)
876 return CONTAINING_RECORD(iface
, WindowsMediaPlayer
, IConnectionPointContainer_iface
);
879 static HRESULT WINAPI
ConnectionPointContainer_QueryInterface(IConnectionPointContainer
*iface
,
880 REFIID riid
, LPVOID
*ppv
)
882 WindowsMediaPlayer
*This
= impl_from_IConnectionPointContainer(iface
);
883 return IOleObject_QueryInterface(&This
->IOleObject_iface
, riid
, ppv
);
886 static ULONG WINAPI
ConnectionPointContainer_AddRef(IConnectionPointContainer
*iface
)
888 WindowsMediaPlayer
*This
= impl_from_IConnectionPointContainer(iface
);
889 return IOleObject_AddRef(&This
->IOleObject_iface
);
892 static ULONG WINAPI
ConnectionPointContainer_Release(IConnectionPointContainer
*iface
)
894 WindowsMediaPlayer
*This
= impl_from_IConnectionPointContainer(iface
);
895 return IOleObject_Release(&This
->IOleObject_iface
);
898 static HRESULT WINAPI
ConnectionPointContainer_EnumConnectionPoints(IConnectionPointContainer
*iface
,
899 IEnumConnectionPoints
**ppEnum
)
901 WindowsMediaPlayer
*This
= impl_from_IConnectionPointContainer(iface
);
902 FIXME("(%p)->(%p)\n", This
, ppEnum
);
906 static HRESULT WINAPI
ConnectionPointContainer_FindConnectionPoint(IConnectionPointContainer
*iface
,
907 REFIID riid
, IConnectionPoint
**ppCP
)
909 WindowsMediaPlayer
*This
= impl_from_IConnectionPointContainer(iface
);
910 FIXME("(%p)->(%s %p)\n", This
, debugstr_guid(riid
), ppCP
);
911 return CONNECT_E_NOCONNECTION
;
914 static const IConnectionPointContainerVtbl ConnectionPointContainerVtbl
=
916 ConnectionPointContainer_QueryInterface
,
917 ConnectionPointContainer_AddRef
,
918 ConnectionPointContainer_Release
,
919 ConnectionPointContainer_EnumConnectionPoints
,
920 ConnectionPointContainer_FindConnectionPoint
923 HRESULT WINAPI
WMPFactory_CreateInstance(IClassFactory
*iface
, IUnknown
*outer
,
924 REFIID riid
, void **ppv
)
926 WindowsMediaPlayer
*wmp
;
931 TRACE("(%p %s %p)\n", outer
, debugstr_guid(riid
), ppv
);
933 wmp
= heap_alloc_zero(sizeof(*wmp
));
935 return E_OUTOFMEMORY
;
937 wmp
->IOleObject_iface
.lpVtbl
= &OleObjectVtbl
;
938 wmp
->IProvideClassInfo2_iface
.lpVtbl
= &ProvideClassInfo2Vtbl
;
939 wmp
->IPersistStreamInit_iface
.lpVtbl
= &PersistStreamInitVtbl
;
940 wmp
->IOleInPlaceObjectWindowless_iface
.lpVtbl
= &OleInPlaceObjectWindowlessVtbl
;
941 wmp
->IConnectionPointContainer_iface
.lpVtbl
= &ConnectionPointContainerVtbl
;
942 wmp
->IOleControl_iface
.lpVtbl
= &OleControlVtbl
;
946 init_player_ifaces(wmp
);
949 dpi_x
= GetDeviceCaps(hdc
, LOGPIXELSX
);
950 dpi_y
= GetDeviceCaps(hdc
, LOGPIXELSY
);
953 wmp
->extent
.cx
= MulDiv(192, 2540, dpi_x
);
954 wmp
->extent
.cy
= MulDiv(192, 2540, dpi_y
);
956 hres
= IOleObject_QueryInterface(&wmp
->IOleObject_iface
, riid
, ppv
);
957 IOleObject_Release(&wmp
->IOleObject_iface
);