When including 'wine/port.h', include it first.
[wine] / dlls / quartz / imcntl.c
1 /*
2  * Implementation of IMediaControl for FilterGraph.
3  *
4  * FIXME - stub.
5  *
6  * hidenori@a2.ctktv.ne.jp
7  */
8
9 #include "config.h"
10
11 #include "windef.h"
12 #include "winbase.h"
13 #include "wingdi.h"
14 #include "winuser.h"
15 #include "winerror.h"
16 #include "oleauto.h"
17 #include "strmif.h"
18 #include "control.h"
19 #include "uuids.h"
20
21 #include "debugtools.h"
22 DEFAULT_DEBUG_CHANNEL(quartz);
23
24 #include "quartz_private.h"
25 #include "fgraph.h"
26
27
28
29 static HRESULT WINAPI
30 IMediaControl_fnQueryInterface(IMediaControl* iface,REFIID riid,void** ppobj)
31 {
32         CFilterGraph_THIS(iface,mediacontrol);
33
34         TRACE("(%p)->()\n",This);
35
36         return IUnknown_QueryInterface(This->unk.punkControl,riid,ppobj);
37 }
38
39 static ULONG WINAPI
40 IMediaControl_fnAddRef(IMediaControl* iface)
41 {
42         CFilterGraph_THIS(iface,mediacontrol);
43
44         TRACE("(%p)->()\n",This);
45
46         return IUnknown_AddRef(This->unk.punkControl);
47 }
48
49 static ULONG WINAPI
50 IMediaControl_fnRelease(IMediaControl* iface)
51 {
52         CFilterGraph_THIS(iface,mediacontrol);
53
54         TRACE("(%p)->()\n",This);
55
56         return IUnknown_Release(This->unk.punkControl);
57 }
58
59 static HRESULT WINAPI
60 IMediaControl_fnGetTypeInfoCount(IMediaControl* iface,UINT* pcTypeInfo)
61 {
62         CFilterGraph_THIS(iface,mediacontrol);
63
64         FIXME("(%p)->()\n",This);
65
66         return E_NOTIMPL;
67 }
68
69 static HRESULT WINAPI
70 IMediaControl_fnGetTypeInfo(IMediaControl* iface,UINT iTypeInfo, LCID lcid, ITypeInfo** ppobj)
71 {
72         CFilterGraph_THIS(iface,mediacontrol);
73
74         FIXME("(%p)->()\n",This);
75
76         return E_NOTIMPL;
77 }
78
79 static HRESULT WINAPI
80 IMediaControl_fnGetIDsOfNames(IMediaControl* iface,REFIID riid, LPOLESTR* ppwszName, UINT cNames, LCID lcid, DISPID* pDispId)
81 {
82         CFilterGraph_THIS(iface,mediacontrol);
83
84         FIXME("(%p)->()\n",This);
85
86         return E_NOTIMPL;
87 }
88
89 static HRESULT WINAPI
90 IMediaControl_fnInvoke(IMediaControl* iface,DISPID DispId, REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS* pDispParams, VARIANT* pVarRes, EXCEPINFO* pExcepInfo, UINT* puArgErr)
91 {
92         CFilterGraph_THIS(iface,mediacontrol);
93
94         FIXME("(%p)->()\n",This);
95
96         return E_NOTIMPL;
97 }
98
99
100 static HRESULT WINAPI
101 IMediaControl_fnRun(IMediaControl* iface)
102 {
103         CFilterGraph_THIS(iface,mediacontrol);
104
105         TRACE("(%p)->()\n",This);
106
107         return IMediaFilter_Run( CFilterGraph_IMediaFilter(This),
108                         (REFERENCE_TIME)0 );
109 }
110
111 static HRESULT WINAPI
112 IMediaControl_fnPause(IMediaControl* iface)
113 {
114         CFilterGraph_THIS(iface,mediacontrol);
115
116         TRACE("(%p)->()\n",This);
117
118         return IMediaFilter_Pause( CFilterGraph_IMediaFilter(This) );
119 }
120
121 static HRESULT WINAPI
122 IMediaControl_fnStop(IMediaControl* iface)
123 {
124         CFilterGraph_THIS(iface,mediacontrol);
125         HRESULT hr;
126         FILTER_STATE    fs;
127
128         TRACE("(%p)->()\n",This);
129
130         hr = IMediaControl_GetState(iface,INFINITE,(OAFilterState*)&fs);
131         if ( SUCCEEDED(hr) && fs == State_Running )
132         {
133                 hr = IMediaControl_Pause(iface);
134                 if ( SUCCEEDED(hr) )
135                         hr = IMediaControl_GetState(iface,INFINITE,(OAFilterState*)&fs);
136         }
137
138         if ( SUCCEEDED(hr) && fs == State_Paused )
139         {
140                 hr = IMediaFilter_Stop(CFilterGraph_IMediaFilter(This));
141                 if ( SUCCEEDED(hr) )
142                         hr = IMediaControl_GetState(iface,INFINITE,(OAFilterState*)&fs);
143         }
144
145         return hr;
146 }
147
148 static HRESULT WINAPI
149 IMediaControl_fnGetState(IMediaControl* iface,LONG lTimeOut,OAFilterState* pFilterState)
150 {
151         CFilterGraph_THIS(iface,mediacontrol);
152
153         TRACE("(%p)->()\n",This);
154
155         return IMediaFilter_GetState( CFilterGraph_IMediaFilter(This), (DWORD)lTimeOut, (FILTER_STATE*)pFilterState );
156 }
157
158 static HRESULT WINAPI
159 IMediaControl_fnRenderFile(IMediaControl* iface,BSTR bstrFileName)
160 {
161         CFilterGraph_THIS(iface,mediacontrol);
162         UINT    uLen;
163         WCHAR*  pwszName;
164         HRESULT hr;
165
166         TRACE("(%p)->()\n",This);
167
168         uLen = SysStringLen(bstrFileName);
169         pwszName = (WCHAR*)QUARTZ_AllocMem( sizeof(WCHAR) * (uLen+1) );
170         if ( pwszName == NULL )
171                 return E_OUTOFMEMORY;
172         memcpy( pwszName, bstrFileName, sizeof(WCHAR)*uLen );
173         pwszName[uLen] = (WCHAR)0;
174
175         hr = IFilterGraph2_RenderFile(
176                 CFilterGraph_IFilterGraph2(This), pwszName, NULL );
177
178         QUARTZ_FreeMem( pwszName );
179
180         return hr;
181 }
182
183 static HRESULT WINAPI
184 IMediaControl_fnAddSourceFilter(IMediaControl* iface,BSTR bstrFileName,IDispatch** ppobj)
185 {
186         CFilterGraph_THIS(iface,mediacontrol);
187
188         FIXME("(%p)->()\n",This);
189
190         return E_NOTIMPL;
191 }
192
193 static HRESULT WINAPI
194 IMediaControl_fnget_FilterCollection(IMediaControl* iface,IDispatch** ppobj)
195 {
196         CFilterGraph_THIS(iface,mediacontrol);
197
198         FIXME("(%p)->()\n",This);
199
200         return E_NOTIMPL;
201 }
202
203 static HRESULT WINAPI
204 IMediaControl_fnget_RegFilterCollection(IMediaControl* iface,IDispatch** ppobj)
205 {
206         CFilterGraph_THIS(iface,mediacontrol);
207
208         FIXME("(%p)->()\n",This);
209
210         return E_NOTIMPL;
211 }
212
213 static HRESULT WINAPI
214 IMediaControl_fnStopWhenReady(IMediaControl* iface)
215 {
216         CFilterGraph_THIS(iface,mediacontrol);
217
218         TRACE("(%p)->()\n",This);
219
220         return IMediaFilter_Stop( CFilterGraph_IMediaFilter(This) );
221 }
222
223
224 static ICOM_VTABLE(IMediaControl) imediacontrol =
225 {
226         ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
227         /* IUnknown fields */
228         IMediaControl_fnQueryInterface,
229         IMediaControl_fnAddRef,
230         IMediaControl_fnRelease,
231         /* IDispatch fields */
232         IMediaControl_fnGetTypeInfoCount,
233         IMediaControl_fnGetTypeInfo,
234         IMediaControl_fnGetIDsOfNames,
235         IMediaControl_fnInvoke,
236         /* IMediaControl fields */
237         IMediaControl_fnRun,
238         IMediaControl_fnPause,
239         IMediaControl_fnStop,
240         IMediaControl_fnGetState,
241         IMediaControl_fnRenderFile,
242         IMediaControl_fnAddSourceFilter,
243         IMediaControl_fnget_FilterCollection,
244         IMediaControl_fnget_RegFilterCollection,
245         IMediaControl_fnStopWhenReady,
246 };
247
248
249 HRESULT CFilterGraph_InitIMediaControl( CFilterGraph* pfg )
250 {
251         TRACE("(%p)\n",pfg);
252         ICOM_VTBL(&pfg->mediacontrol) = &imediacontrol;
253
254         return NOERROR;
255 }
256
257 void CFilterGraph_UninitIMediaControl( CFilterGraph* pfg )
258 {
259         TRACE("(%p)\n",pfg);
260 }