From 3bf9df6b2785fa6d951086978a3e66f49427166a Mon Sep 17 00:00:00 2001 From: FluorescentCIAAfricanAmerican <0934gj3049fk@protonmail.com> Date: Wed, 22 Apr 2020 12:56:21 -0400 Subject: 1 --- utils/smp/CWMPEventDispatch.cpp | 584 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 584 insertions(+) create mode 100644 utils/smp/CWMPEventDispatch.cpp (limited to 'utils/smp/CWMPEventDispatch.cpp') diff --git a/utils/smp/CWMPEventDispatch.cpp b/utils/smp/CWMPEventDispatch.cpp new file mode 100644 index 0000000..a49f042 --- /dev/null +++ b/utils/smp/CWMPEventDispatch.cpp @@ -0,0 +1,584 @@ +//========= Copyright Valve Corporation, All rights reserved. ============// +// CWMPEventDispatch.cpp : Implementation of the event dispatcher +// + +#include "CWMPEventDispatch.h" +#include "CWMPHost.h" + +extern HWND g_hBlackFadingWindow; +extern CComPtr g_spWMPPlayer; +extern CWMPHost* g_pFrame; +extern double g_timeAtFadeStart; +extern bool g_bFadeIn; + +bool g_bFadeWindowTriggered = false; + + +bool IsFullScreen(); +bool SetFullScreen( bool bWantToBeFullscreen ); +bool IsVideoPlaying(); +void PlayVideo( bool bPlay ); +bool ShowFadeWindow( bool bShow ); +void LogPlayerEvent( EventType_t e, float pos ); +void LogPlayerEvent( EventType_t e ); + + +HRESULT CWMPEventDispatch::Invoke( + DISPID dispIdMember, + REFIID riid, + LCID lcid, + WORD wFlags, + DISPPARAMS FAR* pDispParams, + VARIANT FAR* pVarResult, + EXCEPINFO FAR* pExcepInfo, + unsigned int FAR* puArgErr ) +{ + if (!pDispParams) + return E_POINTER; + + if (pDispParams->cNamedArgs != 0) + return DISP_E_NONAMEDARGS; + + HRESULT hr = DISP_E_MEMBERNOTFOUND; + + switch (dispIdMember) + { + case DISPID_WMPCOREEVENT_OPENSTATECHANGE: + OpenStateChange(pDispParams->rgvarg[0].lVal /* NewState */ ); + break; + + case DISPID_WMPCOREEVENT_PLAYSTATECHANGE: + PlayStateChange(pDispParams->rgvarg[0].lVal /* NewState */); + break; + + case DISPID_WMPCOREEVENT_AUDIOLANGUAGECHANGE: + AudioLanguageChange(pDispParams->rgvarg[0].lVal /* LangID */); + break; + + case DISPID_WMPCOREEVENT_STATUSCHANGE: + StatusChange(); + break; + + case DISPID_WMPCOREEVENT_SCRIPTCOMMAND: + ScriptCommand(pDispParams->rgvarg[1].bstrVal /* scType */, pDispParams->rgvarg[0].bstrVal /* Param */ ); + break; + + case DISPID_WMPCOREEVENT_NEWSTREAM: + NewStream(); + break; + + case DISPID_WMPCOREEVENT_DISCONNECT: + Disconnect(pDispParams->rgvarg[0].lVal /* Result */ ); + break; + + case DISPID_WMPCOREEVENT_BUFFERING: + Buffering(pDispParams->rgvarg[0].boolVal /* Start */); + break; + + case DISPID_WMPCOREEVENT_ERROR: + Error(); + break; + + case DISPID_WMPCOREEVENT_WARNING: + Warning(pDispParams->rgvarg[1].lVal /* WarningType */, pDispParams->rgvarg[0].lVal /* Param */, pDispParams->rgvarg[2].bstrVal /* Description */); + break; + + case DISPID_WMPCOREEVENT_ENDOFSTREAM: + EndOfStream(pDispParams->rgvarg[0].lVal /* Result */ ); + break; + + case DISPID_WMPCOREEVENT_POSITIONCHANGE: + PositionChange(pDispParams->rgvarg[1].dblVal /* oldPosition */, pDispParams->rgvarg[0].dblVal /* newPosition */); + break; + + case DISPID_WMPCOREEVENT_MARKERHIT: + MarkerHit(pDispParams->rgvarg[0].lVal /* MarkerNum */); + break; + + case DISPID_WMPCOREEVENT_DURATIONUNITCHANGE: + DurationUnitChange(pDispParams->rgvarg[0].lVal /* NewDurationUnit */); + break; + + case DISPID_WMPCOREEVENT_CDROMMEDIACHANGE: + CdromMediaChange(pDispParams->rgvarg[0].lVal /* CdromNum */); + break; + + case DISPID_WMPCOREEVENT_PLAYLISTCHANGE: + PlaylistChange(pDispParams->rgvarg[1].pdispVal /* Playlist */, (WMPPlaylistChangeEventType) pDispParams->rgvarg[0].lVal /* change */); + break; + + case DISPID_WMPCOREEVENT_CURRENTPLAYLISTCHANGE: + CurrentPlaylistChange((WMPPlaylistChangeEventType) pDispParams->rgvarg[0].lVal /* change */); + break; + + case DISPID_WMPCOREEVENT_CURRENTPLAYLISTITEMAVAILABLE: + CurrentPlaylistItemAvailable(pDispParams->rgvarg[0].bstrVal /* bstrItemName */); + break; + + case DISPID_WMPCOREEVENT_MEDIACHANGE: + MediaChange(pDispParams->rgvarg[0].pdispVal /* Item */); + break; + + case DISPID_WMPCOREEVENT_CURRENTMEDIAITEMAVAILABLE: + CurrentMediaItemAvailable(pDispParams->rgvarg[0].bstrVal /* bstrItemName */); + break; + + case DISPID_WMPCOREEVENT_CURRENTITEMCHANGE: + CurrentItemChange(pDispParams->rgvarg[0].pdispVal /* pdispMedia */); + break; + + case DISPID_WMPCOREEVENT_MEDIACOLLECTIONCHANGE: + MediaCollectionChange(); + break; + + case DISPID_WMPCOREEVENT_MEDIACOLLECTIONATTRIBUTESTRINGADDED: + MediaCollectionAttributeStringAdded(pDispParams->rgvarg[1].bstrVal /* bstrAttribName */, pDispParams->rgvarg[0].bstrVal /* bstrAttribVal */ ); + break; + + case DISPID_WMPCOREEVENT_MEDIACOLLECTIONATTRIBUTESTRINGREMOVED: + MediaCollectionAttributeStringRemoved(pDispParams->rgvarg[1].bstrVal /* bstrAttribName */, pDispParams->rgvarg[0].bstrVal /* bstrAttribVal */ ); + break; + + case DISPID_WMPCOREEVENT_MEDIACOLLECTIONATTRIBUTESTRINGCHANGED: + MediaCollectionAttributeStringChanged(pDispParams->rgvarg[2].bstrVal /* bstrAttribName */, pDispParams->rgvarg[1].bstrVal /* bstrOldAttribVal */, pDispParams->rgvarg[0].bstrVal /* bstrNewAttribVal */); + break; + + case DISPID_WMPCOREEVENT_PLAYLISTCOLLECTIONCHANGE: + PlaylistCollectionChange(); + break; + + case DISPID_WMPCOREEVENT_PLAYLISTCOLLECTIONPLAYLISTADDED: + PlaylistCollectionPlaylistAdded(pDispParams->rgvarg[0].bstrVal /* bstrPlaylistName */ ); + break; + + case DISPID_WMPCOREEVENT_PLAYLISTCOLLECTIONPLAYLISTREMOVED: + PlaylistCollectionPlaylistRemoved(pDispParams->rgvarg[0].bstrVal /* bstrPlaylistName */ ); + break; + + case DISPID_WMPCOREEVENT_PLAYLISTCOLLECTIONPLAYLISTSETASDELETED: + PlaylistCollectionPlaylistSetAsDeleted(pDispParams->rgvarg[1].bstrVal /* bstrPlaylistName */, pDispParams->rgvarg[0].boolVal /* varfIsDeleted */); + break; + + case DISPID_WMPCOREEVENT_MODECHANGE: + ModeChange(pDispParams->rgvarg[1].bstrVal /* ModeName */, pDispParams->rgvarg[0].boolVal /* NewValue */); + break; + + case DISPID_WMPCOREEVENT_MEDIAERROR: + MediaError(pDispParams->rgvarg[0].pdispVal /* pMediaObject */); + break; + + case DISPID_WMPCOREEVENT_OPENPLAYLISTSWITCH: + OpenPlaylistSwitch(pDispParams->rgvarg[0].pdispVal /* pItem */); + break; + + case DISPID_WMPCOREEVENT_DOMAINCHANGE: + DomainChange(pDispParams->rgvarg[0].bstrVal /* strDomain */); + break; + + case DISPID_WMPOCXEVENT_SWITCHEDTOPLAYERAPPLICATION: + SwitchedToPlayerApplication(); + break; + + case DISPID_WMPOCXEVENT_SWITCHEDTOCONTROL: + SwitchedToControl(); + break; + + case DISPID_WMPOCXEVENT_PLAYERDOCKEDSTATECHANGE: + PlayerDockedStateChange(); + break; + + case DISPID_WMPOCXEVENT_PLAYERRECONNECT: + PlayerReconnect(); + break; + + case DISPID_WMPOCXEVENT_CLICK: + Click(pDispParams->rgvarg[3].iVal /* nButton */, pDispParams->rgvarg[2].iVal /* nShiftState */, pDispParams->rgvarg[1].lVal /* fX */, pDispParams->rgvarg[0].lVal /* fY */); + break; + + case DISPID_WMPOCXEVENT_DOUBLECLICK: + DoubleClick(pDispParams->rgvarg[3].iVal /* nButton */, pDispParams->rgvarg[2].iVal /* nShiftState */, pDispParams->rgvarg[1].lVal /* fX */, pDispParams->rgvarg[0].lVal /* fY */); + break; + + case DISPID_WMPOCXEVENT_KEYDOWN: + KeyDown(pDispParams->rgvarg[1].iVal /* nKeyCode */, pDispParams->rgvarg[0].iVal /* nShiftState */); + break; + + case DISPID_WMPOCXEVENT_KEYPRESS: + KeyPress(pDispParams->rgvarg[0].iVal /* nKeyAscii */); + break; + + case DISPID_WMPOCXEVENT_KEYUP: + KeyUp(pDispParams->rgvarg[1].iVal /* nKeyCode */, pDispParams->rgvarg[0].iVal /* nShiftState */); + break; + + case DISPID_WMPOCXEVENT_MOUSEDOWN: + MouseDown(pDispParams->rgvarg[3].iVal /* nButton */, pDispParams->rgvarg[2].iVal /* nShiftState */, pDispParams->rgvarg[1].lVal /* fX */, pDispParams->rgvarg[0].lVal /* fY */); + break; + + case DISPID_WMPOCXEVENT_MOUSEMOVE: + MouseMove(pDispParams->rgvarg[3].iVal /* nButton */, pDispParams->rgvarg[2].iVal /* nShiftState */, pDispParams->rgvarg[1].lVal /* fX */, pDispParams->rgvarg[0].lVal /* fY */); + break; + + case DISPID_WMPOCXEVENT_MOUSEUP: + MouseUp(pDispParams->rgvarg[3].iVal /* nButton */, pDispParams->rgvarg[2].iVal /* nShiftState */, pDispParams->rgvarg[1].lVal /* fX */, pDispParams->rgvarg[0].lVal /* fY */); + break; + } + + return( hr ); +} + +// Sent when the control changes OpenState +void CWMPEventDispatch::OpenStateChange(long NewState) +{ + return; +} + +// Sent when the control changes PlayState +void CWMPEventDispatch::PlayStateChange(long NewState) +{ + WMPPlayState playstate; + if ( g_spWMPPlayer->get_playState( &playstate ) == S_OK ) + { + switch ( playstate ) + { + case wmppsPlaying: + { + static bool s_first = true; + if ( s_first ) + { + s_first = false; + + LogPlayerEvent( ET_MEDIABEGIN ); + + SetFullScreen( true ); + ShowFadeWindow( false ); + } + else + { + LogPlayerEvent( ET_PLAY ); + } + break; + } + + case wmppsPaused: + LogPlayerEvent( ET_PAUSE ); + break; + + case wmppsStopped: + LogPlayerEvent( ET_STOP ); + break; + + case wmppsMediaEnded: + LogPlayerEvent( ET_MEDIAEND ); + + if ( IsFullScreen() && !g_bFadeWindowTriggered ) + { + g_bFadeWindowTriggered = true; + ShowFadeWindow( true ); + } + break; + } + } +} + +// Sent when the audio language changes +void CWMPEventDispatch::AudioLanguageChange(long LangID) +{ + return; +} + +// Sent when the status string changes +void CWMPEventDispatch::StatusChange() +{ +} + +// Sent when a synchronized command or URL is received +void CWMPEventDispatch::ScriptCommand(BSTR scType,BSTR Param) +{ + return; +} + +// Sent when a new stream is encountered (obsolete) +void CWMPEventDispatch::NewStream() +{ + return; +} + +// Sent when the control is disconnected from the server (obsolete) +void CWMPEventDispatch:: Disconnect(long Result ) +{ + return; +} + +// Sent when the control begins or ends buffering +void CWMPEventDispatch:: Buffering(VARIANT_BOOL Start) +{ + return; +} + +// Sent when the control has an error condition +void CWMPEventDispatch::Error() +{ + return; +} + +// Sent when the control has an warning condition (obsolete) +void CWMPEventDispatch::Warning(long WarningType, long Param, BSTR Description) +{ + return; +} + +// Sent when the media has reached end of stream +void CWMPEventDispatch::EndOfStream(long Result) +{ + return; +} + +// Indicates that the current position of the movie has changed +void CWMPEventDispatch::PositionChange(double oldPosition,double newPosition) +{ + LogPlayerEvent( ET_SCRUBFROM, ( float )oldPosition ); + LogPlayerEvent( ET_SCRUBTO, ( float )newPosition ); +} + +// Sent when a marker is reached +void CWMPEventDispatch::MarkerHit(long MarkerNum ) +{ + return; +} + +// Indicates that the unit used to express duration and position has changed +void CWMPEventDispatch::DurationUnitChange(long NewDurationUnit) +{ + return; +} + +// Indicates that the CD ROM media has changed +void CWMPEventDispatch::CdromMediaChange(long CdromNum) +{ + return; +} + +// Sent when a playlist changes +void CWMPEventDispatch::PlaylistChange(IDispatch * Playlist,WMPPlaylistChangeEventType change) +{ + return; +} + +// Sent when the current playlist changes +void CWMPEventDispatch::CurrentPlaylistChange(WMPPlaylistChangeEventType change ) +{ + return; +} + +// Sent when a current playlist item becomes available +void CWMPEventDispatch::CurrentPlaylistItemAvailable(BSTR bstrItemName) +{ + return; +} + +// Sent when a media object changes +void CWMPEventDispatch::MediaChange(IDispatch * Item) +{ + return; +} + +// Sent when a current media item becomes available +void CWMPEventDispatch::CurrentMediaItemAvailable(BSTR bstrItemName) +{ + return; +} + +// Sent when the item selection on the current playlist changes +void CWMPEventDispatch::CurrentItemChange(IDispatch *pdispMedia) +{ + return; +} + +// Sent when the media collection needs to be requeried +void CWMPEventDispatch::MediaCollectionChange() +{ + return; +} + +// Sent when an attribute string is added in the media collection +void CWMPEventDispatch::MediaCollectionAttributeStringAdded(BSTR bstrAttribName, BSTR bstrAttribVal) +{ + return; +} + +// Sent when an attribute string is removed from the media collection +void CWMPEventDispatch::MediaCollectionAttributeStringRemoved(BSTR bstrAttribName, BSTR bstrAttribVal) +{ + return; +} + +// Sent when an attribute string is changed in the media collection +void CWMPEventDispatch::MediaCollectionAttributeStringChanged(BSTR bstrAttribName, BSTR bstrOldAttribVal, BSTR bstrNewAttribVal) +{ + return; +} + +// Sent when playlist collection needs to be requeried +void CWMPEventDispatch::PlaylistCollectionChange() +{ + return; +} + +// Sent when a playlist is added to the playlist collection +void CWMPEventDispatch::PlaylistCollectionPlaylistAdded(BSTR bstrPlaylistName) +{ + return; +} + +// Sent when a playlist is removed from the playlist collection +void CWMPEventDispatch::PlaylistCollectionPlaylistRemoved(BSTR bstrPlaylistName) +{ + return; +} + +// Sent when a playlist has been set or reset as deleted +void CWMPEventDispatch::PlaylistCollectionPlaylistSetAsDeleted(BSTR bstrPlaylistName, VARIANT_BOOL varfIsDeleted) +{ + return; +} + +// Playlist playback mode has changed +void CWMPEventDispatch::ModeChange(BSTR ModeName, VARIANT_BOOL NewValue) +{ + return; +} + +// Sent when the media object has an error condition +void CWMPEventDispatch::MediaError(IDispatch * pMediaObject) +{ + while ( ShowCursor( TRUE ) < 0 ) + ; + + ShowWindow( g_hBlackFadingWindow, SW_HIDE ); + if ( g_pFrame ) + { + g_pFrame->ShowWindow( SW_HIDE ); + } + + CComPtr< IWMPMedia > spWMPMedia; + if ( pMediaObject ) + { + pMediaObject->QueryInterface( &spWMPMedia ); + } + if ( spWMPMedia ) + { + BSTR bstr; + spWMPMedia->get_sourceURL( &bstr ); + char str[ 1024 ]; + sprintf( str, "Unable to open media: %s\n", CW2T( bstr ) ); + MessageBox( NULL, str, "Media Error", MB_OK | MB_ICONERROR ); + } + else + { + MessageBox( NULL, "Media Error", "Media Error", MB_OK | MB_ICONERROR ); + } + + g_pFrame->PostMessage( WM_CLOSE ); +} + +// Current playlist switch with no open state change +void CWMPEventDispatch::OpenPlaylistSwitch(IDispatch *pItem) +{ + return; +} + +// Sent when the current DVD domain changes +void CWMPEventDispatch::DomainChange(BSTR strDomain) +{ + return; +} + +// Sent when display switches to player application +void CWMPEventDispatch::SwitchedToPlayerApplication() +{ +} + +// Sent when display switches to control +void CWMPEventDispatch::SwitchedToControl() +{ +} + +// Sent when the player docks or undocks +void CWMPEventDispatch::PlayerDockedStateChange() +{ +} + +// Sent when the OCX reconnects to the player +void CWMPEventDispatch::PlayerReconnect() +{ +} + +// Occurs when a user clicks the mouse +void CWMPEventDispatch::Click( short nButton, short nShiftState, long fX, long fY ) +{ + if ( IsFullScreen() ) + { + SetFullScreen( false ); + } +} + +// Occurs when a user double-clicks the mouse +void CWMPEventDispatch::DoubleClick( short nButton, short nShiftState, long fX, long fY ) +{ + // the controls are just drawn into the main window, wheras the video has its own window + // this check allows us to only fullscreen on doubleclick within the video area + POINT pt = { fX, fY }; + HWND hWnd = g_pFrame->ChildWindowFromPoint( pt ); + if ( ChildWindowFromPoint( hWnd, pt ) != hWnd ) + { + SetFullScreen( !IsFullScreen() ); + } +} + +// Occurs when a key is pressed +void CWMPEventDispatch::KeyDown( short nKeyCode, short nShiftState ) +{ +#if 1 + if ( !g_pFrame ) + return; + + BOOL rval; + if ( nShiftState & 4 ) // 4 is the alt keymask + { + g_pFrame->OnSysKeyDown( WM_KEYDOWN, nKeyCode, 0, rval ); + } + else + { + g_pFrame->OnKeyDown( WM_KEYDOWN, nKeyCode, 0, rval ); + } +#endif +} + +// Occurs when a key is pressed and released +void CWMPEventDispatch::KeyPress( short nKeyAscii ) +{ + return; +} + +// Occurs when a key is released +void CWMPEventDispatch::KeyUp( short nKeyCode, short nShiftState ) +{ + return; +} + +// Occurs when a mouse button is pressed +void CWMPEventDispatch::MouseDown( short nButton, short nShiftState, long fX, long fY ) +{ +} + +// Occurs when a mouse pointer is moved +void CWMPEventDispatch::MouseMove( short nButton, short nShiftState, long fX, long fY ) +{ + return; +} + +// Occurs when a mouse button is released +void CWMPEventDispatch::MouseUp( short nButton, short nShiftState, long fX, long fY ) +{ +} -- cgit v1.2.3