+/****************************************************************************/
+
+VLCMarquee::~VLCMarquee()
+{
+ if( _p_typeinfo )
+ _p_typeinfo->Release();
+};
+
+HRESULT VLCMarquee::loadTypeInfo(void)
+{
+ HRESULT hr = NOERROR;
+ if( NULL == _p_typeinfo )
+ {
+ ITypeLib *p_typelib;
+
+ hr = _p_instance->getTypeLib(LOCALE_USER_DEFAULT, &p_typelib);
+ if( SUCCEEDED(hr) )
+ {
+ hr = p_typelib->GetTypeInfoOfGuid(IID_IVLCMarquee, &_p_typeinfo);
+ if( FAILED(hr) )
+ {
+ _p_typeinfo = NULL;
+ }
+ p_typelib->Release();
+ }
+ }
+ return hr;
+};
+
+STDMETHODIMP VLCMarquee::GetTypeInfoCount(UINT* pctInfo)
+{
+ if( NULL == pctInfo )
+ return E_INVALIDARG;
+
+ if( SUCCEEDED(loadTypeInfo()) )
+ *pctInfo = 1;
+ else
+ *pctInfo = 0;
+
+ return NOERROR;
+};
+
+STDMETHODIMP VLCMarquee::GetTypeInfo(UINT iTInfo, LCID lcid, LPTYPEINFO* ppTInfo)
+{
+ if( NULL == ppTInfo )
+ return E_INVALIDARG;
+
+ if( SUCCEEDED(loadTypeInfo()) )
+ {
+ _p_typeinfo->AddRef();
+ *ppTInfo = _p_typeinfo;
+ return NOERROR;
+ }
+ *ppTInfo = NULL;
+ return E_NOTIMPL;
+};
+
+STDMETHODIMP VLCMarquee::GetIDsOfNames(REFIID riid, LPOLESTR* rgszNames,
+ UINT cNames, LCID lcid, DISPID* rgDispID)
+{
+ if( SUCCEEDED(loadTypeInfo()) )
+ {
+ return DispGetIDsOfNames(_p_typeinfo, rgszNames, cNames, rgDispID);
+ }
+ return E_NOTIMPL;
+};
+
+HRESULT VLCMarquee::do_put_int(unsigned idx, LONG val)
+{
+ libvlc_media_player_t *p_md;
+ HRESULT hr = _p_instance->getMD(&p_md);
+ if( SUCCEEDED(hr) )
+ {
+ libvlc_exception_t ex;
+ libvlc_exception_init(&ex);
+ libvlc_video_set_marquee_int(p_md, idx, val, &ex);
+ hr = exception_bridge(&ex);
+ }
+ return hr;
+}
+
+HRESULT VLCMarquee::do_get_int(unsigned idx, LONG *val)
+{
+ if( NULL == val )
+ return E_POINTER;
+
+ libvlc_media_player_t *p_md;
+ HRESULT hr = _p_instance->getMD(&p_md);
+ if( SUCCEEDED(hr) )
+ {
+ libvlc_exception_t ex;
+ libvlc_exception_init(&ex);
+ *val = libvlc_video_get_marquee_int(p_md, idx, &ex);
+ hr = exception_bridge(&ex);
+ }
+ return hr;
+}
+
+STDMETHODIMP VLCMarquee::Invoke(DISPID dispIdMember, REFIID riid,
+ LCID lcid, WORD wFlags, DISPPARAMS* pDispParams,
+ VARIANT* pVarResult, EXCEPINFO* pExcepInfo, UINT* puArgErr)
+{
+ if( SUCCEEDED(loadTypeInfo()) )
+ {
+ return DispInvoke(this, _p_typeinfo, dispIdMember, wFlags, pDispParams,
+ pVarResult, pExcepInfo, puArgErr);
+ }
+ return E_NOTIMPL;
+};
+
+STDMETHODIMP VLCMarquee::get_position(BSTR* val)
+{
+ if( NULL == val )
+ return E_POINTER;
+
+ LONG i;
+ HRESULT hr = do_get_int(libvlc_marquee_Position, &i);
+
+ if(SUCCEEDED(hr))
+ *val = BSTRFromCStr(CP_UTF8, position_bynumber(i));
+
+ return hr;
+}
+
+STDMETHODIMP VLCMarquee::put_position(BSTR val)
+{
+ char *n = CStrFromBSTR(CP_UTF8, val);
+ if( !n ) return E_OUTOFMEMORY;
+
+ size_t i;
+ HRESULT hr;
+ if( position_byname( n, i ) )
+ hr = do_put_int(libvlc_marquee_Position,i);
+ else
+ hr = E_INVALIDARG;
+
+ CoTaskMemFree(n);
+ return hr;
+}
+
+STDMETHODIMP VLCMarquee::get_text(BSTR *val)
+{
+ char *psz;
+ if( NULL == val )
+ return E_POINTER;
+
+ libvlc_media_player_t *p_md;
+ HRESULT hr = _p_instance->getMD(&p_md);
+ if( SUCCEEDED(hr) )
+ {
+ libvlc_exception_t ex;
+ libvlc_exception_init(&ex);
+
+ psz = libvlc_video_get_marquee_string(p_md, libvlc_marquee_Text, &ex);
+
+ hr = exception_bridge(&ex);
+ if(SUCCEEDED(hr))
+ *val = BSTRFromCStr(CP_UTF8, psz);
+ }
+ return hr;
+}
+
+STDMETHODIMP VLCMarquee::put_text(BSTR val)
+{
+ libvlc_media_player_t *p_md;
+ HRESULT hr = _p_instance->getMD(&p_md);
+ if( SUCCEEDED(hr) )
+ {
+ libvlc_exception_t ex;
+ libvlc_exception_init(&ex);
+
+ char *psz_text = CStrFromBSTR(CP_UTF8, val);
+ libvlc_video_set_marquee_string(p_md, libvlc_marquee_Text,
+ psz_text, &ex);
+ hr = exception_bridge(&ex);
+ CoTaskMemFree(psz_text);
+ }
+ return hr;
+}
+
+/****************************************************************************/