persistpropbag.cpp
上传用户:kjfoods
上传日期:2020-07-06
资源大小:29949k
文件大小:8k
源码类别:

midi

开发平台:

Unix_Linux

  1. /*****************************************************************************
  2.  * persistpropbag.cpp: ActiveX control for VLC
  3.  *****************************************************************************
  4.  * Copyright (C) 2005 the VideoLAN team
  5.  *
  6.  * Authors: Damien Fouilleul <Damien.Fouilleul@laposte.net>
  7.  *
  8.  * This program is free software; you can redistribute it and/or modify
  9.  * it under the terms of the GNU General Public License as published by
  10.  * the Free Software Foundation; either version 2 of the License, or
  11.  * (at your option) any later version.
  12.  *
  13.  * This program is distributed in the hope that it will be useful,
  14.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  15.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  16.  * GNU General Public License for more details.
  17.  *
  18.  * You should have received a copy of the GNU General Public License
  19.  * along with this program; if not, write to the Free Software
  20.  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
  21.  *****************************************************************************/
  22. #include "plugin.h"
  23. #include "persistpropbag.h"
  24. #include "utils.h"
  25. #include "oleobject.h"
  26. using namespace std;
  27. STDMETHODIMP VLCPersistPropertyBag::GetClassID(LPCLSID pClsID)
  28. {
  29.     if( NULL == pClsID )
  30.         return E_POINTER;
  31.     *pClsID = _p_instance->getClassID();
  32.     return S_OK;
  33. };
  34. STDMETHODIMP VLCPersistPropertyBag::InitNew(void)
  35. {
  36.     return _p_instance->onInit();
  37. };
  38. STDMETHODIMP VLCPersistPropertyBag::Load(LPPROPERTYBAG pPropBag, LPERRORLOG pErrorLog)
  39. {
  40.     HRESULT hr = _p_instance->onInit();
  41.     if( FAILED(hr) )
  42.         return hr;
  43.     if( NULL == pPropBag )
  44.         return E_INVALIDARG;
  45.     VARIANT value;
  46.     V_VT(&value) = VT_BSTR;
  47.     if( S_OK == pPropBag->Read(OLESTR("mrl"), &value, pErrorLog) )
  48.     {
  49.         _p_instance->setMRL(V_BSTR(&value));
  50.         VariantClear(&value);
  51.     }
  52.     else
  53.     {
  54.         /*
  55.         ** try alternative syntax
  56.         */
  57.         V_VT(&value) = VT_BSTR;
  58.         if( S_OK == pPropBag->Read(OLESTR("src"), &value, pErrorLog) )
  59.         {
  60.             _p_instance->setMRL(V_BSTR(&value));
  61.             VariantClear(&value);
  62.         }
  63.         else
  64.         {
  65.             V_VT(&value) = VT_BSTR;
  66.             if( S_OK == pPropBag->Read(OLESTR("filename"), &value, pErrorLog) )
  67.             {
  68.                 _p_instance->setMRL(V_BSTR(&value));
  69.                 VariantClear(&value);
  70.             }
  71.         }
  72.     }
  73.     V_VT(&value) = VT_BOOL;
  74.     if( S_OK == pPropBag->Read(OLESTR("autoplay"), &value, pErrorLog) )
  75.     {
  76.         _p_instance->setAutoPlay(V_BOOL(&value) != VARIANT_FALSE);
  77.         VariantClear(&value);
  78.     }
  79.     else
  80.     {
  81.         /*
  82.         ** try alternative syntax
  83.         */
  84.         V_VT(&value) = VT_BOOL;
  85.         if( S_OK == pPropBag->Read(OLESTR("autostart"), &value, pErrorLog) )
  86.         {
  87.             _p_instance->setAutoPlay(V_BOOL(&value) != VARIANT_FALSE);
  88.             VariantClear(&value);
  89.         }
  90.     }
  91.     V_VT(&value) = VT_BOOL;
  92.     if( S_OK == pPropBag->Read(OLESTR("toolbar"), &value, pErrorLog) )
  93.     {
  94.         _p_instance->setShowToolbar(V_BOOL(&value) != VARIANT_FALSE);
  95.         VariantClear(&value);
  96.     }
  97.     SIZEL size = _p_instance->getExtent();
  98.     V_VT(&value) = VT_I4;
  99.     if( S_OK == pPropBag->Read(OLESTR("extentwidth"), &value, pErrorLog) )
  100.     {
  101.          size.cx = V_I4(&value);
  102.         VariantClear(&value);
  103.     }
  104.     V_VT(&value) = VT_I4;
  105.     if( S_OK == pPropBag->Read(OLESTR("extentheight"), &value, pErrorLog) )
  106.     {
  107.          size.cy = V_I4(&value);
  108.         VariantClear(&value);
  109.     }
  110.     _p_instance->setExtent(size);
  111.     V_VT(&value) = VT_BOOL;
  112.     if( S_OK == pPropBag->Read(OLESTR("autoloop"), &value, pErrorLog) )
  113.     {
  114.         _p_instance->setAutoLoop(V_BOOL(&value) != VARIANT_FALSE);
  115.         VariantClear(&value);
  116.     }
  117.     else
  118.     {
  119.         /*
  120.         ** try alternative syntax
  121.         */
  122.         V_VT(&value) = VT_BOOL;
  123.         if( S_OK == pPropBag->Read(OLESTR("loop"), &value, pErrorLog) )
  124.         {
  125.             _p_instance->setAutoLoop(V_BOOL(&value) != VARIANT_FALSE);
  126.             VariantClear(&value);
  127.         }
  128.     }
  129.     V_VT(&value) = VT_BOOL;
  130.     if( S_OK == pPropBag->Read(OLESTR("mute"), &value, pErrorLog) )
  131.     {
  132.         _p_instance->setMute(V_BOOL(&value) != VARIANT_FALSE);
  133.         VariantClear(&value);
  134.     }
  135.     V_VT(&value) = VT_BOOL;
  136.     if( S_OK == pPropBag->Read(OLESTR("visible"), &value, pErrorLog) )
  137.     {
  138.         _p_instance->setVisible(V_BOOL(&value) != VARIANT_FALSE);
  139.         VariantClear(&value);
  140.     }
  141.     else
  142.     {
  143.         /*
  144.         ** try alternative syntax
  145.         */
  146.         V_VT(&value) = VT_BOOL;
  147.         if( S_OK == pPropBag->Read(OLESTR("showdisplay"), &value, pErrorLog) )
  148.         {
  149.             _p_instance->setVisible(V_BOOL(&value) != VARIANT_FALSE);
  150.             VariantClear(&value);
  151.         }
  152.     }
  153.     V_VT(&value) = VT_I4;
  154.     if( S_OK == pPropBag->Read(OLESTR("volume"), &value, pErrorLog) )
  155.     {
  156.         _p_instance->setVolume(V_I4(&value));
  157.         VariantClear(&value);
  158.     }
  159.     V_VT(&value) = VT_I4;
  160.     if( S_OK == pPropBag->Read(OLESTR("starttime"), &value, pErrorLog) )
  161.     {
  162.         _p_instance->setStartTime(V_I4(&value));
  163.         VariantClear(&value);
  164.     }
  165.     V_VT(&value) = VT_BSTR;
  166.     if( S_OK == pPropBag->Read(OLESTR("baseurl"), &value, pErrorLog) )
  167.     {
  168.         _p_instance->setBaseURL(V_BSTR(&value));
  169.         VariantClear(&value);
  170.     }
  171.     V_VT(&value) = VT_I4;
  172.     if( S_OK == pPropBag->Read(OLESTR("backcolor"), &value, pErrorLog) )
  173.     {
  174.         _p_instance->setBackColor(V_I4(&value));
  175.         VariantClear(&value);
  176.     }
  177.     else
  178.     {
  179.         /*
  180.         ** try alternative syntax
  181.         */
  182.         V_VT(&value) = VT_BSTR;
  183.         if( S_OK == pPropBag->Read(OLESTR("bgcolor"), &value, pErrorLog) )
  184.         {
  185.             long backcolor;
  186.             if( swscanf(V_BSTR(&value), L"#%lX", &backcolor) )
  187.             {
  188.                 _p_instance->setBackColor(backcolor);
  189.             }
  190.             VariantClear(&value);
  191.         }
  192.     }
  193.     return _p_instance->onLoad();
  194. };
  195. STDMETHODIMP VLCPersistPropertyBag::Save(LPPROPERTYBAG pPropBag, BOOL fClearDirty, BOOL fSaveAllProperties)
  196. {
  197.     if( NULL == pPropBag )
  198.         return E_INVALIDARG;
  199.     VARIANT value;
  200.     VariantInit(&value);
  201.     V_VT(&value) = VT_BOOL;
  202.     V_BOOL(&value) = _p_instance->getAutoLoop()? VARIANT_TRUE : VARIANT_FALSE;
  203.     pPropBag->Write(OLESTR("AutoLoop"), &value);
  204.     VariantClear(&value);
  205.     V_VT(&value) = VT_BOOL;
  206.     V_BOOL(&value) = _p_instance->getAutoPlay()? VARIANT_TRUE : VARIANT_FALSE;
  207.     pPropBag->Write(OLESTR("AutoPlay"), &value);
  208.     VariantClear(&value);
  209.     V_VT(&value) = VT_BOOL;
  210.     V_BOOL(&value) = _p_instance->getShowToolbar()? VARIANT_TRUE : VARIANT_FALSE;
  211.     pPropBag->Write(OLESTR("Toolbar"), &value);
  212.     VariantClear(&value);
  213.     SIZEL size = _p_instance->getExtent();
  214.     V_VT(&value) = VT_I4;
  215.     V_I4(&value) = size.cx;
  216.     pPropBag->Write(OLESTR("ExtentWidth"), &value);
  217.     V_I4(&value) = size.cy;
  218.     pPropBag->Write(OLESTR("ExtentHeight"), &value);
  219.     V_VT(&value) = VT_BSTR;
  220.     V_BSTR(&value) = SysAllocStringLen(_p_instance->getMRL(),
  221.                             SysStringLen(_p_instance->getMRL()));
  222.     pPropBag->Write(OLESTR("MRL"), &value);
  223.     VariantClear(&value);
  224.     V_VT(&value) = VT_BOOL;
  225.     V_BOOL(&value) = _p_instance->getVisible()? VARIANT_TRUE : VARIANT_FALSE;
  226.     pPropBag->Write(OLESTR("Visible"), &value);
  227.     VariantClear(&value);
  228.     V_VT(&value) = VT_I4;
  229.     V_I4(&value) = _p_instance->getVolume();
  230.     pPropBag->Write(OLESTR("Volume"), &value);
  231.     VariantClear(&value);
  232.     V_VT(&value) = VT_I4;
  233.     V_I4(&value) = _p_instance->getStartTime();
  234.     pPropBag->Write(OLESTR("StartTime"), &value);
  235.     VariantClear(&value);
  236.     V_VT(&value) = VT_BSTR;
  237.     V_BSTR(&value) = SysAllocStringLen(_p_instance->getBaseURL(),
  238.                             SysStringLen(_p_instance->getBaseURL()));
  239.     pPropBag->Write(OLESTR("BaseURL"), &value);
  240.     VariantClear(&value);
  241.     V_VT(&value) = VT_I4;
  242.     V_I4(&value) = _p_instance->getBackColor();
  243.     pPropBag->Write(OLESTR("BackColor"), &value);
  244.     VariantClear(&value);
  245.     if( fClearDirty )
  246.         _p_instance->setDirty(FALSE);
  247.     return S_OK;
  248. };