Compile fix + handle case with no xml:base
[vlc.git] / activex / persistpropbag.cpp
blob6d3a529833b3dd985bffb7e0862af0917c117070
1 /*****************************************************************************
2 * persistpropbag.cpp: ActiveX control for VLC
3 *****************************************************************************
4 * Copyright (C) 2005 the VideoLAN team
6 * Authors: Damien Fouilleul <Damien.Fouilleul@laposte.net>
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.
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.
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 *****************************************************************************/
23 #include "plugin.h"
24 #include "persistpropbag.h"
26 #include "utils.h"
27 #include "oleobject.h"
29 using namespace std;
31 STDMETHODIMP VLCPersistPropertyBag::GetClassID(LPCLSID pClsID)
33 if( NULL == pClsID )
34 return E_POINTER;
36 *pClsID = _p_instance->getClassID();
38 return S_OK;
41 STDMETHODIMP VLCPersistPropertyBag::InitNew(void)
43 return _p_instance->onInit();
46 STDMETHODIMP VLCPersistPropertyBag::Load(LPPROPERTYBAG pPropBag, LPERRORLOG pErrorLog)
48 HRESULT hr = _p_instance->onInit();
49 if( FAILED(hr) )
50 return hr;
52 if( NULL == pPropBag )
53 return E_INVALIDARG;
55 VARIANT value;
57 V_VT(&value) = VT_BSTR;
58 if( S_OK == pPropBag->Read(OLESTR("mrl"), &value, pErrorLog) )
60 _p_instance->setMRL(V_BSTR(&value));
61 VariantClear(&value);
63 else
66 ** try alternative syntax
68 V_VT(&value) = VT_BSTR;
69 if( S_OK == pPropBag->Read(OLESTR("src"), &value, pErrorLog) )
71 _p_instance->setMRL(V_BSTR(&value));
72 VariantClear(&value);
74 else
76 V_VT(&value) = VT_BSTR;
77 if( S_OK == pPropBag->Read(OLESTR("filename"), &value, pErrorLog) )
79 _p_instance->setMRL(V_BSTR(&value));
80 VariantClear(&value);
85 V_VT(&value) = VT_BOOL;
86 if( S_OK == pPropBag->Read(OLESTR("autoplay"), &value, pErrorLog) )
88 _p_instance->setAutoPlay(V_BOOL(&value) != VARIANT_FALSE);
89 VariantClear(&value);
91 else
94 ** try alternative syntax
96 V_VT(&value) = VT_BOOL;
97 if( S_OK == pPropBag->Read(OLESTR("autostart"), &value, pErrorLog) )
99 _p_instance->setAutoPlay(V_BOOL(&value) != VARIANT_FALSE);
100 VariantClear(&value);
104 SIZEL size = _p_instance->getExtent();
105 V_VT(&value) = VT_I4;
106 if( S_OK == pPropBag->Read(OLESTR("extentwidth"), &value, pErrorLog) )
108 size.cx = V_I4(&value);
109 VariantClear(&value);
111 V_VT(&value) = VT_I4;
112 if( S_OK == pPropBag->Read(OLESTR("extentheight"), &value, pErrorLog) )
114 size.cy = V_I4(&value);
115 VariantClear(&value);
117 _p_instance->setExtent(size);
119 V_VT(&value) = VT_BOOL;
120 if( S_OK == pPropBag->Read(OLESTR("autoloop"), &value, pErrorLog) )
122 _p_instance->setAutoLoop(V_BOOL(&value) != VARIANT_FALSE);
123 VariantClear(&value);
125 else
128 ** try alternative syntax
130 V_VT(&value) = VT_BOOL;
131 if( S_OK == pPropBag->Read(OLESTR("loop"), &value, pErrorLog) )
133 _p_instance->setAutoLoop(V_BOOL(&value) != VARIANT_FALSE);
134 VariantClear(&value);
138 V_VT(&value) = VT_BOOL;
139 if( S_OK == pPropBag->Read(OLESTR("mute"), &value, pErrorLog) )
141 _p_instance->setMute(V_BOOL(&value) != VARIANT_FALSE);
142 VariantClear(&value);
145 V_VT(&value) = VT_BOOL;
146 if( S_OK == pPropBag->Read(OLESTR("visible"), &value, pErrorLog) )
148 _p_instance->setVisible(V_BOOL(&value) != VARIANT_FALSE);
149 VariantClear(&value);
151 else
154 ** try alternative syntax
156 V_VT(&value) = VT_BOOL;
157 if( S_OK == pPropBag->Read(OLESTR("showdisplay"), &value, pErrorLog) )
159 _p_instance->setVisible(V_BOOL(&value) != VARIANT_FALSE);
160 VariantClear(&value);
164 V_VT(&value) = VT_I4;
165 if( S_OK == pPropBag->Read(OLESTR("volume"), &value, pErrorLog) )
167 _p_instance->setVolume(V_I4(&value));
168 VariantClear(&value);
171 V_VT(&value) = VT_I4;
172 if( S_OK == pPropBag->Read(OLESTR("starttime"), &value, pErrorLog) )
174 _p_instance->setStartTime(V_I4(&value));
175 VariantClear(&value);
178 V_VT(&value) = VT_BSTR;
179 if( S_OK == pPropBag->Read(OLESTR("baseurl"), &value, pErrorLog) )
181 _p_instance->setBaseURL(V_BSTR(&value));
182 VariantClear(&value);
185 return _p_instance->onLoad();
188 STDMETHODIMP VLCPersistPropertyBag::Save(LPPROPERTYBAG pPropBag, BOOL fClearDirty, BOOL fSaveAllProperties)
190 if( NULL == pPropBag )
191 return E_INVALIDARG;
193 VARIANT value;
195 VariantInit(&value);
197 V_VT(&value) = VT_BOOL;
198 V_BOOL(&value) = _p_instance->getAutoLoop()? VARIANT_TRUE : VARIANT_FALSE;
199 pPropBag->Write(OLESTR("AutoLoop"), &value);
200 VariantClear(&value);
202 V_VT(&value) = VT_BOOL;
203 V_BOOL(&value) = _p_instance->getAutoPlay()? VARIANT_TRUE : VARIANT_FALSE;
204 pPropBag->Write(OLESTR("AutoPlay"), &value);
205 VariantClear(&value);
207 SIZEL size = _p_instance->getExtent();
208 V_VT(&value) = VT_I4;
209 V_I4(&value) = size.cx;
210 pPropBag->Write(OLESTR("ExtentWidth"), &value);
211 V_I4(&value) = size.cy;
212 pPropBag->Write(OLESTR("ExtentHeight"), &value);
214 V_VT(&value) = VT_BSTR;
215 V_BSTR(&value) = SysAllocStringLen(_p_instance->getMRL(),
216 SysStringLen(_p_instance->getMRL()));
217 pPropBag->Write(OLESTR("MRL"), &value);
218 VariantClear(&value);
220 V_VT(&value) = VT_BOOL;
221 V_BOOL(&value) = _p_instance->getVisible()? VARIANT_TRUE : VARIANT_FALSE;
222 pPropBag->Write(OLESTR("Visible"), &value);
223 VariantClear(&value);
225 V_VT(&value) = VT_I4;
226 V_I4(&value) = _p_instance->getVolume();
227 pPropBag->Write(OLESTR("Volume"), &value);
228 VariantClear(&value);
230 V_VT(&value) = VT_I4;
231 V_I4(&value) = _p_instance->getStartTime();
232 pPropBag->Write(OLESTR("StartTime"), &value);
233 VariantClear(&value);
235 V_VT(&value) = VT_BSTR;
236 V_BSTR(&value) = SysAllocStringLen(_p_instance->getBaseURL(),
237 SysStringLen(_p_instance->getBaseURL()));
238 pPropBag->Write(OLESTR("BaseURL"), &value);
239 VariantClear(&value);
241 if( fClearDirty )
242 _p_instance->setDirty(FALSE);
244 return S_OK;