]> git.sesse.net Git - vlc/blob - activex/persistpropbag.cpp
mkv.cpp: fix a potential problem when the same dir contains files with no Segment UID
[vlc] / activex / persistpropbag.cpp
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., 59 Temple Place - Suite 330, Boston, MA  02111, USA.
21  *****************************************************************************/
22
23 #include "plugin.h"
24 #include "persistpropbag.h"
25
26 #include "utils.h"
27 #include "oleobject.h"
28
29 using namespace std;
30
31 STDMETHODIMP VLCPersistPropertyBag::GetClassID(LPCLSID pClsID)
32 {
33     if( NULL == pClsID )
34         return E_POINTER;
35
36     *pClsID = _p_instance->getClassID();
37
38     return S_OK;
39 };
40
41 STDMETHODIMP VLCPersistPropertyBag::InitNew(void)
42 {
43     return _p_instance->onInit();
44 };
45
46 STDMETHODIMP VLCPersistPropertyBag::Load(LPPROPERTYBAG pPropBag, LPERRORLOG pErrorLog)
47 {
48     HRESULT hr = _p_instance->onInit();
49     if( FAILED(hr) )
50         return hr;
51
52     if( NULL == pPropBag )
53         return E_INVALIDARG;
54
55     VARIANT value;
56
57     V_VT(&value) = VT_BSTR;
58     if( S_OK == pPropBag->Read(OLESTR("mrl"), &value, pErrorLog) )
59     {
60         _p_instance->setMRL(V_BSTR(&value));
61         VariantClear(&value);
62     }
63     else
64     {
65         /*
66         ** try alternative syntax
67         */
68         V_VT(&value) = VT_BSTR;
69         if( S_OK == pPropBag->Read(OLESTR("src"), &value, pErrorLog) )
70         {
71             _p_instance->setMRL(V_BSTR(&value));
72             VariantClear(&value);
73         }
74         else
75         {
76             V_VT(&value) = VT_BSTR;
77             if( S_OK == pPropBag->Read(OLESTR("filename"), &value, pErrorLog) )
78             {
79                 _p_instance->setMRL(V_BSTR(&value));
80                 VariantClear(&value);
81             }
82         }
83     }
84
85     V_VT(&value) = VT_BOOL;
86     if( S_OK == pPropBag->Read(OLESTR("autoplay"), &value, pErrorLog) )
87     {
88         _p_instance->setAutoPlay(V_BOOL(&value) != VARIANT_FALSE);
89         VariantClear(&value);
90     }
91     else
92     {
93         /*
94         ** try alternative syntax
95         */
96         V_VT(&value) = VT_BOOL;
97         if( S_OK == pPropBag->Read(OLESTR("autostart"), &value, pErrorLog) )
98         {
99             _p_instance->setAutoPlay(V_BOOL(&value) != VARIANT_FALSE);
100             VariantClear(&value);
101         }
102     }
103
104     SIZEL size = _p_instance->getExtent();
105     V_VT(&value) = VT_I4;
106     if( S_OK == pPropBag->Read(OLESTR("extentwidth"), &value, pErrorLog) )
107     {
108          size.cx = V_I4(&value);
109         VariantClear(&value);
110     }
111     V_VT(&value) = VT_I4;
112     if( S_OK == pPropBag->Read(OLESTR("extentheight"), &value, pErrorLog) )
113     {
114          size.cy = V_I4(&value);
115         VariantClear(&value);
116     }
117     _p_instance->setExtent(size);
118
119     V_VT(&value) = VT_BOOL;
120     if( S_OK == pPropBag->Read(OLESTR("autoloop"), &value, pErrorLog) )
121     {
122         _p_instance->setAutoLoop(V_BOOL(&value) != VARIANT_FALSE);
123         VariantClear(&value);
124     }
125     else
126     {
127         /*
128         ** try alternative syntax
129         */
130         V_VT(&value) = VT_BOOL;
131         if( S_OK == pPropBag->Read(OLESTR("loop"), &value, pErrorLog) )
132         {
133             _p_instance->setAutoLoop(V_BOOL(&value) != VARIANT_FALSE);
134             VariantClear(&value);
135         }
136     }
137
138     V_VT(&value) = VT_BOOL;
139     if( S_OK == pPropBag->Read(OLESTR("mute"), &value, pErrorLog) )
140     {
141         _p_instance->setMute(V_BOOL(&value) != VARIANT_FALSE);
142         VariantClear(&value);
143     }
144
145     V_VT(&value) = VT_BOOL;
146     if( S_OK == pPropBag->Read(OLESTR("visible"), &value, pErrorLog) )
147     {
148         _p_instance->setVisible(V_BOOL(&value) != VARIANT_FALSE);
149         VariantClear(&value);
150     }
151     else
152     {
153         /*
154         ** try alternative syntax
155         */
156         V_VT(&value) = VT_BOOL;
157         if( S_OK == pPropBag->Read(OLESTR("showdisplay"), &value, pErrorLog) )
158         {
159             _p_instance->setVisible(V_BOOL(&value) != VARIANT_FALSE);
160             VariantClear(&value);
161         }
162     }
163
164     int i_vlc = _p_instance->getVLCObject();
165     V_VT(&value) = VT_I4;
166     if( S_OK == pPropBag->Read(OLESTR("volume"), &value, pErrorLog) )
167     {
168         VLC_VolumeSet(i_vlc, V_I4(&value));
169         VariantClear(&value);
170     }
171     return _p_instance->onLoad();
172 };
173
174 STDMETHODIMP VLCPersistPropertyBag::Save(LPPROPERTYBAG pPropBag, BOOL fClearDirty, BOOL fSaveAllProperties)
175 {
176     if( NULL == pPropBag )
177         return E_INVALIDARG;
178
179     VARIANT value;
180
181     VariantInit(&value);
182
183     V_VT(&value) = VT_BOOL;
184     V_BOOL(&value) = _p_instance->getAutoLoop()? VARIANT_TRUE : VARIANT_FALSE;
185     pPropBag->Write(OLESTR("AutoLoop"), &value);
186     VariantClear(&value);
187
188     V_VT(&value) = VT_BOOL;
189     V_BOOL(&value) = _p_instance->getAutoPlay()? VARIANT_TRUE : VARIANT_FALSE;
190     pPropBag->Write(OLESTR("AutoPlay"), &value);
191     VariantClear(&value);
192
193     SIZEL size = _p_instance->getExtent();
194     V_VT(&value) = VT_I4;
195     V_I4(&value) = size.cx;
196     pPropBag->Write(OLESTR("ExtentWidth"), &value);
197     V_I4(&value) = size.cy;
198     pPropBag->Write(OLESTR("ExtentHeight"), &value);
199
200     V_VT(&value) = VT_BSTR;
201     V_BSTR(&value) = SysAllocStringLen(_p_instance->getMRL(),
202                             SysStringLen(_p_instance->getMRL()));
203     pPropBag->Write(OLESTR("MRL"), &value);
204     VariantClear(&value);
205
206     V_VT(&value) = VT_BOOL;
207     V_BOOL(&value) = _p_instance->getVisible()? VARIANT_TRUE : VARIANT_FALSE;
208     pPropBag->Write(OLESTR("Visible"), &value);
209     VariantClear(&value);
210
211     int i_vlc = _p_instance->getVLCObject();
212     if( i_vlc )
213     {
214         V_VT(&value) = VT_I4;
215         V_I4(&value) = VLC_VolumeGet(i_vlc);
216         pPropBag->Write(OLESTR("Volume"), &value);
217         VariantClear(&value);
218     }
219
220     if( fClearDirty )
221         _p_instance->setDirty(FALSE);
222
223     return S_OK;
224 };
225