Update shell xxxAW wrapper prototypes for fixed SHLWAPI functions.
[wine] / dlls / quartz / capgraph.c
1 /*
2  * Implementation of CLSID_CaptureGraphBuilder[2].
3  *
4  * Copyright (C) Hidenori TAKESHIMA <hidenori@a2.ctktv.ne.jp>
5  *
6  * This library is free software; you can redistribute it and/or
7  * modify it under the terms of the GNU Lesser General Public
8  * License as published by the Free Software Foundation; either
9  * version 2.1 of the License, or (at your option) any later version.
10  *
11  * This library is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14  * Lesser General Public License for more details.
15  *
16  * You should have received a copy of the GNU Lesser General Public
17  * License along with this library; if not, write to the Free Software
18  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
19  *
20  *      FIXME - stub
21  *      FIXME - not tested
22  */
23
24 #include "config.h"
25
26 #include "windef.h"
27 #include "winbase.h"
28 #include "wingdi.h"
29 #include "winuser.h"
30 #include "winerror.h"
31 #include "strmif.h"
32 #include "control.h"
33 #include "uuids.h"
34
35 #include "wine/debug.h"
36 WINE_DEFAULT_DEBUG_CHANNEL(quartz);
37
38 #include "quartz_private.h"
39 #include "capgraph.h"
40
41
42 /***************************************************************************
43  *
44  *      CCaptureGraph::ICaptureGraphBuilder
45  *
46  */
47
48 static HRESULT WINAPI
49 ICaptureGraphBuilder_fnQueryInterface(ICaptureGraphBuilder* iface,REFIID riid,void** ppobj)
50 {
51         CCaptureGraph_THIS(iface,capgraph1);
52
53         TRACE("(%p)->()\n",This);
54
55         return IUnknown_QueryInterface(This->unk.punkControl,riid,ppobj);
56 }
57
58 static ULONG WINAPI
59 ICaptureGraphBuilder_fnAddRef(ICaptureGraphBuilder* iface)
60 {
61         CCaptureGraph_THIS(iface,capgraph1);
62
63         TRACE("(%p)->()\n",This);
64
65         return IUnknown_AddRef(This->unk.punkControl);
66 }
67
68 static ULONG WINAPI
69 ICaptureGraphBuilder_fnRelease(ICaptureGraphBuilder* iface)
70 {
71         CCaptureGraph_THIS(iface,capgraph1);
72
73         TRACE("(%p)->()\n",This);
74
75         return IUnknown_Release(This->unk.punkControl);
76 }
77
78
79 static HRESULT WINAPI
80 ICaptureGraphBuilder_fnSetFiltergraph(ICaptureGraphBuilder* iface,IGraphBuilder* pgb)
81 {
82         CCaptureGraph_THIS(iface,capgraph1);
83
84         TRACE("(%p)->()\n",This);
85
86         return ICaptureGraphBuilder2_SetFiltergraph(CCaptureGraph_ICaptureGraphBuilder2(This),pgb);
87 }
88
89 static HRESULT WINAPI
90 ICaptureGraphBuilder_fnGetFiltergraph(ICaptureGraphBuilder* iface,IGraphBuilder** ppgb)
91 {
92         CCaptureGraph_THIS(iface,capgraph1);
93
94         TRACE("(%p)->()\n",This);
95
96         return ICaptureGraphBuilder2_GetFiltergraph(CCaptureGraph_ICaptureGraphBuilder2(This),ppgb);
97 }
98
99 static HRESULT WINAPI
100 ICaptureGraphBuilder_fnSetOutputFileName(ICaptureGraphBuilder* iface,const GUID* pguidType,LPCOLESTR pName,IBaseFilter** ppFilter,IFileSinkFilter** ppSink)
101 {
102         CCaptureGraph_THIS(iface,capgraph1);
103
104         FIXME("(%p)->() stub!\n",This);
105
106         return E_NOTIMPL;
107 }
108
109 static HRESULT WINAPI
110 ICaptureGraphBuilder_fnFindInterface(ICaptureGraphBuilder* iface,const GUID* pguidCat,IBaseFilter* pFilter,REFIID riid,void** ppvobj)
111 {
112         CCaptureGraph_THIS(iface,capgraph1);
113
114         FIXME("(%p)->() stub!\n",This);
115
116         return E_NOTIMPL;
117 }
118
119 static HRESULT WINAPI
120 ICaptureGraphBuilder_fnRenderStream(ICaptureGraphBuilder* iface,const GUID* pguidCat,IUnknown* pSource,IBaseFilter* pCompressor,IBaseFilter* pRenderer)
121 {
122         CCaptureGraph_THIS(iface,capgraph1);
123
124         FIXME("(%p)->() stub!\n",This);
125
126         return E_NOTIMPL;
127 }
128
129 static HRESULT WINAPI
130 ICaptureGraphBuilder_fnControlStream(ICaptureGraphBuilder* iface,const GUID* pguidCat,IBaseFilter* pFilter,REFERENCE_TIME* prtStart,REFERENCE_TIME* prtStop,WORD wStartCookie,WORD wStopCookie)
131 {
132         CCaptureGraph_THIS(iface,capgraph1);
133
134         FIXME("(%p)->() stub!\n",This);
135
136         return E_NOTIMPL;
137 }
138
139 static HRESULT WINAPI
140 ICaptureGraphBuilder_fnAllocCapFile(ICaptureGraphBuilder* iface,LPCOLESTR pName,DWORDLONG llSize)
141 {
142         CCaptureGraph_THIS(iface,capgraph1);
143
144         TRACE("(%p)->()\n",This);
145
146         return ICaptureGraphBuilder2_AllocCapFile(CCaptureGraph_ICaptureGraphBuilder2(This),pName,llSize);
147 }
148
149 static HRESULT WINAPI
150 ICaptureGraphBuilder_fnCopyCaptureFile(ICaptureGraphBuilder* iface,LPOLESTR pOrgName,LPOLESTR pNewName,int fAllowEscAbort,IAMCopyCaptureFileProgress* pCallback)
151 {
152         CCaptureGraph_THIS(iface,capgraph1);
153
154         TRACE("(%p)->()\n",This);
155
156         return ICaptureGraphBuilder2_CopyCaptureFile(CCaptureGraph_ICaptureGraphBuilder2(This),pOrgName,pNewName,fAllowEscAbort,pCallback);
157 }
158
159 static ICOM_VTABLE(ICaptureGraphBuilder) icapgraph1 =
160 {
161         ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
162         /* IUnknown fields */
163         ICaptureGraphBuilder_fnQueryInterface,
164         ICaptureGraphBuilder_fnAddRef,
165         ICaptureGraphBuilder_fnRelease,
166         /* ICaptureGraphBuilder fields */
167         ICaptureGraphBuilder_fnSetFiltergraph,
168         ICaptureGraphBuilder_fnGetFiltergraph,
169         ICaptureGraphBuilder_fnSetOutputFileName,
170         ICaptureGraphBuilder_fnFindInterface,
171         ICaptureGraphBuilder_fnRenderStream,
172         ICaptureGraphBuilder_fnControlStream,
173         ICaptureGraphBuilder_fnAllocCapFile,
174         ICaptureGraphBuilder_fnCopyCaptureFile,
175 };
176
177
178 static HRESULT CCaptureGraph_InitICaptureGraphBuilder( CCaptureGraph* This )
179 {
180         TRACE("(%p)\n",This);
181         ICOM_VTBL(&This->capgraph1) = &icapgraph1;
182
183         return NOERROR;
184 }
185
186 static void CCaptureGraph_UninitICaptureGraphBuilder( CCaptureGraph* This )
187 {
188         TRACE("(%p)\n",This);
189 }
190
191
192 /***************************************************************************
193  *
194  *      CCaptureGraph::ICaptureGraphBuilder2
195  *
196  */
197
198 static HRESULT WINAPI
199 ICaptureGraphBuilder2_fnQueryInterface(ICaptureGraphBuilder2* iface,REFIID riid,void** ppobj)
200 {
201         CCaptureGraph_THIS(iface,capgraph2);
202
203         TRACE("(%p)->()\n",This);
204
205         return IUnknown_QueryInterface(This->unk.punkControl,riid,ppobj);
206 }
207
208 static ULONG WINAPI
209 ICaptureGraphBuilder2_fnAddRef(ICaptureGraphBuilder2* iface)
210 {
211         CCaptureGraph_THIS(iface,capgraph2);
212
213         TRACE("(%p)->()\n",This);
214
215         return IUnknown_AddRef(This->unk.punkControl);
216 }
217
218 static ULONG WINAPI
219 ICaptureGraphBuilder2_fnRelease(ICaptureGraphBuilder2* iface)
220 {
221         CCaptureGraph_THIS(iface,capgraph2);
222
223         TRACE("(%p)->()\n",This);
224
225         return IUnknown_Release(This->unk.punkControl);
226 }
227
228 static HRESULT WINAPI
229 ICaptureGraphBuilder2_fnSetFiltergraph(ICaptureGraphBuilder2* iface,IGraphBuilder* pgb)
230 {
231         CCaptureGraph_THIS(iface,capgraph2);
232
233         FIXME("(%p)->() stub!\n",This);
234
235         return E_NOTIMPL;
236 }
237
238 static HRESULT WINAPI
239 ICaptureGraphBuilder2_fnGetFiltergraph(ICaptureGraphBuilder2* iface,IGraphBuilder** ppgb)
240 {
241         CCaptureGraph_THIS(iface,capgraph2);
242
243         FIXME("(%p)->() stub!\n",This);
244
245         return E_NOTIMPL;
246 }
247
248 static HRESULT WINAPI
249 ICaptureGraphBuilder2_fnSetOutputFileName(ICaptureGraphBuilder2* iface,const GUID* pguid,LPCOLESTR pName,IBaseFilter** ppFilter,IFileSinkFilter** ppSink)
250 {
251         CCaptureGraph_THIS(iface,capgraph2);
252
253         FIXME("(%p)->() stub!\n",This);
254
255         return E_NOTIMPL;
256 }
257
258 static HRESULT WINAPI
259 ICaptureGraphBuilder2_fnFindInterface(ICaptureGraphBuilder2* iface,const GUID* pguidCat,const GUID* pguidType,IBaseFilter* pFilter,REFIID riid,void** ppvobj)
260 {
261         CCaptureGraph_THIS(iface,capgraph2);
262
263         FIXME("(%p)->() stub!\n",This);
264
265         return E_NOTIMPL;
266 }
267
268 static HRESULT WINAPI
269 ICaptureGraphBuilder2_fnRenderStream(ICaptureGraphBuilder2* iface,const GUID* pguidCat,const GUID* pguidType,IUnknown* pSource,IBaseFilter* pCompressor,IBaseFilter* pRenderer)
270 {
271         CCaptureGraph_THIS(iface,capgraph2);
272
273         FIXME("(%p)->() stub!\n",This);
274
275         return E_NOTIMPL;
276 }
277
278 static HRESULT WINAPI
279 ICaptureGraphBuilder2_fnControlStream(ICaptureGraphBuilder2* iface,const GUID* pguidCat,const GUID* pguidType,IBaseFilter* pFilter,REFERENCE_TIME* prtStart,REFERENCE_TIME* prtStop,WORD wStartCookie,WORD wStopCookie)
280 {
281         CCaptureGraph_THIS(iface,capgraph2);
282
283         FIXME("(%p)->() stub!\n",This);
284
285         return E_NOTIMPL;
286 }
287
288 static HRESULT WINAPI
289 ICaptureGraphBuilder2_fnAllocCapFile(ICaptureGraphBuilder2* iface,LPCOLESTR pName,DWORDLONG llSize)
290 {
291         CCaptureGraph_THIS(iface,capgraph2);
292
293         FIXME("(%p)->() stub!\n",This);
294
295         return E_NOTIMPL;
296 }
297
298 static HRESULT WINAPI
299 ICaptureGraphBuilder2_fnCopyCaptureFile(ICaptureGraphBuilder2* iface,LPOLESTR pOrgName,LPOLESTR pNewName,int fAllowEscAbort,IAMCopyCaptureFileProgress* pCallback)
300 {
301         CCaptureGraph_THIS(iface,capgraph2);
302
303         FIXME("(%p)->() stub!\n",This);
304
305         return E_NOTIMPL;
306 }
307
308 static HRESULT WINAPI
309 ICaptureGraphBuilder2_fnFindPin(ICaptureGraphBuilder2* iface,IUnknown* pSource,PIN_DIRECTION pindir,const GUID* pguidCat,const GUID* pguidType,BOOL bUnconnected,int num,IPin** ppPin)
310 {
311         CCaptureGraph_THIS(iface,capgraph2);
312
313         FIXME("(%p)->() stub!\n",This);
314
315         return E_NOTIMPL;
316 }
317
318
319 static ICOM_VTABLE(ICaptureGraphBuilder2) icapgraph2 =
320 {
321         ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
322         /* IUnknown fields */
323         ICaptureGraphBuilder2_fnQueryInterface,
324         ICaptureGraphBuilder2_fnAddRef,
325         ICaptureGraphBuilder2_fnRelease,
326         /* ICaptureGraphBuilder2 fields */
327         ICaptureGraphBuilder2_fnSetFiltergraph,
328         ICaptureGraphBuilder2_fnGetFiltergraph,
329         ICaptureGraphBuilder2_fnSetOutputFileName,
330         ICaptureGraphBuilder2_fnFindInterface,
331         ICaptureGraphBuilder2_fnRenderStream,
332         ICaptureGraphBuilder2_fnControlStream,
333         ICaptureGraphBuilder2_fnAllocCapFile,
334         ICaptureGraphBuilder2_fnCopyCaptureFile,
335         ICaptureGraphBuilder2_fnFindPin,
336 };
337
338 static HRESULT CCaptureGraph_InitICaptureGraphBuilder2( CCaptureGraph* This )
339 {
340         TRACE("(%p)\n",This);
341         ICOM_VTBL(&This->capgraph2) = &icapgraph2;
342
343         return NOERROR;
344 }
345
346 static void CCaptureGraph_UninitICaptureGraphBuilder2( CCaptureGraph* This )
347 {
348         TRACE("(%p)\n",This);
349 }
350
351
352 /***************************************************************************
353  *
354  *      new/delete for CCaptureGraph
355  *
356  */
357
358 /* can I use offsetof safely? - FIXME? */
359 static QUARTZ_IFEntry IFEntries[] =
360 {
361   { &IID_ICaptureGraphBuilder, offsetof(CCaptureGraph,capgraph1)-offsetof(CCaptureGraph,unk) },
362   { &IID_ICaptureGraphBuilder2, offsetof(CCaptureGraph,capgraph2)-offsetof(CCaptureGraph,unk) },
363 };
364
365 static void QUARTZ_DestroyCaptureGraph(IUnknown* punk)
366 {
367         CCaptureGraph_THIS(punk,unk);
368
369         TRACE( "(%p)\n", This );
370
371         CCaptureGraph_UninitICaptureGraphBuilder(This);
372         CCaptureGraph_UninitICaptureGraphBuilder2(This);
373 }
374
375 HRESULT QUARTZ_CreateCaptureGraph(IUnknown* punkOuter,void** ppobj)
376 {
377         CCaptureGraph*  pcg;
378         HRESULT hr;
379
380         TRACE("(%p,%p)\n",punkOuter,ppobj);
381
382         pcg = (CCaptureGraph*)QUARTZ_AllocObj( sizeof(CCaptureGraph) );
383         if ( pcg == NULL )
384                 return E_OUTOFMEMORY;
385
386         QUARTZ_IUnkInit( &pcg->unk, punkOuter );
387         pcg->m_pfg = NULL;
388
389         hr = CCaptureGraph_InitICaptureGraphBuilder(pcg);
390         if ( SUCCEEDED(hr) )
391         {
392                 hr = CCaptureGraph_InitICaptureGraphBuilder2(pcg);
393                 if ( FAILED(hr) )
394                 {
395                         CCaptureGraph_UninitICaptureGraphBuilder(pcg);
396                 }
397         }
398
399         if ( FAILED(hr) )
400         {
401                 QUARTZ_FreeObj(pcg);
402                 return hr;
403         }
404
405         pcg->unk.pEntries = IFEntries;
406         pcg->unk.dwEntries = sizeof(IFEntries)/sizeof(IFEntries[0]);
407         pcg->unk.pOnFinalRelease = QUARTZ_DestroyCaptureGraph;
408
409         *ppobj = (void*)(&pcg->unk);
410
411         return S_OK;
412 }