1 /*****************************************************************************
2 * vlccontrol2.cpp: ActiveX control for VLC
3 *****************************************************************************
4 * Copyright (C) 2006 the VideoLAN team
5 * Copyright (C) 2010 M2X BV
7 * Authors: Damien Fouilleul <Damien.Fouilleul@laposte.net>
8 * Jean-Paul Saman <jpsaman _at_ m2x _dot_ nl>
10 * This program is free software; you can redistribute it and/or modify
11 * it under the terms of the GNU General Public License as published by
12 * the Free Software Foundation; either version 2 of the License, or
13 * (at your option) any later version.
15 * This program is distributed in the hope that it will be useful,
16 * but WITHOUT ANY WARRANTY; without even the implied warranty of
17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18 * GNU General Public License for more details.
20 * You should have received a copy of the GNU General Public License along
21 * with this program; if not, write to the Free Software Foundation, Inc.,
22 * 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
23 *****************************************************************************/
32 #include "vlccontrol2.h"
33 #include "vlccontrol.h"
38 HRESULT _exception_bridge(VLCPlugin *p,REFIID riid, libvlc_exception_t *ex)
40 if( libvlc_exception_raised(ex) )
42 p->setErrorInfo(riid,libvlc_errmsg());
43 libvlc_exception_clear(ex);
49 #define EMIT_EXCEPTION_BRIDGE( classname ) \
50 HRESULT classname::exception_bridge( libvlc_exception_t *ex ) \
51 { return _exception_bridge( _p_instance, IID_I##classname, ex ); }
53 EMIT_EXCEPTION_BRIDGE( VLCAudio )
54 EMIT_EXCEPTION_BRIDGE( VLCInput )
55 EMIT_EXCEPTION_BRIDGE( VLCMarquee )
56 EMIT_EXCEPTION_BRIDGE( VLCMessageIterator )
57 EMIT_EXCEPTION_BRIDGE( VLCMessages )
58 EMIT_EXCEPTION_BRIDGE( VLCLog )
59 EMIT_EXCEPTION_BRIDGE( VLCLogo )
60 EMIT_EXCEPTION_BRIDGE( VLCPlaylistItems )
61 EMIT_EXCEPTION_BRIDGE( VLCPlaylist )
62 EMIT_EXCEPTION_BRIDGE( VLCVideo )
63 EMIT_EXCEPTION_BRIDGE( VLCSubtitle )
65 #undef EMIT_EXCEPTION_BRIDGE
71 _p_typeinfo->Release();
74 HRESULT VLCAudio::loadTypeInfo(void)
77 if( NULL == _p_typeinfo )
81 hr = _p_instance->getTypeLib(LOCALE_USER_DEFAULT, &p_typelib);
84 hr = p_typelib->GetTypeInfoOfGuid(IID_IVLCAudio, &_p_typeinfo);
95 STDMETHODIMP VLCAudio::GetTypeInfoCount(UINT* pctInfo)
100 if( SUCCEEDED(loadTypeInfo()) )
108 STDMETHODIMP VLCAudio::GetTypeInfo(UINT iTInfo, LCID lcid, LPTYPEINFO* ppTInfo)
110 if( NULL == ppTInfo )
113 if( SUCCEEDED(loadTypeInfo()) )
115 _p_typeinfo->AddRef();
116 *ppTInfo = _p_typeinfo;
123 STDMETHODIMP VLCAudio::GetIDsOfNames(REFIID riid, LPOLESTR* rgszNames,
124 UINT cNames, LCID lcid, DISPID* rgDispID)
126 if( SUCCEEDED(loadTypeInfo()) )
128 return DispGetIDsOfNames(_p_typeinfo, rgszNames, cNames, rgDispID);
133 STDMETHODIMP VLCAudio::Invoke(DISPID dispIdMember, REFIID riid,
134 LCID lcid, WORD wFlags, DISPPARAMS* pDispParams,
135 VARIANT* pVarResult, EXCEPINFO* pExcepInfo, UINT* puArgErr)
137 if( SUCCEEDED(loadTypeInfo()) )
139 return DispInvoke(this, _p_typeinfo, dispIdMember, wFlags, pDispParams,
140 pVarResult, pExcepInfo, puArgErr);
145 STDMETHODIMP VLCAudio::get_mute(VARIANT_BOOL* mute)
150 libvlc_instance_t* p_libvlc;
151 HRESULT hr = _p_instance->getVLC(&p_libvlc);
153 *mute = libvlc_audio_get_mute(p_libvlc) ?
154 VARIANT_TRUE : VARIANT_FALSE;
158 STDMETHODIMP VLCAudio::put_mute(VARIANT_BOOL mute)
160 libvlc_instance_t* p_libvlc;
161 HRESULT hr = _p_instance->getVLC(&p_libvlc);
163 libvlc_audio_set_mute(p_libvlc, VARIANT_FALSE != mute);
167 STDMETHODIMP VLCAudio::get_volume(long* volume)
172 libvlc_instance_t* p_libvlc;
173 HRESULT hr = _p_instance->getVLC(&p_libvlc);
175 *volume = libvlc_audio_get_volume(p_libvlc);
179 STDMETHODIMP VLCAudio::put_volume(long volume)
181 libvlc_instance_t* p_libvlc;
182 HRESULT hr = _p_instance->getVLC(&p_libvlc);
185 libvlc_exception_t ex;
186 libvlc_exception_init(&ex);
188 libvlc_audio_set_volume(p_libvlc, volume, &ex);
189 hr = exception_bridge(&ex);
194 STDMETHODIMP VLCAudio::get_track(long* track)
199 libvlc_media_player_t* p_md;
200 HRESULT hr = _p_instance->getMD(&p_md);
203 libvlc_exception_t ex;
204 libvlc_exception_init(&ex);
206 *track = libvlc_audio_get_track(p_md, &ex);
207 hr = exception_bridge(&ex);
212 STDMETHODIMP VLCAudio::put_track(long track)
214 libvlc_media_player_t *p_md;
215 HRESULT hr = _p_instance->getMD(&p_md);
218 libvlc_exception_t ex;
219 libvlc_exception_init(&ex);
221 libvlc_audio_set_track(p_md, track, &ex);
222 hr = exception_bridge(&ex);
227 STDMETHODIMP VLCAudio::get_count(long* trackNumber)
229 if( NULL == trackNumber )
232 libvlc_media_player_t* p_md;
233 HRESULT hr = _p_instance->getMD(&p_md);
236 libvlc_exception_t ex;
237 libvlc_exception_init(&ex);
238 // get the number of audio track available and return it
239 *trackNumber = libvlc_audio_get_track_count(p_md, &ex);
240 hr = exception_bridge(&ex);
246 STDMETHODIMP VLCAudio::description(long trackID, BSTR* name)
251 libvlc_media_player_t* p_md;
252 libvlc_exception_t ex;
253 libvlc_exception_init(&ex);
255 HRESULT hr = _p_instance->getMD(&p_md);
259 const char *psz_name;
260 libvlc_track_description_t *p_trackDesc;
262 // get tracks description
263 p_trackDesc = libvlc_audio_get_track_description(p_md, &ex);
264 hr = exception_bridge(&ex);
268 //get the number of available track
269 i_limit = libvlc_audio_get_track_count(p_md, &ex);
270 hr = exception_bridge(&ex);
274 // check if the number given is a good one
275 if ( ( trackID > ( i_limit -1 ) ) || ( trackID < 0 ) )
278 // get the good trackDesc
279 for( i = 0 ; i < trackID ; i++ )
281 p_trackDesc = p_trackDesc->p_next;
283 // get the track name
284 psz_name = p_trackDesc->psz_name;
287 if( psz_name != NULL )
289 *name = BSTRFromCStr(CP_UTF8, psz_name);
290 return (NULL == *name) ? E_OUTOFMEMORY : NOERROR;
298 STDMETHODIMP VLCAudio::get_channel(long *channel)
300 if( NULL == channel )
303 libvlc_instance_t* p_libvlc;
304 HRESULT hr = _p_instance->getVLC(&p_libvlc);
307 libvlc_exception_t ex;
308 libvlc_exception_init(&ex);
310 *channel = libvlc_audio_get_channel(p_libvlc, &ex);
311 hr = exception_bridge(&ex);
316 STDMETHODIMP VLCAudio::put_channel(long channel)
318 libvlc_instance_t* p_libvlc;
319 HRESULT hr = _p_instance->getVLC(&p_libvlc);
322 libvlc_exception_t ex;
323 libvlc_exception_init(&ex);
325 libvlc_audio_set_channel(p_libvlc, channel, &ex);
326 hr = exception_bridge(&ex);
331 STDMETHODIMP VLCAudio::toggleMute()
333 libvlc_instance_t* p_libvlc;
334 HRESULT hr = _p_instance->getVLC(&p_libvlc);
336 libvlc_audio_toggle_mute(p_libvlc);
340 /****************************************************************************/
342 VLCInput::~VLCInput()
345 _p_typeinfo->Release();
348 HRESULT VLCInput::loadTypeInfo(void)
350 HRESULT hr = NOERROR;
351 if( NULL == _p_typeinfo )
355 hr = _p_instance->getTypeLib(LOCALE_USER_DEFAULT, &p_typelib);
358 hr = p_typelib->GetTypeInfoOfGuid(IID_IVLCInput, &_p_typeinfo);
363 p_typelib->Release();
369 STDMETHODIMP VLCInput::GetTypeInfoCount(UINT* pctInfo)
371 if( NULL == pctInfo )
374 if( SUCCEEDED(loadTypeInfo()) )
382 STDMETHODIMP VLCInput::GetTypeInfo(UINT iTInfo, LCID lcid, LPTYPEINFO* ppTInfo)
384 if( NULL == ppTInfo )
387 if( SUCCEEDED(loadTypeInfo()) )
389 _p_typeinfo->AddRef();
390 *ppTInfo = _p_typeinfo;
397 STDMETHODIMP VLCInput::GetIDsOfNames(REFIID riid, LPOLESTR* rgszNames,
398 UINT cNames, LCID lcid, DISPID* rgDispID)
400 if( SUCCEEDED(loadTypeInfo()) )
402 return DispGetIDsOfNames(_p_typeinfo, rgszNames, cNames, rgDispID);
407 STDMETHODIMP VLCInput::Invoke(DISPID dispIdMember, REFIID riid,
408 LCID lcid, WORD wFlags, DISPPARAMS* pDispParams,
409 VARIANT* pVarResult, EXCEPINFO* pExcepInfo, UINT* puArgErr)
411 if( SUCCEEDED(loadTypeInfo()) )
413 return DispInvoke(this, _p_typeinfo, dispIdMember, wFlags, pDispParams,
414 pVarResult, pExcepInfo, puArgErr);
419 STDMETHODIMP VLCInput::get_length(double* length)
425 libvlc_media_player_t *p_md;
426 HRESULT hr = _p_instance->getMD(&p_md);
429 libvlc_exception_t ex;
430 libvlc_exception_init(&ex);
432 *length = (double)libvlc_media_player_get_length(p_md, &ex);
433 hr = exception_bridge(&ex);
438 STDMETHODIMP VLCInput::get_position(double* position)
440 if( NULL == position )
444 libvlc_media_player_t *p_md;
445 HRESULT hr = _p_instance->getMD(&p_md);
448 libvlc_exception_t ex;
449 libvlc_exception_init(&ex);
451 *position = libvlc_media_player_get_position(p_md, &ex);
452 hr = exception_bridge(&ex);
457 STDMETHODIMP VLCInput::put_position(double position)
459 libvlc_media_player_t *p_md;
460 HRESULT hr = _p_instance->getMD(&p_md);
463 libvlc_exception_t ex;
464 libvlc_exception_init(&ex);
466 libvlc_media_player_set_position(p_md, position, &ex);
467 hr = exception_bridge(&ex);
472 STDMETHODIMP VLCInput::get_time(double* time)
477 libvlc_media_player_t *p_md;
478 HRESULT hr = _p_instance->getMD(&p_md);
481 libvlc_exception_t ex;
482 libvlc_exception_init(&ex);
484 *time = (double)libvlc_media_player_get_time(p_md, &ex);
485 hr = exception_bridge(&ex);
490 STDMETHODIMP VLCInput::put_time(double time)
492 libvlc_media_player_t *p_md;
493 HRESULT hr = _p_instance->getMD(&p_md);
496 libvlc_exception_t ex;
497 libvlc_exception_init(&ex);
499 libvlc_media_player_set_time(p_md, (int64_t)time, &ex);
500 hr = exception_bridge(&ex);
505 STDMETHODIMP VLCInput::get_state(long* state)
510 libvlc_media_player_t *p_md;
511 HRESULT hr = _p_instance->getMD(&p_md);
514 libvlc_exception_t ex;
515 libvlc_exception_init(&ex);
517 *state = libvlc_media_player_get_state(p_md, &ex);
518 if( libvlc_exception_raised(&ex) )
520 // don't fail, just return the idle state
522 libvlc_exception_clear(&ex);
528 STDMETHODIMP VLCInput::get_rate(double* rate)
533 libvlc_media_player_t *p_md;
534 HRESULT hr = _p_instance->getMD(&p_md);
537 libvlc_exception_t ex;
538 libvlc_exception_init(&ex);
540 *rate = libvlc_media_player_get_rate(p_md, &ex);
541 hr = exception_bridge(&ex);
546 STDMETHODIMP VLCInput::put_rate(double rate)
548 libvlc_media_player_t *p_md;
549 HRESULT hr = _p_instance->getMD(&p_md);
552 libvlc_exception_t ex;
553 libvlc_exception_init(&ex);
555 libvlc_media_player_set_rate(p_md, rate, &ex);
556 hr = exception_bridge(&ex);
561 STDMETHODIMP VLCInput::get_fps(double* fps)
567 libvlc_media_player_t *p_md;
568 HRESULT hr = _p_instance->getMD(&p_md);
571 libvlc_exception_t ex;
572 libvlc_exception_init(&ex);
574 *fps = libvlc_media_player_get_fps(p_md, &ex);
575 hr = exception_bridge(&ex);
580 STDMETHODIMP VLCInput::get_hasVout(VARIANT_BOOL* hasVout)
582 if( NULL == hasVout )
585 libvlc_media_player_t *p_md;
586 HRESULT hr = _p_instance->getMD(&p_md);
589 libvlc_exception_t ex;
590 libvlc_exception_init(&ex);
592 *hasVout = libvlc_media_player_has_vout(p_md, &ex) ?
593 VARIANT_TRUE : VARIANT_FALSE;
594 hr = exception_bridge(&ex);
599 /****************************************************************************/
603 delete _p_vlcmessages;
605 libvlc_log_close(_p_log);
608 _p_typeinfo->Release();
611 HRESULT VLCLog::loadTypeInfo(void)
613 HRESULT hr = NOERROR;
614 if( NULL == _p_typeinfo )
618 hr = _p_instance->getTypeLib(LOCALE_USER_DEFAULT, &p_typelib);
621 hr = p_typelib->GetTypeInfoOfGuid(IID_IVLCLog, &_p_typeinfo);
626 p_typelib->Release();
632 STDMETHODIMP VLCLog::GetTypeInfoCount(UINT* pctInfo)
634 if( NULL == pctInfo )
637 if( SUCCEEDED(loadTypeInfo()) )
645 STDMETHODIMP VLCLog::GetTypeInfo(UINT iTInfo, LCID lcid, LPTYPEINFO* ppTInfo)
647 if( NULL == ppTInfo )
650 if( SUCCEEDED(loadTypeInfo()) )
652 _p_typeinfo->AddRef();
653 *ppTInfo = _p_typeinfo;
660 STDMETHODIMP VLCLog::GetIDsOfNames(REFIID riid, LPOLESTR* rgszNames,
661 UINT cNames, LCID lcid, DISPID* rgDispID)
663 if( SUCCEEDED(loadTypeInfo()) )
665 return DispGetIDsOfNames(_p_typeinfo, rgszNames, cNames, rgDispID);
670 STDMETHODIMP VLCLog::Invoke(DISPID dispIdMember, REFIID riid,
671 LCID lcid, WORD wFlags, DISPPARAMS* pDispParams,
672 VARIANT* pVarResult, EXCEPINFO* pExcepInfo, UINT* puArgErr)
674 if( SUCCEEDED(loadTypeInfo()) )
676 return DispInvoke(this, _p_typeinfo, dispIdMember, wFlags, pDispParams,
677 pVarResult, pExcepInfo, puArgErr);
682 STDMETHODIMP VLCLog::get_messages(IVLCMessages** obj)
687 *obj = _p_vlcmessages;
688 if( NULL != _p_vlcmessages )
690 _p_vlcmessages->AddRef();
693 return E_OUTOFMEMORY;
696 STDMETHODIMP VLCLog::get_verbosity(long* level)
703 libvlc_instance_t* p_libvlc;
704 HRESULT hr = _p_instance->getVLC(&p_libvlc);
706 *level = libvlc_get_log_verbosity(p_libvlc);
711 /* log is not enabled, return -1 */
717 STDMETHODIMP VLCLog::put_verbosity(long verbosity)
719 libvlc_instance_t* p_libvlc;
720 HRESULT hr = _p_instance->getVLC(&p_libvlc);
723 libvlc_exception_t ex;
724 libvlc_exception_init(&ex);
730 _p_log = libvlc_log_open(p_libvlc, &ex);
731 hr = exception_bridge(&ex);
734 libvlc_set_log_verbosity(p_libvlc, (unsigned)verbosity);
738 /* close log when verbosity is set to -1 */
739 libvlc_log_close(_p_log);
742 hr = exception_bridge(&ex);
747 /****************************************************************************/
749 VLCMarquee::~VLCMarquee()
752 _p_typeinfo->Release();
755 HRESULT VLCMarquee::loadTypeInfo(void)
757 HRESULT hr = NOERROR;
758 if( NULL == _p_typeinfo )
762 hr = _p_instance->getTypeLib(LOCALE_USER_DEFAULT, &p_typelib);
765 hr = p_typelib->GetTypeInfoOfGuid(IID_IVLCMarquee, &_p_typeinfo);
770 p_typelib->Release();
776 STDMETHODIMP VLCMarquee::GetTypeInfoCount(UINT* pctInfo)
778 if( NULL == pctInfo )
781 if( SUCCEEDED(loadTypeInfo()) )
789 STDMETHODIMP VLCMarquee::GetTypeInfo(UINT iTInfo, LCID lcid, LPTYPEINFO* ppTInfo)
791 if( NULL == ppTInfo )
794 if( SUCCEEDED(loadTypeInfo()) )
796 _p_typeinfo->AddRef();
797 *ppTInfo = _p_typeinfo;
804 STDMETHODIMP VLCMarquee::GetIDsOfNames(REFIID riid, LPOLESTR* rgszNames,
805 UINT cNames, LCID lcid, DISPID* rgDispID)
807 if( SUCCEEDED(loadTypeInfo()) )
809 return DispGetIDsOfNames(_p_typeinfo, rgszNames, cNames, rgDispID);
814 HRESULT VLCMarquee::do_put_int(unsigned idx, LONG val)
816 libvlc_media_player_t *p_md;
817 HRESULT hr = _p_instance->getMD(&p_md);
820 libvlc_exception_t ex;
821 libvlc_exception_init(&ex);
822 libvlc_video_set_marquee_int(p_md, idx, val, &ex);
823 hr = exception_bridge(&ex);
828 HRESULT VLCMarquee::do_get_int(unsigned idx, LONG *val)
833 libvlc_media_player_t *p_md;
834 HRESULT hr = _p_instance->getMD(&p_md);
837 libvlc_exception_t ex;
838 libvlc_exception_init(&ex);
839 *val = libvlc_video_get_marquee_int(p_md, idx, &ex);
840 hr = exception_bridge(&ex);
845 STDMETHODIMP VLCMarquee::Invoke(DISPID dispIdMember, REFIID riid,
846 LCID lcid, WORD wFlags, DISPPARAMS* pDispParams,
847 VARIANT* pVarResult, EXCEPINFO* pExcepInfo, UINT* puArgErr)
849 if( SUCCEEDED(loadTypeInfo()) )
851 return DispInvoke(this, _p_typeinfo, dispIdMember, wFlags, pDispParams,
852 pVarResult, pExcepInfo, puArgErr);
857 STDMETHODIMP VLCMarquee::get_position(BSTR* val)
863 HRESULT hr = do_get_int(libvlc_marquee_Position, &i);
866 *val = BSTRFromCStr(CP_UTF8, position_bynumber(i));
871 STDMETHODIMP VLCMarquee::put_position(BSTR val)
873 char *n = CStrFromBSTR(CP_UTF8, val);
874 if( !n ) return E_OUTOFMEMORY;
878 if( position_byname( n, i ) )
879 hr = do_put_int(libvlc_marquee_Position,i);
887 STDMETHODIMP VLCMarquee::get_text(BSTR *val)
893 libvlc_media_player_t *p_md;
894 HRESULT hr = _p_instance->getMD(&p_md);
897 libvlc_exception_t ex;
898 libvlc_exception_init(&ex);
900 psz = libvlc_video_get_marquee_string(p_md, libvlc_marquee_Text, &ex);
902 hr = exception_bridge(&ex);
904 *val = BSTRFromCStr(CP_UTF8, psz);
909 STDMETHODIMP VLCMarquee::put_text(BSTR val)
911 libvlc_media_player_t *p_md;
912 HRESULT hr = _p_instance->getMD(&p_md);
915 libvlc_exception_t ex;
916 libvlc_exception_init(&ex);
918 char *psz_text = CStrFromBSTR(CP_UTF8, val);
919 libvlc_video_set_marquee_string(p_md, libvlc_marquee_Text,
921 hr = exception_bridge(&ex);
922 CoTaskMemFree(psz_text);
927 /****************************************************************************/
929 /* STL forward iterator used by VLCEnumIterator class to implement IEnumVARIANT */
931 class VLCMessageSTLIterator
936 VLCMessageSTLIterator(IVLCMessageIterator* iter) : iter(iter), msg(NULL)
942 VLCMessageSTLIterator(const VLCMessageSTLIterator& other)
952 virtual ~VLCMessageSTLIterator()
961 // we only need prefix ++ operator
962 VLCMessageSTLIterator& operator++()
964 VARIANT_BOOL hasNext = VARIANT_FALSE;
967 iter->get_hasNext(&hasNext);
974 if( VARIANT_TRUE == hasNext ) {
981 VARIANT operator*() const
987 if( SUCCEEDED(msg->QueryInterface(IID_IDispatch,
988 (LPVOID*)&V_DISPATCH(&v))) )
990 V_VT(&v) = VT_DISPATCH;
996 bool operator==(const VLCMessageSTLIterator& other) const
998 return msg == other.msg;
1001 bool operator!=(const VLCMessageSTLIterator& other) const
1003 return msg != other.msg;
1007 IVLCMessageIterator* iter;
1011 ////////////////////////////////////////////////////////////////////////////////////////////////////////////
1013 VLCMessages::~VLCMessages()
1016 _p_typeinfo->Release();
1019 HRESULT VLCMessages::loadTypeInfo(void)
1021 HRESULT hr = NOERROR;
1022 if( NULL == _p_typeinfo )
1024 ITypeLib *p_typelib;
1026 hr = _p_instance->getTypeLib(LOCALE_USER_DEFAULT, &p_typelib);
1029 hr = p_typelib->GetTypeInfoOfGuid(IID_IVLCMessages, &_p_typeinfo);
1034 p_typelib->Release();
1040 STDMETHODIMP VLCMessages::GetTypeInfoCount(UINT* pctInfo)
1042 if( NULL == pctInfo )
1043 return E_INVALIDARG;
1045 if( SUCCEEDED(loadTypeInfo()) )
1053 STDMETHODIMP VLCMessages::GetTypeInfo(UINT iTInfo, LCID lcid, LPTYPEINFO* ppTInfo)
1055 if( NULL == ppTInfo )
1056 return E_INVALIDARG;
1058 if( SUCCEEDED(loadTypeInfo()) )
1060 _p_typeinfo->AddRef();
1061 *ppTInfo = _p_typeinfo;
1068 STDMETHODIMP VLCMessages::GetIDsOfNames(REFIID riid, LPOLESTR* rgszNames,
1069 UINT cNames, LCID lcid, DISPID* rgDispID)
1071 if( SUCCEEDED(loadTypeInfo()) )
1073 return DispGetIDsOfNames(_p_typeinfo, rgszNames, cNames, rgDispID);
1078 STDMETHODIMP VLCMessages::Invoke(DISPID dispIdMember, REFIID riid,
1079 LCID lcid, WORD wFlags, DISPPARAMS* pDispParams,
1080 VARIANT* pVarResult, EXCEPINFO* pExcepInfo, UINT* puArgErr)
1082 if( SUCCEEDED(loadTypeInfo()) )
1084 return DispInvoke(this, _p_typeinfo, dispIdMember, wFlags, pDispParams,
1085 pVarResult, pExcepInfo, puArgErr);
1090 STDMETHODIMP VLCMessages::get__NewEnum(LPUNKNOWN* _NewEnum)
1092 if( NULL == _NewEnum )
1095 IVLCMessageIterator* iter = NULL;
1098 *_NewEnum= new VLCEnumIterator<IID_IEnumVARIANT,
1101 VLCMessageSTLIterator>
1102 (VLCMessageSTLIterator(iter), VLCMessageSTLIterator(NULL));
1104 return *_NewEnum ? S_OK : E_OUTOFMEMORY;
1107 STDMETHODIMP VLCMessages::clear()
1109 libvlc_log_t *p_log = _p_vlclog->_p_log;
1111 libvlc_log_clear(p_log);
1115 STDMETHODIMP VLCMessages::get_count(long* count)
1120 libvlc_log_t *p_log = _p_vlclog->_p_log;
1121 *count = libvlc_log_count(p_log);
1125 STDMETHODIMP VLCMessages::iterator(IVLCMessageIterator** iter)
1130 *iter = new VLCMessageIterator(_p_instance, _p_vlclog);
1132 return *iter ? S_OK : E_OUTOFMEMORY;
1135 /****************************************************************************/
1137 VLCMessageIterator::VLCMessageIterator(VLCPlugin *p_instance, VLCLog* p_vlclog ) :
1138 _p_instance(p_instance),
1143 if( p_vlclog->_p_log )
1145 _p_iter = libvlc_log_get_iterator(p_vlclog->_p_log, NULL);
1151 VLCMessageIterator::~VLCMessageIterator()
1154 libvlc_log_iterator_free(_p_iter);
1157 _p_typeinfo->Release();
1160 HRESULT VLCMessageIterator::loadTypeInfo(void)
1162 HRESULT hr = NOERROR;
1163 if( NULL == _p_typeinfo )
1165 ITypeLib *p_typelib;
1167 hr = _p_instance->getTypeLib(LOCALE_USER_DEFAULT, &p_typelib);
1170 hr = p_typelib->GetTypeInfoOfGuid(IID_IVLCMessageIterator, &_p_typeinfo);
1175 p_typelib->Release();
1181 STDMETHODIMP VLCMessageIterator::GetTypeInfoCount(UINT* pctInfo)
1183 if( NULL == pctInfo )
1184 return E_INVALIDARG;
1186 if( SUCCEEDED(loadTypeInfo()) )
1194 STDMETHODIMP VLCMessageIterator::GetTypeInfo(UINT iTInfo, LCID lcid, LPTYPEINFO* ppTInfo)
1196 if( NULL == ppTInfo )
1197 return E_INVALIDARG;
1199 if( SUCCEEDED(loadTypeInfo()) )
1201 _p_typeinfo->AddRef();
1202 *ppTInfo = _p_typeinfo;
1209 STDMETHODIMP VLCMessageIterator::GetIDsOfNames(REFIID riid, LPOLESTR* rgszNames,
1210 UINT cNames, LCID lcid, DISPID* rgDispID)
1212 if( SUCCEEDED(loadTypeInfo()) )
1214 return DispGetIDsOfNames(_p_typeinfo, rgszNames, cNames, rgDispID);
1219 STDMETHODIMP VLCMessageIterator::Invoke(DISPID dispIdMember, REFIID riid,
1220 LCID lcid, WORD wFlags, DISPPARAMS* pDispParams,
1221 VARIANT* pVarResult, EXCEPINFO* pExcepInfo, UINT* puArgErr)
1223 if( SUCCEEDED(loadTypeInfo()) )
1225 return DispInvoke(this, _p_typeinfo, dispIdMember, wFlags, pDispParams,
1226 pVarResult, pExcepInfo, puArgErr);
1231 STDMETHODIMP VLCMessageIterator::get_hasNext(VARIANT_BOOL* hasNext)
1233 if( NULL == hasNext )
1236 if( _p_iter && _p_vlclog->_p_log )
1238 *hasNext = libvlc_log_iterator_has_next(_p_iter) ?
1239 VARIANT_TRUE : VARIANT_FALSE;
1243 *hasNext = VARIANT_FALSE;
1248 STDMETHODIMP VLCMessageIterator::next(IVLCMessage** message)
1252 if( NULL == message )
1255 if( _p_iter && _p_vlclog->_p_log )
1257 struct libvlc_log_message_t buffer;
1259 buffer.sizeof_msg = sizeof(buffer);
1261 libvlc_exception_t ex;
1262 libvlc_exception_init(&ex);
1264 libvlc_log_iterator_next(_p_iter, &buffer, &ex);
1265 *message = new VLCMessage(_p_instance, buffer);
1272 /****************************************************************************/
1274 VLCMessage::~VLCMessage()
1277 _p_typeinfo->Release();
1280 HRESULT VLCMessage::loadTypeInfo(void)
1282 HRESULT hr = NOERROR;
1283 if( NULL == _p_typeinfo )
1285 ITypeLib *p_typelib;
1287 hr = _p_instance->getTypeLib(LOCALE_USER_DEFAULT, &p_typelib);
1290 hr = p_typelib->GetTypeInfoOfGuid(IID_IVLCMessage, &_p_typeinfo);
1295 p_typelib->Release();
1301 STDMETHODIMP VLCMessage::GetTypeInfoCount(UINT* pctInfo)
1303 if( NULL == pctInfo )
1304 return E_INVALIDARG;
1306 if( SUCCEEDED(loadTypeInfo()) )
1314 STDMETHODIMP VLCMessage::GetTypeInfo(UINT iTInfo, LCID lcid, LPTYPEINFO* ppTInfo)
1316 if( NULL == ppTInfo )
1317 return E_INVALIDARG;
1319 if( SUCCEEDED(loadTypeInfo()) )
1321 _p_typeinfo->AddRef();
1322 *ppTInfo = _p_typeinfo;
1329 STDMETHODIMP VLCMessage::GetIDsOfNames(REFIID riid, LPOLESTR* rgszNames,
1330 UINT cNames, LCID lcid, DISPID* rgDispID)
1332 if( SUCCEEDED(loadTypeInfo()) )
1334 return DispGetIDsOfNames(_p_typeinfo, rgszNames, cNames, rgDispID);
1339 STDMETHODIMP VLCMessage::Invoke(DISPID dispIdMember, REFIID riid,
1340 LCID lcid, WORD wFlags, DISPPARAMS* pDispParams,
1341 VARIANT* pVarResult, EXCEPINFO* pExcepInfo, UINT* puArgErr)
1343 if( SUCCEEDED(loadTypeInfo()) )
1345 return DispInvoke(this, _p_typeinfo, dispIdMember, wFlags, pDispParams,
1346 pVarResult, pExcepInfo, puArgErr);
1351 inline const char *msgSeverity(int sev)
1366 STDMETHODIMP VLCMessage::get__Value(VARIANT* _Value)
1368 if( NULL == _Value )
1373 snprintf(buffer, sizeof(buffer), "%s %s %s: %s",
1374 _msg.psz_type, _msg.psz_name, msgSeverity(_msg.i_severity), _msg.psz_message);
1376 V_VT(_Value) = VT_BSTR;
1377 V_BSTR(_Value) = BSTRFromCStr(CP_UTF8, buffer);
1382 STDMETHODIMP VLCMessage::get_severity(long* level)
1387 *level = _msg.i_severity;
1392 STDMETHODIMP VLCMessage::get_type(BSTR* type)
1397 *type = BSTRFromCStr(CP_UTF8, _msg.psz_type);
1402 STDMETHODIMP VLCMessage::get_name(BSTR* name)
1407 *name = BSTRFromCStr(CP_UTF8, _msg.psz_name);
1412 STDMETHODIMP VLCMessage::get_header(BSTR* header)
1414 if( NULL == header )
1417 *header = BSTRFromCStr(CP_UTF8, _msg.psz_header);
1422 STDMETHODIMP VLCMessage::get_message(BSTR* message)
1424 if( NULL == message )
1427 *message = BSTRFromCStr(CP_UTF8, _msg.psz_message);
1432 /****************************************************************************/
1434 VLCPlaylistItems::~VLCPlaylistItems()
1437 _p_typeinfo->Release();
1440 HRESULT VLCPlaylistItems::loadTypeInfo(void)
1442 HRESULT hr = NOERROR;
1443 if( NULL == _p_typeinfo )
1445 ITypeLib *p_typelib;
1447 hr = _p_instance->getTypeLib(LOCALE_USER_DEFAULT, &p_typelib);
1450 hr = p_typelib->GetTypeInfoOfGuid(IID_IVLCPlaylistItems, &_p_typeinfo);
1455 p_typelib->Release();
1461 STDMETHODIMP VLCPlaylistItems::GetTypeInfoCount(UINT* pctInfo)
1463 if( NULL == pctInfo )
1464 return E_INVALIDARG;
1466 if( SUCCEEDED(loadTypeInfo()) )
1474 STDMETHODIMP VLCPlaylistItems::GetTypeInfo(UINT iTInfo, LCID lcid, LPTYPEINFO* ppTInfo)
1476 if( NULL == ppTInfo )
1477 return E_INVALIDARG;
1479 if( SUCCEEDED(loadTypeInfo()) )
1481 _p_typeinfo->AddRef();
1482 *ppTInfo = _p_typeinfo;
1489 STDMETHODIMP VLCPlaylistItems::GetIDsOfNames(REFIID riid, LPOLESTR* rgszNames,
1490 UINT cNames, LCID lcid, DISPID* rgDispID)
1492 if( SUCCEEDED(loadTypeInfo()) )
1494 return DispGetIDsOfNames(_p_typeinfo, rgszNames, cNames, rgDispID);
1499 STDMETHODIMP VLCPlaylistItems::Invoke(DISPID dispIdMember, REFIID riid,
1500 LCID lcid, WORD wFlags, DISPPARAMS* pDispParams,
1501 VARIANT* pVarResult, EXCEPINFO* pExcepInfo, UINT* puArgErr)
1503 if( SUCCEEDED(loadTypeInfo()) )
1505 return DispInvoke(this, _p_typeinfo, dispIdMember, wFlags, pDispParams,
1506 pVarResult, pExcepInfo, puArgErr);
1511 STDMETHODIMP VLCPlaylistItems::get_count(long* count)
1516 libvlc_exception_t ex;
1517 libvlc_exception_init(&ex);
1519 *count = _p_instance->playlist_count(&ex);
1520 return exception_bridge(&ex);
1523 STDMETHODIMP VLCPlaylistItems::clear()
1525 libvlc_exception_t ex;
1526 libvlc_exception_init(&ex);
1528 _p_instance->playlist_clear(&ex);
1529 return exception_bridge(&ex);
1532 STDMETHODIMP VLCPlaylistItems::remove(long item)
1534 libvlc_instance_t* p_libvlc;
1535 HRESULT hr = _p_instance->getVLC(&p_libvlc);
1538 libvlc_exception_t ex;
1539 libvlc_exception_init(&ex);
1541 _p_instance->playlist_delete_item(item, &ex);
1542 hr = exception_bridge(&ex);
1547 /****************************************************************************/
1549 VLCPlaylist::~VLCPlaylist()
1551 delete _p_vlcplaylistitems;
1553 _p_typeinfo->Release();
1556 HRESULT VLCPlaylist::loadTypeInfo(void)
1558 HRESULT hr = NOERROR;
1559 if( NULL == _p_typeinfo )
1561 ITypeLib *p_typelib;
1563 hr = _p_instance->getTypeLib(LOCALE_USER_DEFAULT, &p_typelib);
1566 hr = p_typelib->GetTypeInfoOfGuid(IID_IVLCPlaylist, &_p_typeinfo);
1571 p_typelib->Release();
1577 STDMETHODIMP VLCPlaylist::GetTypeInfoCount(UINT* pctInfo)
1579 if( NULL == pctInfo )
1580 return E_INVALIDARG;
1582 if( SUCCEEDED(loadTypeInfo()) )
1590 STDMETHODIMP VLCPlaylist::GetTypeInfo(UINT iTInfo, LCID lcid, LPTYPEINFO* ppTInfo)
1592 if( NULL == ppTInfo )
1593 return E_INVALIDARG;
1595 if( SUCCEEDED(loadTypeInfo()) )
1597 _p_typeinfo->AddRef();
1598 *ppTInfo = _p_typeinfo;
1605 STDMETHODIMP VLCPlaylist::GetIDsOfNames(REFIID riid, LPOLESTR* rgszNames,
1606 UINT cNames, LCID lcid, DISPID* rgDispID)
1608 if( SUCCEEDED(loadTypeInfo()) )
1610 return DispGetIDsOfNames(_p_typeinfo, rgszNames, cNames, rgDispID);
1615 STDMETHODIMP VLCPlaylist::Invoke(DISPID dispIdMember, REFIID riid,
1616 LCID lcid, WORD wFlags, DISPPARAMS* pDispParams,
1617 VARIANT* pVarResult, EXCEPINFO* pExcepInfo, UINT* puArgErr)
1619 if( SUCCEEDED(loadTypeInfo()) )
1621 return DispInvoke(this, _p_typeinfo, dispIdMember, wFlags, pDispParams,
1622 pVarResult, pExcepInfo, puArgErr);
1627 STDMETHODIMP VLCPlaylist::get_itemCount(long* count)
1633 libvlc_exception_t ex;
1634 libvlc_exception_init(&ex);
1636 *count = _p_instance->playlist_count(&ex);
1637 return exception_bridge(&ex);
1640 STDMETHODIMP VLCPlaylist::get_isPlaying(VARIANT_BOOL* isPlaying)
1642 if( NULL == isPlaying )
1645 libvlc_media_player_t *p_md;
1646 HRESULT hr = _p_instance->getMD(&p_md);
1649 libvlc_exception_t ex;
1650 libvlc_exception_init(&ex);
1652 *isPlaying = libvlc_media_player_is_playing(p_md, &ex) ?
1653 VARIANT_TRUE: VARIANT_FALSE;
1654 libvlc_exception_clear(&ex);
1659 STDMETHODIMP VLCPlaylist::add(BSTR uri, VARIANT name, VARIANT options, long* item)
1664 if( 0 == SysStringLen(uri) )
1665 return E_INVALIDARG;
1667 libvlc_instance_t* p_libvlc;
1668 HRESULT hr = _p_instance->getVLC(&p_libvlc);
1671 libvlc_exception_t ex;
1672 libvlc_exception_init(&ex);
1674 char *psz_uri = NULL;
1675 if( SysStringLen(_p_instance->getBaseURL()) > 0 )
1678 ** if the MRL a relative URL, we should end up with an absolute URL
1680 LPWSTR abs_url = CombineURL(_p_instance->getBaseURL(), uri);
1681 if( NULL != abs_url )
1683 psz_uri = CStrFromWSTR(CP_UTF8, abs_url, wcslen(abs_url));
1684 CoTaskMemFree(abs_url);
1688 psz_uri = CStrFromBSTR(CP_UTF8, uri);
1694 ** baseURL is empty, assume MRL is absolute
1696 psz_uri = CStrFromBSTR(CP_UTF8, uri);
1699 if( NULL == psz_uri )
1701 return E_OUTOFMEMORY;
1705 char **ppsz_options;
1707 hr = VLCControl::CreateTargetOptions(CP_UTF8, &options, &ppsz_options, &i_options);
1710 CoTaskMemFree(psz_uri);
1714 char *psz_name = NULL;
1716 VariantInit(&v_name);
1717 if( SUCCEEDED(VariantChangeType(&v_name, &name, 0, VT_BSTR)) )
1719 if( SysStringLen(V_BSTR(&v_name)) > 0 )
1720 psz_name = CStrFromBSTR(CP_UTF8, V_BSTR(&v_name));
1722 VariantClear(&v_name);
1725 *item = _p_instance->playlist_add_extended_untrusted(psz_uri,
1726 i_options, const_cast<const char **>(ppsz_options), &ex);
1728 VLCControl::FreeTargetOptions(ppsz_options, i_options);
1729 CoTaskMemFree(psz_uri);
1730 if( psz_name ) /* XXX Do we even need to check? */
1731 CoTaskMemFree(psz_name);
1732 hr = exception_bridge(&ex);
1737 STDMETHODIMP VLCPlaylist::play()
1739 libvlc_exception_t ex;
1740 libvlc_exception_init(&ex);
1742 _p_instance->playlist_play(&ex);
1743 return exception_bridge(&ex);
1746 STDMETHODIMP VLCPlaylist::playItem(long item)
1748 libvlc_exception_t ex;
1749 libvlc_exception_init(&ex);
1751 _p_instance->playlist_play_item(item,&ex);
1752 return exception_bridge(&ex);;
1755 STDMETHODIMP VLCPlaylist::togglePause()
1757 libvlc_media_player_t* p_md;
1758 HRESULT hr = _p_instance->getMD(&p_md);
1761 libvlc_exception_t ex;
1762 libvlc_exception_init(&ex);
1764 libvlc_media_player_pause(p_md, &ex);
1765 hr = exception_bridge(&ex);;
1770 STDMETHODIMP VLCPlaylist::stop()
1772 libvlc_media_player_t *p_md;
1773 HRESULT hr = _p_instance->getMD(&p_md);
1776 libvlc_exception_t ex;
1777 libvlc_exception_init(&ex);
1779 libvlc_media_player_stop(p_md, &ex);
1780 hr = exception_bridge(&ex);;
1785 STDMETHODIMP VLCPlaylist::next()
1787 libvlc_exception_t ex;
1788 libvlc_exception_init(&ex);
1790 _p_instance->playlist_next(&ex);
1791 return exception_bridge(&ex);;
1794 STDMETHODIMP VLCPlaylist::prev()
1796 libvlc_exception_t ex;
1797 libvlc_exception_init(&ex);
1799 _p_instance->playlist_prev(&ex);
1800 return exception_bridge(&ex);;
1803 STDMETHODIMP VLCPlaylist::clear()
1805 libvlc_exception_t ex;
1806 libvlc_exception_init(&ex);
1808 _p_instance->playlist_clear(&ex);
1809 return exception_bridge(&ex);;
1812 STDMETHODIMP VLCPlaylist::removeItem(long item)
1814 libvlc_instance_t* p_libvlc;
1815 HRESULT hr = _p_instance->getVLC(&p_libvlc);
1818 libvlc_exception_t ex;
1819 libvlc_exception_init(&ex);
1821 _p_instance->playlist_delete_item(item, &ex);
1822 hr = exception_bridge(&ex);;
1827 STDMETHODIMP VLCPlaylist::get_items(IVLCPlaylistItems** obj)
1832 *obj = _p_vlcplaylistitems;
1833 if( NULL != _p_vlcplaylistitems )
1835 _p_vlcplaylistitems->AddRef();
1838 return E_OUTOFMEMORY;
1841 /****************************************************************************/
1843 VLCSubtitle::~VLCSubtitle()
1846 _p_typeinfo->Release();
1849 HRESULT VLCSubtitle::loadTypeInfo(void)
1851 HRESULT hr = NOERROR;
1852 if( NULL == _p_typeinfo )
1854 ITypeLib *p_typelib;
1856 hr = _p_instance->getTypeLib(LOCALE_USER_DEFAULT, &p_typelib);
1859 hr = p_typelib->GetTypeInfoOfGuid(IID_IVLCSubtitle, &_p_typeinfo);
1864 p_typelib->Release();
1870 STDMETHODIMP VLCSubtitle::GetTypeInfoCount(UINT* pctInfo)
1872 if( NULL == pctInfo )
1873 return E_INVALIDARG;
1875 if( SUCCEEDED(loadTypeInfo()) )
1883 STDMETHODIMP VLCSubtitle::GetTypeInfo(UINT iTInfo, LCID lcid, LPTYPEINFO* ppTInfo)
1885 if( NULL == ppTInfo )
1886 return E_INVALIDARG;
1888 if( SUCCEEDED(loadTypeInfo()) )
1890 _p_typeinfo->AddRef();
1891 *ppTInfo = _p_typeinfo;
1898 STDMETHODIMP VLCSubtitle::GetIDsOfNames(REFIID riid, LPOLESTR* rgszNames,
1899 UINT cNames, LCID lcid, DISPID* rgDispID)
1901 if( SUCCEEDED(loadTypeInfo()) )
1903 return DispGetIDsOfNames(_p_typeinfo, rgszNames, cNames, rgDispID);
1908 STDMETHODIMP VLCSubtitle::Invoke(DISPID dispIdMember, REFIID riid,
1909 LCID lcid, WORD wFlags, DISPPARAMS* pDispParams,
1910 VARIANT* pVarResult, EXCEPINFO* pExcepInfo, UINT* puArgErr)
1912 if( SUCCEEDED(loadTypeInfo()) )
1914 return DispInvoke(this, _p_typeinfo, dispIdMember, wFlags, pDispParams,
1915 pVarResult, pExcepInfo, puArgErr);
1920 STDMETHODIMP VLCSubtitle::get_track(long* spu)
1925 libvlc_media_player_t *p_md;
1926 HRESULT hr = _p_instance->getMD(&p_md);
1929 libvlc_exception_t ex;
1930 libvlc_exception_init(&ex);
1932 *spu = libvlc_video_get_spu(p_md, &ex);
1933 hr = exception_bridge(&ex);
1938 STDMETHODIMP VLCSubtitle::put_track(long spu)
1940 libvlc_media_player_t *p_md;
1941 HRESULT hr = _p_instance->getMD(&p_md);
1944 libvlc_exception_t ex;
1945 libvlc_exception_init(&ex);
1947 libvlc_video_set_spu(p_md, spu, &ex);
1948 hr = exception_bridge(&ex);
1953 STDMETHODIMP VLCSubtitle::get_count(long* spuNumber)
1955 if( NULL == spuNumber )
1958 libvlc_media_player_t *p_md;
1959 HRESULT hr = _p_instance->getMD(&p_md);
1962 libvlc_exception_t ex;
1963 libvlc_exception_init(&ex);
1964 // get the number of video subtitle available and return it
1965 *spuNumber = libvlc_video_get_spu_count(p_md, &ex);
1966 hr = exception_bridge(&ex);
1972 STDMETHODIMP VLCSubtitle::description(long nameID, BSTR* name)
1977 libvlc_media_player_t* p_md;
1978 libvlc_exception_t ex;
1979 libvlc_exception_init(&ex);
1981 HRESULT hr = _p_instance->getMD(&p_md);
1985 const char *psz_name;
1986 libvlc_track_description_t *p_spuDesc;
1988 // get subtitles description
1989 p_spuDesc = libvlc_video_get_spu_description(p_md, &ex);
1990 hr = exception_bridge(&ex);
1994 // get the number of available subtitle
1995 i_limit = libvlc_video_get_spu_count(p_md, &ex);
1996 hr = exception_bridge(&ex);
2000 // check if the number given is a good one
2001 if ( ( nameID > ( i_limit -1 ) ) || ( nameID < 0 ) )
2004 // get the good spuDesc
2005 for( i = 0 ; i < nameID ; i++ )
2007 p_spuDesc = p_spuDesc->p_next;
2009 // get the subtitle name
2010 psz_name = p_spuDesc->psz_name;
2013 if( psz_name != NULL )
2015 *name = BSTRFromCStr(CP_UTF8, psz_name);
2016 return (NULL == *name) ? E_OUTOFMEMORY : NOERROR;
2024 /****************************************************************************/
2026 VLCVideo::~VLCVideo()
2028 delete _p_vlcmarquee;
2031 _p_typeinfo->Release();
2034 HRESULT VLCVideo::loadTypeInfo(void)
2036 HRESULT hr = NOERROR;
2037 if( NULL == _p_typeinfo )
2039 ITypeLib *p_typelib;
2041 hr = _p_instance->getTypeLib(LOCALE_USER_DEFAULT, &p_typelib);
2044 hr = p_typelib->GetTypeInfoOfGuid(IID_IVLCVideo, &_p_typeinfo);
2049 p_typelib->Release();
2055 STDMETHODIMP VLCVideo::GetTypeInfoCount(UINT* pctInfo)
2057 if( NULL == pctInfo )
2058 return E_INVALIDARG;
2060 if( SUCCEEDED(loadTypeInfo()) )
2068 STDMETHODIMP VLCVideo::GetTypeInfo(UINT iTInfo, LCID lcid, LPTYPEINFO* ppTInfo)
2070 if( NULL == ppTInfo )
2071 return E_INVALIDARG;
2073 if( SUCCEEDED(loadTypeInfo()) )
2075 _p_typeinfo->AddRef();
2076 *ppTInfo = _p_typeinfo;
2083 STDMETHODIMP VLCVideo::GetIDsOfNames(REFIID riid, LPOLESTR* rgszNames,
2084 UINT cNames, LCID lcid, DISPID* rgDispID)
2086 if( SUCCEEDED(loadTypeInfo()) )
2088 return DispGetIDsOfNames(_p_typeinfo, rgszNames, cNames, rgDispID);
2093 STDMETHODIMP VLCVideo::Invoke(DISPID dispIdMember, REFIID riid,
2094 LCID lcid, WORD wFlags, DISPPARAMS* pDispParams,
2095 VARIANT* pVarResult, EXCEPINFO* pExcepInfo, UINT* puArgErr)
2097 if( SUCCEEDED(loadTypeInfo()) )
2099 return DispInvoke(this, _p_typeinfo, dispIdMember, wFlags, pDispParams,
2100 pVarResult, pExcepInfo, puArgErr);
2105 STDMETHODIMP VLCVideo::get_fullscreen(VARIANT_BOOL* fullscreen)
2107 if( NULL == fullscreen )
2110 libvlc_media_player_t *p_md;
2111 HRESULT hr = _p_instance->getMD(&p_md);
2114 libvlc_exception_t ex;
2115 libvlc_exception_init(&ex);
2117 *fullscreen = libvlc_get_fullscreen(p_md, &ex) ?
2118 VARIANT_TRUE : VARIANT_FALSE;
2119 hr = exception_bridge(&ex);
2124 STDMETHODIMP VLCVideo::put_fullscreen(VARIANT_BOOL fullscreen)
2126 libvlc_media_player_t *p_md;
2127 HRESULT hr = _p_instance->getMD(&p_md);
2130 libvlc_exception_t ex;
2131 libvlc_exception_init(&ex);
2133 libvlc_set_fullscreen(p_md, VARIANT_FALSE != fullscreen, &ex);
2134 hr = exception_bridge(&ex);
2139 STDMETHODIMP VLCVideo::get_width(long* width)
2144 libvlc_media_player_t *p_md;
2145 HRESULT hr = _p_instance->getMD(&p_md);
2148 libvlc_exception_t ex;
2149 libvlc_exception_init(&ex);
2151 *width = libvlc_video_get_width(p_md, &ex);
2152 hr = exception_bridge(&ex);
2157 STDMETHODIMP VLCVideo::get_height(long* height)
2159 if( NULL == height )
2162 libvlc_media_player_t *p_md;
2163 HRESULT hr = _p_instance->getMD(&p_md);
2166 libvlc_exception_t ex;
2167 libvlc_exception_init(&ex);
2169 *height = libvlc_video_get_height(p_md, &ex);
2170 hr = exception_bridge(&ex);
2175 STDMETHODIMP VLCVideo::get_aspectRatio(BSTR* aspect)
2177 if( NULL == aspect )
2180 libvlc_media_player_t *p_md;
2181 HRESULT hr = _p_instance->getMD(&p_md);
2184 libvlc_exception_t ex;
2185 libvlc_exception_init(&ex);
2187 char *psz_aspect = libvlc_video_get_aspect_ratio(p_md, &ex);
2189 hr = exception_bridge(&ex);
2190 if( SUCCEEDED(hr) && NULL != psz_aspect )
2192 *aspect = BSTRFromCStr(CP_UTF8, psz_aspect);
2193 if( NULL == *aspect )
2195 } else if( NULL == psz_aspect) hr = E_OUTOFMEMORY; // strdup("") failed
2201 STDMETHODIMP VLCVideo::put_aspectRatio(BSTR aspect)
2203 if( NULL == aspect )
2206 libvlc_media_player_t *p_md;
2207 HRESULT hr = _p_instance->getMD(&p_md);
2210 libvlc_exception_t ex;
2211 libvlc_exception_init(&ex);
2213 char *psz_aspect = CStrFromBSTR(CP_UTF8, aspect);
2214 if( NULL == psz_aspect )
2216 return E_OUTOFMEMORY;
2219 libvlc_video_set_aspect_ratio(p_md, psz_aspect, &ex);
2221 CoTaskMemFree(psz_aspect);
2222 hr = exception_bridge(&ex);
2227 STDMETHODIMP VLCVideo::get_subtitle(long* spu)
2232 libvlc_media_player_t *p_md;
2233 HRESULT hr = _p_instance->getMD(&p_md);
2236 libvlc_exception_t ex;
2237 libvlc_exception_init(&ex);
2239 *spu = libvlc_video_get_spu(p_md, &ex);
2240 hr = exception_bridge(&ex);
2245 STDMETHODIMP VLCVideo::put_subtitle(long spu)
2247 libvlc_media_player_t *p_md;
2248 HRESULT hr = _p_instance->getMD(&p_md);
2251 libvlc_exception_t ex;
2252 libvlc_exception_init(&ex);
2254 libvlc_video_set_spu(p_md, spu, &ex);
2255 hr = exception_bridge(&ex);
2260 STDMETHODIMP VLCVideo::get_crop(BSTR* geometry)
2262 if( NULL == geometry )
2265 libvlc_media_player_t *p_md;
2266 HRESULT hr = _p_instance->getMD(&p_md);
2269 libvlc_exception_t ex;
2270 libvlc_exception_init(&ex);
2272 char *psz_geometry = libvlc_video_get_crop_geometry(p_md, &ex);
2274 hr = exception_bridge(&ex);
2275 if( SUCCEEDED(&ex) && NULL != psz_geometry )
2277 *geometry = BSTRFromCStr(CP_UTF8, psz_geometry);
2278 if( NULL == geometry ) hr = E_OUTOFMEMORY;
2279 } else if( NULL == psz_geometry ) hr = E_OUTOFMEMORY;
2280 free( psz_geometry );
2285 STDMETHODIMP VLCVideo::put_crop(BSTR geometry)
2287 if( NULL == geometry )
2290 if( 0 == SysStringLen(geometry) )
2291 return E_INVALIDARG;
2293 libvlc_media_player_t *p_md;
2294 HRESULT hr = _p_instance->getMD(&p_md);
2297 libvlc_exception_t ex;
2298 libvlc_exception_init(&ex);
2300 char *psz_geometry = CStrFromBSTR(CP_UTF8, geometry);
2301 if( NULL == psz_geometry )
2303 return E_OUTOFMEMORY;
2306 libvlc_video_set_crop_geometry(p_md, psz_geometry, &ex);
2308 CoTaskMemFree(psz_geometry);
2309 hr = exception_bridge(&ex);
2314 STDMETHODIMP VLCVideo::get_teletext(long* page)
2319 libvlc_media_player_t *p_md;
2320 HRESULT hr = _p_instance->getMD(&p_md);
2323 libvlc_exception_t ex;
2324 libvlc_exception_init(&ex);
2326 *page = libvlc_video_get_teletext(p_md, &ex);
2327 hr = exception_bridge(&ex);
2332 STDMETHODIMP VLCVideo::put_teletext(long page)
2334 libvlc_media_player_t *p_md;
2335 HRESULT hr = _p_instance->getMD(&p_md);
2338 libvlc_exception_t ex;
2339 libvlc_exception_init(&ex);
2341 libvlc_video_set_teletext(p_md, page, &ex);
2342 hr = exception_bridge(&ex);
2347 STDMETHODIMP VLCVideo::deinterlaceDisable()
2349 libvlc_media_player_t *p_md;
2350 HRESULT hr = _p_instance->getMD(&p_md);
2353 libvlc_exception_t ex;
2354 libvlc_exception_init(&ex);
2356 libvlc_video_set_deinterlace(p_md, 0, "", &ex);
2357 hr = exception_bridge(&ex);
2362 STDMETHODIMP VLCVideo::deinterlaceEnable(BSTR mode)
2364 libvlc_media_player_t *p_md;
2365 HRESULT hr = _p_instance->getMD(&p_md);
2368 libvlc_exception_t ex;
2369 libvlc_exception_init(&ex);
2370 /* get deinterlace mode from the user */
2371 char *psz_mode = CStrFromBSTR(CP_UTF8, mode);
2372 /* enable deinterlace filter if possible */
2373 libvlc_video_set_deinterlace(p_md, 1, psz_mode, &ex);
2374 hr = exception_bridge(&ex);
2375 CoTaskMemFree(psz_mode);
2380 STDMETHODIMP VLCVideo::takeSnapshot(LPPICTUREDISP* picture)
2382 if( NULL == picture )
2385 libvlc_media_player_t *p_md;
2386 HRESULT hr = _p_instance->getMD(&p_md);
2389 libvlc_exception_t ex;
2390 libvlc_exception_init(&ex);
2392 static int uniqueId = 0;
2393 TCHAR path[MAX_PATH+1];
2395 int pathlen = GetTempPath(MAX_PATH-24, path);
2396 if( (0 == pathlen) || (pathlen > (MAX_PATH-24)) )
2399 /* check temp directory path by openning it */
2401 HANDLE dirHandle = CreateFile(path, GENERIC_READ,
2402 FILE_SHARE_READ|FILE_SHARE_WRITE|FILE_SHARE_DELETE,
2403 NULL, OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS, NULL);
2404 if( INVALID_HANDLE_VALUE == dirHandle )
2406 _p_instance->setErrorInfo(IID_IVLCVideo,
2407 "Invalid temporary directory for snapshot images, check values of TMP, TEMP envars.");
2412 BY_HANDLE_FILE_INFORMATION bhfi;
2413 BOOL res = GetFileInformationByHandle(dirHandle, &bhfi);
2414 CloseHandle(dirHandle);
2415 if( !res || !(bhfi.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) )
2417 _p_instance->setErrorInfo(IID_IVLCVideo,
2418 "Invalid temporary directory for snapshot images, check values of TMP, TEMP envars.");
2424 TCHAR filepath[MAX_PATH+1];
2426 _stprintf(filepath, TEXT("%sAXVLC%lXS%lX.bmp"),
2427 path, GetCurrentProcessId(), ++uniqueId);
2430 /* reuse path storage for UTF8 string */
2431 char *psz_filepath = (char *)path;
2432 WCHAR* wpath = filepath;
2434 char *psz_filepath = path;
2435 /* first convert to unicode using current code page */
2436 WCHAR wpath[MAX_PATH+1];
2437 if( 0 == MultiByteToWideChar(CP_ACP, 0, filepath, -1,
2438 wpath, sizeof(wpath)/sizeof(WCHAR)) )
2441 /* convert to UTF8 */
2442 pathlen = WideCharToMultiByte(CP_UTF8, 0, wpath, -1,
2443 psz_filepath, sizeof(path), NULL, NULL);
2444 // fail if path is 0 or too short (i.e pathlen is the same as
2447 if( (0 == pathlen) || (sizeof(path) == pathlen) )
2450 /* take snapshot into file */
2451 libvlc_video_take_snapshot(p_md, psz_filepath, 0, 0, &ex);
2452 hr = exception_bridge(&ex);
2455 /* open snapshot file */
2456 HANDLE snapPic = LoadImage(NULL, filepath, IMAGE_BITMAP, 0, 0,
2457 LR_CREATEDIBSECTION|LR_LOADFROMFILE);
2462 snapDesc.cbSizeofstruct = sizeof(PICTDESC);
2463 snapDesc.picType = PICTYPE_BITMAP;
2464 snapDesc.bmp.hbitmap = (HBITMAP)snapPic;
2465 snapDesc.bmp.hpal = NULL;
2467 hr = OleCreatePictureIndirect(&snapDesc, IID_IPictureDisp,
2468 TRUE, (LPVOID*)picture);
2472 DeleteObject(snapPic);
2475 DeleteFile(filepath);
2481 STDMETHODIMP VLCVideo::toggleFullscreen()
2483 libvlc_media_player_t *p_md;
2484 HRESULT hr = _p_instance->getMD(&p_md);
2487 libvlc_exception_t ex;
2488 libvlc_exception_init(&ex);
2490 libvlc_toggle_fullscreen(p_md, &ex);
2491 hr = exception_bridge(&ex);
2496 STDMETHODIMP VLCVideo::toggleTeletext()
2498 libvlc_media_player_t *p_md;
2499 HRESULT hr = _p_instance->getMD(&p_md);
2502 libvlc_exception_t ex;
2503 libvlc_exception_init(&ex);
2505 libvlc_toggle_teletext(p_md, &ex);
2506 hr = exception_bridge(&ex);
2511 STDMETHODIMP VLCVideo::get_marquee(IVLCMarquee** obj)
2516 *obj = _p_vlcmarquee;
2517 if( NULL != _p_vlcmarquee )
2519 _p_vlcmarquee->AddRef();
2522 return E_OUTOFMEMORY;
2525 STDMETHODIMP VLCVideo::get_logo(IVLCLogo** obj)
2531 if( NULL != _p_vlclogo )
2533 _p_vlclogo->AddRef();
2536 return E_OUTOFMEMORY;
2540 /****************************************************************************/
2542 HRESULT VLCLogo::loadTypeInfo(void)
2544 HRESULT hr = NOERROR;
2545 if( NULL == _p_typeinfo )
2547 ITypeLib *p_typelib;
2549 hr = _p_instance->getTypeLib(LOCALE_USER_DEFAULT, &p_typelib);
2552 hr = p_typelib->GetTypeInfoOfGuid(IID_IVLCLogo, &_p_typeinfo);
2557 p_typelib->Release();
2563 STDMETHODIMP VLCLogo::GetTypeInfoCount(UINT* pctInfo)
2565 if( NULL == pctInfo )
2566 return E_INVALIDARG;
2568 if( SUCCEEDED(loadTypeInfo()) )
2576 STDMETHODIMP VLCLogo::GetTypeInfo(UINT iTInfo, LCID lcid, LPTYPEINFO* ppTInfo)
2578 if( NULL == ppTInfo )
2579 return E_INVALIDARG;
2581 if( SUCCEEDED(loadTypeInfo()) )
2583 _p_typeinfo->AddRef();
2584 *ppTInfo = _p_typeinfo;
2591 STDMETHODIMP VLCLogo::GetIDsOfNames(REFIID riid, LPOLESTR* rgszNames,
2592 UINT cNames, LCID lcid, DISPID* rgDispID)
2594 if( SUCCEEDED(loadTypeInfo()) )
2595 return DispGetIDsOfNames(_p_typeinfo, rgszNames, cNames, rgDispID);
2599 STDMETHODIMP VLCLogo::Invoke(DISPID dispIdMember, REFIID riid,
2600 LCID lcid, WORD wFlags, DISPPARAMS* pDispParams,
2601 VARIANT* pVarResult, EXCEPINFO* pExcepInfo, UINT* puArgErr)
2603 if( SUCCEEDED(loadTypeInfo()) )
2605 return DispInvoke(this, _p_typeinfo, dispIdMember, wFlags,
2606 pDispParams, pVarResult, pExcepInfo, puArgErr);
2612 HRESULT VLCLogo::do_put_int(unsigned idx, LONG val)
2614 libvlc_media_player_t *p_md;
2615 HRESULT hr = _p_instance->getMD(&p_md);
2618 libvlc_exception_t ex;
2619 libvlc_exception_init(&ex);
2620 libvlc_video_set_logo_int(p_md, idx, val, &ex);
2621 hr = exception_bridge(&ex);
2626 HRESULT VLCLogo::do_get_int(unsigned idx, LONG *val)
2631 libvlc_media_player_t *p_md;
2632 HRESULT hr = _p_instance->getMD(&p_md);
2635 libvlc_exception_t ex;
2636 libvlc_exception_init(&ex);
2637 *val = libvlc_video_get_logo_int(p_md, idx, &ex);
2638 hr = exception_bridge(&ex);
2643 STDMETHODIMP VLCLogo::file(BSTR fname)
2645 libvlc_media_player_t *p_md;
2646 HRESULT hr = _p_instance->getMD(&p_md);
2648 char *n = CStrFromBSTR(CP_UTF8, fname);
2649 if( !n ) hr = E_OUTOFMEMORY;
2653 libvlc_exception_t ex;
2654 libvlc_exception_init(&ex);
2655 libvlc_video_set_logo_string(p_md, libvlc_logo_file, n, &ex);
2656 hr = exception_bridge(&ex);
2663 STDMETHODIMP VLCLogo::get_position(BSTR* val)
2669 HRESULT hr = do_get_int(libvlc_logo_position, &i);
2672 *val = BSTRFromCStr(CP_UTF8, position_bynumber(i));
2677 STDMETHODIMP VLCLogo::put_position(BSTR val)
2679 char *n = CStrFromBSTR(CP_UTF8, val);
2680 if( !n ) return E_OUTOFMEMORY;
2684 if( position_byname( n, i ) )
2685 hr = do_put_int(libvlc_logo_position,i);
2693 /****************************************************************************/
2695 VLCControl2::VLCControl2(VLCPlugin *p_instance) :
2696 _p_instance(p_instance),
2698 _p_vlcaudio(new VLCAudio(p_instance)),
2699 _p_vlcinput(new VLCInput(p_instance)),
2700 _p_vlclog(new VLCLog(p_instance)),
2701 _p_vlcplaylist(new VLCPlaylist(p_instance)),
2702 _p_vlcsubtitle(new VLCSubtitle(p_instance)),
2703 _p_vlcvideo(new VLCVideo(p_instance))
2707 VLCControl2::~VLCControl2()
2710 delete _p_vlcsubtitle;
2711 delete _p_vlcplaylist;
2716 _p_typeinfo->Release();
2719 HRESULT VLCControl2::loadTypeInfo(void)
2721 HRESULT hr = NOERROR;
2722 if( NULL == _p_typeinfo )
2724 ITypeLib *p_typelib;
2726 hr = _p_instance->getTypeLib(LOCALE_USER_DEFAULT, &p_typelib);
2729 hr = p_typelib->GetTypeInfoOfGuid(IID_IVLCControl2, &_p_typeinfo);
2734 p_typelib->Release();
2740 STDMETHODIMP VLCControl2::GetTypeInfoCount(UINT* pctInfo)
2742 if( NULL == pctInfo )
2743 return E_INVALIDARG;
2745 if( SUCCEEDED(loadTypeInfo()) )
2753 STDMETHODIMP VLCControl2::GetTypeInfo(UINT iTInfo, LCID lcid, LPTYPEINFO* ppTInfo)
2755 if( NULL == ppTInfo )
2756 return E_INVALIDARG;
2758 if( SUCCEEDED(loadTypeInfo()) )
2760 _p_typeinfo->AddRef();
2761 *ppTInfo = _p_typeinfo;
2768 STDMETHODIMP VLCControl2::GetIDsOfNames(REFIID riid, LPOLESTR* rgszNames,
2769 UINT cNames, LCID lcid, DISPID* rgDispID)
2771 if( SUCCEEDED(loadTypeInfo()) )
2773 return DispGetIDsOfNames(_p_typeinfo, rgszNames, cNames, rgDispID);
2778 STDMETHODIMP VLCControl2::Invoke(DISPID dispIdMember, REFIID riid,
2779 LCID lcid, WORD wFlags, DISPPARAMS* pDispParams,
2780 VARIANT* pVarResult, EXCEPINFO* pExcepInfo, UINT* puArgErr)
2782 if( SUCCEEDED(loadTypeInfo()) )
2784 return DispInvoke(this, _p_typeinfo, dispIdMember, wFlags, pDispParams,
2785 pVarResult, pExcepInfo, puArgErr);
2790 STDMETHODIMP VLCControl2::get_AutoLoop(VARIANT_BOOL *autoloop)
2792 if( NULL == autoloop )
2795 *autoloop = _p_instance->getAutoLoop() ? VARIANT_TRUE: VARIANT_FALSE;
2799 STDMETHODIMP VLCControl2::put_AutoLoop(VARIANT_BOOL autoloop)
2801 _p_instance->setAutoLoop((VARIANT_FALSE != autoloop) ? TRUE: FALSE);
2805 STDMETHODIMP VLCControl2::get_AutoPlay(VARIANT_BOOL *autoplay)
2807 if( NULL == autoplay )
2810 *autoplay = _p_instance->getAutoPlay() ? VARIANT_TRUE: VARIANT_FALSE;
2814 STDMETHODIMP VLCControl2::put_AutoPlay(VARIANT_BOOL autoplay)
2816 _p_instance->setAutoPlay((VARIANT_FALSE != autoplay) ? TRUE: FALSE);
2820 STDMETHODIMP VLCControl2::get_BaseURL(BSTR *url)
2825 *url = SysAllocStringLen(_p_instance->getBaseURL(),
2826 SysStringLen(_p_instance->getBaseURL()));
2830 STDMETHODIMP VLCControl2::put_BaseURL(BSTR mrl)
2832 _p_instance->setBaseURL(mrl);
2837 STDMETHODIMP VLCControl2::get_MRL(BSTR *mrl)
2842 *mrl = SysAllocStringLen(_p_instance->getMRL(),
2843 SysStringLen(_p_instance->getMRL()));
2847 STDMETHODIMP VLCControl2::put_MRL(BSTR mrl)
2849 _p_instance->setMRL(mrl);
2855 STDMETHODIMP VLCControl2::get_Toolbar(VARIANT_BOOL *visible)
2857 if( NULL == visible )
2861 * Note to developers
2863 * Returning the _b_toolbar is closer to the method specification.
2864 * But returning True when toolbar is not implemented so not displayed
2865 * could be bad for ActiveX users which rely on this value to show their
2866 * own toolbar if not provided by the ActiveX.
2868 * This is the reason why FALSE is returned, until toolbar get implemented.
2871 /* DISABLED for now */
2872 // *visible = _p_instance->getShowToolbar() ? VARIANT_TRUE: VARIANT_FALSE;
2874 *visible = VARIANT_FALSE;
2879 STDMETHODIMP VLCControl2::put_Toolbar(VARIANT_BOOL visible)
2881 _p_instance->setShowToolbar((VARIANT_FALSE != visible) ? TRUE: FALSE);
2886 STDMETHODIMP VLCControl2::get_StartTime(long *seconds)
2888 if( NULL == seconds )
2891 *seconds = _p_instance->getStartTime();
2896 STDMETHODIMP VLCControl2::put_StartTime(long seconds)
2898 _p_instance->setStartTime(seconds);
2903 STDMETHODIMP VLCControl2::get_VersionInfo(BSTR *version)
2905 if( NULL == version )
2908 const char *versionStr = libvlc_get_version();
2909 if( NULL != versionStr )
2911 *version = BSTRFromCStr(CP_UTF8, versionStr);
2913 return (NULL == *version) ? E_OUTOFMEMORY : NOERROR;
2919 STDMETHODIMP VLCControl2::get_Visible(VARIANT_BOOL *isVisible)
2921 if( NULL == isVisible )
2924 *isVisible = _p_instance->getVisible() ? VARIANT_TRUE : VARIANT_FALSE;
2929 STDMETHODIMP VLCControl2::put_Visible(VARIANT_BOOL isVisible)
2931 _p_instance->setVisible(isVisible != VARIANT_FALSE);
2936 STDMETHODIMP VLCControl2::get_Volume(long *volume)
2938 if( NULL == volume )
2941 *volume = _p_instance->getVolume();
2945 STDMETHODIMP VLCControl2::put_Volume(long volume)
2947 _p_instance->setVolume(volume);
2951 STDMETHODIMP VLCControl2::get_BackColor(OLE_COLOR *backcolor)
2953 if( NULL == backcolor )
2956 *backcolor = _p_instance->getBackColor();
2960 STDMETHODIMP VLCControl2::put_BackColor(OLE_COLOR backcolor)
2962 _p_instance->setBackColor(backcolor);
2966 STDMETHODIMP VLCControl2::get_audio(IVLCAudio** obj)
2972 if( NULL != _p_vlcaudio )
2974 _p_vlcaudio->AddRef();
2977 return E_OUTOFMEMORY;
2980 STDMETHODIMP VLCControl2::get_input(IVLCInput** obj)
2986 if( NULL != _p_vlcinput )
2988 _p_vlcinput->AddRef();
2991 return E_OUTOFMEMORY;
2994 STDMETHODIMP VLCControl2::get_log(IVLCLog** obj)
3000 if( NULL != _p_vlclog )
3002 _p_vlclog->AddRef();
3005 return E_OUTOFMEMORY;
3008 STDMETHODIMP VLCControl2::get_playlist(IVLCPlaylist** obj)
3013 *obj = _p_vlcplaylist;
3014 if( NULL != _p_vlcplaylist )
3016 _p_vlcplaylist->AddRef();
3019 return E_OUTOFMEMORY;
3022 STDMETHODIMP VLCControl2::get_subtitle(IVLCSubtitle** obj)
3027 *obj = _p_vlcsubtitle;
3028 if( NULL != _p_vlcsubtitle )
3030 _p_vlcsubtitle->AddRef();
3033 return E_OUTOFMEMORY;
3036 STDMETHODIMP VLCControl2::get_video(IVLCVideo** obj)
3042 if( NULL != _p_vlcvideo )
3044 _p_vlcvideo->AddRef();
3047 return E_OUTOFMEMORY;