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"
38 _p_typeinfo->Release();
41 HRESULT VLCAudio::loadTypeInfo(void)
44 if( NULL == _p_typeinfo )
48 hr = _p_instance->getTypeLib(LOCALE_USER_DEFAULT, &p_typelib);
51 hr = p_typelib->GetTypeInfoOfGuid(IID_IVLCAudio, &_p_typeinfo);
62 STDMETHODIMP VLCAudio::GetTypeInfoCount(UINT* pctInfo)
67 if( SUCCEEDED(loadTypeInfo()) )
75 STDMETHODIMP VLCAudio::GetTypeInfo(UINT iTInfo, LCID lcid, LPTYPEINFO* ppTInfo)
80 if( SUCCEEDED(loadTypeInfo()) )
82 _p_typeinfo->AddRef();
83 *ppTInfo = _p_typeinfo;
90 STDMETHODIMP VLCAudio::GetIDsOfNames(REFIID riid, LPOLESTR* rgszNames,
91 UINT cNames, LCID lcid, DISPID* rgDispID)
93 if( SUCCEEDED(loadTypeInfo()) )
95 return DispGetIDsOfNames(_p_typeinfo, rgszNames, cNames, rgDispID);
100 STDMETHODIMP VLCAudio::Invoke(DISPID dispIdMember, REFIID riid,
101 LCID lcid, WORD wFlags, DISPPARAMS* pDispParams,
102 VARIANT* pVarResult, EXCEPINFO* pExcepInfo, UINT* puArgErr)
104 if( SUCCEEDED(loadTypeInfo()) )
106 return DispInvoke(this, _p_typeinfo, dispIdMember, wFlags, pDispParams,
107 pVarResult, pExcepInfo, puArgErr);
112 STDMETHODIMP VLCAudio::get_mute(VARIANT_BOOL* mute)
117 libvlc_instance_t* p_libvlc;
118 HRESULT hr = _p_instance->getVLC(&p_libvlc);
121 libvlc_exception_t ex;
122 libvlc_exception_init(&ex);
124 *mute = libvlc_audio_get_mute(p_libvlc, &ex) ? VARIANT_TRUE : VARIANT_FALSE;
125 if( libvlc_exception_raised(&ex) )
127 _p_instance->setErrorInfo(IID_IVLCAudio, libvlc_exception_get_message(&ex));
128 libvlc_exception_clear(&ex);
136 STDMETHODIMP VLCAudio::put_mute(VARIANT_BOOL mute)
138 libvlc_instance_t* p_libvlc;
139 HRESULT hr = _p_instance->getVLC(&p_libvlc);
142 libvlc_exception_t ex;
143 libvlc_exception_init(&ex);
145 libvlc_audio_set_mute(p_libvlc, VARIANT_FALSE != mute, &ex);
146 if( libvlc_exception_raised(&ex) )
148 _p_instance->setErrorInfo(IID_IVLCAudio, libvlc_exception_get_message(&ex));
149 libvlc_exception_clear(&ex);
157 STDMETHODIMP VLCAudio::get_volume(long* volume)
162 libvlc_instance_t* p_libvlc;
163 HRESULT hr = _p_instance->getVLC(&p_libvlc);
166 libvlc_exception_t ex;
167 libvlc_exception_init(&ex);
169 *volume = libvlc_audio_get_volume(p_libvlc, &ex);
170 if( libvlc_exception_raised(&ex) )
172 _p_instance->setErrorInfo(IID_IVLCAudio, libvlc_exception_get_message(&ex));
173 libvlc_exception_clear(&ex);
181 STDMETHODIMP VLCAudio::put_volume(long volume)
183 libvlc_instance_t* p_libvlc;
184 HRESULT hr = _p_instance->getVLC(&p_libvlc);
187 libvlc_exception_t ex;
188 libvlc_exception_init(&ex);
190 libvlc_audio_set_volume(p_libvlc, volume, &ex);
191 if( libvlc_exception_raised(&ex) )
193 _p_instance->setErrorInfo(IID_IVLCAudio,
194 libvlc_exception_get_message(&ex));
195 libvlc_exception_clear(&ex);
203 STDMETHODIMP VLCAudio::get_track(long* track)
208 libvlc_instance_t* p_libvlc;
209 HRESULT hr = _p_instance->getVLC(&p_libvlc);
212 libvlc_exception_t ex;
213 libvlc_exception_init(&ex);
215 libvlc_input_t *p_input = libvlc_playlist_get_input(p_libvlc, &ex);
216 *track = libvlc_audio_get_track(p_input, &ex);
217 libvlc_input_free(p_input);
218 if( libvlc_exception_raised(&ex) )
220 _p_instance->setErrorInfo(IID_IVLCAudio,
221 libvlc_exception_get_message(&ex));
222 libvlc_exception_clear(&ex);
230 STDMETHODIMP VLCAudio::put_track(long track)
232 libvlc_instance_t* p_libvlc;
233 HRESULT hr = _p_instance->getVLC(&p_libvlc);
236 libvlc_exception_t ex;
237 libvlc_exception_init(&ex);
239 libvlc_input_t *p_input = libvlc_playlist_get_input(p_libvlc, &ex);
240 libvlc_audio_set_track(p_input, track, &ex);
241 libvlc_input_free(p_input);
242 if( libvlc_exception_raised(&ex) )
244 _p_instance->setErrorInfo(IID_IVLCAudio,
245 libvlc_exception_get_message(&ex));
246 libvlc_exception_clear(&ex);
254 STDMETHODIMP VLCAudio::get_channel(long *channel)
256 if( NULL == channel )
259 libvlc_instance_t* p_libvlc;
260 HRESULT hr = _p_instance->getVLC(&p_libvlc);
263 libvlc_exception_t ex;
264 libvlc_exception_init(&ex);
266 *channel = libvlc_audio_get_channel(p_libvlc, &ex);
267 if( libvlc_exception_raised(&ex) )
269 _p_instance->setErrorInfo(IID_IVLCAudio,
270 libvlc_exception_get_message(&ex));
271 libvlc_exception_clear(&ex);
279 STDMETHODIMP VLCAudio::put_channel(long channel)
281 libvlc_instance_t* p_libvlc;
282 HRESULT hr = _p_instance->getVLC(&p_libvlc);
285 libvlc_exception_t ex;
286 libvlc_exception_init(&ex);
288 libvlc_audio_set_channel(p_libvlc, channel, &ex);
289 if( libvlc_exception_raised(&ex) )
291 _p_instance->setErrorInfo(IID_IVLCAudio,
292 libvlc_exception_get_message(&ex));
293 libvlc_exception_clear(&ex);
301 STDMETHODIMP VLCAudio::toggleMute()
303 libvlc_instance_t* p_libvlc;
304 HRESULT hr = _p_instance->getVLC(&p_libvlc);
307 libvlc_exception_t ex;
308 libvlc_exception_init(&ex);
310 libvlc_audio_toggle_mute(p_libvlc, &ex);
311 if( libvlc_exception_raised(&ex) )
313 _p_instance->setErrorInfo(IID_IVLCAudio,
314 libvlc_exception_get_message(&ex));
315 libvlc_exception_clear(&ex);
323 /*******************************************************************************/
325 VLCInput::~VLCInput()
328 _p_typeinfo->Release();
331 HRESULT VLCInput::loadTypeInfo(void)
333 HRESULT hr = NOERROR;
334 if( NULL == _p_typeinfo )
338 hr = _p_instance->getTypeLib(LOCALE_USER_DEFAULT, &p_typelib);
341 hr = p_typelib->GetTypeInfoOfGuid(IID_IVLCInput, &_p_typeinfo);
346 p_typelib->Release();
352 STDMETHODIMP VLCInput::GetTypeInfoCount(UINT* pctInfo)
354 if( NULL == pctInfo )
357 if( SUCCEEDED(loadTypeInfo()) )
365 STDMETHODIMP VLCInput::GetTypeInfo(UINT iTInfo, LCID lcid, LPTYPEINFO* ppTInfo)
367 if( NULL == ppTInfo )
370 if( SUCCEEDED(loadTypeInfo()) )
372 _p_typeinfo->AddRef();
373 *ppTInfo = _p_typeinfo;
380 STDMETHODIMP VLCInput::GetIDsOfNames(REFIID riid, LPOLESTR* rgszNames,
381 UINT cNames, LCID lcid, DISPID* rgDispID)
383 if( SUCCEEDED(loadTypeInfo()) )
385 return DispGetIDsOfNames(_p_typeinfo, rgszNames, cNames, rgDispID);
390 STDMETHODIMP VLCInput::Invoke(DISPID dispIdMember, REFIID riid,
391 LCID lcid, WORD wFlags, DISPPARAMS* pDispParams,
392 VARIANT* pVarResult, EXCEPINFO* pExcepInfo, UINT* puArgErr)
394 if( SUCCEEDED(loadTypeInfo()) )
396 return DispInvoke(this, _p_typeinfo, dispIdMember, wFlags, pDispParams,
397 pVarResult, pExcepInfo, puArgErr);
402 STDMETHODIMP VLCInput::get_length(double* length)
407 libvlc_instance_t* p_libvlc;
408 HRESULT hr = _p_instance->getVLC(&p_libvlc);
411 libvlc_exception_t ex;
412 libvlc_exception_init(&ex);
414 libvlc_input_t *p_input = libvlc_playlist_get_input(p_libvlc, &ex);
415 if( ! libvlc_exception_raised(&ex) )
417 *length = (double)libvlc_input_get_length(p_input, &ex);
418 libvlc_input_free(p_input);
419 if( ! libvlc_exception_raised(&ex) )
424 _p_instance->setErrorInfo(IID_IVLCInput, libvlc_exception_get_message(&ex));
425 libvlc_exception_clear(&ex);
431 STDMETHODIMP VLCInput::get_position(double* position)
433 if( NULL == position )
436 libvlc_instance_t* p_libvlc;
437 HRESULT hr = _p_instance->getVLC(&p_libvlc);
440 libvlc_exception_t ex;
441 libvlc_exception_init(&ex);
443 libvlc_input_t *p_input = libvlc_playlist_get_input(p_libvlc, &ex);
444 if( ! libvlc_exception_raised(&ex) )
446 *position = libvlc_input_get_position(p_input, &ex);
447 libvlc_input_free(p_input);
448 if( ! libvlc_exception_raised(&ex) )
453 _p_instance->setErrorInfo(IID_IVLCInput, libvlc_exception_get_message(&ex));
454 libvlc_exception_clear(&ex);
460 STDMETHODIMP VLCInput::put_position(double position)
462 libvlc_instance_t* p_libvlc;
463 HRESULT hr = _p_instance->getVLC(&p_libvlc);
466 libvlc_exception_t ex;
467 libvlc_exception_init(&ex);
469 libvlc_input_t *p_input = libvlc_playlist_get_input(p_libvlc, &ex);
470 if( ! libvlc_exception_raised(&ex) )
472 libvlc_input_set_position(p_input, position, &ex);
473 libvlc_input_free(p_input);
474 if( ! libvlc_exception_raised(&ex) )
479 _p_instance->setErrorInfo(IID_IVLCInput, libvlc_exception_get_message(&ex));
480 libvlc_exception_clear(&ex);
486 STDMETHODIMP VLCInput::get_time(double* time)
491 libvlc_instance_t* p_libvlc;
492 HRESULT hr = _p_instance->getVLC(&p_libvlc);
495 libvlc_exception_t ex;
496 libvlc_exception_init(&ex);
498 libvlc_input_t *p_input = libvlc_playlist_get_input(p_libvlc, &ex);
499 if( ! libvlc_exception_raised(&ex) )
501 *time = (double)libvlc_input_get_time(p_input, &ex);
502 libvlc_input_free(p_input);
503 if( ! libvlc_exception_raised(&ex) )
508 _p_instance->setErrorInfo(IID_IVLCInput, libvlc_exception_get_message(&ex));
509 libvlc_exception_clear(&ex);
515 STDMETHODIMP VLCInput::put_time(double time)
517 libvlc_instance_t* p_libvlc;
518 HRESULT hr = _p_instance->getVLC(&p_libvlc);
521 libvlc_exception_t ex;
522 libvlc_exception_init(&ex);
524 libvlc_input_t *p_input = libvlc_playlist_get_input(p_libvlc, &ex);
525 if( ! libvlc_exception_raised(&ex) )
527 libvlc_input_set_time(p_input, (vlc_int64_t)time, &ex);
528 libvlc_input_free(p_input);
529 if( ! libvlc_exception_raised(&ex) )
534 _p_instance->setErrorInfo(IID_IVLCInput, libvlc_exception_get_message(&ex));
535 libvlc_exception_clear(&ex);
541 STDMETHODIMP VLCInput::get_state(long* state)
546 libvlc_instance_t* p_libvlc;
547 HRESULT hr = _p_instance->getVLC(&p_libvlc);
550 libvlc_exception_t ex;
551 libvlc_exception_init(&ex);
553 libvlc_input_t *p_input = libvlc_playlist_get_input(p_libvlc, &ex);
554 if( ! libvlc_exception_raised(&ex) )
556 *state = libvlc_input_get_state(p_input, &ex);
557 libvlc_input_free(p_input);
558 if( ! libvlc_exception_raised(&ex) )
563 libvlc_exception_clear(&ex);
564 // don't fail, just return the idle state
571 STDMETHODIMP VLCInput::get_rate(double* rate)
576 libvlc_instance_t* p_libvlc;
577 HRESULT hr = _p_instance->getVLC(&p_libvlc);
580 libvlc_exception_t ex;
581 libvlc_exception_init(&ex);
583 libvlc_input_t *p_input = libvlc_playlist_get_input(p_libvlc, &ex);
584 if( ! libvlc_exception_raised(&ex) )
586 *rate = libvlc_input_get_rate(p_input, &ex);
587 libvlc_input_free(p_input);
588 if( ! libvlc_exception_raised(&ex) )
593 _p_instance->setErrorInfo(IID_IVLCInput, libvlc_exception_get_message(&ex));
594 libvlc_exception_clear(&ex);
600 STDMETHODIMP VLCInput::put_rate(double rate)
602 libvlc_instance_t* p_libvlc;
603 HRESULT hr = _p_instance->getVLC(&p_libvlc);
606 libvlc_exception_t ex;
607 libvlc_exception_init(&ex);
609 libvlc_input_t *p_input = libvlc_playlist_get_input(p_libvlc, &ex);
610 if( ! libvlc_exception_raised(&ex) )
612 libvlc_input_set_rate(p_input, rate, &ex);
613 libvlc_input_free(p_input);
614 if( ! libvlc_exception_raised(&ex) )
619 _p_instance->setErrorInfo(IID_IVLCInput, libvlc_exception_get_message(&ex));
620 libvlc_exception_clear(&ex);
626 STDMETHODIMP VLCInput::get_fps(double* fps)
632 libvlc_instance_t* p_libvlc;
633 HRESULT hr = _p_instance->getVLC(&p_libvlc);
636 libvlc_exception_t ex;
637 libvlc_exception_init(&ex);
639 libvlc_input_t *p_input = libvlc_playlist_get_input(p_libvlc, &ex);
640 if( ! libvlc_exception_raised(&ex) )
642 *fps = libvlc_input_get_fps(p_input, &ex);
643 libvlc_input_free(p_input);
644 if( ! libvlc_exception_raised(&ex) )
649 _p_instance->setErrorInfo(IID_IVLCInput, libvlc_exception_get_message(&ex));
650 libvlc_exception_clear(&ex);
656 STDMETHODIMP VLCInput::get_hasVout(VARIANT_BOOL* hasVout)
658 if( NULL == hasVout )
661 libvlc_instance_t* p_libvlc;
662 HRESULT hr = _p_instance->getVLC(&p_libvlc);
665 libvlc_exception_t ex;
666 libvlc_exception_init(&ex);
668 libvlc_input_t *p_input = libvlc_playlist_get_input(p_libvlc, &ex);
669 if( ! libvlc_exception_raised(&ex) )
671 *hasVout = libvlc_input_has_vout(p_input, &ex) ? VARIANT_TRUE : VARIANT_FALSE;
672 libvlc_input_free(p_input);
673 if( ! libvlc_exception_raised(&ex) )
678 _p_instance->setErrorInfo(IID_IVLCInput, libvlc_exception_get_message(&ex));
679 libvlc_exception_clear(&ex);
685 /*******************************************************************************/
689 delete _p_vlcmessages;
691 libvlc_log_close(_p_log, NULL);
694 _p_typeinfo->Release();
697 HRESULT VLCLog::loadTypeInfo(void)
699 HRESULT hr = NOERROR;
700 if( NULL == _p_typeinfo )
704 hr = _p_instance->getTypeLib(LOCALE_USER_DEFAULT, &p_typelib);
707 hr = p_typelib->GetTypeInfoOfGuid(IID_IVLCLog, &_p_typeinfo);
712 p_typelib->Release();
718 STDMETHODIMP VLCLog::GetTypeInfoCount(UINT* pctInfo)
720 if( NULL == pctInfo )
723 if( SUCCEEDED(loadTypeInfo()) )
731 STDMETHODIMP VLCLog::GetTypeInfo(UINT iTInfo, LCID lcid, LPTYPEINFO* ppTInfo)
733 if( NULL == ppTInfo )
736 if( SUCCEEDED(loadTypeInfo()) )
738 _p_typeinfo->AddRef();
739 *ppTInfo = _p_typeinfo;
746 STDMETHODIMP VLCLog::GetIDsOfNames(REFIID riid, LPOLESTR* rgszNames,
747 UINT cNames, LCID lcid, DISPID* rgDispID)
749 if( SUCCEEDED(loadTypeInfo()) )
751 return DispGetIDsOfNames(_p_typeinfo, rgszNames, cNames, rgDispID);
756 STDMETHODIMP VLCLog::Invoke(DISPID dispIdMember, REFIID riid,
757 LCID lcid, WORD wFlags, DISPPARAMS* pDispParams,
758 VARIANT* pVarResult, EXCEPINFO* pExcepInfo, UINT* puArgErr)
760 if( SUCCEEDED(loadTypeInfo()) )
762 return DispInvoke(this, _p_typeinfo, dispIdMember, wFlags, pDispParams,
763 pVarResult, pExcepInfo, puArgErr);
768 STDMETHODIMP VLCLog::get_messages(IVLCMessages** obj)
773 *obj = _p_vlcmessages;
774 if( NULL != _p_vlcmessages )
776 _p_vlcmessages->AddRef();
779 return E_OUTOFMEMORY;
782 STDMETHODIMP VLCLog::get_verbosity(long* level)
789 libvlc_instance_t* p_libvlc;
790 HRESULT hr = _p_instance->getVLC(&p_libvlc);
793 libvlc_exception_t ex;
794 libvlc_exception_init(&ex);
796 *level = libvlc_get_log_verbosity(p_libvlc, &ex);
797 if( libvlc_exception_raised(&ex) )
799 _p_instance->setErrorInfo(IID_IVLCLog, libvlc_exception_get_message(&ex));
800 libvlc_exception_clear(&ex);
808 /* log is not enabled, return -1 */
814 STDMETHODIMP VLCLog::put_verbosity(long verbosity)
816 libvlc_exception_t ex;
817 libvlc_exception_init(&ex);
819 libvlc_instance_t* p_libvlc;
820 HRESULT hr = _p_instance->getVLC(&p_libvlc);
827 _p_log = libvlc_log_open(p_libvlc, &ex);
828 if( libvlc_exception_raised(&ex) )
830 _p_instance->setErrorInfo(IID_IVLCLog, libvlc_exception_get_message(&ex));
831 libvlc_exception_clear(&ex);
835 libvlc_set_log_verbosity(p_libvlc, (unsigned)verbosity, &ex);
836 if( libvlc_exception_raised(&ex) )
838 _p_instance->setErrorInfo(IID_IVLCLog, libvlc_exception_get_message(&ex));
839 libvlc_exception_clear(&ex);
845 /* close log when verbosity is set to -1 */
846 libvlc_log_close(_p_log, &ex);
848 if( libvlc_exception_raised(&ex) )
850 _p_instance->setErrorInfo(IID_IVLCLog, libvlc_exception_get_message(&ex));
851 libvlc_exception_clear(&ex);
859 /*******************************************************************************/
861 /* STL forward iterator used by VLCEnumIterator class to implement IEnumVARIANT */
863 class VLCMessageSTLIterator
868 VLCMessageSTLIterator(IVLCMessageIterator* iter) : iter(iter), msg(NULL)
874 VLCMessageSTLIterator(const VLCMessageSTLIterator& other)
884 virtual ~VLCMessageSTLIterator()
893 // we only need prefix ++ operator
894 VLCMessageSTLIterator& operator++()
896 VARIANT_BOOL hasNext = VARIANT_FALSE;
899 iter->get_hasNext(&hasNext);
906 if( VARIANT_TRUE == hasNext ) {
913 VARIANT operator*() const
919 if( SUCCEEDED(msg->QueryInterface(IID_IDispatch, (LPVOID*)&V_DISPATCH(&v))) )
921 V_VT(&v) = VT_DISPATCH;
927 bool operator==(const VLCMessageSTLIterator& other) const
929 return msg == other.msg;
932 bool operator!=(const VLCMessageSTLIterator& other) const
934 return msg != other.msg;
938 IVLCMessageIterator* iter;
942 ////////////////////////////////////////////////////////////////////////////////////////////////////////////
944 VLCMessages::~VLCMessages()
947 _p_typeinfo->Release();
950 HRESULT VLCMessages::loadTypeInfo(void)
952 HRESULT hr = NOERROR;
953 if( NULL == _p_typeinfo )
957 hr = _p_instance->getTypeLib(LOCALE_USER_DEFAULT, &p_typelib);
960 hr = p_typelib->GetTypeInfoOfGuid(IID_IVLCMessages, &_p_typeinfo);
965 p_typelib->Release();
971 STDMETHODIMP VLCMessages::GetTypeInfoCount(UINT* pctInfo)
973 if( NULL == pctInfo )
976 if( SUCCEEDED(loadTypeInfo()) )
984 STDMETHODIMP VLCMessages::GetTypeInfo(UINT iTInfo, LCID lcid, LPTYPEINFO* ppTInfo)
986 if( NULL == ppTInfo )
989 if( SUCCEEDED(loadTypeInfo()) )
991 _p_typeinfo->AddRef();
992 *ppTInfo = _p_typeinfo;
999 STDMETHODIMP VLCMessages::GetIDsOfNames(REFIID riid, LPOLESTR* rgszNames,
1000 UINT cNames, LCID lcid, DISPID* rgDispID)
1002 if( SUCCEEDED(loadTypeInfo()) )
1004 return DispGetIDsOfNames(_p_typeinfo, rgszNames, cNames, rgDispID);
1009 STDMETHODIMP VLCMessages::Invoke(DISPID dispIdMember, REFIID riid,
1010 LCID lcid, WORD wFlags, DISPPARAMS* pDispParams,
1011 VARIANT* pVarResult, EXCEPINFO* pExcepInfo, UINT* puArgErr)
1013 if( SUCCEEDED(loadTypeInfo()) )
1015 return DispInvoke(this, _p_typeinfo, dispIdMember, wFlags, pDispParams,
1016 pVarResult, pExcepInfo, puArgErr);
1021 STDMETHODIMP VLCMessages::get__NewEnum(LPUNKNOWN* _NewEnum)
1023 if( NULL == _NewEnum )
1026 IVLCMessageIterator* iter = NULL;
1029 *_NewEnum= new VLCEnumIterator<IID_IEnumVARIANT,
1032 VLCMessageSTLIterator>
1033 (VLCMessageSTLIterator(iter), VLCMessageSTLIterator(NULL));
1035 return *_NewEnum ? S_OK : E_OUTOFMEMORY;
1038 STDMETHODIMP VLCMessages::clear()
1040 libvlc_log_t *p_log = _p_vlclog->_p_log;
1043 libvlc_exception_t ex;
1044 libvlc_exception_init(&ex);
1046 libvlc_log_clear(p_log, &ex);
1047 if( libvlc_exception_raised(&ex) )
1049 _p_instance->setErrorInfo(IID_IVLCMessages, libvlc_exception_get_message(&ex));
1050 libvlc_exception_clear(&ex);
1057 STDMETHODIMP VLCMessages::get_count(long* count)
1062 libvlc_log_t *p_log = _p_vlclog->_p_log;
1065 libvlc_exception_t ex;
1066 libvlc_exception_init(&ex);
1068 *count = libvlc_log_count(p_log, &ex);
1069 if( libvlc_exception_raised(&ex) )
1071 _p_instance->setErrorInfo(IID_IVLCMessages, libvlc_exception_get_message(&ex));
1072 libvlc_exception_clear(&ex);
1081 STDMETHODIMP VLCMessages::iterator(IVLCMessageIterator** iter)
1086 *iter = new VLCMessageIterator(_p_instance, _p_vlclog);
1088 return *iter ? S_OK : E_OUTOFMEMORY;
1091 /*******************************************************************************/
1093 VLCMessageIterator::VLCMessageIterator(VLCPlugin *p_instance, VLCLog* p_vlclog ) :
1094 _p_instance(p_instance),
1099 if( p_vlclog->_p_log )
1101 _p_iter = libvlc_log_get_iterator(p_vlclog->_p_log, NULL);
1107 VLCMessageIterator::~VLCMessageIterator()
1110 libvlc_log_iterator_free(_p_iter, NULL);
1113 _p_typeinfo->Release();
1116 HRESULT VLCMessageIterator::loadTypeInfo(void)
1118 HRESULT hr = NOERROR;
1119 if( NULL == _p_typeinfo )
1121 ITypeLib *p_typelib;
1123 hr = _p_instance->getTypeLib(LOCALE_USER_DEFAULT, &p_typelib);
1126 hr = p_typelib->GetTypeInfoOfGuid(IID_IVLCMessageIterator, &_p_typeinfo);
1131 p_typelib->Release();
1137 STDMETHODIMP VLCMessageIterator::GetTypeInfoCount(UINT* pctInfo)
1139 if( NULL == pctInfo )
1140 return E_INVALIDARG;
1142 if( SUCCEEDED(loadTypeInfo()) )
1150 STDMETHODIMP VLCMessageIterator::GetTypeInfo(UINT iTInfo, LCID lcid, LPTYPEINFO* ppTInfo)
1152 if( NULL == ppTInfo )
1153 return E_INVALIDARG;
1155 if( SUCCEEDED(loadTypeInfo()) )
1157 _p_typeinfo->AddRef();
1158 *ppTInfo = _p_typeinfo;
1165 STDMETHODIMP VLCMessageIterator::GetIDsOfNames(REFIID riid, LPOLESTR* rgszNames,
1166 UINT cNames, LCID lcid, DISPID* rgDispID)
1168 if( SUCCEEDED(loadTypeInfo()) )
1170 return DispGetIDsOfNames(_p_typeinfo, rgszNames, cNames, rgDispID);
1175 STDMETHODIMP VLCMessageIterator::Invoke(DISPID dispIdMember, REFIID riid,
1176 LCID lcid, WORD wFlags, DISPPARAMS* pDispParams,
1177 VARIANT* pVarResult, EXCEPINFO* pExcepInfo, UINT* puArgErr)
1179 if( SUCCEEDED(loadTypeInfo()) )
1181 return DispInvoke(this, _p_typeinfo, dispIdMember, wFlags, pDispParams,
1182 pVarResult, pExcepInfo, puArgErr);
1187 STDMETHODIMP VLCMessageIterator::get_hasNext(VARIANT_BOOL* hasNext)
1189 if( NULL == hasNext )
1192 if( _p_iter && _p_vlclog->_p_log )
1194 libvlc_exception_t ex;
1195 libvlc_exception_init(&ex);
1197 *hasNext = libvlc_log_iterator_has_next(_p_iter, &ex) ? VARIANT_TRUE : VARIANT_FALSE;
1198 if( libvlc_exception_raised(&ex) )
1200 _p_instance->setErrorInfo(IID_IVLCMessageIterator, libvlc_exception_get_message(&ex));
1201 libvlc_exception_clear(&ex);
1207 *hasNext = VARIANT_FALSE;
1212 STDMETHODIMP VLCMessageIterator::next(IVLCMessage** message)
1214 if( NULL == message )
1217 if( _p_iter && _p_vlclog->_p_log )
1219 struct libvlc_log_message_t buffer;
1221 buffer.sizeof_msg = sizeof(buffer);
1223 libvlc_exception_t ex;
1224 libvlc_exception_init(&ex);
1226 libvlc_log_iterator_next(_p_iter, &buffer, &ex);
1227 if( libvlc_exception_raised(&ex) )
1229 _p_instance->setErrorInfo(IID_IVLCMessageIterator, libvlc_exception_get_message(&ex));
1230 libvlc_exception_clear(&ex);
1233 *message = new VLCMessage(_p_instance, buffer);
1234 return *message ? NOERROR : E_OUTOFMEMORY;
1239 /*******************************************************************************/
1241 VLCMessage::~VLCMessage()
1244 _p_typeinfo->Release();
1247 HRESULT VLCMessage::loadTypeInfo(void)
1249 HRESULT hr = NOERROR;
1250 if( NULL == _p_typeinfo )
1252 ITypeLib *p_typelib;
1254 hr = _p_instance->getTypeLib(LOCALE_USER_DEFAULT, &p_typelib);
1257 hr = p_typelib->GetTypeInfoOfGuid(IID_IVLCMessage, &_p_typeinfo);
1262 p_typelib->Release();
1268 STDMETHODIMP VLCMessage::GetTypeInfoCount(UINT* pctInfo)
1270 if( NULL == pctInfo )
1271 return E_INVALIDARG;
1273 if( SUCCEEDED(loadTypeInfo()) )
1281 STDMETHODIMP VLCMessage::GetTypeInfo(UINT iTInfo, LCID lcid, LPTYPEINFO* ppTInfo)
1283 if( NULL == ppTInfo )
1284 return E_INVALIDARG;
1286 if( SUCCEEDED(loadTypeInfo()) )
1288 _p_typeinfo->AddRef();
1289 *ppTInfo = _p_typeinfo;
1296 STDMETHODIMP VLCMessage::GetIDsOfNames(REFIID riid, LPOLESTR* rgszNames,
1297 UINT cNames, LCID lcid, DISPID* rgDispID)
1299 if( SUCCEEDED(loadTypeInfo()) )
1301 return DispGetIDsOfNames(_p_typeinfo, rgszNames, cNames, rgDispID);
1306 STDMETHODIMP VLCMessage::Invoke(DISPID dispIdMember, REFIID riid,
1307 LCID lcid, WORD wFlags, DISPPARAMS* pDispParams,
1308 VARIANT* pVarResult, EXCEPINFO* pExcepInfo, UINT* puArgErr)
1310 if( SUCCEEDED(loadTypeInfo()) )
1312 return DispInvoke(this, _p_typeinfo, dispIdMember, wFlags, pDispParams,
1313 pVarResult, pExcepInfo, puArgErr);
1318 inline const char *msgSeverity(int sev)
1333 STDMETHODIMP VLCMessage::get__Value(VARIANT* _Value)
1335 if( NULL == _Value )
1340 snprintf(buffer, sizeof(buffer), "%s %s %s: %s",
1341 _msg.psz_type, _msg.psz_name, msgSeverity(_msg.i_severity), _msg.psz_message);
1343 V_VT(_Value) = VT_BSTR;
1344 V_BSTR(_Value) = BSTRFromCStr(CP_UTF8, buffer);
1349 STDMETHODIMP VLCMessage::get_severity(long* level)
1354 *level = _msg.i_severity;
1359 STDMETHODIMP VLCMessage::get_type(BSTR* type)
1364 *type = BSTRFromCStr(CP_UTF8, _msg.psz_type);
1369 STDMETHODIMP VLCMessage::get_name(BSTR* name)
1374 *name = BSTRFromCStr(CP_UTF8, _msg.psz_name);
1379 STDMETHODIMP VLCMessage::get_header(BSTR* header)
1381 if( NULL == header )
1384 *header = BSTRFromCStr(CP_UTF8, _msg.psz_header);
1389 STDMETHODIMP VLCMessage::get_message(BSTR* message)
1391 if( NULL == message )
1394 *message = BSTRFromCStr(CP_UTF8, _msg.psz_message);
1399 /*******************************************************************************/
1401 VLCPlaylistItems::~VLCPlaylistItems()
1404 _p_typeinfo->Release();
1407 HRESULT VLCPlaylistItems::loadTypeInfo(void)
1409 HRESULT hr = NOERROR;
1410 if( NULL == _p_typeinfo )
1412 ITypeLib *p_typelib;
1414 hr = _p_instance->getTypeLib(LOCALE_USER_DEFAULT, &p_typelib);
1417 hr = p_typelib->GetTypeInfoOfGuid(IID_IVLCPlaylistItems, &_p_typeinfo);
1422 p_typelib->Release();
1428 STDMETHODIMP VLCPlaylistItems::GetTypeInfoCount(UINT* pctInfo)
1430 if( NULL == pctInfo )
1431 return E_INVALIDARG;
1433 if( SUCCEEDED(loadTypeInfo()) )
1441 STDMETHODIMP VLCPlaylistItems::GetTypeInfo(UINT iTInfo, LCID lcid, LPTYPEINFO* ppTInfo)
1443 if( NULL == ppTInfo )
1444 return E_INVALIDARG;
1446 if( SUCCEEDED(loadTypeInfo()) )
1448 _p_typeinfo->AddRef();
1449 *ppTInfo = _p_typeinfo;
1456 STDMETHODIMP VLCPlaylistItems::GetIDsOfNames(REFIID riid, LPOLESTR* rgszNames,
1457 UINT cNames, LCID lcid, DISPID* rgDispID)
1459 if( SUCCEEDED(loadTypeInfo()) )
1461 return DispGetIDsOfNames(_p_typeinfo, rgszNames, cNames, rgDispID);
1466 STDMETHODIMP VLCPlaylistItems::Invoke(DISPID dispIdMember, REFIID riid,
1467 LCID lcid, WORD wFlags, DISPPARAMS* pDispParams,
1468 VARIANT* pVarResult, EXCEPINFO* pExcepInfo, UINT* puArgErr)
1470 if( SUCCEEDED(loadTypeInfo()) )
1472 return DispInvoke(this, _p_typeinfo, dispIdMember, wFlags, pDispParams,
1473 pVarResult, pExcepInfo, puArgErr);
1478 STDMETHODIMP VLCPlaylistItems::get_count(long* count)
1483 libvlc_instance_t* p_libvlc;
1484 HRESULT hr = _p_instance->getVLC(&p_libvlc);
1487 libvlc_exception_t ex;
1488 libvlc_exception_init(&ex);
1490 *count = libvlc_playlist_items_count(p_libvlc, &ex);
1491 if( libvlc_exception_raised(&ex) )
1493 _p_instance->setErrorInfo(IID_IVLCPlaylistItems,
1494 libvlc_exception_get_message(&ex));
1495 libvlc_exception_clear(&ex);
1503 STDMETHODIMP VLCPlaylistItems::clear()
1505 libvlc_instance_t* p_libvlc;
1506 HRESULT hr = _p_instance->getVLC(&p_libvlc);
1509 libvlc_exception_t ex;
1510 libvlc_exception_init(&ex);
1512 libvlc_playlist_clear(p_libvlc, &ex);
1513 if( libvlc_exception_raised(&ex) )
1515 _p_instance->setErrorInfo(IID_IVLCPlaylistItems,
1516 libvlc_exception_get_message(&ex));
1517 libvlc_exception_clear(&ex);
1525 STDMETHODIMP VLCPlaylistItems::remove(long item)
1527 libvlc_instance_t* p_libvlc;
1528 HRESULT hr = _p_instance->getVLC(&p_libvlc);
1531 libvlc_exception_t ex;
1532 libvlc_exception_init(&ex);
1534 libvlc_playlist_delete_item(p_libvlc, item, &ex);
1535 if( libvlc_exception_raised(&ex) )
1537 _p_instance->setErrorInfo(IID_IVLCPlaylistItems,
1538 libvlc_exception_get_message(&ex));
1539 libvlc_exception_clear(&ex);
1547 /*******************************************************************************/
1549 VLCPlaylist::~VLCPlaylist()
1551 delete _p_vlcplaylistitems;
1553 _p_typeinfo->Release();
1556 HRESULT VLCPlaylist::loadTypeInfo(void)
1558 HRESULT hr = NOERROR;
1559 if( NULL == _p_typeinfo )
1561 ITypeLib *p_typelib;
1563 hr = _p_instance->getTypeLib(LOCALE_USER_DEFAULT, &p_typelib);
1566 hr = p_typelib->GetTypeInfoOfGuid(IID_IVLCPlaylist, &_p_typeinfo);
1571 p_typelib->Release();
1577 STDMETHODIMP VLCPlaylist::GetTypeInfoCount(UINT* pctInfo)
1579 if( NULL == pctInfo )
1580 return E_INVALIDARG;
1582 if( SUCCEEDED(loadTypeInfo()) )
1590 STDMETHODIMP VLCPlaylist::GetTypeInfo(UINT iTInfo, LCID lcid, LPTYPEINFO* ppTInfo)
1592 if( NULL == ppTInfo )
1593 return E_INVALIDARG;
1595 if( SUCCEEDED(loadTypeInfo()) )
1597 _p_typeinfo->AddRef();
1598 *ppTInfo = _p_typeinfo;
1605 STDMETHODIMP VLCPlaylist::GetIDsOfNames(REFIID riid, LPOLESTR* rgszNames,
1606 UINT cNames, LCID lcid, DISPID* rgDispID)
1608 if( SUCCEEDED(loadTypeInfo()) )
1610 return DispGetIDsOfNames(_p_typeinfo, rgszNames, cNames, rgDispID);
1615 STDMETHODIMP VLCPlaylist::Invoke(DISPID dispIdMember, REFIID riid,
1616 LCID lcid, WORD wFlags, DISPPARAMS* pDispParams,
1617 VARIANT* pVarResult, EXCEPINFO* pExcepInfo, UINT* puArgErr)
1619 if( SUCCEEDED(loadTypeInfo()) )
1621 return DispInvoke(this, _p_typeinfo, dispIdMember, wFlags, pDispParams,
1622 pVarResult, pExcepInfo, puArgErr);
1627 STDMETHODIMP VLCPlaylist::get_itemCount(long* count)
1632 libvlc_instance_t* p_libvlc;
1633 HRESULT hr = _p_instance->getVLC(&p_libvlc);
1636 libvlc_exception_t ex;
1637 libvlc_exception_init(&ex);
1639 *count = libvlc_playlist_items_count(p_libvlc, &ex);
1640 if( libvlc_exception_raised(&ex) )
1642 _p_instance->setErrorInfo(IID_IVLCPlaylist,
1643 libvlc_exception_get_message(&ex));
1644 libvlc_exception_clear(&ex);
1652 STDMETHODIMP VLCPlaylist::get_isPlaying(VARIANT_BOOL* isPlaying)
1654 if( NULL == isPlaying )
1657 libvlc_instance_t* p_libvlc;
1658 HRESULT hr = _p_instance->getVLC(&p_libvlc);
1661 libvlc_exception_t ex;
1662 libvlc_exception_init(&ex);
1664 *isPlaying = libvlc_playlist_isplaying(p_libvlc, &ex) ? VARIANT_TRUE: VARIANT_FALSE;
1665 if( libvlc_exception_raised(&ex) )
1667 _p_instance->setErrorInfo(IID_IVLCPlaylist,
1668 libvlc_exception_get_message(&ex));
1669 libvlc_exception_clear(&ex);
1677 STDMETHODIMP VLCPlaylist::add(BSTR uri, VARIANT name, VARIANT options, long* item)
1682 if( 0 == SysStringLen(uri) )
1683 return E_INVALIDARG;
1685 libvlc_instance_t* p_libvlc;
1686 HRESULT hr = _p_instance->getVLC(&p_libvlc);
1689 libvlc_exception_t ex;
1690 libvlc_exception_init(&ex);
1692 char *psz_uri = NULL;
1693 if( SysStringLen(_p_instance->getBaseURL()) > 0 )
1696 ** if the MRL a relative URL, we should end up with an absolute URL
1698 LPWSTR abs_url = CombineURL(_p_instance->getBaseURL(), uri);
1699 if( NULL != abs_url )
1701 psz_uri = CStrFromWSTR(CP_UTF8, abs_url, wcslen(abs_url));
1702 CoTaskMemFree(abs_url);
1706 psz_uri = CStrFromBSTR(CP_UTF8, uri);
1712 ** baseURL is empty, assume MRL is absolute
1714 psz_uri = CStrFromBSTR(CP_UTF8, uri);
1717 if( NULL == psz_uri )
1719 return E_OUTOFMEMORY;
1723 char **ppsz_options;
1725 hr = VLCControl::CreateTargetOptions(CP_UTF8, &options, &ppsz_options, &i_options);
1728 CoTaskMemFree(psz_uri);
1732 char *psz_name = NULL;
1734 VariantInit(&v_name);
1735 if( SUCCEEDED(VariantChangeType(&v_name, &name, 0, VT_BSTR)) )
1737 if( SysStringLen(V_BSTR(&v_name)) > 0 )
1738 psz_name = CStrFromBSTR(CP_UTF8, V_BSTR(&v_name));
1740 VariantClear(&v_name);
1743 *item = libvlc_playlist_add_extended(p_libvlc,
1747 const_cast<const char **>(ppsz_options),
1750 VLCControl::FreeTargetOptions(ppsz_options, i_options);
1751 CoTaskMemFree(psz_uri);
1753 CoTaskMemFree(psz_name);
1754 if( libvlc_exception_raised(&ex) )
1756 _p_instance->setErrorInfo(IID_IVLCPlaylist,
1757 libvlc_exception_get_message(&ex));
1758 libvlc_exception_clear(&ex);
1766 STDMETHODIMP VLCPlaylist::play()
1768 libvlc_instance_t* p_libvlc;
1769 HRESULT hr = _p_instance->getVLC(&p_libvlc);
1772 libvlc_exception_t ex;
1773 libvlc_exception_init(&ex);
1775 libvlc_playlist_play(p_libvlc, -1, 0, NULL, &ex);
1776 if( libvlc_exception_raised(&ex) )
1778 libvlc_exception_clear(&ex);
1786 STDMETHODIMP VLCPlaylist::playItem(long item)
1788 libvlc_instance_t* p_libvlc;
1789 HRESULT hr = _p_instance->getVLC(&p_libvlc);
1792 libvlc_exception_t ex;
1793 libvlc_exception_init(&ex);
1795 libvlc_playlist_play(p_libvlc, item, 0, NULL, &ex);
1796 if( libvlc_exception_raised(&ex) )
1798 _p_instance->setErrorInfo(IID_IVLCPlaylist,
1799 libvlc_exception_get_message(&ex));
1800 libvlc_exception_clear(&ex);
1808 STDMETHODIMP VLCPlaylist::togglePause()
1810 libvlc_instance_t* p_libvlc;
1811 HRESULT hr = _p_instance->getVLC(&p_libvlc);
1814 libvlc_exception_t ex;
1815 libvlc_exception_init(&ex);
1817 libvlc_playlist_pause(p_libvlc, &ex);
1818 if( libvlc_exception_raised(&ex) )
1820 _p_instance->setErrorInfo(IID_IVLCPlaylist,
1821 libvlc_exception_get_message(&ex));
1822 libvlc_exception_clear(&ex);
1830 STDMETHODIMP VLCPlaylist::stop()
1832 libvlc_instance_t* p_libvlc;
1833 HRESULT hr = _p_instance->getVLC(&p_libvlc);
1836 libvlc_exception_t ex;
1837 libvlc_exception_init(&ex);
1839 libvlc_playlist_stop(p_libvlc, &ex);
1840 if( libvlc_exception_raised(&ex) )
1842 _p_instance->setErrorInfo(IID_IVLCPlaylist,
1843 libvlc_exception_get_message(&ex));
1844 libvlc_exception_clear(&ex);
1852 STDMETHODIMP VLCPlaylist::next()
1854 libvlc_instance_t* p_libvlc;
1855 HRESULT hr = _p_instance->getVLC(&p_libvlc);
1858 libvlc_exception_t ex;
1859 libvlc_exception_init(&ex);
1861 libvlc_playlist_next(p_libvlc, &ex);
1862 if( libvlc_exception_raised(&ex) )
1864 _p_instance->setErrorInfo(IID_IVLCPlaylist,
1865 libvlc_exception_get_message(&ex));
1866 libvlc_exception_clear(&ex);
1874 STDMETHODIMP VLCPlaylist::prev()
1876 libvlc_instance_t* p_libvlc;
1877 HRESULT hr = _p_instance->getVLC(&p_libvlc);
1880 libvlc_exception_t ex;
1881 libvlc_exception_init(&ex);
1883 libvlc_playlist_prev(p_libvlc, &ex);
1884 if( libvlc_exception_raised(&ex) )
1886 _p_instance->setErrorInfo(IID_IVLCPlaylist,
1887 libvlc_exception_get_message(&ex));
1888 libvlc_exception_clear(&ex);
1896 STDMETHODIMP VLCPlaylist::clear()
1898 libvlc_instance_t* p_libvlc;
1899 HRESULT hr = _p_instance->getVLC(&p_libvlc);
1902 libvlc_exception_t ex;
1903 libvlc_exception_init(&ex);
1905 libvlc_playlist_clear(p_libvlc, &ex);
1906 if( libvlc_exception_raised(&ex) )
1908 _p_instance->setErrorInfo(IID_IVLCPlaylist,
1909 libvlc_exception_get_message(&ex));
1910 libvlc_exception_clear(&ex);
1918 STDMETHODIMP VLCPlaylist::removeItem(long item)
1920 libvlc_instance_t* p_libvlc;
1921 HRESULT hr = _p_instance->getVLC(&p_libvlc);
1924 libvlc_exception_t ex;
1925 libvlc_exception_init(&ex);
1927 libvlc_playlist_delete_item(p_libvlc, item, &ex);
1928 if( libvlc_exception_raised(&ex) )
1930 _p_instance->setErrorInfo(IID_IVLCPlaylist,
1931 libvlc_exception_get_message(&ex));
1932 libvlc_exception_clear(&ex);
1940 STDMETHODIMP VLCPlaylist::get_items(IVLCPlaylistItems** obj)
1945 *obj = _p_vlcplaylistitems;
1946 if( NULL != _p_vlcplaylistitems )
1948 _p_vlcplaylistitems->AddRef();
1951 return E_OUTOFMEMORY;
1954 /*******************************************************************************/
1956 VLCVideo::~VLCVideo()
1959 _p_typeinfo->Release();
1962 HRESULT VLCVideo::loadTypeInfo(void)
1964 HRESULT hr = NOERROR;
1965 if( NULL == _p_typeinfo )
1967 ITypeLib *p_typelib;
1969 hr = _p_instance->getTypeLib(LOCALE_USER_DEFAULT, &p_typelib);
1972 hr = p_typelib->GetTypeInfoOfGuid(IID_IVLCVideo, &_p_typeinfo);
1977 p_typelib->Release();
1983 STDMETHODIMP VLCVideo::GetTypeInfoCount(UINT* pctInfo)
1985 if( NULL == pctInfo )
1986 return E_INVALIDARG;
1988 if( SUCCEEDED(loadTypeInfo()) )
1996 STDMETHODIMP VLCVideo::GetTypeInfo(UINT iTInfo, LCID lcid, LPTYPEINFO* ppTInfo)
1998 if( NULL == ppTInfo )
1999 return E_INVALIDARG;
2001 if( SUCCEEDED(loadTypeInfo()) )
2003 _p_typeinfo->AddRef();
2004 *ppTInfo = _p_typeinfo;
2011 STDMETHODIMP VLCVideo::GetIDsOfNames(REFIID riid, LPOLESTR* rgszNames,
2012 UINT cNames, LCID lcid, DISPID* rgDispID)
2014 if( SUCCEEDED(loadTypeInfo()) )
2016 return DispGetIDsOfNames(_p_typeinfo, rgszNames, cNames, rgDispID);
2021 STDMETHODIMP VLCVideo::Invoke(DISPID dispIdMember, REFIID riid,
2022 LCID lcid, WORD wFlags, DISPPARAMS* pDispParams,
2023 VARIANT* pVarResult, EXCEPINFO* pExcepInfo, UINT* puArgErr)
2025 if( SUCCEEDED(loadTypeInfo()) )
2027 return DispInvoke(this, _p_typeinfo, dispIdMember, wFlags, pDispParams,
2028 pVarResult, pExcepInfo, puArgErr);
2033 STDMETHODIMP VLCVideo::get_fullscreen(VARIANT_BOOL* fullscreen)
2035 if( NULL == fullscreen )
2038 libvlc_instance_t* p_libvlc;
2039 HRESULT hr = _p_instance->getVLC(&p_libvlc);
2042 libvlc_exception_t ex;
2043 libvlc_exception_init(&ex);
2045 libvlc_input_t *p_input = libvlc_playlist_get_input(p_libvlc, &ex);
2046 if( ! libvlc_exception_raised(&ex) )
2048 *fullscreen = libvlc_get_fullscreen(p_input, &ex) ? VARIANT_TRUE : VARIANT_FALSE;
2049 libvlc_input_free(p_input);
2050 if( ! libvlc_exception_raised(&ex) )
2055 _p_instance->setErrorInfo(IID_IVLCVideo, libvlc_exception_get_message(&ex));
2056 libvlc_exception_clear(&ex);
2062 STDMETHODIMP VLCVideo::put_fullscreen(VARIANT_BOOL fullscreen)
2064 libvlc_instance_t* p_libvlc;
2065 HRESULT hr = _p_instance->getVLC(&p_libvlc);
2068 libvlc_exception_t ex;
2069 libvlc_exception_init(&ex);
2071 libvlc_input_t *p_input = libvlc_playlist_get_input(p_libvlc, &ex);
2072 if( ! libvlc_exception_raised(&ex) )
2074 libvlc_set_fullscreen(p_input, VARIANT_FALSE != fullscreen, &ex);
2075 libvlc_input_free(p_input);
2076 if( ! libvlc_exception_raised(&ex) )
2081 _p_instance->setErrorInfo(IID_IVLCVideo, libvlc_exception_get_message(&ex));
2082 libvlc_exception_clear(&ex);
2088 STDMETHODIMP VLCVideo::get_width(long* width)
2093 libvlc_instance_t* p_libvlc;
2094 HRESULT hr = _p_instance->getVLC(&p_libvlc);
2097 libvlc_exception_t ex;
2098 libvlc_exception_init(&ex);
2100 libvlc_input_t *p_input = libvlc_playlist_get_input(p_libvlc, &ex);
2101 if( ! libvlc_exception_raised(&ex) )
2103 *width = libvlc_video_get_width(p_input, &ex);
2104 libvlc_input_free(p_input);
2105 if( ! libvlc_exception_raised(&ex) )
2110 _p_instance->setErrorInfo(IID_IVLCVideo, libvlc_exception_get_message(&ex));
2111 libvlc_exception_clear(&ex);
2117 STDMETHODIMP VLCVideo::get_height(long* height)
2119 if( NULL == height )
2122 libvlc_instance_t* p_libvlc;
2123 HRESULT hr = _p_instance->getVLC(&p_libvlc);
2126 libvlc_exception_t ex;
2127 libvlc_exception_init(&ex);
2129 libvlc_input_t *p_input = libvlc_playlist_get_input(p_libvlc, &ex);
2130 if( ! libvlc_exception_raised(&ex) )
2132 *height = libvlc_video_get_height(p_input, &ex);
2133 libvlc_input_free(p_input);
2134 if( ! libvlc_exception_raised(&ex) )
2139 _p_instance->setErrorInfo(IID_IVLCVideo, libvlc_exception_get_message(&ex));
2140 libvlc_exception_clear(&ex);
2146 STDMETHODIMP VLCVideo::get_aspectRatio(BSTR* aspect)
2148 if( NULL == aspect )
2151 libvlc_instance_t* p_libvlc;
2152 HRESULT hr = _p_instance->getVLC(&p_libvlc);
2155 libvlc_exception_t ex;
2156 libvlc_exception_init(&ex);
2158 libvlc_input_t *p_input = libvlc_playlist_get_input(p_libvlc, &ex);
2159 if( ! libvlc_exception_raised(&ex) )
2161 char *psz_aspect = libvlc_video_get_aspect_ratio(p_input, &ex);
2163 libvlc_input_free(p_input);
2164 if( ! libvlc_exception_raised(&ex) )
2166 if( NULL == psz_aspect )
2167 return E_OUTOFMEMORY;
2169 *aspect = BSTRFromCStr(CP_UTF8, psz_aspect);
2172 return (NULL == *aspect) ? E_OUTOFMEMORY : NOERROR;
2174 if( psz_aspect ) free( psz_aspect );
2177 _p_instance->setErrorInfo(IID_IVLCVideo, libvlc_exception_get_message(&ex));
2178 libvlc_exception_clear(&ex);
2184 STDMETHODIMP VLCVideo::put_aspectRatio(BSTR aspect)
2186 if( NULL == aspect )
2189 if( 0 == SysStringLen(aspect) )
2190 return E_INVALIDARG;
2192 libvlc_instance_t* p_libvlc;
2193 HRESULT hr = _p_instance->getVLC(&p_libvlc);
2196 libvlc_exception_t ex;
2197 libvlc_exception_init(&ex);
2199 libvlc_input_t *p_input = libvlc_playlist_get_input(p_libvlc, &ex);
2200 if( ! libvlc_exception_raised(&ex) )
2202 char *psz_aspect = CStrFromBSTR(CP_UTF8, aspect);
2203 if( NULL == psz_aspect )
2205 return E_OUTOFMEMORY;
2208 libvlc_video_set_aspect_ratio(p_input, psz_aspect, &ex);
2210 CoTaskMemFree(psz_aspect);
2211 libvlc_input_free(p_input);
2212 if( libvlc_exception_raised(&ex) )
2214 _p_instance->setErrorInfo(IID_IVLCVideo,
2215 libvlc_exception_get_message(&ex));
2216 libvlc_exception_clear(&ex);
2225 STDMETHODIMP VLCVideo::get_subtitle(long* spu)
2230 libvlc_instance_t* p_libvlc;
2231 HRESULT hr = _p_instance->getVLC(&p_libvlc);
2234 libvlc_exception_t ex;
2235 libvlc_exception_init(&ex);
2237 libvlc_input_t *p_input = libvlc_playlist_get_input(p_libvlc, &ex);
2238 if( ! libvlc_exception_raised(&ex) )
2240 *spu = libvlc_video_get_spu(p_input, &ex);
2241 libvlc_input_free(p_input);
2242 if( ! libvlc_exception_raised(&ex) )
2247 _p_instance->setErrorInfo(IID_IVLCVideo, libvlc_exception_get_message(&ex));
2248 libvlc_exception_clear(&ex);
2254 STDMETHODIMP VLCVideo::put_subtitle(long spu)
2256 libvlc_instance_t* p_libvlc;
2257 HRESULT hr = _p_instance->getVLC(&p_libvlc);
2260 libvlc_exception_t ex;
2261 libvlc_exception_init(&ex);
2263 libvlc_input_t *p_input = libvlc_playlist_get_input(p_libvlc, &ex);
2264 libvlc_video_set_spu(p_input, spu, &ex);
2265 libvlc_input_free(p_input);
2266 if( libvlc_exception_raised(&ex) )
2268 _p_instance->setErrorInfo(IID_IVLCVideo, libvlc_exception_get_message(&ex));
2269 libvlc_exception_clear(&ex);
2277 STDMETHODIMP VLCVideo::get_crop(BSTR* geometry)
2279 if( NULL == geometry )
2282 libvlc_instance_t* p_libvlc;
2283 HRESULT hr = _p_instance->getVLC(&p_libvlc);
2286 libvlc_exception_t ex;
2287 libvlc_exception_init(&ex);
2289 libvlc_input_t *p_input = libvlc_playlist_get_input(p_libvlc, &ex);
2290 if( ! libvlc_exception_raised(&ex) )
2292 char *psz_geometry = libvlc_video_get_crop_geometry(p_input, &ex);
2294 libvlc_input_free(p_input);
2295 if( ! libvlc_exception_raised(&ex) )
2297 if( NULL == psz_geometry )
2298 return E_OUTOFMEMORY;
2300 *geometry = BSTRFromCStr(CP_UTF8, psz_geometry);
2301 free( psz_geometry );
2302 psz_geometry = NULL;
2303 return (NULL == geometry) ? E_OUTOFMEMORY : NOERROR;
2305 if( psz_geometry ) free( psz_geometry );
2306 psz_geometry = NULL;
2308 _p_instance->setErrorInfo(IID_IVLCVideo, libvlc_exception_get_message(&ex));
2309 libvlc_exception_clear(&ex);
2315 STDMETHODIMP VLCVideo::put_crop(BSTR geometry)
2317 if( NULL == geometry )
2320 if( 0 == SysStringLen(geometry) )
2321 return E_INVALIDARG;
2323 libvlc_instance_t* p_libvlc;
2324 HRESULT hr = _p_instance->getVLC(&p_libvlc);
2327 libvlc_exception_t ex;
2328 libvlc_exception_init(&ex);
2330 libvlc_input_t *p_input = libvlc_playlist_get_input(p_libvlc, &ex);
2331 if( ! libvlc_exception_raised(&ex) )
2333 char *psz_geometry = CStrFromBSTR(CP_UTF8, geometry);
2334 if( NULL == psz_geometry )
2336 return E_OUTOFMEMORY;
2339 libvlc_video_set_crop_geometry(p_input, psz_geometry, &ex);
2341 CoTaskMemFree(psz_geometry);
2342 libvlc_input_free(p_input);
2343 if( libvlc_exception_raised(&ex) )
2345 _p_instance->setErrorInfo(IID_IVLCVideo,
2346 libvlc_exception_get_message(&ex));
2347 libvlc_exception_clear(&ex);
2356 STDMETHODIMP VLCVideo::takeSnapshot(BSTR filePath)
2358 if( NULL == filePath )
2361 if( 0 == SysStringLen(filePath) )
2362 return E_INVALIDARG;
2364 libvlc_instance_t* p_libvlc;
2365 HRESULT hr = _p_instance->getVLC(&p_libvlc);
2368 libvlc_exception_t ex;
2369 libvlc_exception_init(&ex);
2371 libvlc_input_t *p_input = libvlc_playlist_get_input(p_libvlc, &ex);
2372 if( ! libvlc_exception_raised(&ex) )
2374 char *psz_filepath = CStrFromBSTR(CP_UTF8, filePath);
2375 if( NULL == psz_filepath )
2377 return E_OUTOFMEMORY;
2379 /* TODO: check file security */
2381 libvlc_video_take_snapshot(p_input, psz_filepath, &ex);
2382 libvlc_input_free(p_input);
2383 if( ! libvlc_exception_raised(&ex) )
2388 _p_instance->setErrorInfo(IID_IVLCVideo, libvlc_exception_get_message(&ex));
2389 libvlc_exception_clear(&ex);
2395 STDMETHODIMP VLCVideo::toggleFullscreen()
2397 libvlc_instance_t* p_libvlc;
2398 HRESULT hr = _p_instance->getVLC(&p_libvlc);
2401 libvlc_exception_t ex;
2402 libvlc_exception_init(&ex);
2404 libvlc_input_t *p_input = libvlc_playlist_get_input(p_libvlc, &ex);
2405 if( ! libvlc_exception_raised(&ex) )
2407 libvlc_toggle_fullscreen(p_input, &ex);
2408 libvlc_input_free(p_input);
2409 if( ! libvlc_exception_raised(&ex) )
2414 _p_instance->setErrorInfo(IID_IVLCVideo, libvlc_exception_get_message(&ex));
2415 libvlc_exception_clear(&ex);
2421 /*******************************************************************************/
2423 VLCControl2::VLCControl2(VLCPlugin *p_instance) :
2424 _p_instance(p_instance),
2428 _p_vlcplaylist(NULL),
2431 _p_vlcaudio = new VLCAudio(p_instance);
2432 _p_vlcinput = new VLCInput(p_instance);
2433 _p_vlclog = new VLCLog(p_instance);
2434 _p_vlcplaylist = new VLCPlaylist(p_instance);
2435 _p_vlcvideo = new VLCVideo(p_instance);
2438 VLCControl2::~VLCControl2()
2441 delete _p_vlcplaylist;
2446 _p_typeinfo->Release();
2449 HRESULT VLCControl2::loadTypeInfo(void)
2451 HRESULT hr = NOERROR;
2452 if( NULL == _p_typeinfo )
2454 ITypeLib *p_typelib;
2456 hr = _p_instance->getTypeLib(LOCALE_USER_DEFAULT, &p_typelib);
2459 hr = p_typelib->GetTypeInfoOfGuid(IID_IVLCControl2, &_p_typeinfo);
2464 p_typelib->Release();
2470 STDMETHODIMP VLCControl2::GetTypeInfoCount(UINT* pctInfo)
2472 if( NULL == pctInfo )
2473 return E_INVALIDARG;
2475 if( SUCCEEDED(loadTypeInfo()) )
2483 STDMETHODIMP VLCControl2::GetTypeInfo(UINT iTInfo, LCID lcid, LPTYPEINFO* ppTInfo)
2485 if( NULL == ppTInfo )
2486 return E_INVALIDARG;
2488 if( SUCCEEDED(loadTypeInfo()) )
2490 _p_typeinfo->AddRef();
2491 *ppTInfo = _p_typeinfo;
2498 STDMETHODIMP VLCControl2::GetIDsOfNames(REFIID riid, LPOLESTR* rgszNames,
2499 UINT cNames, LCID lcid, DISPID* rgDispID)
2501 if( SUCCEEDED(loadTypeInfo()) )
2503 return DispGetIDsOfNames(_p_typeinfo, rgszNames, cNames, rgDispID);
2508 STDMETHODIMP VLCControl2::Invoke(DISPID dispIdMember, REFIID riid,
2509 LCID lcid, WORD wFlags, DISPPARAMS* pDispParams,
2510 VARIANT* pVarResult, EXCEPINFO* pExcepInfo, UINT* puArgErr)
2512 if( SUCCEEDED(loadTypeInfo()) )
2514 return DispInvoke(this, _p_typeinfo, dispIdMember, wFlags, pDispParams,
2515 pVarResult, pExcepInfo, puArgErr);
2520 STDMETHODIMP VLCControl2::get_AutoLoop(VARIANT_BOOL *autoloop)
2522 if( NULL == autoloop )
2525 *autoloop = _p_instance->getAutoLoop() ? VARIANT_TRUE: VARIANT_FALSE;
2529 STDMETHODIMP VLCControl2::put_AutoLoop(VARIANT_BOOL autoloop)
2531 _p_instance->setAutoLoop((VARIANT_FALSE != autoloop) ? TRUE: FALSE);
2535 STDMETHODIMP VLCControl2::get_AutoPlay(VARIANT_BOOL *autoplay)
2537 if( NULL == autoplay )
2540 *autoplay = _p_instance->getAutoPlay() ? VARIANT_TRUE: VARIANT_FALSE;
2544 STDMETHODIMP VLCControl2::put_AutoPlay(VARIANT_BOOL autoplay)
2546 _p_instance->setAutoPlay((VARIANT_FALSE != autoplay) ? TRUE: FALSE);
2550 STDMETHODIMP VLCControl2::get_BaseURL(BSTR *url)
2555 *url = SysAllocStringLen(_p_instance->getBaseURL(),
2556 SysStringLen(_p_instance->getBaseURL()));
2560 STDMETHODIMP VLCControl2::put_BaseURL(BSTR mrl)
2562 _p_instance->setBaseURL(mrl);
2567 STDMETHODIMP VLCControl2::get_MRL(BSTR *mrl)
2572 *mrl = SysAllocStringLen(_p_instance->getMRL(),
2573 SysStringLen(_p_instance->getMRL()));
2577 STDMETHODIMP VLCControl2::put_MRL(BSTR mrl)
2579 _p_instance->setMRL(mrl);
2584 STDMETHODIMP VLCControl2::get_StartTime(long *seconds)
2586 if( NULL == seconds )
2589 *seconds = _p_instance->getStartTime();
2594 STDMETHODIMP VLCControl2::put_StartTime(long seconds)
2596 _p_instance->setStartTime(seconds);
2601 STDMETHODIMP VLCControl2::get_VersionInfo(BSTR *version)
2603 if( NULL == version )
2606 const char *versionStr = VLC_Version();
2607 if( NULL != versionStr )
2609 *version = BSTRFromCStr(CP_UTF8, versionStr);
2611 return NULL == *version ? E_OUTOFMEMORY : NOERROR;
2617 STDMETHODIMP VLCControl2::get_Visible(VARIANT_BOOL *isVisible)
2619 if( NULL == isVisible )
2622 *isVisible = _p_instance->getVisible() ? VARIANT_TRUE : VARIANT_FALSE;
2627 STDMETHODIMP VLCControl2::put_Visible(VARIANT_BOOL isVisible)
2629 _p_instance->setVisible(isVisible != VARIANT_FALSE);
2634 STDMETHODIMP VLCControl2::get_Volume(long *volume)
2636 if( NULL == volume )
2639 *volume = _p_instance->getVolume();
2643 STDMETHODIMP VLCControl2::put_Volume(long volume)
2645 _p_instance->setVolume(volume);
2649 STDMETHODIMP VLCControl2::get_audio(IVLCAudio** obj)
2655 if( NULL != _p_vlcaudio )
2657 _p_vlcaudio->AddRef();
2660 return E_OUTOFMEMORY;
2663 STDMETHODIMP VLCControl2::get_input(IVLCInput** obj)
2669 if( NULL != _p_vlcinput )
2671 _p_vlcinput->AddRef();
2674 return E_OUTOFMEMORY;
2677 STDMETHODIMP VLCControl2::get_log(IVLCLog** obj)
2683 if( NULL != _p_vlclog )
2685 _p_vlclog->AddRef();
2688 return E_OUTOFMEMORY;
2691 STDMETHODIMP VLCControl2::get_playlist(IVLCPlaylist** obj)
2696 *obj = _p_vlcplaylist;
2697 if( NULL != _p_vlcplaylist )
2699 _p_vlcplaylist->AddRef();
2702 return E_OUTOFMEMORY;
2705 STDMETHODIMP VLCControl2::get_video(IVLCVideo** obj)
2711 if( NULL != _p_vlcvideo )
2713 _p_vlcvideo->AddRef();
2716 return E_OUTOFMEMORY;