X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;ds=sidebyside;f=projects%2Factivex%2Fplugin.cpp;h=1627e5e3d2c6c0ab9f6b99270600e11b3a512e6c;hb=c4050dc359d9447606f5111c704e9addef99b6a6;hp=cc99dc7c2d7fc1bb46bd0487cbeb2c9e4035c401;hpb=5577ca9936e34c3dbc79a90f9156d681e5cc624e;p=vlc diff --git a/projects/activex/plugin.cpp b/projects/activex/plugin.cpp index cc99dc7c2d..1627e5e3d2 100644 --- a/projects/activex/plugin.cpp +++ b/projects/activex/plugin.cpp @@ -214,6 +214,11 @@ VLCPlugin::VLCPlugin(VLCPluginClass *p_class, LPUNKNOWN pUnkOuter) : _i_codepage(CP_ACP), _b_usermode(TRUE) { + /* + ** bump refcount to avoid recursive release from + ** following interfaces when releasing this interface + */ + AddRef(); p_class->AddRef(); vlcOleControl = new VLCOleControl(this); @@ -244,12 +249,6 @@ VLCPlugin::VLCPlugin(VLCPluginClass *p_class, LPUNKNOWN pUnkOuter) : VLCPlugin::~VLCPlugin() { - /* - ** bump refcount to avoid recursive release from - ** following interfaces when releasing this interface - */ - AddRef(); - delete vlcSupportErrorInfo; delete vlcOleObject; delete vlcDataObject; @@ -285,6 +284,7 @@ VLCPlugin::~VLCPlugin() if( _p_libvlc ) { libvlc_release(_p_libvlc); _p_libvlc=NULL; } _p_class->Release(); + Release(); }; STDMETHODIMP VLCPlugin::QueryInterface(REFIID riid, void **ppv) @@ -442,6 +442,7 @@ void VLCPlugin::initVLC() { TCHAR w_progpath[MAX_PATH]; DWORD len = GetModuleFileName(DllGetModule(), w_progpath, MAX_PATH); + w_progpath[MAX_PATH-1] = '\0'; if( len > 0 ) { len = WideCharToMultiByte(CP_UTF8, 0, w_progpath, len, p_progpath, @@ -466,6 +467,7 @@ void VLCPlugin::initVLC() if( RegQueryValueEx( h_key, TEXT("InstallDir"), 0, &i_type, (LPBYTE)w_pluginpath, &i_data ) == ERROR_SUCCESS ) { + w_pluginpath[MAX_PATH-1] = '\0'; if( i_type == REG_SZ ) { if( WideCharToMultiByte(CP_UTF8, 0, w_pluginpath, -1, p_pluginpath, @@ -1007,64 +1009,64 @@ void VLCPlugin::fireOnStopEvent(void) /* * Async events */ -void VLCPlugin::fireOnIdleEvent() +void VLCPlugin::fireOnMediaPlayerNothingSpecialEvent() { DISPPARAMS dispparamsNoArgs = {NULL, NULL, 0, 0}; - vlcConnectionPointContainer->fireEvent(DISPID_NothingSpecialEvent, &dispparamsNoArgs); + vlcConnectionPointContainer->fireEvent(DISPID_MediaPlayerNothingSpecialEvent, &dispparamsNoArgs); }; -void VLCPlugin::fireOnOpeningEvent() +void VLCPlugin::fireOnMediaPlayerOpeningEvent() { DISPPARAMS dispparamsNoArgs = {NULL, NULL, 0, 0}; - vlcConnectionPointContainer->fireEvent(DISPID_OpeningEvent, &dispparamsNoArgs); + vlcConnectionPointContainer->fireEvent(DISPID_MediaPlayerOpeningEvent, &dispparamsNoArgs); }; -void VLCPlugin::fireOnBufferingEvent() +void VLCPlugin::fireOnMediaPlayerBufferingEvent() { DISPPARAMS dispparamsNoArgs = {NULL, NULL, 0, 0}; - vlcConnectionPointContainer->fireEvent(DISPID_BufferingEvent, &dispparamsNoArgs); + vlcConnectionPointContainer->fireEvent(DISPID_MediaPlayerBufferingEvent, &dispparamsNoArgs); }; -void VLCPlugin::fireOnPlayingEvent() +void VLCPlugin::fireOnMediaPlayerPlayingEvent() { DISPPARAMS dispparamsNoArgs = {NULL, NULL, 0, 0}; - vlcConnectionPointContainer->fireEvent(DISPID_PlayingEvent, &dispparamsNoArgs); + vlcConnectionPointContainer->fireEvent(DISPID_MediaPlayerPlayingEvent, &dispparamsNoArgs); }; -void VLCPlugin::fireOnPausedEvent() +void VLCPlugin::fireOnMediaPlayerPausedEvent() { DISPPARAMS dispparamsNoArgs = {NULL, NULL, 0, 0}; - vlcConnectionPointContainer->fireEvent(DISPID_PausedEvent, &dispparamsNoArgs); + vlcConnectionPointContainer->fireEvent(DISPID_MediaPlayerPausedEvent, &dispparamsNoArgs); }; -void VLCPlugin::fireOnErrorEvent() +void VLCPlugin::fireOnMediaPlayerEncounteredErrorEvent() { DISPPARAMS dispparamsNoArgs = {NULL, NULL, 0, 0}; - vlcConnectionPointContainer->fireEvent(DISPID_EncounteredErrorEvent, &dispparamsNoArgs); + vlcConnectionPointContainer->fireEvent(DISPID_MediaPlayerEncounteredErrorEvent, &dispparamsNoArgs); }; -void VLCPlugin::fireOnEndedEvent() +void VLCPlugin::fireOnMediaPlayerEndReachedEvent() { DISPPARAMS dispparamsNoArgs = {NULL, NULL, 0, 0}; - vlcConnectionPointContainer->fireEvent(DISPID_EndReachedEvent, &dispparamsNoArgs); + vlcConnectionPointContainer->fireEvent(DISPID_MediaPlayerEndReachedEvent, &dispparamsNoArgs); }; -void VLCPlugin::fireOnStoppedEvent() +void VLCPlugin::fireOnMediaPlayerStoppedEvent() { DISPPARAMS dispparamsNoArgs = {NULL, NULL, 0, 0}; - vlcConnectionPointContainer->fireEvent(DISPID_StoppedEvent, &dispparamsNoArgs); + vlcConnectionPointContainer->fireEvent(DISPID_MediaPlayerStoppedEvent, &dispparamsNoArgs); }; -void VLCPlugin::fireOnForwardEvent() +void VLCPlugin::fireOnMediaPlayerForwardEvent() { DISPPARAMS dispparamsNoArgs = {NULL, NULL, 0, 0}; - vlcConnectionPointContainer->fireEvent(DISPID_ForwardEvent, &dispparamsNoArgs); + vlcConnectionPointContainer->fireEvent(DISPID_MediaPlayerForwardEvent, &dispparamsNoArgs); }; -void VLCPlugin::fireOnBackwardEvent() +void VLCPlugin::fireOnMediaPlayerBackwardEvent() { DISPPARAMS dispparamsNoArgs = {NULL, NULL, 0, 0}; - vlcConnectionPointContainer->fireEvent(DISPID_BackwardEvent, &dispparamsNoArgs); + vlcConnectionPointContainer->fireEvent(DISPID_MediaPlayerBackwardEvent, &dispparamsNoArgs); }; static void handle_input_state_event(const libvlc_event_t* event, void *param) @@ -1073,97 +1075,113 @@ static void handle_input_state_event(const libvlc_event_t* event, void *param) switch( event->type ) { case libvlc_MediaPlayerNothingSpecial: - plugin->fireOnIdleEvent(); + plugin->fireOnMediaPlayerNothingSpecialEvent(); break; case libvlc_MediaPlayerOpening: - plugin->fireOnOpeningEvent(); + plugin->fireOnMediaPlayerOpeningEvent(); break; case libvlc_MediaPlayerBuffering: - plugin->fireOnBufferingEvent(); + plugin->fireOnMediaPlayerBufferingEvent(); break; case libvlc_MediaPlayerPlaying: - plugin->fireOnPlayingEvent(); + plugin->fireOnMediaPlayerPlayingEvent(); break; case libvlc_MediaPlayerPaused: - plugin->fireOnPausedEvent(); + plugin->fireOnMediaPlayerPausedEvent(); break; case libvlc_MediaPlayerStopped: - plugin->fireOnStoppedEvent(); + plugin->fireOnMediaPlayerStoppedEvent(); break; case libvlc_MediaPlayerForward: - plugin->fireOnForwardEvent(); + plugin->fireOnMediaPlayerForwardEvent(); break; case libvlc_MediaPlayerBackward: - plugin->fireOnBackwardEvent(); + plugin->fireOnMediaPlayerBackwardEvent(); break; case libvlc_MediaPlayerEndReached: - plugin->fireOnEndedEvent(); + plugin->fireOnMediaPlayerEndReachedEvent(); break; case libvlc_MediaPlayerEncounteredError: - plugin->fireOnErrorEvent(); + plugin->fireOnMediaPlayerEncounteredErrorEvent(); break; } } -void VLCPlugin::fireOnTimeChangedEvent(long time) +void VLCPlugin::fireOnMediaPlayerTimeChangedEvent(long time) { - VARIANT varPos; - DISPPARAMS params = { &varPos, NULL, 1, 0 }; - varPos.vt = VT_I4; - varPos.lVal = time; - vlcConnectionPointContainer->fireEvent(DISPID_TimeChangedEvent, ¶ms); + DISPPARAMS params; + params.cArgs = 1; + params.rgvarg = (VARIANTARG *) CoTaskMemAlloc(sizeof(VARIANTARG) * params.cArgs) ; + memset(params.rgvarg, 0, sizeof(VARIANTARG) * params.cArgs); + params.rgvarg[0].vt = VT_I4; + params.rgvarg[0].lVal = time; + params.rgdispidNamedArgs = NULL; + params.cNamedArgs = 0; + vlcConnectionPointContainer->fireEvent(DISPID_MediaPlayerTimeChangedEvent, ¶ms); }; static void handle_time_changed_event(const libvlc_event_t* event, void *param) { VLCPlugin *plugin = (VLCPlugin*)param; - plugin->fireOnTimeChangedEvent(event->u.media_player_time_changed.new_time); + plugin->fireOnMediaPlayerTimeChangedEvent(event->u.media_player_time_changed.new_time); } -void VLCPlugin::fireOnPositionChangedEvent(long position) +void VLCPlugin::fireOnMediaPlayerPositionChangedEvent(long position) { - VARIANT varPos; - DISPPARAMS params = { &varPos, NULL, 1, 0 }; - varPos.vt = VT_I4; - varPos.lVal = position; - vlcConnectionPointContainer->fireEvent(DISPID_PositionChangedEvent, ¶ms); + DISPPARAMS params; + params.cArgs = 1; + params.rgvarg = (VARIANTARG *) CoTaskMemAlloc(sizeof(VARIANTARG) * params.cArgs) ; + memset(params.rgvarg, 0, sizeof(VARIANTARG) * params.cArgs); + params.rgvarg[0].vt = VT_I4; + params.rgvarg[0].lVal = position; + params.rgdispidNamedArgs = NULL; + params.cNamedArgs = 0; + vlcConnectionPointContainer->fireEvent(DISPID_MediaPlayerPositionChangedEvent, ¶ms); }; static void handle_position_changed_event(const libvlc_event_t* event, void *param) { VLCPlugin *plugin = (VLCPlugin*)param; - plugin->fireOnPositionChangedEvent(event->u.media_player_position_changed.new_position); + plugin->fireOnMediaPlayerPositionChangedEvent(event->u.media_player_position_changed.new_position); } #define B(val) ((val) ? 0xFFFF : 0x0000) -void VLCPlugin::fireOnSeekableChangedEvent(VARIANT_BOOL seekable) +void VLCPlugin::fireOnMediaPlayerSeekableChangedEvent(VARIANT_BOOL seekable) { - VARIANT varSeek; - DISPPARAMS params = { &varSeek, NULL, 1, 0 }; - varSeek.vt = VT_BOOL; - varSeek.boolVal = seekable; - vlcConnectionPointContainer->fireEvent(DISPID_SeekableChangedEvent, ¶ms); + DISPPARAMS params; + params.cArgs = 1; + params.rgvarg = (VARIANTARG *) CoTaskMemAlloc(sizeof(VARIANTARG) * params.cArgs) ; + memset(params.rgvarg, 0, sizeof(VARIANTARG) * params.cArgs); + params.rgvarg[0].vt = VT_BOOL; + params.rgvarg[0].boolVal = seekable; + params.rgdispidNamedArgs = NULL; + params.cNamedArgs = 0; + vlcConnectionPointContainer->fireEvent(DISPID_MediaPlayerSeekableChangedEvent, ¶ms); }; static void handle_seekable_changed_event(const libvlc_event_t* event, void *param) { VLCPlugin *plugin = (VLCPlugin*)param; - plugin->fireOnSeekableChangedEvent(B(event->u.media_player_seekable_changed.new_seekable)); + plugin->fireOnMediaPlayerSeekableChangedEvent(B(event->u.media_player_seekable_changed.new_seekable)); } -void VLCPlugin::fireOnPausableChangedEvent(VARIANT_BOOL pausable) +void VLCPlugin::fireOnMediaPlayerPausableChangedEvent(VARIANT_BOOL pausable) { - VARIANT varPause; - DISPPARAMS params = { &varPause, NULL, 1, 0 }; - varPause.vt = VT_BOOL; - varPause.boolVal = pausable; - vlcConnectionPointContainer->fireEvent(DISPID_PausableChangedEvent, ¶ms); + DISPPARAMS params; + params.cArgs = 1; + params.rgvarg = (VARIANTARG *) CoTaskMemAlloc(sizeof(VARIANTARG) * params.cArgs) ; + memset(params.rgvarg, 0, sizeof(VARIANTARG) * params.cArgs); + params.rgvarg[0].vt = VT_BOOL; + params.rgvarg[0].boolVal = pausable; + params.rgdispidNamedArgs = NULL; + params.cNamedArgs = 0; + vlcConnectionPointContainer->fireEvent(DISPID_MediaPlayerPausableChangedEvent, ¶ms); }; static void handle_pausable_changed_event(const libvlc_event_t* event, void *param) { VLCPlugin *plugin = (VLCPlugin*)param; - plugin->fireOnPausableChangedEvent(B(event->u.media_player_pausable_changed.new_pausable)); + plugin->fireOnMediaPlayerPausableChangedEvent(B(event->u.media_player_pausable_changed.new_pausable)); } #undef B