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, libvlc_exception_get_message(&ex));
194 libvlc_exception_clear(&ex);
202 STDMETHODIMP VLCAudio::get_track(long* track)
207 libvlc_instance_t* p_libvlc;
208 HRESULT hr = _p_instance->getVLC(&p_libvlc);
211 libvlc_exception_t ex;
212 libvlc_exception_init(&ex);
214 libvlc_input_t *p_input = libvlc_playlist_get_input(p_libvlc, &ex);
215 *track = libvlc_audio_get_track(p_input, &ex);
216 libvlc_input_free(p_input);
217 if( libvlc_exception_raised(&ex) )
219 _p_instance->setErrorInfo(IID_IVLCAudio, libvlc_exception_get_message(&ex));
220 libvlc_exception_clear(&ex);
228 STDMETHODIMP VLCAudio::put_track(long track)
230 libvlc_instance_t* p_libvlc;
231 HRESULT hr = _p_instance->getVLC(&p_libvlc);
234 libvlc_exception_t ex;
235 libvlc_exception_init(&ex);
237 libvlc_input_t *p_input = libvlc_playlist_get_input(p_libvlc, &ex);
238 libvlc_audio_set_track(p_input, track, &ex);
239 libvlc_input_free(p_input);
240 if( libvlc_exception_raised(&ex) )
242 _p_instance->setErrorInfo(IID_IVLCAudio, libvlc_exception_get_message(&ex));
243 libvlc_exception_clear(&ex);
251 STDMETHODIMP VLCAudio::get_channel(BSTR *channel)
253 if( NULL == channel )
256 libvlc_instance_t* p_libvlc;
257 HRESULT hr = _p_instance->getVLC(&p_libvlc);
260 char *psz_channel = NULL;
261 libvlc_exception_t ex;
262 libvlc_exception_init(&ex);
264 psz_channel = libvlc_audio_get_channel(p_libvlc, &ex);
265 if( ! libvlc_exception_raised(&ex) )
267 if( NULL == psz_channel )
268 return E_OUTOFMEMORY;
270 *channel = BSTRFromCStr(CP_UTF8, psz_channel);
273 return (NULL == *channel) ? E_OUTOFMEMORY : NOERROR;
275 if( psz_channel ) free( psz_channel );
277 _p_instance->setErrorInfo(IID_IVLCAudio,
278 libvlc_exception_get_message(&ex));
279 libvlc_exception_clear(&ex);
285 STDMETHODIMP VLCAudio::put_channel(BSTR channel)
287 if( NULL == channel )
290 if( 0 == SysStringLen(channel) )
293 libvlc_instance_t* p_libvlc;
294 HRESULT hr = _p_instance->getVLC(&p_libvlc);
297 char *psz_channel = NULL;
298 libvlc_exception_t ex;
299 libvlc_exception_init(&ex);
301 psz_channel = CStrFromBSTR(CP_UTF8, channel);
302 if( NULL == psz_channel )
303 return E_OUTOFMEMORY;
305 libvlc_audio_set_channel(p_libvlc, psz_channel, &ex);
306 CoTaskMemFree(psz_channel);
307 if( libvlc_exception_raised(&ex) )
309 _p_instance->setErrorInfo(IID_IVLCAudio,
310 libvlc_exception_get_message(&ex));
311 libvlc_exception_clear(&ex);
319 STDMETHODIMP VLCAudio::toggleMute()
321 libvlc_instance_t* p_libvlc;
322 HRESULT hr = _p_instance->getVLC(&p_libvlc);
325 libvlc_exception_t ex;
326 libvlc_exception_init(&ex);
328 libvlc_audio_toggle_mute(p_libvlc, &ex);
329 if( libvlc_exception_raised(&ex) )
331 _p_instance->setErrorInfo(IID_IVLCAudio, libvlc_exception_get_message(&ex));
332 libvlc_exception_clear(&ex);
340 /*******************************************************************************/
342 VLCInput::~VLCInput()
345 _p_typeinfo->Release();
348 HRESULT VLCInput::loadTypeInfo(void)
350 HRESULT hr = NOERROR;
351 if( NULL == _p_typeinfo )
355 hr = _p_instance->getTypeLib(LOCALE_USER_DEFAULT, &p_typelib);
358 hr = p_typelib->GetTypeInfoOfGuid(IID_IVLCInput, &_p_typeinfo);
363 p_typelib->Release();
369 STDMETHODIMP VLCInput::GetTypeInfoCount(UINT* pctInfo)
371 if( NULL == pctInfo )
374 if( SUCCEEDED(loadTypeInfo()) )
382 STDMETHODIMP VLCInput::GetTypeInfo(UINT iTInfo, LCID lcid, LPTYPEINFO* ppTInfo)
384 if( NULL == ppTInfo )
387 if( SUCCEEDED(loadTypeInfo()) )
389 _p_typeinfo->AddRef();
390 *ppTInfo = _p_typeinfo;
397 STDMETHODIMP VLCInput::GetIDsOfNames(REFIID riid, LPOLESTR* rgszNames,
398 UINT cNames, LCID lcid, DISPID* rgDispID)
400 if( SUCCEEDED(loadTypeInfo()) )
402 return DispGetIDsOfNames(_p_typeinfo, rgszNames, cNames, rgDispID);
407 STDMETHODIMP VLCInput::Invoke(DISPID dispIdMember, REFIID riid,
408 LCID lcid, WORD wFlags, DISPPARAMS* pDispParams,
409 VARIANT* pVarResult, EXCEPINFO* pExcepInfo, UINT* puArgErr)
411 if( SUCCEEDED(loadTypeInfo()) )
413 return DispInvoke(this, _p_typeinfo, dispIdMember, wFlags, pDispParams,
414 pVarResult, pExcepInfo, puArgErr);
419 STDMETHODIMP VLCInput::get_length(double* length)
424 libvlc_instance_t* p_libvlc;
425 HRESULT hr = _p_instance->getVLC(&p_libvlc);
428 libvlc_exception_t ex;
429 libvlc_exception_init(&ex);
431 libvlc_input_t *p_input = libvlc_playlist_get_input(p_libvlc, &ex);
432 if( ! libvlc_exception_raised(&ex) )
434 *length = (double)libvlc_input_get_length(p_input, &ex);
435 libvlc_input_free(p_input);
436 if( ! libvlc_exception_raised(&ex) )
441 _p_instance->setErrorInfo(IID_IVLCInput, libvlc_exception_get_message(&ex));
442 libvlc_exception_clear(&ex);
448 STDMETHODIMP VLCInput::get_position(double* position)
450 if( NULL == position )
453 libvlc_instance_t* p_libvlc;
454 HRESULT hr = _p_instance->getVLC(&p_libvlc);
457 libvlc_exception_t ex;
458 libvlc_exception_init(&ex);
460 libvlc_input_t *p_input = libvlc_playlist_get_input(p_libvlc, &ex);
461 if( ! libvlc_exception_raised(&ex) )
463 *position = libvlc_input_get_position(p_input, &ex);
464 libvlc_input_free(p_input);
465 if( ! libvlc_exception_raised(&ex) )
470 _p_instance->setErrorInfo(IID_IVLCInput, libvlc_exception_get_message(&ex));
471 libvlc_exception_clear(&ex);
477 STDMETHODIMP VLCInput::put_position(double position)
479 libvlc_instance_t* p_libvlc;
480 HRESULT hr = _p_instance->getVLC(&p_libvlc);
483 libvlc_exception_t ex;
484 libvlc_exception_init(&ex);
486 libvlc_input_t *p_input = libvlc_playlist_get_input(p_libvlc, &ex);
487 if( ! libvlc_exception_raised(&ex) )
489 libvlc_input_set_position(p_input, position, &ex);
490 libvlc_input_free(p_input);
491 if( ! libvlc_exception_raised(&ex) )
496 _p_instance->setErrorInfo(IID_IVLCInput, libvlc_exception_get_message(&ex));
497 libvlc_exception_clear(&ex);
503 STDMETHODIMP VLCInput::get_time(double* time)
508 libvlc_instance_t* p_libvlc;
509 HRESULT hr = _p_instance->getVLC(&p_libvlc);
512 libvlc_exception_t ex;
513 libvlc_exception_init(&ex);
515 libvlc_input_t *p_input = libvlc_playlist_get_input(p_libvlc, &ex);
516 if( ! libvlc_exception_raised(&ex) )
518 *time = (double)libvlc_input_get_time(p_input, &ex);
519 libvlc_input_free(p_input);
520 if( ! libvlc_exception_raised(&ex) )
525 _p_instance->setErrorInfo(IID_IVLCInput, libvlc_exception_get_message(&ex));
526 libvlc_exception_clear(&ex);
532 STDMETHODIMP VLCInput::put_time(double time)
534 libvlc_instance_t* p_libvlc;
535 HRESULT hr = _p_instance->getVLC(&p_libvlc);
538 libvlc_exception_t ex;
539 libvlc_exception_init(&ex);
541 libvlc_input_t *p_input = libvlc_playlist_get_input(p_libvlc, &ex);
542 if( ! libvlc_exception_raised(&ex) )
544 libvlc_input_set_time(p_input, (vlc_int64_t)time, &ex);
545 libvlc_input_free(p_input);
546 if( ! libvlc_exception_raised(&ex) )
551 _p_instance->setErrorInfo(IID_IVLCInput, libvlc_exception_get_message(&ex));
552 libvlc_exception_clear(&ex);
558 STDMETHODIMP VLCInput::get_state(long* state)
563 libvlc_instance_t* p_libvlc;
564 HRESULT hr = _p_instance->getVLC(&p_libvlc);
567 libvlc_exception_t ex;
568 libvlc_exception_init(&ex);
570 libvlc_input_t *p_input = libvlc_playlist_get_input(p_libvlc, &ex);
571 if( ! libvlc_exception_raised(&ex) )
573 *state = libvlc_input_get_state(p_input, &ex);
574 libvlc_input_free(p_input);
575 if( ! libvlc_exception_raised(&ex) )
580 libvlc_exception_clear(&ex);
581 // don't fail, just return the idle state
588 STDMETHODIMP VLCInput::get_rate(double* rate)
593 libvlc_instance_t* p_libvlc;
594 HRESULT hr = _p_instance->getVLC(&p_libvlc);
597 libvlc_exception_t ex;
598 libvlc_exception_init(&ex);
600 libvlc_input_t *p_input = libvlc_playlist_get_input(p_libvlc, &ex);
601 if( ! libvlc_exception_raised(&ex) )
603 *rate = libvlc_input_get_rate(p_input, &ex);
604 libvlc_input_free(p_input);
605 if( ! libvlc_exception_raised(&ex) )
610 _p_instance->setErrorInfo(IID_IVLCInput, libvlc_exception_get_message(&ex));
611 libvlc_exception_clear(&ex);
617 STDMETHODIMP VLCInput::put_rate(double rate)
619 libvlc_instance_t* p_libvlc;
620 HRESULT hr = _p_instance->getVLC(&p_libvlc);
623 libvlc_exception_t ex;
624 libvlc_exception_init(&ex);
626 libvlc_input_t *p_input = libvlc_playlist_get_input(p_libvlc, &ex);
627 if( ! libvlc_exception_raised(&ex) )
629 libvlc_input_set_rate(p_input, rate, &ex);
630 libvlc_input_free(p_input);
631 if( ! libvlc_exception_raised(&ex) )
636 _p_instance->setErrorInfo(IID_IVLCInput, libvlc_exception_get_message(&ex));
637 libvlc_exception_clear(&ex);
643 STDMETHODIMP VLCInput::get_fps(double* fps)
648 libvlc_instance_t* p_libvlc;
649 HRESULT hr = _p_instance->getVLC(&p_libvlc);
652 libvlc_exception_t ex;
653 libvlc_exception_init(&ex);
655 libvlc_input_t *p_input = libvlc_playlist_get_input(p_libvlc, &ex);
656 if( ! libvlc_exception_raised(&ex) )
658 *fps = libvlc_input_get_fps(p_input, &ex);
659 libvlc_input_free(p_input);
660 if( ! libvlc_exception_raised(&ex) )
665 _p_instance->setErrorInfo(IID_IVLCInput, libvlc_exception_get_message(&ex));
666 libvlc_exception_clear(&ex);
672 STDMETHODIMP VLCInput::get_hasVout(VARIANT_BOOL* hasVout)
674 if( NULL == hasVout )
677 libvlc_instance_t* p_libvlc;
678 HRESULT hr = _p_instance->getVLC(&p_libvlc);
681 libvlc_exception_t ex;
682 libvlc_exception_init(&ex);
684 libvlc_input_t *p_input = libvlc_playlist_get_input(p_libvlc, &ex);
685 if( ! libvlc_exception_raised(&ex) )
687 *hasVout = libvlc_input_has_vout(p_input, &ex) ? VARIANT_TRUE : VARIANT_FALSE;
688 libvlc_input_free(p_input);
689 if( ! libvlc_exception_raised(&ex) )
694 _p_instance->setErrorInfo(IID_IVLCInput, libvlc_exception_get_message(&ex));
695 libvlc_exception_clear(&ex);
701 /*******************************************************************************/
705 delete _p_vlcmessages;
707 libvlc_log_close(_p_log, NULL);
710 _p_typeinfo->Release();
713 HRESULT VLCLog::loadTypeInfo(void)
715 HRESULT hr = NOERROR;
716 if( NULL == _p_typeinfo )
720 hr = _p_instance->getTypeLib(LOCALE_USER_DEFAULT, &p_typelib);
723 hr = p_typelib->GetTypeInfoOfGuid(IID_IVLCLog, &_p_typeinfo);
728 p_typelib->Release();
734 STDMETHODIMP VLCLog::GetTypeInfoCount(UINT* pctInfo)
736 if( NULL == pctInfo )
739 if( SUCCEEDED(loadTypeInfo()) )
747 STDMETHODIMP VLCLog::GetTypeInfo(UINT iTInfo, LCID lcid, LPTYPEINFO* ppTInfo)
749 if( NULL == ppTInfo )
752 if( SUCCEEDED(loadTypeInfo()) )
754 _p_typeinfo->AddRef();
755 *ppTInfo = _p_typeinfo;
762 STDMETHODIMP VLCLog::GetIDsOfNames(REFIID riid, LPOLESTR* rgszNames,
763 UINT cNames, LCID lcid, DISPID* rgDispID)
765 if( SUCCEEDED(loadTypeInfo()) )
767 return DispGetIDsOfNames(_p_typeinfo, rgszNames, cNames, rgDispID);
772 STDMETHODIMP VLCLog::Invoke(DISPID dispIdMember, REFIID riid,
773 LCID lcid, WORD wFlags, DISPPARAMS* pDispParams,
774 VARIANT* pVarResult, EXCEPINFO* pExcepInfo, UINT* puArgErr)
776 if( SUCCEEDED(loadTypeInfo()) )
778 return DispInvoke(this, _p_typeinfo, dispIdMember, wFlags, pDispParams,
779 pVarResult, pExcepInfo, puArgErr);
784 STDMETHODIMP VLCLog::get_messages(IVLCMessages** obj)
789 *obj = _p_vlcmessages;
790 if( NULL != _p_vlcmessages )
792 _p_vlcmessages->AddRef();
795 return E_OUTOFMEMORY;
798 STDMETHODIMP VLCLog::get_verbosity(long* level)
805 libvlc_instance_t* p_libvlc;
806 HRESULT hr = _p_instance->getVLC(&p_libvlc);
809 libvlc_exception_t ex;
810 libvlc_exception_init(&ex);
812 *level = libvlc_get_log_verbosity(p_libvlc, &ex);
813 if( libvlc_exception_raised(&ex) )
815 _p_instance->setErrorInfo(IID_IVLCLog, libvlc_exception_get_message(&ex));
816 libvlc_exception_clear(&ex);
824 /* log is not enabled, return -1 */
830 STDMETHODIMP VLCLog::put_verbosity(long verbosity)
832 libvlc_exception_t ex;
833 libvlc_exception_init(&ex);
835 libvlc_instance_t* p_libvlc;
836 HRESULT hr = _p_instance->getVLC(&p_libvlc);
843 _p_log = libvlc_log_open(p_libvlc, &ex);
844 if( libvlc_exception_raised(&ex) )
846 _p_instance->setErrorInfo(IID_IVLCLog, libvlc_exception_get_message(&ex));
847 libvlc_exception_clear(&ex);
851 libvlc_set_log_verbosity(p_libvlc, (unsigned)verbosity, &ex);
852 if( libvlc_exception_raised(&ex) )
854 _p_instance->setErrorInfo(IID_IVLCLog, libvlc_exception_get_message(&ex));
855 libvlc_exception_clear(&ex);
861 /* close log when verbosity is set to -1 */
862 libvlc_log_close(_p_log, &ex);
864 if( libvlc_exception_raised(&ex) )
866 _p_instance->setErrorInfo(IID_IVLCLog, libvlc_exception_get_message(&ex));
867 libvlc_exception_clear(&ex);
875 /*******************************************************************************/
877 VLCMessages::~VLCMessages()
880 _p_typeinfo->Release();
883 HRESULT VLCMessages::loadTypeInfo(void)
885 HRESULT hr = NOERROR;
886 if( NULL == _p_typeinfo )
890 hr = _p_instance->getTypeLib(LOCALE_USER_DEFAULT, &p_typelib);
893 hr = p_typelib->GetTypeInfoOfGuid(IID_IVLCMessages, &_p_typeinfo);
898 p_typelib->Release();
904 STDMETHODIMP VLCMessages::GetTypeInfoCount(UINT* pctInfo)
906 if( NULL == pctInfo )
909 if( SUCCEEDED(loadTypeInfo()) )
917 STDMETHODIMP VLCMessages::GetTypeInfo(UINT iTInfo, LCID lcid, LPTYPEINFO* ppTInfo)
919 if( NULL == ppTInfo )
922 if( SUCCEEDED(loadTypeInfo()) )
924 _p_typeinfo->AddRef();
925 *ppTInfo = _p_typeinfo;
932 STDMETHODIMP VLCMessages::GetIDsOfNames(REFIID riid, LPOLESTR* rgszNames,
933 UINT cNames, LCID lcid, DISPID* rgDispID)
935 if( SUCCEEDED(loadTypeInfo()) )
937 return DispGetIDsOfNames(_p_typeinfo, rgszNames, cNames, rgDispID);
942 STDMETHODIMP VLCMessages::Invoke(DISPID dispIdMember, REFIID riid,
943 LCID lcid, WORD wFlags, DISPPARAMS* pDispParams,
944 VARIANT* pVarResult, EXCEPINFO* pExcepInfo, UINT* puArgErr)
946 if( SUCCEEDED(loadTypeInfo()) )
948 return DispInvoke(this, _p_typeinfo, dispIdMember, wFlags, pDispParams,
949 pVarResult, pExcepInfo, puArgErr);
954 STDMETHODIMP VLCMessages::get__NewEnum(LPUNKNOWN* _NewEnum)
956 if( NULL == _NewEnum )
964 STDMETHODIMP VLCMessages::clear()
966 libvlc_log_t *p_log = _p_vlclog->_p_log;
969 libvlc_exception_t ex;
970 libvlc_exception_init(&ex);
972 libvlc_log_clear(p_log, &ex);
973 if( libvlc_exception_raised(&ex) )
975 _p_instance->setErrorInfo(IID_IVLCMessages, libvlc_exception_get_message(&ex));
976 libvlc_exception_clear(&ex);
983 STDMETHODIMP VLCMessages::get_count(long* count)
988 libvlc_log_t *p_log = _p_vlclog->_p_log;
991 libvlc_exception_t ex;
992 libvlc_exception_init(&ex);
994 *count = libvlc_log_count(p_log, &ex);
995 if( libvlc_exception_raised(&ex) )
997 _p_instance->setErrorInfo(IID_IVLCMessages, libvlc_exception_get_message(&ex));
998 libvlc_exception_clear(&ex);
1007 STDMETHODIMP VLCMessages::iterator(IVLCMessageIterator** iter)
1012 *iter = new VLCMessageIterator(_p_instance, _p_vlclog);
1014 return *iter ? S_OK : E_OUTOFMEMORY;
1017 /*******************************************************************************/
1019 VLCMessageIterator::VLCMessageIterator(VLCPlugin *p_instance, VLCLog* p_vlclog ) :
1020 _p_instance(p_instance),
1025 if( p_vlclog->_p_log )
1027 _p_iter = libvlc_log_get_iterator(p_vlclog->_p_log, NULL);
1033 VLCMessageIterator::~VLCMessageIterator()
1036 libvlc_log_iterator_free(_p_iter, NULL);
1039 _p_typeinfo->Release();
1042 HRESULT VLCMessageIterator::loadTypeInfo(void)
1044 HRESULT hr = NOERROR;
1045 if( NULL == _p_typeinfo )
1047 ITypeLib *p_typelib;
1049 hr = _p_instance->getTypeLib(LOCALE_USER_DEFAULT, &p_typelib);
1052 hr = p_typelib->GetTypeInfoOfGuid(IID_IVLCMessageIterator, &_p_typeinfo);
1057 p_typelib->Release();
1063 STDMETHODIMP VLCMessageIterator::GetTypeInfoCount(UINT* pctInfo)
1065 if( NULL == pctInfo )
1066 return E_INVALIDARG;
1068 if( SUCCEEDED(loadTypeInfo()) )
1076 STDMETHODIMP VLCMessageIterator::GetTypeInfo(UINT iTInfo, LCID lcid, LPTYPEINFO* ppTInfo)
1078 if( NULL == ppTInfo )
1079 return E_INVALIDARG;
1081 if( SUCCEEDED(loadTypeInfo()) )
1083 _p_typeinfo->AddRef();
1084 *ppTInfo = _p_typeinfo;
1091 STDMETHODIMP VLCMessageIterator::GetIDsOfNames(REFIID riid, LPOLESTR* rgszNames,
1092 UINT cNames, LCID lcid, DISPID* rgDispID)
1094 if( SUCCEEDED(loadTypeInfo()) )
1096 return DispGetIDsOfNames(_p_typeinfo, rgszNames, cNames, rgDispID);
1101 STDMETHODIMP VLCMessageIterator::Invoke(DISPID dispIdMember, REFIID riid,
1102 LCID lcid, WORD wFlags, DISPPARAMS* pDispParams,
1103 VARIANT* pVarResult, EXCEPINFO* pExcepInfo, UINT* puArgErr)
1105 if( SUCCEEDED(loadTypeInfo()) )
1107 return DispInvoke(this, _p_typeinfo, dispIdMember, wFlags, pDispParams,
1108 pVarResult, pExcepInfo, puArgErr);
1113 STDMETHODIMP VLCMessageIterator::get_hasNext(VARIANT_BOOL* hasNext)
1115 if( NULL == hasNext )
1118 if( _p_iter && _p_vlclog->_p_log )
1120 libvlc_exception_t ex;
1121 libvlc_exception_init(&ex);
1123 *hasNext = libvlc_log_iterator_has_next(_p_iter, &ex) ? VARIANT_TRUE : VARIANT_FALSE;
1124 if( libvlc_exception_raised(&ex) )
1126 _p_instance->setErrorInfo(IID_IVLCMessageIterator, libvlc_exception_get_message(&ex));
1127 libvlc_exception_clear(&ex);
1133 *hasNext = VARIANT_FALSE;
1138 STDMETHODIMP VLCMessageIterator::next(IVLCMessage** message)
1140 if( NULL == message )
1143 if( _p_iter && _p_vlclog->_p_log )
1145 struct libvlc_log_message_t buffer;
1147 buffer.sizeof_msg = sizeof(buffer);
1149 libvlc_exception_t ex;
1150 libvlc_exception_init(&ex);
1152 libvlc_log_iterator_next(_p_iter, &buffer, &ex);
1153 if( libvlc_exception_raised(&ex) )
1155 _p_instance->setErrorInfo(IID_IVLCMessageIterator, libvlc_exception_get_message(&ex));
1156 libvlc_exception_clear(&ex);
1159 *message = new VLCMessage(_p_instance, buffer);
1160 return *message ? NOERROR : E_OUTOFMEMORY;
1165 /*******************************************************************************/
1167 VLCMessage::~VLCMessage()
1170 _p_typeinfo->Release();
1173 HRESULT VLCMessage::loadTypeInfo(void)
1175 HRESULT hr = NOERROR;
1176 if( NULL == _p_typeinfo )
1178 ITypeLib *p_typelib;
1180 hr = _p_instance->getTypeLib(LOCALE_USER_DEFAULT, &p_typelib);
1183 hr = p_typelib->GetTypeInfoOfGuid(IID_IVLCMessage, &_p_typeinfo);
1188 p_typelib->Release();
1194 STDMETHODIMP VLCMessage::GetTypeInfoCount(UINT* pctInfo)
1196 if( NULL == pctInfo )
1197 return E_INVALIDARG;
1199 if( SUCCEEDED(loadTypeInfo()) )
1207 STDMETHODIMP VLCMessage::GetTypeInfo(UINT iTInfo, LCID lcid, LPTYPEINFO* ppTInfo)
1209 if( NULL == ppTInfo )
1210 return E_INVALIDARG;
1212 if( SUCCEEDED(loadTypeInfo()) )
1214 _p_typeinfo->AddRef();
1215 *ppTInfo = _p_typeinfo;
1222 STDMETHODIMP VLCMessage::GetIDsOfNames(REFIID riid, LPOLESTR* rgszNames,
1223 UINT cNames, LCID lcid, DISPID* rgDispID)
1225 if( SUCCEEDED(loadTypeInfo()) )
1227 return DispGetIDsOfNames(_p_typeinfo, rgszNames, cNames, rgDispID);
1232 STDMETHODIMP VLCMessage::Invoke(DISPID dispIdMember, REFIID riid,
1233 LCID lcid, WORD wFlags, DISPPARAMS* pDispParams,
1234 VARIANT* pVarResult, EXCEPINFO* pExcepInfo, UINT* puArgErr)
1236 if( SUCCEEDED(loadTypeInfo()) )
1238 return DispInvoke(this, _p_typeinfo, dispIdMember, wFlags, pDispParams,
1239 pVarResult, pExcepInfo, puArgErr);
1244 inline const char *msgSeverity(int sev)
1259 STDMETHODIMP VLCMessage::get__Value(VARIANT* _Value)
1261 if( NULL == _Value )
1266 snprintf(buffer, sizeof(buffer), "%s %s %s: %s",
1267 _msg.psz_type, _msg.psz_name, msgSeverity(_msg.i_severity), _msg.psz_message);
1269 V_VT(_Value) = VT_BSTR;
1270 V_BSTR(_Value) = BSTRFromCStr(CP_UTF8, buffer);
1275 STDMETHODIMP VLCMessage::get_severity(long* level)
1280 *level = _msg.i_severity;
1285 STDMETHODIMP VLCMessage::get_type(BSTR* type)
1290 *type = BSTRFromCStr(CP_UTF8, _msg.psz_type);
1295 STDMETHODIMP VLCMessage::get_name(BSTR* name)
1300 *name = BSTRFromCStr(CP_UTF8, _msg.psz_name);
1305 STDMETHODIMP VLCMessage::get_header(BSTR* header)
1307 if( NULL == header )
1310 *header = BSTRFromCStr(CP_UTF8, _msg.psz_header);
1315 STDMETHODIMP VLCMessage::get_message(BSTR* message)
1317 if( NULL == message )
1320 *message = BSTRFromCStr(CP_UTF8, _msg.psz_message);
1325 /*******************************************************************************/
1327 VLCPlaylistItems::~VLCPlaylistItems()
1330 _p_typeinfo->Release();
1333 HRESULT VLCPlaylistItems::loadTypeInfo(void)
1335 HRESULT hr = NOERROR;
1336 if( NULL == _p_typeinfo )
1338 ITypeLib *p_typelib;
1340 hr = _p_instance->getTypeLib(LOCALE_USER_DEFAULT, &p_typelib);
1343 hr = p_typelib->GetTypeInfoOfGuid(IID_IVLCPlaylistItems, &_p_typeinfo);
1348 p_typelib->Release();
1354 STDMETHODIMP VLCPlaylistItems::GetTypeInfoCount(UINT* pctInfo)
1356 if( NULL == pctInfo )
1357 return E_INVALIDARG;
1359 if( SUCCEEDED(loadTypeInfo()) )
1367 STDMETHODIMP VLCPlaylistItems::GetTypeInfo(UINT iTInfo, LCID lcid, LPTYPEINFO* ppTInfo)
1369 if( NULL == ppTInfo )
1370 return E_INVALIDARG;
1372 if( SUCCEEDED(loadTypeInfo()) )
1374 _p_typeinfo->AddRef();
1375 *ppTInfo = _p_typeinfo;
1382 STDMETHODIMP VLCPlaylistItems::GetIDsOfNames(REFIID riid, LPOLESTR* rgszNames,
1383 UINT cNames, LCID lcid, DISPID* rgDispID)
1385 if( SUCCEEDED(loadTypeInfo()) )
1387 return DispGetIDsOfNames(_p_typeinfo, rgszNames, cNames, rgDispID);
1392 STDMETHODIMP VLCPlaylistItems::Invoke(DISPID dispIdMember, REFIID riid,
1393 LCID lcid, WORD wFlags, DISPPARAMS* pDispParams,
1394 VARIANT* pVarResult, EXCEPINFO* pExcepInfo, UINT* puArgErr)
1396 if( SUCCEEDED(loadTypeInfo()) )
1398 return DispInvoke(this, _p_typeinfo, dispIdMember, wFlags, pDispParams,
1399 pVarResult, pExcepInfo, puArgErr);
1404 STDMETHODIMP VLCPlaylistItems::get_count(long* count)
1409 libvlc_instance_t* p_libvlc;
1410 HRESULT hr = _p_instance->getVLC(&p_libvlc);
1413 libvlc_exception_t ex;
1414 libvlc_exception_init(&ex);
1416 *count = libvlc_playlist_items_count(p_libvlc, &ex);
1417 if( libvlc_exception_raised(&ex) )
1419 _p_instance->setErrorInfo(IID_IVLCPlaylistItems,
1420 libvlc_exception_get_message(&ex));
1421 libvlc_exception_clear(&ex);
1429 STDMETHODIMP VLCPlaylistItems::clear()
1431 libvlc_instance_t* p_libvlc;
1432 HRESULT hr = _p_instance->getVLC(&p_libvlc);
1435 libvlc_exception_t ex;
1436 libvlc_exception_init(&ex);
1438 libvlc_playlist_clear(p_libvlc, &ex);
1439 if( libvlc_exception_raised(&ex) )
1441 _p_instance->setErrorInfo(IID_IVLCPlaylistItems,
1442 libvlc_exception_get_message(&ex));
1443 libvlc_exception_clear(&ex);
1451 STDMETHODIMP VLCPlaylistItems::remove(long item)
1453 libvlc_instance_t* p_libvlc;
1454 HRESULT hr = _p_instance->getVLC(&p_libvlc);
1457 libvlc_exception_t ex;
1458 libvlc_exception_init(&ex);
1460 libvlc_playlist_delete_item(p_libvlc, item, &ex);
1461 if( libvlc_exception_raised(&ex) )
1463 _p_instance->setErrorInfo(IID_IVLCPlaylistItems,
1464 libvlc_exception_get_message(&ex));
1465 libvlc_exception_clear(&ex);
1473 /*******************************************************************************/
1475 VLCPlaylist::~VLCPlaylist()
1477 delete _p_vlcplaylistitems;
1479 _p_typeinfo->Release();
1482 HRESULT VLCPlaylist::loadTypeInfo(void)
1484 HRESULT hr = NOERROR;
1485 if( NULL == _p_typeinfo )
1487 ITypeLib *p_typelib;
1489 hr = _p_instance->getTypeLib(LOCALE_USER_DEFAULT, &p_typelib);
1492 hr = p_typelib->GetTypeInfoOfGuid(IID_IVLCPlaylist, &_p_typeinfo);
1497 p_typelib->Release();
1503 STDMETHODIMP VLCPlaylist::GetTypeInfoCount(UINT* pctInfo)
1505 if( NULL == pctInfo )
1506 return E_INVALIDARG;
1508 if( SUCCEEDED(loadTypeInfo()) )
1516 STDMETHODIMP VLCPlaylist::GetTypeInfo(UINT iTInfo, LCID lcid, LPTYPEINFO* ppTInfo)
1518 if( NULL == ppTInfo )
1519 return E_INVALIDARG;
1521 if( SUCCEEDED(loadTypeInfo()) )
1523 _p_typeinfo->AddRef();
1524 *ppTInfo = _p_typeinfo;
1531 STDMETHODIMP VLCPlaylist::GetIDsOfNames(REFIID riid, LPOLESTR* rgszNames,
1532 UINT cNames, LCID lcid, DISPID* rgDispID)
1534 if( SUCCEEDED(loadTypeInfo()) )
1536 return DispGetIDsOfNames(_p_typeinfo, rgszNames, cNames, rgDispID);
1541 STDMETHODIMP VLCPlaylist::Invoke(DISPID dispIdMember, REFIID riid,
1542 LCID lcid, WORD wFlags, DISPPARAMS* pDispParams,
1543 VARIANT* pVarResult, EXCEPINFO* pExcepInfo, UINT* puArgErr)
1545 if( SUCCEEDED(loadTypeInfo()) )
1547 return DispInvoke(this, _p_typeinfo, dispIdMember, wFlags, pDispParams,
1548 pVarResult, pExcepInfo, puArgErr);
1553 STDMETHODIMP VLCPlaylist::get_itemCount(long* count)
1558 libvlc_instance_t* p_libvlc;
1559 HRESULT hr = _p_instance->getVLC(&p_libvlc);
1562 libvlc_exception_t ex;
1563 libvlc_exception_init(&ex);
1565 *count = libvlc_playlist_items_count(p_libvlc, &ex);
1566 if( libvlc_exception_raised(&ex) )
1568 _p_instance->setErrorInfo(IID_IVLCPlaylist,
1569 libvlc_exception_get_message(&ex));
1570 libvlc_exception_clear(&ex);
1578 STDMETHODIMP VLCPlaylist::get_isPlaying(VARIANT_BOOL* isPlaying)
1580 if( NULL == isPlaying )
1583 libvlc_instance_t* p_libvlc;
1584 HRESULT hr = _p_instance->getVLC(&p_libvlc);
1587 libvlc_exception_t ex;
1588 libvlc_exception_init(&ex);
1590 *isPlaying = libvlc_playlist_isplaying(p_libvlc, &ex) ? VARIANT_TRUE: VARIANT_FALSE;
1591 if( libvlc_exception_raised(&ex) )
1593 _p_instance->setErrorInfo(IID_IVLCPlaylist,
1594 libvlc_exception_get_message(&ex));
1595 libvlc_exception_clear(&ex);
1603 STDMETHODIMP VLCPlaylist::add(BSTR uri, VARIANT name, VARIANT options, long* item)
1608 if( 0 == SysStringLen(uri) )
1609 return E_INVALIDARG;
1611 libvlc_instance_t* p_libvlc;
1612 HRESULT hr = _p_instance->getVLC(&p_libvlc);
1615 libvlc_exception_t ex;
1616 libvlc_exception_init(&ex);
1618 char *psz_uri = NULL;
1619 if( SysStringLen(_p_instance->getBaseURL()) > 0 )
1622 ** if the MRL a relative URL, we should end up with an absolute URL
1624 LPWSTR abs_url = CombineURL(_p_instance->getBaseURL(), uri);
1625 if( NULL != abs_url )
1627 psz_uri = CStrFromWSTR(CP_UTF8, abs_url, wcslen(abs_url));
1628 CoTaskMemFree(abs_url);
1632 psz_uri = CStrFromBSTR(CP_UTF8, uri);
1638 ** baseURL is empty, assume MRL is absolute
1640 psz_uri = CStrFromBSTR(CP_UTF8, uri);
1643 if( NULL == psz_uri )
1645 return E_OUTOFMEMORY;
1649 char **ppsz_options;
1651 hr = VLCControl::CreateTargetOptions(CP_UTF8, &options, &ppsz_options, &i_options);
1654 CoTaskMemFree(psz_uri);
1658 char *psz_name = NULL;
1660 VariantInit(&v_name);
1661 if( SUCCEEDED(VariantChangeType(&v_name, &name, 0, VT_BSTR)) )
1663 if( SysStringLen(V_BSTR(&v_name)) > 0 )
1664 psz_name = CStrFromBSTR(CP_UTF8, V_BSTR(&v_name));
1666 VariantClear(&v_name);
1669 *item = libvlc_playlist_add_extended(p_libvlc,
1673 const_cast<const char **>(ppsz_options),
1676 VLCControl::FreeTargetOptions(ppsz_options, i_options);
1677 CoTaskMemFree(psz_uri);
1679 CoTaskMemFree(psz_name);
1680 if( libvlc_exception_raised(&ex) )
1682 _p_instance->setErrorInfo(IID_IVLCPlaylist,
1683 libvlc_exception_get_message(&ex));
1684 libvlc_exception_clear(&ex);
1692 STDMETHODIMP VLCPlaylist::play()
1694 libvlc_instance_t* p_libvlc;
1695 HRESULT hr = _p_instance->getVLC(&p_libvlc);
1698 libvlc_exception_t ex;
1699 libvlc_exception_init(&ex);
1701 libvlc_playlist_play(p_libvlc, -1, 0, NULL, &ex);
1702 if( libvlc_exception_raised(&ex) )
1704 libvlc_exception_clear(&ex);
1712 STDMETHODIMP VLCPlaylist::playItem(long item)
1714 libvlc_instance_t* p_libvlc;
1715 HRESULT hr = _p_instance->getVLC(&p_libvlc);
1718 libvlc_exception_t ex;
1719 libvlc_exception_init(&ex);
1721 libvlc_playlist_play(p_libvlc, item, 0, NULL, &ex);
1722 if( libvlc_exception_raised(&ex) )
1724 _p_instance->setErrorInfo(IID_IVLCPlaylist,
1725 libvlc_exception_get_message(&ex));
1726 libvlc_exception_clear(&ex);
1734 STDMETHODIMP VLCPlaylist::togglePause()
1736 libvlc_instance_t* p_libvlc;
1737 HRESULT hr = _p_instance->getVLC(&p_libvlc);
1740 libvlc_exception_t ex;
1741 libvlc_exception_init(&ex);
1743 libvlc_playlist_pause(p_libvlc, &ex);
1744 if( libvlc_exception_raised(&ex) )
1746 _p_instance->setErrorInfo(IID_IVLCPlaylist,
1747 libvlc_exception_get_message(&ex));
1748 libvlc_exception_clear(&ex);
1756 STDMETHODIMP VLCPlaylist::stop()
1758 libvlc_instance_t* p_libvlc;
1759 HRESULT hr = _p_instance->getVLC(&p_libvlc);
1762 libvlc_exception_t ex;
1763 libvlc_exception_init(&ex);
1765 libvlc_playlist_stop(p_libvlc, &ex);
1766 if( libvlc_exception_raised(&ex) )
1768 _p_instance->setErrorInfo(IID_IVLCPlaylist,
1769 libvlc_exception_get_message(&ex));
1770 libvlc_exception_clear(&ex);
1778 STDMETHODIMP VLCPlaylist::next()
1780 libvlc_instance_t* p_libvlc;
1781 HRESULT hr = _p_instance->getVLC(&p_libvlc);
1784 libvlc_exception_t ex;
1785 libvlc_exception_init(&ex);
1787 libvlc_playlist_next(p_libvlc, &ex);
1788 if( libvlc_exception_raised(&ex) )
1790 _p_instance->setErrorInfo(IID_IVLCPlaylist,
1791 libvlc_exception_get_message(&ex));
1792 libvlc_exception_clear(&ex);
1800 STDMETHODIMP VLCPlaylist::prev()
1802 libvlc_instance_t* p_libvlc;
1803 HRESULT hr = _p_instance->getVLC(&p_libvlc);
1806 libvlc_exception_t ex;
1807 libvlc_exception_init(&ex);
1809 libvlc_playlist_prev(p_libvlc, &ex);
1810 if( libvlc_exception_raised(&ex) )
1812 _p_instance->setErrorInfo(IID_IVLCPlaylist,
1813 libvlc_exception_get_message(&ex));
1814 libvlc_exception_clear(&ex);
1822 STDMETHODIMP VLCPlaylist::clear()
1824 libvlc_instance_t* p_libvlc;
1825 HRESULT hr = _p_instance->getVLC(&p_libvlc);
1828 libvlc_exception_t ex;
1829 libvlc_exception_init(&ex);
1831 libvlc_playlist_clear(p_libvlc, &ex);
1832 if( libvlc_exception_raised(&ex) )
1834 _p_instance->setErrorInfo(IID_IVLCPlaylist,
1835 libvlc_exception_get_message(&ex));
1836 libvlc_exception_clear(&ex);
1844 STDMETHODIMP VLCPlaylist::removeItem(long item)
1846 libvlc_instance_t* p_libvlc;
1847 HRESULT hr = _p_instance->getVLC(&p_libvlc);
1850 libvlc_exception_t ex;
1851 libvlc_exception_init(&ex);
1853 libvlc_playlist_delete_item(p_libvlc, item, &ex);
1854 if( libvlc_exception_raised(&ex) )
1856 _p_instance->setErrorInfo(IID_IVLCPlaylist,
1857 libvlc_exception_get_message(&ex));
1858 libvlc_exception_clear(&ex);
1866 STDMETHODIMP VLCPlaylist::get_items(IVLCPlaylistItems** obj)
1871 *obj = _p_vlcplaylistitems;
1872 if( NULL != _p_vlcplaylistitems )
1874 _p_vlcplaylistitems->AddRef();
1877 return E_OUTOFMEMORY;
1880 /*******************************************************************************/
1882 VLCVideo::~VLCVideo()
1885 _p_typeinfo->Release();
1888 HRESULT VLCVideo::loadTypeInfo(void)
1890 HRESULT hr = NOERROR;
1891 if( NULL == _p_typeinfo )
1893 ITypeLib *p_typelib;
1895 hr = _p_instance->getTypeLib(LOCALE_USER_DEFAULT, &p_typelib);
1898 hr = p_typelib->GetTypeInfoOfGuid(IID_IVLCVideo, &_p_typeinfo);
1903 p_typelib->Release();
1909 STDMETHODIMP VLCVideo::GetTypeInfoCount(UINT* pctInfo)
1911 if( NULL == pctInfo )
1912 return E_INVALIDARG;
1914 if( SUCCEEDED(loadTypeInfo()) )
1922 STDMETHODIMP VLCVideo::GetTypeInfo(UINT iTInfo, LCID lcid, LPTYPEINFO* ppTInfo)
1924 if( NULL == ppTInfo )
1925 return E_INVALIDARG;
1927 if( SUCCEEDED(loadTypeInfo()) )
1929 _p_typeinfo->AddRef();
1930 *ppTInfo = _p_typeinfo;
1937 STDMETHODIMP VLCVideo::GetIDsOfNames(REFIID riid, LPOLESTR* rgszNames,
1938 UINT cNames, LCID lcid, DISPID* rgDispID)
1940 if( SUCCEEDED(loadTypeInfo()) )
1942 return DispGetIDsOfNames(_p_typeinfo, rgszNames, cNames, rgDispID);
1947 STDMETHODIMP VLCVideo::Invoke(DISPID dispIdMember, REFIID riid,
1948 LCID lcid, WORD wFlags, DISPPARAMS* pDispParams,
1949 VARIANT* pVarResult, EXCEPINFO* pExcepInfo, UINT* puArgErr)
1951 if( SUCCEEDED(loadTypeInfo()) )
1953 return DispInvoke(this, _p_typeinfo, dispIdMember, wFlags, pDispParams,
1954 pVarResult, pExcepInfo, puArgErr);
1959 STDMETHODIMP VLCVideo::get_fullscreen(VARIANT_BOOL* fullscreen)
1961 if( NULL == fullscreen )
1964 libvlc_instance_t* p_libvlc;
1965 HRESULT hr = _p_instance->getVLC(&p_libvlc);
1968 libvlc_exception_t ex;
1969 libvlc_exception_init(&ex);
1971 libvlc_input_t *p_input = libvlc_playlist_get_input(p_libvlc, &ex);
1972 if( ! libvlc_exception_raised(&ex) )
1974 *fullscreen = libvlc_get_fullscreen(p_input, &ex) ? VARIANT_TRUE : VARIANT_FALSE;
1975 libvlc_input_free(p_input);
1976 if( ! libvlc_exception_raised(&ex) )
1981 _p_instance->setErrorInfo(IID_IVLCVideo, libvlc_exception_get_message(&ex));
1982 libvlc_exception_clear(&ex);
1988 STDMETHODIMP VLCVideo::put_fullscreen(VARIANT_BOOL fullscreen)
1990 libvlc_instance_t* p_libvlc;
1991 HRESULT hr = _p_instance->getVLC(&p_libvlc);
1994 libvlc_exception_t ex;
1995 libvlc_exception_init(&ex);
1997 libvlc_input_t *p_input = libvlc_playlist_get_input(p_libvlc, &ex);
1998 if( ! libvlc_exception_raised(&ex) )
2000 libvlc_set_fullscreen(p_input, VARIANT_FALSE != fullscreen, &ex);
2001 libvlc_input_free(p_input);
2002 if( ! libvlc_exception_raised(&ex) )
2007 _p_instance->setErrorInfo(IID_IVLCVideo, libvlc_exception_get_message(&ex));
2008 libvlc_exception_clear(&ex);
2014 STDMETHODIMP VLCVideo::get_width(long* width)
2019 libvlc_instance_t* p_libvlc;
2020 HRESULT hr = _p_instance->getVLC(&p_libvlc);
2023 libvlc_exception_t ex;
2024 libvlc_exception_init(&ex);
2026 libvlc_input_t *p_input = libvlc_playlist_get_input(p_libvlc, &ex);
2027 if( ! libvlc_exception_raised(&ex) )
2029 *width = libvlc_video_get_width(p_input, &ex);
2030 libvlc_input_free(p_input);
2031 if( ! libvlc_exception_raised(&ex) )
2036 _p_instance->setErrorInfo(IID_IVLCVideo, libvlc_exception_get_message(&ex));
2037 libvlc_exception_clear(&ex);
2043 STDMETHODIMP VLCVideo::get_height(long* height)
2045 if( NULL == height )
2048 libvlc_instance_t* p_libvlc;
2049 HRESULT hr = _p_instance->getVLC(&p_libvlc);
2052 libvlc_exception_t ex;
2053 libvlc_exception_init(&ex);
2055 libvlc_input_t *p_input = libvlc_playlist_get_input(p_libvlc, &ex);
2056 if( ! libvlc_exception_raised(&ex) )
2058 *height = libvlc_video_get_height(p_input, &ex);
2059 libvlc_input_free(p_input);
2060 if( ! libvlc_exception_raised(&ex) )
2065 _p_instance->setErrorInfo(IID_IVLCVideo, libvlc_exception_get_message(&ex));
2066 libvlc_exception_clear(&ex);
2072 STDMETHODIMP VLCVideo::get_aspectRatio(BSTR* aspect)
2074 if( NULL == aspect )
2077 libvlc_instance_t* p_libvlc;
2078 HRESULT hr = _p_instance->getVLC(&p_libvlc);
2081 libvlc_exception_t ex;
2082 libvlc_exception_init(&ex);
2084 libvlc_input_t *p_input = libvlc_playlist_get_input(p_libvlc, &ex);
2085 if( ! libvlc_exception_raised(&ex) )
2087 char *psz_aspect = libvlc_video_get_aspect_ratio(p_input, &ex);
2089 libvlc_input_free(p_input);
2090 if( ! libvlc_exception_raised(&ex) )
2092 if( NULL == psz_aspect )
2093 return E_OUTOFMEMORY;
2095 *aspect = BSTRFromCStr(CP_UTF8, psz_aspect);
2098 return (NULL == *aspect) ? E_OUTOFMEMORY : NOERROR;
2100 if( psz_aspect ) free( psz_aspect );
2103 _p_instance->setErrorInfo(IID_IVLCVideo, libvlc_exception_get_message(&ex));
2104 libvlc_exception_clear(&ex);
2110 STDMETHODIMP VLCVideo::put_aspectRatio(BSTR aspect)
2112 if( NULL == aspect )
2115 if( 0 == SysStringLen(aspect) )
2116 return E_INVALIDARG;
2118 libvlc_instance_t* p_libvlc;
2119 HRESULT hr = _p_instance->getVLC(&p_libvlc);
2122 char *psz_aspect = NULL;
2123 libvlc_exception_t ex;
2124 libvlc_exception_init(&ex);
2126 libvlc_input_t *p_input = libvlc_playlist_get_input(p_libvlc, &ex);
2127 if( ! libvlc_exception_raised(&ex) )
2129 psz_aspect = CStrFromBSTR(CP_UTF8, aspect);
2130 if( NULL == psz_aspect )
2132 return E_OUTOFMEMORY;
2135 libvlc_video_set_aspect_ratio(p_input, psz_aspect, &ex);
2137 CoTaskMemFree(psz_aspect);
2138 libvlc_input_free(p_input);
2139 if( libvlc_exception_raised(&ex) )
2141 _p_instance->setErrorInfo(IID_IVLCVideo,
2142 libvlc_exception_get_message(&ex));
2143 libvlc_exception_clear(&ex);
2152 STDMETHODIMP VLCVideo::toggleFullscreen()
2154 libvlc_instance_t* p_libvlc;
2155 HRESULT hr = _p_instance->getVLC(&p_libvlc);
2158 libvlc_exception_t ex;
2159 libvlc_exception_init(&ex);
2161 libvlc_input_t *p_input = libvlc_playlist_get_input(p_libvlc, &ex);
2162 if( ! libvlc_exception_raised(&ex) )
2164 libvlc_toggle_fullscreen(p_input, &ex);
2165 libvlc_input_free(p_input);
2166 if( ! libvlc_exception_raised(&ex) )
2171 _p_instance->setErrorInfo(IID_IVLCVideo, libvlc_exception_get_message(&ex));
2172 libvlc_exception_clear(&ex);
2178 /*******************************************************************************/
2180 VLCControl2::VLCControl2(VLCPlugin *p_instance) :
2181 _p_instance(p_instance),
2185 _p_vlcplaylist(NULL),
2188 _p_vlcaudio = new VLCAudio(p_instance);
2189 _p_vlcinput = new VLCInput(p_instance);
2190 _p_vlclog = new VLCLog(p_instance);
2191 _p_vlcplaylist = new VLCPlaylist(p_instance);
2192 _p_vlcvideo = new VLCVideo(p_instance);
2195 VLCControl2::~VLCControl2()
2198 delete _p_vlcplaylist;
2203 _p_typeinfo->Release();
2206 HRESULT VLCControl2::loadTypeInfo(void)
2208 HRESULT hr = NOERROR;
2209 if( NULL == _p_typeinfo )
2211 ITypeLib *p_typelib;
2213 hr = _p_instance->getTypeLib(LOCALE_USER_DEFAULT, &p_typelib);
2216 hr = p_typelib->GetTypeInfoOfGuid(IID_IVLCControl2, &_p_typeinfo);
2221 p_typelib->Release();
2227 STDMETHODIMP VLCControl2::GetTypeInfoCount(UINT* pctInfo)
2229 if( NULL == pctInfo )
2230 return E_INVALIDARG;
2232 if( SUCCEEDED(loadTypeInfo()) )
2240 STDMETHODIMP VLCControl2::GetTypeInfo(UINT iTInfo, LCID lcid, LPTYPEINFO* ppTInfo)
2242 if( NULL == ppTInfo )
2243 return E_INVALIDARG;
2245 if( SUCCEEDED(loadTypeInfo()) )
2247 _p_typeinfo->AddRef();
2248 *ppTInfo = _p_typeinfo;
2255 STDMETHODIMP VLCControl2::GetIDsOfNames(REFIID riid, LPOLESTR* rgszNames,
2256 UINT cNames, LCID lcid, DISPID* rgDispID)
2258 if( SUCCEEDED(loadTypeInfo()) )
2260 return DispGetIDsOfNames(_p_typeinfo, rgszNames, cNames, rgDispID);
2265 STDMETHODIMP VLCControl2::Invoke(DISPID dispIdMember, REFIID riid,
2266 LCID lcid, WORD wFlags, DISPPARAMS* pDispParams,
2267 VARIANT* pVarResult, EXCEPINFO* pExcepInfo, UINT* puArgErr)
2269 if( SUCCEEDED(loadTypeInfo()) )
2271 return DispInvoke(this, _p_typeinfo, dispIdMember, wFlags, pDispParams,
2272 pVarResult, pExcepInfo, puArgErr);
2277 STDMETHODIMP VLCControl2::get_AutoLoop(VARIANT_BOOL *autoloop)
2279 if( NULL == autoloop )
2282 *autoloop = _p_instance->getAutoLoop() ? VARIANT_TRUE: VARIANT_FALSE;
2286 STDMETHODIMP VLCControl2::put_AutoLoop(VARIANT_BOOL autoloop)
2288 _p_instance->setAutoLoop((VARIANT_FALSE != autoloop) ? TRUE: FALSE);
2292 STDMETHODIMP VLCControl2::get_AutoPlay(VARIANT_BOOL *autoplay)
2294 if( NULL == autoplay )
2297 *autoplay = _p_instance->getAutoPlay() ? VARIANT_TRUE: VARIANT_FALSE;
2301 STDMETHODIMP VLCControl2::put_AutoPlay(VARIANT_BOOL autoplay)
2303 _p_instance->setAutoPlay((VARIANT_FALSE != autoplay) ? TRUE: FALSE);
2307 STDMETHODIMP VLCControl2::get_BaseURL(BSTR *url)
2312 *url = SysAllocStringLen(_p_instance->getBaseURL(),
2313 SysStringLen(_p_instance->getBaseURL()));
2317 STDMETHODIMP VLCControl2::put_BaseURL(BSTR mrl)
2319 _p_instance->setBaseURL(mrl);
2324 STDMETHODIMP VLCControl2::get_MRL(BSTR *mrl)
2329 *mrl = SysAllocStringLen(_p_instance->getMRL(),
2330 SysStringLen(_p_instance->getMRL()));
2334 STDMETHODIMP VLCControl2::put_MRL(BSTR mrl)
2336 _p_instance->setMRL(mrl);
2341 STDMETHODIMP VLCControl2::get_StartTime(long *seconds)
2343 if( NULL == seconds )
2346 *seconds = _p_instance->getStartTime();
2351 STDMETHODIMP VLCControl2::put_StartTime(long seconds)
2353 _p_instance->setStartTime(seconds);
2358 STDMETHODIMP VLCControl2::get_VersionInfo(BSTR *version)
2360 if( NULL == version )
2363 const char *versionStr = VLC_Version();
2364 if( NULL != versionStr )
2366 *version = BSTRFromCStr(CP_UTF8, versionStr);
2368 return NULL == *version ? E_OUTOFMEMORY : NOERROR;
2374 STDMETHODIMP VLCControl2::get_Visible(VARIANT_BOOL *isVisible)
2376 if( NULL == isVisible )
2379 *isVisible = _p_instance->getVisible() ? VARIANT_TRUE : VARIANT_FALSE;
2384 STDMETHODIMP VLCControl2::put_Visible(VARIANT_BOOL isVisible)
2386 _p_instance->setVisible(isVisible != VARIANT_FALSE);
2391 STDMETHODIMP VLCControl2::get_Volume(long *volume)
2393 if( NULL == volume )
2396 *volume = _p_instance->getVolume();
2400 STDMETHODIMP VLCControl2::put_Volume(long volume)
2402 _p_instance->setVolume(volume);
2406 STDMETHODIMP VLCControl2::get_audio(IVLCAudio** obj)
2412 if( NULL != _p_vlcaudio )
2414 _p_vlcaudio->AddRef();
2417 return E_OUTOFMEMORY;
2420 STDMETHODIMP VLCControl2::get_input(IVLCInput** obj)
2426 if( NULL != _p_vlcinput )
2428 _p_vlcinput->AddRef();
2431 return E_OUTOFMEMORY;
2434 STDMETHODIMP VLCControl2::get_log(IVLCLog** obj)
2440 if( NULL != _p_vlclog )
2442 _p_vlclog->AddRef();
2445 return E_OUTOFMEMORY;
2448 STDMETHODIMP VLCControl2::get_playlist(IVLCPlaylist** obj)
2453 *obj = _p_vlcplaylist;
2454 if( NULL != _p_vlcplaylist )
2456 _p_vlcplaylist->AddRef();
2459 return E_OUTOFMEMORY;
2462 STDMETHODIMP VLCControl2::get_video(IVLCVideo** obj)
2468 if( NULL != _p_vlcvideo )
2470 _p_vlcvideo->AddRef();
2473 return E_OUTOFMEMORY;