]> git.sesse.net Git - vlc/blobdiff - activex/persistpropbag.cpp
* modules/audio_output/alsa.c: fix the leak in a nice way.
[vlc] / activex / persistpropbag.cpp
index 52b928b5c693c1ff1343b9ee36b2e817520775c4..f70a665c9c86adf6da265f063b1b466abcfdbaa3 100644 (file)
@@ -1,7 +1,7 @@
 /*****************************************************************************
  * persistpropbag.cpp: ActiveX control for VLC
  *****************************************************************************
- * Copyright (C) 2005 VideoLAN
+ * Copyright (C) 2005 the VideoLAN team
  *
  * Authors: Damien Fouilleul <Damien.Fouilleul@laposte.net>
  *
@@ -45,59 +45,95 @@ STDMETHODIMP VLCPersistPropertyBag::InitNew(void)
 
 STDMETHODIMP VLCPersistPropertyBag::Load(LPPROPERTYBAG pPropBag, LPERRORLOG pErrorLog)
 {
-    if( NULL == pPropBag )
-        return E_POINTER;
-
     HRESULT hr = _p_instance->onInit();
     if( FAILED(hr) )
         return hr;
 
+    if( NULL == pPropBag )
+        return E_INVALIDARG;
+
     VARIANT value;
 
     V_VT(&value) = VT_BSTR;
-    if( S_OK == pPropBag->Read(OLESTR("filename"), &value, pErrorLog) )
+    if( S_OK == pPropBag->Read(OLESTR("mrl"), &value, pErrorLog) )
     {
-        char *src = CStrFromBSTR(_p_instance->getCodePage(), V_BSTR(&value));
-        if( NULL != src )
-        {
-            _p_instance->setSourceURL(src);
-            free(src);
-        }
+        _p_instance->setMRL(V_BSTR(&value));
         VariantClear(&value);
     }
-
-    V_VT(&value) = VT_BSTR;
-    if( S_OK == pPropBag->Read(OLESTR("src"), &value, pErrorLog) )
+    else
     {
-        char *src = CStrFromBSTR(_p_instance->getCodePage(), V_BSTR(&value));
-        if( NULL != src )
+        /*
+        ** try alternative syntax
+        */
+        V_VT(&value) = VT_BSTR;
+        if( S_OK == pPropBag->Read(OLESTR("src"), &value, pErrorLog) )
         {
-            _p_instance->setSourceURL(src);
-            free(src);
+            _p_instance->setMRL(V_BSTR(&value));
+            VariantClear(&value);
+        }
+        else
+        {
+            V_VT(&value) = VT_BSTR;
+            if( S_OK == pPropBag->Read(OLESTR("filename"), &value, pErrorLog) )
+            {
+                _p_instance->setMRL(V_BSTR(&value));
+                VariantClear(&value);
+            }
         }
-        VariantClear(&value);
     }
 
     V_VT(&value) = VT_BOOL;
     if( S_OK == pPropBag->Read(OLESTR("autoplay"), &value, pErrorLog) )
     {
-        _p_instance->setAutoStart(V_BOOL(&value) != VARIANT_FALSE);
+        _p_instance->setAutoPlay(V_BOOL(&value) != VARIANT_FALSE);
         VariantClear(&value);
     }
+    else
+    {
+        /*
+        ** try alternative syntax
+        */
+        V_VT(&value) = VT_BOOL;
+        if( S_OK == pPropBag->Read(OLESTR("autostart"), &value, pErrorLog) )
+        {
+            _p_instance->setAutoPlay(V_BOOL(&value) != VARIANT_FALSE);
+            VariantClear(&value);
+        }
+    }
 
-    V_VT(&value) = VT_BOOL;
-    if( S_OK == pPropBag->Read(OLESTR("autostart"), &value, pErrorLog) )
+    SIZEL size = _p_instance->getExtent();
+    V_VT(&value) = VT_I4;
+    if( S_OK == pPropBag->Read(OLESTR("extentwidth"), &value, pErrorLog) )
+    {
+         size.cx = V_I4(&value);
+        VariantClear(&value);
+    }
+    V_VT(&value) = VT_I4;
+    if( S_OK == pPropBag->Read(OLESTR("extentheight"), &value, pErrorLog) )
     {
-        _p_instance->setAutoStart(V_BOOL(&value) != VARIANT_FALSE);
+         size.cy = V_I4(&value);
         VariantClear(&value);
     }
+    _p_instance->setExtent(size);
 
     V_VT(&value) = VT_BOOL;
