]> git.sesse.net Git - vlc/commitdiff
src/libvlc.c,include/vlc/vlc.h, include/variables.h: added a new a API to libvlc...
authorDamien Fouilleul <damienf@videolan.org>
Wed, 11 May 2005 16:56:46 +0000 (16:56 +0000)
committerDamien Fouilleul <damienf@videolan.org>
Wed, 11 May 2005 16:56:46 +0000 (16:56 +0000)
vlccontrol.cpp, axvlc.idl, axvlc.tlb, axvlc_idl.h: added a getVariable and setVariable to provide support for VLC_GetVariable and VLC_SetVariable respectively,and requires the new VLC_VariableType API.

main.cpp, viewobject.h, viewobject.cpp: support for advise on viewobject

12 files changed:
activex/axvlc.idl
activex/axvlc.tlb
activex/axvlc_idl.c
activex/axvlc_idl.h
activex/main.cpp
activex/viewobject.cpp
activex/viewobject.h
activex/vlccontrol.cpp
activex/vlccontrol.h
include/variables.h
include/vlc/vlc.h
src/libvlc.c

index edf462b40ad3e64ee046b7e2c31b8133a5596d23..fe79c4b769bec5d2c728a833cce2d0f6bdb9c47d 100644 (file)
@@ -66,10 +66,6 @@ library AXVLC
     ]\r
     interface IVLCControl : IDispatch {\r
 \r
-        [id(0), bindable, defaultbind, propget, helpstring("Specifies current target in playlist")]\r
-        HRESULT Value([out, retval] VARIANT* pvarValue);\r
-        [id(0), bindable, defaultbind, propput, helpstring("Specifies current target in playlist")]\r
-        HRESULT Value([in] VARIANT pvarValue);\r
         [id(DISPID_Visible), propget, bindable, helpstring("Shows or hides plugin.")]\r
         HRESULT Visible([out, retval] VARIANT_BOOL* visible);\r
         [id(DISPID_Visible), propput, bindable, helpstring("Shows or hides plugin.")]\r
@@ -88,9 +84,9 @@ library AXVLC
         HRESULT Position([out, retval] float* position);\r
         [id(DISPID_Position), bindable, propput, helpstring("Specifies playback position within current target in playlist, position is a relative value ranging from 0.0 to 1.0.")]\r
         HRESULT Position([in] float position);\r
-        [id(DISPID_Time), bindable, propget, helpstring("Specifies playback time relative to the start of current target in playlist.")]\r
+        [id(DISPID_Time), propget, helpstring("Specifies playback time relative to the start of current target in playlist.")]\r
         HRESULT Time([out, retval] int* seconds);\r
-        [id(DISPID_Time), bindable, propput, helpstring("Specifies playback time relative to the start of current target in playlist.")]\r
+        [id(DISPID_Time), propput, helpstring("Specifies playback time relative to the start of current target in playlist.")]\r
         HRESULT Time([in] int seconds);\r
         [helpstring("Advance or backtrack playback time, relative to current time.")]\r
         HRESULT shuttle([in] int seconds);\r
@@ -108,6 +104,10 @@ library AXVLC
         HRESULT Volume([in] int volume);\r
         [helpstring("Mute/unmute playback sound volume.")]\r
         HRESULT toggleMute();\r
+        [helpstring("Set a value to a VLC variable.")]\r
+        HRESULT setVariable([in] BSTR name, [in] VARIANT value);\r
+        [helpstring("Retrieve the value of a VLC variable.")]\r
+        HRESULT getVariable([in] BSTR name, [out, retval] VARIANT *value);\r
         [helpstring("Add a target to the current playlist.")]\r
 \r
 /*\r
index 71e0409dbf70e7ae9081282b9fcf25a8d2f19f04..5c142d2fc4d70bdc9d777cdd3123f49a57750f60 100755 (executable)
Binary files a/activex/axvlc.tlb and b/activex/axvlc.tlb differ
index b339abbac57cd6f2f0114ad591d783b4d2a171bf..c821c5ba4a7c57e5e62fa19b44cf1e3c08d68810 100644 (file)
@@ -5,7 +5,7 @@
 
 
 /* File created by MIDL compiler version 5.01.0164 */
-/* at Thu Feb 17 09:25:54 2005
+/* at Tue May 10 21:24:51 2005
  */
 /* Compiler settings for axvlc.idl:
     Oicf (OptLev=i2), W1, Zp8, env=Win32, ms_ext, c_ext
index 719c264890cf4c56a73332ffa1ec8f4515efb278..039cf638796ee11cedd57670753ed87416f2ff50 100644 (file)
@@ -2,7 +2,7 @@
 
 
 /* File created by MIDL compiler version 5.01.0164 */
-/* at Thu Feb 17 09:25:54 2005
+/* at Tue May 10 21:24:51 2005
  */
 /* Compiler settings for axvlc.idl:
     Oicf (OptLev=i2), W1, Zp8, env=Win32, ms_ext, c_ext
@@ -110,12 +110,6 @@ EXTERN_C const IID IID_IVLCControl;
     IVLCControl : public IDispatch
     {
     public:
-        virtual /* [helpstring][propget][defaultbind][bindable][id] */ HRESULT STDMETHODCALLTYPE get_Value( 
-            /* [retval][out] */ VARIANT __RPC_FAR *pvarValue) = 0;
-        
-        virtual /* [helpstring][propput][defaultbind][bindable][id] */ HRESULT STDMETHODCALLTYPE put_Value( 
-            /* [in] */ VARIANT pvarValue) = 0;
-        
         virtual /* [helpstring][bindable][propget][id] */ HRESULT STDMETHODCALLTYPE get_Visible( 
             /* [retval][out] */ VARIANT_BOOL __RPC_FAR *visible) = 0;
         
@@ -140,10 +134,10 @@ EXTERN_C const IID IID_IVLCControl;
         virtual /* [helpstring][propput][bindable][id] */ HRESULT STDMETHODCALLTYPE put_Position( 
             /* [in] */ float position) = 0;
         
-        virtual /* [helpstring][propget][bindable][id] */ HRESULT STDMETHODCALLTYPE get_Time( 
+        virtual /* [helpstring][propget][id] */ HRESULT STDMETHODCALLTYPE get_Time( 
             /* [retval][out] */ int __RPC_FAR *seconds) = 0;
         
-        virtual /* [helpstring][propput][bindable][id] */ HRESULT STDMETHODCALLTYPE put_Time( 
+        virtual /* [helpstring][propput][id] */ HRESULT STDMETHODCALLTYPE put_Time( 
             /* [in] */ int seconds) = 0;
         
         virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE shuttle( 
@@ -166,6 +160,14 @@ EXTERN_C const IID IID_IVLCControl;
         
         virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE toggleMute( void) = 0;
         
+        virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE setVariable( 
+            /* [in] */ BSTR name,
+            /* [in] */ VARIANT value) = 0;
+        
+        virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE getVariable( 
+            /* [in] */ BSTR name,
+            /* [retval][out] */ VARIANT __RPC_FAR *value) = 0;
+        
         virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE addTarget( 
             /* [in] */ BSTR uri,
             /* [in] */ VARIANT options,
@@ -235,14 +237,6 @@ EXTERN_C const IID IID_IVLCControl;
             /* [out] */ EXCEPINFO __RPC_FAR *pExcepInfo,
             /* [out] */ UINT __RPC_FAR *puArgErr);
         
-        /* [helpstring][propget][defaultbind][bindable][id] */ HRESULT ( STDMETHODCALLTYPE __RPC_FAR *get_Value )( 
-            IVLCControl __RPC_FAR * This,
-            /* [retval][out] */ VARIANT __RPC_FAR *pvarValue);
-        
-        /* [helpstring][propput][defaultbind][bindable][id] */ HRESULT ( STDMETHODCALLTYPE __RPC_FAR *put_Value )( 
-            IVLCControl __RPC_FAR * This,
-            /* [in] */ VARIANT pvarValue);
-        
         /* [helpstring][bindable][propget][id] */ HRESULT ( STDMETHODCALLTYPE __RPC_FAR *get_Visible )( 
             IVLCControl __RPC_FAR * This,
             /* [retval][out] */ VARIANT_BOOL __RPC_FAR *visible);
@@ -276,11 +270,11 @@ EXTERN_C const IID IID_IVLCControl;
             IVLCControl __RPC_FAR * This,
             /* [in] */ float position);
         
-        /* [helpstring][propget][bindable][id] */ HRESULT ( STDMETHODCALLTYPE __RPC_FAR *get_Time )( 
+        /* [helpstring][propget][id] */ HRESULT ( STDMETHODCALLTYPE __RPC_FAR *get_Time )( 
             IVLCControl __RPC_FAR * This,
             /* [retval][out] */ int __RPC_FAR *seconds);
         
-        /* [helpstring][propput][bindable][id] */ HRESULT ( STDMETHODCALLTYPE __RPC_FAR *put_Time )( 
+        /* [helpstring][propput][id] */ HRESULT ( STDMETHODCALLTYPE __RPC_FAR *put_Time )( 
             IVLCControl __RPC_FAR * This,
             /* [in] */ int seconds);
         
@@ -312,6 +306,16 @@ EXTERN_C const IID IID_IVLCControl;
         /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE __RPC_FAR *toggleMute )( 
             IVLCControl __RPC_FAR * This);
         
+        /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE __RPC_FAR *setVariable )( 
+            IVLCControl __RPC_FAR * This,
+            /* [in] */ BSTR name,
+            /* [in] */ VARIANT value);
+        
+        /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE __RPC_FAR *getVariable )( 
+            IVLCControl __RPC_FAR * This,
+            /* [in] */ BSTR name,
+            /* [retval][out] */ VARIANT __RPC_FAR *value);
+        
         /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE __RPC_FAR *addTarget )( 
             IVLCControl __RPC_FAR * This,
             /* [in] */ BSTR uri,
@@ -376,12 +380,6 @@ EXTERN_C const IID IID_IVLCControl;
     (This)->lpVtbl -> Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
 
 
-#define IVLCControl_get_Value(This,pvarValue)  \
-    (This)->lpVtbl -> get_Value(This,pvarValue)
-
-#define IVLCControl_put_Value(This,pvarValue)  \
-    (This)->lpVtbl -> put_Value(This,pvarValue)
-
 #define IVLCControl_get_Visible(This,visible)  \
     (This)->lpVtbl -> get_Visible(This,visible)
 
@@ -439,6 +437,12 @@ EXTERN_C const IID IID_IVLCControl;
 #define IVLCControl_toggleMute(This)   \
     (This)->lpVtbl -> toggleMute(This)
 
+#define IVLCControl_setVariable(This,name,value)       \
+    (This)->lpVtbl -> setVariable(This,name,value)
+
+#define IVLCControl_getVariable(This,name,value)       \
+    (This)->lpVtbl -> getVariable(This,name,value)
+
 #define IVLCControl_addTarget(This,uri,options,mode,position)  \
     (This)->lpVtbl -> addTarget(This,uri,options,mode,position)
 
@@ -467,30 +471,6 @@ EXTERN_C const IID IID_IVLCControl;
 
 
 
-/* [helpstring][propget][defaultbind][bindable][id] */ HRESULT STDMETHODCALLTYPE IVLCControl_get_Value_Proxy( 
-    IVLCControl __RPC_FAR * This,
-    /* [retval][out] */ VARIANT __RPC_FAR *pvarValue);
-
-
-void __RPC_STUB IVLCControl_get_Value_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-/* [helpstring][propput][defaultbind][bindable][id] */ HRESULT STDMETHODCALLTYPE IVLCControl_put_Value_Proxy( 
-    IVLCControl __RPC_FAR * This,
-    /* [in] */ VARIANT pvarValue);
-
-
-void __RPC_STUB IVLCControl_put_Value_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
 /* [helpstring][bindable][propget][id] */ HRESULT STDMETHODCALLTYPE IVLCControl_get_Visible_Proxy( 
     IVLCControl __RPC_FAR * This,
     /* [retval][out] */ VARIANT_BOOL __RPC_FAR *visible);
@@ -596,7 +576,7 @@ void __RPC_STUB IVLCControl_put_Position_Stub(
     DWORD *_pdwStubPhase);
 
 
-/* [helpstring][propget][bindable][id] */ HRESULT STDMETHODCALLTYPE IVLCControl_get_Time_Proxy( 
+/* [helpstring][propget][id] */ HRESULT STDMETHODCALLTYPE IVLCControl_get_Time_Proxy( 
     IVLCControl __RPC_FAR * This,
     /* [retval][out] */ int __RPC_FAR *seconds);
 
@@ -608,7 +588,7 @@ void __RPC_STUB IVLCControl_get_Time_Stub(
     DWORD *_pdwStubPhase);
 
 
-/* [helpstring][propput][bindable][id] */ HRESULT STDMETHODCALLTYPE IVLCControl_put_Time_Proxy( 
+/* [helpstring][propput][id] */ HRESULT STDMETHODCALLTYPE IVLCControl_put_Time_Proxy( 
     IVLCControl __RPC_FAR * This,
     /* [in] */ int seconds);
 
@@ -712,6 +692,32 @@ void __RPC_STUB IVLCControl_toggleMute_Stub(
     DWORD *_pdwStubPhase);
 
 
+/* [helpstring] */ HRESULT STDMETHODCALLTYPE IVLCControl_setVariable_Proxy( 
+    IVLCControl __RPC_FAR * This,
+    /* [in] */ BSTR name,
+    /* [in] */ VARIANT value);
+
+
+void __RPC_STUB IVLCControl_setVariable_Stub(
+    IRpcStubBuffer *This,
+    IRpcChannelBuffer *_pRpcChannelBuffer,
+    PRPC_MESSAGE _pRpcMessage,
+    DWORD *_pdwStubPhase);
+
+
+/* [helpstring] */ HRESULT STDMETHODCALLTYPE IVLCControl_getVariable_Proxy( 
+    IVLCControl __RPC_FAR * This,
+    /* [in] */ BSTR name,
+    /* [retval][out] */ VARIANT __RPC_FAR *value);
+
+
+void __RPC_STUB IVLCControl_getVariable_Stub(
+    IRpcStubBuffer *This,
+    IRpcChannelBuffer *_pRpcChannelBuffer,
+    PRPC_MESSAGE _pRpcMessage,
+    DWORD *_pdwStubPhase);
+
+
 /* [helpstring] */ HRESULT STDMETHODCALLTYPE IVLCControl_addTarget_Proxy( 
     IVLCControl __RPC_FAR * This,
     /* [in] */ BSTR uri,
index 4cc9084d1f6a7e760f2e40963f831ca91ddade88..3a407dd62e5159d71b761ba7d92c64cf6f2038bc 100644 (file)
@@ -307,6 +307,12 @@ STDAPI DllRegisterServer(VOID)
 
     // register type lib into the registry
     ITypeLib *typeLib;
+
+#ifdef BUILD_LOCALSERVER
+    // replace .exe by .tlb
+    strcpy(DllPath+DllPathLen-4, ".tlb");
+#endif
+    
 #ifndef OLE2ANSI
     size_t typeLibPathLen = MultiByteToWideChar(CP_ACP, 0, DllPath, -1, NULL, 0);
     if( typeLibPathLen > 0 )
@@ -314,8 +320,10 @@ STDAPI DllRegisterServer(VOID)
         LPOLESTR typeLibPath = (LPOLESTR)CoTaskMemAlloc(typeLibPathLen*sizeof(wchar_t));
         MultiByteToWideChar(CP_ACP, 0, DllPath, DllPathLen, typeLibPath, typeLibPathLen);
         if( FAILED(LoadTypeLibEx(typeLibPath, REGKIND_REGISTER, &typeLib)) )
+#ifndef BUILD_LOCALSERVER
             return SELFREG_E_TYPELIB;
         typeLib->Release();
+#endif
         CoTaskMemFree((void *)typeLibPath);
     }
 #else
index 53e36c018e5fc5d9e52753f916978ff853ec8193..a0c51138e5317c8e33caf1d5de1df413f1d008c0 100644 (file)
@@ -60,13 +60,17 @@ STDMETHODIMP VLCViewObject::GetAdvise(LPDWORD pdwAspect, LPDWORD padvf,
         LPADVISESINK *ppAdviseSink)
 {
     if( NULL != pdwAspect )
-        *pdwAspect = 0;
+        *pdwAspect = _dwAspect;
 
     if( NULL != padvf )
-        *padvf = 0;
+        *padvf = _advf;
 
     if( NULL != ppAdviseSink )
-        *ppAdviseSink = NULL;
+    {
+        *ppAdviseSink = _pAdvSink;
+        if( NULL != _pAdvSink )
+            _pAdvSink->AddRef();
+    }
 
     return S_OK;
 };
@@ -80,7 +84,22 @@ STDMETHODIMP VLCViewObject::GetColorSet(DWORD dwAspect, LONG lindex,
 STDMETHODIMP VLCViewObject::SetAdvise(DWORD dwAspect, DWORD advf,
         LPADVISESINK pAdvSink)
 {
-    return OLE_E_ADVISENOTSUPPORTED;
+    _dwAspect = dwAspect;
+    _advf = advf;
+    if( NULL != _pAdvSink )
+        _pAdvSink->Release();
+
+    _pAdvSink = pAdvSink;
+    if( NULL != pAdvSink )
+    {
+        pAdvSink->AddRef();
+
+        if( dwAspect & DVASPECT_CONTENT )
+        {
+            pAdvSink->OnViewChange(DVASPECT_CONTENT, -1);
+        }
+    }
+    return S_OK;
 };
 
 STDMETHODIMP VLCViewObject::Unfreeze(DWORD dwFreeze)
index 6bca57dfe8aad12ea65479f7a1483e9502aeac81..e5d0cc68f4794cd025866fb916e3a24699a48f5f 100644 (file)
@@ -30,7 +30,8 @@ class VLCViewObject : public IViewObject2
 
 public:
 
-    VLCViewObject(VLCPlugin *p_instance) : _p_instance(p_instance) {};
+    VLCViewObject(VLCPlugin *p_instance) : _p_instance(p_instance),
+        _dwAspect(0), _advf(0), _pAdvSink(NULL) {};
     virtual ~VLCViewObject() {};
 
     // IUnknown methods
@@ -65,6 +66,11 @@ public:
 private:
 
     VLCPlugin *_p_instance;
+
+    // Advise Sink support
+    DWORD _dwAspect;
+    DWORD _advf;
+    LPADVISESINK _pAdvSink;
 };
 
 #endif
index 3e280fb07b6ae4be434e26746de48954112a8f83..89320207a7d382297d93ae3a1fd415f7ee7a0c12 100644 (file)
@@ -25,6 +25,8 @@
 
 #include "utils.h"
 
+using namespace std;
+
 VLCControl::~VLCControl()
 {
     if( _p_typeinfo )
@@ -102,37 +104,12 @@ STDMETHODIMP VLCControl::Invoke(DISPID dispIdMember, REFIID riid,
     return E_NOTIMPL;
 };
 
-STDMETHODIMP VLCControl::get_Value(VARIANT *pvarValue)
-{
-    if( NULL == pvarValue )
-        return E_POINTER;
-
-    V_VT(pvarValue) = VT_BOOL;
-    return get_Playing(&V_BOOL(pvarValue));
-};
-        
-STDMETHODIMP VLCControl::put_Value(VARIANT pvarValue)
-{
-    if( VT_BOOL != V_VT(&pvarValue) )
-    {
-        VARIANT boolValue;
-        HRESULT hr = VariantChangeType(&boolValue, &pvarValue, 0, VT_BOOL);
-        if( SUCCEEDED(hr) )
-        {
-            hr = get_Playing(&V_BOOL(&pvarValue));
-            //VariantClear(&boolValue);
-        }
-        return hr;
-    }
-    return get_Playing(&V_BOOL(&pvarValue));
-};
-        
 STDMETHODIMP VLCControl::get_Visible(VARIANT_BOOL *isVisible)
 {
     if( NULL == isVisible )
         return E_POINTER;
 
-    *isVisible = _p_instance->getVisible();
+    *isVisible = _p_instance->getVisible() ? VARIANT_TRUE : VARIANT_FALSE;
 
     return NOERROR;
 };
@@ -363,6 +340,130 @@ STDMETHODIMP VLCControl::toggleMute(void)
     return E_UNEXPECTED;
 };
 
+STDMETHODIMP VLCControl::setVariable( BSTR name, VARIANT value)
+{
+    if( 0 == SysStringLen(name) )
+        return E_INVALIDARG;
+
+    int i_vlc = _p_instance->getVLCObject();
+    if( i_vlc )
+    {
+        int codePage = _p_instance->getCodePage();
+        char *psz_varname = CStrFromBSTR(codePage, name);
+        if( NULL == psz_varname )
+            return E_OUTOFMEMORY;
+
+        HRESULT hr = E_INVALIDARG;
+        int i_type;
+        if( VLC_SUCCESS == VLC_VariableType(i_vlc, psz_varname, &i_type) )
+        {
+            VARIANT arg;
+            VariantInit(&arg);
+
+            vlc_value_t val;
+
+            hr = DISP_E_TYPEMISMATCH;
+
+            switch( i_type )
+            {
+                case VLC_VAR_BOOL:
+                    hr = VariantChangeType(&value, &arg, 0, VT_BOOL);
+                    if( SUCCEEDED(hr) )
+                        val.b_bool = (VARIANT_TRUE == V_BOOL(&arg)) ? VLC_TRUE : VLC_FALSE;
+                    break;
+
+                case VLC_VAR_INTEGER:
+                    hr = VariantChangeType(&value, &arg, 0, VT_I4);
+                    if( SUCCEEDED(hr) )
+                        val.i_int = V_I4(&arg);
+                    break;
+
+                case VLC_VAR_FLOAT:
+                    hr = VariantChangeType(&value, &arg, 0, VT_R4);
+                    if( SUCCEEDED(hr) )
+                        val.f_float = V_R4(&arg);
+                    break;
+
+                case VLC_VAR_STRING:
+                    hr = VariantChangeType(&value, &arg, 0, VT_BSTR);
+                    if( SUCCEEDED(hr) )
+                        val.psz_string = CStrFromBSTR(codePage, V_BSTR(&arg));
+                    break;
+            }
+            if( SUCCEEDED(hr) )
+            {
+                VariantClear(&arg);
+
+                hr = (VLC_SUCCESS == VLC_VariableSet(i_vlc, psz_varname, val)) ? NOERROR : E_FAIL;
+
+                if( (VLC_VAR_STRING == i_type) && (NULL != val.psz_string) )
+                    free(val.psz_string);
+            }
+        }
+        free(psz_varname);
+
+        return hr;
+    }
+    return E_UNEXPECTED;
+};
+
+STDMETHODIMP VLCControl::getVariable( BSTR name, VARIANT *value)
+{
+    if( 0 == SysStringLen(name) )
+        return E_INVALIDARG;
+
+    if( NULL == value )
+        return E_POINTER;
+
+    int i_vlc = _p_instance->getVLCObject();
+    if( i_vlc )
+    {
+        int codePage = _p_instance->getCodePage();
+        char *psz_varname = CStrFromBSTR(codePage, name);
+        if( NULL == psz_varname )
+            return E_OUTOFMEMORY;
+
+        HRESULT hr = E_INVALIDARG;
+
+        vlc_value_t val;
+        int i_type;
+
+        if( (VLC_SUCCESS == VLC_VariableGet(i_vlc, psz_varname, &val))
+         && (VLC_SUCCESS == VLC_VariableType(i_vlc, psz_varname, &i_type)) )
+        {
+            hr = NOERROR;
+            switch( i_type )
+            {
+                case VLC_VAR_BOOL:
+                    V_VT(value) = VT_BOOL;
+                    V_BOOL(value) = val.b_bool ? VARIANT_TRUE : VARIANT_FALSE;
+                    break;
+
+                case VLC_VAR_INTEGER:
+                    V_VT(value) = VT_I4;
+                    V_I4(value) = val.i_int;
+                    break;
+
+                case VLC_VAR_FLOAT:
+                    V_VT(value) = VT_R4;
+                    V_R4(value) = val.f_float;
+                    break;
+
+                case VLC_VAR_STRING:
+                    V_VT(value) = VT_BSTR;
+                    V_BSTR(value) = BSTRFromCStr(codePage, val.psz_string);
+                    free(val.psz_string);
+                    break;
+                default:
+                    hr = DISP_E_TYPEMISMATCH;
+            }
+        }
+        free(psz_varname);
+        return hr;
+    }
+    return E_UNEXPECTED;
+};
+
 static void freeTargetOptions(char **cOptions, int cOptionCount)
 {
     // clean up 
@@ -579,8 +680,18 @@ STDMETHODIMP VLCControl::addTarget( BSTR uri, VARIANT options, enum VLCPlaylistM
         if( FAILED(createTargetOptions(codePage, &options, &cOptions, &cOptionsCount)) )
             return E_INVALIDARG;
 
-        VLC_AddTarget(i_vlc, cUri, (const char **)cOptions, cOptionsCount, mode, position);
-        hr = NOERROR;
+        if( VLC_SUCCESS <= VLC_AddTarget(i_vlc, cUri, (const char **)cOptions, cOptionsCount, mode, position) )
+        {
+            hr = NOERROR;
+            if( mode & VLCPlayListGo )
+                _p_instance->fireOnPlayEvent();
+        }
+        else
+        {
+            hr = E_FAIL;
+            if( mode & VLCPlayListGo )
+                _p_instance->fireOnStopEvent();
+        }
 
         freeTargetOptions(cOptions, cOptionsCount);
         free(cUri);
index 89e4dda62411d5134b20b69fac8681b338f9ae6b..e26b69e44ebd6c21a0be5ebbd7e25a6fe2eea684 100644 (file)
@@ -58,8 +58,6 @@ public:
     STDMETHODIMP Invoke(DISPID,REFIID,LCID,WORD,DISPPARAMS*,VARIANT*,EXCEPINFO*,UINT*);
 
     // IVLCControl methods
-    STDMETHODIMP get_Value(VARIANT *pvarValue);
-    STDMETHODIMP put_Value(VARIANT pvarValue);
     STDMETHODIMP play(void);
     STDMETHODIMP get_Visible(VARIANT_BOOL *visible);
     STDMETHODIMP put_Visible(VARIANT_BOOL visible);
@@ -79,6 +77,8 @@ public:
     STDMETHODIMP get_Volume(int *volume);
     STDMETHODIMP put_Volume(int volume);
     STDMETHODIMP toggleMute(void);
+    STDMETHODIMP setVariable( BSTR name, VARIANT value);
+    STDMETHODIMP getVariable( BSTR name, VARIANT *value);
     STDMETHODIMP addTarget( BSTR uri, VARIANT options, enum VLCPlaylistMode mode, int position);
     STDMETHODIMP get_PlaylistIndex(int *index);
     STDMETHODIMP get_PlaylistCount(int *count);
index de6f94ec90c166ea2e46c1496c3c003455db4260..14203da8d7a9a66071cf947f1e16be25bc51bca0 100644 (file)
@@ -87,26 +87,6 @@ struct variable_t
 #define VLC_VAR_TYPE      0x00ff
 #define VLC_VAR_FLAGS     0xff00
 
-/**
- * \defgroup var_type Variable types
- * These are the different types a vlc variable can have.
- * @{
- */
-#define VLC_VAR_VOID      0x0010
-#define VLC_VAR_BOOL      0x0020
-#define VLC_VAR_INTEGER   0x0030
-#define VLC_VAR_HOTKEY    0x0031
-#define VLC_VAR_STRING    0x0040
-#define VLC_VAR_MODULE    0x0041
-#define VLC_VAR_FILE      0x0042
-#define VLC_VAR_DIRECTORY 0x0043
-#define VLC_VAR_VARIABLE  0x0044
-#define VLC_VAR_FLOAT     0x0050
-#define VLC_VAR_TIME      0x0060
-#define VLC_VAR_ADDRESS   0x0070
-#define VLC_VAR_MUTEX     0x0080
-#define VLC_VAR_LIST      0x0090
-/**@}*/
 /** \defgroup var_flags Additive flags
  * These flags are added to the type field of the variable. Most as a result of
  * a __var_Change() call, but some may be added at creation time
index 919f6c7c42b1a06c68892e8257f90c7d2e51b070..91295f62ac10dac5cdae3dbda53ccf997974b89e 100644 (file)
@@ -46,6 +46,27 @@ typedef int vlc_bool_t;
 typedef struct vlc_list_t vlc_list_t;
 typedef struct vlc_object_t vlc_object_t;
 
+/**
+ * \defgroup var_type Variable types
+ * These are the different types a vlc variable can have.
+ * @{
+ */
+#define VLC_VAR_VOID      0x0010
+#define VLC_VAR_BOOL      0x0020
+#define VLC_VAR_INTEGER   0x0030
+#define VLC_VAR_HOTKEY    0x0031
+#define VLC_VAR_STRING    0x0040
+#define VLC_VAR_MODULE    0x0041
+#define VLC_VAR_FILE      0x0042
+#define VLC_VAR_DIRECTORY 0x0043
+#define VLC_VAR_VARIABLE  0x0044
+#define VLC_VAR_FLOAT     0x0050
+#define VLC_VAR_TIME      0x0060
+#define VLC_VAR_ADDRESS   0x0070
+#define VLC_VAR_MUTEX     0x0080
+#define VLC_VAR_LIST      0x0090
+/**@}*/
+
 /**
  * VLC value structure
  */
@@ -254,6 +275,19 @@ int     VLC_VariableSet( int, char const *, vlc_value_t );
  */
 int     VLC_VariableGet( int, char const *, vlc_value_t * );
 
+/**
+ * Get a VLC variable type
+ *
+ * This function gets the type of a variable of VLC
+ * It stores it in the p_type argument
+ *
+ * \param i_object a vlc object id
+ * \param psz_var a vlc variable name
+ * \param pi_type a pointer to an integer
+ * \return VLC_SUCCESS on success
+ */
+int     VLC_VariableType( int, char const *, int * );
+
 /**
  * Add a target to the current playlist
  *
index 53679585cc7eaa623c9377996390fe2b56d52dc4..82ce78b104378a4b807f2ca3dc0b92b887efbdde 100644 (file)
@@ -1030,6 +1030,31 @@ int VLC_VariableGet( int i_object, char const *psz_var, vlc_value_t *p_value )
     return i_ret;
 }
 
+/*****************************************************************************
+ * VLC_VariableType: get a vlc variable type
+ *****************************************************************************/
+int VLC_VariableType( int i_object, char const *psz_var, int *pi_type )
+{
+    int i_type;
+    vlc_t *p_vlc = vlc_current_object( i_object );
+
+    if( !p_vlc )
+    {
+        return VLC_ENOOBJ;
+    }
+
+    i_type = VLC_VAR_TYPE & var_Type( p_vlc , psz_var );
+
+    if( i_object ) vlc_object_release( p_vlc );
+
+    if( i_type > 0 )
+    {
+        *pi_type = i_type;
+        return VLC_SUCCESS;
+    }
+    return VLC_ENOVAR;
+}
+
 /*****************************************************************************
  * VLC_AddTarget: adds a target for playing.
  *****************************************************************************