| /* | |
| * Copyright 2014 Jacek Caban for CodeWeavers | |
| * | |
| * This library is free software; you can redistribute it and/or | |
| * modify it under the terms of the GNU Lesser General Public | |
| * License as published by the Free Software Foundation; either | |
| * version 2.1 of the License, or (at your option) any later version. | |
| * | |
| * This library is distributed in the hope that it will be useful, | |
| * but WITHOUT ANY WARRANTY; without even the implied warranty of | |
| * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |
| * Lesser General Public License for more details. | |
| * | |
| * You should have received a copy of the GNU Lesser General Public | |
| * License along with this library; if not, write to the Free Software | |
| * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA | |
| */ | |
| #include "wmp_private.h" | |
| #include "olectl.h" | |
| #include "wine/debug.h" | |
| WINE_DEFAULT_DEBUG_CHANNEL(wmp); | |
| static HWND get_container_hwnd(WindowsMediaPlayer *This) | |
| { | |
| IOleWindow *ole_window; | |
| HWND hwnd = NULL; | |
| HRESULT hres; | |
| /* IOleInPlaceSite (which inherits from IOleWindow) is preferred. */ | |
| hres = IOleClientSite_QueryInterface(This->client_site, &IID_IOleInPlaceSite, (void**)&ole_window); | |
| if(FAILED(hres)) { | |
| hres = IOleClientSite_QueryInterface(This->client_site, &IID_IOleWindow, (void**)&ole_window); | |
| if(FAILED(hres)) { | |
| IOleContainer *container = NULL; | |
| hres = IOleClientSite_GetContainer(This->client_site, &container); | |
| if(SUCCEEDED(hres)) { | |
| hres = IOleContainer_QueryInterface(container, &IID_IOleWindow, (void**)&ole_window); | |
| IOleContainer_Release(container); | |
| } | |
| } | |
| } | |
| if(FAILED(hres)) | |
| return NULL; | |
| hres = IOleWindow_GetWindow(ole_window, &hwnd); | |
| IOleWindow_Release(ole_window); | |
| if(FAILED(hres)) | |
| return NULL; | |
| TRACE("Got window %p\n", hwnd); | |
| return hwnd; | |
| } | |
| static LRESULT WINAPI wmp_wnd_proc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) | |
| { | |
| switch(msg) { | |
| case WM_PAINT: { | |
| PAINTSTRUCT ps; | |
| HFONT font; | |
| RECT rect; | |
| HDC hdc; | |
| TRACE("WM_PAINT\n"); | |
| GetClientRect(hwnd, &rect); | |
| hdc = BeginPaint(hwnd, &ps); | |
| SelectObject(hdc, GetStockObject(DC_BRUSH)); | |
| SetDCBrushColor(hdc, RGB(255,0,0)); | |
| SetBkColor(hdc, RGB(255,0,0)); | |
| font = CreateFontA(25,0,0,0,400,0,0,0,ANSI_CHARSET,0,0,DEFAULT_QUALITY,DEFAULT_PITCH,NULL); | |
| SelectObject(hdc, font); | |
| Rectangle(hdc, rect.left, rect.top, rect.right, rect.bottom); | |
| DrawTextA(hdc, "FIXME: WMP", -1, &rect, DT_CENTER | DT_SINGLELINE | DT_VCENTER); | |
| DeleteObject(font); | |
| EndPaint(hwnd, &ps); | |
| break; | |
| } | |
| } | |
| return DefWindowProcW(hwnd, msg, wParam, lParam); | |
| } | |
| static ATOM wmp_class; | |
| static BOOL WINAPI register_wmp_class(INIT_ONCE *once, void *param, void **context) | |
| { | |
| /* It seems that native uses ATL for this. We use a fake name to make tests happy. */ | |
| static const WCHAR atl_wmpW[] = {'A','T','L',':','W','M','P',0}; | |
| static WNDCLASSEXW wndclass = { | |
| sizeof(wndclass), CS_DBLCLKS, wmp_wnd_proc, 0, 0, | |
| NULL, NULL, NULL, NULL, NULL, | |
| atl_wmpW, NULL | |
| }; | |
| wndclass.hInstance = wmp_instance; | |
| wmp_class = RegisterClassExW(&wndclass); | |
| return TRUE; | |
| } | |
| void unregister_wmp_class(void) | |
| { | |
| if(wmp_class) | |
| UnregisterClassW(MAKEINTRESOURCEW(wmp_class), wmp_instance); | |
| } | |
| static HWND create_wmp_window(WindowsMediaPlayer *wmp, const RECT *posrect) | |
| { | |
| static INIT_ONCE class_init_once = INIT_ONCE_STATIC_INIT; | |
| InitOnceExecuteOnce(&class_init_once, register_wmp_class, NULL, NULL); | |
| if(!wmp_class) | |
| return NULL; | |
| return CreateWindowExW(0, MAKEINTRESOURCEW(wmp_class), NULL, WS_CLIPCHILDREN|WS_CLIPSIBLINGS|WS_VISIBLE|WS_CHILD, | |
| posrect->left, posrect->top, posrect->right-posrect->left, posrect->bottom-posrect->top, | |
| get_container_hwnd(wmp), NULL, wmp_instance, NULL); | |
| } | |
| static HRESULT activate_inplace(WindowsMediaPlayer *This) | |
| { | |
| IOleInPlaceSiteWindowless *ipsite_windowless; | |
| IOleInPlaceSiteEx *ipsiteex = NULL; | |
| IOleInPlaceSite *ipsite; | |
| IOleInPlaceUIWindow *ip_window = NULL; | |
| IOleInPlaceFrame *ip_frame = NULL; | |
| RECT posrect = {0}, cliprect = {0}; | |
| OLEINPLACEFRAMEINFO frameinfo = { sizeof(frameinfo) }; | |
| HRESULT hres; | |
| if(This->hwnd) { | |
| FIXME("Already activated\n"); | |
| return E_UNEXPECTED; | |
| } | |
| hres = IOleClientSite_QueryInterface(This->client_site, &IID_IOleInPlaceSiteWindowless, (void**)&ipsite_windowless); | |
| if(SUCCEEDED(hres)) { | |
| hres = IOleInPlaceSiteWindowless_CanWindowlessActivate(ipsite_windowless); | |
| IOleInPlaceSiteWindowless_Release(ipsite_windowless); | |
| if(hres == S_OK) | |
| FIXME("Windowless activation not supported\n"); | |
| ipsiteex = (IOleInPlaceSiteEx*)ipsite_windowless; | |
| }else { | |
| IOleClientSite_QueryInterface(This->client_site, &IID_IOleInPlaceSiteEx, (void**)&ipsiteex); | |
| } | |
| if(ipsiteex) { | |
| BOOL redraw = FALSE; /* Not really used. */ | |
| IOleInPlaceSiteEx_OnInPlaceActivateEx(ipsiteex, &redraw, 0); | |
| ipsite = (IOleInPlaceSite*)ipsiteex; | |
| }else { | |
| IOleClientSite_QueryInterface(This->client_site, &IID_IOleInPlaceSite, (void**)&ipsite); | |
| if(FAILED(hres)) { | |
| FIXME("No IOleInPlaceSite instance\n"); | |
| return hres; | |
| } | |
| IOleInPlaceSite_OnInPlaceActivate(ipsite); | |
| } | |
| hres = IOleInPlaceSite_GetWindowContext(ipsite, &ip_frame, &ip_window, &posrect, &cliprect, &frameinfo); | |
| IOleInPlaceSite_Release(ipsite); | |
| if(FAILED(hres)) { | |
| FIXME("GetWindowContext failed: %08x\n", hres); | |
| return hres; | |
| } | |
| This->hwnd = create_wmp_window(This, &posrect); | |
| if(!This->hwnd) | |
| return E_FAIL; | |
| IOleClientSite_ShowObject(This->client_site); | |
| return S_OK; | |
| } | |
| static void deactivate_window(WindowsMediaPlayer *This) | |
| { | |
| IOleInPlaceSite *ip_site; | |
| HRESULT hres; | |
| hres = IOleClientSite_QueryInterface(This->client_site, &IID_IOleInPlaceSite, (void**)&ip_site); | |
| if(SUCCEEDED(hres)) { | |
| IOleInPlaceSite_OnInPlaceDeactivate(ip_site); | |
| IOleInPlaceSite_Release(ip_site); | |
| } | |
| DestroyWindow(This->hwnd); | |
| This->hwnd = NULL; | |
| } | |
| static void release_client_site(WindowsMediaPlayer *This) | |
| { | |
| if(!This->client_site) | |
| return; | |
| if(This->hwnd) | |
| deactivate_window(This); | |
| IOleClientSite_Release(This->client_site); | |
| This->client_site = NULL; | |
| } | |
| static inline WindowsMediaPlayer *impl_from_IOleObject(IOleObject *iface) | |
| { | |
| return CONTAINING_RECORD(iface, WindowsMediaPlayer, IOleObject_iface); | |
| } | |
| static HRESULT WINAPI OleObject_QueryInterface(IOleObject *iface, REFIID riid, void **ppv) | |
| { | |
| WindowsMediaPlayer *This = impl_from_IOleObject(iface); | |
| *ppv = NULL; | |
| if(IsEqualGUID(riid, &IID_IUnknown)) { | |
| TRACE("(%p)->(IID_IUnknown %p)\n", This, ppv); | |
| *ppv = &This->IOleObject_iface; | |
| }else if(IsEqualGUID(riid, &IID_IOleObject)) { | |
| TRACE("(%p)->(IID_IOleObject %p)\n", This, ppv); | |
| *ppv = &This->IOleObject_iface; | |
| }else if(IsEqualGUID(riid, &IID_IProvideClassInfo)) { | |
| TRACE("(%p)->(IID_IProvideClassInfo %p)\n", This, ppv); | |
| *ppv = &This->IProvideClassInfo2_iface; | |
| }else if(IsEqualGUID(riid, &IID_IProvideClassInfo2)) { | |
| TRACE("(%p)->(IID_IProvideClassInfo2 %p)\n", This, ppv); | |
| *ppv = &This->IProvideClassInfo2_iface; | |
| }else if(IsEqualGUID(riid, &IID_IPersist)) { | |
| TRACE("(%p)->(IID_IPersist %p)\n", This, ppv); | |
| *ppv = &This->IPersistStreamInit_iface; | |
| }else if(IsEqualGUID(riid, &IID_IPersistStreamInit)) { | |
| TRACE("(%p)->(IID_IPersistStreamInit %p)\n", This, ppv); | |
| *ppv = &This->IPersistStreamInit_iface; | |
| }else if(IsEqualGUID(riid, &IID_IOleWindow)) { | |
| TRACE("(%p)->(IID_IOleWindow %p)\n", This, ppv); | |
| *ppv = &This->IOleInPlaceObjectWindowless_iface; | |
| }else if(IsEqualGUID(riid, &IID_IOleInPlaceObject)) { | |
| TRACE("(%p)->(IID_IOleInPlaceObject %p)\n", This, ppv); | |
| *ppv = &This->IOleInPlaceObjectWindowless_iface; | |
| }else if(IsEqualGUID(riid, &IID_IOleInPlaceObjectWindowless)) { | |
| TRACE("(%p)->(IID_IOleInPlaceObjectWindowless %p)\n", This, ppv); | |
| *ppv = &This->IOleInPlaceObjectWindowless_iface; | |
| }else if(IsEqualGUID(riid, &IID_IConnectionPointContainer)) { | |
| TRACE("(%p)->(IID_IConnectionPointContainer %p)\n", This, ppv); | |
| *ppv = &This->IConnectionPointContainer_iface; | |
| }else if(IsEqualGUID(riid, &IID_IWMPCore)) { | |
| TRACE("(%p)->(IID_IWMPCore %p)\n", This, ppv); | |
| *ppv = &This->IWMPPlayer4_iface; | |
| }else if(IsEqualGUID(riid, &IID_IWMPCore2)) { | |
| TRACE("(%p)->(IID_IWMPCore2 %p)\n", This, ppv); | |
| *ppv = &This->IWMPPlayer4_iface; | |
| }else if(IsEqualGUID(riid, &IID_IWMPCore3)) { | |
| TRACE("(%p)->(IID_IWMPCore3 %p)\n", This, ppv); | |
| *ppv = &This->IWMPPlayer4_iface; | |
| }else if(IsEqualGUID(riid, &IID_IWMPPlayer4)) { | |
| TRACE("(%p)->(IID_IWMPPlayer4 %p)\n", This, ppv); | |
| *ppv = &This->IWMPPlayer4_iface; | |
| }else if(IsEqualGUID(riid, &IID_IWMPSettings)) { | |
| TRACE("(%p)->(IID_IWMPSettings %p)\n", This, ppv); | |
| *ppv = &This->IWMPSettings_iface; | |
| }else if(IsEqualGUID(riid, &IID_IOleControl)) { | |
| TRACE("(%p)->(IID_IOleControl %p)\n", This, ppv); | |
| *ppv = &This->IOleControl_iface; | |
| }else if(IsEqualGUID(riid, &IID_IMarshal)) { | |
| TRACE("(%p)->(IID_IMarshal %p)\n", This, ppv); | |
| return E_NOINTERFACE; | |
| }else if(IsEqualGUID(riid, &IID_IQuickActivate)) { | |
| TRACE("(%p)->(IID_IQuickActivate %p)\n", This, ppv); | |
| return E_NOINTERFACE; | |
| }else { | |
| FIXME("(%p)->(%s %p)\n", This, debugstr_guid(riid), ppv); | |
| return E_NOINTERFACE; | |
| } | |
| IUnknown_AddRef((IUnknown*)*ppv); | |
| return S_OK; | |
| } | |
| static ULONG WINAPI OleObject_AddRef(IOleObject *iface) | |
| { | |
| WindowsMediaPlayer *This = impl_from_IOleObject(iface); | |
| LONG ref = InterlockedIncrement(&This->ref); | |
| TRACE("(%p) ref=%d\n", This, ref); | |
| return ref; | |
| } | |
| static ULONG WINAPI OleObject_Release(IOleObject *iface) | |
| { | |
| WindowsMediaPlayer *This = impl_from_IOleObject(iface); | |
| LONG ref = InterlockedDecrement(&This->ref); | |
| TRACE("(%p) ref=%d\n", This, ref); | |
| if(!ref) { | |
| release_client_site(This); | |
| heap_free(This); | |
| } | |
| return ref; | |
| } | |
| static HRESULT WINAPI OleObject_SetClientSite(IOleObject *iface, IOleClientSite *pClientSite) | |
| { | |
| WindowsMediaPlayer *This = impl_from_IOleObject(iface); | |
| IOleControlSite *control_site; | |
| HRESULT hres; | |
| TRACE("(%p)->(%p)\n", This, pClientSite); | |
| release_client_site(This); | |
| if(!pClientSite) | |
| return S_OK; | |
| IOleClientSite_AddRef(pClientSite); | |
| This->client_site = pClientSite; | |
| hres = IOleClientSite_QueryInterface(pClientSite, &IID_IOleControlSite, (void**)&control_site); | |
| if(SUCCEEDED(hres)) { | |
| IDispatch *disp; | |
| hres = IOleControlSite_GetExtendedControl(control_site, &disp); | |
| if(SUCCEEDED(hres) && disp) { | |
| FIXME("Use extended control\n"); | |
| IDispatch_Release(disp); | |
| } | |
| IOleControlSite_Release(control_site); | |
| } | |
| return S_OK; | |
| } | |
| static HRESULT WINAPI OleObject_GetClientSite(IOleObject *iface, IOleClientSite **ppClientSite) | |
| { | |
| WindowsMediaPlayer *This = impl_from_IOleObject(iface); | |
| TRACE("(%p)->(%p)\n", This, ppClientSite); | |
| *ppClientSite = This->client_site; | |
| return This->client_site ? S_OK : E_FAIL; | |
| } | |
| static HRESULT WINAPI OleObject_SetHostNames(IOleObject *iface, LPCOLESTR szContainerApp, LPCOLESTR szContainerObj) | |
| { | |
| WindowsMediaPlayer *This = impl_from_IOleObject(iface); | |
| FIXME("(%p)->(%s %s)\n", This, debugstr_w(szContainerApp), debugstr_w(szContainerObj)); | |
| return E_NOTIMPL; | |
| } | |
| static HRESULT WINAPI OleObject_Close(IOleObject *iface, DWORD dwSaveOption) | |
| { | |
| WindowsMediaPlayer *This = impl_from_IOleObject(iface); | |
| TRACE("(%p)->(%08x)\n", This, dwSaveOption); | |
| if(dwSaveOption) | |
| FIXME("Unsupported option %d\n", dwSaveOption); | |
| if(This->hwnd) /* FIXME: Possibly hide window */ | |
| deactivate_window(This); | |
| return S_OK; | |
| } | |
| static HRESULT WINAPI OleObject_SetMoniker(IOleObject *iface, DWORD dwWhichMoniker, IMoniker *pmk) | |
| { | |
| WindowsMediaPlayer *This = impl_from_IOleObject(iface); | |
| FIXME("(%p %d %p)->()\n", This, dwWhichMoniker, pmk); | |
| return E_NOTIMPL; | |
| } | |
| static HRESULT WINAPI OleObject_GetMoniker(IOleObject *iface, DWORD dwAssign, DWORD dwWhichMoniker, IMoniker **ppmk) | |
| { | |
| WindowsMediaPlayer *This = impl_from_IOleObject(iface); | |
| FIXME("(%p)->(%d %d %p)\n", This, dwAssign, dwWhichMoniker, ppmk); | |
| return E_NOTIMPL; | |
| } | |
| static HRESULT WINAPI OleObject_InitFromData(IOleObject *iface, IDataObject *pDataObject, BOOL fCreation, | |
| DWORD dwReserved) | |
| { | |
| WindowsMediaPlayer *This = impl_from_IOleObject(iface); | |
| FIXME("(%p)->(%p %x %d)\n", This, pDataObject, fCreation, dwReserved); | |
| return E_NOTIMPL; | |
| } | |
| static HRESULT WINAPI OleObject_GetClipboardData(IOleObject *iface, DWORD dwReserved, IDataObject **ppDataObject) | |
| { | |
| WindowsMediaPlayer *This = impl_from_IOleObject(iface); | |
| FIXME("(%p)->(%d %p)\n", This, dwReserved, ppDataObject); | |
| return E_NOTIMPL; | |
| } | |
| static HRESULT WINAPI OleObject_DoVerb(IOleObject *iface, LONG iVerb, LPMSG lpmsg, IOleClientSite *pActiveSite, | |
| LONG lindex, HWND hwndParent, LPCRECT lprcPosRect) | |
| { | |
| WindowsMediaPlayer *This = impl_from_IOleObject(iface); | |
| switch(iVerb) { | |
| case OLEIVERB_INPLACEACTIVATE: | |
| TRACE("(%p)->(OLEIVERB_INPLACEACTIVATE)\n", This); | |
| return activate_inplace(This); | |
| case OLEIVERB_HIDE: | |
| if(!This->hwnd) { | |
| FIXME("No window to hide\n"); | |
| return E_UNEXPECTED; | |
| } | |
| ShowWindow(This->hwnd, SW_HIDE); | |
| return S_OK; | |
| default: | |
| FIXME("Unsupported iVerb %d\n", iVerb); | |
| } | |
| return E_NOTIMPL; | |
| } | |
| static HRESULT WINAPI OleObject_EnumVerbs(IOleObject *iface, IEnumOLEVERB **ppEnumOleVerb) | |
| { | |
| WindowsMediaPlayer *This = impl_from_IOleObject(iface); | |
| FIXME("(%p)->(%p)\n", This, ppEnumOleVerb); | |
| return E_NOTIMPL; | |
| } | |
| static HRESULT WINAPI OleObject_Update(IOleObject *iface) | |
| { | |
| WindowsMediaPlayer *This = impl_from_IOleObject(iface); | |
| FIXME("(%p)\n", This); | |
| return E_NOTIMPL; | |
| } | |
| static HRESULT WINAPI OleObject_IsUpToDate(IOleObject *iface) | |
| { | |
| WindowsMediaPlayer *This = impl_from_IOleObject(iface); | |
| FIXME("(%p)\n", This); | |
| return E_NOTIMPL; | |
| } | |
| static HRESULT WINAPI OleObject_GetUserClassID(IOleObject *iface, CLSID *pClsid) | |
| { | |
| WindowsMediaPlayer *This = impl_from_IOleObject(iface); | |
| FIXME("(%p)->(%p)\n", This, pClsid); | |
| return E_NOTIMPL; | |
| } | |
| static HRESULT WINAPI OleObject_GetUserType(IOleObject *iface, DWORD dwFormOfType, LPOLESTR *pszUserType) | |
| { | |
| WindowsMediaPlayer *This = impl_from_IOleObject(iface); | |
| FIXME("(%p)->(%d %p)\n", This, dwFormOfType, pszUserType); | |
| return E_NOTIMPL; | |
| } | |
| static HRESULT WINAPI OleObject_SetExtent(IOleObject *iface, DWORD dwDrawAspect, SIZEL *psizel) | |
| { | |
| WindowsMediaPlayer *This = impl_from_IOleObject(iface); | |
| TRACE("(%p)->(%d %p)\n", This, dwDrawAspect, psizel); | |
| if(dwDrawAspect != DVASPECT_CONTENT) | |
| return DV_E_DVASPECT; | |
| This->extent = *psizel; | |
| return S_OK; | |
| } | |
| static HRESULT WINAPI OleObject_GetExtent(IOleObject *iface, DWORD dwDrawAspect, SIZEL *psizel) | |
| { | |
| WindowsMediaPlayer *This = impl_from_IOleObject(iface); | |
| TRACE("(%p)->(%d %p)\n", This, dwDrawAspect, psizel); | |
| if(dwDrawAspect != DVASPECT_CONTENT) | |
| return E_FAIL; | |
| *psizel = This->extent; | |
| return S_OK; | |
| } | |
| static HRESULT WINAPI OleObject_Advise(IOleObject *iface, IAdviseSink *pAdvSink, DWORD *pdwConnection) | |
| { | |
| WindowsMediaPlayer *This = impl_from_IOleObject(iface); | |
| FIXME("(%p)->(%p %p)\n", This, pAdvSink, pdwConnection); | |
| return E_NOTIMPL; | |
| } | |
| static HRESULT WINAPI OleObject_Unadvise(IOleObject *iface, DWORD dwConnection) | |
| { | |
| WindowsMediaPlayer *This = impl_from_IOleObject(iface); | |
| FIXME("(%p)->(%d)\n", This, dwConnection); | |
| return E_NOTIMPL; | |
| } | |
| static HRESULT WINAPI OleObject_EnumAdvise(IOleObject *iface, IEnumSTATDATA **ppenumAdvise) | |
| { | |
| WindowsMediaPlayer *This = impl_from_IOleObject(iface); | |
| FIXME("(%p)->(%p)\n", This, ppenumAdvise); | |
| return E_NOTIMPL; | |
| } | |
| static HRESULT WINAPI OleObject_GetMiscStatus(IOleObject *iface, DWORD dwAspect, DWORD *pdwStatus) | |
| { | |
| WindowsMediaPlayer *This = impl_from_IOleObject(iface); | |
| TRACE("(%p)->(%d %p)\n", This, dwAspect, pdwStatus); | |
| switch(dwAspect) { | |
| case DVASPECT_CONTENT: | |
| *pdwStatus = OLEMISC_SETCLIENTSITEFIRST|OLEMISC_ACTIVATEWHENVISIBLE|OLEMISC_INSIDEOUT | |
| |OLEMISC_CANTLINKINSIDE|OLEMISC_RECOMPOSEONRESIZE; | |
| break; | |
| default: | |
| FIXME("Unhandled aspect %d\n", dwAspect); | |
| return E_NOTIMPL; | |
| } | |
| return S_OK; | |
| } | |
| static HRESULT WINAPI OleObject_SetColorScheme(IOleObject *iface, LOGPALETTE *pLogpal) | |
| { | |
| WindowsMediaPlayer *This = impl_from_IOleObject(iface); | |
| FIXME("(%p)->(%p)\n", This, pLogpal); | |
| return E_NOTIMPL; | |
| } | |
| static const IOleObjectVtbl OleObjectVtbl = { | |
| OleObject_QueryInterface, | |
| OleObject_AddRef, | |
| OleObject_Release, | |
| OleObject_SetClientSite, | |
| OleObject_GetClientSite, | |
| OleObject_SetHostNames, | |
| OleObject_Close, | |
| OleObject_SetMoniker, | |
| OleObject_GetMoniker, | |
| OleObject_InitFromData, | |
| OleObject_GetClipboardData, | |
| OleObject_DoVerb, | |
| OleObject_EnumVerbs, | |
| OleObject_Update, | |
| OleObject_IsUpToDate, | |
| OleObject_GetUserClassID, | |
| OleObject_GetUserType, | |
| OleObject_SetExtent, | |
| OleObject_GetExtent, | |
| OleObject_Advise, | |
| OleObject_Unadvise, | |
| OleObject_EnumAdvise, | |
| OleObject_GetMiscStatus, | |
| OleObject_SetColorScheme | |
| }; | |
| static inline WindowsMediaPlayer *impl_from_IOleInPlaceObjectWindowless(IOleInPlaceObjectWindowless *iface) | |
| { | |
| return CONTAINING_RECORD(iface, WindowsMediaPlayer, IOleInPlaceObjectWindowless_iface); | |
| } | |
| static HRESULT WINAPI OleInPlaceObjectWindowless_QueryInterface(IOleInPlaceObjectWindowless *iface, | |
| REFIID riid, void **ppv) | |
| { | |
| WindowsMediaPlayer *This = impl_from_IOleInPlaceObjectWindowless(iface); | |
| return IOleObject_QueryInterface(&This->IOleObject_iface, riid, ppv); | |
| } | |
| static ULONG WINAPI OleInPlaceObjectWindowless_AddRef(IOleInPlaceObjectWindowless *iface) | |
| { | |
| WindowsMediaPlayer *This = impl_from_IOleInPlaceObjectWindowless(iface); | |
| return IOleObject_AddRef(&This->IOleObject_iface); | |
| } | |
| static ULONG WINAPI OleInPlaceObjectWindowless_Release(IOleInPlaceObjectWindowless *iface) | |
| { | |
| WindowsMediaPlayer *This = impl_from_IOleInPlaceObjectWindowless(iface); | |
| return IOleObject_Release(&This->IOleObject_iface); | |
| } | |
| static HRESULT WINAPI OleInPlaceObjectWindowless_GetWindow(IOleInPlaceObjectWindowless *iface, HWND *phwnd) | |
| { | |
| WindowsMediaPlayer *This = impl_from_IOleInPlaceObjectWindowless(iface); | |
| TRACE("(%p)->(%p)\n", This, phwnd); | |
| *phwnd = This->hwnd; | |
| return This->hwnd ? S_OK : E_UNEXPECTED; | |
| } | |
| static HRESULT WINAPI OleInPlaceObjectWindowless_ContextSensitiveHelp(IOleInPlaceObjectWindowless *iface, | |
| BOOL fEnterMode) | |
| { | |
| WindowsMediaPlayer *This = impl_from_IOleInPlaceObjectWindowless(iface); | |
| FIXME("(%p)->(%x)\n", This, fEnterMode); | |
| return E_NOTIMPL; | |
| } | |
| static HRESULT WINAPI OleInPlaceObjectWindowless_InPlaceDeactivate(IOleInPlaceObjectWindowless *iface) | |
| { | |
| WindowsMediaPlayer *This = impl_from_IOleInPlaceObjectWindowless(iface); | |
| FIXME("(%p)\n", This); | |
| return E_NOTIMPL; | |
| } | |
| static HRESULT WINAPI OleInPlaceObjectWindowless_UIDeactivate(IOleInPlaceObjectWindowless *iface) | |
| { | |
| WindowsMediaPlayer *This = impl_from_IOleInPlaceObjectWindowless(iface); | |
| FIXME("(%p)\n", This); | |
| return E_NOTIMPL; | |
| } | |
| static HRESULT WINAPI OleInPlaceObjectWindowless_SetObjectRects(IOleInPlaceObjectWindowless *iface, | |
| LPCRECT lprcPosRect, LPCRECT lprcClipRect) | |
| { | |
| WindowsMediaPlayer *This = impl_from_IOleInPlaceObjectWindowless(iface); | |
| TRACE("(%p)->(%s %s)\n", This, wine_dbgstr_rect(lprcPosRect), wine_dbgstr_rect(lprcClipRect)); | |
| if(This->hwnd) { | |
| SetWindowPos(This->hwnd, NULL, lprcPosRect->left, lprcPosRect->top, | |
| lprcPosRect->right-lprcPosRect->left, lprcPosRect->bottom-lprcPosRect->top, | |
| SWP_NOZORDER | SWP_NOACTIVATE); | |
| } | |
| return S_OK; | |
| } | |
| static HRESULT WINAPI OleInPlaceObjectWindowless_ReactivateAndUndo(IOleInPlaceObjectWindowless *iface) | |
| { | |
| WindowsMediaPlayer *This = impl_from_IOleInPlaceObjectWindowless(iface); | |
| FIXME("(%p)\n", This); | |
| return E_NOTIMPL; | |
| } | |
| static HRESULT WINAPI OleInPlaceObjectWindowless_OnWindowMessage(IOleInPlaceObjectWindowless *iface, | |
| UINT msg, WPARAM wParam, LPARAM lParam, LRESULT *lpResult) | |
| { | |
| WindowsMediaPlayer *This = impl_from_IOleInPlaceObjectWindowless(iface); | |
| FIXME("(%p)->(%u %lu %lu %p)\n", This, msg, wParam, lParam, lpResult); | |
| return E_NOTIMPL; | |
| } | |
| static HRESULT WINAPI OleInPlaceObjectWindowless_GetDropTarget(IOleInPlaceObjectWindowless *iface, | |
| IDropTarget **ppDropTarget) | |
| { | |
| WindowsMediaPlayer *This = impl_from_IOleInPlaceObjectWindowless(iface); | |
| FIXME("(%p)->(%p)\n", This, ppDropTarget); | |
| return E_NOTIMPL; | |
| } | |
| static const IOleInPlaceObjectWindowlessVtbl OleInPlaceObjectWindowlessVtbl = { | |
| OleInPlaceObjectWindowless_QueryInterface, | |
| OleInPlaceObjectWindowless_AddRef, | |
| OleInPlaceObjectWindowless_Release, | |
| OleInPlaceObjectWindowless_GetWindow, | |
| OleInPlaceObjectWindowless_ContextSensitiveHelp, | |
| OleInPlaceObjectWindowless_InPlaceDeactivate, | |
| OleInPlaceObjectWindowless_UIDeactivate, | |
| OleInPlaceObjectWindowless_SetObjectRects, | |
| OleInPlaceObjectWindowless_ReactivateAndUndo, | |
| OleInPlaceObjectWindowless_OnWindowMessage, | |
| OleInPlaceObjectWindowless_GetDropTarget | |
| }; | |
| static inline WindowsMediaPlayer *impl_from_IOleControl(IOleControl *iface) | |
| { | |
| return CONTAINING_RECORD(iface, WindowsMediaPlayer, IOleControl_iface); | |
| } | |
| static HRESULT WINAPI OleControl_QueryInterface(IOleControl *iface, REFIID riid, void **ppv) | |
| { | |
| WindowsMediaPlayer *This = impl_from_IOleControl(iface); | |
| return IOleObject_QueryInterface(&This->IOleObject_iface, riid, ppv); | |
| } | |
| static ULONG WINAPI OleControl_AddRef(IOleControl *iface) | |
| { | |
| WindowsMediaPlayer *This = impl_from_IOleControl(iface); | |
| return IOleObject_AddRef(&This->IOleObject_iface); | |
| } | |
| static ULONG WINAPI OleControl_Release(IOleControl *iface) | |
| { | |
| WindowsMediaPlayer *This = impl_from_IOleControl(iface); | |
| return IOleObject_Release(&This->IOleObject_iface); | |
| } | |
| static HRESULT WINAPI OleControl_GetControlInfo(IOleControl *iface, CONTROLINFO *pCI) | |
| { | |
| WindowsMediaPlayer *This = impl_from_IOleControl(iface); | |
| FIXME("(%p)->(%p)\n", This, pCI); | |
| return E_NOTIMPL; | |
| } | |
| static HRESULT WINAPI OleControl_OnMnemonic(IOleControl *iface, MSG *msg) | |
| { | |
| WindowsMediaPlayer *This = impl_from_IOleControl(iface); | |
| FIXME("(%p)->(%p)\n", This, msg); | |
| return E_NOTIMPL; | |
| } | |
| static HRESULT WINAPI OleControl_OnAmbientPropertyChange(IOleControl *iface, DISPID dispID) | |
| { | |
| WindowsMediaPlayer *This = impl_from_IOleControl(iface); | |
| FIXME("(%p)->(%d)\n", This, dispID); | |
| return E_NOTIMPL; | |
| } | |
| static HRESULT WINAPI OleControl_FreezeEvents(IOleControl *iface, BOOL freeze) | |
| { | |
| WindowsMediaPlayer *This = impl_from_IOleControl(iface); | |
| FIXME("(%p)->(%x)\n", This, freeze); | |
| return E_NOTIMPL; | |
| } | |
| static const IOleControlVtbl OleControlVtbl = { | |
| OleControl_QueryInterface, | |
| OleControl_AddRef, | |
| OleControl_Release, | |
| OleControl_GetControlInfo, | |
| OleControl_OnMnemonic, | |
| OleControl_OnAmbientPropertyChange, | |
| OleControl_FreezeEvents | |
| }; | |
| static inline WindowsMediaPlayer *impl_from_IProvideClassInfo2(IProvideClassInfo2 *iface) | |
| { | |
| return CONTAINING_RECORD(iface, WindowsMediaPlayer, IProvideClassInfo2_iface); | |
| } | |
| static HRESULT WINAPI ProvideClassInfo2_QueryInterface(IProvideClassInfo2 *iface, REFIID riid, void **ppv) | |
| { | |
| WindowsMediaPlayer *This = impl_from_IProvideClassInfo2(iface); | |
| return IOleObject_QueryInterface(&This->IOleObject_iface, riid, ppv); | |
| } | |
| static ULONG WINAPI ProvideClassInfo2_AddRef(IProvideClassInfo2 *iface) | |
| { | |
| WindowsMediaPlayer *This = impl_from_IProvideClassInfo2(iface); | |
| return IOleObject_AddRef(&This->IOleObject_iface); | |
| } | |
| static ULONG WINAPI ProvideClassInfo2_Release(IProvideClassInfo2 *iface) | |
| { | |
| WindowsMediaPlayer *This = impl_from_IProvideClassInfo2(iface); | |
| return IOleObject_Release(&This->IOleObject_iface); | |
| } | |
| static HRESULT WINAPI ProvideClassInfo2_GetClassInfo(IProvideClassInfo2 *iface, ITypeInfo **ppTI) | |
| { | |
| WindowsMediaPlayer *This = impl_from_IProvideClassInfo2(iface); | |
| FIXME("(%p)->(%p)\n", This, ppTI); | |
| return E_NOTIMPL; | |
| } | |
| static HRESULT WINAPI ProvideClassInfo2_GetGUID(IProvideClassInfo2 *iface, DWORD dwGuidKind, GUID *pGUID) | |
| { | |
| WindowsMediaPlayer *This = impl_from_IProvideClassInfo2(iface); | |
| TRACE("(%p)->(%d %p)\n", This, dwGuidKind, pGUID); | |
| if(dwGuidKind != GUIDKIND_DEFAULT_SOURCE_DISP_IID) { | |
| FIXME("Unexpected dwGuidKind %d\n", dwGuidKind); | |
| return E_INVALIDARG; | |
| } | |
| *pGUID = IID__WMPOCXEvents; | |
| return S_OK; | |
| } | |
| static const IProvideClassInfo2Vtbl ProvideClassInfo2Vtbl = { | |
| ProvideClassInfo2_QueryInterface, | |
| ProvideClassInfo2_AddRef, | |
| ProvideClassInfo2_Release, | |
| ProvideClassInfo2_GetClassInfo, | |
| ProvideClassInfo2_GetGUID | |
| }; | |
| static inline WindowsMediaPlayer *impl_from_IPersistStreamInit(IPersistStreamInit *iface) | |
| { | |
| return CONTAINING_RECORD(iface, WindowsMediaPlayer, IPersistStreamInit_iface); | |
| } | |
| static HRESULT WINAPI PersistStreamInit_QueryInterface(IPersistStreamInit *iface, | |
| REFIID riid, void **ppv) | |
| { | |
| WindowsMediaPlayer *This = impl_from_IPersistStreamInit(iface); | |
| return IOleObject_QueryInterface(&This->IOleObject_iface, riid, ppv); | |
| } | |
| static ULONG WINAPI PersistStreamInit_AddRef(IPersistStreamInit *iface) | |
| { | |
| WindowsMediaPlayer *This = impl_from_IPersistStreamInit(iface); | |
| return IOleObject_AddRef(&This->IOleObject_iface); | |
| } | |
| static ULONG WINAPI PersistStreamInit_Release(IPersistStreamInit *iface) | |
| { | |
| WindowsMediaPlayer *This = impl_from_IPersistStreamInit(iface); | |
| return IOleObject_Release(&This->IOleObject_iface); | |
| } | |
| static HRESULT WINAPI PersistStreamInit_GetClassID(IPersistStreamInit *iface, CLSID *pClassID) | |
| { | |
| WindowsMediaPlayer *This = impl_from_IPersistStreamInit(iface); | |
| FIXME("(%p)->(%p)\n", This, pClassID); | |
| return E_NOTIMPL; | |
| } | |
| static HRESULT WINAPI PersistStreamInit_IsDirty(IPersistStreamInit *iface) | |
| { | |
| WindowsMediaPlayer *This = impl_from_IPersistStreamInit(iface); | |
| FIXME("(%p)\n", This); | |
| return E_NOTIMPL; | |
| } | |
| static HRESULT WINAPI PersistStreamInit_Load(IPersistStreamInit *iface, LPSTREAM pStm) | |
| { | |
| WindowsMediaPlayer *This = impl_from_IPersistStreamInit(iface); | |
| FIXME("(%p)->(%p)\n", This, pStm); | |
| return E_NOTIMPL; | |
| } | |
| static HRESULT WINAPI PersistStreamInit_Save(IPersistStreamInit *iface, LPSTREAM pStm, | |
| BOOL fClearDirty) | |
| { | |
| WindowsMediaPlayer *This = impl_from_IPersistStreamInit(iface); | |
| FIXME("(%p)->(%p %x)\n", This, pStm, fClearDirty); | |
| return E_NOTIMPL; | |
| } | |
| static HRESULT WINAPI PersistStreamInit_GetSizeMax(IPersistStreamInit *iface, | |
| ULARGE_INTEGER *pcbSize) | |
| { | |
| WindowsMediaPlayer *This = impl_from_IPersistStreamInit(iface); | |
| FIXME("(%p)->(%p)\n", This, pcbSize); | |
| return E_NOTIMPL; | |
| } | |
| static HRESULT WINAPI PersistStreamInit_InitNew(IPersistStreamInit *iface) | |
| { | |
| WindowsMediaPlayer *This = impl_from_IPersistStreamInit(iface); | |
| TRACE("(%p)\n", This); | |
| if(!This->client_site) | |
| return E_FAIL; | |
| /* Nothing to do, yet. */ | |
| get_container_hwnd(This); | |
| return S_OK; | |
| } | |
| static const IPersistStreamInitVtbl PersistStreamInitVtbl = { | |
| PersistStreamInit_QueryInterface, | |
| PersistStreamInit_AddRef, | |
| PersistStreamInit_Release, | |
| PersistStreamInit_GetClassID, | |
| PersistStreamInit_IsDirty, | |
| PersistStreamInit_Load, | |
| PersistStreamInit_Save, | |
| PersistStreamInit_GetSizeMax, | |
| PersistStreamInit_InitNew | |
| }; | |
| static inline WindowsMediaPlayer *impl_from_IConnectionPointContainer(IConnectionPointContainer *iface) | |
| { | |
| return CONTAINING_RECORD(iface, WindowsMediaPlayer, IConnectionPointContainer_iface); | |
| } | |
| static HRESULT WINAPI ConnectionPointContainer_QueryInterface(IConnectionPointContainer *iface, | |
| REFIID riid, LPVOID *ppv) | |
| { | |
| WindowsMediaPlayer *This = impl_from_IConnectionPointContainer(iface); | |
| return IOleObject_QueryInterface(&This->IOleObject_iface, riid, ppv); | |
| } | |
| static ULONG WINAPI ConnectionPointContainer_AddRef(IConnectionPointContainer *iface) | |
| { | |
| WindowsMediaPlayer *This = impl_from_IConnectionPointContainer(iface); | |
| return IOleObject_AddRef(&This->IOleObject_iface); | |
| } | |
| static ULONG WINAPI ConnectionPointContainer_Release(IConnectionPointContainer *iface) | |
| { | |
| WindowsMediaPlayer *This = impl_from_IConnectionPointContainer(iface); | |
| return IOleObject_Release(&This->IOleObject_iface); | |
| } | |
| static HRESULT WINAPI ConnectionPointContainer_EnumConnectionPoints(IConnectionPointContainer *iface, | |
| IEnumConnectionPoints **ppEnum) | |
| { | |
| WindowsMediaPlayer *This = impl_from_IConnectionPointContainer(iface); | |
| FIXME("(%p)->(%p)\n", This, ppEnum); | |
| return E_NOTIMPL; | |
| } | |
| static HRESULT WINAPI ConnectionPointContainer_FindConnectionPoint(IConnectionPointContainer *iface, | |
| REFIID riid, IConnectionPoint **ppCP) | |
| { | |
| WindowsMediaPlayer *This = impl_from_IConnectionPointContainer(iface); | |
| FIXME("(%p)->(%s %p)\n", This, debugstr_guid(riid), ppCP); | |
| return CONNECT_E_NOCONNECTION; | |
| } | |
| static const IConnectionPointContainerVtbl ConnectionPointContainerVtbl = | |
| { | |
| ConnectionPointContainer_QueryInterface, | |
| ConnectionPointContainer_AddRef, | |
| ConnectionPointContainer_Release, | |
| ConnectionPointContainer_EnumConnectionPoints, | |
| ConnectionPointContainer_FindConnectionPoint | |
| }; | |
| HRESULT WINAPI WMPFactory_CreateInstance(IClassFactory *iface, IUnknown *outer, | |
| REFIID riid, void **ppv) | |
| { | |
| WindowsMediaPlayer *wmp; | |
| DWORD dpi_x, dpi_y; | |
| HDC hdc; | |
| HRESULT hres; | |
| TRACE("(%p %s %p)\n", outer, debugstr_guid(riid), ppv); | |
| wmp = heap_alloc_zero(sizeof(*wmp)); | |
| if(!wmp) | |
| return E_OUTOFMEMORY; | |
| wmp->IOleObject_iface.lpVtbl = &OleObjectVtbl; | |
| wmp->IProvideClassInfo2_iface.lpVtbl = &ProvideClassInfo2Vtbl; | |
| wmp->IPersistStreamInit_iface.lpVtbl = &PersistStreamInitVtbl; | |
| wmp->IOleInPlaceObjectWindowless_iface.lpVtbl = &OleInPlaceObjectWindowlessVtbl; | |
| wmp->IConnectionPointContainer_iface.lpVtbl = &ConnectionPointContainerVtbl; | |
| wmp->IOleControl_iface.lpVtbl = &OleControlVtbl; | |
| wmp->ref = 1; | |
| init_player_ifaces(wmp); | |
| hdc = GetDC(0); | |
| dpi_x = GetDeviceCaps(hdc, LOGPIXELSX); | |
| dpi_y = GetDeviceCaps(hdc, LOGPIXELSY); | |
| ReleaseDC(0, hdc); | |
| wmp->extent.cx = MulDiv(192, 2540, dpi_x); | |
| wmp->extent.cy = MulDiv(192, 2540, dpi_y); | |
| hres = IOleObject_QueryInterface(&wmp->IOleObject_iface, riid, ppv); | |
| IOleObject_Release(&wmp->IOleObject_iface); | |
| return hres; | |
| } |