-    if( S_OK == pPropBag->Read(OLESTR("loop"), &value, pErrorLog) )
+    if( S_OK == pPropBag->Read(OLESTR("autoloop"), &value, pErrorLog) )
     {
-        _p_instance->setLoopMode(V_BOOL(&value) != VARIANT_FALSE);
+        _p_instance->setAutoLoop(V_BOOL(&value) != VARIANT_FALSE);
         VariantClear(&value);
     }
+    else
+    {
+        /*
+        ** try alternative syntax
+        */
+        V_VT(&value) = VT_BOOL;
+        if( S_OK == pPropBag->Read(OLESTR("loop"), &value, pErrorLog) )
+        {
+            _p_instance->setAutoLoop(V_BOOL(&value) != VARIANT_FALSE);
+            VariantClear(&value);
+        }
+    }
 
     V_VT(&value) = VT_BOOL;
     if( S_OK == pPropBag->Read(OLESTR("mute"), &value, pErrorLog) )
@@ -107,19 +143,82 @@ STDMETHODIMP VLCPersistPropertyBag::Load(LPPROPERTYBAG pPropBag, LPERRORLOG pErr
     }
 
     V_VT(&value) = VT_BOOL;
-    if( S_OK == pPropBag->Read(OLESTR("showdisplay"), &value, pErrorLog) )
+    if( S_OK == pPropBag->Read(OLESTR("visible"), &value, pErrorLog) )
     {
         _p_instance->setVisible(V_BOOL(&value) != VARIANT_FALSE);
         VariantClear(&value);
     }
+    else
+    {
+        /*
+        ** try alternative syntax
+        */
+        V_VT(&value) = VT_BOOL;
+        if( S_OK == pPropBag->Read(OLESTR("showdisplay"), &value, pErrorLog) )
+        {
+            _p_instance->setVisible(V_BOOL(&value) != VARIANT_FALSE);
+            VariantClear(&value);
+        }
+    }
 
+    int i_vlc = _p_instance->getVLCObject();
+    V_VT(&value) = VT_I4;
+    if( S_OK == pPropBag->Read(OLESTR("volume"), &value, pErrorLog) )
+    {
+        VLC_VolumeSet(i_vlc, V_I4(&value));
+        VariantClear(&value);
+    }
     return _p_instance->onLoad();
 };
 
 STDMETHODIMP VLCPersistPropertyBag::Save(LPPROPERTYBAG pPropBag, BOOL fClearDirty, BOOL fSaveAllProperties)
 {
     if( NULL == pPropBag )
-        return E_POINTER;
+        return E_INVALIDARG;
+
+    VARIANT value;
+
+    VariantInit(&value);
+
+    V_VT(&value) = VT_BOOL;
+    V_BOOL(&value) = _p_instance->getAutoLoop()? VARIANT_TRUE : VARIANT_FALSE;
+    pPropBag->Write(OLESTR("AutoLoop"), &value);
+    VariantClear(&value);
+
+    V_VT(&value) = VT_BOOL;
+    V_BOOL(&value) = _p_instance->getAutoPlay()? VARIANT_TRUE : VARIANT_FALSE;
+    pPropBag->Write(OLESTR("AutoPlay"), &value);
+    VariantClear(&value);
+
+    SIZEL size = _p_instance->getExtent();
+    V_VT(&value) = VT_I4;
+    V_I4(&value) = size.cx;
+    pPropBag->Write(OLESTR("ExtentWidth"), &value);
+    V_I4(&value) = size.cy;
+    pPropBag->Write(OLESTR("ExtentHeight"), &value);
+
+    V_VT(&value) = VT_BSTR;
+    V_BSTR(&value) = SysAllocStringLen(_p_instance->getMRL(),
+                            SysStringLen(_p_instance->getMRL()));
+    pPropBag->Write(OLESTR("MRL"), &value);
+    VariantClear(&value);
+
+    V_VT(&value) = VT_BOOL;
+    V_BOOL(&value) = _p_instance->getVisible()? VARIANT_TRUE : VARIANT_FALSE;
+    pPropBag->Write(OLESTR("Visible"), &value);
+    VariantClear(&value);
+
+    int i_vlc = _p_instance->getVLCObject();
+    if( i_vlc )
+    {
+        V_VT(&value) = VT_I4;
+        V_I4(&value) = VLC_VolumeGet(i_vlc);
+        pPropBag->Write(OLESTR("Volume"), &value);
+        VariantClear(&value);
+    }
+
+    if( fClearDirty )
+        _p_instance->setDirty(FALSE);
 
     return S_OK;
 };