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
20 * along with this program; if not, write to the Free Software
21 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
22 *****************************************************************************/
25 #include "vlccontrol2.h"
26 #include "vlccontrol.h"
39 _p_typeinfo->Release();
42 HRESULT VLCAudio::loadTypeInfo(void)
45 if( NULL == _p_typeinfo )
49 hr = _p_instance->getTypeLib(LOCALE_USER_DEFAULT, &p_typelib);
52 hr = p_typelib->GetTypeInfoOfGuid(IID_IVLCAudio, &_p_typeinfo);
63 STDMETHODIMP VLCAudio::GetTypeInfoCount(UINT* pctInfo)
68 if( SUCCEEDED(loadTypeInfo()) )
76 STDMETHODIMP VLCAudio::GetTypeInfo(UINT iTInfo, LCID lcid, LPTYPEINFO* ppTInfo)
81 if( SUCCEEDED(loadTypeInfo()) )
83 _p_typeinfo->AddRef();
84 *ppTInfo = _p_typeinfo;
91 STDMETHODIMP VLCAudio::GetIDsOfNames(REFIID riid, LPOLESTR* rgszNames,
92 UINT cNames, LCID lcid, DISPID* rgDispID)
94 if( SUCCEEDED(loadTypeInfo()) )
96 return DispGetIDsOfNames(_p_typeinfo, rgszNames, cNames, rgDispID);
101 STDMETHODIMP VLCAudio::Invoke(DISPID dispIdMember, REFIID riid,
102 LCID lcid, WORD wFlags, DISPPARAMS* pDispParams,
103 VARIANT* pVarResult, EXCEPINFO* pExcepInfo, UINT* puArgErr)
105 if( SUCCEEDED(loadTypeInfo()) )
107 return DispInvoke(this, _p_typeinfo, dispIdMember, wFlags, pDispParams,
108 pVarResult, pExcepInfo, puArgErr);
113 STDMETHODIMP VLCAudio::get_mute(VARIANT_BOOL* mute)
118 libvlc_instance_t* p_libvlc;
119 HRESULT hr = _p_instance->getVLC(&p_libvlc);
122 libvlc_exception_t ex;
123 libvlc_exception_init(&ex);
125 *mute = libvlc_audio_get_mute(p_libvlc, &ex) ? VARIANT_TRUE : VARIANT_FALSE;
126 if( libvlc_exception_raised(&ex) )
128 _p_instance->setErrorInfo(IID_IVLCAudio, libvlc_exception_get_message(&ex));
129 libvlc_exception_clear(&ex);
137 STDMETHODIMP VLCAudio::put_mute(VARIANT_BOOL mute)
139 libvlc_instance_t* p_libvlc;
140 HRESULT hr = _p_instance->getVLC(&p_libvlc);
143 libvlc_exception_t ex;
144 libvlc_exception_init(&ex);
146 libvlc_audio_set_mute(p_libvlc, VARIANT_FALSE != mute, &ex);
147 if( libvlc_exception_raised(&ex) )
149 _p_instance->setErrorInfo(IID_IVLCAudio, libvlc_exception_get_message(&ex));
150 libvlc_exception_clear(&ex);
158 STDMETHODIMP VLCAudio::get_volume(long* volume)
163 libvlc_instance_t* p_libvlc;
164 HRESULT hr = _p_instance->getVLC(&p_libvlc);
167 libvlc_exception_t ex;
168 libvlc_exception_init(&ex);
170 *volume = libvlc_audio_get_volume(p_libvlc, &ex);
171 if( libvlc_exception_raised(&ex) )
173 _p_instance->setErrorInfo(IID_IVLCAudio, libvlc_exception_get_message(&ex));
174 libvlc_exception_clear(&ex);
182 STDMETHODIMP VLCAudio::put_volume(long volume)
184 libvlc_instance_t* p_libvlc;
185 HRESULT hr = _p_instance->getVLC(&p_libvlc);
188 libvlc_exception_t ex;
189 libvlc_exception_init(&ex);
191 libvlc_audio_set_volume(p_libvlc, volume, &ex);
192 if( libvlc_exception_raised(&ex) )
194 _p_instance->setErrorInfo(IID_IVLCAudio,
195 libvlc_exception_get_message(&ex));
196 libvlc_exception_clear(&ex);
204 STDMETHODIMP VLCAudio::get_track(long* track)
209 libvlc_instance_t* p_libvlc;
210 HRESULT hr = _p_instance->getVLC(&p_libvlc);
213 libvlc_exception_t ex;
214 libvlc_exception_init(&ex);
216 libvlc_media_player_t *p_md = libvlc_playlist_get_media_player(p_libvlc, &ex);
217 *track = libvlc_audio_get_track(p_md, &ex);
218 libvlc_media_player_release(p_md);
219 if( libvlc_exception_raised(&ex) )
221 _p_instance->setErrorInfo(IID_IVLCAudio,
222 libvlc_exception_get_message(&ex));
223 libvlc_exception_clear(&ex);
231 STDMETHODIMP VLCAudio::put_track(long track)
233 libvlc_instance_t* p_libvlc;
234 HRESULT hr = _p_instance->getVLC(&p_libvlc);
237 libvlc_exception_t ex;
238 libvlc_exception_init(&ex);
240 libvlc_media_player_t *p_md = libvlc_playlist_get_media_player(p_libvlc, &ex);
241 libvlc_audio_set_track(p_md, track, &ex);
242 libvlc_media_player_release(p_md);
243 if( libvlc_exception_raised(&ex) )
245 _p_instance->setErrorInfo(IID_IVLCAudio,
246 libvlc_exception_get_message(&ex));
247 libvlc_exception_clear(&ex);
255 STDMETHODIMP VLCAudio::get_channel(long *channel)
257 if( NULL == channel )
260 libvlc_instance_t* p_libvlc;
261 HRESULT hr = _p_instance->getVLC(&p_libvlc);
264 libvlc_exception_t ex;
265 libvlc_exception_init(&ex);
267 *channel = libvlc_audio_get_channel(p_libvlc, &ex);
268 if( libvlc_exception_raised(&ex) )
270 _p_instance->setErrorInfo(IID_IVLCAudio,
271 libvlc_exception_get_message(&ex));
272 libvlc_exception_clear(&ex);
280 STDMETHODIMP VLCAudio::put_channel(long channel)
282 libvlc_instance_t* p_libvlc;
283 HRESULT hr = _p_instance->getVLC(&p_libvlc);
286 libvlc_exception_t ex;
287 libvlc_exception_init(&ex);
289 libvlc_audio_set_channel(p_libvlc, channel, &ex);
290 if( libvlc_exception_raised(&ex) )
292 _p_instance->setErrorInfo(IID_IVLCAudio,
293 libvlc_exception_get_message(&ex));
294 libvlc_exception_clear(&ex);
302 STDMETHODIMP VLCAudio::toggleMute()
304 libvlc_instance_t* p_libvlc;
305 HRESULT hr = _p_instance->getVLC(&p_libvlc);
308 libvlc_exception_t ex;
309 libvlc_exception_init(&ex);
311 libvlc_audio_toggle_mute(p_libvlc, &ex);
312 if( libvlc_exception_raised(&ex) )
314 _p_instance->setErrorInfo(IID_IVLCAudio,
315 libvlc_exception_get_message(&ex));
316 libvlc_exception_clear(&ex);
324 /*******************************************************************************/
326 VLCInput::~VLCInput()
329 _p_typeinfo->Release();
332 HRESULT VLCInput::loadTypeInfo(void)
334 HRESULT hr = NOERROR;
335 if( NULL == _p_typeinfo )
339 hr = _p_instance->getTypeLib(LOCALE_USER_DEFAULT, &p_typelib);
342 hr = p_typelib->GetTypeInfoOfGuid(IID_IVLCInput, &_p_typeinfo);
347 p_typelib->Release();
353 STDMETHODIMP VLCInput::GetTypeInfoCount(UINT* pctInfo)
355 if( NULL == pctInfo )
358 if( SUCCEEDED(loadTypeInfo()) )
366 STDMETHODIMP VLCInput::GetTypeInfo(UINT iTInfo, LCID lcid, LPTYPEINFO* ppTInfo)
368 if( NULL == ppTInfo )
371 if( SUCCEEDED(loadTypeInfo()) )
373 _p_typeinfo->AddRef();
374 *ppTInfo = _p_typeinfo;
381 STDMETHODIMP VLCInput::GetIDsOfNames(REFIID riid, LPOLESTR* rgszNames,
382 UINT cNames, LCID lcid, DISPID* rgDispID)
384 if( SUCCEEDED(loadTypeInfo()) )
386 return DispGetIDsOfNames(_p_typeinfo, rgszNames, cNames, rgDispID);
391 STDMETHODIMP VLCInput::Invoke(DISPID dispIdMember, REFIID riid,
392 LCID lcid, WORD wFlags, DISPPARAMS* pDispParams,
393 VARIANT* pVarResult, EXCEPINFO* pExcepInfo, UINT* puArgErr)
395 if( SUCCEEDED(loadTypeInfo()) )
397 return DispInvoke(this, _p_typeinfo, dispIdMember, wFlags, pDispParams,
398 pVarResult, pExcepInfo, puArgErr);
403 STDMETHODIMP VLCInput::get_length(double* length)
409 libvlc_instance_t* p_libvlc;
410 HRESULT hr = _p_instance->getVLC(&p_libvlc);
413 libvlc_exception_t ex;
414 libvlc_exception_init(&ex);
416 libvlc_media_player_t *p_md = libvlc_playlist_get_media_player(p_libvlc, &ex);
417 if( ! libvlc_exception_raised(&ex) )
419 *length = (double)libvlc_media_player_get_length(p_md, &ex);
420 libvlc_media_player_release(p_md);
421 if( ! libvlc_exception_raised(&ex) )
426 _p_instance->setErrorInfo(IID_IVLCInput, libvlc_exception_get_message(&ex));
427 libvlc_exception_clear(&ex);
433 STDMETHODIMP VLCInput::get_position(double* position)
435 if( NULL == position )
439 libvlc_instance_t* p_libvlc;
440 HRESULT hr = _p_instance->getVLC(&p_libvlc);
443 libvlc_exception_t ex;
444 libvlc_exception_init(&ex);
446 libvlc_media_player_t *p_md = libvlc_playlist_get_media_player(p_libvlc, &ex);
447 if( ! libvlc_exception_raised(&ex) )
449 *position = libvlc_media_player_get_position(p_md, &ex);
450 libvlc_media_player_release(p_md);
451 if( ! libvlc_exception_raised(&ex) )
456 _p_instance->setErrorInfo(IID_IVLCInput, libvlc_exception_get_message(&ex));
457 libvlc_exception_clear(&ex);
463 STDMETHODIMP VLCInput::put_position(double position)
465 libvlc_instance_t* p_libvlc;
466 HRESULT hr = _p_instance->getVLC(&p_libvlc);
469 libvlc_exception_t ex;
470 libvlc_exception_init(&ex);
472 libvlc_media_player_t *p_md = libvlc_playlist_get_media_player(p_libvlc, &ex);
473 if( ! libvlc_exception_raised(&ex) )
475 libvlc_media_player_set_position(p_md, position, &ex);
476 libvlc_media_player_release(p_md);
477 if( ! libvlc_exception_raised(&ex) )
482 _p_instance->setErrorInfo(IID_IVLCInput, libvlc_exception_get_message(&ex));
483 libvlc_exception_clear(&ex);
489 STDMETHODIMP VLCInput::get_time(double* time)
494 libvlc_instance_t* p_libvlc;
495 HRESULT hr = _p_instance->getVLC(&p_libvlc);
498 libvlc_exception_t ex;
499 libvlc_exception_init(&ex);
501 libvlc_media_player_t *p_md = libvlc_playlist_get_media_player(p_libvlc, &ex);
502 if( ! libvlc_exception_raised(&ex) )
504 *time = (double)libvlc_media_player_get_time(p_md, &ex);
505 libvlc_media_player_release(p_md);
506 if( ! libvlc_exception_raised(&ex) )
511 _p_instance->setErrorInfo(IID_IVLCInput, libvlc_exception_get_message(&ex));
512 libvlc_exception_clear(&ex);
518 STDMETHODIMP VLCInput::put_time(double time)
520 libvlc_instance_t* p_libvlc;
521 HRESULT hr = _p_instance->getVLC(&p_libvlc);
524 libvlc_exception_t ex;
525 libvlc_exception_init(&ex);
527 libvlc_media_player_t *p_md = libvlc_playlist_get_media_player(p_libvlc, &ex);
528 if( ! libvlc_exception_raised(&ex) )
530 libvlc_media_player_set_time(p_md, (vlc_int64_t)time, &ex);
531 libvlc_media_player_release(p_md);
532 if( ! libvlc_exception_raised(&ex) )
537 _p_instance->setErrorInfo(IID_IVLCInput, libvlc_exception_get_message(&ex));
538 libvlc_exception_clear(&ex);
544 STDMETHODIMP VLCInput::get_state(long* state)
549 libvlc_instance_t* p_libvlc;
550 HRESULT hr = _p_instance->getVLC(&p_libvlc);
553 libvlc_exception_t ex;
554 libvlc_exception_init(&ex);
556 libvlc_media_player_t *p_md = libvlc_playlist_get_media_player(p_libvlc, &ex);
557 if( ! libvlc_exception_raised(&ex) )
559 *state = libvlc_media_player_get_state(p_md, &ex);
560 libvlc_media_player_release(p_md);
561 if( ! libvlc_exception_raised(&ex) )
566 libvlc_exception_clear(&ex);
567 // don't fail, just return the idle state
574 STDMETHODIMP VLCInput::get_rate(double* rate)
579 libvlc_instance_t* p_libvlc;
580 HRESULT hr = _p_instance->getVLC(&p_libvlc);
583 libvlc_exception_t ex;
584 libvlc_exception_init(&ex);
586 libvlc_media_player_t *p_md = libvlc_playlist_get_media_player(p_libvlc, &ex);
587 if( ! libvlc_exception_raised(&ex) )
589 *rate = libvlc_media_player_get_rate(p_md, &ex);
590 libvlc_media_player_release(p_md);
591 if( ! libvlc_exception_raised(&ex) )
596 _p_instance->setErrorInfo(IID_IVLCInput, libvlc_exception_get_message(&ex));
597 libvlc_exception_clear(&ex);
603 STDMETHODIMP VLCInput::put_rate(double rate)
605 libvlc_instance_t* p_libvlc;
606 HRESULT hr = _p_instance->getVLC(&p_libvlc);
609 libvlc_exception_t ex;
610 libvlc_exception_init(&ex);
612 libvlc_media_player_t *p_md = libvlc_playlist_get_media_player(p_libvlc, &ex);
613 if( ! libvlc_exception_raised(&ex) )
615 libvlc_media_player_set_rate(p_md, rate, &ex);
616 libvlc_media_player_release(p_md);
617 if( ! libvlc_exception_raised(&ex) )
622 _p_instance->setErrorInfo(IID_IVLCInput, libvlc_exception_get_message(&ex));
623 libvlc_exception_clear(&ex);
629 STDMETHODIMP VLCInput::get_fps(double* fps)
635 libvlc_instance_t* p_libvlc;
636 HRESULT hr = _p_instance->getVLC(&p_libvlc);
639 libvlc_exception_t ex;
640 libvlc_exception_init(&ex);
642 libvlc_media_player_t *p_md = libvlc_playlist_get_media_player(p_libvlc, &ex);
643 if( ! libvlc_exception_raised(&ex) )
645 *fps = libvlc_media_player_get_fps(p_md, &ex);
646 libvlc_media_player_release(p_md);
647 if( ! libvlc_exception_raised(&ex) )
652 _p_instance->setErrorInfo(IID_IVLCInput, libvlc_exception_get_message(&ex));
653 libvlc_exception_clear(&ex);
659 STDMETHODIMP VLCInput::get_hasVout(VARIANT_BOOL* hasVout)
661 if( NULL == hasVout )
664 libvlc_instance_t* p_libvlc;
665 HRESULT hr = _p_instance->getVLC(&p_libvlc);
668 libvlc_exception_t ex;
669 libvlc_exception_init(&ex);
671 libvlc_media_player_t *p_md = libvlc_playlist_get_media_player(p_libvlc, &ex);
672 if( ! libvlc_exception_raised(&ex) )
674 *hasVout = libvlc_media_player_has_vout(p_md, &ex) ? VARIANT_TRUE : VARIANT_FALSE;
675 libvlc_media_player_release(p_md);
676 if( ! libvlc_exception_raised(&ex) )
681 _p_instance->setErrorInfo(IID_IVLCInput, libvlc_exception_get_message(&ex));
682 libvlc_exception_clear(&ex);
688 /*******************************************************************************/
692 delete _p_vlcmessages;
694 libvlc_log_close(_p_log, NULL);
697 _p_typeinfo->Release();
700 HRESULT VLCLog::loadTypeInfo(void)
702 HRESULT hr = NOERROR;
703 if( NULL == _p_typeinfo )
707 hr = _p_instance->getTypeLib(LOCALE_USER_DEFAULT, &p_typelib);
710 hr = p_typelib->GetTypeInfoOfGuid(IID_IVLCLog, &_p_typeinfo);
715 p_typelib->Release();
721 STDMETHODIMP VLCLog::GetTypeInfoCount(UINT* pctInfo)
723 if( NULL == pctInfo )
726 if( SUCCEEDED(loadTypeInfo()) )
734 STDMETHODIMP VLCLog::GetTypeInfo(UINT iTInfo, LCID lcid, LPTYPEINFO* ppTInfo)
736 if( NULL == ppTInfo )
739 if( SUCCEEDED(loadTypeInfo()) )
741 _p_typeinfo->AddRef();
742 *ppTInfo = _p_typeinfo;
749 STDMETHODIMP VLCLog::GetIDsOfNames(REFIID riid, LPOLESTR* rgszNames,
750 UINT cNames, LCID lcid, DISPID* rgDispID)
752 if( SUCCEEDED(loadTypeInfo()) )
754 return DispGetIDsOfNames(_p_typeinfo, rgszNames, cNames, rgDispID);
759 STDMETHODIMP VLCLog::Invoke(DISPID dispIdMember, REFIID riid,
760 LCID lcid, WORD wFlags, DISPPARAMS* pDispParams,
761 VARIANT* pVarResult, EXCEPINFO* pExcepInfo, UINT* puArgErr)
763 if( SUCCEEDED(loadTypeInfo()) )
765 return DispInvoke(this, _p_typeinfo, dispIdMember, wFlags, pDispParams,
766 pVarResult, pExcepInfo, puArgErr);
771 STDMETHODIMP VLCLog::get_messages(IVLCMessages** obj)
776 *obj = _p_vlcmessages;
777 if( NULL != _p_vlcmessages )
779 _p_vlcmessages->AddRef();
782 return E_OUTOFMEMORY;
785 STDMETHODIMP VLCLog::get_verbosity(long* level)
792 libvlc_instance_t* p_libvlc;
793 HRESULT hr = _p_instance->getVLC(&p_libvlc);
796 libvlc_exception_t ex;
797 libvlc_exception_init(&ex);
799 *level = libvlc_get_log_verbosity(p_libvlc, &ex);
800 if( libvlc_exception_raised(&ex) )
802 _p_instance->setErrorInfo(IID_IVLCLog, libvlc_exception_get_message(&ex));
803 libvlc_exception_clear(&ex);
811 /* log is not enabled, return -1 */
817 STDMETHODIMP VLCLog::put_verbosity(long verbosity)
819 libvlc_exception_t ex;
820 libvlc_exception_init(&ex);
822 libvlc_instance_t* p_libvlc;
823 HRESULT hr = _p_instance->getVLC(&p_libvlc);
830 _p_log = libvlc_log_open(p_libvlc, &ex);
831 if( libvlc_exception_raised(&ex) )
833 _p_instance->setErrorInfo(IID_IVLCLog, libvlc_exception_get_message(&ex));
834 libvlc_exception_clear(&ex);
838 libvlc_set_log_verbosity(p_libvlc, (unsigned)verbosity, &ex);
839 if( libvlc_exception_raised(&ex) )
841 _p_instance->setErrorInfo(IID_IVLCLog, libvlc_exception_get_message(&ex));
842 libvlc_exception_clear(&ex);
848 /* close log when verbosity is set to -1 */
849 libvlc_log_close(_p_log, &ex);
851 if( libvlc_exception_raised(&ex) )
853 _p_instance->setErrorInfo(IID_IVLCLog, libvlc_exception_get_message(&ex));
854 libvlc_exception_clear(&ex);
862 /*******************************************************************************/
864 /* STL forward iterator used by VLCEnumIterator class to implement IEnumVARIANT */
866 class VLCMessageSTLIterator
871 VLCMessageSTLIterator(IVLCMessageIterator* iter) : iter(iter), msg(NULL)
877 VLCMessageSTLIterator(const VLCMessageSTLIterator& other)
887 virtual ~VLCMessageSTLIterator()
896 // we only need prefix ++ operator
897 VLCMessageSTLIterator& operator++()
899 VARIANT_BOOL hasNext = VARIANT_FALSE;
902 iter->get_hasNext(&hasNext);
909 if( VARIANT_TRUE == hasNext ) {
916 VARIANT operator*() const
922 if( SUCCEEDED(msg->QueryInterface(IID_IDispatch, (LPVOID*)&V_DISPATCH(&v))) )
924 V_VT(&v) = VT_DISPATCH;
930 bool operator==(const VLCMessageSTLIterator& other) const
932 return msg == other.msg;
935 bool operator!=(const VLCMessageSTLIterator& other) const
937 return msg != other.msg;
941 IVLCMessageIterator* iter;
945 ////////////////////////////////////////////////////////////////////////////////////////////////////////////
947 VLCMessages::~VLCMessages()
950 _p_typeinfo->Release();
953 HRESULT VLCMessages::loadTypeInfo(void)
955 HRESULT hr = NOERROR;
956 if( NULL == _p_typeinfo )
960 hr = _p_instance->getTypeLib(LOCALE_USER_DEFAULT, &p_typelib);
963 hr = p_typelib->GetTypeInfoOfGuid(IID_IVLCMessages, &_p_typeinfo);
968 p_typelib->Release();
974 STDMETHODIMP VLCMessages::GetTypeInfoCount(UINT* pctInfo)
976 if( NULL == pctInfo )
979 if( SUCCEEDED(loadTypeInfo()) )
987 STDMETHODIMP VLCMessages::GetTypeInfo(UINT iTInfo, LCID lcid, LPTYPEINFO* ppTInfo)
989 if( NULL == ppTInfo )
992 if( SUCCEEDED(loadTypeInfo()) )
994 _p_typeinfo->AddRef();
995 *ppTInfo = _p_typeinfo;
1002 STDMETHODIMP VLCMessages::GetIDsOfNames(REFIID riid, LPOLESTR* rgszNames,
1003 UINT cNames, LCID lcid, DISPID* rgDispID)
1005 if( SUCCEEDED(loadTypeInfo()) )
1007 return DispGetIDsOfNames(_p_typeinfo, rgszNames, cNames, rgDispID);
1012 STDMETHODIMP VLCMessages::Invoke(DISPID dispIdMember, REFIID riid,
1013 LCID lcid, WORD wFlags, DISPPARAMS* pDispParams,
1014 VARIANT* pVarResult, EXCEPINFO* pExcepInfo, UINT* puArgErr)
1016 if( SUCCEEDED(loadTypeInfo()) )
1018 return DispInvoke(this, _p_typeinfo, dispIdMember, wFlags, pDispParams,
1019 pVarResult, pExcepInfo, puArgErr);
1024 STDMETHODIMP VLCMessages::get__NewEnum(LPUNKNOWN* _NewEnum)
1026 if( NULL == _NewEnum )
1029 IVLCMessageIterator* iter = NULL;
1032 *_NewEnum= new VLCEnumIterator<IID_IEnumVARIANT,
1035 VLCMessageSTLIterator>
1036 (VLCMessageSTLIterator(iter), VLCMessageSTLIterator(NULL));
1038 return *_NewEnum ? S_OK : E_OUTOFMEMORY;
1041 STDMETHODIMP VLCMessages::clear()
1043 libvlc_log_t *p_log = _p_vlclog->_p_log;
1046 libvlc_exception_t ex;
1047 libvlc_exception_init(&ex);
1049 libvlc_log_clear(p_log, &ex);
1050 if( libvlc_exception_raised(&ex) )
1052 _p_instance->setErrorInfo(IID_IVLCMessages, libvlc_exception_get_message(&ex));
1053 libvlc_exception_clear(&ex);
1060 STDMETHODIMP VLCMessages::get_count(long* count)
1065 libvlc_log_t *p_log = _p_vlclog->_p_log;
1068 libvlc_exception_t ex;
1069 libvlc_exception_init(&ex);
1071 *count = libvlc_log_count(p_log, &ex);
1072 if( libvlc_exception_raised(&ex) )
1074 _p_instance->setErrorInfo(IID_IVLCMessages, libvlc_exception_get_message(&ex));
1075 libvlc_exception_clear(&ex);
1084 STDMETHODIMP VLCMessages::iterator(IVLCMessageIterator** iter)
1089 *iter = new VLCMessageIterator(_p_instance, _p_vlclog);
1091 return *iter ? S_OK : E_OUTOFMEMORY;
1094 /*******************************************************************************/
1096 VLCMessageIterator::VLCMessageIterator(VLCPlugin *p_instance, VLCLog* p_vlclog ) :
1097 _p_instance(p_instance),
1102 if( p_vlclog->_p_log )
1104 _p_iter = libvlc_log_get_iterator(p_vlclog->_p_log, NULL);
1110 VLCMessageIterator::~VLCMessageIterator()
1113 libvlc_log_iterator_free(_p_iter, NULL);
1116 _p_typeinfo->Release();
1119 HRESULT VLCMessageIterator::loadTypeInfo(void)
1121 HRESULT hr = NOERROR;
1122 if( NULL == _p_typeinfo )
1124 ITypeLib *p_typelib;
1126 hr = _p_instance->getTypeLib(LOCALE_USER_DEFAULT, &p_typelib);
1129 hr = p_typelib->GetTypeInfoOfGuid(IID_IVLCMessageIterator, &_p_typeinfo);
1134 p_typelib->Release();
1140 STDMETHODIMP VLCMessageIterator::GetTypeInfoCount(UINT* pctInfo)
1142 if( NULL == pctInfo )
1143 return E_INVALIDARG;
1145 if( SUCCEEDED(loadTypeInfo()) )
1153 STDMETHODIMP VLCMessageIterator::GetTypeInfo(UINT iTInfo, LCID lcid, LPTYPEINFO* ppTInfo)
1155 if( NULL == ppTInfo )
1156 return E_INVALIDARG;
1158 if( SUCCEEDED(loadTypeInfo()) )
1160 _p_typeinfo->AddRef();
1161 *ppTInfo = _p_typeinfo;
1168 STDMETHODIMP VLCMessageIterator::GetIDsOfNames(REFIID riid, LPOLESTR* rgszNames,
1169 UINT cNames, LCID lcid, DISPID* rgDispID)
1171 if( SUCCEEDED(loadTypeInfo()) )
1173 return DispGetIDsOfNames(_p_typeinfo, rgszNames, cNames, rgDispID);
1178 STDMETHODIMP VLCMessageIterator::Invoke(DISPID dispIdMember, REFIID riid,
1179 LCID lcid, WORD wFlags, DISPPARAMS* pDispParams,
1180 VARIANT* pVarResult, EXCEPINFO* pExcepInfo, UINT* puArgErr)
1182 if( SUCCEEDED(loadTypeInfo()) )
1184 return DispInvoke(this, _p_typeinfo, dispIdMember, wFlags, pDispParams,
1185 pVarResult, pExcepInfo, puArgErr);
1190 STDMETHODIMP VLCMessageIterator::get_hasNext(VARIANT_BOOL* hasNext)
1192 if( NULL == hasNext )
1195 if( _p_iter && _p_vlclog->_p_log )
1197 libvlc_exception_t ex;
1198 libvlc_exception_init(&ex);
1200 *hasNext = libvlc_log_iterator_has_next(_p_iter, &ex) ? VARIANT_TRUE : VARIANT_FALSE;
1201 if( libvlc_exception_raised(&ex) )
1203 _p_instance->setErrorInfo(IID_IVLCMessageIterator, libvlc_exception_get_message(&ex));
1204 libvlc_exception_clear(&ex);
1210 *hasNext = VARIANT_FALSE;
1215 STDMETHODIMP VLCMessageIterator::next(IVLCMessage** message)
1217 if( NULL == message )
1220 if( _p_iter && _p_vlclog->_p_log )
1222 struct libvlc_log_message_t buffer;
1224 buffer.sizeof_msg = sizeof(buffer);
1226 libvlc_exception_t ex;
1227 libvlc_exception_init(&ex);
1229 libvlc_log_iterator_next(_p_iter, &buffer, &ex);
1230 if( libvlc_exception_raised(&ex) )
1232 _p_instance->setErrorInfo(IID_IVLCMessageIterator, libvlc_exception_get_message(&ex));
1233 libvlc_exception_clear(&ex);
1236 *message = new VLCMessage(_p_instance, buffer);
1237 return *message ? NOERROR : E_OUTOFMEMORY;
1242 /*******************************************************************************/
1244 VLCMessage::~VLCMessage()
1247 _p_typeinfo->Release();
1250 HRESULT VLCMessage::loadTypeInfo(void)
1252 HRESULT hr = NOERROR;
1253 if( NULL == _p_typeinfo )
1255 ITypeLib *p_typelib;
1257 hr = _p_instance->getTypeLib(LOCALE_USER_DEFAULT, &p_typelib);
1260 hr = p_typelib->GetTypeInfoOfGuid(IID_IVLCMessage, &_p_typeinfo);
1265 p_typelib->Release();
1271 STDMETHODIMP VLCMessage::GetTypeInfoCount(UINT* pctInfo)
1273 if( NULL == pctInfo )
1274 return E_INVALIDARG;
1276 if( SUCCEEDED(loadTypeInfo()) )
1284 STDMETHODIMP VLCMessage::GetTypeInfo(UINT iTInfo, LCID lcid, LPTYPEINFO* ppTInfo)
1286 if( NULL == ppTInfo )
1287 return E_INVALIDARG;
1289 if( SUCCEEDED(loadTypeInfo()) )
1291 _p_typeinfo->AddRef();
1292 *ppTInfo = _p_typeinfo;
1299 STDMETHODIMP VLCMessage::GetIDsOfNames(REFIID riid, LPOLESTR* rgszNames,
1300 UINT cNames, LCID lcid, DISPID* rgDispID)
1302 if( SUCCEEDED(loadTypeInfo()) )
1304 return DispGetIDsOfNames(_p_typeinfo, rgszNames, cNames, rgDispID);
1309 STDMETHODIMP VLCMessage::Invoke(DISPID dispIdMember, REFIID riid,
1310 LCID lcid, WORD wFlags, DISPPARAMS* pDispParams,
1311 VARIANT* pVarResult, EXCEPINFO* pExcepInfo, UINT* puArgErr)
1313 if( SUCCEEDED(loadTypeInfo()) )
1315 return DispInvoke(this, _p_typeinfo, dispIdMember, wFlags, pDispParams,
1316 pVarResult, pExcepInfo, puArgErr);
1321 inline const char *msgSeverity(int sev)
1336 STDMETHODIMP VLCMessage::get__Value(VARIANT* _Value)
1338 if( NULL == _Value )
1343 snprintf(buffer, sizeof(buffer), "%s %s %s: %s",
1344 _msg.psz_type, _msg.psz_name, msgSeverity(_msg.i_severity), _msg.psz_message);
1346 V_VT(_Value) = VT_BSTR;
1347 V_BSTR(_Value) = BSTRFromCStr(CP_UTF8, buffer);
1352 STDMETHODIMP VLCMessage::get_severity(long* level)
1357 *level = _msg.i_severity;
1362 STDMETHODIMP VLCMessage::get_type(BSTR* type)
1367 *type = BSTRFromCStr(CP_UTF8, _msg.psz_type);
1372 STDMETHODIMP VLCMessage::get_name(BSTR* name)
1377 *name = BSTRFromCStr(CP_UTF8, _msg.psz_name);
1382 STDMETHODIMP VLCMessage::get_header(BSTR* header)
1384 if( NULL == header )
1387 *header = BSTRFromCStr(CP_UTF8, _msg.psz_header);
1392 STDMETHODIMP VLCMessage::get_message(BSTR* message)
1394 if( NULL == message )
1397 *message = BSTRFromCStr(CP_UTF8, _msg.psz_message);
1402 /*******************************************************************************/
1404 VLCPlaylistItems::~VLCPlaylistItems()
1407 _p_typeinfo->Release();
1410 HRESULT VLCPlaylistItems::loadTypeInfo(void)
1412 HRESULT hr = NOERROR;
1413 if( NULL == _p_typeinfo )
1415 ITypeLib *p_typelib;
1417 hr = _p_instance->getTypeLib(LOCALE_USER_DEFAULT, &p_typelib);
1420 hr = p_typelib->GetTypeInfoOfGuid(IID_IVLCPlaylistItems, &_p_typeinfo);
1425 p_typelib->Release();
1431 STDMETHODIMP VLCPlaylistItems::GetTypeInfoCount(UINT* pctInfo)
1433 if( NULL == pctInfo )
1434 return E_INVALIDARG;
1436 if( SUCCEEDED(loadTypeInfo()) )
1444 STDMETHODIMP VLCPlaylistItems::GetTypeInfo(UINT iTInfo, LCID lcid, LPTYPEINFO* ppTInfo)
1446 if( NULL == ppTInfo )
1447 return E_INVALIDARG;
1449 if( SUCCEEDED(loadTypeInfo()) )
1451 _p_typeinfo->AddRef();
1452 *ppTInfo = _p_typeinfo;
1459 STDMETHODIMP VLCPlaylistItems::GetIDsOfNames(REFIID riid, LPOLESTR* rgszNames,
1460 UINT cNames, LCID lcid, DISPID* rgDispID)
1462 if( SUCCEEDED(loadTypeInfo()) )
1464 return DispGetIDsOfNames(_p_typeinfo, rgszNames, cNames, rgDispID);
1469 STDMETHODIMP VLCPlaylistItems::Invoke(DISPID dispIdMember, REFIID riid,
1470 LCID lcid, WORD wFlags, DISPPARAMS* pDispParams,
1471 VARIANT* pVarResult, EXCEPINFO* pExcepInfo, UINT* puArgErr)
1473 if( SUCCEEDED(loadTypeInfo()) )
1475 return DispInvoke(this, _p_typeinfo, dispIdMember, wFlags, pDispParams,
1476 pVarResult, pExcepInfo, puArgErr);
1481 STDMETHODIMP VLCPlaylistItems::get_count(long* count)
1486 libvlc_instance_t* p_libvlc;
1487 HRESULT hr = _p_instance->getVLC(&p_libvlc);
1490 libvlc_exception_t ex;
1491 libvlc_exception_init(&ex);
1493 *count = libvlc_playlist_items_count(p_libvlc, &ex);
1494 if( libvlc_exception_raised(&ex) )
1496 _p_instance->setErrorInfo(IID_IVLCPlaylistItems,
1497 libvlc_exception_get_message(&ex));
1498 libvlc_exception_clear(&ex);
1506 STDMETHODIMP VLCPlaylistItems::clear()
1508 libvlc_instance_t* p_libvlc;
1509 HRESULT hr = _p_instance->getVLC(&p_libvlc);
1512 libvlc_exception_t ex;
1513 libvlc_exception_init(&ex);
1515 libvlc_playlist_clear(p_libvlc, &ex);
1516 if( libvlc_exception_raised(&ex) )
1518 _p_instance->setErrorInfo(IID_IVLCPlaylistItems,
1519 libvlc_exception_get_message(&ex));
1520 libvlc_exception_clear(&ex);
1528 STDMETHODIMP VLCPlaylistItems::remove(long item)
1530 libvlc_instance_t* p_libvlc;
1531 HRESULT hr = _p_instance->getVLC(&p_libvlc);
1534 libvlc_exception_t ex;
1535 libvlc_exception_init(&ex);
1537 libvlc_playlist_delete_item(p_libvlc, item, &ex);
1538 if( libvlc_exception_raised(&ex) )
1540 _p_instance->setErrorInfo(IID_IVLCPlaylistItems,
1541 libvlc_exception_get_message(&ex));
1542 libvlc_exception_clear(&ex);
1550 /*******************************************************************************/
1552 VLCPlaylist::~VLCPlaylist()
1554 delete _p_vlcplaylistitems;
1556 _p_typeinfo->Release();
1559 HRESULT VLCPlaylist::loadTypeInfo(void)
1561 HRESULT hr = NOERROR;
1562 if( NULL == _p_typeinfo )
1564 ITypeLib *p_typelib;
1566 hr = _p_instance->getTypeLib(LOCALE_USER_DEFAULT, &p_typelib);
1569 hr = p_typelib->GetTypeInfoOfGuid(IID_IVLCPlaylist, &_p_typeinfo);
1574 p_typelib->Release();
1580 STDMETHODIMP VLCPlaylist::GetTypeInfoCount(UINT* pctInfo)
1582 if( NULL == pctInfo )
1583 return E_INVALIDARG;
1585 if( SUCCEEDED(loadTypeInfo()) )
1593 STDMETHODIMP VLCPlaylist::GetTypeInfo(UINT iTInfo, LCID lcid, LPTYPEINFO* ppTInfo)
1595 if( NULL == ppTInfo )
1596 return E_INVALIDARG;
1598 if( SUCCEEDED(loadTypeInfo()) )
1600 _p_typeinfo->AddRef();
1601 *ppTInfo = _p_typeinfo;
1608 STDMETHODIMP VLCPlaylist::GetIDsOfNames(REFIID riid, LPOLESTR* rgszNames,
1609 UINT cNames, LCID lcid, DISPID* rgDispID)
1611 if( SUCCEEDED(loadTypeInfo()) )
1613 return DispGetIDsOfNames(_p_typeinfo, rgszNames, cNames, rgDispID);
1618 STDMETHODIMP VLCPlaylist::Invoke(DISPID dispIdMember, REFIID riid,
1619 LCID lcid, WORD wFlags, DISPPARAMS* pDispParams,
1620 VARIANT* pVarResult, EXCEPINFO* pExcepInfo, UINT* puArgErr)
1622 if( SUCCEEDED(loadTypeInfo()) )
1624 return DispInvoke(this, _p_typeinfo, dispIdMember, wFlags, pDispParams,
1625 pVarResult, pExcepInfo, puArgErr);
1630 STDMETHODIMP VLCPlaylist::get_itemCount(long* count)
1636 libvlc_instance_t* p_libvlc;
1637 HRESULT hr = _p_instance->getVLC(&p_libvlc);
1640 libvlc_exception_t ex;
1641 libvlc_exception_init(&ex);
1643 *count = libvlc_playlist_items_count(p_libvlc, &ex);
1644 if( libvlc_exception_raised(&ex) )
1646 _p_instance->setErrorInfo(IID_IVLCPlaylist,
1647 libvlc_exception_get_message(&ex));
1648 libvlc_exception_clear(&ex);
1656 STDMETHODIMP VLCPlaylist::get_isPlaying(VARIANT_BOOL* isPlaying)
1658 if( NULL == isPlaying )
1661 libvlc_instance_t* p_libvlc;
1662 HRESULT hr = _p_instance->getVLC(&p_libvlc);
1665 libvlc_exception_t ex;
1666 libvlc_exception_init(&ex);
1668 *isPlaying = libvlc_playlist_isplaying(p_libvlc, &ex) ? VARIANT_TRUE: VARIANT_FALSE;
1669 if( libvlc_exception_raised(&ex) )
1671 _p_instance->setErrorInfo(IID_IVLCPlaylist,
1672 libvlc_exception_get_message(&ex));
1673 libvlc_exception_clear(&ex);
1681 STDMETHODIMP VLCPlaylist::add(BSTR uri, VARIANT name, VARIANT options, long* item)
1686 if( 0 == SysStringLen(uri) )
1687 return E_INVALIDARG;
1689 libvlc_instance_t* p_libvlc;
1690 HRESULT hr = _p_instance->getVLC(&p_libvlc);
1693 libvlc_exception_t ex;
1694 libvlc_exception_init(&ex);
1696 char *psz_uri = NULL;
1697 if( SysStringLen(_p_instance->getBaseURL()) > 0 )
1700 ** if the MRL a relative URL, we should end up with an absolute URL
1702 LPWSTR abs_url = CombineURL(_p_instance->getBaseURL(), uri);
1703 if( NULL != abs_url )
1705 psz_uri = CStrFromWSTR(CP_UTF8, abs_url, wcslen(abs_url));
1706 CoTaskMemFree(abs_url);
1710 psz_uri = CStrFromBSTR(CP_UTF8, uri);
1716 ** baseURL is empty, assume MRL is absolute
1718 psz_uri = CStrFromBSTR(CP_UTF8, uri);
1721 if( NULL == psz_uri )
1723 return E_OUTOFMEMORY;
1727 char **ppsz_options;
1729 hr = VLCControl::CreateTargetOptions(CP_UTF8, &options, &ppsz_options, &i_options);
1732 CoTaskMemFree(psz_uri);
1736 char *psz_name = NULL;
1738 VariantInit(&v_name);
1739 if( SUCCEEDED(VariantChangeType(&v_name, &name, 0, VT_BSTR)) )
1741 if( SysStringLen(V_BSTR(&v_name)) > 0 )
1742 psz_name = CStrFromBSTR(CP_UTF8, V_BSTR(&v_name));
1744 VariantClear(&v_name);
1747 *item = libvlc_playlist_add_extended(p_libvlc,
1751 const_cast<const char **>(ppsz_options),
1754 VLCControl::FreeTargetOptions(ppsz_options, i_options);
1755 CoTaskMemFree(psz_uri);
1757 CoTaskMemFree(psz_name);
1758 if( libvlc_exception_raised(&ex) )
1760 _p_instance->setErrorInfo(IID_IVLCPlaylist,
1761 libvlc_exception_get_message(&ex));
1762 libvlc_exception_clear(&ex);
1770 STDMETHODIMP VLCPlaylist::play()
1772 libvlc_instance_t* p_libvlc;
1773 HRESULT hr = _p_instance->getVLC(&p_libvlc);
1776 libvlc_exception_t ex;
1777 libvlc_exception_init(&ex);
1779 libvlc_playlist_play(p_libvlc, -1, 0, NULL, &ex);
1780 if( libvlc_exception_raised(&ex) )
1782 libvlc_exception_clear(&ex);
1790 STDMETHODIMP VLCPlaylist::playItem(long item)
1792 libvlc_instance_t* p_libvlc;
1793 HRESULT hr = _p_instance->getVLC(&p_libvlc);
1796 libvlc_exception_t ex;
1797 libvlc_exception_init(&ex);
1799 libvlc_playlist_play(p_libvlc, item, 0, NULL, &ex);
1800 if( libvlc_exception_raised(&ex) )
1802 _p_instance->setErrorInfo(IID_IVLCPlaylist,
1803 libvlc_exception_get_message(&ex));
1804 libvlc_exception_clear(&ex);
1812 STDMETHODIMP VLCPlaylist::togglePause()
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 libvlc_playlist_pause(p_libvlc, &ex);
1822 if( libvlc_exception_raised(&ex) )
1824 _p_instance->setErrorInfo(IID_IVLCPlaylist,
1825 libvlc_exception_get_message(&ex));
1826 libvlc_exception_clear(&ex);
1834 STDMETHODIMP VLCPlaylist::stop()
1836 libvlc_instance_t* p_libvlc;
1837 HRESULT hr = _p_instance->getVLC(&p_libvlc);
1840 libvlc_exception_t ex;
1841 libvlc_exception_init(&ex);
1843 libvlc_playlist_stop(p_libvlc, &ex);
1844 if( libvlc_exception_raised(&ex) )
1846 _p_instance->setErrorInfo(IID_IVLCPlaylist,
1847 libvlc_exception_get_message(&ex));
1848 libvlc_exception_clear(&ex);
1856 STDMETHODIMP VLCPlaylist::next()
1858 libvlc_instance_t* p_libvlc;
1859 HRESULT hr = _p_instance->getVLC(&p_libvlc);
1862 libvlc_exception_t ex;
1863 libvlc_exception_init(&ex);
1865 libvlc_playlist_next(p_libvlc, &ex);
1866 if( libvlc_exception_raised(&ex) )
1868 _p_instance->setErrorInfo(IID_IVLCPlaylist,
1869 libvlc_exception_get_message(&ex));
1870 libvlc_exception_clear(&ex);
1878 STDMETHODIMP VLCPlaylist::prev()
1880 libvlc_instance_t* p_libvlc;
1881 HRESULT hr = _p_instance->getVLC(&p_libvlc);
1884 libvlc_exception_t ex;
1885 libvlc_exception_init(&ex);
1887 libvlc_playlist_prev(p_libvlc, &ex);
1888 if( libvlc_exception_raised(&ex) )
1890 _p_instance->setErrorInfo(IID_IVLCPlaylist,
1891 libvlc_exception_get_message(&ex));
1892 libvlc_exception_clear(&ex);
1900 STDMETHODIMP VLCPlaylist::clear()
1902 libvlc_instance_t* p_libvlc;
1903 HRESULT hr = _p_instance->getVLC(&p_libvlc);
1906 libvlc_exception_t ex;
1907 libvlc_exception_init(&ex);
1909 libvlc_playlist_clear(p_libvlc, &ex);
1910 if( libvlc_exception_raised(&ex) )
1912 _p_instance->setErrorInfo(IID_IVLCPlaylist,
1913 libvlc_exception_get_message(&ex));
1914 libvlc_exception_clear(&ex);
1922 STDMETHODIMP VLCPlaylist::removeItem(long item)
1924 libvlc_instance_t* p_libvlc;
1925 HRESULT hr = _p_instance->getVLC(&p_libvlc);
1928 libvlc_exception_t ex;
1929 libvlc_exception_init(&ex);
1931 libvlc_playlist_delete_item(p_libvlc, item, &ex);
1932 if( libvlc_exception_raised(&ex) )
1934 _p_instance->setErrorInfo(IID_IVLCPlaylist,
1935 libvlc_exception_get_message(&ex));
1936 libvlc_exception_clear(&ex);
1944 STDMETHODIMP VLCPlaylist::get_items(IVLCPlaylistItems** obj)
1949 *obj = _p_vlcplaylistitems;
1950 if( NULL != _p_vlcplaylistitems )
1952 _p_vlcplaylistitems->AddRef();
1955 return E_OUTOFMEMORY;
1958 /*******************************************************************************/
1960 VLCVideo::~VLCVideo()
1963 _p_typeinfo->Release();
1966 HRESULT VLCVideo::loadTypeInfo(void)
1968 HRESULT hr = NOERROR;
1969 if( NULL == _p_typeinfo )
1971 ITypeLib *p_typelib;
1973 hr = _p_instance->getTypeLib(LOCALE_USER_DEFAULT, &p_typelib);
1976 hr = p_typelib->GetTypeInfoOfGuid(IID_IVLCVideo, &_p_typeinfo);
1981 p_typelib->Release();
1987 STDMETHODIMP VLCVideo::GetTypeInfoCount(UINT* pctInfo)
1989 if( NULL == pctInfo )
1990 return E_INVALIDARG;
1992 if( SUCCEEDED(loadTypeInfo()) )
2000 STDMETHODIMP VLCVideo::GetTypeInfo(UINT iTInfo, LCID lcid, LPTYPEINFO* ppTInfo)
2002 if( NULL == ppTInfo )
2003 return E_INVALIDARG;
2005 if( SUCCEEDED(loadTypeInfo()) )
2007 _p_typeinfo->AddRef();
2008 *ppTInfo = _p_typeinfo;
2015 STDMETHODIMP VLCVideo::GetIDsOfNames(REFIID riid, LPOLESTR* rgszNames,
2016 UINT cNames, LCID lcid, DISPID* rgDispID)
2018 if( SUCCEEDED(loadTypeInfo()) )
2020 return DispGetIDsOfNames(_p_typeinfo, rgszNames, cNames, rgDispID);
2025 STDMETHODIMP VLCVideo::Invoke(DISPID dispIdMember, REFIID riid,
2026 LCID lcid, WORD wFlags, DISPPARAMS* pDispParams,
2027 VARIANT* pVarResult, EXCEPINFO* pExcepInfo, UINT* puArgErr)
2029 if( SUCCEEDED(loadTypeInfo()) )
2031 return DispInvoke(this, _p_typeinfo, dispIdMember, wFlags, pDispParams,
2032 pVarResult, pExcepInfo, puArgErr);
2037 STDMETHODIMP VLCVideo::get_fullscreen(VARIANT_BOOL* fullscreen)
2039 if( NULL == fullscreen )
2042 libvlc_instance_t* p_libvlc;
2043 HRESULT hr = _p_instance->getVLC(&p_libvlc);
2046 libvlc_exception_t ex;
2047 libvlc_exception_init(&ex);
2049 libvlc_media_player_t *p_md = libvlc_playlist_get_media_player(p_libvlc, &ex);
2050 if( ! libvlc_exception_raised(&ex) )
2052 *fullscreen = libvlc_get_fullscreen(p_md, &ex) ? VARIANT_TRUE : VARIANT_FALSE;
2053 libvlc_media_player_release(p_md);
2054 if( ! libvlc_exception_raised(&ex) )
2059 _p_instance->setErrorInfo(IID_IVLCVideo, libvlc_exception_get_message(&ex));
2060 libvlc_exception_clear(&ex);
2066 STDMETHODIMP VLCVideo::put_fullscreen(VARIANT_BOOL fullscreen)
2068 libvlc_instance_t* p_libvlc;
2069 HRESULT hr = _p_instance->getVLC(&p_libvlc);
2072 libvlc_exception_t ex;
2073 libvlc_exception_init(&ex);
2075 libvlc_media_player_t *p_md = libvlc_playlist_get_media_player(p_libvlc, &ex);
2076 if( ! libvlc_exception_raised(&ex) )
2078 libvlc_set_fullscreen(p_md, VARIANT_FALSE != fullscreen, &ex);
2079 libvlc_media_player_release(p_md);
2080 if( ! libvlc_exception_raised(&ex) )
2085 _p_instance->setErrorInfo(IID_IVLCVideo, libvlc_exception_get_message(&ex));
2086 libvlc_exception_clear(&ex);
2092 STDMETHODIMP VLCVideo::get_width(long* width)
2097 libvlc_instance_t* p_libvlc;
2098 HRESULT hr = _p_instance->getVLC(&p_libvlc);
2101 libvlc_exception_t ex;
2102 libvlc_exception_init(&ex);
2104 libvlc_media_player_t *p_md = libvlc_playlist_get_media_player(p_libvlc, &ex);
2105 if( ! libvlc_exception_raised(&ex) )
2107 *width = libvlc_video_get_width(p_md, &ex);
2108 libvlc_media_player_release(p_md);
2109 if( ! libvlc_exception_raised(&ex) )
2114 _p_instance->setErrorInfo(IID_IVLCVideo, libvlc_exception_get_message(&ex));
2115 libvlc_exception_clear(&ex);
2121 STDMETHODIMP VLCVideo::get_height(long* height)
2123 if( NULL == height )
2126 libvlc_instance_t* p_libvlc;
2127 HRESULT hr = _p_instance->getVLC(&p_libvlc);
2130 libvlc_exception_t ex;
2131 libvlc_exception_init(&ex);
2133 libvlc_media_player_t *p_md = libvlc_playlist_get_media_player(p_libvlc, &ex);
2134 if( ! libvlc_exception_raised(&ex) )
2136 *height = libvlc_video_get_height(p_md, &ex);
2137 libvlc_media_player_release(p_md);
2138 if( ! libvlc_exception_raised(&ex) )
2143 _p_instance->setErrorInfo(IID_IVLCVideo, libvlc_exception_get_message(&ex));
2144 libvlc_exception_clear(&ex);
2150 STDMETHODIMP VLCVideo::get_aspectRatio(BSTR* aspect)
2152 if( NULL == aspect )
2155 libvlc_instance_t* p_libvlc;
2156 HRESULT hr = _p_instance->getVLC(&p_libvlc);
2159 libvlc_exception_t ex;
2160 libvlc_exception_init(&ex);
2162 libvlc_media_player_t *p_md = libvlc_playlist_get_media_player(p_libvlc, &ex);
2163 if( ! libvlc_exception_raised(&ex) )
2165 char *psz_aspect = libvlc_video_get_aspect_ratio(p_md, &ex);
2167 libvlc_media_player_release(p_md);
2168 if( ! libvlc_exception_raised(&ex) )
2170 if( NULL == psz_aspect )
2171 return E_OUTOFMEMORY;
2173 *aspect = BSTRFromCStr(CP_UTF8, psz_aspect);
2176 return (NULL == *aspect) ? E_OUTOFMEMORY : NOERROR;
2181 _p_instance->setErrorInfo(IID_IVLCVideo, libvlc_exception_get_message(&ex));
2182 libvlc_exception_clear(&ex);
2188 STDMETHODIMP VLCVideo::put_aspectRatio(BSTR aspect)
2190 if( NULL == aspect )
2193 if( 0 == SysStringLen(aspect) )
2194 return E_INVALIDARG;
2196 libvlc_instance_t* p_libvlc;
2197 HRESULT hr = _p_instance->getVLC(&p_libvlc);
2200 libvlc_exception_t ex;
2201 libvlc_exception_init(&ex);
2203 libvlc_media_player_t *p_md = libvlc_playlist_get_media_player(p_libvlc, &ex);
2204 if( ! libvlc_exception_raised(&ex) )
2206 char *psz_aspect = CStrFromBSTR(CP_UTF8, aspect);
2207 if( NULL == psz_aspect )
2209 return E_OUTOFMEMORY;
2212 libvlc_video_set_aspect_ratio(p_md, psz_aspect, &ex);
2214 CoTaskMemFree(psz_aspect);
2215 libvlc_media_player_release(p_md);
2216 if( libvlc_exception_raised(&ex) )
2218 _p_instance->setErrorInfo(IID_IVLCVideo,
2219 libvlc_exception_get_message(&ex));
2220 libvlc_exception_clear(&ex);
2229 STDMETHODIMP VLCVideo::get_subtitle(long* spu)
2234 libvlc_instance_t* p_libvlc;
2235 HRESULT hr = _p_instance->getVLC(&p_libvlc);
2238 libvlc_exception_t ex;
2239 libvlc_exception_init(&ex);
2241 libvlc_media_player_t *p_md = libvlc_playlist_get_media_player(p_libvlc, &ex);
2242 if( ! libvlc_exception_raised(&ex) )
2244 *spu = libvlc_video_get_spu(p_md, &ex);
2245 libvlc_media_player_release(p_md);
2246 if( ! libvlc_exception_raised(&ex) )
2251 _p_instance->setErrorInfo(IID_IVLCVideo, libvlc_exception_get_message(&ex));
2252 libvlc_exception_clear(&ex);
2258 STDMETHODIMP VLCVideo::put_subtitle(long spu)
2260 libvlc_instance_t* p_libvlc;
2261 HRESULT hr = _p_instance->getVLC(&p_libvlc);
2264 libvlc_exception_t ex;
2265 libvlc_exception_init(&ex);
2267 libvlc_media_player_t *p_md = libvlc_playlist_get_media_player(p_libvlc, &ex);
2268 libvlc_video_set_spu(p_md, spu, &ex);
2269 libvlc_media_player_release(p_md);
2270 if( libvlc_exception_raised(&ex) )
2272 _p_instance->setErrorInfo(IID_IVLCVideo, libvlc_exception_get_message(&ex));
2273 libvlc_exception_clear(&ex);
2281 STDMETHODIMP VLCVideo::get_crop(BSTR* geometry)
2283 if( NULL == geometry )
2286 libvlc_instance_t* p_libvlc;
2287 HRESULT hr = _p_instance->getVLC(&p_libvlc);
2290 libvlc_exception_t ex;
2291 libvlc_exception_init(&ex);
2293 libvlc_media_player_t *p_md = libvlc_playlist_get_media_player(p_libvlc, &ex);
2294 if( ! libvlc_exception_raised(&ex) )
2296 char *psz_geometry = libvlc_video_get_crop_geometry(p_md, &ex);
2298 libvlc_media_player_release(p_md);
2299 if( ! libvlc_exception_raised(&ex) )
2301 if( NULL == psz_geometry )
2302 return E_OUTOFMEMORY;
2304 *geometry = BSTRFromCStr(CP_UTF8, psz_geometry);
2305 free( psz_geometry );
2306 psz_geometry = NULL;
2307 return (NULL == geometry) ? E_OUTOFMEMORY : NOERROR;
2309 free( psz_geometry );
2310 psz_geometry = NULL;
2312 _p_instance->setErrorInfo(IID_IVLCVideo, libvlc_exception_get_message(&ex));
2313 libvlc_exception_clear(&ex);
2319 STDMETHODIMP VLCVideo::put_crop(BSTR geometry)
2321 if( NULL == geometry )
2324 if( 0 == SysStringLen(geometry) )
2325 return E_INVALIDARG;
2327 libvlc_instance_t* p_libvlc;
2328 HRESULT hr = _p_instance->getVLC(&p_libvlc);
2331 libvlc_exception_t ex;
2332 libvlc_exception_init(&ex);
2334 libvlc_media_player_t *p_md = libvlc_playlist_get_media_player(p_libvlc, &ex);
2335 if( ! libvlc_exception_raised(&ex) )
2337 char *psz_geometry = CStrFromBSTR(CP_UTF8, geometry);
2338 if( NULL == psz_geometry )
2340 return E_OUTOFMEMORY;
2343 libvlc_video_set_crop_geometry(p_md, psz_geometry, &ex);
2345 CoTaskMemFree(psz_geometry);
2346 libvlc_media_player_release(p_md);
2347 if( libvlc_exception_raised(&ex) )
2349 _p_instance->setErrorInfo(IID_IVLCVideo,
2350 libvlc_exception_get_message(&ex));
2351 libvlc_exception_clear(&ex);
2360 STDMETHODIMP VLCVideo::get_teletext(long* page)
2365 libvlc_instance_t* p_libvlc;
2366 HRESULT hr = _p_instance->getVLC(&p_libvlc);
2369 libvlc_exception_t ex;
2370 libvlc_exception_init(&ex);
2372 libvlc_media_player_t *p_md = libvlc_playlist_get_media_player(p_libvlc, &ex);
2373 if( ! libvlc_exception_raised(&ex) )
2375 *page = libvlc_video_get_teletext(p_md, &ex);
2376 libvlc_media_player_release(p_md);
2377 if( ! libvlc_exception_raised(&ex) )
2382 _p_instance->setErrorInfo(IID_IVLCVideo, libvlc_exception_get_message(&ex));
2383 libvlc_exception_clear(&ex);
2389 STDMETHODIMP VLCVideo::put_teletext(long page)
2391 libvlc_instance_t* p_libvlc;
2392 HRESULT hr = _p_instance->getVLC(&p_libvlc);
2395 libvlc_exception_t ex;
2396 libvlc_exception_init(&ex);
2398 libvlc_media_player_t *p_md = libvlc_playlist_get_media_player(p_libvlc, &ex);
2399 libvlc_video_set_teletext(p_md, page, &ex);
2400 libvlc_media_player_release(p_md);
2401 if( libvlc_exception_raised(&ex) )
2403 _p_instance->setErrorInfo(IID_IVLCVideo, libvlc_exception_get_message(&ex));
2404 libvlc_exception_clear(&ex);
2412 STDMETHODIMP VLCVideo::takeSnapshot(LPPICTUREDISP* picture)
2414 if( NULL == picture )
2417 libvlc_instance_t* p_libvlc;
2418 HRESULT hr = _p_instance->getVLC(&p_libvlc);
2421 libvlc_exception_t ex;
2422 libvlc_exception_init(&ex);
2424 libvlc_media_player_t *p_md = libvlc_playlist_get_media_player(p_libvlc, &ex);
2425 if( ! libvlc_exception_raised(&ex) )
2427 static int uniqueId = 0;
2428 TCHAR path[MAX_PATH+1];
2430 int pathlen = GetTempPath(MAX_PATH-24, path);
2431 if( (0 == pathlen) || (pathlen > (MAX_PATH-24)) )
2434 /* check temp directory path by openning it */
2436 HANDLE dirHandle = CreateFile(path,
2438 FILE_SHARE_READ|FILE_SHARE_WRITE|FILE_SHARE_DELETE,
2441 FILE_FLAG_BACKUP_SEMANTICS, NULL);
2442 if( INVALID_HANDLE_VALUE == dirHandle )
2444 _p_instance->setErrorInfo(IID_IVLCVideo,
2445 "Invalid temporary directory for snapshot images, check values of TMP, TEMP envars.");
2450 BY_HANDLE_FILE_INFORMATION bhfi;
2451 BOOL res = GetFileInformationByHandle(dirHandle, &bhfi);
2452 CloseHandle(dirHandle);
2453 if( !res || !(bhfi.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) )
2455 _p_instance->setErrorInfo(IID_IVLCVideo,
2456 "Invalid temporary directory for snapshot images, check values of TMP, TEMP envars.");
2462 TCHAR filepath[MAX_PATH+1];
2464 _stprintf(filepath, TEXT("%sAXVLC%lXS%lX.bmp"),
2465 path, GetCurrentProcessId(), ++uniqueId);
2468 /* reuse path storage for UTF8 string */
2469 char *psz_filepath = (char *)path;
2470 WCHAR* wpath = filepath;
2472 char *psz_filepath = path;
2473 /* first convert to unicode using current code page */
2474 WCHAR wpath[MAX_PATH+1];
2475 if( 0 == MultiByteToWideChar(CP_ACP, 0, filepath, -1, wpath, sizeof(wpath)/sizeof(WCHAR)) )
2478 /* convert to UTF8 */
2479 pathlen = WideCharToMultiByte(CP_UTF8, 0, wpath, -1, psz_filepath, sizeof(path), NULL, NULL);
2480 // fail if path is 0 or too short (i.e pathlen is the same as storage size)
2481 if( (0 == pathlen) || (sizeof(path) == pathlen) )
2484 /* take snapshot into file */
2485 libvlc_video_take_snapshot(p_md, psz_filepath, 0, 0, &ex);
2486 libvlc_media_player_release(p_md);
2487 if( ! libvlc_exception_raised(&ex) )
2490 /* open snapshot file */
2491 HANDLE snapPic = LoadImage(NULL, filepath, IMAGE_BITMAP,0, 0, LR_CREATEDIBSECTION|LR_LOADFROMFILE);
2496 snapDesc.cbSizeofstruct = sizeof(PICTDESC);
2497 snapDesc.picType = PICTYPE_BITMAP;
2498 snapDesc.bmp.hbitmap = (HBITMAP)snapPic;
2499 snapDesc.bmp.hpal = NULL;
2501 hr = OleCreatePictureIndirect(&snapDesc, IID_IPictureDisp, TRUE, (LPVOID*)picture);
2505 DeleteObject(snapPic);
2508 DeleteFile(filepath);
2512 _p_instance->setErrorInfo(IID_IVLCVideo, libvlc_exception_get_message(&ex));
2513 libvlc_exception_clear(&ex);
2519 STDMETHODIMP VLCVideo::toggleFullscreen()
2521 libvlc_instance_t* p_libvlc;
2522 HRESULT hr = _p_instance->getVLC(&p_libvlc);
2525 libvlc_exception_t ex;
2526 libvlc_exception_init(&ex);
2528 libvlc_media_player_t *p_md = libvlc_playlist_get_media_player(p_libvlc, &ex);
2529 if( ! libvlc_exception_raised(&ex) )
2531 libvlc_toggle_fullscreen(p_md, &ex);
2532 libvlc_media_player_release(p_md);
2533 if( ! libvlc_exception_raised(&ex) )
2538 _p_instance->setErrorInfo(IID_IVLCVideo, libvlc_exception_get_message(&ex));
2539 libvlc_exception_clear(&ex);
2545 STDMETHODIMP VLCVideo::toggleTeletext()
2547 libvlc_instance_t* p_libvlc;
2548 HRESULT hr = _p_instance->getVLC(&p_libvlc);
2551 libvlc_exception_t ex;
2552 libvlc_exception_init(&ex);
2554 libvlc_media_player_t *p_md = libvlc_playlist_get_media_player(p_libvlc, &ex);
2555 if( ! libvlc_exception_raised(&ex) )
2557 libvlc_toggle_teletext(p_md, &ex);
2558 libvlc_media_player_release(p_md);
2559 if( ! libvlc_exception_raised(&ex) )
2564 _p_instance->setErrorInfo(IID_IVLCVideo, libvlc_exception_get_message(&ex));
2565 libvlc_exception_clear(&ex);
2571 /*******************************************************************************/
2573 VLCControl2::VLCControl2(VLCPlugin *p_instance) :
2574 _p_instance(p_instance),
2578 _p_vlcplaylist(NULL),
2581 _p_vlcaudio = new VLCAudio(p_instance);
2582 _p_vlcinput = new VLCInput(p_instance);
2583 _p_vlclog = new VLCLog(p_instance);
2584 _p_vlcplaylist = new VLCPlaylist(p_instance);
2585 _p_vlcvideo = new VLCVideo(p_instance);
2588 VLCControl2::~VLCControl2()
2591 delete _p_vlcplaylist;
2596 _p_typeinfo->Release();
2599 HRESULT VLCControl2::loadTypeInfo(void)
2601 HRESULT hr = NOERROR;
2602 if( NULL == _p_typeinfo )
2604 ITypeLib *p_typelib;
2606 hr = _p_instance->getTypeLib(LOCALE_USER_DEFAULT, &p_typelib);
2609 hr = p_typelib->GetTypeInfoOfGuid(IID_IVLCControl2, &_p_typeinfo);
2614 p_typelib->Release();
2620 STDMETHODIMP VLCControl2::GetTypeInfoCount(UINT* pctInfo)
2622 if( NULL == pctInfo )
2623 return E_INVALIDARG;
2625 if( SUCCEEDED(loadTypeInfo()) )
2633 STDMETHODIMP VLCControl2::GetTypeInfo(UINT iTInfo, LCID lcid, LPTYPEINFO* ppTInfo)
2635 if( NULL == ppTInfo )
2636 return E_INVALIDARG;
2638 if( SUCCEEDED(loadTypeInfo()) )
2640 _p_typeinfo->AddRef();
2641 *ppTInfo = _p_typeinfo;
2648 STDMETHODIMP VLCControl2::GetIDsOfNames(REFIID riid, LPOLESTR* rgszNames,
2649 UINT cNames, LCID lcid, DISPID* rgDispID)
2651 if( SUCCEEDED(loadTypeInfo()) )
2653 return DispGetIDsOfNames(_p_typeinfo, rgszNames, cNames, rgDispID);
2658 STDMETHODIMP VLCControl2::Invoke(DISPID dispIdMember, REFIID riid,
2659 LCID lcid, WORD wFlags, DISPPARAMS* pDispParams,
2660 VARIANT* pVarResult, EXCEPINFO* pExcepInfo, UINT* puArgErr)
2662 if( SUCCEEDED(loadTypeInfo()) )
2664 return DispInvoke(this, _p_typeinfo, dispIdMember, wFlags, pDispParams,
2665 pVarResult, pExcepInfo, puArgErr);
2670 STDMETHODIMP VLCControl2::get_AutoLoop(VARIANT_BOOL *autoloop)
2672 if( NULL == autoloop )
2675 *autoloop = _p_instance->getAutoLoop() ? VARIANT_TRUE: VARIANT_FALSE;
2679 STDMETHODIMP VLCControl2::put_AutoLoop(VARIANT_BOOL autoloop)
2681 _p_instance->setAutoLoop((VARIANT_FALSE != autoloop) ? TRUE: FALSE);
2685 STDMETHODIMP VLCControl2::get_AutoPlay(VARIANT_BOOL *autoplay)
2687 if( NULL == autoplay )
2690 *autoplay = _p_instance->getAutoPlay() ? VARIANT_TRUE: VARIANT_FALSE;
2694 STDMETHODIMP VLCControl2::put_AutoPlay(VARIANT_BOOL autoplay)
2696 _p_instance->setAutoPlay((VARIANT_FALSE != autoplay) ? TRUE: FALSE);
2700 STDMETHODIMP VLCControl2::get_BaseURL(BSTR *url)
2705 *url = SysAllocStringLen(_p_instance->getBaseURL(),
2706 SysStringLen(_p_instance->getBaseURL()));
2710 STDMETHODIMP VLCControl2::put_BaseURL(BSTR mrl)
2712 _p_instance->setBaseURL(mrl);
2717 STDMETHODIMP VLCControl2::get_MRL(BSTR *mrl)
2722 *mrl = SysAllocStringLen(_p_instance->getMRL(),
2723 SysStringLen(_p_instance->getMRL()));
2727 STDMETHODIMP VLCControl2::put_MRL(BSTR mrl)
2729 _p_instance->setMRL(mrl);
2735 STDMETHODIMP VLCControl2::get_Toolbar(VARIANT_BOOL *visible)
2737 if( NULL == visible )
2741 * Note to developpers
2743 * Returning the _b_toolbar is closer to the method specification.
2744 * But returning True when toolbar is not implemented so not displayed
2745 * could be bad for ActiveX users which rely on this value to show their
2746 * own toolbar if not provided by the ActiveX.
2748 * This is the reason why FALSE is returned, until toolbar get implemented.
2751 /* DISABLED for now */
2752 // *visible = _p_instance->getShowToolbar() ? VARIANT_TRUE: VARIANT_FALSE;
2754 *visible = VARIANT_FALSE;
2759 STDMETHODIMP VLCControl2::put_Toolbar(VARIANT_BOOL visible)
2761 _p_instance->setShowToolbar((VARIANT_FALSE != visible) ? TRUE: FALSE);
2766 STDMETHODIMP VLCControl2::get_StartTime(long *seconds)
2768 if( NULL == seconds )
2771 *seconds = _p_instance->getStartTime();
2776 STDMETHODIMP VLCControl2::put_StartTime(long seconds)
2778 _p_instance->setStartTime(seconds);
2783 STDMETHODIMP VLCControl2::get_VersionInfo(BSTR *version)
2785 if( NULL == version )
2788 const char *versionStr = VLC_Version();
2789 if( NULL != versionStr )
2791 *version = BSTRFromCStr(CP_UTF8, versionStr);
2793 return NULL == *version ? E_OUTOFMEMORY : NOERROR;
2799 STDMETHODIMP VLCControl2::get_Visible(VARIANT_BOOL *isVisible)
2801 if( NULL == isVisible )
2804 *isVisible = _p_instance->getVisible() ? VARIANT_TRUE : VARIANT_FALSE;
2809 STDMETHODIMP VLCControl2::put_Visible(VARIANT_BOOL isVisible)
2811 _p_instance->setVisible(isVisible != VARIANT_FALSE);
2816 STDMETHODIMP VLCControl2::get_Volume(long *volume)
2818 if( NULL == volume )
2821 *volume = _p_instance->getVolume();
2825 STDMETHODIMP VLCControl2::put_Volume(long volume)
2827 _p_instance->setVolume(volume);
2831 STDMETHODIMP VLCControl2::get_BackColor(OLE_COLOR *backcolor)
2833 if( NULL == backcolor )
2836 *backcolor = _p_instance->getBackColor();
2840 STDMETHODIMP VLCControl2::put_BackColor(OLE_COLOR backcolor)
2842 _p_instance->setBackColor(backcolor);
2846 STDMETHODIMP VLCControl2::get_audio(IVLCAudio** obj)
2852 if( NULL != _p_vlcaudio )
2854 _p_vlcaudio->AddRef();
2857 return E_OUTOFMEMORY;
2860 STDMETHODIMP VLCControl2::get_input(IVLCInput** obj)
2866 if( NULL != _p_vlcinput )
2868 _p_vlcinput->AddRef();
2871 return E_OUTOFMEMORY;
2874 STDMETHODIMP VLCControl2::get_log(IVLCLog** obj)
2880 if( NULL != _p_vlclog )
2882 _p_vlclog->AddRef();
2885 return E_OUTOFMEMORY;
2888 STDMETHODIMP VLCControl2::get_playlist(IVLCPlaylist** obj)
2893 *obj = _p_vlcplaylist;
2894 if( NULL != _p_vlcplaylist )
2896 _p_vlcplaylist->AddRef();
2899 return E_OUTOFMEMORY;
2902 STDMETHODIMP VLCControl2::get_video(IVLCVideo** obj)
2908 if( NULL != _p_vlcvideo )
2910 _p_vlcvideo->AddRef();
2913 return E_OUTOFMEMORY;