1 /*****************************************************************************
2 * vlccontrol2.cpp: ActiveX control for VLC
3 *****************************************************************************
4 * Copyright (C) 2006 the VideoLAN team
6 * Authors: Damien Fouilleul <Damien.Fouilleul@laposte.net>
7 * Jean-Paul Saman <jpsaman _at_ m2x _dot_ nl>
9 * This program is free software; you can redistribute it and/or modify
10 * it under the terms of the GNU General Public License as published by
11 * the Free Software Foundation; either version 2 of the License, or
12 * (at your option) any later version.
14 * This program is distributed in the hope that it will be useful,
15 * but WITHOUT ANY WARRANTY; without even the implied warranty of
16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 * GNU General Public License for more details.
19 * You should have received a copy of the GNU General Public License along
20 * with this program; if not, write to the Free Software Foundation, Inc.,
21 * 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
22 *****************************************************************************/
25 #include "vlccontrol2.h"
26 #include "vlccontrol.h"
37 HRESULT _exception_bridge(VLCPlugin *p,REFIID riid, libvlc_exception_t *ex)
39 if( libvlc_exception_raised(ex) )
41 p->setErrorInfo(riid,libvlc_exception_get_message(ex));
42 libvlc_exception_clear(ex);
48 #define EMIT_EXCEPTION_BRIDGE( classname ) \
49 HRESULT classname::exception_bridge( libvlc_exception_t *ex ) \
50 { return _exception_bridge( _p_instance, IID_I##classname, ex ); }
52 EMIT_EXCEPTION_BRIDGE( VLCAudio )
53 EMIT_EXCEPTION_BRIDGE( VLCInput )
54 EMIT_EXCEPTION_BRIDGE( VLCMarquee )
55 EMIT_EXCEPTION_BRIDGE( VLCMessageIterator )
56 EMIT_EXCEPTION_BRIDGE( VLCMessages )
57 EMIT_EXCEPTION_BRIDGE( VLCLog )
58 EMIT_EXCEPTION_BRIDGE( VLCPlaylistItems )
59 EMIT_EXCEPTION_BRIDGE( VLCPlaylist )
60 EMIT_EXCEPTION_BRIDGE( VLCVideo )
61 EMIT_EXCEPTION_BRIDGE( VLCSubtitle )
63 #undef EMIT_EXCEPTION_BRIDGE
69 _p_typeinfo->Release();
72 HRESULT VLCAudio::loadTypeInfo(void)
75 if( NULL == _p_typeinfo )
79 hr = _p_instance->getTypeLib(LOCALE_USER_DEFAULT, &p_typelib);
82 hr = p_typelib->GetTypeInfoOfGuid(IID_IVLCAudio, &_p_typeinfo);
93 STDMETHODIMP VLCAudio::GetTypeInfoCount(UINT* pctInfo)
98 if( SUCCEEDED(loadTypeInfo()) )
106 STDMETHODIMP VLCAudio::GetTypeInfo(UINT iTInfo, LCID lcid, LPTYPEINFO* ppTInfo)
108 if( NULL == ppTInfo )
111 if( SUCCEEDED(loadTypeInfo()) )
113 _p_typeinfo->AddRef();
114 *ppTInfo = _p_typeinfo;
121 STDMETHODIMP VLCAudio::GetIDsOfNames(REFIID riid, LPOLESTR* rgszNames,
122 UINT cNames, LCID lcid, DISPID* rgDispID)
124 if( SUCCEEDED(loadTypeInfo()) )
126 return DispGetIDsOfNames(_p_typeinfo, rgszNames, cNames, rgDispID);
131 STDMETHODIMP VLCAudio::Invoke(DISPID dispIdMember, REFIID riid,
132 LCID lcid, WORD wFlags, DISPPARAMS* pDispParams,
133 VARIANT* pVarResult, EXCEPINFO* pExcepInfo, UINT* puArgErr)
135 if( SUCCEEDED(loadTypeInfo()) )
137 return DispInvoke(this, _p_typeinfo, dispIdMember, wFlags, pDispParams,
138 pVarResult, pExcepInfo, puArgErr);
143 STDMETHODIMP VLCAudio::get_mute(VARIANT_BOOL* mute)
148 libvlc_instance_t* p_libvlc;
149 HRESULT hr = _p_instance->getVLC(&p_libvlc);
152 libvlc_exception_t ex;
153 libvlc_exception_init(&ex);
155 *mute = libvlc_audio_get_mute(p_libvlc, &ex) ?
156 VARIANT_TRUE : VARIANT_FALSE;
157 hr = exception_bridge(&ex);
162 STDMETHODIMP VLCAudio::put_mute(VARIANT_BOOL mute)
164 libvlc_instance_t* p_libvlc;
165 HRESULT hr = _p_instance->getVLC(&p_libvlc);
168 libvlc_exception_t ex;
169 libvlc_exception_init(&ex);
171 libvlc_audio_set_mute(p_libvlc, VARIANT_FALSE != mute, &ex);
172 hr = exception_bridge(&ex);
177 STDMETHODIMP VLCAudio::get_volume(long* volume)
182 libvlc_instance_t* p_libvlc;
183 HRESULT hr = _p_instance->getVLC(&p_libvlc);
186 libvlc_exception_t ex;
187 libvlc_exception_init(&ex);
189 *volume = libvlc_audio_get_volume(p_libvlc, &ex);
190 hr = exception_bridge(&ex);
195 STDMETHODIMP VLCAudio::put_volume(long volume)
197 libvlc_instance_t* p_libvlc;
198 HRESULT hr = _p_instance->getVLC(&p_libvlc);
201 libvlc_exception_t ex;
202 libvlc_exception_init(&ex);
204 libvlc_audio_set_volume(p_libvlc, volume, &ex);
205 hr = exception_bridge(&ex);
210 STDMETHODIMP VLCAudio::get_track(long* track)
215 libvlc_media_player_t* p_md;
216 HRESULT hr = _p_instance->getMD(&p_md);
219 libvlc_exception_t ex;
220 libvlc_exception_init(&ex);
222 *track = libvlc_audio_get_track(p_md, &ex);
223 hr = exception_bridge(&ex);
228 STDMETHODIMP VLCAudio::put_track(long track)
230 libvlc_media_player_t *p_md;
231 HRESULT hr = _p_instance->getMD(&p_md);
234 libvlc_exception_t ex;
235 libvlc_exception_init(&ex);
237 libvlc_audio_set_track(p_md, track, &ex);
238 hr = exception_bridge(&ex);
243 STDMETHODIMP VLCAudio::get_count(long* trackNumber)
245 if( NULL == trackNumber )
248 libvlc_media_player_t* p_md;
249 HRESULT hr = _p_instance->getMD(&p_md);
252 libvlc_exception_t ex;
253 libvlc_exception_init(&ex);
254 // get the number of audio track available and return it
255 *trackNumber = libvlc_audio_get_track_count(p_md, &ex);
256 hr = exception_bridge(&ex);
262 STDMETHODIMP VLCAudio::description(long trackID, BSTR* name)
267 libvlc_media_player_t* p_md;
268 libvlc_exception_t ex;
269 libvlc_exception_init(&ex);
271 HRESULT hr = _p_instance->getMD(&p_md);
275 const char *psz_name;
276 libvlc_track_description_t *p_trackDesc;
278 // get tracks description
279 p_trackDesc = libvlc_audio_get_track_description(p_md, &ex);
280 hr = exception_bridge(&ex);
284 //get the number of available track
285 i_limit = libvlc_audio_get_track_count(p_md, &ex);
286 hr = exception_bridge(&ex);
290 // check if the number given is a good one
291 if ( ( trackID > ( i_limit -1 ) ) || ( trackID < 0 ) )
294 // get the good trackDesc
295 for( i = 0 ; i < trackID ; i++ )
297 p_trackDesc = p_trackDesc->p_next;
299 // get the track name
300 psz_name = p_trackDesc->psz_name;
303 if( psz_name != NULL )
305 *name = BSTRFromCStr(CP_UTF8, psz_name);
306 return (NULL == *name) ? E_OUTOFMEMORY : NOERROR;
314 STDMETHODIMP VLCAudio::get_channel(long *channel)
316 if( NULL == channel )
319 libvlc_instance_t* p_libvlc;
320 HRESULT hr = _p_instance->getVLC(&p_libvlc);
323 libvlc_exception_t ex;
324 libvlc_exception_init(&ex);
326 *channel = libvlc_audio_get_channel(p_libvlc, &ex);
327 hr = exception_bridge(&ex);
332 STDMETHODIMP VLCAudio::put_channel(long channel)
334 libvlc_instance_t* p_libvlc;
335 HRESULT hr = _p_instance->getVLC(&p_libvlc);
338 libvlc_exception_t ex;
339 libvlc_exception_init(&ex);
341 libvlc_audio_set_channel(p_libvlc, channel, &ex);
342 hr = exception_bridge(&ex);
347 STDMETHODIMP VLCAudio::toggleMute()
349 libvlc_instance_t* p_libvlc;
350 HRESULT hr = _p_instance->getVLC(&p_libvlc);
353 libvlc_exception_t ex;
354 libvlc_exception_init(&ex);
356 libvlc_audio_toggle_mute(p_libvlc, &ex);
357 hr = exception_bridge(&ex);
362 /*******************************************************************************/
364 VLCInput::~VLCInput()
367 _p_typeinfo->Release();
370 HRESULT VLCInput::loadTypeInfo(void)
372 HRESULT hr = NOERROR;
373 if( NULL == _p_typeinfo )
377 hr = _p_instance->getTypeLib(LOCALE_USER_DEFAULT, &p_typelib);
380 hr = p_typelib->GetTypeInfoOfGuid(IID_IVLCInput, &_p_typeinfo);
385 p_typelib->Release();
391 STDMETHODIMP VLCInput::GetTypeInfoCount(UINT* pctInfo)
393 if( NULL == pctInfo )
396 if( SUCCEEDED(loadTypeInfo()) )
404 STDMETHODIMP VLCInput::GetTypeInfo(UINT iTInfo, LCID lcid, LPTYPEINFO* ppTInfo)
406 if( NULL == ppTInfo )
409 if( SUCCEEDED(loadTypeInfo()) )
411 _p_typeinfo->AddRef();
412 *ppTInfo = _p_typeinfo;
419 STDMETHODIMP VLCInput::GetIDsOfNames(REFIID riid, LPOLESTR* rgszNames,
420 UINT cNames, LCID lcid, DISPID* rgDispID)
422 if( SUCCEEDED(loadTypeInfo()) )
424 return DispGetIDsOfNames(_p_typeinfo, rgszNames, cNames, rgDispID);
429 STDMETHODIMP VLCInput::Invoke(DISPID dispIdMember, REFIID riid,
430 LCID lcid, WORD wFlags, DISPPARAMS* pDispParams,
431 VARIANT* pVarResult, EXCEPINFO* pExcepInfo, UINT* puArgErr)
433 if( SUCCEEDED(loadTypeInfo()) )
435 return DispInvoke(this, _p_typeinfo, dispIdMember, wFlags, pDispParams,
436 pVarResult, pExcepInfo, puArgErr);
441 STDMETHODIMP VLCInput::get_length(double* length)
447 libvlc_media_player_t *p_md;
448 HRESULT hr = _p_instance->getMD(&p_md);
451 libvlc_exception_t ex;
452 libvlc_exception_init(&ex);
454 *length = (double)libvlc_media_player_get_length(p_md, &ex);
455 hr = exception_bridge(&ex);
460 STDMETHODIMP VLCInput::get_position(double* position)
462 if( NULL == position )
466 libvlc_media_player_t *p_md;
467 HRESULT hr = _p_instance->getMD(&p_md);
470 libvlc_exception_t ex;
471 libvlc_exception_init(&ex);
473 *position = libvlc_media_player_get_position(p_md, &ex);
474 hr = exception_bridge(&ex);
479 STDMETHODIMP VLCInput::put_position(double position)
481 libvlc_media_player_t *p_md;
482 HRESULT hr = _p_instance->getMD(&p_md);
485 libvlc_exception_t ex;
486 libvlc_exception_init(&ex);
488 libvlc_media_player_set_position(p_md, position, &ex);
489 hr = exception_bridge(&ex);
494 STDMETHODIMP VLCInput::get_time(double* time)
499 libvlc_media_player_t *p_md;
500 HRESULT hr = _p_instance->getMD(&p_md);
503 libvlc_exception_t ex;
504 libvlc_exception_init(&ex);
506 *time = (double)libvlc_media_player_get_time(p_md, &ex);
507 hr = exception_bridge(&ex);
512 STDMETHODIMP VLCInput::put_time(double time)
514 libvlc_media_player_t *p_md;
515 HRESULT hr = _p_instance->getMD(&p_md);
518 libvlc_exception_t ex;
519 libvlc_exception_init(&ex);
521 libvlc_media_player_set_time(p_md, (int64_t)time, &ex);
522 hr = exception_bridge(&ex);
527 STDMETHODIMP VLCInput::get_state(long* state)
532 libvlc_media_player_t *p_md;
533 HRESULT hr = _p_instance->getMD(&p_md);
536 libvlc_exception_t ex;
537 libvlc_exception_init(&ex);
539 *state = libvlc_media_player_get_state(p_md, &ex);
540 if( libvlc_exception_raised(&ex) )
542 // don't fail, just return the idle state
544 libvlc_exception_clear(&ex);
550 STDMETHODIMP VLCInput::get_rate(double* rate)
555 libvlc_media_player_t *p_md;
556 HRESULT hr = _p_instance->getMD(&p_md);
559 libvlc_exception_t ex;
560 libvlc_exception_init(&ex);
562 *rate = libvlc_media_player_get_rate(p_md, &ex);
563 hr = exception_bridge(&ex);
568 STDMETHODIMP VLCInput::put_rate(double rate)
570 libvlc_media_player_t *p_md;
571 HRESULT hr = _p_instance->getMD(&p_md);
574 libvlc_exception_t ex;
575 libvlc_exception_init(&ex);
577 libvlc_media_player_set_rate(p_md, rate, &ex);
578 hr = exception_bridge(&ex);
583 STDMETHODIMP VLCInput::get_fps(double* fps)
589 libvlc_media_player_t *p_md;
590 HRESULT hr = _p_instance->getMD(&p_md);
593 libvlc_exception_t ex;
594 libvlc_exception_init(&ex);
596 *fps = libvlc_media_player_get_fps(p_md, &ex);
597 hr = exception_bridge(&ex);
602 STDMETHODIMP VLCInput::get_hasVout(VARIANT_BOOL* hasVout)
604 if( NULL == hasVout )
607 libvlc_media_player_t *p_md;
608 HRESULT hr = _p_instance->getMD(&p_md);
611 libvlc_exception_t ex;
612 libvlc_exception_init(&ex);
614 *hasVout = libvlc_media_player_has_vout(p_md, &ex) ?
615 VARIANT_TRUE : VARIANT_FALSE;
616 hr = exception_bridge(&ex);
621 /*******************************************************************************/
625 delete _p_vlcmessages;
627 libvlc_log_close(_p_log, NULL);
630 _p_typeinfo->Release();
633 HRESULT VLCLog::loadTypeInfo(void)
635 HRESULT hr = NOERROR;
636 if( NULL == _p_typeinfo )
640 hr = _p_instance->getTypeLib(LOCALE_USER_DEFAULT, &p_typelib);
643 hr = p_typelib->GetTypeInfoOfGuid(IID_IVLCLog, &_p_typeinfo);
648 p_typelib->Release();
654 STDMETHODIMP VLCLog::GetTypeInfoCount(UINT* pctInfo)
656 if( NULL == pctInfo )
659 if( SUCCEEDED(loadTypeInfo()) )
667 STDMETHODIMP VLCLog::GetTypeInfo(UINT iTInfo, LCID lcid, LPTYPEINFO* ppTInfo)
669 if( NULL == ppTInfo )
672 if( SUCCEEDED(loadTypeInfo()) )
674 _p_typeinfo->AddRef();
675 *ppTInfo = _p_typeinfo;
682 STDMETHODIMP VLCLog::GetIDsOfNames(REFIID riid, LPOLESTR* rgszNames,
683 UINT cNames, LCID lcid, DISPID* rgDispID)
685 if( SUCCEEDED(loadTypeInfo()) )
687 return DispGetIDsOfNames(_p_typeinfo, rgszNames, cNames, rgDispID);
692 STDMETHODIMP VLCLog::Invoke(DISPID dispIdMember, REFIID riid,
693 LCID lcid, WORD wFlags, DISPPARAMS* pDispParams,
694 VARIANT* pVarResult, EXCEPINFO* pExcepInfo, UINT* puArgErr)
696 if( SUCCEEDED(loadTypeInfo()) )
698 return DispInvoke(this, _p_typeinfo, dispIdMember, wFlags, pDispParams,
699 pVarResult, pExcepInfo, puArgErr);
704 STDMETHODIMP VLCLog::get_messages(IVLCMessages** obj)
709 *obj = _p_vlcmessages;
710 if( NULL != _p_vlcmessages )
712 _p_vlcmessages->AddRef();
715 return E_OUTOFMEMORY;
718 STDMETHODIMP VLCLog::get_verbosity(long* level)
725 libvlc_instance_t* p_libvlc;
726 HRESULT hr = _p_instance->getVLC(&p_libvlc);
729 libvlc_exception_t ex;
730 libvlc_exception_init(&ex);
732 *level = libvlc_get_log_verbosity(p_libvlc, &ex);
733 hr = exception_bridge(&ex);
739 /* log is not enabled, return -1 */
745 STDMETHODIMP VLCLog::put_verbosity(long verbosity)
747 libvlc_instance_t* p_libvlc;
748 HRESULT hr = _p_instance->getVLC(&p_libvlc);
751 libvlc_exception_t ex;
752 libvlc_exception_init(&ex);
758 _p_log = libvlc_log_open(p_libvlc, &ex);
759 hr = exception_bridge(&ex);
762 libvlc_set_log_verbosity(p_libvlc, (unsigned)verbosity, &ex);
766 /* close log when verbosity is set to -1 */
767 libvlc_log_close(_p_log, &ex);
770 hr = exception_bridge(&ex);
775 /*******************************************************************************/
777 VLCMarquee::~VLCMarquee()
780 _p_typeinfo->Release();
783 HRESULT VLCMarquee::loadTypeInfo(void)
785 HRESULT hr = NOERROR;
786 if( NULL == _p_typeinfo )
790 hr = _p_instance->getTypeLib(LOCALE_USER_DEFAULT, &p_typelib);
793 hr = p_typelib->GetTypeInfoOfGuid(IID_IVLCMarquee, &_p_typeinfo);
798 p_typelib->Release();
804 STDMETHODIMP VLCMarquee::GetTypeInfoCount(UINT* pctInfo)
806 if( NULL == pctInfo )
809 if( SUCCEEDED(loadTypeInfo()) )
817 STDMETHODIMP VLCMarquee::GetTypeInfo(UINT iTInfo, LCID lcid, LPTYPEINFO* ppTInfo)
819 if( NULL == ppTInfo )
822 if( SUCCEEDED(loadTypeInfo()) )
824 _p_typeinfo->AddRef();
825 *ppTInfo = _p_typeinfo;
832 STDMETHODIMP VLCMarquee::GetIDsOfNames(REFIID riid, LPOLESTR* rgszNames,
833 UINT cNames, LCID lcid, DISPID* rgDispID)
835 if( SUCCEEDED(loadTypeInfo()) )
837 return DispGetIDsOfNames(_p_typeinfo, rgszNames, cNames, rgDispID);
842 STDMETHODIMP VLCMarquee::Invoke(DISPID dispIdMember, REFIID riid,
843 LCID lcid, WORD wFlags, DISPPARAMS* pDispParams,
844 VARIANT* pVarResult, EXCEPINFO* pExcepInfo, UINT* puArgErr)
846 if( SUCCEEDED(loadTypeInfo()) )
848 return DispInvoke(this, _p_typeinfo, dispIdMember, wFlags, pDispParams,
849 pVarResult, pExcepInfo, puArgErr);
854 STDMETHODIMP VLCMarquee::enable()
856 libvlc_media_player_t *p_md;
857 HRESULT hr = _p_instance->getMD(&p_md);
860 libvlc_exception_t ex;
861 libvlc_exception_init(&ex);
863 libvlc_video_set_marquee_option_as_int(p_md, libvlc_marquee_Enabled, true, &ex);
864 hr = exception_bridge(&ex);
869 STDMETHODIMP VLCMarquee::disable()
871 libvlc_media_player_t *p_md;
872 HRESULT hr = _p_instance->getMD(&p_md);
875 libvlc_exception_t ex;
876 libvlc_exception_init(&ex);
878 libvlc_video_set_marquee_option_as_int(p_md, libvlc_marquee_Enabled, false, &ex);
879 hr = exception_bridge(&ex);
884 STDMETHODIMP VLCMarquee::color(long val)
886 libvlc_media_player_t *p_md;
887 HRESULT hr = _p_instance->getMD(&p_md);
890 libvlc_exception_t ex;
891 libvlc_exception_init(&ex);
893 libvlc_video_set_marquee_option_as_int(p_md, libvlc_marquee_Color, val, &ex);
894 hr = exception_bridge(&ex);
899 STDMETHODIMP VLCMarquee::opacity(long val)
901 libvlc_media_player_t *p_md;
902 HRESULT hr = _p_instance->getMD(&p_md);
905 libvlc_exception_t ex;
906 libvlc_exception_init(&ex);
908 libvlc_video_set_marquee_option_as_int(p_md, libvlc_marquee_Opacity, val, &ex);
909 hr = exception_bridge(&ex);
914 STDMETHODIMP VLCMarquee::position(long val)
916 libvlc_media_player_t *p_md;
917 HRESULT hr = _p_instance->getMD(&p_md);
920 libvlc_exception_t ex;
921 libvlc_exception_init(&ex);
923 libvlc_video_set_marquee_option_as_int(p_md, libvlc_marquee_Position, val, &ex);
924 hr = exception_bridge(&ex);
929 STDMETHODIMP VLCMarquee::refresh(long val)
931 libvlc_media_player_t *p_md;
932 HRESULT hr = _p_instance->getMD(&p_md);
935 libvlc_exception_t ex;
936 libvlc_exception_init(&ex);
938 libvlc_video_set_marquee_option_as_int(p_md, libvlc_marquee_Refresh, val, &ex);
939 hr = exception_bridge(&ex);
944 STDMETHODIMP VLCMarquee::size(long val)
946 libvlc_media_player_t *p_md;
947 HRESULT hr = _p_instance->getMD(&p_md);
950 libvlc_exception_t ex;
951 libvlc_exception_init(&ex);
953 libvlc_video_set_marquee_option_as_int(p_md, libvlc_marquee_Size, val, &ex);
954 hr = exception_bridge(&ex);
959 STDMETHODIMP VLCMarquee::text(BSTR text)
961 libvlc_media_player_t *p_md;
962 HRESULT hr = _p_instance->getMD(&p_md);
965 libvlc_exception_t ex;
966 libvlc_exception_init(&ex);
968 char *psz_text = CStrFromBSTR(CP_UTF8, text);
969 libvlc_video_set_marquee_option_as_string(p_md, libvlc_marquee_Text, psz_text, &ex);
970 hr = exception_bridge(&ex);
971 CoTaskMemFree(psz_text);
976 STDMETHODIMP VLCMarquee::timeout(long val)
978 libvlc_media_player_t *p_md;
979 HRESULT hr = _p_instance->getMD(&p_md);
982 libvlc_exception_t ex;
983 libvlc_exception_init(&ex);
985 libvlc_video_set_marquee_option_as_int(p_md, libvlc_marquee_Timeout, val, &ex);
986 hr = exception_bridge(&ex);
991 STDMETHODIMP VLCMarquee::x(long val)
993 libvlc_media_player_t *p_md;
994 HRESULT hr = _p_instance->getMD(&p_md);
997 libvlc_exception_t ex;
998 libvlc_exception_init(&ex);
1000 libvlc_video_set_marquee_option_as_int(p_md, libvlc_marquee_X, val, &ex);
1001 hr = exception_bridge(&ex);
1006 STDMETHODIMP VLCMarquee::y(long val)
1008 libvlc_media_player_t *p_md;
1009 HRESULT hr = _p_instance->getMD(&p_md);
1012 libvlc_exception_t ex;
1013 libvlc_exception_init(&ex);
1015 libvlc_video_set_marquee_option_as_int(p_md, libvlc_marquee_Y, val, &ex);
1016 hr = exception_bridge(&ex);
1021 /*******************************************************************************/
1023 /* STL forward iterator used by VLCEnumIterator class to implement IEnumVARIANT */
1025 class VLCMessageSTLIterator
1030 VLCMessageSTLIterator(IVLCMessageIterator* iter) : iter(iter), msg(NULL)
1032 // get first message
1036 VLCMessageSTLIterator(const VLCMessageSTLIterator& other)
1046 virtual ~VLCMessageSTLIterator()
1055 // we only need prefix ++ operator
1056 VLCMessageSTLIterator& operator++()
1058 VARIANT_BOOL hasNext = VARIANT_FALSE;
1061 iter->get_hasNext(&hasNext);
1068 if( VARIANT_TRUE == hasNext ) {
1075 VARIANT operator*() const
1081 if( SUCCEEDED(msg->QueryInterface(IID_IDispatch,
1082 (LPVOID*)&V_DISPATCH(&v))) )
1084 V_VT(&v) = VT_DISPATCH;
1090 bool operator==(const VLCMessageSTLIterator& other) const
1092 return msg == other.msg;
1095 bool operator!=(const VLCMessageSTLIterator& other) const
1097 return msg != other.msg;
1101 IVLCMessageIterator* iter;
1105 ////////////////////////////////////////////////////////////////////////////////////////////////////////////
1107 VLCMessages::~VLCMessages()
1110 _p_typeinfo->Release();
1113 HRESULT VLCMessages::loadTypeInfo(void)
1115 HRESULT hr = NOERROR;
1116 if( NULL == _p_typeinfo )
1118 ITypeLib *p_typelib;
1120 hr = _p_instance->getTypeLib(LOCALE_USER_DEFAULT, &p_typelib);
1123 hr = p_typelib->GetTypeInfoOfGuid(IID_IVLCMessages, &_p_typeinfo);
1128 p_typelib->Release();
1134 STDMETHODIMP VLCMessages::GetTypeInfoCount(UINT* pctInfo)
1136 if( NULL == pctInfo )
1137 return E_INVALIDARG;
1139 if( SUCCEEDED(loadTypeInfo()) )
1147 STDMETHODIMP VLCMessages::GetTypeInfo(UINT iTInfo, LCID lcid, LPTYPEINFO* ppTInfo)
1149 if( NULL == ppTInfo )
1150 return E_INVALIDARG;
1152 if( SUCCEEDED(loadTypeInfo()) )
1154 _p_typeinfo->AddRef();
1155 *ppTInfo = _p_typeinfo;
1162 STDMETHODIMP VLCMessages::GetIDsOfNames(REFIID riid, LPOLESTR* rgszNames,
1163 UINT cNames, LCID lcid, DISPID* rgDispID)
1165 if( SUCCEEDED(loadTypeInfo()) )
1167 return DispGetIDsOfNames(_p_typeinfo, rgszNames, cNames, rgDispID);
1172 STDMETHODIMP VLCMessages::Invoke(DISPID dispIdMember, REFIID riid,
1173 LCID lcid, WORD wFlags, DISPPARAMS* pDispParams,
1174 VARIANT* pVarResult, EXCEPINFO* pExcepInfo, UINT* puArgErr)
1176 if( SUCCEEDED(loadTypeInfo()) )
1178 return DispInvoke(this, _p_typeinfo, dispIdMember, wFlags, pDispParams,
1179 pVarResult, pExcepInfo, puArgErr);
1184 STDMETHODIMP VLCMessages::get__NewEnum(LPUNKNOWN* _NewEnum)
1186 if( NULL == _NewEnum )
1189 IVLCMessageIterator* iter = NULL;
1192 *_NewEnum= new VLCEnumIterator<IID_IEnumVARIANT,
1195 VLCMessageSTLIterator>
1196 (VLCMessageSTLIterator(iter), VLCMessageSTLIterator(NULL));
1198 return *_NewEnum ? S_OK : E_OUTOFMEMORY;
1201 STDMETHODIMP VLCMessages::clear()
1203 HRESULT hr = NOERROR;
1204 libvlc_log_t *p_log = _p_vlclog->_p_log;
1207 libvlc_exception_t ex;
1208 libvlc_exception_init(&ex);
1210 libvlc_log_clear(p_log, &ex);
1211 hr = exception_bridge(&ex);
1216 STDMETHODIMP VLCMessages::get_count(long* count)
1223 libvlc_log_t *p_log = _p_vlclog->_p_log;
1226 libvlc_exception_t ex;
1227 libvlc_exception_init(&ex);
1229 *count = libvlc_log_count(p_log, &ex);
1230 hr = exception_bridge(&ex);
1237 STDMETHODIMP VLCMessages::iterator(IVLCMessageIterator** iter)
1242 *iter = new VLCMessageIterator(_p_instance, _p_vlclog);
1244 return *iter ? S_OK : E_OUTOFMEMORY;
1247 /*******************************************************************************/
1249 VLCMessageIterator::VLCMessageIterator(VLCPlugin *p_instance, VLCLog* p_vlclog ) :
1250 _p_instance(p_instance),
1255 if( p_vlclog->_p_log )
1257 _p_iter = libvlc_log_get_iterator(p_vlclog->_p_log, NULL);
1263 VLCMessageIterator::~VLCMessageIterator()
1266 libvlc_log_iterator_free(_p_iter, NULL);
1269 _p_typeinfo->Release();
1272 HRESULT VLCMessageIterator::loadTypeInfo(void)
1274 HRESULT hr = NOERROR;
1275 if( NULL == _p_typeinfo )
1277 ITypeLib *p_typelib;
1279 hr = _p_instance->getTypeLib(LOCALE_USER_DEFAULT, &p_typelib);
1282 hr = p_typelib->GetTypeInfoOfGuid(IID_IVLCMessageIterator, &_p_typeinfo);
1287 p_typelib->Release();
1293 STDMETHODIMP VLCMessageIterator::GetTypeInfoCount(UINT* pctInfo)
1295 if( NULL == pctInfo )
1296 return E_INVALIDARG;
1298 if( SUCCEEDED(loadTypeInfo()) )
1306 STDMETHODIMP VLCMessageIterator::GetTypeInfo(UINT iTInfo, LCID lcid, LPTYPEINFO* ppTInfo)
1308 if( NULL == ppTInfo )
1309 return E_INVALIDARG;
1311 if( SUCCEEDED(loadTypeInfo()) )
1313 _p_typeinfo->AddRef();
1314 *ppTInfo = _p_typeinfo;
1321 STDMETHODIMP VLCMessageIterator::GetIDsOfNames(REFIID riid, LPOLESTR* rgszNames,
1322 UINT cNames, LCID lcid, DISPID* rgDispID)
1324 if( SUCCEEDED(loadTypeInfo()) )
1326 return DispGetIDsOfNames(_p_typeinfo, rgszNames, cNames, rgDispID);
1331 STDMETHODIMP VLCMessageIterator::Invoke(DISPID dispIdMember, REFIID riid,
1332 LCID lcid, WORD wFlags, DISPPARAMS* pDispParams,
1333 VARIANT* pVarResult, EXCEPINFO* pExcepInfo, UINT* puArgErr)
1335 if( SUCCEEDED(loadTypeInfo()) )
1337 return DispInvoke(this, _p_typeinfo, dispIdMember, wFlags, pDispParams,
1338 pVarResult, pExcepInfo, puArgErr);
1343 STDMETHODIMP VLCMessageIterator::get_hasNext(VARIANT_BOOL* hasNext)
1347 if( NULL == hasNext )
1350 if( _p_iter && _p_vlclog->_p_log )
1352 libvlc_exception_t ex;
1353 libvlc_exception_init(&ex);
1355 *hasNext = libvlc_log_iterator_has_next(_p_iter, &ex) ?
1356 VARIANT_TRUE : VARIANT_FALSE;
1357 hr = exception_bridge(&ex);
1361 *hasNext = VARIANT_FALSE;
1366 STDMETHODIMP VLCMessageIterator::next(IVLCMessage** message)
1370 if( NULL == message )
1373 if( _p_iter && _p_vlclog->_p_log )
1375 struct libvlc_log_message_t buffer;
1377 buffer.sizeof_msg = sizeof(buffer);
1379 libvlc_exception_t ex;
1380 libvlc_exception_init(&ex);
1382 libvlc_log_iterator_next(_p_iter, &buffer, &ex);
1383 hr = exception_bridge(&ex);
1386 *message = new VLCMessage(_p_instance, buffer);
1394 /*******************************************************************************/
1396 VLCMessage::~VLCMessage()
1399 _p_typeinfo->Release();
1402 HRESULT VLCMessage::loadTypeInfo(void)
1404 HRESULT hr = NOERROR;
1405 if( NULL == _p_typeinfo )
1407 ITypeLib *p_typelib;
1409 hr = _p_instance->getTypeLib(LOCALE_USER_DEFAULT, &p_typelib);
1412 hr = p_typelib->GetTypeInfoOfGuid(IID_IVLCMessage, &_p_typeinfo);
1417 p_typelib->Release();
1423 STDMETHODIMP VLCMessage::GetTypeInfoCount(UINT* pctInfo)
1425 if( NULL == pctInfo )
1426 return E_INVALIDARG;
1428 if( SUCCEEDED(loadTypeInfo()) )
1436 STDMETHODIMP VLCMessage::GetTypeInfo(UINT iTInfo, LCID lcid, LPTYPEINFO* ppTInfo)
1438 if( NULL == ppTInfo )
1439 return E_INVALIDARG;
1441 if( SUCCEEDED(loadTypeInfo()) )
1443 _p_typeinfo->AddRef();
1444 *ppTInfo = _p_typeinfo;
1451 STDMETHODIMP VLCMessage::GetIDsOfNames(REFIID riid, LPOLESTR* rgszNames,
1452 UINT cNames, LCID lcid, DISPID* rgDispID)
1454 if( SUCCEEDED(loadTypeInfo()) )
1456 return DispGetIDsOfNames(_p_typeinfo, rgszNames, cNames, rgDispID);
1461 STDMETHODIMP VLCMessage::Invoke(DISPID dispIdMember, REFIID riid,
1462 LCID lcid, WORD wFlags, DISPPARAMS* pDispParams,
1463 VARIANT* pVarResult, EXCEPINFO* pExcepInfo, UINT* puArgErr)
1465 if( SUCCEEDED(loadTypeInfo()) )
1467 return DispInvoke(this, _p_typeinfo, dispIdMember, wFlags, pDispParams,
1468 pVarResult, pExcepInfo, puArgErr);
1473 inline const char *msgSeverity(int sev)
1488 STDMETHODIMP VLCMessage::get__Value(VARIANT* _Value)
1490 if( NULL == _Value )
1495 snprintf(buffer, sizeof(buffer), "%s %s %s: %s",
1496 _msg.psz_type, _msg.psz_name, msgSeverity(_msg.i_severity), _msg.psz_message);
1498 V_VT(_Value) = VT_BSTR;
1499 V_BSTR(_Value) = BSTRFromCStr(CP_UTF8, buffer);
1504 STDMETHODIMP VLCMessage::get_severity(long* level)
1509 *level = _msg.i_severity;
1514 STDMETHODIMP VLCMessage::get_type(BSTR* type)
1519 *type = BSTRFromCStr(CP_UTF8, _msg.psz_type);
1524 STDMETHODIMP VLCMessage::get_name(BSTR* name)
1529 *name = BSTRFromCStr(CP_UTF8, _msg.psz_name);
1534 STDMETHODIMP VLCMessage::get_header(BSTR* header)
1536 if( NULL == header )
1539 *header = BSTRFromCStr(CP_UTF8, _msg.psz_header);
1544 STDMETHODIMP VLCMessage::get_message(BSTR* message)
1546 if( NULL == message )
1549 *message = BSTRFromCStr(CP_UTF8, _msg.psz_message);
1554 /*******************************************************************************/
1556 VLCPlaylistItems::~VLCPlaylistItems()
1559 _p_typeinfo->Release();
1562 HRESULT VLCPlaylistItems::loadTypeInfo(void)
1564 HRESULT hr = NOERROR;
1565 if( NULL == _p_typeinfo )
1567 ITypeLib *p_typelib;
1569 hr = _p_instance->getTypeLib(LOCALE_USER_DEFAULT, &p_typelib);
1572 hr = p_typelib->GetTypeInfoOfGuid(IID_IVLCPlaylistItems, &_p_typeinfo);
1577 p_typelib->Release();
1583 STDMETHODIMP VLCPlaylistItems::GetTypeInfoCount(UINT* pctInfo)
1585 if( NULL == pctInfo )
1586 return E_INVALIDARG;
1588 if( SUCCEEDED(loadTypeInfo()) )
1596 STDMETHODIMP VLCPlaylistItems::GetTypeInfo(UINT iTInfo, LCID lcid, LPTYPEINFO* ppTInfo)
1598 if( NULL == ppTInfo )
1599 return E_INVALIDARG;
1601 if( SUCCEEDED(loadTypeInfo()) )
1603 _p_typeinfo->AddRef();
1604 *ppTInfo = _p_typeinfo;
1611 STDMETHODIMP VLCPlaylistItems::GetIDsOfNames(REFIID riid, LPOLESTR* rgszNames,
1612 UINT cNames, LCID lcid, DISPID* rgDispID)
1614 if( SUCCEEDED(loadTypeInfo()) )
1616 return DispGetIDsOfNames(_p_typeinfo, rgszNames, cNames, rgDispID);
1621 STDMETHODIMP VLCPlaylistItems::Invoke(DISPID dispIdMember, REFIID riid,
1622 LCID lcid, WORD wFlags, DISPPARAMS* pDispParams,
1623 VARIANT* pVarResult, EXCEPINFO* pExcepInfo, UINT* puArgErr)
1625 if( SUCCEEDED(loadTypeInfo()) )
1627 return DispInvoke(this, _p_typeinfo, dispIdMember, wFlags, pDispParams,
1628 pVarResult, pExcepInfo, puArgErr);
1633 STDMETHODIMP VLCPlaylistItems::get_count(long* count)
1638 libvlc_exception_t ex;
1639 libvlc_exception_init(&ex);
1641 *count = _p_instance->playlist_count(&ex);
1642 return exception_bridge(&ex);
1645 STDMETHODIMP VLCPlaylistItems::clear()
1647 libvlc_exception_t ex;
1648 libvlc_exception_init(&ex);
1650 _p_instance->playlist_clear(&ex);
1651 return exception_bridge(&ex);
1654 STDMETHODIMP VLCPlaylistItems::remove(long item)
1656 libvlc_instance_t* p_libvlc;
1657 HRESULT hr = _p_instance->getVLC(&p_libvlc);
1660 libvlc_exception_t ex;
1661 libvlc_exception_init(&ex);
1663 _p_instance->playlist_delete_item(item, &ex);
1664 hr = exception_bridge(&ex);
1669 /*******************************************************************************/
1671 VLCPlaylist::~VLCPlaylist()
1673 delete _p_vlcplaylistitems;
1675 _p_typeinfo->Release();
1678 HRESULT VLCPlaylist::loadTypeInfo(void)
1680 HRESULT hr = NOERROR;
1681 if( NULL == _p_typeinfo )
1683 ITypeLib *p_typelib;
1685 hr = _p_instance->getTypeLib(LOCALE_USER_DEFAULT, &p_typelib);
1688 hr = p_typelib->GetTypeInfoOfGuid(IID_IVLCPlaylist, &_p_typeinfo);
1693 p_typelib->Release();
1699 STDMETHODIMP VLCPlaylist::GetTypeInfoCount(UINT* pctInfo)
1701 if( NULL == pctInfo )
1702 return E_INVALIDARG;
1704 if( SUCCEEDED(loadTypeInfo()) )
1712 STDMETHODIMP VLCPlaylist::GetTypeInfo(UINT iTInfo, LCID lcid, LPTYPEINFO* ppTInfo)
1714 if( NULL == ppTInfo )
1715 return E_INVALIDARG;
1717 if( SUCCEEDED(loadTypeInfo()) )
1719 _p_typeinfo->AddRef();
1720 *ppTInfo = _p_typeinfo;
1727 STDMETHODIMP VLCPlaylist::GetIDsOfNames(REFIID riid, LPOLESTR* rgszNames,
1728 UINT cNames, LCID lcid, DISPID* rgDispID)
1730 if( SUCCEEDED(loadTypeInfo()) )
1732 return DispGetIDsOfNames(_p_typeinfo, rgszNames, cNames, rgDispID);
1737 STDMETHODIMP VLCPlaylist::Invoke(DISPID dispIdMember, REFIID riid,
1738 LCID lcid, WORD wFlags, DISPPARAMS* pDispParams,
1739 VARIANT* pVarResult, EXCEPINFO* pExcepInfo, UINT* puArgErr)
1741 if( SUCCEEDED(loadTypeInfo()) )
1743 return DispInvoke(this, _p_typeinfo, dispIdMember, wFlags, pDispParams,
1744 pVarResult, pExcepInfo, puArgErr);
1749 STDMETHODIMP VLCPlaylist::get_itemCount(long* count)
1755 libvlc_exception_t ex;
1756 libvlc_exception_init(&ex);
1758 *count = _p_instance->playlist_count(&ex);
1759 return exception_bridge(&ex);
1762 STDMETHODIMP VLCPlaylist::get_isPlaying(VARIANT_BOOL* isPlaying)
1764 if( NULL == isPlaying )
1767 libvlc_media_player_t *p_md;
1768 HRESULT hr = _p_instance->getMD(&p_md);
1771 libvlc_exception_t ex;
1772 libvlc_exception_init(&ex);
1774 *isPlaying = libvlc_media_player_is_playing(p_md, &ex) ?
1775 VARIANT_TRUE: VARIANT_FALSE;
1776 libvlc_exception_clear(&ex);
1781 STDMETHODIMP VLCPlaylist::add(BSTR uri, VARIANT name, VARIANT options, long* item)
1786 if( 0 == SysStringLen(uri) )
1787 return E_INVALIDARG;
1789 libvlc_instance_t* p_libvlc;
1790 HRESULT hr = _p_instance->getVLC(&p_libvlc);
1793 libvlc_exception_t ex;
1794 libvlc_exception_init(&ex);
1796 char *psz_uri = NULL;
1797 if( SysStringLen(_p_instance->getBaseURL()) > 0 )
1800 ** if the MRL a relative URL, we should end up with an absolute URL
1802 LPWSTR abs_url = CombineURL(_p_instance->getBaseURL(), uri);
1803 if( NULL != abs_url )
1805 psz_uri = CStrFromWSTR(CP_UTF8, abs_url, wcslen(abs_url));
1806 CoTaskMemFree(abs_url);
1810 psz_uri = CStrFromBSTR(CP_UTF8, uri);
1816 ** baseURL is empty, assume MRL is absolute
1818 psz_uri = CStrFromBSTR(CP_UTF8, uri);
1821 if( NULL == psz_uri )
1823 return E_OUTOFMEMORY;
1827 char **ppsz_options;
1829 hr = VLCControl::CreateTargetOptions(CP_UTF8, &options, &ppsz_options, &i_options);
1832 CoTaskMemFree(psz_uri);
1836 char *psz_name = NULL;
1838 VariantInit(&v_name);
1839 if( SUCCEEDED(VariantChangeType(&v_name, &name, 0, VT_BSTR)) )
1841 if( SysStringLen(V_BSTR(&v_name)) > 0 )
1842 psz_name = CStrFromBSTR(CP_UTF8, V_BSTR(&v_name));
1844 VariantClear(&v_name);
1847 *item = _p_instance->playlist_add_extended_untrusted(psz_uri,
1848 i_options, const_cast<const char **>(ppsz_options), &ex);
1850 VLCControl::FreeTargetOptions(ppsz_options, i_options);
1851 CoTaskMemFree(psz_uri);
1852 if( psz_name ) /* XXX Do we even need to check? */
1853 CoTaskMemFree(psz_name);
1854 hr = exception_bridge(&ex);
1859 STDMETHODIMP VLCPlaylist::play()
1861 libvlc_exception_t ex;
1862 libvlc_exception_init(&ex);
1864 _p_instance->playlist_play(&ex);
1865 return exception_bridge(&ex);
1868 STDMETHODIMP VLCPlaylist::playItem(long item)
1870 libvlc_exception_t ex;
1871 libvlc_exception_init(&ex);
1873 _p_instance->playlist_play_item(item,&ex);
1874 return exception_bridge(&ex);;
1877 STDMETHODIMP VLCPlaylist::togglePause()
1879 libvlc_media_player_t* p_md;
1880 HRESULT hr = _p_instance->getMD(&p_md);
1883 libvlc_exception_t ex;
1884 libvlc_exception_init(&ex);
1886 libvlc_media_player_pause(p_md, &ex);
1887 hr = exception_bridge(&ex);;
1892 STDMETHODIMP VLCPlaylist::stop()
1894 libvlc_media_player_t *p_md;
1895 HRESULT hr = _p_instance->getMD(&p_md);
1898 libvlc_exception_t ex;
1899 libvlc_exception_init(&ex);
1901 libvlc_media_player_stop(p_md, &ex);
1902 hr = exception_bridge(&ex);;
1907 STDMETHODIMP VLCPlaylist::next()
1909 libvlc_exception_t ex;
1910 libvlc_exception_init(&ex);
1912 _p_instance->playlist_next(&ex);
1913 return exception_bridge(&ex);;
1916 STDMETHODIMP VLCPlaylist::prev()
1918 libvlc_exception_t ex;
1919 libvlc_exception_init(&ex);
1921 _p_instance->playlist_prev(&ex);
1922 return exception_bridge(&ex);;
1925 STDMETHODIMP VLCPlaylist::clear()
1927 libvlc_exception_t ex;
1928 libvlc_exception_init(&ex);
1930 _p_instance->playlist_clear(&ex);
1931 return exception_bridge(&ex);;
1934 STDMETHODIMP VLCPlaylist::removeItem(long item)
1936 libvlc_instance_t* p_libvlc;
1937 HRESULT hr = _p_instance->getVLC(&p_libvlc);
1940 libvlc_exception_t ex;
1941 libvlc_exception_init(&ex);
1943 _p_instance->playlist_delete_item(item, &ex);
1944 hr = exception_bridge(&ex);;
1949 STDMETHODIMP VLCPlaylist::get_items(IVLCPlaylistItems** obj)
1954 *obj = _p_vlcplaylistitems;
1955 if( NULL != _p_vlcplaylistitems )
1957 _p_vlcplaylistitems->AddRef();
1960 return E_OUTOFMEMORY;
1963 /*******************************************************************************/
1965 VLCSubtitle::~VLCSubtitle()
1968 _p_typeinfo->Release();
1971 HRESULT VLCSubtitle::loadTypeInfo(void)
1973 HRESULT hr = NOERROR;
1974 if( NULL == _p_typeinfo )
1976 ITypeLib *p_typelib;
1978 hr = _p_instance->getTypeLib(LOCALE_USER_DEFAULT, &p_typelib);
1981 hr = p_typelib->GetTypeInfoOfGuid(IID_IVLCSubtitle, &_p_typeinfo);
1986 p_typelib->Release();
1992 STDMETHODIMP VLCSubtitle::GetTypeInfoCount(UINT* pctInfo)
1994 if( NULL == pctInfo )
1995 return E_INVALIDARG;
1997 if( SUCCEEDED(loadTypeInfo()) )
2005 STDMETHODIMP VLCSubtitle::GetTypeInfo(UINT iTInfo, LCID lcid, LPTYPEINFO* ppTInfo)
2007 if( NULL == ppTInfo )
2008 return E_INVALIDARG;
2010 if( SUCCEEDED(loadTypeInfo()) )
2012 _p_typeinfo->AddRef();
2013 *ppTInfo = _p_typeinfo;
2020 STDMETHODIMP VLCSubtitle::GetIDsOfNames(REFIID riid, LPOLESTR* rgszNames,
2021 UINT cNames, LCID lcid, DISPID* rgDispID)
2023 if( SUCCEEDED(loadTypeInfo()) )
2025 return DispGetIDsOfNames(_p_typeinfo, rgszNames, cNames, rgDispID);
2030 STDMETHODIMP VLCSubtitle::Invoke(DISPID dispIdMember, REFIID riid,
2031 LCID lcid, WORD wFlags, DISPPARAMS* pDispParams,
2032 VARIANT* pVarResult, EXCEPINFO* pExcepInfo, UINT* puArgErr)
2034 if( SUCCEEDED(loadTypeInfo()) )
2036 return DispInvoke(this, _p_typeinfo, dispIdMember, wFlags, pDispParams,
2037 pVarResult, pExcepInfo, puArgErr);
2042 STDMETHODIMP VLCSubtitle::get_track(long* spu)
2047 libvlc_media_player_t *p_md;
2048 HRESULT hr = _p_instance->getMD(&p_md);
2051 libvlc_exception_t ex;
2052 libvlc_exception_init(&ex);
2054 *spu = libvlc_video_get_spu(p_md, &ex);
2055 hr = exception_bridge(&ex);
2060 STDMETHODIMP VLCSubtitle::put_track(long spu)
2062 libvlc_media_player_t *p_md;
2063 HRESULT hr = _p_instance->getMD(&p_md);
2066 libvlc_exception_t ex;
2067 libvlc_exception_init(&ex);
2069 libvlc_video_set_spu(p_md, spu, &ex);
2070 hr = exception_bridge(&ex);
2075 STDMETHODIMP VLCSubtitle::get_count(long* spuNumber)
2077 if( NULL == spuNumber )
2080 libvlc_media_player_t *p_md;
2081 HRESULT hr = _p_instance->getMD(&p_md);
2084 libvlc_exception_t ex;
2085 libvlc_exception_init(&ex);
2086 // get the number of video subtitle available and return it
2087 *spuNumber = libvlc_video_get_spu_count(p_md, &ex);
2088 hr = exception_bridge(&ex);
2094 STDMETHODIMP VLCSubtitle::description(long nameID, BSTR* name)
2099 libvlc_media_player_t* p_md;
2100 libvlc_exception_t ex;
2101 libvlc_exception_init(&ex);
2103 HRESULT hr = _p_instance->getMD(&p_md);
2107 const char *psz_name;
2108 libvlc_track_description_t *p_spuDesc;
2110 // get subtitles description
2111 p_spuDesc = libvlc_video_get_spu_description(p_md, &ex);
2112 hr = exception_bridge(&ex);
2116 // get the number of available subtitle
2117 i_limit = libvlc_video_get_spu_count(p_md, &ex);
2118 hr = exception_bridge(&ex);
2122 // check if the number given is a good one
2123 if ( ( nameID > ( i_limit -1 ) ) || ( nameID < 0 ) )
2126 // get the good spuDesc
2127 for( i = 0 ; i < nameID ; i++ )
2129 p_spuDesc = p_spuDesc->p_next;
2131 // get the subtitle name
2132 psz_name = p_spuDesc->psz_name;
2135 if( psz_name != NULL )
2137 *name = BSTRFromCStr(CP_UTF8, psz_name);
2138 return (NULL == *name) ? E_OUTOFMEMORY : NOERROR;
2146 /*******************************************************************************/
2148 VLCVideo::~VLCVideo()
2150 delete _p_vlcmarquee;
2152 _p_typeinfo->Release();
2155 HRESULT VLCVideo::loadTypeInfo(void)
2157 HRESULT hr = NOERROR;
2158 if( NULL == _p_typeinfo )
2160 ITypeLib *p_typelib;
2162 hr = _p_instance->getTypeLib(LOCALE_USER_DEFAULT, &p_typelib);
2165 hr = p_typelib->GetTypeInfoOfGuid(IID_IVLCVideo, &_p_typeinfo);
2170 p_typelib->Release();
2176 STDMETHODIMP VLCVideo::GetTypeInfoCount(UINT* pctInfo)
2178 if( NULL == pctInfo )
2179 return E_INVALIDARG;
2181 if( SUCCEEDED(loadTypeInfo()) )
2189 STDMETHODIMP VLCVideo::GetTypeInfo(UINT iTInfo, LCID lcid, LPTYPEINFO* ppTInfo)
2191 if( NULL == ppTInfo )
2192 return E_INVALIDARG;
2194 if( SUCCEEDED(loadTypeInfo()) )
2196 _p_typeinfo->AddRef();
2197 *ppTInfo = _p_typeinfo;
2204 STDMETHODIMP VLCVideo::GetIDsOfNames(REFIID riid, LPOLESTR* rgszNames,
2205 UINT cNames, LCID lcid, DISPID* rgDispID)
2207 if( SUCCEEDED(loadTypeInfo()) )
2209 return DispGetIDsOfNames(_p_typeinfo, rgszNames, cNames, rgDispID);
2214 STDMETHODIMP VLCVideo::Invoke(DISPID dispIdMember, REFIID riid,
2215 LCID lcid, WORD wFlags, DISPPARAMS* pDispParams,
2216 VARIANT* pVarResult, EXCEPINFO* pExcepInfo, UINT* puArgErr)
2218 if( SUCCEEDED(loadTypeInfo()) )
2220 return DispInvoke(this, _p_typeinfo, dispIdMember, wFlags, pDispParams,
2221 pVarResult, pExcepInfo, puArgErr);
2226 STDMETHODIMP VLCVideo::get_fullscreen(VARIANT_BOOL* fullscreen)
2228 if( NULL == fullscreen )
2231 libvlc_media_player_t *p_md;
2232 HRESULT hr = _p_instance->getMD(&p_md);
2235 libvlc_exception_t ex;
2236 libvlc_exception_init(&ex);
2238 *fullscreen = libvlc_get_fullscreen(p_md, &ex) ?
2239 VARIANT_TRUE : VARIANT_FALSE;
2240 hr = exception_bridge(&ex);
2245 STDMETHODIMP VLCVideo::put_fullscreen(VARIANT_BOOL fullscreen)
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_set_fullscreen(p_md, VARIANT_FALSE != fullscreen, &ex);
2255 hr = exception_bridge(&ex);
2260 STDMETHODIMP VLCVideo::get_width(long* width)
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 *width = libvlc_video_get_width(p_md, &ex);
2273 hr = exception_bridge(&ex);
2278 STDMETHODIMP VLCVideo::get_height(long* height)
2280 if( NULL == height )
2283 libvlc_media_player_t *p_md;
2284 HRESULT hr = _p_instance->getMD(&p_md);
2287 libvlc_exception_t ex;
2288 libvlc_exception_init(&ex);
2290 *height = libvlc_video_get_height(p_md, &ex);
2291 hr = exception_bridge(&ex);
2296 STDMETHODIMP VLCVideo::get_aspectRatio(BSTR* aspect)
2298 if( NULL == aspect )
2301 libvlc_media_player_t *p_md;
2302 HRESULT hr = _p_instance->getMD(&p_md);
2305 libvlc_exception_t ex;
2306 libvlc_exception_init(&ex);
2308 char *psz_aspect = libvlc_video_get_aspect_ratio(p_md, &ex);
2310 hr = exception_bridge(&ex);
2311 if( SUCCEEDED(hr) && NULL != psz_aspect )
2313 *aspect = BSTRFromCStr(CP_UTF8, psz_aspect);
2314 if( NULL == *aspect )
2316 } else if( NULL == psz_aspect) hr = E_OUTOFMEMORY; // strdup("") failed
2322 STDMETHODIMP VLCVideo::put_aspectRatio(BSTR aspect)
2324 if( NULL == aspect )
2327 libvlc_media_player_t *p_md;
2328 HRESULT hr = _p_instance->getMD(&p_md);
2331 libvlc_exception_t ex;
2332 libvlc_exception_init(&ex);
2334 char *psz_aspect = CStrFromBSTR(CP_UTF8, aspect);
2335 if( NULL == psz_aspect )
2337 return E_OUTOFMEMORY;
2340 libvlc_video_set_aspect_ratio(p_md, psz_aspect, &ex);
2342 CoTaskMemFree(psz_aspect);
2343 hr = exception_bridge(&ex);
2348 STDMETHODIMP VLCVideo::get_subtitle(long* spu)
2353 libvlc_media_player_t *p_md;
2354 HRESULT hr = _p_instance->getMD(&p_md);
2357 libvlc_exception_t ex;
2358 libvlc_exception_init(&ex);
2360 *spu = libvlc_video_get_spu(p_md, &ex);
2361 hr = exception_bridge(&ex);
2366 STDMETHODIMP VLCVideo::put_subtitle(long spu)
2368 libvlc_media_player_t *p_md;
2369 HRESULT hr = _p_instance->getMD(&p_md);
2372 libvlc_exception_t ex;
2373 libvlc_exception_init(&ex);
2375 libvlc_video_set_spu(p_md, spu, &ex);
2376 hr = exception_bridge(&ex);
2381 STDMETHODIMP VLCVideo::get_crop(BSTR* geometry)
2383 if( NULL == geometry )
2386 libvlc_media_player_t *p_md;
2387 HRESULT hr = _p_instance->getMD(&p_md);
2390 libvlc_exception_t ex;
2391 libvlc_exception_init(&ex);
2393 char *psz_geometry = libvlc_video_get_crop_geometry(p_md, &ex);
2395 hr = exception_bridge(&ex);
2396 if( SUCCEEDED(&ex) && NULL != psz_geometry )
2398 *geometry = BSTRFromCStr(CP_UTF8, psz_geometry);
2399 if( NULL == geometry ) hr = E_OUTOFMEMORY;
2400 } else if( NULL == psz_geometry ) hr = E_OUTOFMEMORY;
2401 free( psz_geometry );
2406 STDMETHODIMP VLCVideo::put_crop(BSTR geometry)
2408 if( NULL == geometry )
2411 if( 0 == SysStringLen(geometry) )
2412 return E_INVALIDARG;
2414 libvlc_media_player_t *p_md;
2415 HRESULT hr = _p_instance->getMD(&p_md);
2418 libvlc_exception_t ex;
2419 libvlc_exception_init(&ex);
2421 char *psz_geometry = CStrFromBSTR(CP_UTF8, geometry);
2422 if( NULL == psz_geometry )
2424 return E_OUTOFMEMORY;
2427 libvlc_video_set_crop_geometry(p_md, psz_geometry, &ex);
2429 CoTaskMemFree(psz_geometry);
2430 hr = exception_bridge(&ex);
2435 STDMETHODIMP VLCVideo::get_teletext(long* page)
2440 libvlc_media_player_t *p_md;
2441 HRESULT hr = _p_instance->getMD(&p_md);
2444 libvlc_exception_t ex;
2445 libvlc_exception_init(&ex);
2447 *page = libvlc_video_get_teletext(p_md, &ex);
2448 hr = exception_bridge(&ex);
2453 STDMETHODIMP VLCVideo::put_teletext(long page)
2455 libvlc_media_player_t *p_md;
2456 HRESULT hr = _p_instance->getMD(&p_md);
2459 libvlc_exception_t ex;
2460 libvlc_exception_init(&ex);
2462 libvlc_video_set_teletext(p_md, page, &ex);
2463 hr = exception_bridge(&ex);
2468 STDMETHODIMP VLCVideo::deinterlaceDisable()
2470 libvlc_media_player_t *p_md;
2471 HRESULT hr = _p_instance->getMD(&p_md);
2474 libvlc_exception_t ex;
2475 libvlc_exception_init(&ex);
2477 libvlc_video_set_deinterlace(p_md, 0, "", &ex);
2478 hr = exception_bridge(&ex);
2483 STDMETHODIMP VLCVideo::deinterlaceEnable(BSTR mode)
2485 libvlc_media_player_t *p_md;
2486 HRESULT hr = _p_instance->getMD(&p_md);
2489 libvlc_exception_t ex;
2490 libvlc_exception_init(&ex);
2491 /* get deinterlace mode from the user */
2492 char *psz_mode = CStrFromBSTR(CP_UTF8, mode);
2493 /* enable deinterlace filter if possible */
2494 libvlc_video_set_deinterlace(p_md, 1, psz_mode, &ex);
2495 hr = exception_bridge(&ex);
2496 CoTaskMemFree(psz_mode);
2501 STDMETHODIMP VLCVideo::takeSnapshot(LPPICTUREDISP* picture)
2503 if( NULL == picture )
2506 libvlc_media_player_t *p_md;
2507 HRESULT hr = _p_instance->getMD(&p_md);
2510 libvlc_exception_t ex;
2511 libvlc_exception_init(&ex);
2513 static int uniqueId = 0;
2514 TCHAR path[MAX_PATH+1];
2516 int pathlen = GetTempPath(MAX_PATH-24, path);
2517 if( (0 == pathlen) || (pathlen > (MAX_PATH-24)) )
2520 /* check temp directory path by openning it */
2522 HANDLE dirHandle = CreateFile(path, GENERIC_READ,
2523 FILE_SHARE_READ|FILE_SHARE_WRITE|FILE_SHARE_DELETE,
2524 NULL, OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS, NULL);
2525 if( INVALID_HANDLE_VALUE == dirHandle )
2527 _p_instance->setErrorInfo(IID_IVLCVideo,
2528 "Invalid temporary directory for snapshot images, check values of TMP, TEMP envars.");
2533 BY_HANDLE_FILE_INFORMATION bhfi;
2534 BOOL res = GetFileInformationByHandle(dirHandle, &bhfi);
2535 CloseHandle(dirHandle);
2536 if( !res || !(bhfi.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) )
2538 _p_instance->setErrorInfo(IID_IVLCVideo,
2539 "Invalid temporary directory for snapshot images, check values of TMP, TEMP envars.");
2545 TCHAR filepath[MAX_PATH+1];
2547 _stprintf(filepath, TEXT("%sAXVLC%lXS%lX.bmp"),
2548 path, GetCurrentProcessId(), ++uniqueId);
2551 /* reuse path storage for UTF8 string */
2552 char *psz_filepath = (char *)path;
2553 WCHAR* wpath = filepath;
2555 char *psz_filepath = path;
2556 /* first convert to unicode using current code page */
2557 WCHAR wpath[MAX_PATH+1];
2558 if( 0 == MultiByteToWideChar(CP_ACP, 0, filepath, -1,
2559 wpath, sizeof(wpath)/sizeof(WCHAR)) )
2562 /* convert to UTF8 */
2563 pathlen = WideCharToMultiByte(CP_UTF8, 0, wpath, -1,
2564 psz_filepath, sizeof(path), NULL, NULL);
2565 // fail if path is 0 or too short (i.e pathlen is the same as
2568 if( (0 == pathlen) || (sizeof(path) == pathlen) )
2571 /* take snapshot into file */
2572 libvlc_video_take_snapshot(p_md, psz_filepath, 0, 0, &ex);
2573 hr = exception_bridge(&ex);
2576 /* open snapshot file */
2577 HANDLE snapPic = LoadImage(NULL, filepath, IMAGE_BITMAP, 0, 0,
2578 LR_CREATEDIBSECTION|LR_LOADFROMFILE);
2583 snapDesc.cbSizeofstruct = sizeof(PICTDESC);
2584 snapDesc.picType = PICTYPE_BITMAP;
2585 snapDesc.bmp.hbitmap = (HBITMAP)snapPic;
2586 snapDesc.bmp.hpal = NULL;
2588 hr = OleCreatePictureIndirect(&snapDesc, IID_IPictureDisp,
2589 TRUE, (LPVOID*)picture);
2593 DeleteObject(snapPic);
2596 DeleteFile(filepath);
2602 STDMETHODIMP VLCVideo::toggleFullscreen()
2604 libvlc_media_player_t *p_md;
2605 HRESULT hr = _p_instance->getMD(&p_md);
2608 libvlc_exception_t ex;
2609 libvlc_exception_init(&ex);
2611 libvlc_toggle_fullscreen(p_md, &ex);
2612 hr = exception_bridge(&ex);
2617 STDMETHODIMP VLCVideo::toggleTeletext()
2619 libvlc_media_player_t *p_md;
2620 HRESULT hr = _p_instance->getMD(&p_md);
2623 libvlc_exception_t ex;
2624 libvlc_exception_init(&ex);
2626 libvlc_toggle_teletext(p_md, &ex);
2627 hr = exception_bridge(&ex);
2632 STDMETHODIMP VLCVideo::get_marquee(IVLCMarquee** obj)
2637 *obj = _p_vlcmarquee;
2638 if( NULL != _p_vlcmarquee )
2640 _p_vlcmarquee->AddRef();
2643 return E_OUTOFMEMORY;
2646 /*******************************************************************************/
2648 VLCControl2::VLCControl2(VLCPlugin *p_instance) :
2649 _p_instance(p_instance),
2653 _p_vlcplaylist(NULL),
2654 _p_vlcsubtitle(NULL),
2657 _p_vlcaudio = new VLCAudio(p_instance);
2658 _p_vlcinput = new VLCInput(p_instance);
2659 _p_vlclog = new VLCLog(p_instance);
2660 _p_vlcplaylist = new VLCPlaylist(p_instance);
2661 _p_vlcsubtitle = new VLCSubtitle(p_instance);
2662 _p_vlcvideo = new VLCVideo(p_instance);
2665 VLCControl2::~VLCControl2()
2668 delete _p_vlcsubtitle;
2669 delete _p_vlcplaylist;
2674 _p_typeinfo->Release();
2677 HRESULT VLCControl2::loadTypeInfo(void)
2679 HRESULT hr = NOERROR;
2680 if( NULL == _p_typeinfo )
2682 ITypeLib *p_typelib;
2684 hr = _p_instance->getTypeLib(LOCALE_USER_DEFAULT, &p_typelib);
2687 hr = p_typelib->GetTypeInfoOfGuid(IID_IVLCControl2, &_p_typeinfo);
2692 p_typelib->Release();
2698 STDMETHODIMP VLCControl2::GetTypeInfoCount(UINT* pctInfo)
2700 if( NULL == pctInfo )
2701 return E_INVALIDARG;
2703 if( SUCCEEDED(loadTypeInfo()) )
2711 STDMETHODIMP VLCControl2::GetTypeInfo(UINT iTInfo, LCID lcid, LPTYPEINFO* ppTInfo)
2713 if( NULL == ppTInfo )
2714 return E_INVALIDARG;
2716 if( SUCCEEDED(loadTypeInfo()) )
2718 _p_typeinfo->AddRef();
2719 *ppTInfo = _p_typeinfo;
2726 STDMETHODIMP VLCControl2::GetIDsOfNames(REFIID riid, LPOLESTR* rgszNames,
2727 UINT cNames, LCID lcid, DISPID* rgDispID)
2729 if( SUCCEEDED(loadTypeInfo()) )
2731 return DispGetIDsOfNames(_p_typeinfo, rgszNames, cNames, rgDispID);
2736 STDMETHODIMP VLCControl2::Invoke(DISPID dispIdMember, REFIID riid,
2737 LCID lcid, WORD wFlags, DISPPARAMS* pDispParams,
2738 VARIANT* pVarResult, EXCEPINFO* pExcepInfo, UINT* puArgErr)
2740 if( SUCCEEDED(loadTypeInfo()) )
2742 return DispInvoke(this, _p_typeinfo, dispIdMember, wFlags, pDispParams,
2743 pVarResult, pExcepInfo, puArgErr);
2748 STDMETHODIMP VLCControl2::get_AutoLoop(VARIANT_BOOL *autoloop)
2750 if( NULL == autoloop )
2753 *autoloop = _p_instance->getAutoLoop() ? VARIANT_TRUE: VARIANT_FALSE;
2757 STDMETHODIMP VLCControl2::put_AutoLoop(VARIANT_BOOL autoloop)
2759 _p_instance->setAutoLoop((VARIANT_FALSE != autoloop) ? TRUE: FALSE);
2763 STDMETHODIMP VLCControl2::get_AutoPlay(VARIANT_BOOL *autoplay)
2765 if( NULL == autoplay )
2768 *autoplay = _p_instance->getAutoPlay() ? VARIANT_TRUE: VARIANT_FALSE;
2772 STDMETHODIMP VLCControl2::put_AutoPlay(VARIANT_BOOL autoplay)
2774 _p_instance->setAutoPlay((VARIANT_FALSE != autoplay) ? TRUE: FALSE);
2778 STDMETHODIMP VLCControl2::get_BaseURL(BSTR *url)
2783 *url = SysAllocStringLen(_p_instance->getBaseURL(),
2784 SysStringLen(_p_instance->getBaseURL()));
2788 STDMETHODIMP VLCControl2::put_BaseURL(BSTR mrl)
2790 _p_instance->setBaseURL(mrl);
2795 STDMETHODIMP VLCControl2::get_MRL(BSTR *mrl)
2800 *mrl = SysAllocStringLen(_p_instance->getMRL(),
2801 SysStringLen(_p_instance->getMRL()));
2805 STDMETHODIMP VLCControl2::put_MRL(BSTR mrl)
2807 _p_instance->setMRL(mrl);
2813 STDMETHODIMP VLCControl2::get_Toolbar(VARIANT_BOOL *visible)
2815 if( NULL == visible )
2819 * Note to developpers
2821 * Returning the _b_toolbar is closer to the method specification.
2822 * But returning True when toolbar is not implemented so not displayed
2823 * could be bad for ActiveX users which rely on this value to show their
2824 * own toolbar if not provided by the ActiveX.
2826 * This is the reason why FALSE is returned, until toolbar get implemented.
2829 /* DISABLED for now */
2830 // *visible = _p_instance->getShowToolbar() ? VARIANT_TRUE: VARIANT_FALSE;
2832 *visible = VARIANT_FALSE;
2837 STDMETHODIMP VLCControl2::put_Toolbar(VARIANT_BOOL visible)
2839 _p_instance->setShowToolbar((VARIANT_FALSE != visible) ? TRUE: FALSE);
2844 STDMETHODIMP VLCControl2::get_StartTime(long *seconds)
2846 if( NULL == seconds )
2849 *seconds = _p_instance->getStartTime();
2854 STDMETHODIMP VLCControl2::put_StartTime(long seconds)
2856 _p_instance->setStartTime(seconds);
2861 STDMETHODIMP VLCControl2::get_VersionInfo(BSTR *version)
2863 if( NULL == version )
2866 const char *versionStr = libvlc_get_version();
2867 if( NULL != versionStr )
2869 *version = BSTRFromCStr(CP_UTF8, versionStr);
2871 return (NULL == *version) ? E_OUTOFMEMORY : NOERROR;
2877 STDMETHODIMP VLCControl2::get_Visible(VARIANT_BOOL *isVisible)
2879 if( NULL == isVisible )
2882 *isVisible = _p_instance->getVisible() ? VARIANT_TRUE : VARIANT_FALSE;
2887 STDMETHODIMP VLCControl2::put_Visible(VARIANT_BOOL isVisible)
2889 _p_instance->setVisible(isVisible != VARIANT_FALSE);
2894 STDMETHODIMP VLCControl2::get_Volume(long *volume)
2896 if( NULL == volume )
2899 *volume = _p_instance->getVolume();
2903 STDMETHODIMP VLCControl2::put_Volume(long volume)
2905 _p_instance->setVolume(volume);
2909 STDMETHODIMP VLCControl2::get_BackColor(OLE_COLOR *backcolor)
2911 if( NULL == backcolor )
2914 *backcolor = _p_instance->getBackColor();
2918 STDMETHODIMP VLCControl2::put_BackColor(OLE_COLOR backcolor)
2920 _p_instance->setBackColor(backcolor);
2924 STDMETHODIMP VLCControl2::get_audio(IVLCAudio** obj)
2930 if( NULL != _p_vlcaudio )
2932 _p_vlcaudio->AddRef();
2935 return E_OUTOFMEMORY;
2938 STDMETHODIMP VLCControl2::get_input(IVLCInput** obj)
2944 if( NULL != _p_vlcinput )
2946 _p_vlcinput->AddRef();
2949 return E_OUTOFMEMORY;
2952 STDMETHODIMP VLCControl2::get_log(IVLCLog** obj)
2958 if( NULL != _p_vlclog )
2960 _p_vlclog->AddRef();
2963 return E_OUTOFMEMORY;
2966 STDMETHODIMP VLCControl2::get_playlist(IVLCPlaylist** obj)
2971 *obj = _p_vlcplaylist;
2972 if( NULL != _p_vlcplaylist )
2974 _p_vlcplaylist->AddRef();
2977 return E_OUTOFMEMORY;
2980 STDMETHODIMP VLCControl2::get_subtitle(IVLCSubtitle** obj)
2985 *obj = _p_vlcsubtitle;
2986 if( NULL != _p_vlcsubtitle )
2988 _p_vlcsubtitle->AddRef();
2991 return E_OUTOFMEMORY;
2994 STDMETHODIMP VLCControl2::get_video(IVLCVideo** obj)
3000 if( NULL != _p_vlcvideo )
3002 _p_vlcvideo->AddRef();
3005 return E_OUTOFMEMORY;